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.
All endpoints are served from your workspace host. If you use ImpactiveAI's standard domain, the base URL is:
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.
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.
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.
401 Unauthorized — missing or invalid x-api-key header.400 Bad Request — invalid body, missing required fields, or a referenced ID doesn't belong to your workspace.404 Not Found — the resource ID doesn't exist in your workspace.429 Too Many Requests — rare; back off and retry with exponential delay if you see this./api/agent/*A higher-level surface for AI agents and bespoke integrations. Supports batch contact creation, sequence enrollment, reply retrieval, and bookings.
/api/agent/contactsList contacts in the workspace. Optional limit query parameter (default 100, max 500).
/api/agent/contactsCreate one or many contacts. Send a single object, or an array of objects for batch create.
Required: firstName, lastName. Returns the created contact (or an array of contacts for batch).
/api/agent/contacts/:idUpdate a contact. Send only the fields you want to change.
/api/agent/contacts/:id/repliesList inbound emails received from this contact (up to 100, most recent first). Useful for agents that want to read replies before deciding next steps.
/api/agent/sending-accountsList 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).
/api/agent/sequencesCreate 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).
Returns 201 with the created sequence and its steps array.
/api/agent/sequencesList every sequence in the workspace. Each row includes stepCount and an enrollmentCounts object (total, plus a count per status — active / paused / completed / unsubscribed).
/api/agent/sequences/:idFetch a single sequence with its full step list (ordered by position) and enrollment counts.
/api/agent/sequences/:idUpdate 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).
/api/agent/sequences/:id/stepsAppend 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.
/api/agent/sequences/:id/steps/:stepIdEdit any field on a step. Setting position reorders the sequence so positions stay contiguous.
/api/agent/sequences/:id/steps/:stepIdDelete a step and compact the remaining positions back to 0..n-1.
/api/agent/sequences/:id/enrollEnroll 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.
Returns 201 with:
/api/agent/sequences/:id/enrollmentsList 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).
/api/agent/sequences/:id/sendsList 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).
/api/agent/sequences/:id/repliesList 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).
/api/agent/sequences/:id/pausePause active enrollments. Pass contactIds to pause only specific people; omit it to pause everyone currently active on the sequence.
/api/agent/sequences/:id/contacts/:contactIdUnenroll a contact from a sequence.
/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.
/api/agent/bookingsList all bookings in the workspace.
/api/agent/bookingsCreate a booking, optionally linked to an existing contact.
/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.
/api/zapier/auth/testVerify an API key. Returns the workspace's id and name. Used by Zapier's Auth Test step.
/api/zapier/companiesList companies. Optional ?since=2026-05-01T00:00:00Z returns only companies updated after that timestamp.
/api/zapier/companiesCreate a company. name is required.
/api/zapier/contactsList contacts with optional ?since= filter. Each row includes companyName for convenience.
/api/zapier/contactsCreate a contact. firstName and lastName are required.
/api/zapier/dealsList deals with stage name, company name, and primary contact name resolved.
/api/zapier/dealsCreate a deal. name is required; if stageId is omitted, the deal is placed in the first stage of the pipeline.
/api/zapier/invoicesList invoices with totals, status, due/paid dates, and resolved company/contact names.
/api/zapier/projectsList projects with stage name and company name.
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.
If you hit something unexpected, get in touch via the contact page. For Zapier-specific setup, see the Integrations page.
Create a free workspace and generate your first API key in under a minute.
Create your free account