{"openapi":"3.1.0","info":{"title":"Acretix Verify API","version":"2026-10-11"},"servers":[{"url":"/v1"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Tenant API key (Bearer)."}},"schemas":{"Problem":{"type":"object","description":"Error body sent as application/problem+json. The code is a catalogue code listed on the docs error reference.","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"code":{"type":"string"},"fix":{"type":"string"}},"required":["type","title","status","code","fix"]},"AiRecordFigure":{"type":"object","properties":{"count":{"type":"integer"},"sample":{"type":"integer"},"rate":{"type":["number","null"]},"too_few_to_show":{"type":"boolean"},"first":{"type":["string","null"],"format":"date-time"},"last":{"type":["string","null"],"format":"date-time"}},"required":["count","sample","rate","too_few_to_show","first","last"],"additionalProperties":false},"AiRecord":{"type":"object","properties":{"tenant_id":{"type":"string","format":"uuid"},"from":{"type":"string","format":"date"},"to":{"type":"string","format":"date"},"source":{"type":"string","enum":["feedback"]},"figures":{"type":"object","properties":{"agreement":{"$ref":"#/components/schemas/AiRecordFigure"},"false_met":{"$ref":"#/components/schemas/AiRecordFigure"},"overturn":{"$ref":"#/components/schemas/AiRecordFigure"},"abstention":{"$ref":"#/components/schemas/AiRecordFigure"}},"required":["agreement","false_met","overturn","abstention"],"additionalProperties":false},"disputed":{"type":"object","properties":{"count":{"type":"integer"}},"required":["count"],"additionalProperties":false},"by_model":{"type":"string","enum":["not_split_for_feedback"]},"test_split":{"type":"string","enum":["not_yet_available"]},"escalations":{"type":"string","enum":["not_yet_available"]}},"required":["tenant_id","from","to","source","figures","disputed","by_model","test_split","escalations"],"additionalProperties":false},"CriterionPrimitive":{"type":"string","description":"Evaluation primitive a rubric criterion runs. The deterministic primitives are zero-AI-cost and bound input at 256 KiB; llm_judge runs the tiered LLM-as-judge path.","oneOf":[{"const":"regex_match@1","description":"Submission must — or, with config.must_match=false, must-not — match a configured regular expression. Patterns are ReDoS-screened at compile and at runtime."},{"const":"json_schema@1","description":"Submission must conform to a configured JSON Schema (type/enum/const, string/number/array bounds, required and additionalProperties)."},{"const":"numeric_threshold@1","description":"A finite numeric value — read from the submission at config.path (default: the whole value; inline JSON is parsed) — compared by config.operator (gt|gte|lt|lte|eq|between; default gte) against config.threshold (or the criterion threshold), or config.min/config.max for between, with optional config.tolerance."},{"const":"llm_judge@1","description":"LLM-as-judge qualitative evaluation of the submission against the criterion, routed through the judge tier map."}]},"RoleBlob":{"description":"A role payload: free text, or a structured object (canonicalized for hashing/display).","oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]},"RoleAttachment":{"type":"object","description":"A labeled attachment inside context[]/evidence[].","properties":{"label":{"type":"string","maxLength":256,"description":"Optional human label, e.g. \"source\", \"retrieved-passage-1\"."},"type":{"type":"string","maxLength":256,"description":"Optional content/type hint."},"value":{"$ref":"#/components/schemas/RoleBlob"},"trust_tier":{"$ref":"#/components/schemas/TrustTier"},"source_id":{"type":["string","null"],"format":"uuid"},"evidence_packet_id":{"type":"string","format":"uuid"}},"required":["value"],"additionalProperties":false},"InlineSubmission":{"type":"object","description":"Legacy/simple submission: the work to judge, inline. UNCHANGED — every existing caller keeps working verbatim.","properties":{"inline":{"type":"string","description":"The submission content (≤ 512 KiB)."},"content_type":{"type":"string","maxLength":256}},"required":["inline"],"additionalProperties":false},"UriSubmission":{"type":"object","description":"Stored-by-reference submission. UNCHANGED. The API never fetches tenant uris on the request path (https:// or r2://; ≤ 2048 chars; no embedded credentials).","properties":{"uri":{"type":"string","maxLength":2048,"description":"https:// or r2:// reference."},"content_type":{"type":"string","maxLength":256}},"required":["uri"],"additionalProperties":false},"TypedSubmission":{"type":"object","description":"Contract 05 typed roles (all OPTIONAL except output-or-its-alias). The judge receives each role LABELED. Back-compat: if `output` is absent but the legacy `content` or `text` is present, it is treated AS `output`.","properties":{"input":{"$ref":"#/components/schemas/RoleBlob","description":"What was ASKED — the question/instruction/task the output answered."},"output":{"$ref":"#/components/schemas/RoleBlob","description":"REQUIRED (or its alias content/text) — the thing being JUDGED."},"content":{"$ref":"#/components/schemas/RoleBlob","deprecated":true,"description":"Legacy alias for `output` (used only when `output` is absent)."},"text":{"$ref":"#/components/schemas/RoleBlob","deprecated":true,"description":"Legacy alias for `output` (used only when `output` is absent)."},"context":{"type":"array","items":{"$ref":"#/components/schemas/RoleAttachment"},"description":"The AUTHORITATIVE source(s) the output is judged AGAINST. Faithfulness/grounding criteria treat claims un-grounded in (or contradicted by) the context as violations."},"reference":{"$ref":"#/components/schemas/RoleBlob","description":"The EXPECTED / gold answer to compare against, when supplied."},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/RoleAttachment"},"description":"Other supporting material — rendered NON-authoritative (weighed, but not ground truth)."},"values":{"type":"object","additionalProperties":true,"description":"Structured fields for deterministic numeric/json checks."},"content_type":{"type":"string","maxLength":256}},"anyOf":[{"required":["output"]},{"required":["content"]},{"required":["text"]}],"additionalProperties":false},"Submission":{"description":"A submission is ONE of: {inline} (simple text — unchanged), {uri} (stored-by-reference — unchanged), or the Contract 05 typed roles object (input/output/context/reference/evidence/values). The typed variant is fully additive: existing {inline}/{uri} callers are not affected.","oneOf":[{"$ref":"#/components/schemas/InlineSubmission"},{"$ref":"#/components/schemas/UriSubmission"},{"$ref":"#/components/schemas/TypedSubmission"}]},"VerifyOptions":{"type":"object","properties":{"max_judge_tier":{"type":"integer","enum":[1,2,3],"description":"Cap the judge tier for this request."},"require_proof":{"type":"boolean","default":true},"wait_ms":{"type":"integer","minimum":0,"maximum":60000,"description":"Bounded-sync opt-in: block up to wait_ms for the finished verdict, else fall back to 202."}},"additionalProperties":false},"VerifyRequest":{"type":"object","description":"POST /v1/verify request. `rubric_id` is required (compile rubrics first via POST /v1/rubrics). Idempotency is a header (`Idempotency-Key`), not a body field.","properties":{"rubric_id":{"type":"string","format":"uuid"},"submission":{"$ref":"#/components/schemas/Submission"},"reference_set_id":{"type":"string","format":"uuid"},"identity_rung":{"type":"string","enum":["unverified","email_verified","domain_distinct","payment_verified","entity_verified"],"description":"The asserting tenant's identity-assurance attestation; never inferred or defaulted by Acretix."},"options":{"$ref":"#/components/schemas/VerifyOptions"},"callback_url":{"type":"string","format":"uri","description":"Optional per-request override of the registered webhook endpoints."},"subject":{"type":"object","properties":{"kind":{"type":"string","enum":["pull_request","task","deal_criterion"]},"ref":{"type":"string","minLength":1,"maxLength":200}},"required":["kind","ref"],"additionalProperties":false}},"required":["rubric_id","submission"],"additionalProperties":false},"RubricIssue":{"type":"object","description":"Compiler issue for an authored rubric spec.","properties":{"severity":{"type":"string","enum":["error","warning"]},"code":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"}},"required":["severity","code","path","message"],"additionalProperties":false},"RubricCompilePreview":{"description":"Non-registering compile preview for rubric authoring.","oneOf":[{"type":"object","properties":{"ok":{"const":true},"hash":{"type":"string","description":"rubric_hash: sha-256 of the canonical compiled rubric spec."},"source_hash":{"type":"string","description":"sha-256 of the canonical authored rubric spec."},"issues":{"type":"array","items":{"$ref":"#/components/schemas/RubricIssue"}}},"required":["ok","hash","source_hash","issues"],"additionalProperties":false},{"type":"object","properties":{"ok":{"const":false},"issues":{"type":"array","items":{"$ref":"#/components/schemas/RubricIssue"}}},"required":["ok","issues"],"additionalProperties":false}]},"RubricExamplesRequest":{"type":"object","description":"Run up to five marked submissions against a newly stored draft rubric version.","properties":{"spec":{"type":"object","description":"Authored rubric specification to compile and store as a draft."},"examples":{"type":"array","maxItems":5,"items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":120},"mark":{"type":"string","enum":["should_pass","should_fail"]},"submission":{"$ref":"#/components/schemas/Submission"}},"required":["label","mark","submission"],"additionalProperties":false}}},"required":["spec","examples"],"additionalProperties":false},"RubricExamplesResult":{"type":"object","properties":{"rubric":{"type":"object","properties":{"rubric_id":{"type":"string","format":"uuid"},"version":{"type":"integer","minimum":1},"hash":{"type":"string"},"status":{"const":"draft"}},"required":["rubric_id","version","hash","status"],"additionalProperties":false},"examples":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","minimum":0},"label":{"type":"string"},"mark":{"type":"string","enum":["should_pass","should_fail"]},"verification_id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/VerificationStatus"},"determination":{"oneOf":[{"$ref":"#/components/schemas/Determination"},{"type":"null"}]},"criteria":{"type":"array","items":{"type":"object","properties":{"criterion_id":{"type":"string","format":"uuid"},"determination":{"$ref":"#/components/schemas/Determination"}},"required":["criterion_id","determination"],"additionalProperties":false}},"outcome":{"type":"string","enum":["agrees","contradicts","undetermined"]}},"required":["index","label","mark","verification_id","status","determination","criteria","outcome"],"additionalProperties":false}}},"required":["rubric","examples"],"additionalProperties":false},"RubricSummary":{"type":"object","description":"Compact rubric row in the list surface (no spec body / criteria).","properties":{"rubric_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"version":{"type":"integer","minimum":1},"rubric_hash":{"type":"string","description":"sha-256 of the canonical compiled rubric spec."},"hash":{"type":"string","description":"Alias of rubric_hash."},"source_hash":{"type":["string","null"],"description":"sha-256 of the canonical authored spec."},"status":{"type":"string"},"created_at":{"type":"string"}},"required":["rubric_id","name","version","rubric_hash","hash","status","created_at"],"additionalProperties":false},"RubricList":{"type":"object","description":"GET /v1/rubrics — the tenant's rubrics, latest version per name, newest first.","properties":{"rubrics":{"type":"array","items":{"$ref":"#/components/schemas/RubricSummary"}},"limit":{"type":["integer","null"],"description":"Echo of the requested page size (clamped to [1,100])."},"offset":{"type":["integer","null"],"description":"Echo of the requested offset."}},"required":["rubrics"],"additionalProperties":false},"RubricTemplate":{"type":"object","properties":{"slug":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"spec":{"type":"object"}},"required":["slug","label","description","spec"],"additionalProperties":false},"RubricTemplateList":{"type":"object","properties":{"tenant_id":{"type":"string"},"templates":{"type":"array","items":{"$ref":"#/components/schemas/RubricTemplate"}}},"required":["tenant_id","templates"],"additionalProperties":false},"InductionExample":{"type":"object","description":"One labeled outcome example. The labels are the canonical Determination values.","properties":{"id":{"type":"string","maxLength":128,"description":"Stable id used in the explained/unexplained report (defaults to the array index)."},"output":{"$ref":"#/components/schemas/RoleBlob","description":"REQUIRED — the work that was judged."},"input":{"$ref":"#/components/schemas/RoleBlob","description":"What was asked."},"context":{"description":"Authoritative source(s) the output was judged against.","oneOf":[{"$ref":"#/components/schemas/RoleBlob"},{"type":"array","items":{"$ref":"#/components/schemas/RoleAttachment"}}]},"reference":{"$ref":"#/components/schemas/RoleBlob","description":"Expected / gold answer, when supplied."},"evidence":{"description":"Supporting material (non-authoritative).","oneOf":[{"$ref":"#/components/schemas/RoleBlob"},{"type":"array","items":{"$ref":"#/components/schemas/RoleAttachment"}}]},"values":{"type":"object","additionalProperties":true,"description":"Structured fields for deterministic checks."},"label":{"$ref":"#/components/schemas/Determination"},"rationale":{"type":"string","maxLength":600,"description":"Why this example earned its label."}},"required":["output","label"],"additionalProperties":false},"RubricFromOutcomesRequest":{"type":"object","description":"POST /v1/rubrics/from-outcomes request. Drafts + compiles an AUTHORED rubric spec from at least 3 labeled outcome examples; it does NOT register a version (compile + version with POST /v1/rubrics). Examples are treated as data, never as instructions.","properties":{"examples":{"type":"array","minItems":3,"items":{"$ref":"#/components/schemas/InductionExample"},"description":"At least 3 labeled examples."},"goal":{"type":"string","maxLength":500,"description":"Optional plain-language description of what a good output looks like."},"options":{"type":"object","properties":{"max_criteria":{"type":"integer","minimum":1,"maximum":20},"prefer_primitives":{"type":"boolean","description":"Prefer a deterministic primitive (e.g. regex) when the labels separate cleanly."},"judge_tier_hint":{"type":"integer","enum":[1,2,3]}},"additionalProperties":false}},"required":["examples"],"additionalProperties":false},"RubricFromDescriptionRequest":{"type":"object","description":"Draft an authored rubric spec from a natural-language description.","properties":{"description":{"type":"string","minLength":1,"maxLength":4000},"options":{"type":"object","properties":{"max_criteria":{"type":"integer","minimum":1,"maximum":20},"prefer_primitives":{"type":"boolean"},"judge_tier_hint":{"type":"integer","enum":[1,2,3]}},"additionalProperties":false}},"required":["description"],"additionalProperties":false},"RubricFromDescriptionResult":{"type":"object","description":"A compiled, unregistered description-induced rubric draft for human review.","properties":{"rubric_spec":{"type":"object","additionalProperties":true},"compile":{"type":"object","properties":{"ok":{"type":"boolean"},"issues":{"type":"array","items":{"$ref":"#/components/schemas/RubricIssue"}},"rubric_hash":{"type":"string"},"source_hash":{"type":"string"}},"required":["ok","issues"],"additionalProperties":false},"induction":{"type":"object","properties":{"model":{"type":"string"},"prompt_version":{"type":"string"},"source":{"type":"string","enum":["description"]},"per_criterion":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"confidence":{"type":"number"}},"required":["key"],"additionalProperties":false}},"warnings":{"type":"array","items":{"type":"string"}}},"required":["model","prompt_version","source","per_criterion","warnings"],"additionalProperties":false},"lint":{"type":"object","properties":{"passes_a3":{"type":"boolean"},"linter":{"type":"string","enum":["authoring-quality-linter@a3"]},"warnings":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["passes_a3","linter","warnings"],"additionalProperties":false},"draft":{"type":"object","properties":{"status":{"type":"string","enum":["draft"]},"bound":{"type":"boolean","enum":[false]},"publishable":{"type":"boolean"},"publish_via":{"type":"string","enum":["POST /v1/rubrics"]}},"required":["status","bound","publishable","publish_via"],"additionalProperties":false}},"required":["rubric_spec","compile","induction","lint","draft"],"additionalProperties":false},"RubricInductionResult":{"type":"object","description":"A drafted, compiled (but unregistered) authored rubric spec plus the induction report.","properties":{"rubric_spec":{"type":"object","additionalProperties":true,"description":"The authored RubricSpec — feed this to POST /v1/rubrics to register a version."},"compile":{"type":"object","properties":{"ok":{"type":"boolean"},"issues":{"type":"array","items":{"$ref":"#/components/schemas/RubricIssue"}},"rubric_hash":{"type":"string"},"source_hash":{"type":"string"}},"required":["ok","issues"]},"induction":{"type":"object","properties":{"model":{"type":"string"},"prompt_version":{"type":"string"},"per_criterion":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"explains_example_ids":{"type":"array","items":{"type":"string"}},"confidence":{"type":"number","minimum":0,"maximum":1}},"required":["key","explains_example_ids"]}},"unexplained_example_ids":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}}},"required":["model","prompt_version","per_criterion","unexplained_example_ids","warnings"]}},"required":["rubric_spec","compile","induction"]},"Determination":{"type":"string","enum":["met","partial","not_met","cannot_determine"]},"VerificationStatus":{"type":"string","enum":["queued","running","succeeded","failed"]},"TrustTier":{"type":"string","enum":["deterministic","source_attested","third_party","claimant"],"description":"Contract 12 evidence trust tier: T0 deterministic, T1 source_attested, T2 third_party, T3 claimant."},"EvidenceCitation":{"type":"object","properties":{"source":{"type":"string","description":"\"submission\", \"reference:<id>\", or \"evidence:<label>\"."},"locator":{"type":"string"},"snippet":{"type":"string"},"trust_tier":{"$ref":"#/components/schemas/TrustTier"},"source_id":{"type":["string","null"],"format":"uuid"}},"required":["source"]},"CriterionResult":{"type":"object","properties":{"criterion_id":{"type":"string","format":"uuid"},"primitive":{"type":"string","description":"e.g. \"llm_judge@1\", \"regex_match@1\"."},"determination":{"$ref":"#/components/schemas/Determination"},"score":{"type":["number","null"],"minimum":0,"maximum":1},"confidence":{"type":"number","minimum":0,"maximum":1},"rationale":{"type":"string"},"evidence_spans":{"type":"array","items":{"$ref":"#/components/schemas/EvidenceCitation"}},"value_assessed":{"type":["number","null"]},"flagged":{"type":"boolean","description":"needs_review — set when outside the acceptance frontier."},"model":{"type":"object","description":"the model that produced this criterion's result, and the judge code version","properties":{"id":{"type":"string"},"judge_code_version":{"type":["string","null"]}},"required":["id","judge_code_version"]}},"required":["criterion_id","primitive","determination","confidence","rationale"]},"Verdict":{"type":"object","properties":{"determination":{"$ref":"#/components/schemas/Determination"},"score":{"type":["number","null"],"minimum":0,"maximum":1},"confidence":{"type":"number","minimum":0,"maximum":1},"flagged":{"type":"boolean"},"flag_reason":{"type":["string","null"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/CriterionResult"}}},"required":["determination","confidence","results"]},"VerifyAccepted":{"type":"object","description":"202 body (async default).","properties":{"verification_id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/VerificationStatus"}},"required":["verification_id","status"]},"QuickstartTelemetryRequest":{"type":"object","description":"Guided developer quickstart timing input. The API derives key_prefix from the bearer key; clients must not send key material, tenant ids, account labels, or PII.","properties":{"handle":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{5,63}$","description":"De-identified run handle generated by the console."},"started_at":{"type":"string","format":"date-time"},"first_verdict_at":{"type":"string","format":"date-time"}},"required":["handle","started_at","first_verdict_at"],"additionalProperties":false},"QuickstartTelemetry":{"type":"object","description":"Append-only, tenant-scoped time-to-first-verdict telemetry. Contains only handle, key prefix, and timing metadata.","properties":{"handle":{"type":"string"},"key_prefix":{"type":"string","pattern":"^avk_[A-Za-z0-9_-]{8}$"},"started_at":{"type":"string","format":"date-time"},"first_verdict_at":{"type":"string","format":"date-time"},"first_verdict_ms":{"type":"integer","minimum":0,"maximum":86400000},"created_at":{"type":"string","format":"date-time"}},"required":["handle","key_prefix","started_at","first_verdict_at","first_verdict_ms","created_at"]},"QuickstartTelemetryEnvelope":{"type":"object","properties":{"telemetry":{"oneOf":[{"$ref":"#/components/schemas/QuickstartTelemetry"},{"type":"null"}]}},"required":["telemetry"]},"SourceAttestedEvidenceRequest":{"type":"object","description":"Staging source-attested evidence ingestion. The source signs the canonical payload with its registered Ed25519 key. Bad or unverifiable signatures ingest as claimant tier (T3).","properties":{"source_id":{"type":"string","format":"uuid"},"payload":{"description":"Evidence payload signed by the source.","$ref":"#/components/schemas/RoleBlob"},"signature":{"type":"string","maxLength":2048,"description":"Detached Ed25519 signature over canonical JSON payload bytes."},"signature_encoding":{"type":"string","enum":["base64","hex"],"default":"base64"},"label":{"type":"string","maxLength":256},"locator":{"type":"string","maxLength":512},"content_type":{"type":"string","maxLength":256}},"required":["source_id","payload","signature"],"additionalProperties":false},"SourceAttestedEvidenceResponse":{"type":"object","properties":{"evidence_packet_id":{"type":"string","format":"uuid"},"content_hash":{"type":"string"},"payload_uri":{"type":["string","null"]},"trust_tier":{"$ref":"#/components/schemas/TrustTier"},"trust_tier_label":{"type":"string"},"source_id":{"type":["string","null"],"format":"uuid"},"signature_verified":{"type":"boolean"},"downgrade_reason":{"type":["string","null"]},"evidence":{"$ref":"#/components/schemas/RoleAttachment"}},"required":["evidence_packet_id","content_hash","trust_tier","signature_verified","evidence"]},"VerificationObject":{"type":"object","description":"The verification resource (GET /v1/verifications/{id}, and the bounded-sync 200 body).","properties":{"id":{"type":"string","format":"uuid"},"tenant_id":{"type":"string","format":"uuid","description":"Server-resolved owning tenant for INV-1 echo checks."},"status":{"$ref":"#/components/schemas/VerificationStatus"},"rubric_id":{"type":"string","format":"uuid"},"submission_hash":{"type":"string","description":"sha-256 of the canonical submission (the typed form binds output AND the context it was judged against)."},"determination":{"type":["string","null"],"enum":["met","partial","not_met","cannot_determine",null]},"score":{"type":["number","null"]},"confidence":{"type":["number","null"]},"flagged":{"type":"boolean"},"flag_reason":{"type":["string","null"]},"verdict":{"oneOf":[{"$ref":"#/components/schemas/Verdict"},{"type":"null"}]},"proof_ref":{"type":["string","null"]},"error":{"type":["string","null"]},"created_at":{"type":"string"},"completed_at":{"type":["string","null"]},"current_verdict":{"type":"object","description":"S-230 item 4: when present, this is the current verdict; determination and verdict remain the point-in-time original.","properties":{"source":{"type":"string","enum":["escalation"]},"escalation_id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["decided","undecided"]},"determination":{"type":"string","enum":["met","partial","not_met","cannot_determine"]},"closing_judgment_id":{"type":"string","format":"uuid"},"closed_at":{"type":"string"}},"required":["source","escalation_id","status","determination","closing_judgment_id","closed_at"],"additionalProperties":false},"attempt":{"type":"object","properties":{"subject":{"type":"object","properties":{"kind":{"type":"string","enum":["pull_request","task","deal_criterion"]},"ref":{"type":"string","minLength":1,"maxLength":200}},"required":["kind","ref"],"additionalProperties":false},"number":{"type":"integer","minimum":1},"of":{"type":"integer","minimum":1},"earlier":{"type":"array","items":{"type":"object","properties":{"verification_id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/VerificationStatus"},"determination":{"type":["string","null"],"enum":["met","partial","not_met","cannot_determine",null]},"created_at":{"type":"string"}},"required":["verification_id","status","determination","created_at"],"additionalProperties":false}}},"required":["subject","number","of","earlier"],"additionalProperties":false}},"required":["id","status","rubric_id","submission_hash","flagged","created_at"]},"VerificationListItem":{"type":"object","description":"Compact verification row for the tenant-scoped explorer.","properties":{"id":{"type":"string","format":"uuid"},"tenant_id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/VerificationStatus"},"rubric_id":{"type":"string","format":"uuid"},"submission_hash":{"type":"string"},"determination":{"type":["string","null"],"enum":["met","partial","not_met","cannot_determine",null]},"score":{"type":["number","null"]},"confidence":{"type":["number","null"]},"flagged":{"type":"boolean"},"flag_reason":{"type":["string","null"]},"proof_ref":{"type":["string","null"]},"error":{"type":["string","null"]},"created_at":{"type":"string"},"completed_at":{"type":["string","null"]}},"required":["id","tenant_id","status","rubric_id","submission_hash","flagged","created_at"]},"VerificationList":{"type":"object","description":"Tenant-scoped verification explorer. The top-level tenant_id is the load-bearing echo check.","properties":{"tenant_id":{"type":"string","format":"uuid"},"limit":{"type":"integer","minimum":1,"maximum":100},"offset":{"type":"integer","minimum":0},"filters":{"type":"object","additionalProperties":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/VerificationListItem"}}},"required":["tenant_id","limit","offset","filters","items"]},"FeedbackRequest":{"type":"object","description":"Tenant ground-truth on a completed verification (append-only; feeds calibration, never changes the signed verdict).","properties":{"outcome":{"type":"string","enum":["confirmed_correct","confirmed_wrong","disputed"],"description":"The tenant's verdict on the verification."},"note":{"type":["string","null"],"maxLength":2000,"description":"Optional free-text note."}},"required":["outcome"],"additionalProperties":false},"FeedbackAccepted":{"type":"object","description":"201 body — the recorded feedback.","properties":{"feedback_id":{"type":"string","format":"uuid"},"verification_id":{"type":"string","format":"uuid"},"outcome":{"type":"string","enum":["confirmed_correct","confirmed_wrong","disputed"]}},"required":["feedback_id","verification_id","outcome"]},"CockpitDeterminationRequest":{"type":"object","description":"Customer reviewer determination. decided_by and ts are server-populated from the proven C11 subject.","properties":{"verification_id":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["accept","override","route"]},"reason":{"type":["string","null"],"maxLength":4000}},"required":["verification_id","decision"],"additionalProperties":false},"CriteriaJudgmentRequest":{"type":"object","properties":{"kind":{"type":"string","enum":["propose","accept"]},"party":{"type":"string","enum":["proposer_side","other_side"]},"judge_id":{"type":"string","pattern":"^judge_[0-9a-f]{16}$","deprecated":true,"description":"Ignored. The judge id is derived on the server from the authenticated principal (S-310 part C)."},"rubric_version":{"type":"string","minLength":1,"maxLength":200},"identity_rung":{"type":"string","enum":["unverified","email_verified","domain_distinct","payment_verified","entity_verified"]}},"required":["kind","party","rubric_version","identity_rung"],"additionalProperties":false},"CriteriaJudgment":{"type":"object","properties":{"seq":{"type":"integer"},"kind":{"type":"string","enum":["propose","accept"]},"party":{"type":"string","enum":["proposer_side","other_side"]},"judge_id":{"type":"string"},"rubric_version":{"type":"string"},"rule_version":{"type":"string","const":"criteria-agreement@1"},"judged_at":{"type":"string","format":"date-time"}},"required":["seq","kind","party","judge_id","rubric_version","rule_version","judged_at"],"additionalProperties":false},"CriteriaAgreement":{"oneOf":[{"type":"object","properties":{"status":{"const":"agreed"},"rubricVersion":{"type":"string"},"ruleVersion":{"const":"criteria-agreement@1"},"judgeIds":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":2},"verdictRef":{"type":"string"}},"required":["status","rubricVersion","ruleVersion","judgeIds","verdictRef"],"additionalProperties":false},{"type":"object","properties":{"status":{"const":"not_agreed"},"reason":{"type":"string","enum":["never_sent","awaiting_acceptance"]}},"required":["status","reason"],"additionalProperties":false}]},"CriteriaJudgmentsResponse":{"type":"object","properties":{"tenant_id":{"type":"string","format":"uuid","description":"The caller's own tenant, resolved from the API key."},"subject_ref":{"type":"string"},"rule_version":{"const":"criteria-agreement@1"},"judgments":{"type":"array","items":{"$ref":"#/components/schemas/CriteriaJudgment"}},"agreement":{"$ref":"#/components/schemas/CriteriaAgreement"}},"required":["tenant_id","subject_ref","rule_version","judgments","agreement"],"additionalProperties":false},"CriteriaJudgmentCreatedResponse":{"type":"object","properties":{"judgment":{"$ref":"#/components/schemas/CriteriaJudgment"},"agreement":{"$ref":"#/components/schemas/CriteriaAgreement"}},"required":["judgment","agreement"],"additionalProperties":false},"CockpitDeterminationResponse":{"type":"object","properties":{"tenant_id":{"type":"string","format":"uuid"},"review_decision":{"type":"object","properties":{"verification_id":{"type":"string","format":"uuid"},"tenant_id":{"type":"string","format":"uuid"},"decision":{"type":"string","enum":["accept","override","route"]},"reason":{"type":["string","null"]},"decided_by":{"type":"string"},"ts":{"type":"string"}},"required":["verification_id","tenant_id","decision","reason","decided_by","ts"]},"writeback":{"type":"object","properties":{"status":{"type":"string","enum":["recorded"]},"consequence":{"type":"string","enum":["accept_verdict","override_verdict","route_for_review"]}},"required":["status","consequence"]}},"required":["tenant_id","review_decision","writeback"]},"CockpitReviewerGrantRequest":{"type":"object","description":"One named customer_reviewer grant or revoke. The tenant is server-resolved from the C11 session.","properties":{"reviewer_subject":{"type":"string","minLength":1,"maxLength":256},"active":{"type":"boolean","description":"true grants; false revokes an existing grant."},"tenant_id":{"type":"string","format":"uuid","description":"Optional session-tenant guard; another tenant is refused."}},"required":["reviewer_subject","active"],"additionalProperties":false},"CockpitReviewerGrant":{"type":"object","properties":{"tenant_id":{"type":"string","format":"uuid"},"reviewer_subject":{"type":"string"},"active":{"type":"boolean"},"granted_by":{"type":["string","null"]},"granted_at":{"type":["string","null"],"format":"date-time"},"revoked_by":{"type":["string","null"]},"revoked_at":{"type":["string","null"],"format":"date-time"}},"required":["tenant_id","reviewer_subject","active","granted_by","granted_at","revoked_by","revoked_at"]},"CockpitReviewerStatus":{"type":"object","properties":{"tenant_id":{"type":"string","format":"uuid"},"account_id":{"type":"string"},"has_reviewer_role":{"type":"boolean"},"is_owner":{"type":"boolean"},"granted_by":{"type":["string","null"]},"granted_at":{"type":["string","null"],"format":"date-time"},"grantable_by":{"type":"string","enum":["the tenant owner"]}},"required":["tenant_id","account_id","has_reviewer_role","is_owner","granted_by","granted_at","grantable_by"]}}},"security":[{"apiKey":[]}],"paths":{"/survival-events/bilateral":{"post":{"summary":"Append a bilateral survival lifecycle event.","description":"Authenticated engine ingress for a marketplace bilateral verdict lifecycle fact. The caller is tenant-bound by its bearer key; replaying the same source, verdict_ref, and state is idempotent.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"verdict_ref":{"type":"string","minLength":1,"maxLength":512},"state":{"type":"string","enum":["contested","survived","overturned"]},"identity_rung":{"type":"string","enum":["unverified","email_verified","domain_distinct","payment_verified","entity_verified"]},"adjudication_ref":{"type":["string","null"],"minLength":1,"maxLength":512}},"required":["source","verdict_ref","state","identity_rung"],"additionalProperties":false}}}},"responses":{"201":{"description":"Bilateral survival event appended or replayed idempotently."},"400":{"description":"Invalid bilateral event payload.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/verify":{"post":{"summary":"Submit a verification (async/202 default; bounded-sync opt-in).","description":"Submit a rubric_id + a submission. The submission is {inline} | {uri} | the Contract 05 typed roles object. For faithfulness/grounding, send the work as `output` and its source as `context[]` — the judge is told which blob is authoritative and treats un-grounded or contradicted claims as violations.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Dedupe retries on (tenant, key)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"},"examples":{"faithfulness":{"summary":"Faithfulness (headline): judge OUTPUT against an authoritative CONTEXT source","value":{"rubric_id":"7f8e9d6c-1a2b-4c3d-8e9f-0a1b2c3d4e5f","submission":{"output":"Q2 revenue rose 12% to $4.2M and monthly churn fell to 1.8%.","context":[{"label":"source","value":"Q2 results: revenue grew 12% quarter-over-quarter to $4.2M. Monthly churn improved from 2.4% to 1.8%."}]},"options":{"wait_ms":45000}}},"input_and_output":{"summary":"INPUT + OUTPUT: judge an answer for appropriateness/completeness to what was asked","value":{"rubric_id":"7f8e9d6c-1a2b-4c3d-8e9f-0a1b2c3d4e5f","submission":{"input":"What is the refund window, and do disputes affect it?","output":"Refunds are accepted within 30 days of delivery; an open dispute pauses that clock until resolution."}}},"reference":{"summary":"OUTPUT + REFERENCE: compare against an expected / gold answer","value":{"rubric_id":"7f8e9d6c-1a2b-4c3d-8e9f-0a1b2c3d4e5f","submission":{"output":"The capital of France is Paris.","reference":"Paris"}}},"evidence":{"summary":"OUTPUT + EVIDENCE: supporting material, weighed but NOT authoritative","value":{"rubric_id":"7f8e9d6c-1a2b-4c3d-8e9f-0a1b2c3d4e5f","submission":{"output":"The customer was refunded in full on 2026-05-14.","evidence":[{"label":"support-ticket","value":"Ticket #8821: refund of $42.00 issued 2026-05-14."}]}}},"values":{"summary":"OUTPUT + VALUES: structured fields for deterministic numeric/json checks","value":{"rubric_id":"7f8e9d6c-1a2b-4c3d-8e9f-0a1b2c3d4e5f","submission":{"output":"{\"invoice_number\":\"INV-48213\",\"total\":1250.5,\"currency\":\"USD\"}","values":{"total":1250.5,"currency":"USD"}}}},"legacy_inline":{"summary":"Back-compat: {inline} — unchanged","value":{"rubric_id":"7f8e9d6c-1a2b-4c3d-8e9f-0a1b2c3d4e5f","submission":{"inline":"INV-4821 total $1,250.50"}}},"legacy_content_alias":{"summary":"Back-compat: legacy `content` is treated AS `output`","value":{"rubric_id":"7f8e9d6c-1a2b-4c3d-8e9f-0a1b2c3d4e5f","submission":{"content":"The answer text, submitted via the legacy content field."}}},"uri_reference":{"summary":"Back-compat: {uri} — stored by reference, never fetched on the request path","value":{"rubric_id":"7f8e9d6c-1a2b-4c3d-8e9f-0a1b2c3d4e5f","submission":{"uri":"https://example.com/artifacts/answer.txt"}}}}}}},"responses":{"200":{"description":"Completed verdict (bounded-sync).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationObject"}}}},"202":{"description":"Accepted (async).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyAccepted"}}}},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_callback_url","invalid_identity_rung","invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"API key lacks the required scope.","x-acretix-codes":["insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Request conflicts with an existing idempotency key.","x-acretix-codes":["idempotency_key_conflict"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/proofs/verify":{"post":{"summary":"Publicly verify a signed proof artifact.","description":"Unauthenticated, read-only proof verification. The request carries a signed proof-envelope document already issued by Acretix; the API re-verifies the Ed25519 signature against the published key and returns only summary credential fields. It never re-signs or returns raw claim/evidence content.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Either the proof-envelope document from GET /v1/verifications/{id}/proof/envelope, or { proof: <that document> }.","type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"Proof validity. Valid proofs include a summary credential and SVG badge.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"valid":{"const":true},"verification_id":{"type":"string","format":"uuid"},"determination":{"$ref":"#/components/schemas/Determination"},"flagged":{"type":["boolean","null"],"description":"Signed needs-review signal. Null means the signed payload did not carry the field."},"flag_reason":{"type":["string","null"],"description":"Signed needs-review reason, when present."},"confidence":{"type":["number","null"],"minimum":0,"maximum":1,"description":"Signed aggregate confidence. Null means the signed payload did not carry a valid value."},"manipulation_detected":{"const":true,"description":"Present only when the signed verdict explicitly reported a manipulation attempt."},"issued_at":{"type":"string"},"key_id":{"type":"string"},"credential":{"type":"object","properties":{"verify_url":{"type":"string","format":"uri"},"badge_svg":{"type":"string","description":"Inline SVG badge, summary only."}},"required":["verify_url","badge_svg"],"additionalProperties":false}},"required":["valid","verification_id","determination","flagged","flag_reason","confidence","issued_at","key_id","credential"],"additionalProperties":false},{"type":"object","properties":{"valid":{"const":false},"reason":{"type":"string","enum":["malformed_proof","empty_proof","unsupported_format","unknown_key","content_hash_mismatch","envelope_mismatch","chain_invalid","signature_invalid","expired"]}},"required":["valid","reason"],"additionalProperties":false}]}}}},"400":{"description":"Invalid proof payload.","x-acretix-codes":["invalid_json"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Request source is not trusted.","x-acretix-codes":["untrusted_request_source"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited.","x-acretix-codes":["rate_limited"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/evidence/source-attested":{"post":{"summary":"Ingest source-attested evidence (staging).","description":"Accepts a payload signed by a registered source key distinct from the claimant. Verified Ed25519 signatures ingest as source_attested (T1); bad or unverifiable signatures ingest as claimant (T3).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceAttestedEvidenceRequest"}}}},"responses":{"201":{"description":"Evidence packet recorded with an explicit trust tier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceAttestedEvidenceResponse"}}}},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Source not registered for tenant.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/verifications":{"get":{"summary":"List tenant-scoped verifications for the explorer.","description":"Read-only verification explorer. Tenant is resolved from the API key or the request-threaded identity-contract tenant header; the response echoes tenant_id for a load-bearing caller check.","parameters":[{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/VerificationStatus"}},{"name":"determination","in":"query","required":false,"schema":{"type":"string","enum":["met","partial","not_met","cannot_determine","none"]}},{"name":"flagged","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","description":"YYYY-MM-DD UTC created_at lower bound."}},{"name":"to","in":"query","required":false,"schema":{"type":"string","description":"YYYY-MM-DD UTC created_at upper bound."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Tenant-scoped verification list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationList"}}}},"400":{"description":"Invalid filter.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"API key lacks the required scope.","x-acretix-codes":["forbidden","insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/verifications/{id}":{"get":{"summary":"Get a verification status + verdict.","responses":{"200":{"description":"Verification object.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationObject"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"API key lacks the required scope.","x-acretix-codes":["forbidden","insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Verification not found.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/verifications/{id}/proof":{"get":{"summary":"Get the signed proof object.","responses":{"200":{"description":"Proof object."},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Proof not found.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/verifications/{id}/determination":{"get":{"summary":"Get the latest customer review determination (cockpit→adapter round-trip).","description":"The latest single-party customer review decision for a verification (tenant-scoped). A product adapter polls this to finalize a held check; verify reports the decision + consequence marker only (decide-not-execute).","responses":{"200":{"description":"The latest review determination."},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No determination recorded for this verification.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/verifications/{id}/proof/envelope":{"get":{"summary":"Download the signed attestation envelope(s) for third-party verification.","description":"Streams the exact canonical bytes that were hashed and signed, plus the signature, so a holder can re-verify offline against the published JWKS (/.well-known/acretix-verify/keys.json). See /docs/verify-a-proof for the recipe.","responses":{"200":{"description":"Signed proof-envelope document."},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No proof recorded.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/verifications/{id}/reverify":{"post":{"summary":"Re-verify (new evidence / higher tier / focused criterion).","responses":{"200":{"description":"Re-verify report."},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"API key lacks the required scope.","x-acretix-codes":["insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Verification not found.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/verifications/{id}/feedback":{"post":{"summary":"Record tenant ground-truth (outcome feedback) on a completed verification.","description":"Append-only outcome label for a terminal verification (succeeded|failed). Feeds calibration; it does not change the signed verdict. The verification must belong to the caller and be terminal.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"201":{"description":"Feedback recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAccepted"}}}},"400":{"description":"Invalid outcome/note, or the verification is not terminal yet.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Verification not found.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/cockpit/determinations":{"post":{"summary":"Record a customer cockpit determination.","description":"Contract 11 §E / Contract 14 C.1. Requires identity-contract bearer, request-threaded tenant, x-acretix-auth-subject=account_tenant_mapping, and a tenant-scoped customer_reviewer subject. Records the decision and a product-adapter consequence marker; it is not a training path.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CockpitDeterminationRequest"}}}},"responses":{"201":{"description":"Customer determination recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CockpitDeterminationResponse"}}}},"400":{"description":"Invalid decision body.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Subject is not a proven tenant customer_reviewer.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Verification not found for the request-threaded tenant.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Determination already recorded.","x-acretix-codes":["determination_already_recorded"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/cockpit/reviewers":{"get":{"summary":"Read whether the viewer holds the tenant's customer_reviewer role.","description":"Contract 11 §E5.1. Requires identity-contract bearer, request-threaded tenant, and x-acretix-auth-subject=account_tenant_mapping. Returns the proven viewer role and owner status.","responses":{"200":{"description":"Viewer reviewer-role status for the request-threaded tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CockpitReviewerStatus"}}}},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Caller is not a proven identity-contract cockpit principal.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Reviewer not found.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"summary":"Grant or revoke customer_reviewer for one named person (tenant owner only).","description":"Contract 11 §E5.1. Requires the C11 account mapped to the request-threaded tenant; another tenant cannot be named or modified. This is an explicit human capability grant, never an automatic grant.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CockpitReviewerGrantRequest"}}}},"responses":{"200":{"description":"Reviewer grant updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CockpitReviewerGrant"}}}},"400":{"description":"Invalid reviewer grant body.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Caller is not the tenant owner, or attempted to name another tenant.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Reviewer grant was not found for revocation.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/rubrics":{"get":{"summary":"List the tenant's rubrics (latest version per name).","description":"Returns a compact summary per rubric name (the latest version), newest first. Tenant-scoped (server-resolved from the API key). Paging: ?limit (1..100, default 50) & ?offset.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"The tenant's rubrics.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricList"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"summary":"Compile + version a rubric.","description":"Each criterion runs a CriterionPrimitive (see components.schemas.CriterionPrimitive).","responses":{"201":{"description":"rubric_id + version + hash."},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"API key lacks the required scope.","x-acretix-codes":["forbidden","insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/rubrics/from-description":{"post":{"summary":"Draft a rubric from a natural-language description.","description":"This route is off unless VERIFY_NL_RUBRIC_FROM_DESCRIPTION is exactly true. The caller's key needs the rubric:write scope. It returns an unregistered draft to review and publish with POST /v1/rubrics. The description is treated as data and never as instructions. The tenant is server-resolved from the bearer.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricFromDescriptionRequest"}}}},"responses":{"200":{"description":"Unregistered description-induced rubric draft and induction report.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricFromDescriptionResult"}}}},"400":{"description":"Description is too vague or request input is invalid.","x-acretix-codes":["description_too_vague","invalid_input_roles"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden","identity_contract_tenant_mismatch","insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body or description is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Description induction is disabled or could not produce a compilable rubric spec.","x-acretix-codes":["induction_failed"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/rubrics/from-outcomes":{"post":{"summary":"Draft + compile a rubric from labeled outcome examples (induction).","description":"Induce an AUTHORED rubric spec from >= 3 labeled outcome examples (the canonical Determination labels). The response is a compiled-but-UNREGISTERED draft (rubric_spec + compile hashes + an induction report); register it with POST /v1/rubrics. Examples are treated as data, never as instructions. Tenant is server-resolved from the API key.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricFromOutcomesRequest"}}}},"responses":{"200":{"description":"Drafted + compiled rubric spec and induction report.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricInductionResult"}}}},"400":{"description":"Invalid examples/labels (too few, conflicting, or malformed).","x-acretix-codes":["invalid_input_roles","invalid_label","invalid_request","too_few_examples"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Too many examples or body too large.","x-acretix-codes":["too_many_examples"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Could not produce a compilable rubric spec.","x-acretix-codes":["conflicting_labels","induction_failed","unprocessable"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/rubrics/compile":{"post":{"summary":"Compile-preview a rubric without registration.","description":"Runs the same rubric compiler as POST /v1/rubrics but does not create or version a registry artifact. The response intentionally excludes rubric_id, version, status, and created.","responses":{"200":{"description":"Preview hash/source_hash or compiler issues.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricCompilePreview"}}}},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_json"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"API key lacks the required scope.","x-acretix-codes":["forbidden","insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/rubrics/templates":{"get":{"summary":"List ungated starter rubric templates.","description":"Lists the read-only ungated starter rubric templates. A gated pack is never listed. The answer names the caller tenant; the catalogue is the same for every tenant.","responses":{"200":{"description":"Ungated starter rubric templates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricTemplateList"}}}},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/rubrics/examples":{"post":{"summary":"Run marked examples against a draft rubric.","description":"Off unless enabled. Stores the compiled rubric version marked draft, which every normal verify call refuses. Runs at most 5 marked examples for author feedback.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricExamplesRequest"}}}},"responses":{"200":{"description":"Draft rubric and the marked example verification outcomes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RubricExamplesResult"}}}},"400":{"description":"Invalid request or rubric specification.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"API key lacks the required scope.","x-acretix-codes":["forbidden","insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"This route is not enabled.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body or example count is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/rubrics/{id}":{"get":{"summary":"Fetch a compiled rubric.","responses":{"200":{"description":"Rubric object."},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Rubric not found.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/usage":{"get":{"summary":"Tenant usage summary.","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","description":"YYYY-MM-DD UTC lower bound."}},{"name":"to","in":"query","required":false,"schema":{"type":"string","description":"YYYY-MM-DD UTC upper bound."}}],"responses":{"200":{"description":"Usage summary."},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/criteria-agreements/{subject_ref}/judgments":{"get":{"summary":"List tenant-scoped criteria agreement judgments and their derived agreement.","parameters":[{"name":"subject_ref","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,200}$"}}],"responses":{"200":{"description":"Recorded judgments and the currently derived agreement.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriteriaJudgmentsResponse"}}}},"400":{"description":"Invalid subject reference.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden","identity_contract_tenant_mismatch"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No criteria judgments exist for this tenant subject.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Criteria judgment store is unavailable.","x-acretix-codes":["service_unavailable"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"summary":"Append a tenant-scoped criteria proposal or acceptance.","parameters":[{"name":"subject_ref","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,200}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriteriaJudgmentRequest"}}}},"responses":{"201":{"description":"Judgment appended and agreement derived.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriteriaJudgmentCreatedResponse"}}}},"400":{"description":"Invalid judgment input.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"API key lacks the required scope, or the caller may not act for that party.","x-acretix-codes":["forbidden","identity_contract_tenant_mismatch","insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Acceptance conflicts with the latest proposal.","x-acretix-codes":["conflict"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Request body is too large.","x-acretix-codes":["payload_too_large"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Criteria judgment store is unavailable.","x-acretix-codes":["service_unavailable"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/reviewer-tiers":{"get":{"summary":"Reviewer tier record: the current version and every earlier one (read-only).","responses":{"200":{"description":"Reviewer tier versions, ascending, with current_version."},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Reviewer tier record missing or unreadable.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/dev-reporting/summary":{"get":{"summary":"Developer reporting: the caller's own usage + verdict roll-up (tenant-scoped, read-only).","responses":{"200":{"description":"Usage + verdict summary."},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/dev-reporting/ai-record":{"get":{"summary":"Developer reporting: the caller's own feedback-based AI record (tenant-scoped, read-only).","parameters":[{"name":"from","in":"query","required":false,"description":"YYYY-MM-DD lower bound; defaults to the first day of the current UTC month; must not be after to; range is at most 366 days.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"YYYY-MM-DD upper bound; defaults to today in UTC.","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Feedback-based agreement, overturn, abstention, and dispute figures.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiRecord"}}}},"400":{"description":"Invalid date range.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"API key lacks the verify:read scope.","x-acretix-codes":["forbidden","insufficient_scope"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/dev-reporting/health":{"get":{"summary":"Developer reporting: own-tenant subscription health aggregate.","description":"Default-off, aggregate-only daily pass/exception-rate read. The tenant is server-resolved from the API key or identity-contract tenant header; a subscription_id not visible to the resolved tenant returns 404.","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","description":"YYYY-MM-DD UTC lower bound."}},{"name":"to","in":"query","required":false,"schema":{"type":"string","description":"YYYY-MM-DD UTC upper bound."}},{"name":"subscription_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$"}}],"responses":{"200":{"description":"Daily aggregate pass/exception health buckets; no raw verification rows."},"400":{"description":"Invalid date range or subscription_id.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Health view disabled, or subscription not found for the resolved tenant.","x-acretix-codes":["not_found"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/dev-reporting/quickstart/telemetry":{"post":{"summary":"Append guided developer quickstart time-to-first-verdict telemetry.","description":"Tenant-scoped, append-only telemetry for the guided /developers quickstart. The server derives key_prefix from the bearer key; the request body contains only a de-identified handle and timestamps.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickstartTelemetryRequest"}}}},"responses":{"201":{"description":"Telemetry appended.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickstartTelemetryEnvelope"}}}},"400":{"description":"Invalid handle/timing or key/PII-shaped fields supplied.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Telemetry for this handle already exists.","x-acretix-codes":["conflict"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/dev-reporting/quickstart/telemetry/{handle}":{"get":{"summary":"Read guided quickstart telemetry by de-identified handle.","description":"Tenant-scoped read; missing or other-tenant handles return { telemetry: null }.","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{5,63}$"}}],"responses":{"200":{"description":"Own-tenant telemetry or null.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickstartTelemetryEnvelope"}}}},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Request conflicts with current telemetry.","x-acretix-codes":["conflict"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/dev-reporting/scoped-tags":{"post":{"summary":"Scoped bulk-tagging — private customer_gate case-memory only (single-party). Gated by SCOPED_LEARNING_ENABLED (503 when disabled).","responses":{"201":{"description":"Recorded scoped tags."},"400":{"description":"Invalid request.","x-acretix-codes":["invalid_json","invalid_request"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing, invalid or expired bearer API key.","x-acretix-codes":["api_key_expired","unauthorized"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Access is forbidden.","x-acretix-codes":["forbidden"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal server error.","x-acretix-codes":["internal_error"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Scoped bulk-tagging disabled.","x-acretix-codes":["service_unavailable"],"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}}}