Features Solutions Pricing Integrations Resources About BNI Contact
Log in Start Free
Developer reference

ImpactiveAI CRM API

A simple HTTP + JSON API for syncing contacts, deals, invoices, projects and email sequences with ImpactiveAI CRM. Designed for Zapier, Make, n8n, custom backends, and AI agents like Claude Code or Cloud Co-Work.

Base URL

All endpoints are served from your workspace host. If you use ImpactiveAI's standard domain, the base URL is:

https://app.impactiveai.com

If your workspace uses a custom domain (white-label setup), swap https://app.impactiveai.com for that domain — for example https://crm.yourcompany.com. Both the Agent API and Zapier API are reachable from any host that serves your workspace.

Authentication

Every request must include an x-api-key header. API keys look like icrm_ followed by 32 hex characters and are scoped to a single workspace.

x-api-key: icrm_8f3a1c2b4d5e6f7081928374a5b6c7d8

Create or revoke keys

In the app, open Workspace Settings → Integrations → API Keys. Click Create Key, give it a name, and copy the full key — it is only shown once. Revoke a key any time from the same screen; the change takes effect immediately on the next request.

Error responses

Agent API — /api/agent/*

A higher-level surface for AI agents and bespoke integrations. Supports batch contact creation, sequence enrollment, reply retrieval, and bookings.

GET/api/agent/contacts

List contacts in the workspace. Optional limit query parameter (default 100, max 500).

curl https://app.impactiveai.com/api/agent/contacts?limit=50 \ -H "x-api-key: icrm_..."
POST/api/agent/contacts

Create one or many contacts. Send a single object, or an array of objects for batch create.

curl -X POST https://app.impactiveai.com/api/agent/contacts \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "firstName": "Ada", "lastName": "Lovelace", "email": "ada@example.com", "phone": "+44 20 7946 0000", "title": "Founder", "companyId": null, "tags": ["inbound","newsletter"] }'

Required: firstName, lastName. Returns the created contact (or an array of contacts for batch).

PATCH/api/agent/contacts/:id

Update a contact. Send only the fields you want to change.

curl -X PATCH https://app.impactiveai.com/api/agent/contacts/CONTACT_ID \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "title": "CEO", "tags": ["customer"] }'
GET/api/agent/contacts/:id/replies

List inbound emails received from this contact (up to 100, most recent first). Useful for agents that want to read replies before deciding next steps.

curl https://app.impactiveai.com/api/agent/contacts/CONTACT_ID/replies \ -H "x-api-key: icrm_..."
GET/api/agent/sending-accounts

List the SMTP sending accounts configured for this workspace. Use the returned id as sendingAccountId when creating or updating a sequence, so the agent can pick which "from" address the sequence sends from.

Each row contains: id, name, fromName, fromEmail, smtpHost, syncEnabled. Credentials are never returned. If the workspace has no SMTP accounts the list is empty and sequences fall back to the platform default sender (Resend).

curl https://app.impactiveai.com/api/agent/sending-accounts \ -H "x-api-key: icrm_..."
POST/api/agent/sequences

Create a new email sequence with optional inline steps. Each step needs a subject, body, and a delayDays (0 for the first send). status defaults to active. sendingAccountId is optional — call GET /api/agent/sending-accounts to pick one, or omit (or set to null) to fall back to the workspace default sender (Resend if no SMTP account is connected).

curl -X POST https://app.impactiveai.com/api/agent/sequences \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "name": "New lead nurture", "description": "Welcome flow for inbound demo requests", "status": "active", "sendingAccountId": null, "steps": [ { "subject": "Welcome", "body": "Hi {{firstName}}...", "delayDays": 0 }, { "subject": "Following up", "body": "Just checking in...", "delayDays": 3 } ] }'

Returns 201 with the created sequence and its steps array.

GET/api/agent/sequences

List every sequence in the workspace. Each row includes stepCount and an enrollmentCounts object (total, plus a count per status — active / paused / completed / unsubscribed).

curl https://app.impactiveai.com/api/agent/sequences -H "x-api-key: icrm_..."
GET/api/agent/sequences/:id

Fetch a single sequence with its full step list (ordered by position) and enrollment counts.

curl https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID \ -H "x-api-key: icrm_..."
PATCH/api/agent/sequences/:id

Update a sequence's name, description, status (draft / active / paused / archived), or sendingAccountId (must be an id returned by GET /api/agent/sending-accounts; set to null to send via the platform default).

curl -X PATCH https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "status": "paused" }'
POST/api/agent/sequences/:id/steps

Append a new step (or insert at a specific zero-based position; existing steps at or after that index shift down). delayDays is the wait before this step is sent relative to the previous send.

curl -X POST https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID/steps \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "subject": "Quick check-in", "body": "Hi {{first_name}}, just following up...", "delayDays": 5 }'
PATCH/api/agent/sequences/:id/steps/:stepId

Edit any field on a step. Setting position reorders the sequence so positions stay contiguous.

curl -X PATCH https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID/steps/STEP_ID \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "subject": "New subject line", "delayDays": 2 }'
DELETE/api/agent/sequences/:id/steps/:stepId

Delete a step and compact the remaining positions back to 0..n-1.

curl -X DELETE https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID/steps/STEP_ID \ -H "x-api-key: icrm_..."
POST/api/agent/sequences/:id/enroll

Enroll contacts into a sequence by any combination of contactIds, tagIds, and listIds (at least one must be provided). The resolved audience is deduped against people already enrolled; skipped rows include a reason (already_enrolled or not_found).

Using tagIds or listIds requires the Audience module to be enabled for the workspace; plain contactIds always works.

curl -X POST https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID/enroll \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "contactIds": ["CONTACT_ID_1"], "tagIds": ["TAG_ID_NEWSLETTER"], "listIds": ["LIST_ID_VIP"] }'

Returns 201 with:

{ "enrolled": [ /* newly created enrollment objects */ ], "skipped": [ { "contactId": "...", "reason": "already_enrolled" } ], "resolvedCount": 12 }
GET/api/agent/sequences/:id/enrollments

List who is on the sequence plus their state. Each row contains: id, contactId, a denormalised contact summary (id, firstName, lastName, email), status (active / paused / completed / unsubscribed), currentStep, startedAt, nextSendAt, completedAt, pausedAt, pauseReason, lastSendError, lastSendErrorAt, consecutiveFailures, and updatedAt.

Supports ?since=ISO_8601 to only return enrollments updated strictly after that timestamp (exclusive boundary).

curl "https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID/enrollments?since=2026-05-20T00:00:00Z" \ -H "x-api-key: icrm_..."
GET/api/agent/sequences/:id/sends

List outbound emails sent by this sequence (up to 500, newest first). Each row contains: id, contactId, sequenceStepId, sequenceEnrollmentId, subject, fromAddress, toAddresses, body, emailDate. Sends remain visible here even after a contact is unenrolled (sequenceEnrollmentId may then be null). Sends that happened before this linkage was introduced are not returned.

Supports ?since=ISO_8601 filtered on emailDate >= since (inclusive boundary).

curl "https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID/sends?since=2026-05-20T00:00:00Z" \ -H "x-api-key: icrm_..."
GET/api/agent/sequences/:id/replies

List inbound replies from contacts currently enrolled in this sequence (up to 500, newest first). Each row contains: id, contactId, enrollmentId, subject, fromAddress, body, emailDate. Replies from contacts who have been fully unenrolled are not returned by this endpoint — use GET /api/agent/contacts/:id/replies if you need reply history per contact.

Supports ?since=ISO_8601 filtered on emailDate >= since (inclusive boundary).

curl "https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID/replies?since=2026-05-20T00:00:00Z" \ -H "x-api-key: icrm_..."
POST/api/agent/sequences/:id/pause

Pause active enrollments. Pass contactIds to pause only specific people; omit it to pause everyone currently active on the sequence.

curl -X POST https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID/pause \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "contactIds": ["CONTACT_ID_1"] }'
DELETE/api/agent/sequences/:id/contacts/:contactId

Unenroll a contact from a sequence.

curl -X DELETE https://app.impactiveai.com/api/agent/sequences/SEQUENCE_ID/contacts/CONTACT_ID \ -H "x-api-key: icrm_..."
Polling tip: For the /enrollments, /sends and /replies endpoints, remember the highest updatedAt (enrollments) or emailDate (sends/replies) you've seen and pass it back as ?since= on the next poll to get only new rows. Note the boundary is exclusive for enrollments (>) and inclusive for sends/replies (>=), so for sends/replies de-dupe on the row id when the cursor matches the previous poll's max emailDate. A 5–15 minute poll interval is usually plenty.
GET/api/agent/bookings

List all bookings in the workspace.

curl https://app.impactiveai.com/api/agent/bookings -H "x-api-key: icrm_..."
POST/api/agent/bookings

Create a booking, optionally linked to an existing contact.

curl -X POST https://app.impactiveai.com/api/agent/bookings \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "name": "Discovery call — Ada Lovelace", "email": "ada@example.com", "scheduledAt": "2026-06-12T14:00:00Z", "contactId": "CONTACT_ID", "notes": "Interested in the pro plan" }'

Zapier / polling API — /api/zapier/*

Designed for poll-based integrations (Zapier, Make, n8n). List endpoints return up to 100 records sorted by updatedAt descending and support a ?since=ISO_8601 filter for incremental polling. Action endpoints (POST) create new records on demand.

GET/api/zapier/auth/test

Verify an API key. Returns the workspace's id and name. Used by Zapier's Auth Test step.

curl https://app.impactiveai.com/api/zapier/auth/test -H "x-api-key: icrm_..."
GET/api/zapier/companies

List companies. Optional ?since=2026-05-01T00:00:00Z returns only companies updated after that timestamp.

curl "https://app.impactiveai.com/api/zapier/companies?since=2026-05-01T00:00:00Z" \ -H "x-api-key: icrm_..."
POST/api/zapier/companies

Create a company. name is required.

curl -X POST https://app.impactiveai.com/api/zapier/companies \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "name": "Acme Co", "website": "https://acme.example", "industry": "Software", "city": "London", "country": "United Kingdom" }'
GET/api/zapier/contacts

List contacts with optional ?since= filter. Each row includes companyName for convenience.

curl https://app.impactiveai.com/api/zapier/contacts -H "x-api-key: icrm_..."
POST/api/zapier/contacts

Create a contact. firstName and lastName are required.

curl -X POST https://app.impactiveai.com/api/zapier/contacts \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "firstName": "Grace", "lastName": "Hopper", "email": "grace@example.com", "companyId": "COMPANY_ID" }'
GET/api/zapier/deals

List deals with stage name, company name, and primary contact name resolved.

curl "https://app.impactiveai.com/api/zapier/deals?since=2026-05-01T00:00:00Z" \ -H "x-api-key: icrm_..."
POST/api/zapier/deals

Create a deal. name is required; if stageId is omitted, the deal is placed in the first stage of the pipeline.

curl -X POST https://app.impactiveai.com/api/zapier/deals \ -H "x-api-key: icrm_..." \ -H "Content-Type: application/json" \ -d '{ "name": "Acme — Q3 renewal", "value": 12000, "companyId": "COMPANY_ID", "contactId": "CONTACT_ID", "expectedClose": "2026-09-30", "source": "Referral" }'
GET/api/zapier/invoices

List invoices with totals, status, due/paid dates, and resolved company/contact names.

curl https://app.impactiveai.com/api/zapier/invoices -H "x-api-key: icrm_..."
GET/api/zapier/projects

List projects with stage name and company name.

curl https://app.impactiveai.com/api/zapier/projects -H "x-api-key: icrm_..."

Polling pattern for triggers

For poll-based integrations, store the highest updatedAt you've seen and pass it back as ?since= on the next poll. Records are returned newest-first, capped at 100 per request. Typical poll interval: 5–15 minutes.

Questions?

If you hit something unexpected, get in touch via the contact page. For Zapier-specific setup, see the Integrations page.

Ready to start?

Create a free workspace and generate your first API key in under a minute.

Create your free account