Get daily stats
/v1/campaigns/{campaign_id}/daily-statsDaily 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
AuthorizationstringRequiredBearerfollowed by a space and your API key, for exampleBearer vk_….
Path parameters
campaign_idstring · uuidRequiredID of the campaign.
Query parameters
fromstring or nullFirst day (YYYY-MM-DD, or an ISO-8601 datetime whose UTC date is used). Default: 30 days before
toat most 64 charactersExample"2026-09-01"tostring or nullLast 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_idstringRequiredwindowobjectRequiredShow 3 child attributesHide child attributes
fromstringRequiredFirst day covered, YYYY-MM-DD
tostringRequiredLast day covered, YYYY-MM-DD
timezonestringDays are UTC calendar days
Default"UTC"
countintegerDefault0daysarray of objectsShow 18 child attributesHide child attributes
daystring or nullYYYY-MM-DD, UTC
emails_openedinteger or nullemails_sentinteger or nullleads_first_contactedinteger or nullLeads whose first touch was that day
leads_first_positiveinteger or nullLeads whose first positive reply came that day
leads_first_repliedinteger or nullLeads whose first reply came that day
li_connection_requestsinteger or nullLinkedIn connection requests sent
li_connections_acceptedinteger or nullLinkedIn connection requests accepted
li_messagesinteger or nullLinkedIn messages sent
meetings_bookedinteger or nullpartialboolean or nullTrue for today: the rollup is refreshed hourly, so today's row is still filling in
platformstring or nullOnly when group_by=sender: 'email' or 'linkedin'
replies_negativeinteger or nullreplies_neutralinteger or nullreplies_ooointeger or nullOut-of-office replies
replies_positiveinteger or nullsender_keystring or nullOnly when group_by=sender
variationstring or nullOnly when group_by=variation: the A/B arm, or null for leads with none
group_bystringThe grouping applied
Default"none"One of"none""sender""variation"successbooleanDefaulttrue
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. |
| 400 | INVALID_WINDOW | The daily-stats window is unparseable, has from after to, or spans more than 400 days. |
| 400 | INVALID_GROUP_BY | group_by must be none, sender or variation. |
| 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 |