# Bulk load customers or any records into Fieldproxy

> POST /api/insert takes thousands of rows in one call and inserts them all or none. Use it to move customers, sites, equipment or price lists across from another system.

Source: https://www.fieldproxy.ai/developers/guides/bulk-import

## One call, all or nothing

An administrator creates a key in the web app under Settings, Security, API keys: give it a name, an expiry, only the operations this guide needs, and optionally only the tables it touches. Keep it in an environment variable, `FIELDPROXY_API_KEY`. Your API base is your workspace's regional host, for example `https://api-india-1.fieldproxy.ai` (India) or `https://api-us-east-1.fieldproxy.ai` (US East). This guide needs the Insert operation.

Every row must have the same keys as the first row, which sets the column list. All rows go into one INSERT: if any row fails, none are saved, so a half-finished load cannot happen. A test insert of 5,001 rows in one call succeeded.

```bash
curl -X POST https://api-india-1.fieldproxy.ai/api/insert \
  -H "x-api-key: $FIELDPROXY_API_KEY" \
  -H "content-type: application/json" \
  -d '{"tableName":"customers","data":[{"company_name":"Northfield Dental","phone":"+15550101","city":"Austin"},{"company_name":"Riverside Bakery","phone":"+15550102","city":"Austin"}]}'
```

```javascript
// Node.js 18+ (built-in fetch)
const res = await fetch("https://api-india-1.fieldproxy.ai/api/insert", {
  method: "POST",
  headers: { "x-api-key": process.env.FIELDPROXY_API_KEY, "content-type": "application/json" },
  body: JSON.stringify({
    "tableName": "customers",
    "data": [
      {
        "company_name": "Northfield Dental",
        "phone": "+15550101",
        "city": "Austin"
      },
      {
        "company_name": "Riverside Bakery",
        "phone": "+15550102",
        "city": "Austin"
      }
    ]
  }),
})
const out = await res.json()
if (!res.ok) throw new Error(out.message)
console.log(out.rowCount)
```

```python
# Python 3 (pip install requests)
import os, requests

res = requests.post(
    "https://api-india-1.fieldproxy.ai/api/insert",
    headers={"x-api-key": os.environ["FIELDPROXY_API_KEY"]},
    json={
      "tableName": "customers",
      "data": [
        {
          "company_name": "Northfield Dental",
          "phone": "+15550101",
          "city": "Austin"
        },
        {
          "company_name": "Riverside Bakery",
          "phone": "+15550102",
          "city": "Austin"
        }
      ]
    },
    timeout=30,
)
out = res.json()
res.raise_for_status()
print(out["rowCount"])
```

## From a spreadsheet

An Insert key also covers CSV import in the Fieldproxy app. From an MCP client, `import_records` loads CSV or Excel into any table, up to 1,000 rows per import, with a dry run first.

## Before you load

- Load parents first (customers before their sites, sites before their equipment) and carry your old ids in a column so the second load can link to them.
- Leave out ids and timestamps: they take database defaults.
- Inserts fire automations. If a rule texts every new customer, switch it off for the load and back on afterwards.

Table and column names differ per workspace, because each one is set up around its own business. The names below (`jobs`, `customers`, `invoices`) are typical, not guaranteed. To see the real ones, connect any MCP client and call `describe_schema`, or ask your Fieldproxy administrator.

## Questions

### How do I import customers into Fieldproxy?

Send them to POST /api/insert as rows in one call, which inserts thousands at once, all or nothing. You can also import CSV or Excel in the app or through the MCP import_records tool.

### How many rows can I insert into Fieldproxy at once?

A test insert of 5,001 rows in one REST call succeeded. MCP imports take up to 1,000 rows each, with a dry run first.

## This is one way, not the only way

This guide shows one common way to do it. A Fieldproxy workspace can be reached from every side, and anything in it can be read, changed or automated:

- REST API: read, insert, update and delete on any table the key allows ([REST API reference](https://www.fieldproxy.ai/developers/docs/rest-api)).
- MCP server: 170+ tools for Claude, ChatGPT, Copilot, Cursor and your own agents, including read-only SQL, proposed writes, automations and app building ([MCP tools](https://www.fieldproxy.ai/developers/docs/mcp-tools)).
- Automations: 15 trigger types and about 50 step types, with webhooks in and signed webhooks and HTTP calls out ([Webhooks and automations](https://www.fieldproxy.ai/developers/docs/webhooks-automations)).
- Public forms, record links and customer portals for people outside the company ([Public forms and links](https://www.fieldproxy.ai/developers/docs/public-forms)).
- Apps as JSON: new screens, fields, tables and workflows ([Apps as JSON](https://www.fieldproxy.ai/developers/docs/apps-as-json)).
- Voice and text agents that work from the same data ([Voice and text agents](https://www.fieldproxy.ai/developers/docs/agents)).
- Not listed here? Fieldproxy's team builds integrations with the other systems you use as part of setting up your workspace. [Tell us what you need](https://www.fieldproxy.ai/book-demo?source=dev-guides).

More: [REST API reference](https://www.fieldproxy.ai/developers/docs/rest-api) · [OpenAPI](https://www.fieldproxy.ai/developers/openapi.json) · [All guides](https://www.fieldproxy.ai/developers/guides)