Getting started
The v1 API
REST over HTTPS: eight resources, two interchangeable credentials, outbound webhooks.
https://orkasa.app/api/v1
This is what the Zapier integration runs on, and what shares cores with the MCP connector.
Authentication
Two credential types are accepted, and they are interchangeable everywhere:
| Header | For | |
|---|---|---|
| API key | Authorization: Bearer ork_live_… | a broker automating their own account |
| OAuth 2.0 | Authorization: Bearer ork_at_… | a third-party app acting on their behalf |
Both resolve to the same brokerage and permission context, so every endpoint behaves identically whichever you present. See API keys and OAuth 2.0.
The response envelope
Success:
{ "data": { "…": "…" }, "meta": { "next_cursor": null, "limit": 25 } }
Error:
{ "error": { "code": "validation_error", "message": "…", "details": [] } }
code is the contract — branch on it, not on the HTTP status or the message.
The full table is in Errors.
Two endpoints answer flat, with no envelope, because Zapier stores the whole
body: GET /me and POST /hooks.
Pagination
List endpoints take ?limit (default 25, max 100) and ?cursor, a keyset
cursor over created_at, id descending. Pass meta.next_cursor back as
?cursor= for the next page; null means the end.
It is a keyset cursor, not an offset: it neither repeats nor skips rows when someone inserts a lead while you walk the list.
The resources
| Resource | Endpoints |
|---|---|
leads | list · get · create · update · archive |
operations | list · get · create · update |
properties | list · get · create · update |
viewings | list · get · create · update |
offers | list · get · create · update |
documents | list |
signatures | list |
agents | list |
hooks | subscribe · unsubscribe · sample |
Bodies are strict
An unrecognised field is a 422, not a silent ignore. System columns —
brokerage_id, id, timestamps, public_slug — are not reachable from any
payload.
Rate limit
120 requests per minute per credential. See Rate limits.