Skip to main content
This page documents the full payload returned by 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

All feature arrays are multi-instance — each item represents one node in a graph workflow. Null means the feature was not present in this session’s workflow.

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 the company 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 with source = "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:
Corporate parties (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.
When 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_REGISTRY for registry availability, ownership, company activity, and country-restriction issues.
  • KYB_DOCUMENTS for corporate document extraction, cross-check, metadata, manipulation, subtype, age, and attempt-limit issues.
  • AML for company AML screening matches or missing screening data.
  • KYB_KEY_PEOPLE for person-level issues tied to directors, officers, UBOs, or representatives.
  • PHONE for phone-number risk, duplication, blocklist, and verification-code attempt issues.
  • EMAIL for email risk, deliverability, duplication, blocklist, and verification-code attempt issues.
  • QUESTIONNAIRE for custom status rules driven by questionnaire answers.
  • LOCATION for Device & IP Analysis, private-network, IP blocklist, device blocklist, and duplicate device/IP issues.
  • SIGNATURE for Electronic Signature declines, failed code confirmations, signer name mismatches, unverified signers, changed documents and missing field data. See Electronic Signature warnings.
See Business Verification warnings for the full list of warning codes.

Workflow-driven field filtering

Workflows can limit which nested fields appear on each feature item via response_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.