Get daily stats

GET/v1/campaigns/{campaign_id}/daily-stats
Scope: campaigns:read

Daily activity and outcome counts for a campaign, one row per UTC day. Days with no activity are omitted rather than zero-filled. The rollup is refreshed hourly, so today's row is flagged partial.

from and to bound the window (ISO dates; at most 400 days, from not after to, else 400 INVALID_WINDOW). group_by splits each day by sender or variation; the default none returns one row per day (400 INVALID_GROUP_BY otherwise).

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

  • fromstring or null

    First day (YYYY-MM-DD, or an ISO-8601 datetime whose UTC date is used). Default: 30 days before to

    at most 64 charactersExample "2026-09-01"
  • tostring or null

    Last day, inclusive (YYYY-MM-DD, or an ISO-8601 datetime whose UTC date is used). Default: today, UTC

    at most 64 charactersExample "2026-09-30"
  • group_bystring or null

    'none' (default): one row per day. 'sender': one row per day and sender. 'variation': one row per day and A/B arm

    at most 32 charactersExample "sender"One of"none""sender""variation"

Response

200

  • campaign_idstringRequired
  • windowobjectRequired
    Show 3 child attributes
    • fromstringRequired

      First day covered, YYYY-MM-DD

    • tostringRequired

      Last day covered, YYYY-MM-DD

    • timezonestring

      Days are UTC calendar days

      Default "UTC"
  • countinteger
    Default 0
  • daysarray of objects
    Show 18 child attributes
    • daystring or null

      YYYY-MM-DD, UTC

    • emails_openedinteger or null
    • emails_sentinteger or null
    • leads_first_contactedinteger or null

      Leads whose first touch was that day

    • leads_first_positiveinteger or null

      Leads whose first positive reply came that day

    • leads_first_repliedinteger or null

      Leads whose first reply came that day

    • li_connection_requestsinteger or null

      LinkedIn connection requests sent

    • li_connections_acceptedinteger or null

      LinkedIn connection requests accepted

    • li_messagesinteger or null

      LinkedIn messages sent

    • meetings_bookedinteger or null
    • partialboolean or null

      True for today: the rollup is refreshed hourly, so today's row is still filling in

    • platformstring or null

      Only when group_by=sender: 'email' or 'linkedin'

    • replies_negativeinteger or null
    • replies_neutralinteger or null
    • replies_ooointeger or null

      Out-of-office replies

    • replies_positiveinteger or null
    • sender_keystring or null

      Only when group_by=sender

    • variationstring or null

      Only when group_by=variation: the A/B arm, or null for leads with none

  • group_bystring

    The grouping applied

    Default "none"One of"none""sender""variation"
  • successboolean
    Default true

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.

400INVALID_WINDOW

The daily-stats window is unparseable, has from after to, or spans more than 400 days.

400INVALID_GROUP_BY

group_by must be none, sender or variation.

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.