API overview
The Expedify public API is one versioned, scoped gateway — /v1 — over the whole product: CRM objects, Workflows, Knowledge Base, and Analytics. 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 (CRUD, list/search, associations) |
| Workflows | /v1/workflows/* — author, validate, run, and debug automations |
| Knowledge Base | /v1/knowledge-bases/* — KBs + documents, semantic search, RAG ask |
| Analytics | /v1/analytics/* — datasets, charts, dashboards, SQL / NL→SQL queries |
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
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.