Developers
Entrox API
Read and write your workspace's own data from your own tools: REST endpoints, keys narrowed by scope, and a bulk export for a warehouse or a BI tool.
This page is generated from the API itself. The endpoint table, the scopes and the export resources are served by GET /api/v1/public/reference, so what you read here is what the API answers — there is no second copy to drift.
Quick start
- Base URL
- https://app.entrox.ai/api/v1/public
- Header
- Authorization: Bearer entrox_pat_…
Every path carries the id of the workspace the key belongs to. Another workspace's id answers 404 rather than 403, so ids stay unguessable.
List conversations
curl -H "Authorization: Bearer entrox_pat_…" \ "https://app.entrox.ai/api/v1/public/workspaces/WORKSPACE_ID/conversations"
Authenticating
A token addresses one workspace and acts as the person who minted it, with their role. Scopes only ever narrow that.
Scopes
A key carries one workspace and acts as the person who minted it, narrowed by scopes. Each scope is a resource and a level; a higher level implies the one below it.
workspaceworkspace:admin workspace:read workspace:writecontactscontacts:admin contacts:read contacts:writecatalogcatalog:admin catalog:read catalog:writeordersorders:admin orders:read orders:writebookingsbookings:admin bookings:read bookings:writeconversationsconversations:admin conversations:read conversations:writeknowledgeknowledge:admin knowledge:read knowledge:writeagentagent:admin agent:read agent:writeflowsflows:admin flows:read flows:writestorefrontstorefront:admin storefront:read storefront:writeanalyticsanalytics:admin analytics:read analytics:writeerperp:admin erp:read erp:writepaymentspayments:admin payments:read payments:write
- admin — DELETE, plus the irreversible actions listed below.
- read — GET and HEAD.
- write — POST, PATCH and PUT — create, update, send, resolve.
Endpoints
Everything the owner can do, mounted under the workspace. The path shown is relative to the base URL and the workspace id.
| Path | Scope |
|---|---|
| / | workspace |
| /agent | agent |
| /analytics | analytics |
| /audit | analytics |
| /automations | flows |
| /billing | workspace |
| /bookings | bookings |
| /catalog | catalog |
| /channels | workspace |
| /contacts | contacts |
| /conversations | conversations |
| /erp | erp |
| /flows | flows |
| /hours | workspace |
| /integrations | workspace |
| /invitations | workspace |
| /logo | workspace |
| /members | workspace |
| /notifications | workspace |
| /onboarding | workspace |
| /orders | orders |
| /payments | payments |
| /privacy | workspace |
| /saved-replies | conversations |
| /security | workspace |
| /storefront | storefront |
| /tags | contacts |
| /uploads | workspace |
| /webchat | workspace |
| /webhooks | workspace |
Actions that cost more than their method suggests
Some routes are not described by their HTTP method: refunding an order is a POST, and so is recording it as paid. These need the level shown, whichever kind of key you hold.
| Path | Needs |
|---|---|
| POST /orders/*/status | action → cancel=admin, refund=admin |
| POST /bookings/*/status | action → cancel=admin |
| POST /payments/*/cancel | admin |
| POST /privacy/exports | admin |
| POST /privacy/delete | admin |
| POST /privacy/delete/cancel | admin |
| POST /privacy/customers/*/erase | admin |
| PUT /privacy/retention | admin |
| POST /agent/publish | admin |
| POST /agent/versions/*/restore | admin |
| PUT /agent/usage/caps | admin |
| POST /flows/*/enable | admin |
| POST /automations/*/enable | admin |
| POST /storefront/publish | admin |
| POST /storefront/unpublish | admin |
| PUT /storefront/domain | admin |
| POST /storefront/domain/verify | admin |
| POST /erp/enable | admin |
| PUT /erp/settings | admin |
| POST /erp/sample | admin |
| POST /erp/stocktakes/*/post | admin |
| POST /erp/purchase-orders/*/receive | admin |
| POST /erp/purchase-orders/*/state | admin |
| PUT /integrations/telegram | admin |
| PUT /integrations/google-calendar | admin |
| POST /channels/meta/connect | admin |
| POST /channels/*/disconnect | admin |
| POST /webhooks/*/rotate-secret | admin |
| POST /invitations | admin |
| POST /invitations/*/resend | admin |
| PUT /security | admin |
| POST /billing/checkout | admin |
| POST /onboarding/publish | admin |
Bulk export
A whole table, streamed as NDJSON or CSV, for a warehouse or a one-off analysis. Paged with a keyset cursor, so pages never overlap and two exports of the same data agree.
https://app.entrox.ai/api/v1/public/workspaces/WORKSPACE_ID/export/{resource}.ndjson or /export/{resource}.csv
?since=&until=&cursor=&limit=
- Scope
- the read scope of the resource being exported
- Paging
- A full page returns X-Next-Cursor; an empty one means the last page. Rows are ordered by (created_at, id) and never overlap.
- Caveat
- Concurrent writes and deletes are not isolated, so a row changed during an export may appear in either shape, and a row deleted during one may still appear.
contacts.ndjsontags.ndjsoncontact_tags.ndjsoncontact_notes.ndjsonconversations.ndjsonmessages.ndjsonorders.ndjsonorder_items.ndjsonbookings.ndjsonpayments.ndjsonproducts.ndjsonservices.ndjsonstaff.ndjsonaudit_log.ndjson
# Page to the end: an empty page means no more pages, and a full one # always carries X-Next-Cursor, so no rows are lost at a boundary. curl -D - -H "Authorization: Bearer entrox_pat_…" \ "https://app.entrox.ai/api/v1/public/workspaces/WORKSPACE_ID/export/conversations.ndjson?limit=1000"
Errors
| Code | Status | Meaning |
|---|---|---|
| unauthenticated | 401 | No credential, or one that is unknown, revoked, expired or from a disallowed address. |
| not_found | 404 | Another workspace's id, or a resource that does not exist. |
| insufficient_scope | 403 | The token is real but too narrow for this route. |
| unknown_route | 403 | This route is not part of the public API. |
| rate_limited | 429 | Too many requests this minute for this token. |
| invalid_cursor | 400 | A cursor this API did not issue, or one from a different export. |
Before you build on it
- A key is as powerful as the role of the person who minted it and no more, and it is revoked with them.
- Keys are not interactive sessions, so a workspace's two-factor policy does not cover them.
- Rate limiting is per process and per minute, and the IP allowlist trusts the proxy's forwarding header.
- An export is reproducible only against a table nobody is writing to: a row changed during one may appear in either shape.
Questions about integrating? Write to [email protected]