Get the step funnel
/v1/campaigns/{campaign_id}/step-funnelThe per-step funnel, annotated with the step at each position. Positions follow the sequence's own numbering; a connection check splits later steps into yes/no lanes. Replies are credited to the last message step before them. waiting is current state, not a window count.
date_filter takes a relative window such as 7d or 30d; variation restricts the funnel to a or b.
Headers
AuthorizationstringRequiredBearerfollowed by a space and your API key, for exampleBearer vk_….
Path parameters
campaign_idstring · uuidRequiredID of the campaign.
Query parameters
date_filterstring or nullRelative window ('7d', '30d', '90d') or an ISO-8601 timestamp to count from
at most 64 charactersExample"30d"variationstring or nullA/B arm to report on: 'a', 'b', 'unassigned' or 'all' (default)
at most 32 charactersExample"a"One of"a""b""unassigned""all"
Response
200
campaign_idstringRequiredhidden_main_stepsintegerMain-lane message steps sharing a position with a branch, and so not shown on their own row
Default0notestring or nullHow to read the numbers
stepsarray of objectsShow 14 child attributesHide child attributes
channelstring or null'email' or 'linkedin'
One of"email""linkedin"nulldayinteger or nullThe day of the sequence the step falls on
is_message_stepboolean or nullWhether the step sends something a prospect can reply to
lanestring or null'main', or 'yes' / 'no' for the branch of a connection check
One of"main""yes""no"positioninteger or nullThe orchestrator's step number, counted from 1
positiveinteger or nullPositive replies credited to this step
positive_rate_pctnumber or nullpositive / reached; null when nobody reached it
reachedinteger or nullLeads that reached this step in the window
repliedinteger or nullReplies credited to this step
reply_rate_pctnumber or nullreplied / reached; null when nobody reached it
step_idinteger or number or string or null or nullThe sequence step's id at this position, when it could be matched. An integer on current sequences; older sequences may hold a fractional number or a string.
subjectstring or nullThe email subject; only on email steps
typestring or nullThe step type at this position
waitinginteger or nullLeads currently sitting at this step (current state; ignores the window)
successbooleanDefaulttrueunattributed_outboundintegerSends that could not be matched to a step
Default0unattributed_repliesintegerReplies that could not be matched to a step
Default0variationstringThe A/B arm the report covers
Default"all"window_fromstring or nullStart of the window (ISO-8601); null = all time
Errors
Errors share one JSON body: success, error, message, optional details, and request_id.
| Status | Code | Meaning |
|---|---|---|
| 400 | VALIDATION_ERROR | The request didn't match the endpoint's schema: a missing or malformed field, a bad query parameter, or a value out of range. |
| 401 | UNAUTHORIZED | The |
| 401 | API_KEY_EXPIRED | The API key is past its expiry date. Create a new key in the Victoria AI app. |
| 403 | INSUFFICIENT_SCOPE | The API key doesn't have the scope this endpoint requires, such as |
| 403 | ORGANIZATION_DEACTIVATED | The organization that owns this API key has been deactivated. |
| 404 | CAMPAIGN_NOT_FOUND | No campaign with this ID exists in your organization. |
| 404 | NOT_FOUND | No endpoint matches the path. A resource ID in the path that isn't a valid UUID also answers |
| 429 | RATE_LIMITED | Too many requests for this API key: more than 100 a minute to one endpoint, or 600 a minute in total. Retry after the number of seconds in the |
| 500 | INTERNAL_ERROR | Something failed on our side. The response never includes internal details; quote its |
| 503 | UPSTREAM_TIMEOUT | A service the API depends on timed out. The request is safe to retry. |
| 503 | AUTH_UNAVAILABLE | The API key couldn't be checked because the authentication service was unavailable. The request is safe to retry. |
Response headers
| Header | Description |
|---|---|
X-Request-ID | Correlation ID for the request, also returned as |
RateLimit-Limit | Requests allowed to this endpoint per minute. |
RateLimit-Remaining | Requests you can still send to this endpoint right now. |
RateLimit-Reset | Seconds until the endpoint's full limit is available again. |
Retry-After | On a |