API overview
The Expedify public API is one versioned, scoped gateway — /v1 — over the whole product: CRM objects, Workflows, Knowledge Base, Analytics, Channels, Settings, and Blueprints. Every capability is also available to AI agents over MCP with the same key and scopes.
Base URL
https://api.expedify.ai/v1
All requests use TLS. Authenticate with a Bearer agx_ API key — see Authentication.
What's here
| Module | Resource |
|---|---|
| CRM Objects | /v1/objects/{entity} — contacts, companies, deals, tasks, notes, activities, products, deal payments, deal payment schedules (CRUD, list/search, associations, batch writes) |
| Workflows | /v1/workflows/* — author, validate, run, and debug automations |
| Automation | /v1/blueprints/*, /v1/workflows/{id}/blueprint — read, author, and validate the visual Blueprint behind a workflow |
| Knowledge Base | /v1/knowledge-bases/* — KBs + documents, semantic search, RAG ask |
| Analytics | /v1/analytics/* — datasets, charts, dashboards, SQL / NL→SQL queries |
| Channels | /v1/templates/*, /v1/assets/*, /v1/segments/*, /v1/campaigns/*, /v1/communications/* — marketing templates and assets, audience segments, campaigns (incl. send), and read-only voice / WhatsApp / SMS history |
| Settings | /v1/integrations/*, /v1/webhooks/* — browse and test connected integrations (never exposes credentials); manage incoming + outgoing webhooks |
| Search | /v1/search — cross-entity find-by-name over workflows, charts, dashboards, and datasets |
Uniform resource model
Standard CRM entities are served through one shape — {entity} is a path parameter:
GET /v1/objects/{entity} list + filter + search
POST /v1/objects/{entity} create
GET /v1/objects/{entity}/{id} read
PATCH /v1/objects/{entity}/{id} partial update
DELETE /v1/objects/{entity}/{id} delete
GET /v1/objects/{entity}/{id}/{target} list associated records
POST /v1/objects/{entity}/{id}/associations/{target}/{tid} link
DELETE /v1/objects/{entity}/{id}/associations/{target}/{tid} unlink
POST /v1/objects/{entity}/batch/create create up to 200 atomically
POST /v1/objects/{entity}/batch/update update up to 200 atomically
POST /v1/objects/{entity}/batch/delete delete up to 200 atomically
{entity} is one of contacts, companies, deals, tasks, notes, activities, products, deal_payments, deal_payment_schedules. See Bulk operations for the batch semantics.
The envelope
Every endpoint shares one shape.
Lists are paginated (offset-based for v1):
{
"data": [ /* records */ ],
"pagination": { "limit": 50, "offset": 0, "total": 128, "has_more": true }
}
?limit= (1–200, default 50) and ?offset= page through results.
Errors are always:
{ "error": { "type": "not_found", "message": "…", "request_id": "…" } }
Quote the request_id in support requests. Standard statuses: 400 invalid request, 401 missing/bad key, 403 scope denied, 404 not found, 422 validation, 429 rate limited.
Filtering & search
On any list endpoint:
- Free-text:
?q=acme— searches all text fields (and custom-field values). - Field filters:
?field__op=value— operatorseq, neq, gt, gte, lt, lte, like, in, nin, is_empty, is_not_empty. e.g.?lead_score__gte=50,?lead_status__in=new,qualified. - Custom fields:
?cf.<key>=value— filter on a custom field. - AND/OR:
?match=anyORs the field filters (defaultall). - Sort:
?sort=created_at&order=desc.
Versioning & stability
/v1 is a contract. Changes are additive within the version; a breaking change ships as /v2 with an overlap + sunset — /v1 shape never silently breaks. A checked-in golden contract test guards the surface (REST + MCP) on every change.
Same call, three ways
Every operation is available as REST, an SDK call, and an MCP tool. See the Quickstart for the same first call shown all three ways.