Skip to content

NewThe DPDP Rules phase in by May 2027.Check your website’s consent readiness

Home

API reference

Every customer-facing endpoint, generated from the same zod contracts the API validates against. Base URL https://api.optproof.in. JSON in and out, snake_case fields.

Errors always look like { "error": { "code", "message", "request_id" } }. See the Server API guide for authentication, idempotency and rate limits, and Webhooks for outgoing events.

Server API#

Server API. Call from your backend with a secret key (Authorization: Bearer sk_…).

post/v1/consents#

Record consent captured by your own UI

Secret key (Authorization: Bearer sk_…)Plan feature: api

Request body

  • property_idstringrequired
  • principalobjectrequired
    • phonestring

      6–20 characters

    • emailstring (email)
    • external_idstring

      1–128 characters

  • decisionsarray of objectrequired

    At least 1 item

    • purpose_keystringrequired

      Pattern ^[a-z][a-z0-9_]{1,63}$

    • grantedbooleanrequired
  • notice_versionintegerrequired

    Greater than 0

  • languagestring

    Pattern ^[a-z]{2,3}$. Default "en"

  • channelstring

    One of: "web", "app", "server", "portal", "qr", "kiosk", "whatsapp", "import". Default "server"

  • occurred_atstring (date-time)
  • contextmap of string | number | boolean

    Default {}

  • store_contactboolean

    Default true

Response 201

  • principal_refstringrequired
  • receiptsarray of objectrequired
    • event_idstringrequired
    • receipt_codestringrequired

      Pattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

    • receipt_jwsstringrequired
    • actionstringrequired

      One of: "grant", "deny", "withdraw", "expire"

    • purpose_keysarray of stringrequired
    • seqstringrequired
    • occurred_atstring (date-time)required

get/v1/consents/check#

Is this purpose currently granted? (GET form — use only with principal_ref; prefer POST)

Secret key (Authorization: Bearer sk_…)Plan feature: api

Parameters

  • property_idin querystringrequired
  • purposein querystringrequired
  • phonein querystring
  • emailin querystring
  • external_idin querystring
  • principal_refin querystring

Response 200

  • grantedbooleanrequired
  • statusstring | nullrequired

    One of: "granted", "denied", "withdrawn", "expired"

  • notice_versioninteger | nullrequired

    Minimum -9007199254740991

  • event_idstring | nullrequired
  • updated_atstring (date-time) | nullrequired

post/v1/consents/check#

Is this purpose currently granted for this principal? Call before any marketing send.

Secret key (Authorization: Bearer sk_…)Plan feature: api

Request body

  • property_idstringrequired
  • purposestringrequired

    Pattern ^[a-z][a-z0-9_]{1,63}$

  • phonestring
  • emailstring
  • external_idstring
  • principal_refstring

Response 200

  • grantedbooleanrequired
  • statusstring | nullrequired

    One of: "granted", "denied", "withdrawn", "expired"

  • notice_versioninteger | nullrequired

    Minimum -9007199254740991

  • event_idstring | nullrequired
  • updated_atstring (date-time) | nullrequired

get/v1/consents/events#

Ledger events (cursor-paginated)

Secret key (Authorization: Bearer sk_…)Plan feature: api

Parameters

  • cursorin querystring
  • limitin queryinteger
  • property_idin querystring
  • actionin querystringOne of: "grant", "deny", "withdraw", "expire"
  • sincein querystring
  • untilin querystring
  • principal_refin querystring
  • receipt_codein querystring

Response 200

  • dataarray of objectrequired
    • idstringrequired
    • property_idstringrequired
    • seqstringrequired
    • principal_refstring | nullrequired
    • device_refstring | nullrequired
    • actionstringrequired

      One of: "grant", "deny", "withdraw", "expire"

    • purpose_keysarray of stringrequired
    • notice_versioninteger | nullrequired

      Minimum -9007199254740991

    • languagestringrequired

      Pattern ^[a-z]{2,3}$

    • channelstringrequired

      One of: "web", "app", "server", "portal", "qr", "kiosk", "whatsapp", "import"

    • contextmap of anyrequired
    • occurred_atstring (date-time)required
    • recorded_atstring (date-time)required
    • prev_hashstringrequired
    • hashstringrequired
    • receipt_codestringrequired

      Pattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

    • is_testbooleanrequired
  • next_cursorstring | nullrequired

post/v1/principals/link#

Merge a device history into a principal

Secret key (Authorization: Bearer sk_…)Plan feature: api

Request body

  • property_idstringrequired
  • device_refstring (uuid)required
  • principalobjectrequired
    • phonestring

      6–20 characters

    • emailstring (email)
    • external_idstring

      1–128 characters

Response 200

  • principal_refstringrequired
  • merged_eventsintegerrequired

    Minimum -9007199254740991

get/v1/principals/{ref}/consents#

Current consent state of a principal

Secret key (Authorization: Bearer sk_…)Plan feature: api

Parameters

  • property_idin querystring
  • refin pathstringrequired

Response 200

  • principal_refstringrequired
  • purposesarray of objectrequired
    • purpose_keystringrequired

      Pattern ^[a-z][a-z0-9_]{1,63}$

    • statusstringrequired

      One of: "granted", "denied", "withdrawn", "expired"

    • last_event_idstringrequired
    • updated_atstring (date-time)required

get/v1/principals/{ref}/history#

Ledger events for a principal

Secret key (Authorization: Bearer sk_…)Plan feature: api

Parameters

  • cursorin querystring
  • limitin queryinteger
  • refin pathstringrequired

Response 200

  • dataarray of objectrequired
    • idstringrequired
    • property_idstringrequired
    • seqstringrequired
    • principal_refstring | nullrequired
    • device_refstring | nullrequired
    • actionstringrequired

      One of: "grant", "deny", "withdraw", "expire"

    • purpose_keysarray of stringrequired
    • notice_versioninteger | nullrequired

      Minimum -9007199254740991

    • languagestringrequired

      Pattern ^[a-z]{2,3}$

    • channelstringrequired

      One of: "web", "app", "server", "portal", "qr", "kiosk", "whatsapp", "import"

    • contextmap of anyrequired
    • occurred_atstring (date-time)required
    • recorded_atstring (date-time)required
    • prev_hashstringrequired
    • hashstringrequired
    • receipt_codestringrequired

      Pattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

    • is_testbooleanrequired
  • next_cursorstring | nullrequired

get/v1/requests#

Rights requests

Secret key (Authorization: Bearer sk_…)Plan feature: api

Parameters

  • cursorin querystring
  • limitin queryinteger
  • statusin querystringOne of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"
  • typein querystringOne of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"
  • property_idin querystring
  • due_beforein querystring
  • qin querystring
  • assigned_toin querystring

Response 200

  • dataarray of objectrequired
    • idstringrequired
    • referencestringrequired
    • property_idstringrequired
    • typestringrequired

      One of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"

    • statusstringrequired

      One of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"

    • principal_refstring | nullrequired
    • verified_atstring (date-time) | nullrequired
    • due_atstring (date-time)required
    • assigned_toobject | nullrequired
      • user_idstringrequired
      • emailstring (email)required
      • namestring | nullrequired
    • payloadmap of anyrequired
    • resolutionmap of any | nullrequired
    • slaobjectrequired
      • progressnumberrequired
      • stagestringrequired

        One of: "ok", "half", "warning", "overdue"

    • created_atstring (date-time)required
    • closed_atstring (date-time) | nullrequired
  • next_cursorstring | nullrequired

get/v1/requests/{id}#

A rights request with its timeline

Secret key (Authorization: Bearer sk_…)Plan feature: api

Parameters

  • idin pathstringrequired

Response 200

  • requestobjectrequired
    • idstringrequired
    • referencestringrequired
    • property_idstringrequired
    • typestringrequired

      One of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"

    • statusstringrequired

      One of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"

    • principal_refstring | nullrequired
    • verified_atstring (date-time) | nullrequired
    • due_atstring (date-time)required
    • assigned_toobject | nullrequired
      • user_idstringrequired
      • emailstring (email)required
      • namestring | nullrequired
    • payloadmap of anyrequired
    • resolutionmap of any | nullrequired
    • slaobjectrequired
      • progressnumberrequired
      • stagestringrequired

        One of: "ok", "half", "warning", "overdue"

    • created_atstring (date-time)required
    • closed_atstring (date-time) | nullrequired
  • eventsarray of objectrequired
    • idstringrequired
    • actor_typestringrequired

      One of: "user", "principal", "api_key", "system", "ops"

    • actor_idstring | nullrequired
    • actor_labelstring | nullrequired
    • actionstringrequired
    • notestring | nullrequired
    • visible_to_principalbooleanrequired
    • atstring (date-time)required

patch/v1/requests/{id}#

Update status, assignee or resolution

Secret key (Authorization: Bearer sk_…)Plan feature: api

Parameters

  • idin pathstringrequired

Request body

  • statusstring

    One of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"

  • assigned_tostring | null
  • resolutionmap of any

Response 200

  • idstringrequired
  • referencestringrequired
  • property_idstringrequired
  • typestringrequired

    One of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"

  • statusstringrequired

    One of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"

  • principal_refstring | nullrequired
  • verified_atstring (date-time) | nullrequired
  • due_atstring (date-time)required
  • assigned_toobject | nullrequired
    • user_idstringrequired
    • emailstring (email)required
    • namestring | nullrequired
  • payloadmap of anyrequired
  • resolutionmap of any | nullrequired
  • slaobjectrequired
    • progressnumberrequired
    • stagestringrequired

      One of: "ok", "half", "warning", "overdue"

  • created_atstring (date-time)required
  • closed_atstring (date-time) | nullrequired

post/v1/requests/{id}/events#

Add a note, reply or system outcome to a request

Secret key (Authorization: Bearer sk_…)Plan feature: api

Parameters

  • idin pathstringrequired

Request body

  • actionstringrequired

    One of: "note", "reply", "system_done", "system_unreachable", "retention_exception"

  • notestringrequired

    Up to 10000 characters

  • visible_to_principalboolean

    Default false

  • systemstring
  • reasonstring

Response 201

  • idstringrequired
  • actor_typestringrequired

    One of: "user", "principal", "api_key", "system", "ops"

  • actor_idstring | nullrequired
  • actor_labelstring | nullrequired
  • actionstringrequired
  • notestring | nullrequired
  • visible_to_principalbooleanrequired
  • atstring (date-time)required

post/v1/access-logs#

Record that someone viewed a principal’s record

Secret key (Authorization: Bearer sk_…)Plan feature: access_logs

Request body

  • principalobjectrequired
    • phonestring

      6–20 characters

    • emailstring (email)
    • external_idstring

      1–128 characters

  • viewer_refstringrequired

    1–128 characters

  • record_typestringrequired

    1–64 characters

  • reasonstringrequired

    1–500 characters

  • atstring (date-time)

Response 201

  • idstringrequired
  • principal_refstringrequired
  • viewer_refstringrequired
  • record_typestringrequired
  • reasonstringrequired
  • atstring (date-time)required

post/v1/imports#

Import existing consents from CSV with evidence

Secret key (Authorization: Bearer sk_…)Plan feature: imports

Request body

  • property_idstringrequired
  • csvstringrequired

    Up to 5000000 characters

  • source_descriptionstringrequired

    3–500 characters

  • evidence_file_namestring
  • evidence_base64string
  • column_mapmap of string

    Default {}

Response 202

  • idstringrequired
  • property_idstringrequired
  • rowsintegerrequired

    Minimum -9007199254740991

  • importedintegerrequired

    Minimum -9007199254740991

  • failedintegerrequired

    Minimum -9007199254740991

  • statusstringrequired

    One of: "uploaded", "validating", "processing", "completed", "failed"

  • errorsarray of objectrequired
    • rowintegerrequired

      Minimum -9007199254740991

    • messagestringrequired
  • evidence_file_namestring | nullrequired
  • created_atstring (date-time)required

post/v1/exports#

Start an evidence export

Secret key (Authorization: Bearer sk_…)Plan feature: evidence_export

Request body

  • kindstringrequired

    One of: "evidence_pack", "consent_log_csv", "chain_report"

  • property_idstring
  • fromstring (date-time)
  • tostring (date-time)

Response 202

  • idstringrequired
  • kindstringrequired

    One of: "evidence_pack", "consent_log_csv", "chain_report"

  • statusstringrequired

    One of: "queued", "running", "ready", "failed"

  • download_urlstring (uri) | nullrequired
  • manifest_hashstring | nullrequired
  • created_atstring (date-time)required

get/v1/exports/{id}#

Export status and download link

Secret key (Authorization: Bearer sk_…)Plan feature: evidence_export

Parameters

  • idin pathstringrequired

Response 200

  • idstringrequired
  • kindstringrequired

    One of: "evidence_pack", "consent_log_csv", "chain_report"

  • statusstringrequired

    One of: "queued", "running", "ready", "failed"

  • download_urlstring (uri) | nullrequired
  • manifest_hashstring | nullrequired
  • created_atstring (date-time)required

Widget and preference centre#

Public API used by the widget and the preference centre. Publishable key, origin-checked.

get/v1/public/config#

Widget/portal configuration for a property (edge-cached 5 minutes)

Publishable key (OptProof-Key header)

Parameters

  • pkin querystring
  • langin querystring

Response 200

  • propertyobjectrequired
    • idstringrequired
    • namestringrequired
    • kindstringrequired

      One of: "web", "app", "location"

    • default_languagestringrequired

      Pattern ^[a-z]{2,3}$

  • tenantobjectrequired
    • slugstringrequired
    • namestringrequired
    • logo_urlstring (uri) | nullrequired
    • white_labelbooleanrequired
  • noticeobjectrequired
    • idstringrequired
    • versionintegerrequired

      Minimum -9007199254740991

    • languagesarray of stringrequired
    • material_changebooleanrequired
  • purposesarray of objectrequired
    • keystringrequired

      Pattern ^[a-z][a-z0-9_]{1,63}$

    • legal_basisstringrequired

      One of: "consent", "legitimate_use"

    • requiredbooleanrequired
    • categorystring | nullrequired

      One of: "essential", "functional", "analytics", "marketing"

    • retention_daysinteger | nullrequired

      Minimum -9007199254740991

  • textsmap of objectrequired
  • uiobjectrequired
    • modestringrequired

      One of: "cookie", "purpose", "both"

    • layoutstringrequired

      One of: "banner", "modal", "slide_in"

    • positionstringrequired

      One of: "bottom", "bottom_left", "bottom_right", "center"

    • themeobjectrequired
      • primarystringrequired
      • backgroundstringrequired
      • textstringrequired
      • radiusintegerrequired

        Minimum 0. Maximum 24

      • font_inheritbooleanrequired
    • repromptstringrequired

      One of: "always", "material"

    • floating_linkbooleanrequired
    • show_badgebooleanrequired
  • linksobjectrequired
    • preference_centrestring (uri)required
    • rights_portalstring (uri)required
    • noticestring (uri)required
    • verifystring (uri)required
  • generated_atstring (date-time)required

post/v1/public/consents#

Record consent decisions from the widget or portal

Publishable key (OptProof-Key header)

Request body

  • device_refstring (uuid)
  • decisionsarray of objectrequired

    At least 1 item

    • purpose_keystringrequired

      Pattern ^[a-z][a-z0-9_]{1,63}$

    • grantedbooleanrequired
  • notice_versionintegerrequired

    Greater than 0

  • languagestringrequired

    Pattern ^[a-z]{2,3}$

  • ui_variantstring

    Up to 64 characters. Default "default"

  • page_urlstring (uri)

    Up to 2048 characters

  • idempotency_keystringrequired

    8–128 characters

  • channelstring

    One of: "web", "app", "portal", "qr", "kiosk". Default "web"

  • qr_codestring

    4–32 characters

Response 201

  • receiptsarray of objectrequired
    • event_idstringrequired
    • receipt_codestringrequired

      Pattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

    • receipt_jwsstringrequired
    • actionstringrequired

      One of: "grant", "deny", "withdraw", "expire"

    • purpose_keysarray of stringrequired
    • seqstringrequired
    • occurred_atstring (date-time)required

post/v1/public/consents/withdraw#

Withdraw consent (device-only or with principal token)

Publishable key (OptProof-Key header)

Request body

  • device_refstring (uuid)
  • purpose_keysarray of string | stringrequired

    At least 1 item

  • languagestring

    Pattern ^[a-z]{2,3}$. Default "en"

  • idempotency_keystringrequired

    8–128 characters

Response 201

  • receiptsarray of objectrequired
    • event_idstringrequired
    • receipt_codestringrequired

      Pattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

    • receipt_jwsstringrequired
    • actionstringrequired

      One of: "grant", "deny", "withdraw", "expire"

    • purpose_keysarray of stringrequired
    • seqstringrequired
    • occurred_atstring (date-time)required

get/v1/public/device/consents#

Current consent state for this device (no OTP)

Publishable key (OptProof-Key header)

Parameters

  • device_refin querystringrequired

Response 200

  • property_idstringrequired
  • purposesarray of objectrequired
    • purpose_keystringrequired

      Pattern ^[a-z][a-z0-9_]{1,63}$

    • statusstring | nullrequired

      One of: "granted", "denied", "withdrawn", "expired"

    • requiredbooleanrequired
    • updated_atstring (date-time) | nullrequired
    • last_receipt_codestring | nullrequired

      Pattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

post/v1/public/identify#

Link a device to a principal (widget optproof.identify)

Publishable key (OptProof-Key header)

Request body

  • device_refstring (uuid)required
  • phonestring

    6–20 characters

  • emailstring (email)

Response 200

  • linkedbooleanrequired

post/v1/public/otp/send#

Send a one-time code to a phone or email

Publishable key (OptProof-Key header)

Request body

  • channelstringrequired

    One of: "sms", "email", "whatsapp"

  • phonestring

    6–20 characters

  • emailstring (email)
  • purposestringrequired

    One of: "preferences", "request", "consent"

  • languagestring

    Pattern ^[a-z]{2,3}$. Default "en"

Response 200

  • challenge_idstringrequired
  • expires_atstring (date-time)required

post/v1/public/otp/verify#

Verify a one-time code and get a 15-minute principal token

Publishable key (OptProof-Key header)

Request body

  • challenge_idstringrequired
  • codestringrequired

    Pattern ^\d{6}$

  • device_refstring (uuid)

Response 200

  • principal_tokenstringrequired
  • expires_atstring (date-time)required

get/v1/public/me/consents#

Current consent state for the verified principal

Publishable key + principal token (OptProof-Principal)

Response 200

  • property_idstringrequired
  • purposesarray of objectrequired
    • purpose_keystringrequired

      Pattern ^[a-z][a-z0-9_]{1,63}$

    • statusstring | nullrequired

      One of: "granted", "denied", "withdrawn", "expired"

    • requiredbooleanrequired
    • updated_atstring (date-time) | nullrequired
    • last_receipt_codestring | nullrequired

      Pattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

get/v1/public/me/receipts#

Receipt history for the verified principal

Publishable key + principal token (OptProof-Principal)

Response 200

  • receiptsarray of objectrequired
    • event_idstringrequired
    • receipt_codestringrequired

      Pattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

    • receipt_jwsstringrequired
    • actionstringrequired

      One of: "grant", "deny", "withdraw", "expire"

    • purpose_keysarray of stringrequired
    • seqstringrequired
    • occurred_atstring (date-time)required
    • channelstringrequired
    • notice_versioninteger | nullrequired

      Minimum -9007199254740991

post/v1/public/requests#

File a rights request (access, correction, erasure, grievance, …)

Publishable key + principal token (OptProof-Principal)

Request body

  • typestringrequired

    One of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"

  • descriptionstring

    Up to 5000 characters. Default ""

  • detailsmap of string

    Default {}

  • languagestring

    Pattern ^[a-z]{2,3}$. Default "en"

Response 201

  • referencestringrequired
  • statusstringrequired

    One of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"

  • due_atstring (date-time)required

get/v1/public/requests/{reference}#

Status of a rights request

Publishable key + principal token (OptProof-Principal)

Parameters

  • referencein pathstringrequired

Response 200

  • referencestringrequired
  • typestringrequired

    One of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"

  • statusstringrequired

    One of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"

  • created_atstring (date-time)required
  • due_atstring (date-time)required
  • closed_atstring (date-time) | nullrequired
  • timelinearray of objectrequired
    • atstring (date-time)required
    • messagestringrequired

post/v1/public/telemetry#

Widget error/timing telemetry (no personal data)

Publishable key (OptProof-Key header)

Request body

  • kindstringrequired

    One of: "error", "timing"

  • messagestringrequired

    Up to 500 characters

  • widget_versionstringrequired

    Up to 32 characters

  • ua_hashstring

    Up to 128 characters

Responds 204 with no body.

Verification#

Receipt verification data and signing keys. No credentials needed.

get/v1/public/receipts/{code}#

Verification data for a receipt (no personal data)

No credentials

Parameters

  • codein pathstringrequired

Response 200

  • receipt_codestringrequired

    Pattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

  • receipt_jwsstringrequired
  • propertyobjectrequired
    • idstringrequired
    • namestringrequired
    • tenant_namestringrequired
  • segmentarray of objectrequired
    • seqstringrequired
    • prev_hashstringrequired
    • hashstringrequired
    • canonicalstringrequired
  • anchorobject | nullrequired
    • datestringrequired
    • last_seqstringrequired
    • last_hashstringrequired
    • jwsstringrequired
    • key_idstringrequired
  • superseded_byobject | nullrequired
    • actionstringrequired
    • occurred_atstring (date-time)required

get/.well-known/optproof-keys.json#

Receipt and anchor signing keys (JWKS), including retired keys

No credentials

Response 200

  • keysarray of map of anyrequired

get/v1/public/anchors#

Public feed of daily signed anchors

No credentials

Parameters

  • datein querystring
  • cursorin querystring

Response 200

  • dataarray of objectrequired
    • property_idstringrequired
    • datestringrequired
    • last_seqstringrequired
    • last_hashstringrequired
    • jwsstringrequired
  • next_cursorstring | nullrequired

Portal#

Bootstrap data for the hosted preference centre and rights portal.

get/v1/public/portal/{slug}#

Portal bootstrap for a tenant slug

No credentials

Parameters

  • slugin pathstringrequired

Response 200

  • tenantobjectrequired
    • slugstringrequired
    • namestringrequired
    • logo_urlstring | nullrequired
    • brand_colorstring | nullrequired
  • propertiesarray of objectrequired
    • idstringrequired
    • namestringrequired
    • kindstringrequired
    • publishable_keystringrequired
  • default_property_idstringrequired
  • white_labelbooleanrequired

QR and kiosk#

QR landing pages and kiosk mode.

get/v1/public/qr/{short_code}#

Resolve a QR short code to its location and purposes

No credentials

Parameters

  • short_codein pathstringrequired

Response 200

  • short_codestringrequired
  • locationobjectrequired
    • idstringrequired
    • namestringrequired
    • addressstring | nullrequired
  • purpose_keysarray of stringrequired
  • publishable_keystringrequired
  • tenant_slugstringrequired

post/v1/kiosk/session#

Staff unlocks the kiosk with a PIN; returns config for the locked property

Kiosk device token (OptProof-Kiosk)

Request body

  • staff_pinstringrequired

    Pattern ^\d{4,8}$

Response 200

  • session_tokenstringrequired
  • publishable_keystringrequired
  • staff_idstringrequired
  • locationobjectrequired
    • idstringrequired
    • namestringrequired
  • configobjectrequired
    • propertyobjectrequired
      • idstringrequired
      • namestringrequired
      • kindstringrequired

        One of: "web", "app", "location"

      • default_languagestringrequired

        Pattern ^[a-z]{2,3}$

    • tenantobjectrequired
      • slugstringrequired
      • namestringrequired
      • logo_urlstring (uri) | nullrequired
      • white_labelbooleanrequired
    • noticeobjectrequired
      • idstringrequired
      • versionintegerrequired

        Minimum -9007199254740991

      • languagesarray of stringrequired
      • material_changebooleanrequired
    • purposesarray of objectrequired
      • keystringrequired

        Pattern ^[a-z][a-z0-9_]{1,63}$

      • legal_basisstringrequired

        One of: "consent", "legitimate_use"

      • requiredbooleanrequired
      • categorystring | nullrequired

        One of: "essential", "functional", "analytics", "marketing"

      • retention_daysinteger | nullrequired

        Minimum -9007199254740991

    • textsmap of objectrequired
    • uiobjectrequired
      • modestringrequired

        One of: "cookie", "purpose", "both"

      • layoutstringrequired

        One of: "banner", "modal", "slide_in"

      • positionstringrequired

        One of: "bottom", "bottom_left", "bottom_right", "center"

      • themeobjectrequired
        • primarystringrequired
        • backgroundstringrequired
        • textstringrequired
        • radiusintegerrequired

          Minimum 0. Maximum 24

        • font_inheritbooleanrequired
      • repromptstringrequired

        One of: "always", "material"

      • floating_linkbooleanrequired
      • show_badgebooleanrequired
    • linksobjectrequired
      • preference_centrestring (uri)required
      • rights_portalstring (uri)required
      • noticestring (uri)required
      • verifystring (uri)required
    • generated_atstring (date-time)required
  • idle_reset_secondsintegerrequired

    Minimum -9007199254740991

post/v1/kiosk/verify-pin#

Checks a staff PIN (e.g. before leaving kiosk mode); shares the unlock lockout counter

Kiosk device token (OptProof-Kiosk)

Request body

  • staff_pinstringrequired

    Pattern ^\d{4,8}$

Response 200

  • okbooleanrequired

    One of: true

post/v1/kiosk/heartbeat#

Kiosk liveness ping

Kiosk device token (OptProof-Kiosk)

Responds 204 with no body.

Website scanner#

The free website readiness scanner on optproof.in.

post/v1/public/scans#

Free home-page readiness scan

No credentials

Request body

  • urlstring (uri)required
  • emailstring (email)required
  • namestringrequired

    2–120 characters

  • companystring

    Up to 200 characters

  • marketing_consentbooleanrequired
  • captcha_tokenstring

Response 202

  • scan_idstringrequired

get/v1/public/scans/{id}#

Public scan result

No credentials

Parameters

  • idin pathstringrequired

Response 200

  • scanobjectrequired
    • idstringrequired
    • property_idstring | nullrequired
    • urlstring (uri)required
    • modestringrequired

      One of: "public", "tenant", "scheduled"

    • statusstringrequired

      One of: "queued", "running", "succeeded", "failed"

    • pages_crawledintegerrequired

      Minimum -9007199254740991

    • scoreinteger | nullrequired

      Minimum 0. Maximum 100

    • started_atstring (date-time) | nullrequired
    • finished_atstring (date-time) | nullrequired
    • created_atstring (date-time)required
  • findingsarray of objectrequired
    • kindstringrequired

      One of: "form", "tracker", "cookie_pre_consent", "missing_notice", "missing_contact", "missing_checkbox"

    • severitystringrequired

      One of: "info", "low", "medium", "high", "critical"

    • titlestringrequired
    • fixstringrequired
    • urlstringrequired
  • report_urlstring (uri) | nullrequired

Health#

Service health.

get/health#

Liveness/readiness

No credentials

Response 200

  • okbooleanrequired
  • versionstringrequired
  • checksmap of booleanrequired

Generated from docs/api/openapi.json. Regenerate with pnpm --filter @optproof/site openapi.