# Read jobs, customers and other records from Fieldproxy

> Yes, you can read any Fieldproxy table from code. POST /api/read returns the rows that match a condition, and read-only SQL over MCP answers anything else: date ranges, joins and totals.

Source: https://www.fieldproxy.ai/developers/guides/read-jobs

## Read by exact match

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 Read operation.

`condition` is a non-empty object of column-value pairs. Every pair must match, by equality. It cannot be empty, so a call can never return or touch a whole table by accident.

```bash
curl -X POST https://api-india-1.fieldproxy.ai/api/read \
  -H "x-api-key: $FIELDPROXY_API_KEY" \
  -H "content-type: application/json" \
  -d '{"tableName":"jobs","condition":{"status":"assigned","technician_id":42}}'
```

```javascript
// Node.js 18+ (built-in fetch)
const res = await fetch("https://api-india-1.fieldproxy.ai/api/read", {
  method: "POST",
  headers: { "x-api-key": process.env.FIELDPROXY_API_KEY, "content-type": "application/json" },
  body: JSON.stringify({
    "tableName": "jobs",
    "condition": {
      "status": "assigned",
      "technician_id": 42
    }
  }),
})
const out = await res.json()
if (!res.ok) throw new Error(out.message)
console.log(out.rowCount, out.data)
```

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

res = requests.post(
    "https://api-india-1.fieldproxy.ai/api/read",
    headers={"x-api-key": os.environ["FIELDPROXY_API_KEY"]},
    json={
      "tableName": "jobs",
      "condition": {
        "status": "assigned",
        "technician_id": 42
      }
    },
    timeout=30,
)
out = res.json()
res.raise_for_status()
print(out["rowCount"], out["data"])
```

200 response:

```json
{
  "data": [ { "id": 1042, "title": "Boiler service", "status": "assigned", "technician_id": 42, "...": "every column" } ],
  "rowCount": 1,
  "table": "jobs",
  "tenant": "<workspace-id>"
}
```

## Exact matches here, anything else with SQL

- `/api/read` matches values exactly. For ranges, `IN` lists, patterns, joins or totals, use read-only SQL (below).
- Every matching row comes back with all its columns in one response (a test read of 5,001 rows did), so make the condition specific. For a sorted or trimmed list, use SQL.
- An unknown column returns 500 with `Read failed` and the database error.

## Ranges, joins and totals: read-only SQL

Connect an MCP client (Claude, ChatGPT, Cursor, Claude Code or your own agent) and use `run_sql`: one read-only SELECT on the workspace's own Postgres database, up to 500 rows, with a 5-second limit. `export_csv` saves up to 10,000 rows as a CSV link.

MCP: explore, then query:

```text
describe_schema({ "tables": ["jobs", "customers"] })

run_sql({ "sql": "SELECT j.id, j.title, c.company_name, j.status
  FROM jobs j JOIN customers c ON c.id = j.customer_id
  WHERE j.status = 'completed' LIMIT 50" })
```

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

### Can I read jobs from Fieldproxy with an API?

Yes. POST /api/read with a table name and a condition returns every matching row with all its columns, for example every job assigned to one technician.

### How do I query Fieldproxy data by date range or with joins?

Use read-only SQL through Fieldproxy's MCP server: run_sql runs any SELECT on the workspace's own Postgres database, up to 500 rows, and export_csv saves up to 10,000 rows.

### Is Fieldproxy data open to my own tools?

Yes. Each workspace has its own Postgres database, readable through the REST API, read-only SQL, CSV and Excel export, and the db_sync automation step.

## 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)