List KYB verifications
Server-to-server (API key) twin of the dashboard KYB verifications list: same envelope and per-row schema, the only difference is tenancy — the organization comes from the API key (not a path param) and sandbox from the key / the is_sandbox query param.
Paginated list of KYB verifications for the organization, mirroring the KYC (docver) verifications list. Each row carries the table columns (company name, status, decision, risk) PLUS the expanded-row blocks: company (Company/Application cards), form_progress (widget stepper), checks_summary (checks badges + N/M progress) and stage — so the expanded row renders without a detail round-trip. Each row’s id is the KYB CASE id — use it to drill in via GET /api/v4/kyb/verifications/.
Vocabularies. status (stored case lifecycle): draft → under_review (Submit locked the form) → the pipeline writes a terminal status from the risk score: approved (low) | manual_review (medium) | rejected (high) | failed (checks could not be scored). A compliance officer’s decision writes approved_manually / rejected_manually (the _manually suffix marks a reviewer-set status). remediation_requested is stamped when a remediation ticket is raised. stage (derived, expanded-row header): collecting_data | running_checks | manual_review | in_remediation | completed. checks_summary.checks[].type: registry | tin | document_verification | doc_manipulation | aml_company | aml_person | cross_check (the last four appear as their pipeline steps ship). checks[].status (execution): pending | completed | failed | skipped | timeout — pending rows carry no result/verdict. checks[].result (normalized outcome — drives the badge COLOR and the passed/review/failed counters): clear, not_applicable → passed (green); warning, inconclusive → review (yellow); failed → failed (red). checks[].verdict is NOT an enum — it is the provider’s normalized verdict to render verbatim as the badge TEXT (registry: Active/Dissolved/not_found/…; tin: TIN Matched/Did Not Match/irs_code_<N>; document_verification: VERIFIED/NOT_VERIFIED; doc_manipulation later: AUTHENTIC/SUSPICIOUS/LIKELY_FORGED). form_progress.sections[].state: completed | current | pending, plus action_required on the synthetic kyc step when the representative’s KYC came back failed (that one is NOT a remediation). It always describes the ORIGINAL application; a live round has its own stepper in form_progress_remediation, covering only the sections it asks about, whose entries are completed | in_remediation. checks_summary likewise stays the run a remediation interrupted, and checks_summary_remediation is the run its re-submit earned: that one is absent for the whole time the case sits in in_remediation, because no such run exists yet. risk_level (Low|Medium|High) comes from the business_risk_score severity once it runs, else null (render ‘Not scored’). risk_score/decision (the full numeric RiskResult) stay null — the KYB score is a level, not a number; the stored status carries the decision.