GET /v3/session/{id}/decision/ for a Business Verification (KYB) session. The endpoint is unified — when you pass a business session_id, the response carries session_kind: "business" and the business-specific feature arrays below.
Top-level structure
Shared top-level fields
registry_checks[]
Each item is one company registry check (typically one per session; multiple in graph workflows with recursive corporate UBO KYB).
company block
The nested company object is the full view of the legal entity as derived from the registry (and optionally user-edited):
One format for every country and registry source
Didit reads company registries in many countries through several registry sources. Each source publishes its own layout, but thecompany block always has the same shape: the keys below are always present, with the same types, whichever country and source the company came from.
A fact the registry does not publish is null; you never need to branch on the country or parse registry_data.
The same shape is returned by the decision, the standalone KYB registry endpoints and the hosted verification flow.
Address (each item of addresses)
Industry (each item of
industries)
When the registry states activities but no business description,
nature_of_business is filled from the activity labels.
Contact details and alternative names are populated when available, while explicit user or reviewer edits always take precedence.
Ownership (ownership)
Officer item shape (inside company.officers)
date_of_birth is populated only when the registry supplies a complete date.
If the registry reports only a year or month and year, use date_of_birth_year and date_of_birth_month; the missing day is never inferred.
Names, birth details, address, and appointment dates remain available in both the company officer list and the Key People registry list.
Beneficial owner item shape (inside company.beneficial_owners)
kyc_status uses a B2C-safe projection: Approved, Declined, or Pending (full session states collapse to Pending until the KYC finishes).
shareholding states what the owner holds, in the same shape for every country and registry source: share_class, number_of_shares, currency, nominal_value, total_value and percentage (the exact stake, to four decimal places).
It is null when the registry states no holding.
A band, such as a UK PSC’s 25-50%, is not a stake: percentage is null and the band stays in ownership_min_shares / ownership_max_shares.
Shareholders and UBOs are both listed in beneficial_owners; roles tells them apart.
key_people_checks[]
This is the aggregate check over all officers and UBOs for the session. It exposes two buckets so the console can render “extracted from the registry” side-by-side with “submitted by the business”, plus a high-level UBO KYC summary.
registry.officers/registry.beneficial_owners— parties extracted from the registry check.submitted.parties— parties the business admin explicitly added during the Key People flow (records withsource = "USER").
registry.officers[] / registry.beneficial_owners[]
The registry facts match company.officers / company.beneficial_owners above.
Key People additionally includes AML status and detailed verification linkage, such as kyc_session_id and verification workflow fields.
The company lists retain their existing simplified KYC status and verification URL.
submitted.parties[]
User-submitted parties carry their KYC or child-KYB linkage:
entity_type: "company") additionally carry company_name, registration_number, and kyb_sub_session_id / kyb_sub_session_status / kyb_sub_session_deleted when nested KYB is enabled for corporate UBOs.
kyc_session_deleted (and its corporate counterpart kyb_sub_session_deleted) is true when the party’s child session was deleted. A deleted child keeps whatever status it had at deletion time and can never settle, so read this flag rather than the status: the matching *_session_url is returned as null because the link no longer resolves, and the Key People check drops to In Review instead of waiting forever. Deleting a child session never counts as a pass. Exempt the party with PATCH /v3/session/{id}/kyb/parties/{party_uuid}/ to let the KYB settle.
ubo_kyc_summary
Aggregate UBO KYC progress — useful for a single dashboard card:
Returns
null when no UBOs have linked KYC sessions.
document_verifications[]
Documents grouped by node:
Corporate document metadata
For PDF corporate documents,items[].document_metadata.overlay_manipulation can include forensic evidence for suspected overlay-text editing. When present, it includes:
The field is
null when no overlay evidence was found, when the document is not a PDF, or when the PDF could not be analyzed.
aml_screenings[]
Company-level and (when the workflow wires them) person-level AML screenings.
total_hits > 0, each hit includes match score, risk score, watchlist sources, and a per-hit review_status you can update via the update-aml-hit-status endpoint. See AML Screening report for the hit structure.
Shared feature arrays
phone_verifications, email_verifications, questionnaire_responses, ip_analyses use the same per-item shapes as user (KYC) sessions. They’re null when the workflow doesn’t include them. See the KYC response for item schemas.
signatures is present when the workflow has an Electronic Signature step. A business session has one item per key person who signs for the company, with signer.capacity: "company", the company name and the key person’s roles. See the Electronic Signature report.
Warning feature groups
Business Verification warnings are grouped by the feature that produced them:KYB_REGISTRYfor registry availability, ownership, company activity, and country-restriction issues.KYB_DOCUMENTSfor corporate document extraction, cross-check, metadata, manipulation, subtype, age, and attempt-limit issues.AMLfor company AML screening matches or missing screening data.KYB_KEY_PEOPLEfor person-level issues tied to directors, officers, UBOs, or representatives.PHONEfor phone-number risk, duplication, blocklist, and verification-code attempt issues.EMAILfor email risk, deliverability, duplication, blocklist, and verification-code attempt issues.QUESTIONNAIREfor custom status rules driven by questionnaire answers.LOCATIONfor Device & IP Analysis, private-network, IP blocklist, device blocklist, and duplicate device/IP issues.SIGNATUREfor Electronic Signature declines, failed code confirmations, signer name mismatches, unverified signers, changed documents and missing field data. See Electronic Signature warnings.
Workflow-driven field filtering
Workflows can limit which nested fields appear on each feature item viaresponse_attributes. Fields always included regardless: status, warnings, node_id. All other fields are nullified when not in the allow-list — the key stays in the response for schema stability.
Next steps
Statuses
What each status value means.
Risk assessment
How
risk_level is computed.AML report
Full AML hit payload reference.
Key people
How parties flow from registry vs user submission into
registry / submitted buckets.Documents
Document groups, OCR, and cross-reference.
Retrieve session
Full endpoint reference including example responses.