Journeys API
Journeys are multi-step, multi-channel automation workflows that move customers through a sequence of actions based on entry criteria, branching logic, time delays, and exit conditions. Journeys are defined as a DAG (directed acyclic graph) of tiles connected by edges.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v1/workspaces/{id}/journeys | List all journeys |
POST | /api/v1/workspaces/{id}/journeys | Create a journey |
GET | /api/v1/workspaces/{id}/journeys/{journeyId} | Get a journey |
PUT | /api/v1/workspaces/{id}/journeys/{journeyId} | Update a journey |
DELETE | /api/v1/workspaces/{id}/journeys/{journeyId} | Delete a journey |
POST | /api/v1/workspaces/{id}/journeys/{journeyId}/validate | Validate journey DAG |
POST | /api/v1/workspaces/{id}/journeys/{journeyId}/activate | Activate a journey |
POST | /api/v1/workspaces/{id}/journeys/{journeyId}/pause | Pause a journey |
POST | /api/v1/workspaces/{id}/journeys/{journeyId}/resume | Resume a journey |
POST | /api/v1/workspaces/{id}/journeys/{journeyId}/trigger | Trigger evaluation |
GET | /api/v1/workspaces/{id}/journeys/{journeyId}/runs | List runs |
GET | /api/v1/workspaces/{id}/journeys/{journeyId}/runs/{runId} | Get a run |
POST | /api/v1/workspaces/{id}/journeys/{journeyId}/runs/{runId}/cancel | Cancel a run |
GET | /api/v1/workspaces/{id}/journeys/{journeyId}/stats | Get journey stats |
List Journeys
GET /api/v1/workspaces/{id}/journeys
Returns all journeys in the workspace.
Response
[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"workspace_id": "660e8400-e29b-41d4-a716-446655440000",
"parent_model_id": "770e8400-e29b-41d4-a716-446655440000",
"name": "Onboarding Flow",
"description": "Welcome series for new customers",
"entry_criteria": {...},
"exit_criteria": {...},
"tiles": [...],
"edges": [...],
"schedule": "0 */6 * * *",
"status": "active",
"status_error": "",
"created_by": "880e8400-e29b-41d4-a716-446655440000",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"last_run_id": "990e8400-e29b-41d4-a716-446655440000",
"last_run_at": "2024-01-15T15:00:00Z"
}
]Example
curl -X GET https://your-instance.signalsmith.io/api/v1/workspaces/{id}/journeys \
-H "Authorization: Bearer <token>" \
-H "X-Workspace-ID: <workspace-id>"Create Journey
POST /api/v1/workspaces/{id}/journeys
Creates a new journey.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name |
description | string | No | Description |
parent_model_id | string (UUID) | Yes | Parent entity model for entry criteria |
entry_criteria | object | No | Filter tree defining who enters the journey |
exit_criteria | object | No | Filter tree defining who exits the journey |
tiles | array | No | Journey step definitions (tile DAG nodes) |
edges | array | No | Connections between tiles (DAG edges) |
schedule | string | No | Cron expression for evaluation schedule |
Tile Types
Tiles define the steps in a journey:
| Type | Description |
|---|---|
entry | Entry point tile (required, exactly one) |
wait | Time delay (e.g., wait 3 days) |
filter | Conditional branch based on audience criteria |
sync | Send data to a destination |
split | Random A/B split |
exit | Exit point tile |
Example
curl -X POST https://your-instance.signalsmith.io/api/v1/workspaces/{id}/journeys \
-H "Authorization: Bearer <token>" \
-H "X-Workspace-ID: <workspace-id>" \
-H "Content-Type: application/json" \
-d '{
"name": "Onboarding Flow",
"description": "Welcome series for new customers",
"parent_model_id": "770e8400-e29b-41d4-a716-446655440000",
"schedule": "0 */6 * * *",
"tiles": [
{
"id": "tile-1",
"type": "entry",
"position": {"x": 0, "y": 0}
},
{
"id": "tile-2",
"type": "sync",
"config": {
"destination_id": "880e8400-e29b-41d4-a716-446655440000",
"field_mapping": [...]
},
"position": {"x": 0, "y": 200}
},
{
"id": "tile-3",
"type": "wait",
"config": {"duration": 3, "unit": "days"},
"position": {"x": 0, "y": 400}
}
],
"edges": [
{"from": "tile-1", "to": "tile-2"},
{"from": "tile-2", "to": "tile-3"}
]
}'Get Journey
GET /api/v1/workspaces/{id}/journeys/{journeyId}
Returns a single journey by ID, including the full tile DAG definition.
Update Journey
PUT /api/v1/workspaces/{id}/journeys/{journeyId}
Updates an existing journey. Changes to active journeys take effect on the next evaluation run.
Delete Journey
DELETE /api/v1/workspaces/{id}/journeys/{journeyId}
Deletes a journey. Active journeys must be paused before deletion.
Response
{
"status": "deleted"
}Validate Journey
POST /api/v1/workspaces/{id}/journeys/{journeyId}/validate
Validates the journey’s tile DAG for structural correctness. Checks for:
- Exactly one entry tile
- No cycles in the graph
- All edges reference valid tiles
- Required configuration on each tile type
Response
{
"valid": true,
"errors": []
}Or with validation errors:
{
"valid": false,
"errors": [
"Journey must have exactly one entry tile",
"Tile 'tile-5' has no incoming edges and is not an entry tile"
]
}Activate Journey
POST /api/v1/workspaces/{id}/journeys/{journeyId}/activate
Activates a journey, enabling it to evaluate entry criteria and process members on schedule. The journey must pass validation before activation.
Response
Returns the updated journey object with status: "active".
Pause Journey
POST /api/v1/workspaces/{id}/journeys/{journeyId}/pause
Pauses an active journey. Members currently in the journey remain at their current tile but no new evaluations occur.
Response
Returns the updated journey object with status: "paused".
Resume Journey
POST /api/v1/workspaces/{id}/journeys/{journeyId}/resume
Resumes a paused journey.
Response
Returns the updated journey object with status: "active".
Trigger Evaluation
POST /api/v1/workspaces/{id}/journeys/{journeyId}/trigger
Manually triggers a journey evaluation run. Evaluates entry criteria, moves members through tiles, and processes any pending actions.
Response
Returns the created journey run object with status 201 Created.
Example
curl -X POST https://your-instance.signalsmith.io/api/v1/workspaces/{id}/journeys/{journeyId}/trigger \
-H "Authorization: Bearer <token>" \
-H "X-Workspace-ID: <workspace-id>"List Runs
GET /api/v1/workspaces/{id}/journeys/{journeyId}/runs
Returns the evaluation history for a journey (last 50 runs).
Get Run
GET /api/v1/workspaces/{id}/journeys/{journeyId}/runs/{runId}
Returns details of a specific journey run.
Cancel Run
POST /api/v1/workspaces/{id}/journeys/{journeyId}/runs/{runId}/cancel
Cancels a running evaluation.
Response
{
"status": "cancelled"
}Get Stats
GET /api/v1/workspaces/{id}/journeys/{journeyId}/stats
Returns aggregate statistics for a journey, including member counts by tile and status.
Response
{
"tiles": {},
"total": {
"active": 0,
"completed": 0,
"exited": 0
}
}Journey Object
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Unique identifier |
workspace_id | string (UUID) | Owning workspace |
parent_model_id | string (UUID) | Parent entity model |
name | string | Display name |
description | string | Description |
entry_criteria | object | Filter tree for entry conditions |
exit_criteria | object | Filter tree for exit conditions |
tiles | array | Journey step definitions |
edges | array | Connections between tiles |
schedule | string | Cron expression for evaluation |
status | string | draft, active, paused, draining, archived, or error |
status_error | string | Error message when status is error |
created_by | string (UUID) | Account that created the journey |
created_at | string (ISO 8601) | Creation timestamp |
updated_at | string (ISO 8601) | Last update timestamp |
last_run_id | string (UUID) or null | ID of the most recent run |
last_run_at | string (ISO 8601) or null | Time of the most recent run |
Journey Member Statuses
| Status | Description |
|---|---|
active | Member is progressing through the journey |
completed | Member reached an exit tile |
exited | Member was removed by exit criteria |