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, 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

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

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.