Get personalization quality
/v1/campaigns/{campaign_id}/personalization-qualityOne row per AI personalization field with its runs over the window by outcome (success, fallback, generic, held, error). held_rate_pct over 30 means the field is mostly not producing usable copy; insufficient_data_rate_pct over 60 means the data to write it is usually missing, and the field's prompt or the lead data needs attention.
days sets the window (default 14).
Headers
AuthorizationstringRequiredBearerfollowed by a space and your API key, for exampleBearer vk_….
Path parameters
campaign_idstring · uuidRequiredID of the campaign.
Query parameters
daysintegerHow many days back to count, from now
≥ 1≤ 365Default14
Response
200
campaign_idstringRequireddaysintegerRequiredsincestringRequiredStart of the window (ISO-8601)
fieldsarray of objectsShow 10 child attributesHide child attributes
errorinteger or nullRuns that failed
fallbackinteger or nullRuns that used the field's fallback text
field_namestring or nullgenericinteger or nullRuns whose output was judged generic
heldinteger or nullRuns held back rather than sent
held_rate_pctnumber or null(held + generic + error) / runs: the share of sends with no usable copy; null when there were no runs
insufficient_datainteger or nullRuns where the model reported too little to work with
insufficient_data_rate_pctnumber or nullinsufficient_data / runs; null when there were no runs
runsinteger or nullLive sends where the field was resolved
successinteger or nullRuns that produced personalised copy
successbooleanDefaulttruetotal_runsintegerDefault0
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 |