Skip to main content

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

ModuleResource
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.

On any list endpoint:

  • Free-text: ?q=acme — searches all text fields (and custom-field values).
  • Field filters: ?field__op=value — operators eq, 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=any ORs the field filters (default all).
  • 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.