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
Request body
property_idstringrequiredprincipalobjectrequiredphonestring6–20 characters
emailstring (email)external_idstring1–128 characters
decisionsarray of objectrequiredAt least 1 item
purpose_keystringrequiredPattern ^[a-z][a-z0-9_]{1,63}$
grantedbooleanrequired
notice_versionintegerrequiredGreater than 0
languagestringPattern ^[a-z]{2,3}$. Default "en"
channelstringOne of: "web", "app", "server", "portal", "qr", "kiosk", "whatsapp", "import". Default "server"
occurred_atstring (date-time)contextmap of string | number | booleanDefault {}
store_contactbooleanDefault true
Response 201
principal_refstringrequiredreceiptsarray of objectrequiredevent_idstringrequiredreceipt_codestringrequiredPattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$
receipt_jwsstringrequiredactionstringrequiredOne of: "grant", "deny", "withdraw", "expire"
purpose_keysarray of stringrequiredseqstringrequiredoccurred_atstring (date-time)required
get/v1/consents/check#
Is this purpose currently granted? (GET form — use only with principal_ref; prefer POST)
Parameters
property_idin querystringrequiredpurposein querystringrequiredphonein querystringemailin querystringexternal_idin querystringprincipal_refin querystring
Response 200
grantedbooleanrequiredstatusstring | nullrequiredOne of: "granted", "denied", "withdrawn", "expired"
notice_versioninteger | nullrequiredMinimum -9007199254740991
event_idstring | nullrequiredupdated_atstring (date-time) | nullrequired
post/v1/consents/check#
Is this purpose currently granted for this principal? Call before any marketing send.
Request body
property_idstringrequiredpurposestringrequiredPattern ^[a-z][a-z0-9_]{1,63}$
phonestringemailstringexternal_idstringprincipal_refstring
Response 200
grantedbooleanrequiredstatusstring | nullrequiredOne of: "granted", "denied", "withdrawn", "expired"
notice_versioninteger | nullrequiredMinimum -9007199254740991
event_idstring | nullrequiredupdated_atstring (date-time) | nullrequired
get/v1/consents/events#
Ledger events (cursor-paginated)
Parameters
cursorin querystringlimitin queryintegerproperty_idin querystringactionin querystringOne of: "grant", "deny", "withdraw", "expire"sincein querystringuntilin querystringprincipal_refin querystringreceipt_codein querystring
Response 200
dataarray of objectrequiredidstringrequiredproperty_idstringrequiredseqstringrequiredprincipal_refstring | nullrequireddevice_refstring | nullrequiredactionstringrequiredOne of: "grant", "deny", "withdraw", "expire"
purpose_keysarray of stringrequirednotice_versioninteger | nullrequiredMinimum -9007199254740991
languagestringrequiredPattern ^[a-z]{2,3}$
channelstringrequiredOne of: "web", "app", "server", "portal", "qr", "kiosk", "whatsapp", "import"
contextmap of anyrequiredoccurred_atstring (date-time)requiredrecorded_atstring (date-time)requiredprev_hashstringrequiredhashstringrequiredreceipt_codestringrequiredPattern ^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
Request body
property_idstringrequireddevice_refstring (uuid)requiredprincipalobjectrequiredphonestring6–20 characters
emailstring (email)external_idstring1–128 characters
Response 200
principal_refstringrequiredmerged_eventsintegerrequiredMinimum -9007199254740991
get/v1/principals/{ref}/consents#
Current consent state of a principal
Parameters
property_idin querystringrefin pathstringrequired
Response 200
principal_refstringrequiredpurposesarray of objectrequiredpurpose_keystringrequiredPattern ^[a-z][a-z0-9_]{1,63}$
statusstringrequiredOne of: "granted", "denied", "withdrawn", "expired"
last_event_idstringrequiredupdated_atstring (date-time)required
get/v1/principals/{ref}/history#
Ledger events for a principal
Parameters
cursorin querystringlimitin queryintegerrefin pathstringrequired
Response 200
dataarray of objectrequiredidstringrequiredproperty_idstringrequiredseqstringrequiredprincipal_refstring | nullrequireddevice_refstring | nullrequiredactionstringrequiredOne of: "grant", "deny", "withdraw", "expire"
purpose_keysarray of stringrequirednotice_versioninteger | nullrequiredMinimum -9007199254740991
languagestringrequiredPattern ^[a-z]{2,3}$
channelstringrequiredOne of: "web", "app", "server", "portal", "qr", "kiosk", "whatsapp", "import"
contextmap of anyrequiredoccurred_atstring (date-time)requiredrecorded_atstring (date-time)requiredprev_hashstringrequiredhashstringrequiredreceipt_codestringrequiredPattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$
is_testbooleanrequired
next_cursorstring | nullrequired
get/v1/requests#
Rights requests
Parameters
cursorin querystringlimitin queryintegerstatusin querystringOne of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"typein querystringOne of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"property_idin querystringdue_beforein querystringqin querystringassigned_toin querystring
Response 200
dataarray of objectrequiredidstringrequiredreferencestringrequiredproperty_idstringrequiredtypestringrequiredOne of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"
statusstringrequiredOne of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"
principal_refstring | nullrequiredverified_atstring (date-time) | nullrequireddue_atstring (date-time)requiredassigned_toobject | nullrequireduser_idstringrequiredemailstring (email)requirednamestring | nullrequired
payloadmap of anyrequiredresolutionmap of any | nullrequiredslaobjectrequiredprogressnumberrequiredstagestringrequiredOne of: "ok", "half", "warning", "overdue"
created_atstring (date-time)requiredclosed_atstring (date-time) | nullrequired
next_cursorstring | nullrequired
get/v1/requests/{id}#
A rights request with its timeline
Parameters
idin pathstringrequired
Response 200
requestobjectrequiredidstringrequiredreferencestringrequiredproperty_idstringrequiredtypestringrequiredOne of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"
statusstringrequiredOne of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"
principal_refstring | nullrequiredverified_atstring (date-time) | nullrequireddue_atstring (date-time)requiredassigned_toobject | nullrequireduser_idstringrequiredemailstring (email)requirednamestring | nullrequired
payloadmap of anyrequiredresolutionmap of any | nullrequiredslaobjectrequiredprogressnumberrequiredstagestringrequiredOne of: "ok", "half", "warning", "overdue"
created_atstring (date-time)requiredclosed_atstring (date-time) | nullrequired
eventsarray of objectrequiredidstringrequiredactor_typestringrequiredOne of: "user", "principal", "api_key", "system", "ops"
actor_idstring | nullrequiredactor_labelstring | nullrequiredactionstringrequirednotestring | nullrequiredvisible_to_principalbooleanrequiredatstring (date-time)required
patch/v1/requests/{id}#
Update status, assignee or resolution
Parameters
idin pathstringrequired
Request body
statusstringOne of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"
assigned_tostring | nullresolutionmap of any
Response 200
idstringrequiredreferencestringrequiredproperty_idstringrequiredtypestringrequiredOne of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"
statusstringrequiredOne of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"
principal_refstring | nullrequiredverified_atstring (date-time) | nullrequireddue_atstring (date-time)requiredassigned_toobject | nullrequireduser_idstringrequiredemailstring (email)requirednamestring | nullrequired
payloadmap of anyrequiredresolutionmap of any | nullrequiredslaobjectrequiredprogressnumberrequiredstagestringrequiredOne of: "ok", "half", "warning", "overdue"
created_atstring (date-time)requiredclosed_atstring (date-time) | nullrequired
post/v1/requests/{id}/events#
Add a note, reply or system outcome to a request
Parameters
idin pathstringrequired
Request body
actionstringrequiredOne of: "note", "reply", "system_done", "system_unreachable", "retention_exception"
notestringrequiredUp to 10000 characters
visible_to_principalbooleanDefault false
systemstringreasonstring
Response 201
idstringrequiredactor_typestringrequiredOne of: "user", "principal", "api_key", "system", "ops"
actor_idstring | nullrequiredactor_labelstring | nullrequiredactionstringrequirednotestring | nullrequiredvisible_to_principalbooleanrequiredatstring (date-time)required
post/v1/access-logs#
Record that someone viewed a principal’s record
Request body
principalobjectrequiredphonestring6–20 characters
emailstring (email)external_idstring1–128 characters
viewer_refstringrequired1–128 characters
record_typestringrequired1–64 characters
reasonstringrequired1–500 characters
atstring (date-time)
Response 201
idstringrequiredprincipal_refstringrequiredviewer_refstringrequiredrecord_typestringrequiredreasonstringrequiredatstring (date-time)required
post/v1/imports#
Import existing consents from CSV with evidence
Request body
property_idstringrequiredcsvstringrequiredUp to 5000000 characters
source_descriptionstringrequired3–500 characters
evidence_file_namestringevidence_base64stringcolumn_mapmap of stringDefault {}
Response 202
idstringrequiredproperty_idstringrequiredrowsintegerrequiredMinimum -9007199254740991
importedintegerrequiredMinimum -9007199254740991
failedintegerrequiredMinimum -9007199254740991
statusstringrequiredOne of: "uploaded", "validating", "processing", "completed", "failed"
errorsarray of objectrequiredrowintegerrequiredMinimum -9007199254740991
messagestringrequired
evidence_file_namestring | nullrequiredcreated_atstring (date-time)required
post/v1/exports#
Start an evidence export
Request body
kindstringrequiredOne of: "evidence_pack", "consent_log_csv", "chain_report"
property_idstringfromstring (date-time)tostring (date-time)
Response 202
idstringrequiredkindstringrequiredOne of: "evidence_pack", "consent_log_csv", "chain_report"
statusstringrequiredOne of: "queued", "running", "ready", "failed"
download_urlstring (uri) | nullrequiredmanifest_hashstring | nullrequiredcreated_atstring (date-time)required
get/v1/exports/{id}#
Export status and download link
Parameters
idin pathstringrequired
Response 200
idstringrequiredkindstringrequiredOne of: "evidence_pack", "consent_log_csv", "chain_report"
statusstringrequiredOne of: "queued", "running", "ready", "failed"
download_urlstring (uri) | nullrequiredmanifest_hashstring | nullrequiredcreated_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)
Parameters
pkin querystringlangin querystring
Response 200
propertyobjectrequiredidstringrequirednamestringrequiredkindstringrequiredOne of: "web", "app", "location"
default_languagestringrequiredPattern ^[a-z]{2,3}$
tenantobjectrequiredslugstringrequirednamestringrequiredlogo_urlstring (uri) | nullrequiredwhite_labelbooleanrequired
noticeobjectrequiredidstringrequiredversionintegerrequiredMinimum -9007199254740991
languagesarray of stringrequiredmaterial_changebooleanrequired
purposesarray of objectrequiredkeystringrequiredPattern ^[a-z][a-z0-9_]{1,63}$
legal_basisstringrequiredOne of: "consent", "legitimate_use"
requiredbooleanrequiredcategorystring | nullrequiredOne of: "essential", "functional", "analytics", "marketing"
retention_daysinteger | nullrequiredMinimum -9007199254740991
textsmap of objectrequireduiobjectrequiredmodestringrequiredOne of: "cookie", "purpose", "both"
layoutstringrequiredOne of: "banner", "modal", "slide_in"
positionstringrequiredOne of: "bottom", "bottom_left", "bottom_right", "center"
themeobjectrequiredprimarystringrequiredbackgroundstringrequiredtextstringrequiredradiusintegerrequiredMinimum 0. Maximum 24
font_inheritbooleanrequired
repromptstringrequiredOne of: "always", "material"
floating_linkbooleanrequiredshow_badgebooleanrequired
linksobjectrequiredpreference_centrestring (uri)requiredrights_portalstring (uri)requirednoticestring (uri)requiredverifystring (uri)required
generated_atstring (date-time)required
post/v1/public/consents#
Record consent decisions from the widget or portal
Request body
device_refstring (uuid)decisionsarray of objectrequiredAt least 1 item
purpose_keystringrequiredPattern ^[a-z][a-z0-9_]{1,63}$
grantedbooleanrequired
notice_versionintegerrequiredGreater than 0
languagestringrequiredPattern ^[a-z]{2,3}$
ui_variantstringUp to 64 characters. Default "default"
page_urlstring (uri)Up to 2048 characters
idempotency_keystringrequired8–128 characters
channelstringOne of: "web", "app", "portal", "qr", "kiosk". Default "web"
qr_codestring4–32 characters
Response 201
receiptsarray of objectrequiredevent_idstringrequiredreceipt_codestringrequiredPattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$
receipt_jwsstringrequiredactionstringrequiredOne of: "grant", "deny", "withdraw", "expire"
purpose_keysarray of stringrequiredseqstringrequiredoccurred_atstring (date-time)required
post/v1/public/consents/withdraw#
Withdraw consent (device-only or with principal token)
Request body
device_refstring (uuid)purpose_keysarray of string | stringrequiredAt least 1 item
languagestringPattern ^[a-z]{2,3}$. Default "en"
idempotency_keystringrequired8–128 characters
Response 201
receiptsarray of objectrequiredevent_idstringrequiredreceipt_codestringrequiredPattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$
receipt_jwsstringrequiredactionstringrequiredOne of: "grant", "deny", "withdraw", "expire"
purpose_keysarray of stringrequiredseqstringrequiredoccurred_atstring (date-time)required
get/v1/public/device/consents#
Current consent state for this device (no OTP)
Parameters
device_refin querystringrequired
Response 200
property_idstringrequiredpurposesarray of objectrequiredpurpose_keystringrequiredPattern ^[a-z][a-z0-9_]{1,63}$
statusstring | nullrequiredOne of: "granted", "denied", "withdrawn", "expired"
requiredbooleanrequiredupdated_atstring (date-time) | nullrequiredlast_receipt_codestring | nullrequiredPattern ^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)
Request body
device_refstring (uuid)requiredphonestring6–20 characters
emailstring (email)
Response 200
linkedbooleanrequired
post/v1/public/otp/send#
Send a one-time code to a phone or email
Request body
channelstringrequiredOne of: "sms", "email", "whatsapp"
phonestring6–20 characters
emailstring (email)purposestringrequiredOne of: "preferences", "request", "consent"
languagestringPattern ^[a-z]{2,3}$. Default "en"
Response 200
challenge_idstringrequiredexpires_atstring (date-time)required
post/v1/public/otp/verify#
Verify a one-time code and get a 15-minute principal token
Request body
challenge_idstringrequiredcodestringrequiredPattern ^\d{6}$
device_refstring (uuid)
Response 200
principal_tokenstringrequiredexpires_atstring (date-time)required
get/v1/public/me/consents#
Current consent state for the verified principal
Response 200
property_idstringrequiredpurposesarray of objectrequiredpurpose_keystringrequiredPattern ^[a-z][a-z0-9_]{1,63}$
statusstring | nullrequiredOne of: "granted", "denied", "withdrawn", "expired"
requiredbooleanrequiredupdated_atstring (date-time) | nullrequiredlast_receipt_codestring | nullrequiredPattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$
get/v1/public/me/receipts#
Receipt history for the verified principal
Response 200
receiptsarray of objectrequiredevent_idstringrequiredreceipt_codestringrequiredPattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$
receipt_jwsstringrequiredactionstringrequiredOne of: "grant", "deny", "withdraw", "expire"
purpose_keysarray of stringrequiredseqstringrequiredoccurred_atstring (date-time)requiredchannelstringrequirednotice_versioninteger | nullrequiredMinimum -9007199254740991
post/v1/public/requests#
File a rights request (access, correction, erasure, grievance, …)
Request body
typestringrequiredOne of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"
descriptionstringUp to 5000 characters. Default ""
detailsmap of stringDefault {}
languagestringPattern ^[a-z]{2,3}$. Default "en"
Response 201
referencestringrequiredstatusstringrequiredOne of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"
due_atstring (date-time)required
get/v1/public/requests/{reference}#
Status of a rights request
Parameters
referencein pathstringrequired
Response 200
referencestringrequiredtypestringrequiredOne of: "access", "correction", "update", "erasure", "grievance", "nomination", "withdraw_all"
statusstringrequiredOne of: "new", "verifying", "open", "waiting_tenant", "resolved", "rejected"
created_atstring (date-time)requireddue_atstring (date-time)requiredclosed_atstring (date-time) | nullrequiredtimelinearray of objectrequiredatstring (date-time)requiredmessagestringrequired
post/v1/public/telemetry#
Widget error/timing telemetry (no personal data)
Request body
kindstringrequiredOne of: "error", "timing"
messagestringrequiredUp to 500 characters
widget_versionstringrequiredUp to 32 characters
ua_hashstringUp 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)
Parameters
codein pathstringrequired
Response 200
receipt_codestringrequiredPattern ^OP-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$
receipt_jwsstringrequiredpropertyobjectrequiredidstringrequirednamestringrequiredtenant_namestringrequired
segmentarray of objectrequiredseqstringrequiredprev_hashstringrequiredhashstringrequiredcanonicalstringrequired
anchorobject | nullrequireddatestringrequiredlast_seqstringrequiredlast_hashstringrequiredjwsstringrequiredkey_idstringrequired
superseded_byobject | nullrequiredactionstringrequiredoccurred_atstring (date-time)required
get/.well-known/optproof-keys.json#
Receipt and anchor signing keys (JWKS), including retired keys
Response 200
keysarray of map of anyrequired
get/v1/public/anchors#
Public feed of daily signed anchors
Parameters
datein querystringcursorin querystring
Response 200
dataarray of objectrequiredproperty_idstringrequireddatestringrequiredlast_seqstringrequiredlast_hashstringrequiredjwsstringrequired
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
Parameters
slugin pathstringrequired
Response 200
tenantobjectrequiredslugstringrequirednamestringrequiredlogo_urlstring | nullrequiredbrand_colorstring | nullrequired
propertiesarray of objectrequiredidstringrequirednamestringrequiredkindstringrequiredpublishable_keystringrequired
default_property_idstringrequiredwhite_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
Parameters
short_codein pathstringrequired
Response 200
short_codestringrequiredlocationobjectrequiredidstringrequirednamestringrequiredaddressstring | nullrequired
purpose_keysarray of stringrequiredpublishable_keystringrequiredtenant_slugstringrequired
post/v1/kiosk/session#
Staff unlocks the kiosk with a PIN; returns config for the locked property
Request body
staff_pinstringrequiredPattern ^\d{4,8}$
Response 200
session_tokenstringrequiredpublishable_keystringrequiredstaff_idstringrequiredlocationobjectrequiredidstringrequirednamestringrequired
configobjectrequiredpropertyobjectrequiredidstringrequirednamestringrequiredkindstringrequiredOne of: "web", "app", "location"
default_languagestringrequiredPattern ^[a-z]{2,3}$
tenantobjectrequiredslugstringrequirednamestringrequiredlogo_urlstring (uri) | nullrequiredwhite_labelbooleanrequired
noticeobjectrequiredidstringrequiredversionintegerrequiredMinimum -9007199254740991
languagesarray of stringrequiredmaterial_changebooleanrequired
purposesarray of objectrequiredkeystringrequiredPattern ^[a-z][a-z0-9_]{1,63}$
legal_basisstringrequiredOne of: "consent", "legitimate_use"
requiredbooleanrequiredcategorystring | nullrequiredOne of: "essential", "functional", "analytics", "marketing"
retention_daysinteger | nullrequiredMinimum -9007199254740991
textsmap of objectrequireduiobjectrequiredmodestringrequiredOne of: "cookie", "purpose", "both"
layoutstringrequiredOne of: "banner", "modal", "slide_in"
positionstringrequiredOne of: "bottom", "bottom_left", "bottom_right", "center"
themeobjectrequiredprimarystringrequiredbackgroundstringrequiredtextstringrequiredradiusintegerrequiredMinimum 0. Maximum 24
font_inheritbooleanrequired
repromptstringrequiredOne of: "always", "material"
floating_linkbooleanrequiredshow_badgebooleanrequired
linksobjectrequiredpreference_centrestring (uri)requiredrights_portalstring (uri)requirednoticestring (uri)requiredverifystring (uri)required
generated_atstring (date-time)required
idle_reset_secondsintegerrequiredMinimum -9007199254740991
post/v1/kiosk/verify-pin#
Checks a staff PIN (e.g. before leaving kiosk mode); shares the unlock lockout counter
Request body
staff_pinstringrequiredPattern ^\d{4,8}$
Response 200
okbooleanrequiredOne of: true
post/v1/kiosk/heartbeat#
Kiosk liveness ping
Responds 204 with no body.
Website scanner#
The free website readiness scanner on optproof.in.
post/v1/public/scans#
Free home-page readiness scan
Request body
urlstring (uri)requiredemailstring (email)requirednamestringrequired2–120 characters
companystringUp to 200 characters
marketing_consentbooleanrequiredcaptcha_tokenstring
Response 202
scan_idstringrequired
get/v1/public/scans/{id}#
Public scan result
Parameters
idin pathstringrequired
Response 200
scanobjectrequiredidstringrequiredproperty_idstring | nullrequiredurlstring (uri)requiredmodestringrequiredOne of: "public", "tenant", "scheduled"
statusstringrequiredOne of: "queued", "running", "succeeded", "failed"
pages_crawledintegerrequiredMinimum -9007199254740991
scoreinteger | nullrequiredMinimum 0. Maximum 100
started_atstring (date-time) | nullrequiredfinished_atstring (date-time) | nullrequiredcreated_atstring (date-time)required
findingsarray of objectrequiredkindstringrequiredOne of: "form", "tracker", "cookie_pre_consent", "missing_notice", "missing_contact", "missing_checkbox"
severitystringrequiredOne of: "info", "low", "medium", "high", "critical"
titlestringrequiredfixstringrequiredurlstringrequired
report_urlstring (uri) | nullrequired
Health#
Service health.
get/health#
Liveness/readiness
Response 200
okbooleanrequiredversionstringrequiredchecksmap of booleanrequired
Generated from docs/api/openapi.json. Regenerate with pnpm --filter @optproof/site openapi.