{"openapi":"3.1.0","info":{"title":"Pryzr Verify Operator API","version":"1.0.0-preview.4","summary":"Provider-neutral verification for gaming operators","description":"Use one server-side API to create player verifications, receive results, submit risk signals, and manage webhooks. Your API key automatically selects the correct workspace and environment.","license":{"name":"Proprietary"}},"jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","servers":[{"url":"https://verify.pryzr.tech/api/v1","description":"Production"},{"url":"http://localhost:3000/api/v1","description":"Local development"}],"security":[{"operatorCredential":[]}],"tags":[{"name":"Contract"},{"name":"Integration setup"},{"name":"Applicants"},{"name":"Telemetry"},{"name":"Verification cases"},{"name":"Webhook endpoints"},{"name":"Webhook deliveries"},{"name":"Outbound webhooks"}],"paths":{"/openapi.json":{"get":{"x-pryzr-availability":"implemented","security":[],"tags":["Contract"],"operationId":"getOperatorApiContract","summary":"Retrieve this OpenAPI contract","responses":{"200":{"description":"OpenAPI 3.1 document","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"type":"object"}}}}}}},"/integration/setup-codes/exchange":{"post":{"x-pryzr-availability":"implemented","security":[],"tags":["Integration setup"],"operationId":"exchangeIntegrationSetupCode","summary":"Exchange a short-lived one-time integration setup code","description":"Send the dashboard-issued code once from a trusted server process. Keep the response in memory only, write the returned credential directly to the selected server-side secret manager, and discard both secret values. Responses are never cacheable.","x-pryzr-idempotency":"not-applicable","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["setup_code"],"properties":{"setup_code":{"type":"string","minLength":80,"maxLength":160,"pattern":"^pzs_(sandbox|production)_[0-9a-f]{32}_[0-9a-f]{16}_[A-Za-z0-9_-]{43}$"}}}}}},"responses":{"201":{"description":"Setup code exchanged once","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["environment","workspace_id","integration_id","credential","credential_expires_at","credential_destination","scopes","openapi_url"],"properties":{"environment":{"$ref":"#/components/schemas/Environment"},"workspace_id":{"type":"string","format":"uuid"},"integration_id":{"type":"string","format":"uuid"},"credential":{"type":"string","pattern":"^pzk_(sandbox|production)_[0-9a-f]{16}_[A-Za-z0-9_-]{43}$","description":"One-time operator credential. Store it immediately.","x-pryzr-one-time":true},"credential_expires_at":{"type":"string","format":"date-time"},"credential_destination":{"type":"string","enum":["AWS_SECRETS_MANAGER","AZURE_KEY_VAULT","GOOGLE_SECRET_MANAGER","HASHICORP_VAULT","VERCEL","OTHER_APPROVED"]},"scopes":{"type":"array","minItems":8,"maxItems":8,"uniqueItems":true,"items":{"type":"string","enum":["applicants:read","applicants:write","verification_cases:read","verification_cases:write","webhook_deliveries:read","webhook_endpoints:write","transaction_events:write","telemetry:write"]}},"openapi_url":{"type":"string","format":"uri"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/integration/certification":{"post":{"x-pryzr-availability":"implemented","tags":["Integration setup"],"operationId":"certifyOperatorIntegration","summary":"Submit evidence-backed integration acceptance checks","description":"The credential environment selects the Sandbox or Production-isolated gate. The checks object must contain every named check for that environment with value true, and revision must be the exact 40-character lowercase hexadecimal Git commit. Sandbox checks: authentication, tenant_isolation, session_creation, status_mapping, webhook_signature, webhook_replay, synthetic_only. Production checks: certified_revision, isolated_configuration, authentication, synthetic_webhook, secret_redaction, rollback, no_real_applicants.","x-pryzr-required-scope":"verification_cases:write","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["revision","checks"],"properties":{"revision":{"type":"string","pattern":"^[0-9a-f]{40}$"},"checks":{"type":"object","minProperties":1,"maxProperties":20,"additionalProperties":{"type":"boolean"},"description":"Required names depend on the credential environment. Unknown boolean evidence fields are allowed, but all required names must be present and true.","anyOf":[{"title":"Sandbox certification checks","required":["authentication","tenant_isolation","session_creation","status_mapping","webhook_signature","webhook_replay","synthetic_only"],"properties":{"authentication":{"type":"boolean","const":true},"tenant_isolation":{"type":"boolean","const":true},"session_creation":{"type":"boolean","const":true},"status_mapping":{"type":"boolean","const":true},"webhook_signature":{"type":"boolean","const":true},"webhook_replay":{"type":"boolean","const":true},"synthetic_only":{"type":"boolean","const":true}}},{"title":"Production readiness checks","required":["certified_revision","isolated_configuration","authentication","synthetic_webhook","secret_redaction","rollback","no_real_applicants"],"properties":{"certified_revision":{"type":"boolean","const":true},"isolated_configuration":{"type":"boolean","const":true},"authentication":{"type":"boolean","const":true},"synthetic_webhook":{"type":"boolean","const":true},"secret_redaction":{"type":"boolean","const":true},"rollback":{"type":"boolean","const":true},"no_real_applicants":{"type":"boolean","const":true}}}]}}}}}},"responses":{"200":{"description":"Success","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["certification_id","environment","revision","status"],"properties":{"certification_id":{"type":"string","format":"uuid"},"environment":{"$ref":"#/components/schemas/Environment"},"revision":{"type":"string","pattern":"^[0-9a-f]{40}$"},"status":{"type":"string","enum":["certified"]}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/applicants":{"post":{"x-pryzr-availability":"implemented","tags":["Applicants"],"operationId":"createApplicant","summary":"Create or resolve an applicant by player reference","x-pryzr-required-scope":"applicants:write","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplicantRequest"}}}},"responses":{"200":{"description":"Existing applicant resolved","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Applicant"}}}},"201":{"description":"Applicant created","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Applicant"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/applicants/{id}":{"get":{"x-pryzr-availability":"implemented","tags":["Applicants"],"operationId":"getApplicant","summary":"Retrieve safe applicant metadata","x-pryzr-required-scope":"applicants:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Applicant"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/verification-cases":{"post":{"x-pryzr-availability":"implemented","tags":["Verification cases"],"operationId":"createVerificationCase","summary":"Create a verification case","x-pryzr-required-scope":"verification_cases:write","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVerificationCaseRequest"}}}},"responses":{"200":{"description":"Existing active case resolved","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationCaseWithPlayer"}}}},"201":{"description":"Case created","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationCaseWithPlayer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}},"get":{"x-pryzr-availability":"implemented","tags":["Verification cases"],"operationId":"listVerificationCases","summary":"List verification cases","x-pryzr-required-scope":"verification_cases:read","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"status","in":"query","schema":{"$ref":"#/components/schemas/VerificationCaseStatus"}}],"responses":{"200":{"description":"Success","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationCasePage"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/verification-cases/{id}":{"get":{"x-pryzr-availability":"implemented","tags":["Verification cases"],"operationId":"getVerificationCase","summary":"Check a verification case","x-pryzr-required-scope":"verification_cases:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationCase"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/verification-cases/{id}/resubmissions":{"post":{"x-pryzr-availability":"implemented","tags":["Verification cases"],"operationId":"resubmitVerificationCase","summary":"Resume eligible correction steps or restart an expired or abandoned attempt","x-pryzr-required-scope":"verification_cases:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyObject"}}}},"responses":{"201":{"description":"Resubmission created","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationCaseWithPlayer"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/verification-cases/{id}/cancel":{"post":{"x-pryzr-availability":"implemented","tags":["Verification cases"],"operationId":"cancelVerificationCase","summary":"Cancel a non-final case","x-pryzr-required-scope":"verification_cases:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyObject"}}}},"responses":{"200":{"description":"Case cancelled","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationCase"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/verification-cases/{id}/events":{"get":{"x-pryzr-availability":"implemented","tags":["Verification cases"],"operationId":"listVerificationCaseEvents","summary":"List verification case events","x-pryzr-required-scope":"verification_cases:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Success","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationCaseEventPage"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/step-up-verifications":{"post":{"x-pryzr-availability":"implemented","tags":["Verification cases"],"operationId":"createStepUpVerification","summary":"Request a consent-bound step-up verification","description":"Requires `verification_cases:write`. Returns a single-use player consent URL; production provider access fails closed until approved configuration exists.","x-pryzr-required-scope":"verification_cases:write","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepUpVerificationRequest"}}}},"responses":{"200":{"description":"Request safely deduplicated or not activated","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepUpVerificationAcceptance"}}}},"201":{"description":"Consent-bound request created","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepUpVerificationAcceptance"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/telemetry/browser-tokens":{"post":{"x-pryzr-availability":"implemented","tags":["Telemetry"],"operationId":"createPlayPrintBrowserToken","summary":"Create a short-lived, origin-bound PlayPrint browser grant","description":"Call only from the operator server. The resulting token is safe to pass to the matching authenticated player session; the operator credential must never enter browser code.","x-pryzr-required-scope":"telemetry:write","x-pryzr-idempotency":"not-applicable","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintBrowserTokenRequest"}}}},"responses":{"201":{"description":"Short-lived browser grant created","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintBrowserToken"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/telemetry/consents":{"post":{"x-pryzr-availability":"implemented","tags":["Telemetry"],"operationId":"recordPlayPrintConsent","summary":"Record a player PlayPrint consent receipt","description":"Call from the operator server after an explicit player choice. Pryzr stores only tenant-scoped hashes of the player and receipt references.","x-pryzr-required-scope":"telemetry:write","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintConsentRequest"}}}},"responses":{"201":{"description":"Consent receipt recorded","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintConsentReceipt"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/telemetry/consents/withdraw":{"post":{"x-pryzr-availability":"implemented","tags":["Telemetry"],"operationId":"withdrawPlayPrintConsent","summary":"Withdraw a player PlayPrint consent receipt","description":"Stops the receipt from authorizing telemetry and removes its derived player profile.","x-pryzr-required-scope":"telemetry:write","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintConsentWithdrawalRequest"}}}},"responses":{"200":{"description":"Consent withdrawal applied","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintConsentWithdrawal"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/telemetry/browser":{"post":{"x-pryzr-availability":"implemented","security":[{"playPrintBrowserGrant":[]}],"tags":["Telemetry"],"operationId":"ingestPlayPrintBrowserTelemetry","summary":"Ingest browser telemetry using a short-lived PlayPrint grant","description":"Accepts CORS requests only when the HTTPS Origin, SDK configuration version, player, session, device and consent receipt match the signed browser grant.","x-pryzr-idempotency":"not-applicable","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintBatch"}}}},"responses":{"202":{"description":"Telemetry batch accepted","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintAcceptance"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/telemetry":{"post":{"x-pryzr-availability":"implemented","tags":["Telemetry"],"operationId":"ingestPlayPrintTelemetry","summary":"Submit a batch of consented PlayPrint signals","description":"Accepts privacy-safe behavioral summaries. Raw coordinates, typed text, credentials, documents, payment data, message content, and unknown signal fields are rejected.","x-pryzr-required-scope":"telemetry:write","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintBatch"}}}},"responses":{"202":{"description":"Telemetry batch accepted","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayPrintAcceptance"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/transaction-events":{"post":{"x-pryzr-availability":"implemented","tags":["Transaction monitoring"],"operationId":"ingestTransactionEvent","summary":"Submit one transaction event","description":"Accepts provider-neutral transaction lifecycle data. Stable account, payment, device, session, and network references are irreversibly tenant-hashed before persistence.","x-pryzr-required-scope":"transaction_events:write","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionEventRequest"}}}},"responses":{"202":{"description":"Transaction event accepted","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionEventAcceptance"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/webhook-endpoints":{"post":{"x-pryzr-availability":"implemented","tags":["Webhook endpoints"],"operationId":"createWebhookEndpoint","summary":"Register an outbound webhook endpoint","description":"Requires `webhook_endpoints:write`. The signing secret is returned once; an idempotent replay returns `secret_omitted` instead.","x-pryzr-required-scope":"webhook_endpoints:write","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointRequest"}}}},"responses":{"201":{"description":"Endpoint registered","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedWebhookEndpoint"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/webhook-endpoints/{id}":{"patch":{"x-pryzr-availability":"implemented","tags":["Webhook endpoints"],"operationId":"updateWebhookEndpoint","summary":"Update endpoint destination, status, or subscriptions","description":"Requires `webhook_endpoints:write`. Changing the destination preserves the endpoint ID and active signing secrets.","x-pryzr-required-scope":"webhook_endpoints:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookEndpointRequest"}}}},"responses":{"200":{"description":"Endpoint updated","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/webhook-endpoints/{id}/rotate-secret":{"post":{"x-pryzr-availability":"implemented","tags":["Webhook endpoints"],"operationId":"rotateWebhookSigningSecret","summary":"Rotate an endpoint signing secret","description":"Requires `webhook_endpoints:write`. The new secret is returned once; the previous secret remains valid only for the bounded overlap.","x-pryzr-required-scope":"webhook_endpoints:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateSigningSecretRequest"}}}},"responses":{"200":{"description":"Signing secret rotated","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotatedSigningSecret"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/webhook-endpoints/{id}/test":{"post":{"x-pryzr-availability":"implemented","tags":["Webhook endpoints"],"operationId":"sendTestWebhook","summary":"Queue a signed synthetic test event","description":"Requires `webhook_endpoints:write`.","x-pryzr-required-scope":"webhook_endpoints:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyObject"}}}},"responses":{"202":{"description":"Test event queued","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueuedTestWebhook"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/webhook-deliveries":{"get":{"x-pryzr-availability":"implemented","tags":["Webhook deliveries"],"operationId":"listWebhookDeliveries","summary":"List outbound webhook delivery history","description":"Requires `webhook_deliveries:read`. Unknown or repeated query parameters are rejected.","x-pryzr-required-scope":"webhook_deliveries:read","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"endpoint_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","schema":{"$ref":"#/components/schemas/WebhookDeliveryStatus"}},{"name":"event_type","in":"query","schema":{"type":"string","pattern":"^[a-z][a-z0-9_]{1,40}\\.[a-z][a-z0-9_]{1,40}$"}},{"name":"created_after","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"created_before","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"include_test","in":"query","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Success","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryPage"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}},"/webhook-deliveries/{id}/redeliver":{"post":{"x-pryzr-availability":"implemented","tags":["Webhook deliveries"],"operationId":"redeliverWebhook","summary":"Queue an audited redelivery of a settled delivery","description":"Requires `webhook_deliveries:write`.","x-pryzr-required-scope":"webhook_deliveries:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeliverWebhookRequest"}}}},"responses":{"202":{"description":"Redelivery queued","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueuedWebhookRedelivery"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/DependencyUnavailable"}}}}},"webhooks":{"verificationCaseEvent":{"post":{"tags":["Outbound webhooks"],"security":[],"operationId":"receiveVerificationCaseEvent","summary":"Receive a signed verification-case event","description":"Verify the HMAC-SHA256 signature over `<unix-seconds>.<exact raw body>`, reject timestamps outside five minutes, and deduplicate on the event id.","parameters":[{"$ref":"#/components/parameters/WebhookId"},{"$ref":"#/components/parameters/WebhookTimestamp"},{"$ref":"#/components/parameters/WebhookSignature"},{"$ref":"#/components/parameters/WebhookAttempt"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEnvelope"}}}},"responses":{"200":{"description":"Accepted"},"204":{"description":"Accepted without a response body"}}}}},"components":{"securitySchemes":{"operatorCredential":{"type":"http","scheme":"bearer","bearerFormat":"pzk_sandbox_<prefix>_<secret>","description":"Server-side credential. Never expose it in browser code."},"playPrintBrowserGrant":{"type":"http","scheme":"bearer","bearerFormat":"pzt1.<claims>.<signature>","description":"Short-lived browser grant minted by the operator server and bound to one exact HTTPS origin and player session."}},"headers":{"RequestId":{"description":"Request correlation id","schema":{"type":"string","format":"uuid"}}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"Unique per logical mutation for 24 hours (8-200 safe characters). Retry ambiguous outcomes with the same key and identical body.","schema":{"type":"string","minLength":8,"maxLength":200,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{7,199}$"}},"Limit":{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},"Cursor":{"name":"cursor","in":"query","schema":{"type":"string","maxLength":200}},"WebhookId":{"name":"Pryzr-Webhook-Id","in":"header","required":true,"schema":{"type":"string","pattern":"^evt_[0-9a-f-]{36}$"}},"WebhookTimestamp":{"name":"Pryzr-Webhook-Timestamp","in":"header","required":true,"schema":{"type":"string","pattern":"^[0-9]{1,15}$"}},"WebhookSignature":{"name":"Pryzr-Webhook-Signature","in":"header","required":true,"schema":{"type":"string","pattern":"^v1=[0-9a-f]{64}( v1=[0-9a-f]{64})*$"}},"WebhookAttempt":{"name":"Pryzr-Webhook-Attempt","in":"header","required":true,"description":"Unsigned diagnostic metadata; do not use for authenticity.","schema":{"type":"string","pattern":"^(?:[1-9]|[1-9][0-9]|100)$"}}},"responses":{"BadRequest":{"description":"Malformed or invalid request","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Unauthorized":{"description":"Missing or invalid credential","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Forbidden":{"description":"Credential lacks the required scope","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"NotFound":{"description":"Resource absent or inaccessible","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Conflict":{"description":"State or idempotency conflict","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"PayloadTooLarge":{"description":"Request body exceeds the configured limit","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"Unprocessable":{"description":"Valid request rejected by policy","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"RateLimited":{"description":"Rate limit exceeded","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"InternalError":{"description":"Request could not be completed","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"DependencyUnavailable":{"description":"Required dependency unavailable","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"Cache-Control":{"schema":{"type":"string","const":"no-store"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"schemas":{"EmptyObject":{"type":"object","additionalProperties":false,"maxProperties":0},"StableReference":{"type":"string","minLength":1,"maxLength":200,"pattern":"^[A-Za-z0-9._:@/-]+$"},"Environment":{"type":"string","enum":["sandbox","production"]},"StepUpVerificationRequest":{"type":"object","additionalProperties":false,"required":["verificationCaseId","applicantId","subjectId","signal"],"properties":{"verificationCaseId":{"type":"string","format":"uuid"},"applicantId":{"type":"string","format":"uuid"},"subjectId":{"type":"string","pattern":"^player_[a-f0-9]{20}$"},"signal":{"type":"object","additionalProperties":false,"required":["deviceNovelty","materiallyChanged","confidence","recentEvents"],"properties":{"deviceNovelty":{"type":"boolean"},"materiallyChanged":{"type":"boolean"},"confidence":{"type":"number","minimum":0,"maximum":1},"recentEvents":{"type":"integer","minimum":0}}}}},"StepUpVerificationAcceptance":{"type":"object","required":["outcome"],"properties":{"outcome":{"type":"string"},"request_id":{"type":"string","format":"uuid"},"player_url":{"type":"string","format":"uri"}}},"VerificationCaseStatus":{"type":"string","enum":["created","ready","in_progress","processing","manual_review","resubmission_required","approved","declined","expired","abandoned","verification_expired"]},"ErrorCode":{"type":"string","enum":["BAD_REQUEST","UNAUTHORIZED","FORBIDDEN","NOT_FOUND","METHOD_NOT_ALLOWED","CONFLICT","PAYLOAD_TOO_LARGE","UNPROCESSABLE","RATE_LIMITED","NOT_IMPLEMENTED","DEPENDENCY_UNAVAILABLE","INTERNAL_ERROR"]},"ErrorDetail":{"type":"object","required":["field","reason"],"properties":{"field":{"type":"string","maxLength":200},"reason":{"type":"string","enum":["invalid","out_of_bounds","unrecognized_key","duplicated","unknown_parameter","unknown_value","invalid_timestamp","required_with_time_range","invalid_time_range"]}}},"ErrorEnvelope":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","request_id"],"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string"},"request_id":{"type":"string","format":"uuid"},"details":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/ErrorDetail"}}}}}},"CreateApplicantRequest":{"type":"object","additionalProperties":false,"required":["operator_applicant_ref"],"properties":{"operator_applicant_ref":{"$ref":"#/components/schemas/StableReference"},"email":{"type":"string","format":"email","maxLength":254,"description":"Casino account email for authorized dashboard search. Required by the new Launchpad integration contract; optional in the API for legacy compatibility. Launchpad must supply the authenticated account email before starting KYC. Stored encrypted and isolated by environment; omitted from API responses. Providing email does not itself send a notification."}}},"Applicant":{"type":"object","additionalProperties":false,"required":["id","operator_applicant_ref","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"operator_applicant_ref":{"$ref":"#/components/schemas/StableReference"},"created_at":{"type":"string","format":"date-time"}}},"CreateVerificationCaseRequest":{"type":"object","additionalProperties":false,"required":["applicant_id","operator_case_ref","jurisdiction","required_minimum_age"],"properties":{"applicant_id":{"type":"string","format":"uuid"},"operator_case_ref":{"$ref":"#/components/schemas/StableReference"},"jurisdiction":{"type":"string","minLength":2,"maxLength":16,"pattern":"^[A-Z]{2}(?:-[A-Z0-9]{1,8})?$"},"required_minimum_age":{"type":"integer","minimum":0,"maximum":120},"return_url":{"type":"string","format":"uri","minLength":12,"maxLength":2048,"description":"Optional absolute HTTPS page on the operator's site (port 443, no credentials, no IP literal). Pryzr offers it to the player as an explicit 'Return to <operator>' action on every outcome screen. It is never followed automatically, never used as the provider callback, and never included in webhooks or case reads. Do not embed player identity, tokens, or secrets."},"identity_hash":{"type":"boolean","description":"Opt in to receive result.identity_hash on approval: a stable, tenant- and environment-scoped pseudonym of the verified document (HMAC, never the document number) for recognising the same document across your own players. Defaults to false."},"verified_name":{"type":"boolean","const":true,"description":"Optional affirmative compatibility hint. Retained verified ID names are returned on approval even when this field is omitted."},"declared_name":{"type":"object","additionalProperties":false,"required":["given","family"],"description":"Optional name you hold for the player, for a match-only comparison with the verified document. Pryzr stores only a keyed digest of it and reports result.name_match on approval; the separate result.verified_name field returns the ID name on approved case reads.","properties":{"given":{"type":"string","minLength":1,"maxLength":100},"family":{"type":"string","minLength":1,"maxLength":100}}}}},"VerificationCase":{"type":"object","required":["id","applicant_id","operator_case_ref","environment","jurisdiction","status","result","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"applicant_id":{"type":"string","format":"uuid"},"operator_case_ref":{"$ref":"#/components/schemas/StableReference"},"environment":{"$ref":"#/components/schemas/Environment"},"jurisdiction":{"type":"string"},"status":{"$ref":"#/components/schemas/VerificationCaseStatus"},"result":{"type":"object","additionalProperties":false,"required":["outcome","decline_class","identity_hash","document_id","name_match"],"properties":{"outcome":{"type":["string","null"],"enum":["approve","decline","review",null]},"decline_class":{"type":["string","null"],"enum":["age","identity","document","other",null],"description":"Pryzr's bounded classification of a decline, present only when outcome is decline. Never a provider reason code."},"document_id":{"type":["string","null"],"minLength":3,"maxLength":128,"description":"Printed ID document number from retained evidence. Only disclosed on an approved case; null when unavailable or ambiguous."},"identity_hash":{"type":["string","null"],"pattern":"^v1:[0-9a-f]{64}$","description":"Tenant- and environment-scoped pseudonym of the verified document, present only on approval and only when identity_hash was requested at case creation."},"name_match":{"type":["string","null"],"enum":["match","mismatch","unavailable",null],"description":"Match-only comparison of declared_name with the verified document name, present only on approval when declared_name was supplied. unavailable means it could not be compared."},"verified_name":{"anyOf":[{"$ref":"#/components/schemas/VerifiedName"},{"type":"null"}],"description":"ID-derived name on approved case reads; null when retained verified evidence is unavailable. Scoped to the owning operator."},"verified_address":{"anyOf":[{"$ref":"#/components/schemas/VerifiedAddress"},{"type":"null"}],"description":"Residential address printed on the approved identity document, as read by the provider, on approved case reads. Null when the document has no address, the evidence is unavailable, or approved documents disagree. Not included in webhooks; read the case. Scoped to the owning operator."}}},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"VerifiedName":{"type":"object","additionalProperties":false,"required":["full_name","given","family"],"properties":{"full_name":{"type":"string","minLength":1,"maxLength":300},"given":{"type":["string","null"],"maxLength":300},"family":{"type":["string","null"],"maxLength":300}}},"VerifiedAddress":{"type":"object","additionalProperties":false,"description":"Each part as printed on the document; null when not supplied. Nothing is geocoded or guessed.","required":["full_address","line1","line2","city","region","postal_code","country"],"properties":{"full_address":{"type":["string","null"],"maxLength":500},"line1":{"type":["string","null"],"maxLength":300},"line2":{"type":["string","null"],"maxLength":300},"city":{"type":["string","null"],"maxLength":300},"region":{"type":["string","null"],"maxLength":300,"description":"State or region as printed; may be a name or a code."},"postal_code":{"type":["string","null"],"maxLength":20},"country":{"type":["string","null"],"maxLength":60}}},"PlayerLaunch":{"type":"object","additionalProperties":false,"description":"One-time Pryzr-hosted launch. It exchanges for an HttpOnly session bound to the active applicant, case, and attempt.","required":["url","expires_at"],"properties":{"url":{"type":"string","format":"uri","description":"Short-lived Pryzr URL. Deliver only through the operator's authenticated player flow; do not log or analyze it."},"expires_at":{"type":"string","format":"date-time"}}},"VerificationCaseWithPlayer":{"allOf":[{"$ref":"#/components/schemas/VerificationCase"},{"type":"object","required":["player"],"properties":{"player":{"$ref":"#/components/schemas/PlayerLaunch"}}}]},"VerificationCasePage":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VerificationCase"}},"next_cursor":{"type":["string","null"]}}},"VerificationCaseEvent":{"type":"object","additionalProperties":false,"required":["id","type","occurred_at"],"properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","pattern":"^verification_case\\.[a-z0-9_]+$"},"occurred_at":{"type":"string","format":"date-time"}}},"VerificationCaseEventPage":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VerificationCaseEvent"}},"next_cursor":{"type":["string","null"]}}},"PlayPrintBatch":{"type":"object","additionalProperties":false,"required":["events"],"properties":{"events":{"type":"array","minItems":1,"maxItems":100,"items":{"$ref":"#/components/schemas/PlayPrintEvent"}}}},"PlayPrintBrowserTokenRequest":{"type":"object","additionalProperties":false,"required":["origin","subject_ref","session_ref","device_ref","config_version"],"properties":{"origin":{"type":"string","format":"uri","maxLength":256},"subject_ref":{"type":"string","minLength":8,"maxLength":128},"session_ref":{"type":"string","minLength":8,"maxLength":128},"device_ref":{"type":"string","minLength":8,"maxLength":128},"consent_receipt_ref":{"type":"string","minLength":8,"maxLength":128},"config_version":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,32}$"}}},"PlayPrintBrowserToken":{"type":"object","additionalProperties":false,"required":["token","expires_at","endpoint","config_version","sample_rate","enabled_signals"],"properties":{"token":{"type":"string","minLength":64,"maxLength":2048},"expires_at":{"type":"string","format":"date-time"},"endpoint":{"type":"string","format":"uri"},"config_version":{"type":"string"},"sample_rate":{"type":"number","minimum":0,"maximum":1},"enabled_signals":{"type":"array","items":{"type":"string"}},"consent_receipt_ref":{"type":"string","minLength":8,"maxLength":128}}},"PlayPrintConsentRequest":{"type":"object","additionalProperties":false,"required":["subject_ref","policy_version","jurisdiction","legal_basis","optional_granted"],"properties":{"subject_ref":{"type":"string","minLength":8,"maxLength":128},"policy_version":{"type":"string","minLength":1,"maxLength":64},"jurisdiction":{"type":"string","pattern":"^[A-Za-z0-9_-]{2,32}$"},"legal_basis":{"type":"string","enum":["CONSENT","LEGITIMATE_INTEREST","STRICTLY_NECESSARY"]},"optional_granted":{"type":"boolean"},"expires_at":{"type":"string","format":"date-time"}}},"PlayPrintConsentReceipt":{"type":"object","additionalProperties":false,"required":["receipt_ref","policy_version","recorded_at"],"properties":{"receipt_ref":{"type":"string","minLength":8,"maxLength":128},"policy_version":{"type":"string"},"recorded_at":{"type":"string","format":"date-time"}}},"PlayPrintConsentWithdrawalRequest":{"type":"object","additionalProperties":false,"required":["receipt_ref"],"properties":{"receipt_ref":{"type":"string","minLength":8,"maxLength":128}}},"PlayPrintConsentWithdrawal":{"type":"object","additionalProperties":false,"required":["receipt_ref","withdrawn","changed"],"properties":{"receipt_ref":{"type":"string","minLength":8,"maxLength":128},"withdrawn":{"type":"boolean","const":true},"changed":{"type":"boolean"}}},"TransactionEventRequest":{"type":"object","additionalProperties":false,"required":["operatorEventRef","eventType","status","operatorAccountRef","occurredAt"],"properties":{"operatorEventRef":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9:_-]{0,127}$","description":"Opaque reconciliation identifier; never include personal or payment data."},"eventType":{"type":"string","enum":["DEPOSIT","PURCHASE","REDEMPTION","REFUND","CHARGEBACK","BONUS","PAYMENT_FAILURE","REVERSAL"]},"status":{"type":"string","enum":["PENDING","SUCCEEDED","FAILED","REVERSED"]},"amountMinor":{"type":"integer","minimum":0},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"operatorAccountRef":{"type":"string","minLength":1,"maxLength":128},"paymentInstrumentRef":{"type":"string","maxLength":256},"deviceRef":{"type":"string","maxLength":256},"sessionRef":{"type":"string","maxLength":256},"networkRef":{"type":"string","maxLength":256},"countryCode":{"type":"string","pattern":"^[A-Z]{2}$"},"occurredAt":{"type":"string","format":"date-time"}}},"TransactionEventAcceptance":{"type":"object","additionalProperties":false,"required":["event_id","replayed","findings"],"properties":{"event_id":{"type":"string","format":"uuid"},"replayed":{"type":"boolean"},"findings":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["reason_code","severity","explanation"],"properties":{"reason_code":{"type":"string"},"severity":{"type":"string","enum":["LOW","MEDIUM","HIGH","CRITICAL"]},"explanation":{"type":"string"}}}}}},"PlayPrintEvent":{"type":"object","additionalProperties":false,"required":["eventId","sequence","occurredAt","subjectRef","sessionRef","deviceRef","signals"],"properties":{"eventId":{"type":"string","format":"uuid"},"sequence":{"type":"integer","minimum":0,"maximum":2147483647},"occurredAt":{"type":"string","format":"date-time"},"subjectRef":{"type":"string","minLength":8,"maxLength":128},"sessionRef":{"type":"string","minLength":8,"maxLength":128},"deviceRef":{"type":"string","minLength":8,"maxLength":128},"consentReceiptRef":{"type":"string","minLength":8,"maxLength":128},"signals":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"device":{"type":"object","description":"Allowlisted coarse device attributes."},"input":{"type":"object","description":"Boolean input-capability indicators."},"navigation":{"type":"object","description":"Route category and bounded dwell time."},"pointer":{"type":"object","description":"Aggregate movement metrics; never coordinates."},"click":{"type":"object","description":"Aggregate click cadence and target categories."},"keyboardTiming":{"type":"object","description":"Non-sensitive control timing aggregates; never keys."},"focus":{"type":"object","description":"Visibility-change aggregates."},"gameplay":{"type":"object","description":"Coarse game and play-style aggregates."},"transactionLink":{"type":"object","description":"Opaque operator event references."},"verification":{"type":"object","description":"Allowlisted verification journey event."},"automation":{"type":"object","description":"Bounded automation-risk aggregates."}}}}},"PlayPrintAcceptance":{"type":"object","additionalProperties":false,"required":["events"],"properties":{"events":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["eventId","accepted","replay"],"properties":{"eventId":{"type":"string","format":"uuid"},"accepted":{"type":"boolean","const":true},"replay":{"type":"boolean"},"stepUp":{"type":"object","additionalProperties":false,"required":["outcome","requestId","playerPath"],"description":"Optional consent-bound behavioral verification prompt. Never log the short-lived bearer path; present it only to the matching authenticated player.","properties":{"outcome":{"type":"string","const":"consent_required"},"requestId":{"type":"string","format":"uuid"},"playerPath":{"type":"string","pattern":"^/step-up/[a-f0-9-]{36}/[a-f0-9-]{36}/[A-Za-z0-9_-]{43}$"}}}}}}}},"WebhookEventType":{"type":"string","enum":["verification_case.created","verification_case.processing","verification_case.review_required","verification_case.resubmission_required","verification_case.approved","verification_case.declined","verification_case.expired","verification_case.abandoned","verification_case.verification_expired","verification_case.reopened_for_review","verification_case.deleted"]},"WebhookDeliverableEventType":{"type":"string","enum":["verification_case.created","verification_case.processing","verification_case.review_required","verification_case.resubmission_required","verification_case.approved","verification_case.declined","verification_case.expired","verification_case.abandoned","verification_case.verification_expired","verification_case.reopened_for_review","verification_case.deleted","webhook_endpoint.test"]},"WebhookEndpointStatus":{"type":"string","enum":["active","paused","disabled"]},"WebhookDeliveryStatus":{"type":"string","enum":["pending","retry_wait","succeeded","failed","dead_letter","cancelled"]},"CreateWebhookEndpointRequest":{"type":"object","additionalProperties":false,"required":["url","event_types"],"properties":{"url":{"type":"string","format":"uri","minLength":12,"maxLength":2048,"pattern":"^https://"},"description":{"type":["string","null"],"maxLength":500},"event_types":{"type":"array","minItems":1,"maxItems":20,"items":{"$ref":"#/components/schemas/WebhookEventType"}}}},"UpdateWebhookEndpointRequest":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"url":{"type":"string","format":"uri","minLength":12,"maxLength":2048,"pattern":"^https://"},"status":{"type":"string","enum":["active","paused"]},"event_types":{"type":"array","minItems":1,"maxItems":20,"items":{"$ref":"#/components/schemas/WebhookEventType"}}}},"RotateSigningSecretRequest":{"type":"object","additionalProperties":false,"properties":{"overlap_seconds":{"type":"integer","minimum":300,"maximum":2592000,"default":86400}}},"RedeliverWebhookRequest":{"type":"object","additionalProperties":false,"properties":{"reason_code":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{2,63}$","default":"OPERATOR_REQUESTED_REDELIVERY"}}},"SigningSecretValue":{"type":"object","additionalProperties":false,"required":["id","key_label","secret"],"properties":{"id":{"type":"string","format":"uuid"},"key_label":{"type":"string"},"secret":{"type":"string","minLength":32,"description":"One-time plaintext value. Store it immediately in a server-side secret manager.","x-pryzr-one-time":true}}},"RedactedSigningSecret":{"type":"object","additionalProperties":false,"required":["id","key_label","secret_omitted"],"properties":{"id":{"type":"string","format":"uuid"},"key_label":{"type":"string"},"secret_omitted":{"type":"boolean","const":true}}},"SigningSecret":{"oneOf":[{"$ref":"#/components/schemas/SigningSecretValue"},{"$ref":"#/components/schemas/RedactedSigningSecret"}]},"CreatedWebhookEndpoint":{"type":"object","additionalProperties":false,"required":["id","url","description","environment","status","event_types","created_at","signing_secret"],"properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string","format":"uri"},"description":{"type":["string","null"]},"environment":{"$ref":"#/components/schemas/Environment"},"status":{"$ref":"#/components/schemas/WebhookEndpointStatus"},"event_types":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventType"}},"created_at":{"type":"string","format":"date-time"},"signing_secret":{"$ref":"#/components/schemas/SigningSecret"}}},"WebhookEndpoint":{"type":"object","additionalProperties":false,"required":["id","url","description","environment","status","event_types","disabled_reason_code","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string","format":"uri"},"description":{"type":["string","null"]},"environment":{"$ref":"#/components/schemas/Environment"},"status":{"$ref":"#/components/schemas/WebhookEndpointStatus"},"event_types":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventType"}},"disabled_reason_code":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"RotatedSigningSecret":{"type":"object","additionalProperties":false,"required":["endpoint_id","overlap_seconds","signing_secret"],"properties":{"endpoint_id":{"type":"string","format":"uuid"},"overlap_seconds":{"type":"integer","minimum":300,"maximum":2592000},"signing_secret":{"$ref":"#/components/schemas/SigningSecret"}}},"QueuedTestWebhook":{"type":"object","additionalProperties":false,"required":["delivery_id","endpoint_id","event_id","event_type","test","status"],"properties":{"delivery_id":{"type":"string","format":"uuid"},"endpoint_id":{"type":"string","format":"uuid"},"event_id":{"type":"string","pattern":"^evt_[0-9a-f-]{36}$"},"event_type":{"type":"string","const":"webhook_endpoint.test"},"test":{"type":"boolean","const":true},"status":{"type":"string","const":"queued"}}},"WebhookDelivery":{"type":"object","additionalProperties":false,"required":["id","endpoint_id","event_id","event_type","environment","status","test","attempt_count","max_attempts","last_response_status","last_error_code","next_attempt_at","completed_at","created_at","redelivery_of_id"],"properties":{"id":{"type":"string","format":"uuid"},"endpoint_id":{"type":"string","format":"uuid"},"event_id":{"type":"string","pattern":"^evt_[0-9a-f-]{36}$"},"event_type":{"$ref":"#/components/schemas/WebhookDeliverableEventType"},"environment":{"$ref":"#/components/schemas/Environment"},"status":{"$ref":"#/components/schemas/WebhookDeliveryStatus"},"test":{"type":"boolean"},"attempt_count":{"type":"integer","minimum":0},"max_attempts":{"type":"integer","minimum":1},"last_response_status":{"type":["integer","null"],"minimum":100,"maximum":599},"last_error_code":{"type":["string","null"]},"next_attempt_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"redelivery_of_id":{"type":["string","null"],"format":"uuid"}}},"WebhookDeliveryPage":{"type":"object","additionalProperties":false,"required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}},"next_cursor":{"type":["string","null"]}}},"QueuedWebhookRedelivery":{"type":"object","additionalProperties":false,"required":["delivery_id","source_delivery_id","created","status"],"properties":{"delivery_id":{"type":"string","format":"uuid"},"source_delivery_id":{"type":"string","format":"uuid"},"created":{"type":"boolean"},"status":{"type":"string","const":"queued"}}},"WebhookEnvelope":{"oneOf":[{"$ref":"#/components/schemas/VerificationCaseWebhookEnvelope"},{"$ref":"#/components/schemas/TestWebhookEnvelope"}]},"VerificationCaseWebhookEnvelope":{"type":"object","additionalProperties":false,"required":["id","type","created_at","tenant_id","environment","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f-]{36}$"},"type":{"type":"string","enum":["verification_case.created","verification_case.processing","verification_case.review_required","verification_case.resubmission_required","verification_case.approved","verification_case.declined","verification_case.expired","verification_case.abandoned","verification_case.verification_expired","verification_case.reopened_for_review","verification_case.deleted"]},"created_at":{"type":"string","format":"date-time"},"tenant_id":{"type":"string","format":"uuid"},"environment":{"$ref":"#/components/schemas/Environment"},"data":{"type":"object","additionalProperties":false,"required":["case_id","operator_case_ref","status","attempt_id","version"],"properties":{"case_id":{"type":"string","format":"uuid"},"operator_case_ref":{"$ref":"#/components/schemas/StableReference"},"status":{"$ref":"#/components/schemas/VerificationCaseStatus"},"attempt_id":{"type":["string","null"],"format":"uuid"},"version":{"type":"integer","minimum":1},"decline_class":{"type":"string","enum":["age","identity","document","other"],"description":"Only on verification_case.declined: Pryzr's bounded decline classification."},"document_id":{"type":"string","minLength":3,"maxLength":128,"description":"Printed ID document number from retained evidence; only included on approval when available and unambiguous."},"identity_hash":{"type":"string","pattern":"^v1:[0-9a-f]{64}$","description":"Only on verification_case.approved, and only when the case requested identity_hash."},"name_match":{"type":"string","enum":["match","mismatch","unavailable"],"description":"Only on verification_case.approved, and only when the case supplied declared_name."},"verified_name":{"$ref":"#/components/schemas/VerifiedName"}}}}},"TestWebhookEnvelope":{"type":"object","additionalProperties":false,"required":["id","type","created_at","tenant_id","environment","data"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-f-]{36}$"},"type":{"type":"string","const":"webhook_endpoint.test"},"created_at":{"type":"string","format":"date-time"},"tenant_id":{"type":"string","format":"uuid"},"environment":{"$ref":"#/components/schemas/Environment"},"data":{"type":"object","additionalProperties":false,"required":["endpoint_id","test"],"properties":{"endpoint_id":{"type":"string","format":"uuid"},"test":{"type":"boolean","const":true}}}}}}}}