Run a Call has a public REST API for connecting your own tools: import customers from another system, pull jobs and invoices into a spreadsheet or data warehouse, or have an automation platform like Zapier, Make or n8n react to what happens in your account. This page is a quick orientation. The full reference lives at docs.runacall.com.

Note

The API is meant for developers or anyone comfortable with tools that make web requests. Only the account owner can create API keys.

Where to start

Go to Settings → Integrations. Two cards cover the API:

External REST API card on the Integrations settings page with Manage keys highlighted

The basics

Base URLhttps://api.runacall.com/v1
AuthenticationAuthorization: Bearer rkc_live_... on every request
FormatJSON in, JSON out. Write requests need Content-Type: application/json.
PermissionsEach key has Read (all GET requests) and/or Write (POST and PATCH) access
DeletingThere are no delete endpoints. Deleting records is done in the app.
Your data onlyA key only ever sees your company's records.

Quick test:

curl https://api.runacall.com/v1/customers \
  -H "Authorization: Bearer rkc_live_..."

What you can reach

ResourceReadWrite
Customers, properties, equipment, equipment systemsList, get, look upCreate, update
Jobs and their appointments (visits), job tagsList, getCreate, update, assign techs, add tags
MembershipsList, get, look upCreate, update, transfer to a new homeowner
Estimates, invoicesList, get, look up
PaymentsList, get
Pricebook, tagsList, get
AI receptionist calls, communicationsList, get

The exact fields, filters and examples for each are at docs.runacall.com.

Things integrators should know

  • No duplicates on re-runs. Customers, properties, equipment, jobs and memberships accept an external_id plus external_source (your system's ID). Sending the same pair again updates the existing record instead of creating a second one — so an import script is safe to re-run.
  • Paging. Lists return up to 50 records by default (limit up to 100), with has_more and a next_cursor you pass back as starting_after.
  • Rate limits. 60 requests per minute per key, short bursts up to 120 in 10 seconds, and 300 per minute across all of your keys combined. Going over returns 429 with a Retry-After header. Need more? Contact support.
  • Errors share one shape with a code, a readable message and a request_id. Include the request_id when you contact support.
  • Merged customers. If your team merges two customers, requests for the merged-away customer return 410 with the surviving customer's ID.

Webhooks instead of polling

Rather than asking the API "anything new?" every few minutes, subscribe to webhooks and Run a Call sends each event — a new customer, a scheduled job, a paid invoice — to your URL as it happens. See Subscribing to webhooks.

Common uses

GoalApproach
Move customers in from another systemPOST /customers, /properties, /equipment with your own external_id
Reporting in a spreadsheet or BI toolPage through GET /jobs, /invoices, /payments
Zapier, Make or n8n flowsWebhooks as triggers, API calls as actions — see Connecting Run a Call to Zapier, Make or n8n
React to a missed call or a paid invoiceWebhooks