Skip to content
Back to Steward

Approve an application

POST
/api/v1/applications/{id}/approve
id
required
string

Application details

Media type application/json
object
hidden
required

Whether this application is hidden from the default platform list.

boolean
hiddenSource
string
Allowed values: CLIENT STEWARD
businessApplication

Business application details (present for business type applications)

object
name
required
string
id
required
string
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
verified
required
boolean
manual
required

Whether this is a manual application

boolean
customerType
required
string
Allowed values: BUSINESS INDIVIDUAL
accountType
required

Display-facing account classification for the Overview meta-field. “entity” = business application; “joint” = individual application linked to a second individual via a JOINT_ACCOUNT entity link; “individual” = single personal application.

string
Allowed values: individual joint entity
stageEnteredAt

When the application entered its current stage. Drives the “pending for N days” meta-field for non-approved applications. Null for legacy rows created before stage tracking, so callers fall back to createdAt.

string format: date-time
nullable
signatureDocument
object
id
required

Document ID

string
signerName
required
string
date
required
string
url
required
string
hidden
required

Whether the signature document is hidden

boolean
status
string
metadata

Arbitrary key-value metadata attached to the application. Null when no metadata is set.

object
key
additional properties
string
verifications
required
Array<object>
object
field
required
string
source
required
string
verified
required
boolean
details
string
verifiedAt
string format: date-time
reviewers
required
Array<object>
object
id
required
string
externalId
required
string
firstName
required
string
lastName
required
string
email
required
string
title
required
string
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
risk
object
score
required

Overall numeric risk score for the application. The accompanying band is derived from this number using the account risk scoring strategy; it is not persisted separately. See the Risk Scoring guide for the strategy-specific bands.

number
band
required

Authoritative overall risk band derived from score using the owning account’s risk scoring strategy.

string
Allowed values: LOW MEDIUM HIGH PROHIBITED
data

Per-factor breakdown. Each entry is one risk factor and its contribution to the overall score.

Array<object>
object
category
required

Identifier for this risk factor. The available factors depend on the account risk scoring strategy, so this is an open string (e.g. “Jurisdiction”, “Country Risk”, “PEP”), not a fixed enum.

string
score
required

This factor’s contribution to the overall risk score.

number
level
required

Qualitative level for this factor: low, medium, high, prohibited, or bonus (a risk-reducing factor, e.g. a regulated entity). Lowercase, distinct from the uppercase overall risk band derived from RiskData.score.

string
title
required

Human-readable title for this risk factor.

string
keyPeople
Array<object>
object
id
required
string
joinId

Join row id (business_individuals.id or business_companies.id), used for unlink/edit operations

string
type
required
string
Allowed values: individual business
applicationId
required
string
status
required
string
stewardProfile
boolean
address
object
street
string
apartment
string
city
string
state
string
country
string
postalCode
string
firstName
required
string
middleName
string
lastName
required
string
roles
required
Array<string>
Allowed values: DIRECTOR SHAREHOLDER UBO GENERAL_PARTNER LIMITED_PARTNER INVESTMENT_MANAGER FOUNDER COUNCIL_MEMBER TRUSTEE SETTLOR BENEFICIARY PROTECTOR ENFORCER GUARDIAN INTERMEDIARY CONTROLLING_PERSON INTERESTED_PARTY AUTHORIZED_SIGNATORY RELATED_PARTY PARENT PLAN_SPONSOR SENIOR_MANAGING_OFFICIAL EXECUTOR_ADMINISTRATOR DECEASED_PERSON JOINT_ACCOUNT MANAGER SIGNER MEMBER OFFICER
riskScore
number
riskBand

Risk band published for this score under the owning account’s strategy. Null when there is no score.

string
nullable
Allowed values: LOW MEDIUM HIGH PROHIBITED
screeningSummary
required

Which screening types to include

Array<string>
Allowed values: ADVERSE_MEDIA SANCTIONS WARNING PEP
openTasksCount

Count of PENDING tasks on this key person’s own application; 0 when they have none of their own

number
explanation

WHY this person is a beneficial owner of the applicant, with the chain the holding runs through: projected from the persisted ownership graph, the SAME projection the onboarding drawer and the export read. Null for a business party (a company is never a beneficial owner), and on an application with no persisted graph.

object
bases
required

Every basis, in graph order. Never empty: a party who is not a beneficial owner carries no explanation object at all (the field above is null), rather than an explanation with nothing in it.

Array<object>
object
reason
required
string
Allowed values: direct_ownership indirect_ownership settlor beneficiary trustee protector_control enforcer_control controls_corporate_trustee ultimate_control
label
required

The plain label for the reason, from UBO_BASIS_REASON_LABELS in @steward/core.

string
percent

The stake in the applicant. Present ONLY on the two ownership reasons: a role-based basis carries no computable stake.

number
viaEntityName

The chain entity this basis runs through, by name. Absent on a direct holding.

string
summary
required

Every basis in one sentence: the string a chip, a card or an export column shows.

string
ownershipPercentage
required

The stake in the applicant. NULL (not 0) for a role-based beneficial owner, who holds no computable stake.

number
nullable
paths
required
Array<Array<object>>
pathAmbiguous
required

More than one chain reaches the same entity; the path shown is the first one found.

boolean
sourceLabel
required

The document the basis rests on, named as a reviewer reads it: Shareholder register, Structure chart, Trust Deed. Null only where the graph recorded no evidence document for any basis. Where two documents disagreed, surfaces show the GOVERNING one instead, in the same place and the same shape.

string
nullable
discrepancies

Evidence that disagrees about the entities this party’s ownership runs through: both sources’ holders, which one governs and why, and what is outstanding. Empty when nothing disagrees.

Array<object>
object
kind
required
string
Allowed values: chart_vs_register pending_membership
entityKey
required

The ownership-graph key of the entity the sources disagree about.

string
entityName
required
string
sources
required
Array<object>
object
role
required
string
Allowed values: chart register committed later_evidence
documentIds
required
Array<string>
label
required

The source in words, from OWNERSHIP_DISCREPANCY_COPY in @steward/core.

string
certified
boolean
date

The document’s own date, where it states one.

string format: date
nullable
holders
required
Array<object>
object
name
required
string
percent
required

The percentage THIS source states. Null where it states none.

number
nullable
governing
required

Null for later evidence, which decides nothing until the ownership step is re-committed.

object
source
required
string
Allowed values: chart register committed later_evidence
label
required
string
rule
required

Why this source governs, in one sentence: e.g. “uncertified chart, so the register governs”.

string
resolved
required

Whether the graph has already acted on the disagreement.

boolean
outstandingAction
required

What is outstanding, in words. Null when nothing is.

string
nullable
recordedAt

When the disagreement was recorded. Present for pending_membership, the kind that stays open: a reviewer asks “since when is this outstanding”. Absent for chart_vs_register, which is settled and whose sources carry their own document dates.

string format: date-time
ownershipPath

For a BUSINESS party: applicant → … → this entity. A company has a position in the chain rather than a basis.

Array<object>
object
entityKey
required
string
name
required
string
tier
required

Where the walk placed this entity. Null when it never tiered it: ‘not known to be indirect’, never a tier to infer.

string
nullable
Allowed values: applicant parent intermediary
edgeKind

How the previous hop holds this one. Absent on the applicant, which nothing holds.

string
Allowed values: ownership trustee_of foundation_of
percent

The stake on the edge into this hop, where one is known. A fiduciary edge never has one.

number
tradingExperience
object
shares
string
derivatives
string
otcDerivatives
string
tradingMethod
string
hasOccupationalExperience
boolean
hasFormalQualification
boolean
labelIds

Label IDs assigned to this application

Array<string>
skip2FA
boolean
periodicReview

This application’s periodic review, or null when it has none. Null is load-bearing: an application that was never approved has no review, and every review surface (the list cell, the tab, the header badge) hides itself on it rather than rendering an empty badge.

object
status
required

Four states, or null while the review is SCHEDULED but still beyond the appears window. Null is its own unlisted state: the review exists, the list simply does not carry it yet, so the cell says “Scheduled” with the date while the tab and the initial approval date stay reachable.

string
Allowed values: UPCOMING OVERDUE IN_PROGRESS REVIEWED
reviewDate
required

When the next review is due. Rendered as RELATIVE time (“in 4d”, “21d ago”) while the review is inside the appears window, and as an absolute date beyond it, where a relative distance of years reads as noise.

string format: date-time
nullable
remainingSteps

Client steps still outstanding on the open cycle. 0 means ready to review. Null when no cycle is open.

number
nullable
open
required

Whether a review cycle is open. Not readable off the status: an open review past its date reads Overdue.

boolean
automated
required

Whether automated outreach is on for this application.

boolean
missingEmail
required

No email on file, so automation is forced off and the row carries a warning chip.

boolean
workflowId

Workflow used by this application, for Key People settings deep links.

string
screenedOnly
Array<object>
object
id
required
string
type
required
string
Allowed values: individual business
name
required
string
roles
required
Array<string>
reason

One supported reason for screening without onboarding; absent when the cause cannot be established.

string
onboardingStep
object
stepProgressPercentage
number
identifier
string
nullable
title
string
accountId
string
unmappedResponses
Array<object>
object
label
required
string
stepId
required
string
values
required
Array<object>
object
id
required
string
label
required
string
value
object
fatcaCrs
object
tin
string
noTinExplanation
string
isUsPerson
string
isUsPersonEvidence
string
isSpecifiedUsPerson
string
specifiedUsPersonExplanation
string
fatcaClassification
string
institutionalClassification
string
giin
string
noGiinReason
string
noGiinExplanation
string
crsEntityClassification
string
taxResidencyCountry
string
giinRegistryAdvisory
object
giin
required
string
entityName
string
nullable
jurisdiction
string
nullable
status
required
string
Allowed values: listed absent mismatch
warning
string
nullable
snapshotVersion
required
string
publicationMonth
required
string
cutoffDate
required
string format: date
registrationNumber
string
taxIdentificationNumber
string
entityType
string
regulator
object
name
string
nullable
number
string
nullable
jurisdiction

ISO 3166-1 alpha-2 country code

string format: iso-3166-1-alpha-2
incorporationDate
string format: date
establishmentDate
string format: date
registrationDate
string format: date
trustType
string
legalForm
string
purpose
string
businessActivity
string
industry
string
subIndustry
string
address
object
street
string
apartment
string
city
string
state
string
country
string
postalCode
string
registeredAddress
object
street
string
apartment
string
city
string
state
string
country
string
postalCode
string
tradingAddress
object
street
string
apartment
string
city
string
state
string
country
string
postalCode
string
phoneNumber
object
countryCode
required
string
phoneNumber
required
string
website
string
sicCode
string
vatNumber
string
taxId
string
referrer
string
referrerNote
string
companyTurnover
string
annualFlow
string
estimatedNumberOfPayments
number
expectedFxRequirement
string
currenciesRequired
Array<string>
countriesSentTo
Array<string>
countriesReceivedFrom
Array<string>
paymentPurpose
string
fundingSource
string
investmentAmount
number
investmentAmountCurrency
string
refreshedAt
string
isAudited
boolean
isRegulated
boolean
nullable
hasPep
boolean
ownershipLayers
number
>= 1 <= 3
legalEntityType
string
regulatoryAuthority
string
regulatoryNumber
string
parentApplicationId

ID of the parent business application that spawned this business application as a related corporate party (e.g. corporate UBO, holding company). Absent when the business application is a standalone primary onboarding.

string
parentRoles

Roles this business holds in the parent business application. Only present when parentApplicationId is set.

Array<string>
Allowed values: DIRECTOR SHAREHOLDER UBO GENERAL_PARTNER LIMITED_PARTNER INVESTMENT_MANAGER FOUNDER COUNCIL_MEMBER TRUSTEE SETTLOR BENEFICIARY PROTECTOR GUARDIAN INTERMEDIARY AUTHORIZED_SIGNATORY CONTROLLING_PERSON RELATED_PARTY PARENT PLAN_SPONSOR SENIOR_MANAGING_OFFICIAL EXECUTOR_ADMINISTRATOR DECEASED_PERSON MEMBER
displayConfiguration
object
hiddenFields
Array<string>
hiddenSections
Array<string>
screening
Array<object>
object
id
required
string
type
required
string
Allowed values: individual business
status
string
Allowed values: IN_REVIEW CONFIRMED DISMISSED NOT_REVIEWED TRUE_MATCH FALSE_POSITIVE
suggestedStatus
string
Allowed values: IN_REVIEW CONFIRMED DISMISSED NOT_REVIEWED TRUE_MATCH FALSE_POSITIVE
summary
required

Which screening types to include

Array<string>
Allowed values: ADVERSE_MEDIA SANCTIONS WARNING PEP
screeningState

Whether this party has actually been searched on its current details: missing, pending, failed, stale or clear.

object
state
required
string
Allowed values: MISSING PENDING FAILED STALE CLEAR
reason

Why the party is not CLEAR, when the ledger can say (a skip or failure message).

string
nullable
lastAttemptAt

Last attempt of any outcome, ISO timestamp.

string format: date-time
nullable
lastSearchedAt

Last successful search on the current inputs, ISO timestamp.

string format: date-time
nullable
canScreen
required

Whether a manual (re-)screen is a real option right now. False for CLEAR and PENDING, and for a MISSING party that has no enrolled screening source to search with (a globally disabled application, or one with none configured), so offering the control there would only invite a click the backend always refuses.

boolean
legacyWithoutBaseline

Whether all incomplete sources have recorded successful historical usage lacking an input fingerprint baseline. Authoritative when present: true indicates a qualifying legacy search without baseline.

boolean
nullable
hasPreviousCompletedResult

Whether a recognized provider update wait has a prior completed screening result available for presentation. This does not assert current-input completion.

boolean
nullable
address
object
street
string
apartment
string
city
string
state
string
country
string
postalCode
string
firstName
required
string
middleName
string
lastName
required
string
roles
Array<string>
Allowed values: DIRECTOR SHAREHOLDER UBO GENERAL_PARTNER LIMITED_PARTNER INVESTMENT_MANAGER FOUNDER COUNCIL_MEMBER TRUSTEE SETTLOR BENEFICIARY PROTECTOR ENFORCER GUARDIAN INTERMEDIARY CONTROLLING_PERSON INTERESTED_PARTY AUTHORIZED_SIGNATORY RELATED_PARTY PARENT PLAN_SPONSOR SENIOR_MANAGING_OFFICIAL EXECUTOR_ADMINISTRATOR DECEASED_PERSON JOINT_ACCOUNT MANAGER SIGNER MEMBER OFFICER
dateOfBirth
string format: date
yearOfBirth
number
monthOfBirth
number
hasNotReviewed
boolean
hasDismissed
boolean
confirmedMatchesCount
number
hasInReview
boolean
inReviewCount
number
falsePositivesCount
number
monitoringHitsCount
number
summaryText
string
jurisdiction

ISO 3166-1 alpha-2 country code

string format: iso-3166-1-alpha-2
explanation

WHY this party is a beneficial owner of the applicant, with the chain the holding runs through: the SAME projection the Key People tab, the onboarding drawer and the export read. The screening tab is where a party the workflow only SCREENS appears, which since DEV-2977 is where most beneficial owners are; it showed a bare role chip. Null for a business party (a company is never a beneficial owner) and on an application with no persisted graph.

object
bases
required

Every basis, in graph order. Never empty: a party who is not a beneficial owner carries no explanation object at all (the field above is null), rather than an explanation with nothing in it.

Array<object>
object
reason
required
string
Allowed values: direct_ownership indirect_ownership settlor beneficiary trustee protector_control enforcer_control controls_corporate_trustee ultimate_control
label
required

The plain label for the reason, from UBO_BASIS_REASON_LABELS in @steward/core.

string
percent

The stake in the applicant. Present ONLY on the two ownership reasons: a role-based basis carries no computable stake.

number
viaEntityName

The chain entity this basis runs through, by name. Absent on a direct holding.

string
summary
required

Every basis in one sentence: the string a chip, a card or an export column shows.

string
ownershipPercentage
required

The stake in the applicant. NULL (not 0) for a role-based beneficial owner, who holds no computable stake.

number
nullable
paths
required
Array<Array<object>>
pathAmbiguous
required

More than one chain reaches the same entity; the path shown is the first one found.

boolean
sourceLabel
required

The document the basis rests on, named as a reviewer reads it: Shareholder register, Structure chart, Trust Deed. Null only where the graph recorded no evidence document for any basis. Where two documents disagreed, surfaces show the GOVERNING one instead, in the same place and the same shape.

string
nullable
discrepancies

Evidence that disagrees about the entities this party’s ownership runs through. Empty when nothing disagrees.

Array<object>
object
kind
required
string
Allowed values: chart_vs_register pending_membership
entityKey
required

The ownership-graph key of the entity the sources disagree about.

string
entityName
required
string
sources
required
Array<object>
object
role
required
string
Allowed values: chart register committed later_evidence
documentIds
required
Array<string>
label
required

The source in words, from OWNERSHIP_DISCREPANCY_COPY in @steward/core.

string
certified
boolean
date

The document’s own date, where it states one.

string format: date
nullable
holders
required
Array<object>
object
name
required
string
percent
required

The percentage THIS source states. Null where it states none.

number
nullable
governing
required

Null for later evidence, which decides nothing until the ownership step is re-committed.

object
source
required
string
Allowed values: chart register committed later_evidence
label
required
string
rule
required

Why this source governs, in one sentence: e.g. “uncertified chart, so the register governs”.

string
resolved
required

Whether the graph has already acted on the disagreement.

boolean
outstandingAction
required

What is outstanding, in words. Null when nothing is.

string
nullable
recordedAt

When the disagreement was recorded. Present for pending_membership, the kind that stays open: a reviewer asks “since when is this outstanding”. Absent for chart_vs_register, which is settled and whose sources carry their own document dates.

string format: date-time
ownershipPath

For a BUSINESS party: applicant → … → this entity. A company has a position in the chain rather than a basis.

Array<object>
object
entityKey
required
string
name
required
string
tier
required

Where the walk placed this entity. Null when it never tiered it: ‘not known to be indirect’, never a tier to infer.

string
nullable
Allowed values: applicant parent intermediary
edgeKind

How the previous hop holds this one. Absent on the applicant, which nothing holds.

string
Allowed values: ownership trustee_of foundation_of
percent

The stake on the edge into this hop, where one is known. A fiduciary edge never has one.

number
individualApplication

Individual application details (present for individual type applications)

object
name
required
string
id
required
string
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
verified
required
boolean
manual
required

Whether this is a manual application

boolean
customerType
required
string
Allowed values: BUSINESS INDIVIDUAL
accountType
required

Display-facing account classification for the Overview meta-field. “entity” = business application; “joint” = individual application linked to a second individual via a JOINT_ACCOUNT entity link; “individual” = single personal application.

string
Allowed values: individual joint entity
stageEnteredAt

When the application entered its current stage. Drives the “pending for N days” meta-field for non-approved applications. Null for legacy rows created before stage tracking, so callers fall back to createdAt.

string format: date-time
nullable
signatureDocument
object
id
required

Document ID

string
signerName
required
string
date
required
string
url
required
string
hidden
required

Whether the signature document is hidden

boolean
status
string
metadata

Arbitrary key-value metadata attached to the application. Null when no metadata is set.

object
key
additional properties
string
verifications
Array<object>
object
field
required
string
source
required
string
verified
required
boolean
details
string
verifiedAt
string format: date-time
reviewers
required
Array<object>
object
id
required
string
externalId
required
string
firstName
required
string
lastName
required
string
email
required
string
title
required
string
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
risk
object
score
required

Overall numeric risk score for the application. The accompanying band is derived from this number using the account risk scoring strategy; it is not persisted separately. See the Risk Scoring guide for the strategy-specific bands.

number
band
required

Authoritative overall risk band derived from score using the owning account’s risk scoring strategy.

string
Allowed values: LOW MEDIUM HIGH PROHIBITED
data

Per-factor breakdown. Each entry is one risk factor and its contribution to the overall score.

Array<object>
object
category
required

Identifier for this risk factor. The available factors depend on the account risk scoring strategy, so this is an open string (e.g. “Jurisdiction”, “Country Risk”, “PEP”), not a fixed enum.

string
score
required

This factor’s contribution to the overall risk score.

number
level
required

Qualitative level for this factor: low, medium, high, prohibited, or bonus (a risk-reducing factor, e.g. a regulated entity). Lowercase, distinct from the uppercase overall risk band derived from RiskData.score.

string
title
required

Human-readable title for this risk factor.

string
keyPeople
Array<object>
object
id
required
string
joinId

Join row id (business_individuals.id or business_companies.id), used for unlink/edit operations

string
type
required
string
Allowed values: individual business
applicationId
required
string
status
required
string
stewardProfile
boolean
address
object
street
string
apartment
string
city
string
state
string
country
string
postalCode
string
firstName
required
string
middleName
string
lastName
required
string
roles
required
Array<string>
Allowed values: DIRECTOR SHAREHOLDER UBO GENERAL_PARTNER LIMITED_PARTNER INVESTMENT_MANAGER FOUNDER COUNCIL_MEMBER TRUSTEE SETTLOR BENEFICIARY PROTECTOR ENFORCER GUARDIAN INTERMEDIARY CONTROLLING_PERSON INTERESTED_PARTY AUTHORIZED_SIGNATORY RELATED_PARTY PARENT PLAN_SPONSOR SENIOR_MANAGING_OFFICIAL EXECUTOR_ADMINISTRATOR DECEASED_PERSON JOINT_ACCOUNT MANAGER SIGNER MEMBER OFFICER
riskScore
number
riskBand

Risk band published for this score under the owning account’s strategy. Null when there is no score.

string
nullable
Allowed values: LOW MEDIUM HIGH PROHIBITED
screeningSummary
required

Which screening types to include

Array<string>
Allowed values: ADVERSE_MEDIA SANCTIONS WARNING PEP
openTasksCount

Count of PENDING tasks on this key person’s own application; 0 when they have none of their own

number
explanation

WHY this person is a beneficial owner of the applicant, with the chain the holding runs through: projected from the persisted ownership graph, the SAME projection the onboarding drawer and the export read. Null for a business party (a company is never a beneficial owner), and on an application with no persisted graph.

object
bases
required

Every basis, in graph order. Never empty: a party who is not a beneficial owner carries no explanation object at all (the field above is null), rather than an explanation with nothing in it.

Array<object>
object
reason
required
string
Allowed values: direct_ownership indirect_ownership settlor beneficiary trustee protector_control enforcer_control controls_corporate_trustee ultimate_control
label
required

The plain label for the reason, from UBO_BASIS_REASON_LABELS in @steward/core.

string
percent

The stake in the applicant. Present ONLY on the two ownership reasons: a role-based basis carries no computable stake.

number
viaEntityName

The chain entity this basis runs through, by name. Absent on a direct holding.

string
summary
required

Every basis in one sentence: the string a chip, a card or an export column shows.

string
ownershipPercentage
required

The stake in the applicant. NULL (not 0) for a role-based beneficial owner, who holds no computable stake.

number
nullable
paths
required
Array<Array<object>>
pathAmbiguous
required

More than one chain reaches the same entity; the path shown is the first one found.

boolean
sourceLabel
required

The document the basis rests on, named as a reviewer reads it: Shareholder register, Structure chart, Trust Deed. Null only where the graph recorded no evidence document for any basis. Where two documents disagreed, surfaces show the GOVERNING one instead, in the same place and the same shape.

string
nullable
discrepancies

Evidence that disagrees about the entities this party’s ownership runs through: both sources’ holders, which one governs and why, and what is outstanding. Empty when nothing disagrees.

Array<object>
object
kind
required
string
Allowed values: chart_vs_register pending_membership
entityKey
required

The ownership-graph key of the entity the sources disagree about.

string
entityName
required
string
sources
required
Array<object>
object
role
required
string
Allowed values: chart register committed later_evidence
documentIds
required
Array<string>
label
required

The source in words, from OWNERSHIP_DISCREPANCY_COPY in @steward/core.

string
certified
boolean
date

The document’s own date, where it states one.

string format: date
nullable
holders
required
Array<object>
object
name
required
string
percent
required

The percentage THIS source states. Null where it states none.

number
nullable
governing
required

Null for later evidence, which decides nothing until the ownership step is re-committed.

object
source
required
string
Allowed values: chart register committed later_evidence
label
required
string
rule
required

Why this source governs, in one sentence: e.g. “uncertified chart, so the register governs”.

string
resolved
required

Whether the graph has already acted on the disagreement.

boolean
outstandingAction
required

What is outstanding, in words. Null when nothing is.

string
nullable
recordedAt

When the disagreement was recorded. Present for pending_membership, the kind that stays open: a reviewer asks “since when is this outstanding”. Absent for chart_vs_register, which is settled and whose sources carry their own document dates.

string format: date-time
ownershipPath

For a BUSINESS party: applicant → … → this entity. A company has a position in the chain rather than a basis.

Array<object>
object
entityKey
required
string
name
required
string
tier
required

Where the walk placed this entity. Null when it never tiered it: ‘not known to be indirect’, never a tier to infer.

string
nullable
Allowed values: applicant parent intermediary
edgeKind

How the previous hop holds this one. Absent on the applicant, which nothing holds.

string
Allowed values: ownership trustee_of foundation_of
percent

The stake on the edge into this hop, where one is known. A fiduciary edge never has one.

number
tradingExperience
object
shares
string
derivatives
string
otcDerivatives
string
tradingMethod
string
hasOccupationalExperience
boolean
hasFormalQualification
boolean
labelIds

Label IDs assigned to this application

Array<string>
skip2FA
boolean
periodicReview

This application’s periodic review, or null when it has none. Null is load-bearing: an application that was never approved has no review, and every review surface (the list cell, the tab, the header badge) hides itself on it rather than rendering an empty badge.

object
status
required

Four states, or null while the review is SCHEDULED but still beyond the appears window. Null is its own unlisted state: the review exists, the list simply does not carry it yet, so the cell says “Scheduled” with the date while the tab and the initial approval date stay reachable.

string
Allowed values: UPCOMING OVERDUE IN_PROGRESS REVIEWED
reviewDate
required

When the next review is due. Rendered as RELATIVE time (“in 4d”, “21d ago”) while the review is inside the appears window, and as an absolute date beyond it, where a relative distance of years reads as noise.

string format: date-time
nullable
remainingSteps

Client steps still outstanding on the open cycle. 0 means ready to review. Null when no cycle is open.

number
nullable
open
required

Whether a review cycle is open. Not readable off the status: an open review past its date reads Overdue.

boolean
automated
required

Whether automated outreach is on for this application.

boolean
missingEmail
required

No email on file, so automation is forced off and the row carries a warning chip.

boolean
onboardingStep
object
stepProgressPercentage
number
identifier
string
nullable
title
string
accountId
string
unmappedResponses
Array<object>
object
label
required
string
stepId
required
string
values
required
Array<object>
object
id
required
string
label
required
string
value
object
firstName
string
middleName
string
lastName
string
dateOfBirth
string format: date
yearOfBirth
number
monthOfBirth
number
countryOfBirth

ISO 3166-1 alpha-2 country code

string format: iso-3166-1-alpha-2
nationality

ISO 3166-1 alpha-2 country code

string format: iso-3166-1-alpha-2
address
object
street
string
apartment
string
city
string
state
string
country
string
postalCode
string
phoneNumber
object
countryCode
required
string
phoneNumber
required
string
otherNationality

ISO 3166-1 alpha-2 country code

string format: iso-3166-1-alpha-2
taxResidency

ISO 3166-1 alpha-2 country code

string format: iso-3166-1-alpha-2
secondaryTaxResidency

ISO 3166-1 alpha-2 country code

string format: iso-3166-1-alpha-2
taxIdentificationNumber
string
otherTaxIdentificationNumber
string
taxResidences
Array<object>
object
country
string
tin
string
email
string
amountToBeInvested
number
amountToBeInvestedCurrency
string
usCitizen
boolean
isPEP
boolean
roles
Array<string>
Allowed values: DIRECTOR SHAREHOLDER UBO GENERAL_PARTNER LIMITED_PARTNER INVESTMENT_MANAGER FOUNDER COUNCIL_MEMBER TRUSTEE SETTLOR BENEFICIARY PROTECTOR ENFORCER GUARDIAN INTERMEDIARY CONTROLLING_PERSON INTERESTED_PARTY AUTHORIZED_SIGNATORY RELATED_PARTY PARENT PLAN_SPONSOR SENIOR_MANAGING_OFFICIAL EXECUTOR_ADMINISTRATOR DECEASED_PERSON JOINT_ACCOUNT MANAGER SIGNER MEMBER OFFICER
onboarding
boolean
employmentStatus
string
occupation
string
idVerification
object
documentType
string
documentId
string
fileUrl
string
provider
string
providerId
string
verified
required
boolean
kycDataVerificationSkipReason

Present when individual KYC was skipped because a national ID is required in the applicant’s current residence country. Uses the form “KYC skipped because national ID is required in {country}.” This denotes a check that did not run, not a failed match. Null or absent otherwise.

string
nullable
kycDataVerificationIncompleteReason

Present when the latest individual KYC run was incomplete because some Trulioo data sources did not respond. Uses the form “KYC incomplete: {n} of {total} Trulioo data sources did not respond. KYC runs again when the application is resubmitted.” Results from the sources that did respond are kept. Null or absent otherwise.

string
nullable
stewardProfile
boolean
screening
Array<object>
object
id
required
string
type
required
string
Allowed values: individual business
status
string
Allowed values: IN_REVIEW CONFIRMED DISMISSED NOT_REVIEWED TRUE_MATCH FALSE_POSITIVE
suggestedStatus
string
Allowed values: IN_REVIEW CONFIRMED DISMISSED NOT_REVIEWED TRUE_MATCH FALSE_POSITIVE
summary
required

Which screening types to include

Array<string>
Allowed values: ADVERSE_MEDIA SANCTIONS WARNING PEP
screeningState

Whether this party has actually been searched on its current details: missing, pending, failed, stale or clear.

object
state
required
string
Allowed values: MISSING PENDING FAILED STALE CLEAR
reason

Why the party is not CLEAR, when the ledger can say (a skip or failure message).

string
nullable
lastAttemptAt

Last attempt of any outcome, ISO timestamp.

string format: date-time
nullable
lastSearchedAt

Last successful search on the current inputs, ISO timestamp.

string format: date-time
nullable
canScreen
required

Whether a manual (re-)screen is a real option right now. False for CLEAR and PENDING, and for a MISSING party that has no enrolled screening source to search with (a globally disabled application, or one with none configured), so offering the control there would only invite a click the backend always refuses.

boolean
legacyWithoutBaseline

Whether all incomplete sources have recorded successful historical usage lacking an input fingerprint baseline. Authoritative when present: true indicates a qualifying legacy search without baseline.

boolean
nullable
hasPreviousCompletedResult

Whether a recognized provider update wait has a prior completed screening result available for presentation. This does not assert current-input completion.

boolean
nullable
address
object
street
string
apartment
string
city
string
state
string
country
string
postalCode
string
firstName
required
string
middleName
string
lastName
required
string
roles
Array<string>
Allowed values: DIRECTOR SHAREHOLDER UBO GENERAL_PARTNER LIMITED_PARTNER INVESTMENT_MANAGER FOUNDER COUNCIL_MEMBER TRUSTEE SETTLOR BENEFICIARY PROTECTOR ENFORCER GUARDIAN INTERMEDIARY CONTROLLING_PERSON INTERESTED_PARTY AUTHORIZED_SIGNATORY RELATED_PARTY PARENT PLAN_SPONSOR SENIOR_MANAGING_OFFICIAL EXECUTOR_ADMINISTRATOR DECEASED_PERSON JOINT_ACCOUNT MANAGER SIGNER MEMBER OFFICER
dateOfBirth
string format: date
yearOfBirth
number
monthOfBirth
number
hasNotReviewed
boolean
hasDismissed
boolean
confirmedMatchesCount
number
hasInReview
boolean
inReviewCount
number
falsePositivesCount
number
monitoringHitsCount
number
summaryText
string
jurisdiction

ISO 3166-1 alpha-2 country code

string format: iso-3166-1-alpha-2
explanation

WHY this party is a beneficial owner of the applicant, with the chain the holding runs through: the SAME projection the Key People tab, the onboarding drawer and the export read. The screening tab is where a party the workflow only SCREENS appears, which since DEV-2977 is where most beneficial owners are; it showed a bare role chip. Null for a business party (a company is never a beneficial owner) and on an application with no persisted graph.

object
bases
required

Every basis, in graph order. Never empty: a party who is not a beneficial owner carries no explanation object at all (the field above is null), rather than an explanation with nothing in it.

Array<object>
object
reason
required
string
Allowed values: direct_ownership indirect_ownership settlor beneficiary trustee protector_control enforcer_control controls_corporate_trustee ultimate_control
label
required

The plain label for the reason, from UBO_BASIS_REASON_LABELS in @steward/core.

string
percent

The stake in the applicant. Present ONLY on the two ownership reasons: a role-based basis carries no computable stake.

number
viaEntityName

The chain entity this basis runs through, by name. Absent on a direct holding.

string
summary
required

Every basis in one sentence: the string a chip, a card or an export column shows.

string
ownershipPercentage
required

The stake in the applicant. NULL (not 0) for a role-based beneficial owner, who holds no computable stake.

number
nullable
paths
required
Array<Array<object>>
pathAmbiguous
required

More than one chain reaches the same entity; the path shown is the first one found.

boolean
sourceLabel
required

The document the basis rests on, named as a reviewer reads it: Shareholder register, Structure chart, Trust Deed. Null only where the graph recorded no evidence document for any basis. Where two documents disagreed, surfaces show the GOVERNING one instead, in the same place and the same shape.

string
nullable
discrepancies

Evidence that disagrees about the entities this party’s ownership runs through. Empty when nothing disagrees.

Array<object>
object
kind
required
string
Allowed values: chart_vs_register pending_membership
entityKey
required

The ownership-graph key of the entity the sources disagree about.

string
entityName
required
string
sources
required
Array<object>
object
role
required
string
Allowed values: chart register committed later_evidence
documentIds
required
Array<string>
label
required

The source in words, from OWNERSHIP_DISCREPANCY_COPY in @steward/core.

string
certified
boolean
date

The document’s own date, where it states one.

string format: date
nullable
holders
required
Array<object>
object
name
required
string
percent
required

The percentage THIS source states. Null where it states none.

number
nullable
governing
required

Null for later evidence, which decides nothing until the ownership step is re-committed.

object
source
required
string
Allowed values: chart register committed later_evidence
label
required
string
rule
required

Why this source governs, in one sentence: e.g. “uncertified chart, so the register governs”.

string
resolved
required

Whether the graph has already acted on the disagreement.

boolean
outstandingAction
required

What is outstanding, in words. Null when nothing is.

string
nullable
recordedAt

When the disagreement was recorded. Present for pending_membership, the kind that stays open: a reviewer asks “since when is this outstanding”. Absent for chart_vs_register, which is settled and whose sources carry their own document dates.

string format: date-time
ownershipPath

For a BUSINESS party: applicant → … → this entity. A company has a position in the chain rather than a basis.

Array<object>
object
entityKey
required
string
name
required
string
tier
required

Where the walk placed this entity. Null when it never tiered it: ‘not known to be indirect’, never a tier to infer.

string
nullable
Allowed values: applicant parent intermediary
edgeKind

How the previous hop holds this one. Absent on the applicant, which nothing holds.

string
Allowed values: ownership trustee_of foundation_of
percent

The stake on the edge into this hop, where one is known. A fiduciary edge never has one.

number
accountTurnover
string
annualFlow
string
estimatedNumberOfPayments
number
expectedFxRequirement
string
currenciesRequired
Array<string>
countriesSentTo
Array<string>
countriesReceivedFrom
Array<string>
paymentPurpose
string
fundingSource
string
parentApplicationId

ID of the parent business application that spawned this individual application as a key person (e.g. UBO, director, shareholder). Absent when the individual application is a standalone primary onboarding.

string
parentRoles

Roles this individual holds in the parent business application. Only present when parentApplicationId is set.

Array<string>
Allowed values: DIRECTOR SHAREHOLDER UBO GENERAL_PARTNER LIMITED_PARTNER INVESTMENT_MANAGER FOUNDER COUNCIL_MEMBER TRUSTEE SETTLOR BENEFICIARY PROTECTOR ENFORCER GUARDIAN INTERMEDIARY CONTROLLING_PERSON INTERESTED_PARTY AUTHORIZED_SIGNATORY RELATED_PARTY PARENT PLAN_SPONSOR SENIOR_MANAGING_OFFICIAL EXECUTOR_ADMINISTRATOR DECEASED_PERSON JOINT_ACCOUNT MANAGER SIGNER MEMBER OFFICER
displayConfiguration
object
hiddenFields
Array<string>
hiddenSections
Array<string>
submitter

The submitter (person filling out the application): name and email

object
firstName
required
string
lastName
required
string
email
required
string
phoneNumber
object
countryCode
required
string
phoneNumber
required
string
role

The contact’s role, free text.

string
nullable
capacity

The contact’s capacity, free text.

string
nullable
status
required

Current status: decides which Request Additional Info actions apply.

string
Allowed values: PENDING SUBMITTED APPROVED REJECTED
archive

Present only while the investor is archived. Its presence is what makes the profile read only.

object
archivedAt
required
string format: date-time
archivedByName

Who archived the investor

string
nullable
reason
string
nullable
partyCount
required

Screened parties whose monitoring stopped with this investor

number
applicantScreening
required

Whether the applicant itself can be screened from the Screening tab, and when it last was.

object
entityId

The applicant entity, or null when the application has none yet. Matches the id of the applicant row in screening.

string
nullable
requiresCompanyName
required

A business application created without a company name. The applicant entity that a screening is anchored to cannot be created until a name is supplied, so the Add Screening dialog asks for it once.

boolean
searchedAt

When the applicant was last searched successfully by any source on this application. Null means it has never been screened.

string format: date-time
nullable
screeningState

The applicant’s resolved screening state: the same value its row carries. This, not searchedAt, is what decides whether the Screen action is offered: searchedAt is set by ANY historical success, so an applicant whose details have since changed (STALE) or whose search failed reads as screened and loses the only manual retry there is. Null when the API cannot resolve one.

object
state
required
string
Allowed values: MISSING PENDING FAILED STALE CLEAR
reason

Why the party is not CLEAR, when the ledger can say (a skip or failure message).

string
nullable
lastAttemptAt

Last attempt of any outcome, ISO timestamp.

string format: date-time
nullable
lastSearchedAt

Last successful search on the current inputs, ISO timestamp.

string format: date-time
nullable
canScreen
required

Whether a manual (re-)screen is a real option right now. False for CLEAR and PENDING, and for a MISSING party that has no enrolled screening source to search with (a globally disabled application, or one with none configured), so offering the control there would only invite a click the backend always refuses.

boolean
legacyWithoutBaseline

Whether all incomplete sources have recorded successful historical usage lacking an input fingerprint baseline. Authoritative when present: true indicates a qualifying legacy search without baseline.

boolean
nullable
hasPreviousCompletedResult

Whether a recognized provider update wait has a prior completed screening result available for presentation. This does not assert current-input completion.

boolean
nullable
withSteward
required

True while Steward is reviewing this application and its contents are withheld from the client. For staff, also true while any linked parent is still with Steward.

boolean
Examples
{
"hidden": false,
"hiddenSource": null,
"businessApplication": {
"name": "Acme Corporation",
"id": "507f1f77bcf86cd799439011",
"createdAt": "2026-03-01T10:00:00.000Z",
"updatedAt": "2026-03-30T12:00:00.000Z",
"verified": true,
"manual": false,
"customerType": "BUSINESS",
"accountType": "entity",
"stageEnteredAt": "2026-03-20T09:00:00.000Z",
"signatureDocument": {
"id": "507f1f77bcf86cd799439011",
"signerName": "Michael Chen",
"date": "2026-03-30T12:00:00.000Z",
"url": "https://storage.example.com/signatures/signed-agreement.pdf",
"hidden": false
},
"status": "APPROVED",
"metadata": {
"externalRef": "abc-123",
"plan": "enterprise"
},
"verifications": [
{
"field": "companyName",
"source": "companies-house",
"verified": true,
"details": "Company name matches registrar records",
"verifiedAt": "2026-03-30T12:00:00.000Z"
}
],
"reviewers": [
{
"id": "60d5ecb54b24003a7c8e92b2",
"externalId": "auth0|507f1f77bcf86cd799439011",
"firstName": "John",
"lastName": "Smith",
"email": "john.smith@example.com",
"title": "Compliance Officer",
"createdAt": "2026-03-30T12:00:00.000Z",
"updatedAt": "2026-03-30T12:00:00.000Z"
}
],
"risk": {
"score": 10,
"band": "LOW",
"data": [
{
"category": "Jurisdiction",
"score": 10,
"level": "low",
"title": "Incorporated in United Kingdom"
}
]
},
"keyPeople": [
{
"id": "507f1f77bcf86cd799439011",
"joinId": "507f1f77bcf86cd799439099",
"type": "individual",
"applicationId": "507f1f77bcf86cd799439013",
"status": "SUBMITTED",
"stewardProfile": true,
"address": {
"street": "123 Main Street",
"apartment": "Apt 4B",
"city": "London",
"state": "England",
"country": "GB",
"postalCode": "EC1A 1BB"
},
"firstName": "John",
"middleName": "David",
"lastName": "Smith",
"roles": [
"DIRECTOR"
],
"riskScore": 45,
"riskBand": "LOW",
"screeningSummary": [
"ADVERSE_MEDIA"
],
"openTasksCount": 3,
"explanation": {
"bases": [
{
"reason": "indirect_ownership",
"label": "Indirect ownership",
"percent": 30,
"viaEntityName": "Acme Holdings Ltd"
}
],
"summary": "Indirect ownership (30%) via Acme Holdings Ltd",
"ownershipPercentage": 30,
"paths": [
[
{
"entityKey": "reg:GB:12345678",
"name": "Acme Corporation",
"tier": "applicant"
},
{
"entityKey": "reg:GB:87654321",
"name": "Acme Holdings Ltd",
"tier": "parent",
"edgeKind": "ownership",
"percent": 30
}
]
],
"pathAmbiguous": false,
"sourceLabel": "Shareholder register"
},
"discrepancies": [],
"ownershipPath": []
}
],
"tradingExperience": {
"shares": "MORE_THAN_20",
"derivatives": "BETWEEN_10_AND_20",
"otcDerivatives": "LESS_THAN_10",
"tradingMethod": "EXECUTION_OR_ADVISORY",
"hasOccupationalExperience": false,
"hasFormalQualification": false
},
"labelIds": [
"507f1f77bcf86cd799439011"
],
"skip2FA": false,
"periodicReview": null,
"workflowId": "507f1f77bcf86cd799439020",
"screenedOnly": [
{
"id": "507f1f77bcf86cd799439014",
"type": "individual",
"name": "Alex Morgan",
"roles": [
"AUTHORIZED_SIGNATORY"
],
"reason": "Authorized Signatory is set to screen only for Limited Company"
}
],
"onboardingStep": {
"stepProgressPercentage": 100,
"identifier": "SUBMITTED",
"title": ""
},
"accountId": "60d5ecb54b24003a7c8e92a1",
"unmappedResponses": [
{
"label": "Business Profile",
"stepId": "businessProfile",
"values": [
{
"id": "b3e1c9a2-4f6d-4e8a-9c21-7d5f0a3b6e14",
"label": "Expected annual transaction volume",
"value": {}
}
]
}
],
"fatcaCrs": {
"tin": "1234567890",
"noTinExplanation": null,
"isUsPerson": "No",
"isUsPersonEvidence": null,
"isSpecifiedUsPerson": null,
"specifiedUsPersonExplanation": null,
"fatcaClassification": "Financial Institution (FI)",
"institutionalClassification": "I'm a Financial Institution or a Registered Deemed Compliant Financial Institution",
"giin": "98Q96B.00000.LE.826",
"noGiinReason": null,
"noGiinExplanation": null,
"crsEntityClassification": "Investment Entity",
"taxResidencyCountry": "GB",
"giinRegistryAdvisory": {
"giin": "98Q96B.00000.LE.826",
"entityName": "Acme Corporation",
"jurisdiction": "GB",
"status": "listed",
"warning": null,
"snapshotVersion": "8dbf5cbae43cb02bf02ca194692656e2d1365bed48c4e11bfeb6da4c82fa34e9",
"publicationMonth": "2026-09",
"cutoffDate": "2026-08-24"
}
},
"registrationNumber": "12345678",
"entityType": "Limited Company",
"regulator": {
"name": "FCA",
"number": "123456"
},
"jurisdiction": "GB",
"incorporationDate": "2020-01-15",
"establishmentDate": "2020-01-15",
"registrationDate": "2020-01-15",
"legalForm": "Limited Company",
"purpose": "Investment management and advisory services",
"businessActivity": "Financial services",
"industry": "Financial Services",
"subIndustry": "Investment Management",
"address": {
"street": "123 Main Street",
"apartment": "Apt 4B",
"city": "London",
"state": "England",
"country": "GB",
"postalCode": "EC1A 1BB"
},
"registeredAddress": {
"street": "123 Main Street",
"apartment": "Apt 4B",
"city": "London",
"state": "England",
"country": "GB",
"postalCode": "EC1A 1BB"
},
"tradingAddress": {
"street": "123 Main Street",
"apartment": "Apt 4B",
"city": "London",
"state": "England",
"country": "GB",
"postalCode": "EC1A 1BB"
},
"phoneNumber": {
"countryCode": "+1",
"phoneNumber": "4143319681"
},
"website": "https://www.acmecorp.com",
"sicCode": "64110",
"vatNumber": "GB123456789",
"taxId": "A02951077",
"referrer": "Partner Bank",
"referrerNote": "Referred by relationship manager",
"companyTurnover": "1000000-5000000",
"annualFlow": "500000-1000000",
"estimatedNumberOfPayments": 50,
"expectedFxRequirement": "100000-500000",
"currenciesRequired": [
"GBP",
"EUR",
"USD"
],
"countriesSentTo": [
"GB",
"DE",
"US"
],
"countriesReceivedFrom": [
"GB",
"FR"
],
"paymentPurpose": "Supplier payments",
"fundingSource": "Revenue from operations",
"investmentAmount": 250000,
"investmentAmountCurrency": "GBP",
"refreshedAt": "2026-03-30T12:00:00.000Z",
"isAudited": true,
"isRegulated": true,
"hasPep": false,
"ownershipLayers": 1,
"displayConfiguration": {
"hiddenFields": [
"businessActivity"
],
"hiddenSections": [
"step-1"
]
},
"screening": [
{
"id": "507f1f77bcf86cd799439011",
"type": "individual",
"status": "IN_REVIEW",
"suggestedStatus": "IN_REVIEW",
"summary": [
"ADVERSE_MEDIA"
],
"screeningState": {
"state": "CLEAR",
"reason": null,
"lastAttemptAt": "2026-03-30T12:00:00.000Z",
"lastSearchedAt": "2026-03-30T12:00:00.000Z",
"canScreen": false
},
"address": {
"street": "123 Main Street",
"apartment": "Apt 4B",
"city": "London",
"state": "England",
"country": "GB",
"postalCode": "EC1A 1BB"
},
"firstName": "John",
"middleName": "David",
"lastName": "Smith",
"roles": [
"DIRECTOR"
],
"dateOfBirth": "1990-05-15",
"yearOfBirth": 1990,
"monthOfBirth": 5,
"hasNotReviewed": false,
"hasDismissed": true,
"confirmedMatchesCount": 2,
"hasInReview": true,
"inReviewCount": 1,
"falsePositivesCount": 2,
"monitoringHitsCount": 0,
"summaryText": "Review the 1 hit still open. 2 confirmed matches don't add to the risk score. 2 cleared hits need no further action.",
"explanation": {
"bases": [
{
"reason": "indirect_ownership",
"label": "Indirect ownership",
"percent": 30,
"viaEntityName": "Acme Holdings Ltd"
}
],
"summary": "Indirect ownership (30%) via Acme Holdings Ltd",
"ownershipPercentage": 30,
"paths": [
[
{
"entityKey": "reg:GB:12345678",
"name": "Acme Corporation",
"tier": "applicant"
},
{
"entityKey": "reg:GB:87654321",
"name": "Acme Holdings Ltd",
"tier": "parent",
"edgeKind": "ownership",
"percent": 30
}
]
],
"pathAmbiguous": false,
"sourceLabel": "Shareholder register"
},
"discrepancies": [],
"ownershipPath": []
},
{
"id": "507f1f77bcf86cd799439014",
"type": "individual",
"status": "IN_REVIEW",
"suggestedStatus": "IN_REVIEW",
"summary": [
"ADVERSE_MEDIA"
],
"screeningState": {
"state": "CLEAR",
"reason": null,
"lastAttemptAt": "2026-03-30T12:00:00.000Z",
"lastSearchedAt": "2026-03-30T12:00:00.000Z",
"canScreen": false
},
"address": {
"street": "123 Main Street",
"apartment": "Apt 4B",
"city": "London",
"state": "England",
"country": "GB",
"postalCode": "EC1A 1BB"
},
"firstName": "Alex",
"lastName": "Morgan",
"roles": [
"AUTHORIZED_SIGNATORY"
],
"dateOfBirth": "1990-05-15",
"yearOfBirth": 1990,
"monthOfBirth": 5,
"hasNotReviewed": false,
"hasDismissed": true,
"confirmedMatchesCount": 2,
"hasInReview": true,
"inReviewCount": 1,
"falsePositivesCount": 2,
"monitoringHitsCount": 0,
"summaryText": "Review the 1 hit still open. 2 confirmed matches don't add to the risk score. 2 cleared hits need no further action.",
"discrepancies": [],
"ownershipPath": []
},
{
"id": "507f1f77bcf86cd799439012",
"type": "business",
"status": "IN_REVIEW",
"suggestedStatus": "IN_REVIEW",
"summary": [],
"summaryText": "No hits are waiting on a decision.",
"screeningState": {
"state": "CLEAR",
"reason": null,
"lastAttemptAt": "2026-03-30T12:00:00.000Z",
"lastSearchedAt": "2026-03-30T12:00:00.000Z",
"canScreen": false
},
"address": {
"street": "123 Main Street",
"apartment": "Apt 4B",
"city": "London",
"state": "England",
"country": "GB",
"postalCode": "EC1A 1BB"
},
"firstName": "Acme Corporation",
"lastName": "",
"roles": null,
"jurisdiction": "GB",
"hasNotReviewed": false,
"hasDismissed": false,
"confirmedMatchesCount": 0,
"hasInReview": false,
"inReviewCount": 0,
"falsePositivesCount": 0,
"monitoringHitsCount": 0,
"discrepancies": [],
"ownershipPath": []
}
]
},
"submitter": {
"firstName": "Michael",
"lastName": "Chen",
"email": "michael.chen@acme-corp.com",
"phoneNumber": {
"countryCode": "+1",
"phoneNumber": "4143319681"
},
"role": "Authorised signatory",
"capacity": "Director"
},
"status": "APPROVED",
"applicantScreening": {
"entityId": "507f1f77bcf86cd799439012",
"requiresCompanyName": false,
"searchedAt": "2026-03-30T12:00:00.000Z",
"screeningState": {
"state": "CLEAR",
"reason": null,
"lastAttemptAt": "2026-03-30T12:00:00.000Z",
"lastSearchedAt": "2026-03-30T12:00:00.000Z",
"canScreen": false
}
},
"withSteward": false
}