Get the step funnel

GET/v1/campaigns/{campaign_id}/step-funnel
Scope: campaigns:read

The 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

  • AuthorizationstringRequired

    Bearer followed by a space and your API key, for example Bearer vk_….

Path parameters

  • campaign_idstring · uuidRequired

    ID of the campaign.

Query parameters

  • date_filterstring or null

    Relative window ('7d', '30d', '90d') or an ISO-8601 timestamp to count from

    at most 64 charactersExample "30d"
  • variationstring or null

    A/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_idstringRequired
  • hidden_main_stepsinteger

    Main-lane message steps sharing a position with a branch, and so not shown on their own row

    Default 0
  • notestring or null

    How to read the numbers

  • stepsarray of objects
    Show 14 child attributes
    • channelstring or null

      'email' or 'linkedin'

      One of"email""linkedin"null
    • dayinteger or null

      The day of the sequence the step falls on

    • is_message_stepboolean or null

      Whether 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 null

      The orchestrator's step number, counted from 1

    • positiveinteger or null

      Positive replies credited to this step

    • positive_rate_pctnumber or null

      positive / reached; null when nobody reached it

    • reachedinteger or null

      Leads that reached this step in the window

    • repliedinteger or null

      Replies credited to this step

    • reply_rate_pctnumber or null

      replied / reached; null when nobody reached it

    • step_idinteger or number or string or null or null

      The 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 null

      The email subject; only on email steps

    • typestring or null

      The step type at this position

    • waitinginteger or null

      Leads currently sitting at this step (current state; ignores the window)

  • successboolean
    Default true
  • unattributed_outboundinteger

    Sends that could not be matched to a step

    Default 0
  • unattributed_repliesinteger

    Replies that could not be matched to a step

    Default 0
  • variationstring

    The A/B arm the report covers

    Default "all"
  • window_fromstring or null

    Start of the window (ISO-8601); null = all time

Errors

Errors share one JSON body: success, error, message, optional details, and request_id.

StatusCodeMeaning
400VALIDATION_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. details.errors lists each failing field with its field, message and type.

401UNAUTHORIZED

The Authorization header is missing or malformed, or the API key is unknown or has been deactivated.

401API_KEY_EXPIRED

The API key is past its expiry date. Create a new key in the Victoria AI app.

403INSUFFICIENT_SCOPE

The API key doesn't have the scope this endpoint requires, such as leads:write.

403ORGANIZATION_DEACTIVATED

The organization that owns this API key has been deactivated.

404CAMPAIGN_NOT_FOUND

No campaign with this ID exists in your organization.

404NOT_FOUND

No endpoint matches the path. A resource ID in the path that isn't a valid UUID also answers NOT_FOUND.

429RATE_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 Retry-After header. See Rate limits.

500INTERNAL_ERROR

Something failed on our side. The response never includes internal details; quote its request_id when you contact support.

503UPSTREAM_TIMEOUT

A service the API depends on timed out. The request is safe to retry.

503AUTH_UNAVAILABLE

The API key couldn't be checked because the authentication service was unavailable. The request is safe to retry.

Response headers

HeaderDescription
X-Request-ID

Correlation ID for the request, also returned as request_id in error bodies. Send your own X-Request-ID, up to 128 letters, digits, ., _, : or -, and it's used instead.

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 429: seconds to wait before retrying.