{"openapi":"3.1.0","info":{"title":"CAIB Registry API","description":"Canonical registry read API (v1). See **Registry/registry.md** for unit types (BAM, BIO, ETU, HRU, JCU, MAR, NCU, SKU, SOU), **payload** semantics, and **caib_domain_value**. Send **X-API-Key** with a previously issued or operator key; if you omit it, the response includes **X-Registry-Key** with a new key (no extra round-trip). Without **X-API-Key**, limits are per IP (stricter); with a key, per key (higher). **429** / **Retry-After** when exceeded. Each entity includes **verify_url** when **REGISTRY_VERIFY_BASE_URL** is set. **POST /v1/verify-events** logs billable verification events (requires **REGISTRY_VERIFY_EVENT_KEYS**). Optional headers **User-Agent** and **X-Client-Name** update minted-key metadata. **POST /v1/client-profile** completes a minted client profile for higher keyed rate limits. **GET/POST /v1/verify-scope-attribution*** are for verify.caib.io only (same verify-event key). **POST /v1/operator/entities** creates catalogue rows (**REGISTRY_API_KEYS** only), e.g. manual-ingest promotion; **POST /v1/operator/promote-domain-dns** publishes **pending_domain_proof** rows after DNS TXT verification; **PATCH /v1/operator/entities/{id}** updates an existing row.","version":"1.0.0"},"paths":{"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Root Redirect To Entity List","description":"Default view: global or tenant-scoped JSON catalogue at **GET /v1/entities** (Host still scopes bridges).","operationId":"root_redirect_to_entity_list__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/public/dns-instructions":{"get":{"summary":"Public Dns Instructions","description":"**Public — no `X-API-Key` (no minting).** Canonical CNAME target for customer DNS (`caib.<apex>` → registry).\nUser dashboard (`user.caib.io`) should use this JSON (or mirror `REGISTRY_CNAME_TARGET` in env) when showing DNS rows.","operationId":"public_dns_instructions_v1_public_dns_instructions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsInstructionsOut"}}}}}}},"/v1/entities":{"get":{"summary":"Search Entities","description":"List registry entities with optional filters (aligns with registry.md scoping).","operationId":"search_entities_v1_entities_get","parameters":[{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant apex domain filter (**tenant_domain** column). If omitted and **Host** is **caib.<apex>**, defaults to **apex** (e.g. Host caib.caib.io → filter caib.io). If omitted on **registry.caib.io**, no tenant filter (global listing).","title":"Domain"},"description":"Tenant apex domain filter (**tenant_domain** column). If omitted and **Host** is **caib.<apex>**, defaults to **apex** (e.g. Host caib.caib.io → filter caib.io). If omitted on **registry.caib.io**, no tenant filter (global listing)."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Unit type filter. Documented: BAM, BIO, ETU, HRU, JCU, MAR, NCU, SKU, SOU.","title":"Type"},"description":"Unit type filter. Documented: BAM, BIO, ETU, HRU, JCU, MAR, NCU, SKU, SOU."},{"name":"lifecycle","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Lifecycle filter — **honoured only for REGISTRY_API_KEYS (operator)**. Public and minted clients always receive **published** rows only; draft, staging, and pending_domain_proof are never returned.","default":"published","title":"Lifecycle"},"description":"Lifecycle filter — **honoured only for REGISTRY_API_KEYS (operator)**. Public and minted clients always receive **published** rows only; draft, staging, and pending_domain_proof are never returned."},{"name":"caib_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by caib_domain_value (individual / non-DNS scope id).","title":"Caib Domain"},"description":"Filter by caib_domain_value (individual / non-DNS scope id)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring search on title and body (FTS later).","title":"Q"},"description":"Substring search on title and body (FTS later)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Client-Name","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Client-Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/entities/{entity_id}":{"get":{"summary":"Get One","operationId":"get_one_v1_entities__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Client-Name","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Client-Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/entities":{"post":{"summary":"Post Operator Entity","description":"Create one entity row (**operator key only** — must match **REGISTRY_API_KEYS**).\nUsed to promote **`ingest_manual_drafts`** from the user app, including **`display_url`**.","operationId":"post_operator_entity_v1_operator_entities_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Client-Name","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Client-Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorEntityCreateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/entities/{entity_id}":{"patch":{"summary":"Patch Operator Entity","description":"Patch fields on an existing entity (trusted backends / user.caib.io after tenant checks).","operationId":"patch_operator_entity_v1_operator_entities__entity_id__patch","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Client-Name","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Client-Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorEntityUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/promote-domain-dns":{"post":{"summary":"Post Operator Promote Domain Dns","description":"After **user.caib.io** confirms **_caib.&lt;apex&gt;** TXT, call this to set **lifecycle**\nfrom **pending_domain_proof** → **published** for all rows with that **tenant_domain**.","operationId":"post_operator_promote_domain_dns_v1_operator_promote_domain_dns_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Client-Name","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Client-Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorPromoteDomainDnsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorPromoteDomainDnsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/entities/{entity_id}/audit-events":{"get":{"summary":"Get Operator Entity Audit Events","description":"List **entity_audit_events** for one entity (newest first). Operator key only.","operationId":"get_operator_entity_audit_events_v1_operator_entities__entity_id__audit_events_get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Client-Name","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Client-Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityAuditListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/client-profile":{"post":{"summary":"Post Client Profile","description":"Complete **minted** client profile (display name, contact, model/tool) for **higher** keyed rate limits.\nOperator keys (**REGISTRY_API_KEYS**) are already trusted and do not use this endpoint.","operationId":"post_client_profile_v1_client_profile_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"User-Agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}},{"name":"X-Client-Name","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Client-Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientProfileIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify-events":{"post":{"summary":"Post Verify Event","description":"Log a **billable** (or non-billable) verification event from **verify.caib.io** or another trusted caller.\nDoes not replace the human-facing page — that host loads **GET /v1/entities/{id}** for the hero row\nand **GET /v1/entities?domain=...** for related entries.","operationId":"post_verify_event_v1_verify_events_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEventIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEventOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify-scope-attribution-status":{"get":{"summary":"Get Verify Scope Attribution Status","description":"Crowdsourced “which assistant sent you?” state for a scope (verify.caib.io only).","operationId":"get_verify_scope_attribution_status_v1_verify_scope_attribution_status_get","parameters":[{"name":"scope_key","in":"query","required":true,"schema":{"type":"string","description":"Tenant scope key (same string the verify app uses).","title":"Scope Key"},"description":"Tenant scope key (same string the verify app uses)."},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScopeAttributionStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify-scope-attribution":{"post":{"summary":"Post Verify Scope Attribution","description":"Record one human vote per (scope, billing session); resolve after enough matching votes.","operationId":"post_verify_scope_attribution_v1_verify_scope_attribution_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScopeAttributionVoteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScopeAttributionVoteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ClientProfileIn":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"model_or_tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Or Tool"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"ClientProfileIn","description":"Optional fields; set at least one to complete profile for higher rate limits."},"ClientProfileOut":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"profile_complete":{"type":"boolean","title":"Profile Complete","default":true}},"type":"object","title":"ClientProfileOut"},"DnsInstructionsOut":{"properties":{"cname_target":{"type":"string","title":"Cname Target","description":"FQDN (no scheme) that `caib.<tenant_apex>` should CNAME to."},"txt_record_prefix":{"type":"string","title":"Txt Record Prefix","description":"TXT record lives at `_caib.<apex>`; verification value is issued by user.caib.io.","default":"_caib"},"caib_subdomain_prefix":{"type":"string","title":"Caib Subdomain Prefix","description":"Subdomain under customer apex for machine-readable identity / discovery.","default":"caib"},"spec":{"type":"string","title":"Spec","description":"Human-readable specification path in the repo.","default":"Registry/registry.md"}},"type":"object","required":["cname_target"],"title":"DnsInstructionsOut","description":"Canonical DNS contract for customer apex: **CNAME** `caib.<apex>` → registry (see Registry/registry.md)."},"EntityAuditEventOut":{"properties":{"id":{"type":"string","title":"Id"},"entity_id":{"type":"string","title":"Entity Id"},"tenant_domain":{"type":"string","title":"Tenant Domain"},"event_type":{"type":"string","title":"Event Type"},"actor_type":{"type":"string","title":"Actor Type"},"actor_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Subject"},"actor_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor User Id"},"from_lifecycle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Lifecycle"},"to_lifecycle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Lifecycle"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"detail":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detail"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","entity_id","tenant_domain","event_type","actor_type","created_at"],"title":"EntityAuditEventOut","description":"One row from **entity_audit_events** (operator read)."},"EntityAuditListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EntityAuditEventOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"EntityAuditListOut"},"EntityListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EntityOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"EntityListResponse"},"EntityOut":{"properties":{"id":{"type":"string","title":"Id","description":"Stable entity id (UUID)."},"tenant_domain":{"type":"string","title":"Tenant Domain","description":"Tenant apex domain for scoping; may be empty when only caib_domain_value applies."},"type":{"type":"string","title":"Type","description":"Unit type designator. Documented set: BAM, BIO, ETU, HRU, JCU, MAR, NCU, SKU, SOU."},"lifecycle":{"type":"string","title":"Lifecycle","description":"draft | staging | published | pending_domain_proof (awaiting DNS authority for tenant — see registry.md / ingest.md)."},"title":{"type":"string","title":"Title"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"Long description or summary text."},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"caib_domain_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caib Domain Value","description":"CAIB-assigned scope id for rows without a natural apex domain (e.g. BIO job-seeker profiles)."},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload","description":"Type-specific fields (JSON object). SKU manufacturer / part identity: payload.manufacturer_id and payload.mpn when used — not top-level entity fields."},"display_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Url","description":"HTTPS URL where this entity is primarily shown on the tenant's own site (or profile URL for BIO). Third-party links (e.g. payment) belong in payload."},"ingest_intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingest Intent","description":"Supplier intent from user.caib.io: **draft** or **publish** (drives DNS promotion policy)."},"verify_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verify Url","description":"Link to the public verification page on verify.caib.io (when REGISTRY_VERIFY_BASE_URL is set). Query param name defaults to registryid."}},"type":"object","required":["id","tenant_domain","type","lifecycle","title","created_at","updated_at"],"title":"EntityOut","description":"Core entity row + type-specific JSON payload (e.g. SKU manufacturer_id/mpn live in payload only)."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"OperatorAuditIn":{"properties":{"actor_type":{"type":"string","title":"Actor Type","description":"e.g. **user**, **system**, **operator**.","default":"user"},"actor_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Subject","description":"Human-readable actor (e.g. signed-in email on user.caib.io)."},"actor_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor User Id","description":"Opaque user id from the caller."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Caller label: e.g. user_csv_ingest, user_ingest_edit, promote_domain_dns."},"detail":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detail","description":"Small JSON blob (filename, row index, etc.)."},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name","description":"X-Client-Name equivalent for audit."}},"additionalProperties":false,"type":"object","title":"OperatorAuditIn","description":"Optional attribution for **entity_audit_events** (operator writes)."},"OperatorEntityCreateIn":{"properties":{"tenant_domain":{"type":"string","title":"Tenant Domain","description":"Tenant apex domain for scoping."},"type":{"type":"string","title":"Type","description":"Unit type designator. Documented: BAM, BIO, ETU, HRU, JCU, MAR, NCU, SKU, SOU."},"lifecycle":{"type":"string","title":"Lifecycle","description":"e.g. pending_domain_proof for new rows before DNS proof (ingest.md).","default":"pending_domain_proof"},"title":{"type":"string","title":"Title"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"},"caib_domain_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caib Domain Value"},"display_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Url","description":"Primary presentation URL on the tenant's own site (not third-party checkout)."},"source_draft_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Draft Id","description":"Optional caller reference (e.g. ingest_manual_drafts.id); ignored for storage."},"ingest_intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingest Intent","description":"**draft** | **publish** — stored on the row; affects DNS promotion (registry.md)."},"audit":{"anyOf":[{"$ref":"#/components/schemas/OperatorAuditIn"},{"type":"null"}],"description":"If set, writes **entity_created** to **entity_audit_events**."}},"type":"object","required":["tenant_domain","type","title"],"title":"OperatorEntityCreateIn","description":"Trusted operator create (manual-ingest promotion, harvester, etc.). **REGISTRY_API_KEYS** only."},"OperatorEntityUpdateIn":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"},"lifecycle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifecycle"},"display_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Url"},"ingest_intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingest Intent"},"audit":{"anyOf":[{"$ref":"#/components/schemas/OperatorAuditIn"},{"type":"null"}],"description":"If set, logs **lifecycle_changed** / **entity_fields_updated** / **ingest_intent_changed** as applicable."}},"additionalProperties":false,"type":"object","title":"OperatorEntityUpdateIn","description":"Partial update (**REGISTRY_API_KEYS** only). Omitted fields are left unchanged."},"OperatorPromoteDomainDnsIn":{"properties":{"tenant_domain":{"type":"string","title":"Tenant Domain","description":"Tenant apex domain, e.g. example.com"},"audit":{"anyOf":[{"$ref":"#/components/schemas/OperatorAuditIn"},{"type":"null"}],"description":"If set, each promoted row gets a **dns_authority_resolved** audit event."}},"type":"object","required":["tenant_domain"],"title":"OperatorPromoteDomainDnsIn","description":"Resolve **pending_domain_proof** per **ingest_intent** after TXT verification (user app)."},"OperatorPromoteDomainDnsOut":{"properties":{"updated":{"type":"integer","title":"Updated","description":"Number of entity rows moved to published."}},"type":"object","required":["updated"],"title":"OperatorPromoteDomainDnsOut"},"ScopeAttributionStatusOut":{"properties":{"resolved_referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Referrer"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"}},"type":"object","title":"ScopeAttributionStatusOut"},"ScopeAttributionVoteIn":{"properties":{"scope_key":{"type":"string","title":"Scope Key"},"referrer_label":{"type":"string","maxLength":120,"title":"Referrer Label"},"session_key":{"type":"string","maxLength":80,"title":"Session Key","description":"Billing session id from verify page (one vote per session per scope)."}},"type":"object","required":["scope_key","referrer_label","session_key"],"title":"ScopeAttributionVoteIn"},"ScopeAttributionVoteOut":{"properties":{"resolved":{"type":"boolean","title":"Resolved"},"resolved_referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Referrer"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"},"duplicate_vote":{"type":"boolean","title":"Duplicate Vote","default":false}},"type":"object","required":["resolved"],"title":"ScopeAttributionVoteOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyEventIn":{"properties":{"entity_id":{"type":"string","title":"Entity Id","description":"Registry entity id (same as registryid on the verify page)."},"event_type":{"type":"string","title":"Event Type","description":"e.g. verify_page_view, verify_engaged, verify_confirmed (product-defined)."},"billable":{"type":"boolean","title":"Billable","description":"Whether this event is billable (default true).","default":true},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Optional caller label (e.g. verify-web-1)."},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Extra JSON for billing / analytics."}},"type":"object","required":["entity_id","event_type"],"title":"VerifyEventIn","description":"Called by verify.caib.io (or other trusted backend) to log billable verification events."},"VerifyEventOut":{"properties":{"id":{"type":"string","title":"Id"},"entity_id":{"type":"string","title":"Entity Id"},"logged":{"type":"boolean","title":"Logged","default":true}},"type":"object","required":["id","entity_id"],"title":"VerifyEventOut"}},"securitySchemes":{"RegistryKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Optional on first request. Omit to receive a new key in **X-Registry-Key** on the same response. Operator keys may be set via REGISTRY_API_KEYS on the server."}},"responses":{"TooManyRequests":{"description":"Rate limit exceeded; see Retry-After header (seconds).","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until the limit resets."}}}}},"security":[{"RegistryKey":[]}]}