Browse the docs

Reference

REST API

Every MCP tool is also a REST operation with the same input and result. Use it from scripts, backends, Zapier-style tools and agents that call HTTP APIs instead of MCP (Delegated's Custom APIs, for example).

Base URL: https://api.tandemcrm.app Auth: Authorization: Bearer crm_sk_… (see Authentication)

List operations

curl https://api.tandemcrm.app/v1/ops -H "Authorization: Bearer $TANDEM_API_KEY"

Returns { "operations": [{ "name", "description", "scope", "mutating", "input_schema" }] } for the operations your key may call. input_schema is JSON Schema.

Run an operation

curl -X POST https://api.tandemcrm.app/v1/ops/upsert_company \
  -H "Authorization: Bearer $TANDEM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: import-acme-1" \
  -d '{"name": "Acme", "domain": "acme.com", "source": {"name": "My script"}}'

The body is the operation's input; the response is its result as JSON.

Idempotency

Writes accept an Idempotency-Key header (over MCP, an idempotency_key argument). A retry with the same key returns the first result instead of writing twice. Keys are kept for 24 hours.

Errors

Errors are JSON with an HTTP status:

{ "error": { "code": "not_found", "message": "Stage 'Won' not found.", "hint": "Use one of: lead, qualified, proposal, negotiation, won, lost." } }

hint tells the caller, often a model, what to do next. See Errors and limits.

Other endpoints

EndpointWhoWhat
GET /v1/exportOwners and admins, signed inThe whole workspace as a ZIP of CSV and JSON.
GET /v1/people/:id/exportOwners and admins, signed inEverything about one person, as JSON (data subject access).
POST /v1/people/:id/eraseOwners and admins, signed inErase a person, and by default add them to the do-not-contact list.
GET/POST/DELETE /v1/api-keysOwners and admins, signed inManage API keys.
POST /v1/importSigned-in peopleImport CSV rows (the app's importer uses it).

This page as Markdown · All docs in one file