{"openapi":"3.1.0","info":{"title":"VCTR API","version":"1.0.0","description":"The VCTR REST API: Links, QR Codes and their analytics in one Workspace.\n\nAuthenticate with a Workspace API key, which an Admin creates in the app: `Authorization: Bearer vctr_sk_…`. A key acts on its one Workspace only, with the role chosen when it was created: `editor` (manage Links and QR Codes, read analytics) or `viewer` (read only).\n\nPartners authenticate with a Partner key, `vctr_pk_…`, which VCTR issues. It creates the Partner's Workspaces by the Partner's own reference (`PUT /partner/workspaces/{externalRef}`) and acts on any of them as an `editor`, named in the header `Vctr-Workspace: ext:<externalRef>`. Their Links are created on the Partner's Default Domain. Links and QR Codes carry Partner metadata, opaque key/value pairs that Link lists and stats filter on (`metadata[container]=c-1`).\n\nErrors answer `{ \"error\": { \"code\", \"message\" } }` with a stable `code`. Requests are rate-limited per key (lower on the Free Plan) and per IP; a limited request gets 429 `rate_limited` with `Retry-After`."},"servers":[{"url":"https://vctr.io/api/v1"}],"security":[{"apiKey":[]}],"paths":{"/workspace":{"get":{"operationId":"getWorkspace","summary":"The Workspace this key acts on","tags":["Workspace"],"parameters":[{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The Workspace and the role the key acts with.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Workspace"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/links":{"post":{"operationId":"createLink","summary":"Create a Link","description":"Creates a Link to the Destination with a generated 7-character Code, or with the custom `code` given. A Code is never reused: a Retired code answers `code_retired`. Rules, `password` and `expiresAt` need a paid Plan (`plan_limit` otherwise). After a downgrade they keep working and can be removed, not changed.","tags":["Links"],"parameters":[{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"destination":{"type":"string","description":"A full http(s) URL.","example":"https://example.com/spring-menu"},"utm":{"$ref":"#/components/schemas/Utm"},"rules":{"maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/RuleInput"},"description":"The Rules in order, at most 20; the first that matches a Hit decides where it goes."},"password":{"description":"Asked for before the redirect; null removes it. Only a hash is kept. Paid Plans.","anyOf":[{"type":"string","minLength":4,"maxLength":200,"description":"4 to 200 characters. Only a hash is kept; it can never be read back."},{"type":"null"}]},"expiresAt":{"description":"When the Link stops redirecting (404 expired page); null removes it. Paid Plans.","anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the Link stops redirecting and shows an expired page (404) instead, ISO 8601.","example":"2026-12-31T23:00:00Z"},{"type":"null"}]},"code":{"description":"A custom Code: 3 to 64 letters, digits, hyphens or underscores, case-insensitive. Generated when absent.","example":"spring-menu","type":"string","minLength":1},"domain":{"description":"The hostname of the Link: one of the Workspace's active custom Domains. The Default Domain when absent.","example":"go.example.com","type":"string","maxLength":300},"metadata":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9_.-]{1,64}$"},"additionalProperties":{"type":"string","maxLength":256},"description":"Partner metadata: up to 20 opaque key/value pairs to filter Links and stats on, e.g. `{ \"container\": \"c-1\" }`. Keys are 1 to 64 letters, digits, `_`, `.` or `-`; values at most 256 characters.","example":{"container":"c-1"}}},"required":["destination"]}}}},"responses":{"201":{"description":"The new Link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Link"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Error `plan_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `workspace_disabled` or `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error `code_taken` or `code_retired`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error `payload_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error `unsupported_media_type`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error `invalid_destination` or `invalid_code` or `invalid_domain`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"listLinks","summary":"List Links","description":"The Workspace's Links, newest first, a page at a time: pass `nextCursor` as `cursor` for the next page. Deleted Links are left out.","tags":["Links"],"parameters":[{"in":"query","name":"search","schema":{"description":"Only Links whose Code or Destination contains this, ignoring case.","type":"string","maxLength":200},"description":"Only Links whose Code or Destination contains this, ignoring case."},{"in":"query","name":"kind","schema":{"description":"Only plain Links, or only the Links of QR Codes.","type":"string","enum":["plain","qr"]},"description":"Only plain Links, or only the Links of QR Codes."},{"in":"query","name":"metadata","schema":{"description":"Only those with all of these Partner metadata pairs: `metadata[container]=c-1`.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"style":"deepObject","explode":true,"description":"Only those with all of these Partner metadata pairs: `metadata[container]=c-1`."},{"in":"query","name":"cursor","schema":{"description":"`nextCursor` from the previous page.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"`nextCursor` from the previous page."},{"in":"query","name":"limit","schema":{"default":50,"description":"Links per page, 1 to 100.","type":"integer","minimum":1,"maximum":100},"description":"Links per page, 1 to 100."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"A page of Links.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"nextCursor":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"The `cursor` of the next page; null on the last page."}},"required":["data","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/links/{id}":{"get":{"operationId":"getLink","summary":"Get a Link","tags":["Links"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The Link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Link"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateLink","summary":"Change a Link","description":"Changes what is sent and leaves the rest. A new Destination (or new `utm` parameters on it) takes effect at once and is added to the Destination history. `metadata` replaces all of its Partner metadata (`{}` clears it). Rules, `password` and `expiresAt` need a paid Plan (`plan_limit` otherwise). After a downgrade they keep working and can be removed, not changed.","tags":["Links"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"destination":{"type":"string","description":"A full http(s) URL.","example":"https://example.com/spring-menu"},"utm":{"$ref":"#/components/schemas/Utm"},"metadata":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9_.-]{1,64}$"},"additionalProperties":{"type":"string","maxLength":256},"description":"Partner metadata: up to 20 opaque key/value pairs to filter Links and stats on, e.g. `{ \"container\": \"c-1\" }`. Keys are 1 to 64 letters, digits, `_`, `.` or `-`; values at most 256 characters.","example":{"container":"c-1"}},"rules":{"maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/RuleInput"},"description":"The Rules in order, at most 20; the first that matches a Hit decides where it goes."},"password":{"description":"Asked for before the redirect; null removes it. Only a hash is kept. Paid Plans.","anyOf":[{"type":"string","minLength":4,"maxLength":200,"description":"4 to 200 characters. Only a hash is kept; it can never be read back."},{"type":"null"}]},"expiresAt":{"description":"When the Link stops redirecting (404 expired page); null removes it. Paid Plans.","anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"When the Link stops redirecting and shows an expired page (404) instead, ISO 8601.","example":"2026-12-31T23:00:00Z"},{"type":"null"}]}}}}}},"responses":{"200":{"description":"The changed Link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Link"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Error `plan_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `workspace_disabled` or `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error `payload_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error `unsupported_media_type`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error `invalid_destination`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteLink","summary":"Delete a Link","description":"Deletes the Link for good. Its Code is Retired: it answers 410 Gone from then on and can never be used again.","tags":["Links"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"204":{"description":"Deleted."},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `workspace_disabled` or `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/links/{id}/history":{"get":{"operationId":"getLinkHistory","summary":"A Link's Destination history","description":"Every Destination the Link has had and when each took effect, newest first.","tags":["Links"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The Destination history.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DestinationChange"}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/qr-codes":{"post":{"operationId":"createQrCode","summary":"Create a QR Code","description":"Creates a QR Code and the Link it owns, which sends Scans to the Destination. Missing design options take the defaults.","tags":["QR Codes"],"parameters":[{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"destination":{"type":"string","description":"A full http(s) URL.","example":"https://example.com/spring-menu"},"design":{"default":{},"description":"The design; every option is optional.","type":"object","properties":{"dots":{"type":"string","enum":["square","rounded","dots","classy"]},"eyeFrame":{"type":"string","enum":["square","rounded","circle"]},"eyePupil":{"type":"string","enum":["square","rounded","dot"]},"foreground":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"object","properties":{"from":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"to":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"angle":{"type":"number"}},"required":["from","to","angle"],"additionalProperties":false}]},"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"errorCorrection":{"type":"string","enum":["L","M","Q","H"]},"logo":{"type":"object","properties":{"href":{"type":"string","maxLength":700000},"size":{"type":"number"}},"required":["href","size"],"additionalProperties":false},"frame":{"type":"object","properties":{"text":{"type":"string","maxLength":60},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"required":["text","color","textColor"],"additionalProperties":false}},"additionalProperties":false},"domain":{"description":"The hostname of the Link: one of the Workspace's active custom Domains. The Default Domain when absent.","example":"go.example.com","type":"string","maxLength":300},"metadata":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9_.-]{1,64}$"},"additionalProperties":{"type":"string","maxLength":256},"description":"Partner metadata: up to 20 opaque key/value pairs to filter Links and stats on, e.g. `{ \"container\": \"c-1\" }`. Keys are 1 to 64 letters, digits, `_`, `.` or `-`; values at most 256 characters.","example":{"container":"c-1"}}},"required":["name","destination"]}}}},"responses":{"201":{"description":"The new QR Code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QrCode"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Error `plan_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `workspace_disabled` or `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error `payload_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error `unsupported_media_type`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error `invalid_destination` or `invalid_design` or `content_too_large` or `invalid_domain`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"listQrCodes","summary":"List QR Codes","description":"The Workspace's QR Codes, Offline ones included, newest first, a page at a time: pass `nextCursor` as `cursor` for the next page.","tags":["QR Codes"],"parameters":[{"in":"query","name":"cursor","schema":{"description":"`nextCursor` from the previous page.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"`nextCursor` from the previous page."},{"in":"query","name":"limit","schema":{"default":50,"description":"QR Codes per page, 1 to 100.","type":"integer","minimum":1,"maximum":100},"description":"QR Codes per page, 1 to 100."},{"in":"query","name":"metadata","schema":{"description":"Only those with all of these Partner metadata pairs: `metadata[container]=c-1`.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"style":"deepObject","explode":true,"description":"Only those with all of these Partner metadata pairs: `metadata[container]=c-1`."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"A page of QR Codes.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/QrCode"}},"nextCursor":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"The `cursor` of the next page; null on the last page."}},"required":["data","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/qr-codes/{id}":{"get":{"operationId":"getQrCode","summary":"Get a QR Code","tags":["QR Codes"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The QR Code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QrCode"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateQrCode","summary":"Change a QR Code's Partner metadata","description":"Replaces all of the QR Code's Partner metadata (`{}` clears it); they are its Link's. Change where it points with PATCH /links/{linkId}.","tags":["QR Codes"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"metadata":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9_.-]{1,64}$"},"additionalProperties":{"type":"string","maxLength":256},"description":"Partner metadata: up to 20 opaque key/value pairs to filter Links and stats on, e.g. `{ \"container\": \"c-1\" }`. Keys are 1 to 64 letters, digits, `_`, `.` or `-`; values at most 256 characters.","example":{"container":"c-1"}}},"required":["metadata"]}}}},"responses":{"200":{"description":"The changed QR Code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QrCode"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `workspace_disabled` or `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error `payload_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error `unsupported_media_type`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/qr-codes/{id}/export.svg":{"get":{"operationId":"exportQrCodeSVG","summary":"Export a QR Code as SVG","description":"A vector file, identical to the preview in the app. Style options override the stored design for this file only.","tags":["QR Codes"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"query","name":"dots","schema":{"type":"string","enum":["square","rounded","dots","classy"]}},{"in":"query","name":"eyeFrame","schema":{"type":"string","enum":["square","rounded","circle"]}},{"in":"query","name":"eyePupil","schema":{"type":"string","enum":["square","rounded","dot"]}},{"in":"query","name":"foreground","schema":{"description":"Foreground color; on a gradient, where it starts.","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Foreground color; on a gradient, where it starts."},{"in":"query","name":"foregroundTo","schema":{"description":"Makes the foreground a linear gradient ending in this color (or changes where it ends).","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Makes the foreground a linear gradient ending in this color (or changes where it ends)."},{"in":"query","name":"gradientAngle","schema":{"description":"Gradient angle in degrees: 0 runs left to right (the default), 90 top to bottom. Applies to a gradient only.","type":"number"},"description":"Gradient angle in degrees: 0 runs left to right (the default), 90 top to bottom. Applies to a gradient only."},{"in":"query","name":"background","schema":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"}},{"in":"query","name":"errorCorrection","schema":{"type":"string","enum":["L","M","Q","H"]}},{"in":"query","name":"frameText","schema":{"description":"Adds a frame with this call to action, or changes its text. Empty removes the frame.","type":"string","maxLength":60},"description":"Adds a frame with this call to action, or changes its text. Empty removes the frame."},{"in":"query","name":"frameColor","schema":{"description":"Frame color, when there is a frame.","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Frame color, when there is a frame."},{"in":"query","name":"frameTextColor","schema":{"description":"Call-to-action color, when there is a frame.","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Call-to-action color, when there is a frame."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The SVG file.","content":{"image/svg+xml":{"schema":{"type":"string","contentMediaType":"image/svg+xml","description":"The QR Code as SVG."}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error `content_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/qr-codes/{id}/export.png":{"get":{"operationId":"exportQrCodePNG","summary":"Export a QR Code as PNG","description":"A raster image. Style options override the stored design for this file only.","tags":["QR Codes"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"query","name":"dots","schema":{"type":"string","enum":["square","rounded","dots","classy"]}},{"in":"query","name":"eyeFrame","schema":{"type":"string","enum":["square","rounded","circle"]}},{"in":"query","name":"eyePupil","schema":{"type":"string","enum":["square","rounded","dot"]}},{"in":"query","name":"foreground","schema":{"description":"Foreground color; on a gradient, where it starts.","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Foreground color; on a gradient, where it starts."},{"in":"query","name":"foregroundTo","schema":{"description":"Makes the foreground a linear gradient ending in this color (or changes where it ends).","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Makes the foreground a linear gradient ending in this color (or changes where it ends)."},{"in":"query","name":"gradientAngle","schema":{"description":"Gradient angle in degrees: 0 runs left to right (the default), 90 top to bottom. Applies to a gradient only.","type":"number"},"description":"Gradient angle in degrees: 0 runs left to right (the default), 90 top to bottom. Applies to a gradient only."},{"in":"query","name":"background","schema":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"}},{"in":"query","name":"errorCorrection","schema":{"type":"string","enum":["L","M","Q","H"]}},{"in":"query","name":"frameText","schema":{"description":"Adds a frame with this call to action, or changes its text. Empty removes the frame.","type":"string","maxLength":60},"description":"Adds a frame with this call to action, or changes its text. Empty removes the frame."},{"in":"query","name":"frameColor","schema":{"description":"Frame color, when there is a frame.","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Frame color, when there is a frame."},{"in":"query","name":"frameTextColor","schema":{"description":"Call-to-action color, when there is a frame.","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Call-to-action color, when there is a frame."},{"in":"query","name":"width","schema":{"description":"Width in pixels, 16 to 4096; 1024 by default.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"description":"Width in pixels, 16 to 4096; 1024 by default."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The PNG file.","content":{"image/png":{"schema":{"type":"string","contentMediaType":"image/png","description":"The QR Code as PNG."}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error `content_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/qr-codes/{id}/export.pdf":{"get":{"operationId":"exportQrCodePDF","summary":"Export a QR Code as PDF","description":"A one-page PDF for print, the code rasterized at 600 dpi. Style options override the stored design for this file only.","tags":["QR Codes"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"query","name":"dots","schema":{"type":"string","enum":["square","rounded","dots","classy"]}},{"in":"query","name":"eyeFrame","schema":{"type":"string","enum":["square","rounded","circle"]}},{"in":"query","name":"eyePupil","schema":{"type":"string","enum":["square","rounded","dot"]}},{"in":"query","name":"foreground","schema":{"description":"Foreground color; on a gradient, where it starts.","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Foreground color; on a gradient, where it starts."},{"in":"query","name":"foregroundTo","schema":{"description":"Makes the foreground a linear gradient ending in this color (or changes where it ends).","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Makes the foreground a linear gradient ending in this color (or changes where it ends)."},{"in":"query","name":"gradientAngle","schema":{"description":"Gradient angle in degrees: 0 runs left to right (the default), 90 top to bottom. Applies to a gradient only.","type":"number"},"description":"Gradient angle in degrees: 0 runs left to right (the default), 90 top to bottom. Applies to a gradient only."},{"in":"query","name":"background","schema":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"}},{"in":"query","name":"errorCorrection","schema":{"type":"string","enum":["L","M","Q","H"]}},{"in":"query","name":"frameText","schema":{"description":"Adds a frame with this call to action, or changes its text. Empty removes the frame.","type":"string","maxLength":60},"description":"Adds a frame with this call to action, or changes its text. Empty removes the frame."},{"in":"query","name":"frameColor","schema":{"description":"Frame color, when there is a frame.","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Frame color, when there is a frame."},{"in":"query","name":"frameTextColor","schema":{"description":"Call-to-action color, when there is a frame.","type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"description":"Call-to-action color, when there is a frame."},{"in":"query","name":"widthMm","schema":{"description":"Printed width in millimetres, 10 to 170; 50 by default.","type":"number"},"description":"Printed width in millimetres, 10 to 170; 50 by default."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The PDF file.","content":{"application/pdf":{"schema":{"type":"string","contentMediaType":"application/pdf","description":"The QR Code as PDF."}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error `content_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/stats/timeseries":{"get":{"operationId":"getWorkspaceTimeseries","summary":"Hits over time for the Workspace","description":"Hits and Daily unique visitors per hour or UTC day.","tags":["Stats"],"parameters":[{"in":"query","name":"from","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Start of the range (inclusive), ISO 8601.","example":"2026-10-01T00:00:00Z"},"required":true,"description":"Start of the range (inclusive), ISO 8601."},{"in":"query","name":"to","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"End of the range (exclusive), ISO 8601.","example":"2026-11-01T00:00:00Z"},"required":true,"description":"End of the range (exclusive), ISO 8601."},{"in":"query","name":"includeBots","schema":{"description":"Count Bot hits too; they are left out by default.","type":"boolean","default":false},"description":"Count Bot hits too; they are left out by default."},{"in":"query","name":"interval","schema":{"type":"string","enum":["hour","day"],"description":"Bucket size: hours, or UTC days."},"required":true,"description":"Bucket size: hours, or UTC days."},{"in":"query","name":"metadata","schema":{"description":"Only those with all of these Partner metadata pairs: `metadata[container]=c-1`.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"style":"deepObject","explode":true,"description":"Only those with all of these Partner metadata pairs: `metadata[container]=c-1`."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The time series.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timeseries"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/stats/breakdown":{"get":{"operationId":"getWorkspaceBreakdown","summary":"Hits by country, device, referrer… for the Workspace","description":"The most common values of one dimension, by Hits.","tags":["Stats"],"parameters":[{"in":"query","name":"from","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Start of the range (inclusive), ISO 8601.","example":"2026-10-01T00:00:00Z"},"required":true,"description":"Start of the range (inclusive), ISO 8601."},{"in":"query","name":"to","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"End of the range (exclusive), ISO 8601.","example":"2026-11-01T00:00:00Z"},"required":true,"description":"End of the range (exclusive), ISO 8601."},{"in":"query","name":"includeBots","schema":{"description":"Count Bot hits too; they are left out by default.","type":"boolean","default":false},"description":"Count Bot hits too; they are left out by default."},{"in":"query","name":"dimension","schema":{"type":"string","enum":["country","region","city","device_type","os","browser","language","referrer_host","channel","rule","variant"],"description":"What to group Hits by."},"required":true,"description":"What to group Hits by."},{"in":"query","name":"limit","schema":{"default":10,"description":"The most common values to return, 1 to 100.","type":"integer","minimum":1,"maximum":100},"description":"The most common values to return, 1 to 100."},{"in":"query","name":"metadata","schema":{"description":"Only those with all of these Partner metadata pairs: `metadata[container]=c-1`.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"style":"deepObject","explode":true,"description":"Only those with all of these Partner metadata pairs: `metadata[container]=c-1`."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The breakdown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Breakdown"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/links/{id}/stats/timeseries":{"get":{"operationId":"getLinkTimeseries","summary":"Hits over time for a Link","description":"Hits and Daily unique visitors per hour or UTC day.","tags":["Stats"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"query","name":"from","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Start of the range (inclusive), ISO 8601.","example":"2026-10-01T00:00:00Z"},"required":true,"description":"Start of the range (inclusive), ISO 8601."},{"in":"query","name":"to","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"End of the range (exclusive), ISO 8601.","example":"2026-11-01T00:00:00Z"},"required":true,"description":"End of the range (exclusive), ISO 8601."},{"in":"query","name":"includeBots","schema":{"description":"Count Bot hits too; they are left out by default.","type":"boolean","default":false},"description":"Count Bot hits too; they are left out by default."},{"in":"query","name":"interval","schema":{"type":"string","enum":["hour","day"],"description":"Bucket size: hours, or UTC days."},"required":true,"description":"Bucket size: hours, or UTC days."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The time series.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timeseries"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/links/{id}/stats/breakdown":{"get":{"operationId":"getLinkBreakdown","summary":"Hits by country, device, referrer… for a Link","description":"The most common values of one dimension, by Hits.","tags":["Stats"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"query","name":"from","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Start of the range (inclusive), ISO 8601.","example":"2026-10-01T00:00:00Z"},"required":true,"description":"Start of the range (inclusive), ISO 8601."},{"in":"query","name":"to","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"End of the range (exclusive), ISO 8601.","example":"2026-11-01T00:00:00Z"},"required":true,"description":"End of the range (exclusive), ISO 8601."},{"in":"query","name":"includeBots","schema":{"description":"Count Bot hits too; they are left out by default.","type":"boolean","default":false},"description":"Count Bot hits too; they are left out by default."},{"in":"query","name":"dimension","schema":{"type":"string","enum":["country","region","city","device_type","os","browser","language","referrer_host","channel","rule","variant"],"description":"What to group Hits by."},"required":true,"description":"What to group Hits by."},{"in":"query","name":"limit","schema":{"default":10,"description":"The most common values to return, 1 to 100.","type":"integer","minimum":1,"maximum":100},"description":"The most common values to return, 1 to 100."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The breakdown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Breakdown"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/qr-codes/{id}/stats/timeseries":{"get":{"operationId":"getQrCodeTimeseries","summary":"Hits over time for a QR Code (its Scans)","description":"Hits and Daily unique visitors per hour or UTC day.","tags":["Stats"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"query","name":"from","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Start of the range (inclusive), ISO 8601.","example":"2026-10-01T00:00:00Z"},"required":true,"description":"Start of the range (inclusive), ISO 8601."},{"in":"query","name":"to","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"End of the range (exclusive), ISO 8601.","example":"2026-11-01T00:00:00Z"},"required":true,"description":"End of the range (exclusive), ISO 8601."},{"in":"query","name":"includeBots","schema":{"description":"Count Bot hits too; they are left out by default.","type":"boolean","default":false},"description":"Count Bot hits too; they are left out by default."},{"in":"query","name":"interval","schema":{"type":"string","enum":["hour","day"],"description":"Bucket size: hours, or UTC days."},"required":true,"description":"Bucket size: hours, or UTC days."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The time series.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timeseries"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/qr-codes/{id}/stats/breakdown":{"get":{"operationId":"getQrCodeBreakdown","summary":"Hits by country, device, referrer… for a QR Code (its Scans)","description":"The most common values of one dimension, by Hits.","tags":["Stats"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"query","name":"from","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Start of the range (inclusive), ISO 8601.","example":"2026-10-01T00:00:00Z"},"required":true,"description":"Start of the range (inclusive), ISO 8601."},{"in":"query","name":"to","schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"End of the range (exclusive), ISO 8601.","example":"2026-11-01T00:00:00Z"},"required":true,"description":"End of the range (exclusive), ISO 8601."},{"in":"query","name":"includeBots","schema":{"description":"Count Bot hits too; they are left out by default.","type":"boolean","default":false},"description":"Count Bot hits too; they are left out by default."},{"in":"query","name":"dimension","schema":{"type":"string","enum":["country","region","city","device_type","os","browser","language","referrer_host","channel","rule","variant"],"description":"What to group Hits by."},"required":true,"description":"What to group Hits by."},{"in":"query","name":"limit","schema":{"default":10,"description":"The most common values to return, 1 to 100.","type":"integer","minimum":1,"maximum":100},"description":"The most common values to return, 1 to 100."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The breakdown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Breakdown"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/domains":{"get":{"operationId":"listDomains","summary":"List custom Domains","tags":["Domains"],"parameters":[{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The Workspace's custom Domains, oldest first.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Domain"}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"addDomain","summary":"Add a custom Domain","description":"Adds a hostname such as `go.example.com`. Create the `dnsRecords` it answers with at the DNS provider: VCTR checks them every minute, then requests a certificate and starts serving Links on it (`status` becomes `active`). Needs an editor key: keys act for the Admin who created them.","tags":["Domains"],"parameters":[{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hostname":{"type":"string","maxLength":300,"example":"go.example.com"}},"required":["hostname"]}}}},"responses":{"201":{"description":"The new Domain, pending until its DNS records are found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Error `plan_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Error `domain_taken`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error `payload_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error `unsupported_media_type`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error `invalid_hostname`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/domains/{id}":{"get":{"operationId":"getDomain","summary":"Get a custom Domain","description":"The Domain with its verification and certificate status.","tags":["Domains"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"200":{"description":"The Domain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateDomain","summary":"Set a custom Domain's fallback Destination","tags":["Domains"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fallbackDestination":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"A full http(s) URL on another hostname, or null for a 404."}},"required":["fallbackDestination"]}}}},"responses":{"200":{"description":"The changed Domain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error `payload_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error `unsupported_media_type`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error `invalid_destination`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"removeDomain","summary":"Remove a custom Domain","description":"Removes the Domain and deletes every Link on it. Their Codes are Retired on the hostname for good: they answer 410 Gone and can never be used again, even if the hostname is added again by any Workspace. `confirm` must repeat the hostname.","tags":["Domains"],"parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"The id."},"required":true,"description":"The id."},{"in":"query","name":"confirm","schema":{"type":"string","maxLength":300,"description":"The hostname of the Domain, to confirm.","example":"go.example.com"},"required":true,"description":"The hostname of the Domain, to confirm."},{"in":"header","name":"Vctr-Workspace","schema":{"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it.","example":"ext:acct-1001","type":"string"},"description":"Partner keys only: the Workspace to act on, `ext:<externalRef>` or its id. Workspace API keys ignore it."}],"responses":{"204":{"description":"Removed."},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Error `confirmation_mismatch`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/partner/workspaces/{externalRef}":{"put":{"operationId":"upsertPartnerWorkspace","summary":"Create or find a Partner Workspace","description":"Creates the Partner's Workspace with this reference, or answers the one that exists: repeating the call is safe and always answers the same Workspace. A `name` renames it. Act on it afterwards with the header `Vctr-Workspace: ext:<externalRef>`.","tags":["Partner"],"parameters":[{"in":"path","name":"externalRef","schema":{"type":"string","pattern":"^[A-Za-z0-9._~-]{1,128}$","description":"The Partner's own reference (Crobox: the Crobox Account): 1 to 128 letters, digits and `.`, `_`, `~`, `-`.","example":"acct-1001"},"required":true,"description":"The Partner's own reference (Crobox: the Crobox Account): 1 to 128 letters, digits and `.`, `_`, `~`, `-`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"description":"The Workspace name; the reference when it is created without one.","type":"string","minLength":1,"maxLength":100}}}}}},"responses":{"200":{"description":"The Partner Workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerWorkspace"}}}},"400":{"description":"Error `validation_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Error `unauthorized`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Error `forbidden`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Error `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error `payload_too_large`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Error `unsupported_media_type`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Error `rate_limited`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Utm":{"type":"object","properties":{"source":{"type":"string","maxLength":200},"medium":{"type":"string","maxLength":200},"campaign":{"type":"string","maxLength":200},"term":{"type":"string","maxLength":200},"content":{"type":"string","maxLength":200}},"additionalProperties":false,"description":"UTM parameters written into the Destination as `utm_source`, `utm_medium`, … replacing ones already there; an empty string removes one.","example":{"source":"poster","medium":"print","campaign":"spring"}},"RuleInput":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,32}$","description":"Stable id, recorded on each Hit; assigned when absent. Keep it when editing so stats stay together."},"name":{"default":"","description":"What the Rule is for, for people.","example":"Dutch phones","type":"string","maxLength":80},"when":{"default":{},"$ref":"#/components/schemas/RuleConditions"},"to":{"anyOf":[{"type":"object","properties":{"destination":{"type":"string","description":"A full http(s) URL.","example":"https://example.com/nl"}},"required":["destination"],"additionalProperties":false},{"type":"object","properties":{"split":{"minItems":2,"maxItems":10,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,32}$","description":"Stable id, recorded on each Hit; assigned when absent. Keep it when editing so stats stay together."},"destination":{"type":"string","description":"A full http(s) URL.","example":"https://example.com/nl"},"weight":{"type":"integer","minimum":1,"maximum":100,"description":"Relative share of Hits."}},"required":["destination","weight"]},"description":"Weighted Destinations the Rule divides Hits across."}},"required":["split"],"additionalProperties":false}],"description":"Where matching Hits go: one Destination, or a Split."}},"required":["to"]},"RuleConditions":{"type":"object","properties":{"countries":{"description":"ISO 3166-1 alpha-2 country codes.","example":["NL","BE"],"minItems":1,"maxItems":250,"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{2}$"}},"deviceTypes":{"minItems":1,"type":"array","items":{"type":"string","enum":["desktop","smartphone","tablet","phablet","feature_phone","console","tv","car_browser","smart_display","camera","portable_media_player","smart_speaker","wearable","peripheral"]}},"os":{"description":"Operating systems as the device detector names them, ignoring case.","example":["iOS","Android"],"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"languages":{"description":"Primary subtags of the visitor's preferred language (Accept-Language).","example":["nl"],"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{2,3}$"}},"time":{"$ref":"#/components/schemas/TimeWindow"}},"description":"All conditions given must hold; within one, any value matches. None at all matches every Hit."},"TimeWindow":{"type":"object","properties":{"timezone":{"type":"string","example":"Europe/Amsterdam"},"days":{"description":"ISO weekdays in `timezone`, 1 = Monday … 7 = Sunday. Every day when absent.","minItems":1,"maxItems":7,"type":"array","items":{"type":"integer","minimum":1,"maximum":7}},"start":{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d$|^24:00$","description":"Local start time, inclusive.","example":"09:00"},"end":{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d$|^24:00$","description":"Local end time, exclusive; earlier than `start` runs past midnight.","example":"17:30"}},"required":["timezone","start","end"],"description":"Matches Hits made between `start` and `end`, local time in `timezone`."},"Workspace":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"role":{"type":"string","enum":["editor","viewer"],"description":"What the key may do: `editor` manages Links and QR Codes, `viewer` only reads."}},"required":["id","name","role"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","forbidden","not_found","plan_limit","workspace_disabled","code_taken","code_retired","domain_taken","payload_too_large","unsupported_media_type","invalid_code","invalid_destination","invalid_hostname","invalid_domain","confirmation_mismatch","invalid_design","content_too_large","rate_limited","internal_error"],"description":"Stable, machine-readable error code."},"message":{"type":"string","description":"What went wrong, for people."},"issues":{"description":"With `validation_failed`: each invalid field or parameter.","type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}},"required":["path","message"],"additionalProperties":false}}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"Link":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"code":{"type":"string","description":"The Code, uppercase; Codes are case-insensitive and never change.","example":"K7P2XQM"},"domain":{"type":"string","description":"The hostname of the Link's Domain.","example":"vctr.io"},"shortUrl":{"type":"string","format":"uri","example":"https://vctr.io/K7P2XQM"},"destination":{"type":"string","format":"uri","description":"Where the Link sends visitors now."},"kind":{"type":"string","enum":["plain","qr"],"description":"`qr` when the Link belongs to a QR Code (its Hits are Scans)."},"qrCodeId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"The QR Code that owns this Link, if any."},"safety":{"type":"string","enum":["ok","flagged","taken_down"],"description":"`flagged` while its Destination matched a threat list: visitors see a warning instead of the redirect until VCTR staff review it."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"rules":{"type":"array","items":{"$ref":"#/components/schemas/Rule"},"description":"Rules in order: the first that matches a Hit sends it elsewhere than `destination`. Paid Plans."},"passwordProtected":{"type":"boolean","description":"Whether visitors must enter a password first. Paid Plans."},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}],"description":"When the Link stops redirecting; null for never. Paid Plans."},"metadata":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Partner metadata: the key/value pairs set on the Link, never interpreted by VCTR."}},"required":["id","code","domain","shortUrl","destination","kind","qrCodeId","safety","createdAt","rules","passwordProtected","expiresAt","metadata"],"additionalProperties":false},"Rule":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,32}$","description":"Stable id, recorded on each Hit; assigned when absent. Keep it when editing so stats stay together."},"name":{"default":"","description":"What the Rule is for, for people.","example":"Dutch phones","type":"string","maxLength":80},"when":{"default":{},"$ref":"#/components/schemas/RuleConditionsOutput"},"to":{"anyOf":[{"type":"object","properties":{"destination":{"type":"string","description":"A full http(s) URL.","example":"https://example.com/nl"}},"required":["destination"],"additionalProperties":false},{"type":"object","properties":{"split":{"minItems":2,"maxItems":10,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,32}$","description":"Stable id, recorded on each Hit; assigned when absent. Keep it when editing so stats stay together."},"destination":{"type":"string","description":"A full http(s) URL.","example":"https://example.com/nl"},"weight":{"type":"integer","minimum":1,"maximum":100,"description":"Relative share of Hits."}},"required":["id","destination","weight"],"additionalProperties":false},"description":"Weighted Destinations the Rule divides Hits across."}},"required":["split"],"additionalProperties":false}],"description":"Where matching Hits go: one Destination, or a Split."}},"required":["id","name","when","to"],"additionalProperties":false},"DestinationChange":{"type":"object","properties":{"destination":{"type":"string","format":"uri"},"effectiveAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["destination","effectiveAt"],"additionalProperties":false},"QrCode":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["link","vcard","wifi","text"],"description":"`link` and `vcard` QR Codes own a Link; `wifi` and `text` are Offline QR Codes, with no Link and no Hits."},"name":{"type":"string"},"design":{"$ref":"#/components/schemas/QrDesign"},"content":{"type":"string","description":"Exactly what the code encodes: the uppercase Link URL, or the Offline payload."},"linkId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}],"description":"The Link this QR Code owns, whose Hits are its Scans."},"code":{"type":["string","null"]},"shortUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"destination":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"payload":{"anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"wifi"},"ssid":{"type":"string"},"password":{"type":"string"},"encryption":{"type":"string","enum":["WPA","WEP","nopass"]},"hidden":{"type":"boolean"}},"required":["type","ssid","password","encryption","hidden"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"text"},"text":{"type":"string"}},"required":["type","text"],"additionalProperties":false}],"type":"object"},{"type":"null"}],"description":"What an Offline QR Code holds."},"contact":{"anyOf":[{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"organization":{"type":"string"},"title":{"type":"string"},"phones":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["cell","work","home"]},"number":{"type":"string"}},"required":["type","number"],"additionalProperties":false}},"emails":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["work","home"]},"address":{"type":"string"}},"required":["type","address"],"additionalProperties":false}},"website":{"type":"string"},"address":{"type":"object","properties":{"street":{"type":"string"},"city":{"type":"string"},"region":{"type":"string"},"postalCode":{"type":"string"},"country":{"type":"string"}},"required":["street","city","region","postalCode","country"],"additionalProperties":false}},"required":["firstName","lastName","organization","title","phones","emails","website","address"],"additionalProperties":false},{"type":"null"}],"description":"A vCard QR Code's contact details."},"hasPhoto":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"metadata":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Partner metadata: its Link's key/value pairs; empty for Offline QR Codes."}},"required":["id","kind","name","design","content","linkId","code","shortUrl","destination","payload","contact","hasPhoto","createdAt","metadata"],"additionalProperties":false},"QrDesign":{"type":"object","properties":{"dots":{"type":"string","enum":["square","rounded","dots","classy"]},"eyeFrame":{"type":"string","enum":["square","rounded","circle"]},"eyePupil":{"type":"string","enum":["square","rounded","dot"]},"foreground":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},{"type":"object","properties":{"from":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"to":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"angle":{"type":"number","description":"Degrees; 0 runs left to right, 90 top to bottom."}},"required":["from","to","angle"],"additionalProperties":false}]},"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"errorCorrection":{"type":"string","enum":["L","M","Q","H"],"description":"Ignored with a logo, which always uses H."},"logo":{"type":"object","properties":{"href":{"type":"string","description":"A base64 `data:` URI of a PNG, JPEG or SVG image."},"size":{"type":"number","description":"Width as a fraction of the code, 0.1 to 0.4."}},"required":["href","size"],"additionalProperties":false},"frame":{"description":"A border with a call to action below the code.","type":"object","properties":{"text":{"type":"string"},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","example":"#1a237e"}},"required":["text","color","textColor"],"additionalProperties":false}},"required":["dots","eyeFrame","eyePupil","foreground","background","errorCorrection"],"additionalProperties":false},"Timeseries":{"type":"object","properties":{"interval":{"type":"string","enum":["hour","day"]},"buckets":{"type":"array","items":{"type":"object","properties":{"start":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"Start of the hour or UTC day."},"hits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"visitors":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Daily unique visitors: each visitor counts once per Link and UTC day, in the bucket of their first Hit that day."}},"required":["start","hits","visitors"],"additionalProperties":false},"description":"Every bucket in range, with zeros where there were no Hits."},"untracked":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Untracked hits in range: redirected beyond the monthly Tracked hit quota, counted in `hits` but without detail."},"historyStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"The earliest time the Workspace's Plan shows stats for; `from` is moved up to it."}},"required":["interval","buckets","untracked","historyStart"],"additionalProperties":false},"Breakdown":{"type":"object","properties":{"dimension":{"type":"string","enum":["country","region","city","device_type","os","browser","language","referrer_host","channel","rule","variant"]},"rows":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"'' when unknown."},"hits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"visitors":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Daily unique visitors with this value, summed over the days in range."}},"required":["value","hits","visitors"],"additionalProperties":false},"description":"The most common values, by Hits."}},"required":["dimension","rows"],"additionalProperties":false},"Domain":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"hostname":{"type":"string","example":"go.example.com"},"status":{"type":"string","enum":["pending","active","disabled"],"description":"`pending`: waiting for its DNS records; `active`: verified and serving Links; `disabled`: its DNS stopped pointing at VCTR for 7 days, so it serves nothing until it points back."},"dnsRecords":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"},"description":"The CNAME (or, for a root domain, A records) that point the hostname at VCTR, and the TXT record that proves the Workspace controls it."},"verification":{"type":"object","properties":{"verifiedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]},"checkedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}],"description":"The last DNS check; pending Domains are checked every minute, verified ones daily."},"problem":{"description":"What the last check found wrong, if anything.","type":["string","null"]}},"required":["verifiedAt","checkedAt","problem"],"additionalProperties":false},"certificate":{"type":"object","properties":{"status":{"type":"string","enum":["none","pending","issued","failed"],"description":"The HTTPS certificate: requested once the Domain is verified."},"message":{"type":["string","null"]}},"required":["status","message"],"additionalProperties":false},"dangling":{"anyOf":[{"type":"object","properties":{"since":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"disablesAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["since","disablesAt"],"additionalProperties":false},{"type":"null"}],"description":"Set while a verified Domain no longer points at VCTR: it is disabled at `disablesAt` unless it points back."},"fallbackDestination":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Where unknown Codes on the hostname go; they answer 404 when null."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","hostname","status","dnsRecords","verification","certificate","dangling","fallbackDestination","createdAt"],"additionalProperties":false},"DnsRecord":{"type":"object","properties":{"type":{"type":"string","enum":["CNAME","A","TXT"]},"name":{"type":"string"},"value":{"type":"string"}},"required":["type","name","value"],"additionalProperties":false,"description":"A record to create at the DNS provider."},"PartnerWorkspace":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"externalRef":{"type":"string","description":"The Partner's own reference for the Workspace.","example":"acct-1001"},"name":{"type":"string"},"plan":{"type":"string","const":"partner","description":"Partner Workspaces have no limits and are not billed by VCTR."},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","externalRef","name","plan","createdAt"],"additionalProperties":false},"RuleConditionsOutput":{"type":"object","properties":{"countries":{"description":"ISO 3166-1 alpha-2 country codes.","example":["NL","BE"],"minItems":1,"maxItems":250,"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{2}$"}},"deviceTypes":{"minItems":1,"type":"array","items":{"type":"string","enum":["desktop","smartphone","tablet","phablet","feature_phone","console","tv","car_browser","smart_display","camera","portable_media_player","smart_speaker","wearable","peripheral"]}},"os":{"description":"Operating systems as the device detector names them, ignoring case.","example":["iOS","Android"],"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"languages":{"description":"Primary subtags of the visitor's preferred language (Accept-Language).","example":["nl"],"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{2,3}$"}},"time":{"$ref":"#/components/schemas/TimeWindowOutput"}},"additionalProperties":false,"description":"All conditions given must hold; within one, any value matches. None at all matches every Hit."},"TimeWindowOutput":{"type":"object","properties":{"timezone":{"type":"string","example":"Europe/Amsterdam"},"days":{"description":"ISO weekdays in `timezone`, 1 = Monday … 7 = Sunday. Every day when absent.","minItems":1,"maxItems":7,"type":"array","items":{"type":"integer","minimum":1,"maximum":7}},"start":{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d$|^24:00$","description":"Local start time, inclusive.","example":"09:00"},"end":{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d$|^24:00$","description":"Local end time, exclusive; earlier than `start` runs past midnight.","example":"17:30"}},"required":["timezone","start","end"],"additionalProperties":false,"description":"Matches Hits made between `start` and `end`, local time in `timezone`."}},"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"A Workspace API key, `vctr_sk_…`, or a Partner key, `vctr_pk_…`."}}}}