Create a wrapper
post/v1/wrappers
Generates Vojo Passport HTML for a creative. inline returns
the HTML in data.html; archive stores it and returns data.url.
The Passport always starts itself. Wrappers created through this API begin reporting as soon as the creative is shown and never wait for a signal from the player, so verification stays independent of the player. There is no option to change this.
Two outcomes — handle both. 201 means the wrapper is ready in the
response (e.g. this content was wrapped before). 202 means wrapping
continues in the background: the body carries the wrapper id with
status: processing; poll GET /v1/wrappers/{wrapper_id} (honour
Retry-After) or subscribe to the wrapper.ready / wrapper.failed
webhooks. Early implementations may always return 201; do not rely on it.
Requesting fingerprint: true additionally needs advertisementFingerprinting.
Wrapper delivery is a separate process and not part of this contract.
Access
- Authentication
- Secret key or OAuth access token.
- Scope
wrappers:write- User permission
advertisementAddNew- Sending
fingerprint - Also needs
advertisementFingerprinting - Safe to retry
- Send an Idempotency-Key.
Headers
Vojo-OrganisationstringThe organisation this request acts on (org id). Required for
oauth2callers — a missing header returns 400organisation_header_required; an org the user cannot access (a membership or an access grant, and granted to this OAuth client) returns 403organisation_access_denied. Secret keys are bound to one org: the header may be omitted, and if sent it must match the key's org (else 403). Every query is scoped by the resolved org, never by an id in the body.Vojo-VersionstringOptional API version pin (a date). Overrides the version pinned on the secret key / organisation for this request. Echoed in the
Vojo-Versionresponse header. Within/v1only additive changes ship, so most callers can omit it.Idempotency-KeystringClient-generated unique key (UUID v4 recommended) making this create safe to retry. A replay within 24 hours returns the stored response (with
Idempotent-Replayed: true). Reusing a key with a different body returns 409idempotency_key_reused.
Request body
screen_idstringadvertisement_idstringscreen_size_range_idstringexternal_idstringPartner's own creative reference (e.g. an exchange creative id).
sourcestringPartner / exchange namespace for
external_id.content_sourcestringURL of the creative to wrap.
content_typestringCreative media type.
fingerprintbooleanBurn in a fingerprint. Requires the
advertisementFingerprintingpermission.positionstringSensor patch position.
sensor_stylestringFingerprint sensor patch style.
square_rationumberdurationnumberCreative duration in seconds.
display_event_idstringdelivery_modestringinlinereturns the wrapper HTML in the response;archivestores it and returns a URL.metadataobject or nullOpaque partner passthrough; stored and echoed, never interpreted or scored.
Response 201
Created
dataobjectRequiredA Vojo Passport wrapper. Wrapping can finish inside the create request (
status: ready) or continue in the background (status: processing); integrators must handle both.Show 10 fields
idstringRequiredWrapper id. Opaque string — treat as an identifier, never parse it.
statusstringRequiredprocessing: the wrap is still being built —url,htmland the fingerprint fields are null until it isready. PollGET /v1/wrappers/{wrapper_id}or subscribe to thewrapper.ready/wrapper.failedwebhooks. Clients must tolerate new values.failureobject or nullRequiredWhy the wrap failed; null unless
statusisfailed.Show 2 fields
codestringRequiredStable error code from the API error registry (e.g.
creative_fetch_failed).detailstringRequired
delivery_modestringRequiredinlinereturns the wrapper HTML in the response;archivestores it and returns a URL.urlstring or nullRequiredArchived wrapper URL (
archivemode); null forinline.htmlstring or nullRequiredWrapper HTML (
inlinemode); null forarchive.fingerprint_idstring or nullRequiredfingerprintstring or nullRequiredFingerprint code burned into the wrapper, when requested.
metadataobject or nullRequiredcreated_atstringRequiredRFC 3339 / ISO-8601 UTC timestamp.
metaobjectRequiredResponse metadata for single-resource responses. Reserved; currently empty. Clients must ignore unknown members.
Response headers
Vojo-VersionstringThe API version (date) this response was rendered with — the request's
Vojo-Version, else the key/org pin.RateLimitstringIETF RateLimit header: remaining quota in the current window, e.g.
"default";r=97;t=42.RateLimit-PolicystringIETF RateLimit-Policy header, e.g.
"default";q=100;w=60. Portal OAuth clients get a higher tier.Idempotent-Replayedstringtruewhen this response is a stored replay of an earlier request with the sameIdempotency-Key.
Response 202
Accepted — wrapping continues in the background.
dataobjectRequiredA Vojo Passport wrapper. Wrapping can finish inside the create request (
status: ready) or continue in the background (status: processing); integrators must handle both.Show 10 fields
idstringRequiredWrapper id. Opaque string — treat as an identifier, never parse it.
statusstringRequiredprocessing: the wrap is still being built —url,htmland the fingerprint fields are null until it isready. PollGET /v1/wrappers/{wrapper_id}or subscribe to thewrapper.ready/wrapper.failedwebhooks. Clients must tolerate new values.failureobject or nullRequiredWhy the wrap failed; null unless
statusisfailed.Show 2 fields
codestringRequiredStable error code from the API error registry (e.g.
creative_fetch_failed).detailstringRequired
delivery_modestringRequiredinlinereturns the wrapper HTML in the response;archivestores it and returns a URL.urlstring or nullRequiredArchived wrapper URL (
archivemode); null forinline.htmlstring or nullRequiredWrapper HTML (
inlinemode); null forarchive.fingerprint_idstring or nullRequiredfingerprintstring or nullRequiredFingerprint code burned into the wrapper, when requested.
metadataobject or nullRequiredcreated_atstringRequiredRFC 3339 / ISO-8601 UTC timestamp.
metaobjectRequiredResponse metadata for single-resource responses. Reserved; currently empty. Clients must ignore unknown members.
Response headers
LocationstringURL of the wrapper resource to poll.
Retry-AfterstringSuggested seconds before the first poll.
Vojo-VersionstringThe API version (date) this response was rendered with — the request's
Vojo-Version, else the key/org pin.RateLimitstringIETF RateLimit header: remaining quota in the current window, e.g.
"default";r=97;t=42.RateLimit-PolicystringIETF RateLimit-Policy header, e.g.
"default";q=100;w=60. Portal OAuth clients get a higher tier.Idempotent-Replayedstringtruewhen this response is a stored replay of an earlier request with the sameIdempotency-Key.
Errors
Every error is application/problem+json. Branch on its code.
- 400
Malformed request: invalid JSON, a bad cursor, a missing
Vojo-Organisationfor an OAuth caller, or an unknownVojo-Version. - 401
Missing, invalid, expired or revoked credential.
- 403
The caller is authenticated but not allowed: missing scope (
insufficient_scope), missing Permissions flag (permission_denied), a client/installer persona on an operator endpoint (operator_access_required), or no access to the requested org (organisation_access_denied). - 404
The resource does not exist, or belongs to another organisation. Cross-org ids always 404, never 403.
- 422
Well-formed request that failed validation.
errors[]lists each failing field. - 429
Rate limit exceeded for this principal. Back off for
Retry-Afterseconds. - 500
Unexpected server failure.