Workflows
A workflow automates a sequence of steps for every contact enrolled in it. You build and publish workflows in the SMBcrm UI. With the API, you can list the workflows in your account, enroll a contact in one, and remove a contact from one.
Base URL: https://services.smbcrm.com · Version header: v3 ·
Scopes: workflows.readonly (list), contacts.write (enroll or remove a contact). See
Scopes.
List workflows
Section titled “List workflows”locationId is required as a query parameter and scopes the results to your account.
| Query param | Type | Required | Description |
|---|---|---|---|
locationId |
string | Yes | The account (location) whose workflows to list. |
curl "https://services.smbcrm.com/workflows/?locationId=<location_id>" \ -H "Authorization: Bearer <token>" \ -H "Version: v3"{ "workflows": [ { "id": "<workflow_id>", "name": "New Lead Nurture", "status": "published", "version": 2, "createdAt": "2026-05-26T11:33:49.000Z", "updatedAt": "2026-05-26T11:33:49.000Z", "locationId": "<location_id>" }, { "id": "<workflow_id>", "name": "Missed Call Follow-Up", "status": "draft", "version": 1, "createdAt": "2026-06-02T16:20:10.000Z", "updatedAt": "2026-06-02T16:20:10.000Z", "locationId": "<location_id>" } ]}Each workflow in workflows has these fields:
| Field | Type | Description |
|---|---|---|
id |
string | The workflow ID. Use it to enroll or remove contacts. |
name |
string | The workflow’s name. |
status |
string | The workflow’s status, for example draft or published. |
version |
number | The workflow’s version number. |
createdAt |
string | When the workflow was created (ISO 8601). |
updatedAt |
string | When the workflow was last updated (ISO 8601). |
locationId |
string | The account (location) the workflow belongs to. |
Save the id of the workflow you want. You’ll need it to enroll or remove contacts.
Enroll a contact in a workflow
Section titled “Enroll a contact in a workflow”Once you have a workflow’s id, add a contact to it with this endpoint (it’s also listed on
the Contacts page):
Send a JSON body with the request. The body can be an empty object.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
contactId |
path | string | Yes | The contact to enroll. |
workflowId |
path | string | Yes | The workflow to enroll the contact in. |
eventStartTime |
body | string | No | Start time of the workflow event, in ISO 8601 format. |
curl -X POST https://services.smbcrm.com/contacts/<contact_id>/workflow/<workflow_id> \ -H "Authorization: Bearer <token>" \ -H "Version: v3" \ -H "Content-Type: application/json" \ -d '{}'To pass an event time, include eventStartTime in the body:
curl -X POST https://services.smbcrm.com/contacts/<contact_id>/workflow/<workflow_id> \ -H "Authorization: Bearer <token>" \ -H "Version: v3" \ -H "Content-Type: application/json" \ -d '{ "eventStartTime": "2026-10-09T09:30:00-05:00" }'{ "succeeded": true }The response can also include succeded, a legacy misspelling of succeeded. It’s
deprecated, so read succeeded. Failed requests return 400, 401, or 422; see
Errors.
Remove a contact from a workflow
Section titled “Remove a contact from a workflow”This endpoint takes the same path parameters, request body, and response as enrolling a contact. Send a JSON body with the request; it can be an empty object.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
contactId |
path | string | Yes | The contact to remove. |
workflowId |
path | string | Yes | The workflow to remove the contact from. |
eventStartTime |
body | string | No | Start time of the workflow event, in ISO 8601 format. |
curl -X DELETE https://services.smbcrm.com/contacts/<contact_id>/workflow/<workflow_id> \ -H "Authorization: Bearer <token>" \ -H "Version: v3" \ -H "Content-Type: application/json" \ -d '{}'{ "succeeded": true }