Skip to main content
Changed

State of Incorporation falls back to address state for sole proprietors

For underwriting application queries on a sole proprietor with no State of Incorporation stored, stateOfIncorporation now returns the legal address state, or the business address state when the legal address is marked the same as the business address. The stored value doesn’t change, and some organizations keep the previous behavior.
Changed

State of Incorporation validation skipped for sole proprietors

Approving an underwriting application for a sole proprietor no longer requires State of Incorporation validation, since a sole proprietorship isn’t incorporated. The rule still applies to other business entity types, and some organizations keep the previous behavior.
Added

hasSecondaryUnderwriter filter on UnderwritingApplicationFilterInput

UnderwritingApplicationFilterInput now includes an optional hasSecondaryUnderwriter boolean. true returns applications with a secondary underwriter set, false returns applications with none set, including those with no underwriter data at all, and omitting it applies no filter.
Added

caseOriginator on application identity

UnderwritingApplicationIdentityInput and UnderwritingApplicationIdentity now include an optional caseOriginator field, free-form text up to 500 characters. Only application-authenticated callers can set or change it. User and platform callers get INVALID_FIELD, and re-sending the current value is a no-op.
Breaking changeChanged

Breaking: userName removed from ApplicationUnderwriterInput

updateUnderwritingApplication now accepts only userId for primaryUnderwriter and secondaryUnderwriter. The stored name comes from the user’s profile.

Underwriter assignment validation on updateUnderwritingApplication

Assigning a primary or secondary underwriter now requires an active user in the application’s organization with the required underwriting permissions, and the two slots must hold different users. A rejected assignment returns UnderwritingApplicationFieldValidationError with INVALID_FIELD on PrimaryUnderwriter.Name or SecondaryUnderwriter.Name. Re-sending a slot’s current underwriter, clearing a slot, or omitting a slot isn’t re-validated.
ChangedFixed

Guarantor Not Required result on Manager Approval

The Manager Approval decision component now includes a Guarantor Not Required result, with status NOT_REQUIRED and label Guarantor.

Decision component items no longer created for removed bank accounts

A decision component item could be created for a bank account removed while its evaluation was still in progress. Results for removed bank accounts are now ignored and no longer affect the component’s status.
Added

New business entity types

ESTATE, INTERNAL_DEPOSITS, TRADE_NAME_ENTITY, and TRADE_STYLE are new values on the BusinessEntityType enum.
Added

primaryUnderwriter and secondaryUnderwriter on application types

Application types now include primaryUnderwriter and secondaryUnderwriter fields, each identifying the underwriter assigned to that role.

primaryUnderwriter and secondaryUnderwriter inputs on updateUnderwritingApplication

updateUnderwritingApplication now accepts primaryUnderwriter and secondaryUnderwriter inputs, letting a caller set or change either underwriter. Passing null clears the slot, and omitting the field leaves it unchanged. Changes are recorded in the application’s event history.

primary_underwriter and secondary_underwriter columns on the underwriting data export

The underwriting data export now includes primary_underwriter and secondary_underwriter columns.
Changed

Non-empty declineComment required when declining an application

Moving an underwriting application to DECLINED now requires a non-empty declineComment. A missing or blank comment fails the mutation with a MISSING_FIELD validation error for the DECLINE_COMMENT field, and nothing is saved. Applications already declined before this requirement existed can still be edited without adding one.
Fixed

Attachment downloads use the correct content type and file name

Attachment downloads always returned application/octet-stream and a file name without an extension. Downloads now include the correct content type and file extension when the file’s format is known.

Attachment file names sanitized before storage

An attachment file name with directory-separator or other unsafe characters was used as-is when storing the file, and a non-standard provider-supplied extension could produce a misleading suffix. File names are now sanitized to a safe form, and an extension is only appended when it’s well-formed.

Missing identification-number type and value reported together

Application submission reported only a missing identification-number type when both the type and value were left blank. Both fields are now reported together.

Decision-component result status on certain evaluation outcomes

Certain evaluation outcomes were recorded with an incorrect decision-component result status instead of ERROR. They’re now recorded correctly.
Fixed

Audited events no longer rejected for users without a display name

A mutation that records an audited event, such as assigning an application or adding a comment or attachment, was rejected entirely when the acting user had no display name. The event now records a generic fallback identifier instead of failing the request.

Duplicate bank accounts collapsed into the existing account

Bank accounts submitted with the same routing and account numbers were stored and shown as two separate accounts instead of one. A duplicate submission is now collapsed into the existing account instead of creating a second one.
AddedChanged

declineComment on UnderwritingApplication

UnderwritingApplication and UnderwritingApplicationUpdateInput now include a declineComment field for a free-text explanation on a declined application. It’s accepted only while the application is declined, clears automatically otherwise, and is null when no comment has been entered.

INVALID_STAKEHOLDER_ROLE validation error code

A disregarded entity must have exactly one stakeholder, person or business, with the TAX_RELATED_PARTY role, and that role only applies when the business is a disregarded entity. On underwriting applications, every business stakeholder must carry the TAX_RELATED_PARTY role. Violations now return a new INVALID_STAKEHOLDER_ROLE validation error code.
Fixed

Blank business name on decision component checklist

A decision component checklist item and the underwriting data export could show a blank business name for an application whose business name was edited after the application was created. Both now resolve the current business name instead of a stale or empty value.
AddedFixed

Business stakeholders on underwriting applications

Underwriting applications now support business stakeholders alongside person stakeholders: add, update, and remove one via addBusinessStakeholderInput, updateBusinessStakeholderInput, and removeBusinessStakeholderInput. Business stakeholders appear alongside person stakeholders in the stakeholders field.

updateDecisionComponent no longer persists invalid field edits

An edit that introduces, or targets a field with, a validation failure used to be saved despite failing validation. updateDecisionComponent now rejects it before it’s saved, so a returned errors array reliably means nothing was written.

Typed validation errors on rejected updateDecisionComponent edits

A rejected field edit on updateDecisionComponent returned a generic error instead of the typed validation error other application mutations use. It now returns the same typed error, with matching code, key, label, and item id.

No application event on a refused status change

A refused updateDecisionComponent status change no longer produces an application event.

Invalid dynamic field dates rejected

A dynamic field date that breaks its calendar rule is no longer saved. It’s rejected instead.
Added

isDisregardedEntity on business identity

Business identity input and output types now include an isDisregardedEntity field, indicating whether the business is a disregarded entity for federal tax purposes.TAX_RELATED_PARTY is a new value on the StakeholderRole enum, for an individual or entity connected to the applying business for tax reporting purposes.
AddedFixed

ITIN match on Owner Identity Verification

The partner-specific Owner Identity Verification decision component now matches on an ITIN, returning KYC ITIN or ITIN result labels when applicable.

Out-of-scope applications return NotFoundError

An application outside the caller’s participant scope now returns a NotFoundError instead of a ForbiddenError, so cross-organization access is no longer distinguishable from an unknown id.
Changed

Decision-component result labels standardized

Decision-component result labels are now sentence case, with ownership and threshold-style labels reformatted to a consistent form, such as Ownership > 25%. This changes the label values in webhook payloads and the application checklist display for applications evaluated after this change.
AddedChanged

businessToBusinessMix on processing activity

Processing activity types now include a businessToBusinessMix field, reporting the approximate percentage of business-to-business transactions.

customerInitiatedCardNotPresentMix and merchantInitiatedCardNotPresentMix on processing activity

Processing activity types now include customerInitiatedCardNotPresentMix and merchantInitiatedCardNotPresentMix fields, letting the card-not-present mix be reported as separate customer-initiated and merchant-initiated components.

cardNotPresentMix derived from initiated components

When a processing activity’s cardNotPresentMix isn’t supplied directly, it’s now derived as the sum of customerInitiatedCardNotPresentMix and merchantInitiatedCardNotPresentMix.
Changed

Minimum year on stakeholder birth dates

Person stakeholder birth dates now enforce a minimum year of 1900, rejecting dates before that year that were previously accepted as long as they were in the past.

Plausible calendar year on date-type dynamic fields

Date-type dynamic fields now enforce a plausible calendar year, 1900 through 2099, returning new DATE_MUST_NOT_BE_BEFORE_MINIMUM_YEAR and DATE_MUST_NOT_BE_AFTER_MAXIMUM_YEAR error codes for issuing and expiration dates outside that range.
ChangedFixed

Passport number format validation on guarantors

Submission now enforces a valid passport number format, six to nine letters and/or digits, for a guarantor’s personal identification number. Values that don’t match are rejected, where previously any non-blank value was accepted.

Removing an already-removed stakeholder

Removing a stakeholder that was already removed, or was never present on the application, no longer fails the mutation. That id is now skipped, and any other ids requested in the same call are still removed.

Guarantor passport number altered before identity verification

A guarantor’s passport number is no longer altered before being submitted for identity verification, which could cause a valid passport to be reported as unverified.

Owner Identity Verification field status on passport-only verification

The partner-specific Owner Identity Verification decision component now returns a MATCH field status, instead of NEEDS_REVIEW, for an owner verified by passport number when no Social Security number is on file.
AddedFixed

UpdateConflictError on decision component updates

updateDecisionComponent can now return an UpdateConflictError when a concurrent update to the same application couldn’t be applied. Retry the request.

Passport match on Owner Identity Verification

The partner-specific Owner Identity Verification decision component now matches on a passport number in addition to a Social Security number, returning KYC Passport or Passport Not Verified result labels when applicable.

Transient document download failures no longer re-trigger completed evaluations

A transient failure downloading a decision component’s supporting document no longer re-triggers an evaluation that had already completed successfully.
Changed

Field-change audit entries read as plain language

Field-change audit entries now read as plain-language sentences, such as “Person Stakeholder #2 (Jane Smith)‘s first name changed from populated to populated”, instead of showing internal field paths. Decision-component field-status entries show the field’s display name instead of its internal identifier.

Approval-required validations block moving to APPROVED

Underwriting journeys configured with approval-required validations now block moving an application to APPROVED status until those validations pass. Failures return as validation errors on the update mutation.
Breaking changeAdded

Breaking: CIP “Country” fields use two-character codes

Partner-specific CIP “Country” dynamic fields now use two-character country codes instead of three-character codes.

COUNTRY_CODES_ALPHA_2 field type for dynamic fields

Underwriting dynamic fields support a new COUNTRY_CODES_ALPHA_2 select field type, offering two-character country codes as an alternative to the existing three-character COUNTRY_CODES list.

Automatic business verification report attachment

Underwriting automatically downloads and attaches a business verification report as a document on the relevant decision component.
AddedChanged

”ID Issue Date” and “Name of Issuer” on Articles of Association/By-Laws

The Articles of Association/By-Laws CIP business identification type now includes required “ID Issue Date” and “Name of Issuer” fields, alongside its existing “Issuing State” field.

Field-change audit entries name the changed entity

Field-change audit entries for stakeholders and bank accounts now identify the changed entity by kind, number, and name, such as “Person Stakeholder #2 (Jane Smith)”, falling back to the number or identifier when a name isn’t available. Decision-component item entries in the same audit trail now show the item’s resolved label instead of its identifier.
AddedFixed

validation field on UnderwritingDynamicFieldSchema

UnderwritingDynamicFieldSchema now includes a validation field, backed by a new UnderwritingDynamicFieldValidation enum (NO_FUTURE_DATE, ONLY_FUTURE_DATE), with matching DATE_MUST_BE_IN_FUTURE and DATE_MUST_NOT_BE_IN_FUTURE values on UnderwritingDynamicFieldValidationErrorCode. Applied to the CIP ID Issue Date and Expiration Date fields, and enforced both when a field value is saved and when its decision component is accepted.

last4 blank on short encrypted field values

last4 on encrypted field values, such as bank account numbers and tax and personal identification numbers, is no longer blank when the underlying value is 4 characters or fewer.

createdByUserId and updatedByUserId default identifier fix

Comments and dynamic field values now show null for createdByUserId and updatedByUserId when the change was made by the platform rather than a user, instead of a default identifier.

Business tax ID field reads from the correct application data

The business tax identification number decision-component field now reads from the correct application data depending on application type, instead of always sourcing it from acceptor application data.

CIP dynamic field label spacing fix

Fixed a spacing issue in a partner-specific CIP dynamic field label: “Articles of Association/By-Laws” is now “Articles of Association/ By-Laws”.
AddedChanged

referenceNumber on stakeholders and bank accounts

Stakeholder and bank account types now include a referenceNumber field, assigned when the entity is added. It’s unique within the application per kind, never changes, and is never reused. Entities added before reference numbers existed have a null value.

entryReferenceNumber on sensitive-change records

Structured sensitive-change records now include an entryReferenceNumber field, giving the reference number of the stakeholder or bank account an audit entry applies to, alongside its identifier.

UpdateConflictError on application updates

Update-application error responses can now return an UpdateConflictError when a concurrent update to the same application couldn’t be applied. Retry the request.

Automatic risk level calculation

An application’s assessed risk level is now calculated automatically from its merchant category code, sales channel, card-present/card-not-present mix, advance payment rate, and sales volume, and recalculates whenever those inputs change.
Fixed

Bank account labels no longer shift after removal

Removing a bank account no longer shifts the submission validation labels on the accounts that remain, such as showing the sole remaining account as “Bank account 2” instead of “Bank account 1”.
ChangedFixed

Clearer text on “sensitive data viewed” events

“Sensitive data viewed” application events now name the user who viewed the data and describe what was viewed, instead of showing internal identifiers.

Authorized contacts item field list corrected on Mastercard MATCH

The authorized contacts item on the Mastercard MATCH decision component now shows first name, last name, email, and phone number, instead of including business legal address fields.

updateUnderwritingApplication not-found error on early exposure updates

updateUnderwritingApplication no longer fails with a not-found error, or discards the entire submitted update, when submitted exposure inputs change an application’s calculated payment exposure before the application has any decision components.
AddedChangedFixed

Per-person items driven by a configured set of stakeholders

Decision component items can now derive their per-person sub-items from a configured set of person stakeholders, instead of matching by stakeholder role.

Authorized contacts on the Mastercard MATCH decision component

The Mastercard MATCH decision component now includes an “authorized contacts” item, available where configured, showing each reported contact’s name, phone, and business legal address. Items are added and removed automatically as contacts are reported or no longer reported.

PCI certification check result label renamed

The PCI certification check result label is now “Certification Search”.

Audit trail no longer records no-op field changes

Application event audit entries no longer record a field as changed when the submitted value matches the value already on record. No-op field changes, including client-echoed values and unchanged workflow queue recalculations, are excluded from the audit trail.

Owner and Business Identity Verification require complete data before accepting

Owner Identity Verification and Business Identity Verification decision components, and the decisionComponentsUpdated webhook, now report ACTION_REQUIRED until every required identity field is captured, moving to ACCEPTED only once the component’s data is complete.

PCI certification check excludes removed Visa PCI registry listings

PCI certification check company-name matching now excludes Visa PCI registry listings that have since been removed.
AddedChangedFixed

Additional review fields on the PCI certification check

The PCI certification check decision component’s review data now includes service provider type, validation type, valid-through date, assessor, regions of operation, website, and registered-since date.

Configurable decision component item labels

A decision component item’s label can stay as configured instead of being replaced with the applicant’s business or stakeholder name. The PCI certification check uses this so its item labels show the software name.

PCI certification check guidance text typo

The PCI certification check result guidance text now reads “Manual searches” instead of “Manually searches”.
ChangedFixed

Maximum length validation on submission

Submission now enforces maximum lengths on stakeholder names and addresses: first name (36 characters), last name (48 characters), address lines 1 through 3 (100 characters each), city (100 characters), and postal code (15 characters), for business, legal, and residential addresses.

Duplicate guarantor validation failures on submission

A person with the guarantor role no longer gets reported twice for the same field validation failure on application submission.

UNDERWRITING_APPLICATION_CHANGED webhook timing for decision component evaluations

The UNDERWRITING_APPLICATION_CHANGED webhook for a decision component evaluation now fires only after all of a run’s changes, including the application’s status, queue, and related updates, are persisted. It carries the final recalculated status instead of a possibly stale one.
Changed

Validation errors on application field updates no longer echo the submitted value

Validation errors for application field updates no longer include the submitted value, only the field name and reason.

Validation errors on dynamic field updates no longer echo the submitted value

Validation errors for dynamic field updates no longer include the submitted value, only the field label and reason.
Added

naicsCode and naicsDescription on application identity

Underwriting application identity now includes naicsCode and naicsDescription fields, settable via createUnderwritingApplication and updateUnderwritingApplication. Both are optional, free-form, and capped at 500 characters.
Changed

GraphQL error on decision-component field configuration issues

Revealing a decision-component field that fails due to a configuration issue now returns a GraphQL error instead of an empty value.
Added

salesChannel on application identity

Application identity now includes a salesChannel field (RETAIL, MOTO, or E_COMMERCE), settable via the ApplicationIdentity input and returned on both acceptor and underwriting applications.

riskLevel on application processing activity

Application processing activity now includes a riskLevel field, returned on underwriting, acceptor, and relationship processing activities.
Fixed

Authorized-contact-only applications missing MATCH screening

Applications whose only person stakeholder is an authorized contact now have that contact screened and shown as a sub-item on the MATCH decision component, consistent with owner, control person, and guarantor stakeholders.
AddedChanged

UnderwritingDynamicFieldValidationError on updateDecisionComponent

updateDecisionComponent returns a UnderwritingDynamicFieldValidationError when a decision component with required CIP dynamic fields is accepted before those fields are complete.

CIP dynamic-field validation extended to component edits

Editing an already-ACCEPTED decision component now enforces the same CIP dynamic-field completeness check as acceptance. An edit that leaves a required field incomplete is rejected and rolled back instead of persisted.
Changed

Auto-populated identity number after Owner Identity Verification

When the Owner Identity Verification workflow approves an owner, their identity number dynamic field is populated automatically.

CIP dynamic field catalog updates for Article of Association

The Article of Association item now captures only Issuing State, dropping the ID Issue Date and Name of Issuer subfields. Issuing State and Country are now SELECT fields, with valid options returned over the API instead of free text.

Auto-populated identity number after Business Identity Verification

When the Business Identity Verification workflow approves a business, its Secretary of State identity number and issuing state dynamic fields are populated automatically.
AddedFixed

Submit validation failures persisted as a system comment

When a submit is rejected with SUBMISSION_INVALID, the validation failures are now persisted as a system comment on the application, so the reasons stay retrievable over GraphQL after the original response is gone.

Downstream submit processing waits for a fully saved submission

Downstream submit processing, such as webhook delivery or underwriting submission, now runs only after an application submit is fully saved, so a submit that fails to save no longer triggers processing for an application that was never recorded as submitted.

Terminal status reverting to PROCESSING after submission

Underwriting applications no longer revert from a webhook-set terminal status, such as PENDING, back to PROCESSING when the synchronous submission request completes after the asynchronous result webhook already finalized the application.

Stale exposure reason on dual-gated decision components

A decision component’s Total Risk Exposure or Potential Exposure gate result reason now clears correctly when that gate’s value drops below its threshold, even while the other gate remains tripped.
Fixed

Missing exposure reasons on components already in ACTION_REQUIRED

Decision components already in ACTION_REQUIRED status now surface a newly-tripped exposure reason, such as Total Risk Exposure, alongside the reason that originally triggered the status.
Fixed

Person-stakeholder name masking in decision-component event history

Person-stakeholder names in decision-component displayInformation and internalInformation event history are now masked, including in previously recorded events.
Fixed

Deeply nested children queries on dynamic field schemas

Queries nesting children selections 4 levels deep on UnderwritingDynamicField values or the UnderwritingDynamicFieldSchema catalog no longer fail with a “Maximum allowed coordinate cycle depth was exceeded” error.
AddedFixed

relationshipProcessingActivity on underwriting applications

UnderwritingApplication exposes relationshipProcessingActivity input and output, capturing relationship-wide processing-activity totals across all locations in a relationship: advanced payment rate, average annual and monthly sales amount, average and highest ticket amount, card-present and card-not-present mix, chargeback rate, currency, days in cycle, delivery timeframe, and refund rate. Applicable organizations also get an automatically computed Total Risk Exposure value.

Expanded sanctions-review PII masking in displayInformation

Sanctions-review PII masking in displayInformation now covers additional review fields, including in previously recorded event history.
AddedChangedFixed

dynamicFieldSchemas on decision component item schemas

UnderwritingDecisionComponentItemSchema carries a dynamicFieldSchemas resolver, returning the dynamic field schema definitions scoped to that item schema as a tree of root nodes with their children.

sensitiveField reveals masked dynamic field values

sensitiveField on UnderwritingDynamicField resolves decrypted values for TEXT_FIELD_MASKED fields, requiring read access. revealSensitiveFields also supports revealing dynamic field masked values.

Sanctions and MATCH review data masked in displayInformation

Matched person and entity names, dates of birth, and Mastercard MATCH owner PII on sanctions and MATCH decision components are now masked in displayInformation. Authorized callers can still retrieve the underlying values through the existing revealChange resolver.

Dynamic field ADD validation on updateDecisionComponent

updateDecisionComponent dynamic field ADD operations validate that the target decisionComponentItemId belongs to the mutated decision component and matches the field’s required item schema type.

Dynamic field REMOVE operations soft-delete values

Dynamic field REMOVE operations soft-delete values instead of erasing them. Re-adding a previously removed field resurrects the existing row instead of creating a new one.

Relationship-level Total Risk Exposure gate on approval components

Approval decision components can gate on a relationship-level Total Risk Exposure alongside single-application Potential Exposure, where configured. A component moves to ACTION_REQUIRED when either exposure crosses its threshold, and returns to ACCEPTED only when both are below threshold and auto-accept validations pass, with each gate contributing its own result reason.

updateDecisionComponent server error on zero acceptance-time exposure

updateDecisionComponent no longer returns a server error when recalculating potential exposure with a zero acceptance-time value.

Errors on concurrent webhook processing

Concurrent webhook processing for the same application no longer produces intermittent errors.
Breaking changeAdded

Breaking: SELECT_MULTIPLE removed from UnderwritingDynamicFieldType

SELECT_MULTIPLE is removed from the UnderwritingDynamicFieldType enum.

agentReview query on underwriting applications

agentReview returns the latest AI agent review for an underwriting application. New types: UnderwritingApplicationAgentReview and UnderwritingApplicationAgentReviewComponent. New enums: UnderwritingApplicationAgentReviewDisposition (LIKELY_PROBLEM, LOOKS_ACCEPTABLE, NEEDS_A_CLOSER_LOOK, NOT_YET_ASSESSABLE) and UnderwritingApplicationAgentReviewStatus (COMPLETED, FAILED, IN_PROGRESS, NOT_STARTED).
Changed

displayInformation masks sensitive PII on application events

displayInformation on ApplicationEvent masks sensitive PII field values such as names and addresses. Original values remain accessible via the revealChange resolver.
Added

dynamicFields on applications and decision components

UnderwritingApplication exposes dynamicFields and dynamicField resolvers for retrieving dynamic field values from the org-applicable catalog, optionally scoped to a decision-component item. DecisionComponentItem also carries a dynamicFields resolver.

dynamicFields input on updateDecisionComponent

updateDecisionComponent accepts a dynamicFields input for adding, removing, or updating dynamic field values via the @oneOf UnderwritingDynamicFieldInput.

Dynamic field types

New types: UnderwritingDynamicField, UnderwritingDynamicFieldSchema, and UnderwritingDynamicFieldSensitiveFields. New enums: UnderwritingDynamicFieldKind (CHOICE, GROUP, SCALAR) and UnderwritingDynamicFieldType (CHECKBOX, CURRENCY, DATE_PICKER, SELECT, SELECT_MULTIPLE, TEXTAREA, TEXT_FIELD, TEXT_FIELD_MASKED).
Fixed

PCI Certification Check items for multi-provider applications

The PCI Certification Check decision component correctly creates and labels distinct items per software provider when an application has multiple providers.
Changed

PCI Certification Check evaluates software providers

The PCI Certification Check decision component evaluates application software provider names against the Visa PCI listing registry, returning ACCEPTED or ACTION_REQUIRED status with detailed review data per provider.

Software provider removal updates PCI Certification Check

Removing a software provider name from an application automatically excludes its PCI Certification Check items. Re-adding the provider re-includes them.
Fixed

revealChange and sensitiveChanges fix for one-sided PII changes

revealChange and sensitiveChanges on ApplicationEvent no longer fail on one-sided PII changes — such as a field first populated or cleared — where the serializer omits the absent value. Change history for those events is now viewable.
Changed

legalEntityName validation relaxed on sole proprietors

legalEntityName no longer needs to match the owner’s name on sole proprietor applications. The value is accepted as-is.

birthDate requirement narrowed on person stakeholders

birthDate is only required for owner, guarantor, primary contact, and control person roles. Authorized persons can omit it, but any provided value must still be a date in the past.

Stakeholder requirement on application submission

Application submission requires at least one person stakeholder with a role. Submissions without a qualifying stakeholder return a MISSING_STAKEHOLDER validation error.
AddedFixed

revealChange covers updateDecisionComponent edits

revealChange on ApplicationEvent returns decrypted before/after values for encrypted PII fields edited via updateDecisionComponent, not just direct application input edits.

sensitiveChanges null value fix

sensitiveChanges no longer throws a deserialization error when previousValue or updatedValue is null, which could prevent viewing application change history.
Added

sensitiveChanges on application events

ApplicationEvent carries a sensitiveChanges field with masked before/after values for encrypted PII changes in the audit change log.

revealChange resolver on application events

revealChange on ApplicationEvent provides audited, per-entry decryption of sensitive change-log values.
Added

softwareProviderNames on application identity

softwareProviderNames is available on application identity input and output types.

Expanded revealSensitiveFields mutation

revealSensitiveFields supports additional PII fields across application identity, bank account, and stakeholder data.
Fixed

Underwriting data export columns

The underwriting data export correctly populates status, decision timestamp, and decline reason columns.
Breaking change

Breaking: declineCodes input restructured on updateUnderwritingApplication

declineCodes changed from [DeclineCode!] to [DeclineCodeInput!], a @oneOf input. Use { addDeclineCodeInput: CODE } to add or { removeDeclineCodeInput: CODE } to remove individual codes instead of replacing the full set.
Changed

Unrestricted declineCodes on updateUnderwritingApplication

updateUnderwritingApplication accepts any number of decline codes. The previous limit is removed.
Added

Decline reasons on underwriting applications

UnderwritingApplication carries a declineReasons field, and updateUnderwritingApplication accepts declineCodes. A DeclineCode enum and DeclineReason type capture adverse action reasons on declined applications.
ChangedFixed

Potential exposure rounding and threshold enforcement

Potential exposure values round to 2 decimal places. Decision components reset to ACTION_REQUIRED when recalculated exposure exceeds the threshold.

Owner Sanctions Watchlist Check potential match results

Owner Sanctions Watchlist Check potential match results now appear correctly in decision component responses.
AddedChangedFixed

CURRENCY field type on decision components

CURRENCY is a value on the DecisionComponentFieldType enum.

Expanded sanctions decision component results

Sanctions decision component results include per-source detail and source identification.

stateOfIncorporation validation

stateOfIncorporation is validated as a 2-character US state or territory code on underwriting applications and normalized to uppercase on all applications.

Auto-accept on potential exposure threshold drop

Decision components with potential exposure thresholds are automatically accepted when recalculated exposure drops below the action-required threshold.

Processing activity fields on decision components

Processing activity field values now appear correctly in decision component fields for underwriting applications.
AddedChanged

State of Incorporation on Business Identity Verification

The Business Identity Verification decision component includes a state of incorporation verification result and an editable field, auto-populated from upstream evaluation data.

Approval validation on updateDecisionComponent

updateDecisionComponent validates required application data when approving a decision component. The mutation returns validation errors (UnderwritingApplicationFieldValidationError, UnderwritingApplicationValidationError, etc.) if required fields are incomplete.

Real-time potential exposure on approval components

Potential exposure on approval decision components reflects recalculated values in real time instead of a static result.
Breaking changeAddedChanged

Breaking: nameOnAccount removed from bank account types

nameOnAccount is removed from UnderwritingBankAccount, UnderwritingApplicationAddBankAccountInput, and UnderwritingApplicationUpdateBankAccountInput. Use underwritingIdentity.legalEntityName instead.

stateOfIncorporation on application identity

stateOfIncorporation is available on application identity input and output types.

Automatic potential exposure recalculation

Updating application fields that affect potential exposure triggers an automatic recalculation. Affected decision components may reset to ACTION_REQUIRED.
Added

type field and DecisionComponentReviewType on DecisionComponentReview

DecisionComponentReview carries a type field with a DecisionComponentReviewType enum (INQUIRY_DATA, REVIEW), distinguishing supplied inquiry data from match results. Sanctions components include an inquiry data review alongside matches.
Fixed

Application submission stall in CREATED status

Applications no longer stall in CREATED status when transient upstream communication errors occur during submission.
Fixed

SUBMISSION_FAILED status on decision components

Decision components correctly reflect SUBMISSION_FAILED status when the upstream evaluation returns no items.
Changed

Auto-accept on decision component acceptance

Accepting a decision component automatically sets all non-INFORMATIONAL item statuses to ACCEPTED.
AddedChanged

STATUS_CHANGED webhook for SUBMISSION_FAILED

The UNDERWRITING_APPLICATION_UPDATED webhook fires with a STATUS_CHANGED change type when an application reaches SUBMISSION_FAILED status.

averageAnnualSalesAmount on acceptor processing activity

averageAnnualSalesAmount is available on AcceptorApplicationProcessingActivityInput and AcceptorApplicationProcessingActivityOutput, previously limited to underwriting-specific processing activity types.

Guidance text replaces status messages for missing website URL

Decision component results no longer include status messages when a business website URL is missing. Guidance text is the sole indicator.

Annual sales in Alloy journey payloads

Alloy journey application request payloads include annual_sales alongside monthly_sales, supporting potential exposure calculations based on annual volume.
AddedChanged

GraphQL schema descriptions

Enums, types, and error types carry GraphQL descriptions. Schema introspection doubles as documentation.

guidance field on decision component items

DecisionComponentItem carries a guidance field with actionable text for items in ACTION_REQUIRED status.

Attach uploads to multiple decision components

The attachment upload endpoint accepts an optional decisionComponentIds array. Link one upload to multiple decision components in a single request.

Expanded Guarantor Credit Check and Mastercard MATCH results

Both decision components return expanded result data.

Unrestricted businessName length

The 22-character cap on businessName is removed. Business names of any length are accepted.

Website URL optional on MCC Confirmation and Site Inspection

The website URL field on both decision components is no longer required.
Added

TRUST business entity type

TRUST is a value on the BusinessEntityType enum.

underwritingReference and acceptorReference on boarding webhooks

Both fields are included in boarding webhook payloads.
AddedChangedDeprecatedFixed

averageAnnualSalesAmount on processing activity

averageAnnualSalesAmount is available on underwriting processing activity input and output, giving integrators a direct field for annual volume.

QUESTION info request type reactivated

QUESTION is back as an active option on UnderwritingInformationRequestType.

UNDERWRITING_APPLICATION_UPDATED webhook expanded

This webhook fires for attachment changes, decision component updates, and terminal status transitions. New change types: DECISION_COMPONENT_UPDATED and FILE_DELETED.

Org-level DefaultDaysInCycle config

When set, daysInCycle auto-populates on new underwriting applications if the input omits it.

Relaxed chargebackRate and refundRate validation

Both fields are truly optional on submitUnderwritingApplication.

Deprecated: nameOnAccount

nameOnAccount on UnderwritingBankAccount and related input types is deprecated. Use underwritingIdentity.legalEntityName instead.

Minor bug fixes and improvements

Breaking changeAddedChangedDeprecatedFixed

Breaking: info request input restructured

CreateUnderwritingInformationRequestInput uses a flat type-based input instead of the OneOf pattern with customInput/fromOptionInput. Specify a type enum value directly — CreateUnderwritingInformationRequestCustomInput and CreateUnderwritingInformationRequestFromOptionInput are removed.

Breaking: info request option fields removed

id, isActive, createdDateTime, and updatedDateTime are removed from UnderwritingInformationRequestOptionOutput.

New info request document types

Eight new values on UnderwritingInformationRequestType: ARTICLES_OF_INCORPORATION, BANK_LETTER_VOIDED_CHECK, BANK_STATEMENTS, BUSINESS_LICENSE, CERTIFICATE_OF_GOOD_STANDING, FINANCIAL_STATEMENTS, PASSPORT, and PROOF_OF_ADDRESS.

defaultMerchantCategoryCode replaces merchantCategories

merchantCategories on UnderwritingApplicationIdentityInput is deprecated — only a single MCC is supported. Use defaultMerchantCategoryCode instead.

Deprecated: BANK_LETTER, VOIDED_CHECK, and QUESTION request types

Use BANK_LETTER_VOIDED_CHECK instead of the first two. QUESTION is no longer available as a request option.

Info request output enriched

type and fulfillmentTypes are available on underwriting info request output and option output types.

Decision component schema authorization

requiredScopes and requiredRoles on UnderwritingDecisionComponentSchema expose per-component authorization requirements.

RISK decision component result status

A new RISK value on DecisionComponentResultStatus supports fraud risk scoring.

Org-scoped info request options

underwritingInformationRequestOptions returns options scoped to the requesting organization, with platform defaults as fallback.

Webhook payload expanded for info requests

description and fulfillmentTypes are included in the UNDERWRITING_APPLICATION_UPDATED webhook payload for information request events.

Expanded decision component result data

New result fields across Business Sanctions, MATCH, MCC Confirmation, Owner Identity, Owner ID Fraud, Owner Sanctions, and Site Inspection decision components.

Website Review MCC field

MCC field status on the Website Review decision component always shows NOT_VERIFIED.

Business Sanctions display fix

Watchlist match results display correctly; “workflow not run” results are hidden.

Partial errors on decision component resolver

Decision component resolver errors no longer nullify the entire response. Failures surface in the errors array with safe defaults for affected fields.

Minor bug fixes and improvements