# Upcoming requirements updates Learn about the changes to required verification information and how this impacts your integration with Stripe. The requirement updates in this guide refer to properties in the Accounts v1 API. You can see the corresponding Accounts v2 API properties in [Required verification information](https://docs.stripe.com/connect/required-verification-information.md) by selecting `v2` in the **Accounts API** dropdown and the desired update in the **Requirement update** dropdown. Payments regulations help prevent crimes such as money laundering, fraud, and tax evasion. Financial regulators around the world enforce [Know Your Customer (KYC) requirements](https://support.stripe.com/questions/know-your-customer) to make sure that Stripe collects, verifies, and maintains identity information from certain types of businesses and from individuals who ultimately own, control, or direct them. These requirements are frequently updated by financial service regulators, card networks, and other financial institutions. This guide provides an overview of the upcoming changes, and highlights the most significant changes. For the exhaustive list of requirements, refer to [Required verification information](https://docs.stripe.com/connect/required-verification-information.md). If you use an API-based flow to onboard your connected accounts, you must update your integration to handle all requirement changes. Learn more about [Connect onboarding options](https://docs.stripe.com/connect/onboarding.md) and [migrating your API-based onboarding and remediation flows to Stripe-hosted or embedded flows](https://docs.stripe.com/connect/migrate-from-api-onboarding.md). #### Program - Europe *Last updated: February 23, 2026* ## Understand the changes to verification requirements To align with regulations from the UK Financial Conduct Authority (FCA) and the Central Bank of Ireland (CBI), Stripe is updating our verification requirements for Know Your Customer (KYC) and ultimate beneficial owners (UBO) and directors. If your connected accounts operate in any of the listed countries, you might need to update your onboarding flow. Failure to make required updates will disrupt your connected accounts’ access to payments and financial services. To learn more about what’s changing and why, see the [new compliance requirements support article](https://support.stripe.com/questions/europe-verification-requirement-updates-for-connected-accounts). The upcoming changes affect connected accounts in the following countries: - AT - BE - BG - CH - CY - CZ - DE - DK - EE - ES - FI - FR - GB - GI - GR - HR - HU - IE - IS - IT - LI - LT - LU - LV - MT - NL - NO - PL - PT - RO - SE - SI - SK > #### Ongoing updates > > Stripe will continue updating the API to support collecting these requirements through April 1, 2026. ## Choose an integration approach Stripe recommends using Stripe-hosted or Embedded onboarding to collect business and identity verification requirements. These options require fewer resources to implement and maintain than using API onboarding. The following table describes the major differences: - [Stripe-hosted onboarding](https://docs.stripe.com/connect/hosted-onboarding.md): (Recommended) Send accounts to a Stripe-hosted flow to submit required information. - [Embedded onboarding](https://docs.stripe.com/connect/embedded-onboarding.md): (Recommended) Embed Stripe-provided onboarding components that let accounts submit information directly to Stripe from within your app. - [API onboarding](https://docs.stripe.com/connect/api-onboarding.md): Build and manage a custom onboarding flow using Stripe APIs. | | **Stripe-hosted onboarding** | **Embedded onboarding** | **API onboarding** | | --------------------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | | Best for | Platforms that want Stripe to handle onboarding | Platforms that want a branded, in-app onboarding flow | Platforms that need full control and can build and maintain it | | Initial implementation effort | 3–4 engineering weeks | 3–4 engineering weeks | 30–40 engineering weeks | | Ongoing effort to address requirement updates | Handled automatically by Stripe | Handled automatically by Stripe | Requires proactive monitoring for upcoming changes, plus engineering resources to update the onboarding flow for each change | | Customization | Stripe-hosted interface with platform branding | Highly themeable component that accounts access through the platform app | Platform designs, builds, and maintains the interface | | Effort to support additional countries | Handled automatically by Stripe | Handled automatically by Stripe | Requires engineering resources to update the onboarding flow for each additional country | Learn more about [Connect onboarding options](https://docs.stripe.com/connect/onboarding.md) and [migrating your API-based onboarding and remediation flows to Stripe-hosted or embedded flows](https://docs.stripe.com/connect/migrate-from-api-onboarding.md). The [changes you make to your onboarding flow](https://docs.stripe.com/connect/handle-verification-updates.md#modify-your-onboarding-flow) depend on how you collect onboarding information. In addition to updating your onboarding flow, update your internal and external documentation as needed, and prepare your support teams to answer questions about the updates. If you use Stripe-hosted or Embedded onboarding, then you don’t need to update your integration to prepare for these requirement updates. However, you can communicate to your connected accounts that Stripe might request new or updated identity information when requirements change. ## API integration overview If you choose not to migrate to Stripe-hosted or Embedded onboarding, then you need to address the following updates: - [Know Your Customer (KYC) verification](https://docs.stripe.com/connect/upcoming-requirements-updates.md#know-your-customer-\(kyc\)-verification) - [Ultimate beneficial owner (UBO) and director relationship verification](https://docs.stripe.com/connect/upcoming-requirements-updates.md#ubo-director-verification) - [Netherlands business registration (KvK) requirements](https://docs.stripe.com/connect/upcoming-requirements-updates.md#netherlands-business-registration-requirements) - [New error codes](https://docs.stripe.com/connect/upcoming-requirements-updates.md#new-error-codes) ## Update timeline The following timeline explains the key milestones for these changes. Make sure to update and test your integration early to avoid any issues when the new requirements take effect. | Date | Milestone | Description | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | October 2025 | Start integration planning | Initial API updates are available. Review this guide and the changes to start planning your integration updates. | | March 2026 | Review impacted accounts and test your integration updates | Stripe provides an estimated count of your impacted connected accounts. Start testing your updated onboarding flow. | | March 2026 | `future_requirements` rollout begins (API onboarding) | For platforms using API onboarding, Stripe starts adding the new requirements to `future_requirements` for both new and existing accounts. | | April 1, 2026 | New requirements start for platforms that only have connected accounts with business type `individual` | Make sure that your updated onboarding flow is ready to collect the new requirements. You need to have your updated flow working by April 1, when Stripe begins rolling out the new requirements. All of the new requirements will become active by the end of April. | | May 1, 2026 | New requirements start for platforms that have connected accounts with business type `company`, including platforms that also have `individual` connected accounts | Make sure that your updated onboarding flow is ready to collect the new requirements. You need to have your updated flow working for all connected accounts by May 1, when Stripe begins rolling out the new requirements. All of the new requirements will become active by the end of May. | | April 2026 – early July 2026 | New requirements become currently due for existing accounts | The new requirements roll out to existing connected accounts during this period. Use your updated onboarding flow to collect them as needed. | | July – October 2026 | Due dates for new requirements | To avoid restrictions, the updated requirements for each account must be verified by that account’s due date. | ## Know your customer (KYC) verification Stripe is strengthening our identity verification process, which might require some of your connected accounts to provide additional information. We’re also adding more options to the API for verifying information. The following entities must provide verifiable KYC information: - Legal entity (for individuals and sole proprietor entities); - Account representative - UBOs and directors (for accounts deemed high risk by the Stripe risk model) ### Additional verification methods Use the following optional methods in addition to standard keyed-in information to maximize verification success rates: - [Stripe Identity](https://docs.stripe.com/connect/upcoming-requirements-updates.md#stripe-identity): (Recommended) Use selfie and document capture for accounts that fail automatic verification. - [National ID verification](https://docs.stripe.com/connect/upcoming-requirements-updates.md#national-id-verification): Collect a national ID number up front to increase first-pass verification rates. - [Upload additional documents](https://support.stripe.com/questions/documents-for-identity-and-home-address-verification): Submit supporting identity or address documents for manual review. ### Stripe Identity (Recommended) You can attempt to verify connected accounts that fail their automatic verification by using [Stripe Identity](https://stripe.com/identity). Identity works by capturing a selfie and an [ID document](https://docs.stripe.com/acceptable-verification-documents.md). Most [European countries](https://docs.stripe.com/identity/use-cases.md) support Stripe Identity, and success rates vary by country. Create an Identity [verification session](https://docs.stripe.com/api/identity/verification_sessions.md?api-version=preview) and use the [related_person](https://docs.stripe.com/api/identity/verification_sessions/object.md?api-version=preview#identity_verification_session_object-related_person) parameter to submit `document` and `proof_of_liveness` requirements for the person. You can check the results using the API or the Dashboard. ### National ID verification (Public preview) In the [countries affected by this update](https://docs.stripe.com/connect/upcoming-requirements-updates.md#affected-countries), you can improve verification of a connected account representative by providing their national ID number in addition to their name, birthdate, address, and nationality. Verification currently supports only the following national ID numbers. | Country | National ID type | | ------- | --------------------------------------- | | Denmark | Central Person Register (CPR) | | Italy | Codice Fiscale (Fiscal Code) | | Poland | PESEL number | | Spain | Documento Nacional de Identidad (DNI) | | Sweden | Personnummer (Personal Identity Number) | You can provide national ID numbers only for connected accounts in the countries affected by this update. For example, you can provide the ID number for a Spanish citizen acting as a representative for a connected account in Austria, but you can’t provide the ID number for a Spanish citizen acting as a representative for a connected account in the US. > #### National ID availability > > This integration will be available in production when the updated requirements become future requirements. Use the following example to test your integration. ### Implement national ID verification using the API The following example demonstrates onboarding a new connected account with the updated requirements. > The differences below only impact the v1 Accounts API, not v2. #### Step 1: Create a connected account After future requirements roll out, create connected accounts as usual. Until then, create new connected accounts in test mode to enable the new KYC behavior. Trigger this behavior by changing two parts of your account creation call: 1. Add the header `experimental_onboarding_preview=v2`. 1. Submit `capabilities[card_payments][preview]=true`. After you create the account, you see a new requirement string `representative.nationality`. This indicates you can create an account representative and pass nationality. ```shell // Creating a connected account in Spain > curl https://api.stripe.com/v1/accounts \ -u sk_test_123 \ -H "Stripe-Version: 2025-08-27.basil;experimental_onboarding_preview=v2" \ -d 'type'='custom' \ -d 'country'='ES' \ -d 'capabilities[card_payments][requested]'='true' \ -d 'capabilities[card_payments][preview]'='true' \ -d 'capabilities[transfers][requested]'='true' { "id": "acct_1Nv0FGQ9RKHgCVdB", ... "requirements": { "past_due": [ ... "representative.nationality", ... ] } ... } ``` #### Step 2: Create an account representative After you create the connected account, create an account representative. ```shell > curl https://api.stripe.com/v1/accounts/acct_1Nv0FGQ9RKHgCVdB/persons \ -u sk_test_123: \ -d first_name=John \ -d last_name=Doe { "id": "person_1N9XNb2eZvKYlo2CjPX7xF6B", ... } ``` #### Step 3: Submit nationality After you create an account representative, `nationality` appears in `past_due`. Collect this field so Stripe can determine if the representative is eligible for `id_number` collection. ```shell > curl https://api.stripe.com/v1/accounts/acct_1Nv0FGQ9RKHgCVdB -u sk_test_123: { ... "requirements": { "past_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.dob.year", ...other person requirements... "person_1N9XNb2eZvKYlo2CjPX7xF6B.nationality" ] } ... } ``` After you collect nationality, if the person is in an eligible country you see `past_due` and `alternatives`. This indicates that collecting national ID is recommended but not required. ```shell > curl https://api.stripe.com/v1/accounts/acct_1Nv0FGQ9RKHgCVdB/persons/person_1N9XNb2eZvKYlo2CjPX7xF6B \ -u sk_test_123: \ -d nationality=ES > curl https://api.stripe.com/v1/accounts/acct_1Nv0FGQ9RKHgCVdB -u sk_test_123: { "requirements": { "past_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.dob.year", ...other person fields... ], "alternatives": [ { "original_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.dob.year", ...other person fields... ], "alternative_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.id_number" ] } ] } } ``` #### Step 4: Collect remaining account representative fields Collect additional person attributes, including a national ID number, to start programmatic KYC verification. ```shell > curl https://api.stripe.com/v1/accounts/acct_1Nv0FGQ9RKHgCVdB/persons/person_1N9XNb2eZvKYlo2CjPX7xF6B \ -u sk_test_123: \ -d 'id_number'='74362315-A' \ ...other person fields... ``` #### Step 5: Keyed-in fields go into pending verification After you provide keyed-in data, fields appear in `pending_verification` in a new way: - Keyed-in fields go into `pending_verification` rather than `verification.document` and `verification.additional_document`. This indicates the keyed-in fields are being verified. - The `id_number` requirement can go into `pending_verification` if provided, even if it appears only in `alternative_fields_due` and never in `past_due` or `currently_due`. ```shell > curl https://api.stripe.com/v1/accounts/acct_1Nv0FGQ9RKHgCVdB/ -u sk_test_123: { "requirements": { "pending_verification": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.address.city", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address.line1", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address.postal_code", "person_1N9XNb2eZvKYlo2CjPX7xF6B.dob.day", "person_1N9XNb2eZvKYlo2CjPX7xF6B.dob.month", "person_1N9XNb2eZvKYlo2CjPX7xF6B.dob.year", "person_1N9XNb2eZvKYlo2CjPX7xF6B.first_name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.id_number", "person_1N9XNb2eZvKYlo2CjPX7xF6B.last_name" ] } } ``` #### Step 6: Handle verification errors In many cases, after fields enter `pending_verification`, the representative passes KYC and the process completes. If verification fails, Stripe returns additional information to help you guide the next steps. There are two important changes. **Multiple alternatives** In the requirements hash you’ll see multiple alternatives. Each of these represents a path forward for your users. For example, if the name and date of birth match but the name and address don’t, your connected account has several ways to resolve the issue: 1. They can check the information they’ve entered for name and address and re-enter those fields to correct any errors. 1. They can check the information they entered for dob, name, address and id_number and re-key correct information. 1. They can upload a document that matches their name and address 1. They can complete Stripe Identity These four paths appear as `past_due` fields and `alternatives`: ```shell > curl https://api.stripe.com/v1/accounts/acct_1Nv0FGQ9RKHgCVdB -u sk_test_123: { "requirements": { // 1. They can check the information they've entered for dob, name, and address, and re-enter the correct information. "past_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.first_name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.last_name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address.*" ], "alternatives": [ // 2. They can check the information they entered for dob, name, address and id_number and re-key correct information. { "original_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.first_name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.last_name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address.*" ], "alternative_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.id_number" ] }, // 3. They can upload document that matches their name and address { "original_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.first_name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.last_name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address.*" ], "alternative_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.verification.additional_document" ] }, // 4. They can complete Stripe Identity { "original_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.first_name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.last_name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address.*" ], "alternative_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.proof_of_liveness" ] } ] } } ``` **Errors on keyed-in fields** Previously, if a verification error occurred while processing keyed-in fields, document fields went to `past_due` and errors appeared on them. Going forward, keyed-in fields return to `past_due`. Fields like `id_number` remain in `alternative_fields_due`. For example, if name, date of birth, and address are originally `past_due`, and after submission name and date of birth match while name and address don’t, then name and address return to `past_due` while date of birth is removed. In this situation, errors appear on fields in `past_due` and `alternative_fields_due`. ```shell > curl https://api.stripe.com/v1/accounts/acct_1Nv0FGQ9RKHgCVdB -u sk_test_123: { "requirements": { "past_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address" ], "alternatives": [ { "original_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address" ], "alternative_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.id_number" ] }, { "original_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address" ], "alternative_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.proof_of_liveness" ] }, { "original_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.name", "person_1N9XNb2eZvKYlo2CjPX7xF6B.address" ], "alternative_fields_due": [ "person_1N9XNb2eZvKYlo2CjPX7xF6B.verification.additional_document" ] } ], "errors": [ { "code": "verification_failed_keyed_in_mismatch", "reason": "Identity information could not be verified.", "requirement": "person_1N9XNb2eZvKYlo2CjPX7xF6B.name" }, { "code": "verification_failed_keyed_in_mismatch", "reason": "Identity information could not be verified.", "requirement": "person_1N9XNb2eZvKYlo2CjPX7xF6B.address" }, { "code": "verification_failed_keyed_in_mismatch", "reason": "Identity information could not be verified.", "requirement": "person_1N9XNb2eZvKYlo2CjPX7xF6B.id_number" } ] } } ``` ### Test another entity type Stripe’s risk model requires KYC for UBOs and directors only for accounts classified as high risk. For testing, append `_testability` to the business name to enforce a high-risk rating. This example shows how to create a high-risk test account: ```curl // Creating a connected account in Spain curl https://api.stripe.com/v1/accounts \ -u sk_test_123: \ -H "Stripe-Version: 2025-08-27.basil;experimental_onboarding_preview=v2" \ -d 'type'='custom' \ -d 'country'='ES' \ -d 'capabilities[card_payments][requested]'='true' \ -d 'capabilities[card_payments][preview]'='true' \ -d 'capabilities[transfers][requested]'='true' { "id": "acct_123", ... "requirements": {...} ... } // Set the business name to enforce the account to be high risk curl https://api.stripe.com/v1/accounts/acct_123 \ -u sk_test_123: \ -d "business_profile[name]"="example_testability" ``` ```curl curl https://api.stripe.com/v1/accounts/acct_123/persons \ -u sk_test_123: \ -d first_name=John \ -d last_name=Doe \ -d "relationship[owner]=true" { "id": "person_abc", ... } ``` ```curl curl https://api.stripe.com/v1/accounts/acct_123/persons \ -u sk_test_123: \ -d first_name=Peter \ -d last_name=Doe \ -d "relationship[director]=true" { "id": "person_abc", ... } ``` At this point, you can resolve KYC as usual, or you can use the [national ID resolution path](https://docs.stripe.com/connect/upcoming-requirements-updates.md#step-3-submit-nationality). ## Relationship verification for UBOs and directors Stripe is enhancing our verification process for ultimate beneficial owners (UBOs) and directors. European regulations require verification of the relationship of UBOs and directors to the legal entity: - **UBO:** An individual who owns or controls (directly or indirectly) more than 25% of a legal entity (for example, companies, corporations, LLCs, and partnerships). - **Director:** A board member or senior person responsible for managing a business (for example, CEO, COO, managing director). The following table shows the relationships that must be verified for each legal entity type: | Legal entity type | Relationships to verify | Note | | ---------------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------ | | Company, corporation, LLC, partnership | UBOs if they exist; otherwise directors | UK only: both UBOs and directors | | Non-profit | Directors | Non-profits don’t normally have UBOs | | Government agency, government entity, individual, sole proprietor, publicly traded | N/A | Identity verification only | ### Verify UBO and director information Stripe attempts to verify the person’s relationship by matching key properties of the person with properties of the legal entity. | Entity | Key properties | | ------------ | ---------------------------------------------------------------- | | Person | - First name - Last name - ID number | | Legal entity | - Name - Address - Tax ID - VAT ID - Registration number | A successful verification might require only a subset of the properties to match. Stripe attempts to verify relationships in the following ways: | Method | Description | Sample requirements | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Third-party provider | If a third-party provider is available, Stripe automatically attempts to verify all relationships on the account. | - `owners.first_name` - `owners.last_name` - `company.tax_id` | | Official document | You can provide a “Proof of UBO” document for owners and a “Proof of Registration” document for directors. [Acceptable documents](https://docs.stripe.com/acceptable-verification-documents.md) vary by country. | - `owners.first_name` - `owners.last_name` - `company.name` - `company.address.line1` - `company.address.city` - `company.address.state` - `documents.proof_of_ultimate_beneficial_ownership` | | Digital attestation | You can use the following PDF templates to provide digital attestations for your relationships: - [UBO digital attestation template](https://docs.stripecdn.com/6e82842bfc01bd0b1c46d77f7d46b69673a9ca965ed2ad9ef53139f98abdbbaf.pdf) - [Director digital attestation template](https://docs.stripecdn.com/715ffef45157ff700bc368a4011659ee23bc8ba3c68746c5c15948a6eee1591f.pdf) | - `owners.id_number` - `company.tax_id` - `documents.proof_of_ultimate_beneficial_ownership` - `documents.proof_of_ultimate_beneficial_ownership.signer` | ### Identify relationship verification requirements using the API When you retrieve an `Account`’s requirements, the original and alternative verification options represent combinations of the key information and available verification methods. In most cases, there are at least three options for verifying owners or directors. The following code shows an example of a connected account with owner requirements. Particular options, and the order in which they appear, can vary between accounts. ```shell // Example with owner requirements > curl https://api.stripe.com/v1/accounts/acct_1234 \ -u sk_test_123: { "id": "acct_1234", "past_due": { // third-party provider option "currently_due": [ "owners.first_name", "owners.last_name", "company.owners_provided", "company.tax_id" ], "alternatives": [ { "original_fields_needed": [ "owners.first_name", "owners.last_name", "company.owners_provided", "company.tax_id" ], // official document option "alternative_fields_needed": [ "owners.first_name", "owners.last_name", "company.owners_provided", "company.name", "company.address.line1", "company.address.state", "company.address.city", "documents.proof_of_ultimate_beneficial_ownership.files" ], }, { "original_fields_needed": [ "owners.first_name", "owners.last_name", "company.owners_provided", "company.tax_id" ], // digital attestation option "alternative_fields_needed": [ "owners.first_name", "owners.last_name", "company.owners_provided", "company.name", "company.address.line1", "company.address.state", "company.address.city", "documents.proof_of_ultimate_beneficial_ownership.files", "documents.proof_of_ultimate_beneficial_ownership.signer" ], } ] } } ``` ### Verify directors instead of owners If a connected account is eligible to provide directors instead of owners, it includes alternative options for verifying directors. If you verify directors, you still need to attest that you provided 0 UBOs. The following example shows a connected account that’s eligible to verify directors instead of owners: ```shell // Example with owner requirements > curl https://api.stripe.com/v1/accounts/acct_1234 \ -u sk_test_123: { "id": "acct_1234", "past_due": { // third-party provider option for owners "currently_due": [ "owners.first_name", "owners.last_name", "company.owners_provided", "company.tax_id" ], "alternatives": [ ..., { "original_fields_needed": [ "owners.first_name", "owners.last_name", "company.owners_provided", "company.tax_id" ], // third-party provider option for directors "alternative_fields_needed": [ "directors.first_name", "directors.last_name", "company.directors_provided", "company.owners_provided", "company.tax_id" ], } ] } } ``` If you provide director information and attest to providing 0 UBOs, the primary requirement options still reflect owner requirements. You can provide owner information if it becomes available. The following example shows a connected account with 0 UBO attestation: ```shell // Example with owner requirements > curl https://api.stripe.com/v1/accounts/acct_1234 \ -u sk_test_123: { "id": "acct_1234", "past_due": { // third-party provider option for owners "currently_due": [ "owners.first_name", "owners.last_name", // company.owners_provided is no longer a requirement "company.tax_id" ], "alternatives": [ ..., { "original_fields_needed": [ "owners.first_name", "owners.last_name", "company.tax_id" ], // third-party provider option for directors "alternative_fields_needed": [ "directors.first_name", "directors.last_name", "company.directors_provided", "company.tax_id" ], } ] } } ``` ### Error Handling Owner and director requirement errors can include the following `code` values in addition to the common [document and detail mismatch errors](https://docs.stripe.com/error-codes.md). | Code | Description | | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `verification_missing_owners` | The `Account` is missing information about owners identified by a third-party provider or that appear in a document or digital attestation. | | `verification_missing_directors` | The `Account` is missing information about directors identified by a third-party provider or that appear in a document or digital attestation. | | `verification_data_not_found` (Private preview) | A third-party provider couldn’t find information about the business. | You can sometimes resolve these errors by updating the business details. However, in most cases, you need to direct the connected account to either the document upload path or the digital attestation path. When Stripe identifies missing owners or directors, in some cases a private preview API can provide data about them. The connected account can use that data to create the missing `Persons`. ### Implement digital attestation for UBO and director verification using the API > #### Availability > > The Accounts v2 API doesn’t yet support digital attestation. The following example shows how to perform digital attestation for UBO or director verification. 1. Retrieve the account to identify which attestation documents are required. ```shell // Check for UBO attestation requirement > curl https://api.stripe.com/v1/accounts/acct_1234 \ -u sk_test_123: // Response showing UBO attestation { "id": "acct_1234", "requirements": { "past_due": [ "documents.proof_of_ultimate_beneficial_ownership.files", "documents.proof_of_ultimate_beneficial_ownership.signer", ], "errors": [] } } // Or for directors & officers requirement { "id": "acct_1234", "requirements": { "past_due": [ "documents.proof_of_registration.files", "documents.proof_of_registration.signer" ], "errors": [] } } ``` The digital attestation requirements option can appear as the primary option or as an alternative to a different option. Particular options, and the order in which they appear, can vary between accounts. 1. Generate a PDF using the template, and have an authorized person digitally sign it. 1. Upload the signed attestation document using the File API. ```shell curl -X POST https://files.stripe.com/v1/files \ -u sk_test_123: \ -F purpose=account_requirement \ -F file=@signed_attestation.pdf // Response { "id": "file_1234567890", "object": "file", "purpose": "account_requirement" } ``` 1. Submit the document with the ID of the `Person` that represents the signer. ```shell // For UBO attestation curl -X POST https://api.stripe.com/v1/accounts/acct_1234 \ -u sk_test_123: \ -d "documents[proof_of_ultimate_beneficial_ownership][files][]=file_1234567890" \ -d "documents[proof_of_ultimate_beneficial_ownership][signer][person]=person_xyz" // For D&O attestation curl -X POST https://api.stripe.com/v1/accounts/acct_1234 \ -u sk_test_123: \ -d "documents[proof_of_registration][files][]=file_1234567890" \ -d "documents[proof_of_registration][signer][person]=person_xyz" ``` ### Signer validation requirements Who can sign attestations - Account representatives - Business owners (25%+ ownership) - Directors and officers - Other authorized account members Important: The signer must be an existing person associated with the account. Only individuals with a documented relationship to the legal entity can sign attestation documents. ### Error handling Digital attestation introduces specific error scenarios you need to handle: #### Invalid signator Occurs when the signer isn’t associated with the account or lacks authority. ```shell { "requirements": { "errors": [{ "requirement": "documents.proof_of_ultimate_beneficial_ownership.files", "code": "invalid_signator", "reason": "Unauthorized attestation signer. The signer must have a documented relationship with the legal entity." }, { "requirement": "documents.proof_of_ultimate_beneficial_ownership.signer", "code": "invalid_signator", "reason": "Unauthorized attestation signer. The signer must have a documented relationship with the legal entity." }] } } ``` #### Document failed Occurs when the uploaded document is unreadable or incorrect. ```shell { "requirements": { "past_due": ["documents.proof_of_registration.files"], "errors": [{ "requirement": "documents.proof_of_registration.files", "code": "verification_document_failed_other", "reason": "Your team can contact Stripe to learn more about why identity verification failed." }] } } ``` #### Signer submitted without files API errors when submitting signer without files ```shell { "error": { "code": "invalid_signator", "message": "signer.person can only be provided when a file is also provided", "type": "invalid_request_error" } } ``` ### Next Steps 1. Update your integration to collect a signer when using attestation documents. 1. Implement error handling for new attestation-specific error codes. 1. Train your support team on the new attestation requirements. #### Prefill UBO and director information (Private preview) Optionally, you can also integrate with an API that programmatically detects and prefills UBOs or directors associated with a legal entity. The connected account can verify the relationship by confirming the detected information instead of through document upload or digital attestation. This path can increase verification rates and reduce friction, but it doesn’t work for all accounts. You still need to handle document uploads or digital attestations for accounts where Stripe can’t prefill their relationships. If you’re interested in prefill for UBO or director verification, sign up to express your interest below. ## Netherlands business registration (KvK) requirements Starting in 2026, we’re enforcing stricter business type requirements for Netherlands (NL) accounts to ensure compliance with Dutch regulations. This specifically affects how we collect the KvK (Kamer van Koophandel), the unique 8-digit company registration number required for businesses in the Netherlands. ### What’s changing #### 1. Individual business type is no longer supported The `individual` business type is no longer supported for Netherlands accounts. This affects: Existing and new NL accounts with `business_type: "individual"` and `business_type: "sole_proprietorship"` **Why this matters:** In the Netherlands, every business must provide a KvK (Chamber of Commerce) number. Our “individual” business type doesn’t collect a KvK, which makes it non-compliant. #### 2. New error code: `unsupported_business_type` Accounts with invalid business types see a new error in their requirements: ```shell // Account with unsupported business type { "id": "acct_123", "business_type": "individual", "country": "NL", "requirements": { "past_due": ["business_type"], "errors": [{ "requirement": "business_type", "code": "unsupported_business_type", "reason": "Business type isn't supported in merchant country. 'individual' isn't a supported business type in country NL." }] } } ``` #### 3. Collect KvK registration for unincorporated accounts Existing and new NL accounts with the following business types and structures are required to provide KvK registration. - `business_type: "company"` and `business_structure: "unincorporated_partnership"` - `business_type: "non_profit"` and `business_structure: "unincorporated_non_profit"` **Why this matters:** unincorporated accounts are **currently** not required to provide a KvK number, which violates Dutch compliance requirements. All NL businesses must provide their KvK registration. ### How to resolve #### For existing accounts Existing NL accounts with `individual` business type must update to `company` with `sole_proprietorship` structure to stay compliant when we start rolling out this new requirement: ```shell // Update existing account curl -X POST https://api.stripe.com/v1/accounts/acct_123 \ -u sk_test_123: \ -d "business_type=company" \ -d "company[structure]=sole_proprietorship" \ -d "company[tax_id]=12345678" // KvK number // Successful response { "id": "acct_123", "business_type": "company", "company": { "structure": "sole_proprietorship", "tax_id": "12345678" }, "requirements": { "past_due": [], // business_type requirement resolved "errors": [] } } ``` #### For new account creation Attempting to create a Netherlands account with an `individual` business type will return the unsupported_business_type error. ```shell // This will fail curl -X POST https://api.stripe.com/v1/accounts \ -u sk_test_123: \ -d "country=NL" \ -d "type=custom" \ -d "business_type=individual" // Response { "id": "acct_123", "business_type": "individual", "country": "NL", "requirements": { "past_due": ["business_type"], "errors": [{ "requirement": "business_type", "code": "unsupported_business_type", "reason": "Business type isn't supported in merchant country. 'individual' isn't a supported business type in country NL." }] } // Correct approach curl -X POST https://api.stripe.com/v1/accounts \ -u sk_test_123: \ -d "country=NL" \ -d "type=custom" \ -d "business_type=company" \ -d "company[structure]=sole_proprietorship" ``` ### Supported business structures for NL For Netherlands accounts, use these business type and structure combinations: | Business Type | Structure | KvK Required | | ------------- | ---------------------------- | ------------ | | `company` | `sole_proprietorship` | Yes | | `company` | `incorporated_partnership` | Yes | | `company` | `unincorporated_partnership` | Yes | | `company` | `private_corporation` | Yes | | `company` | `public_corporation` | Yes | | `non_profit` | Various structures | Yes | ### Impact on capabilities Accounts with `unsupported_business_type` error will have their capabilities restricted until the business type is updated: ```shell { "capabilities": { "card_payments": "inactive", "transfers": "inactive" }, "requirements": { "disabled_reason": "requirements.past_due", "past_due": ["business_type"] } } ``` Accounts have not provided their KvK registration will have their `card_payments` capability restricted until this information is provided: ```shell { "capabilities": { "card_payments": "inactive" }, "requirements": { "disabled_reason": "requirements.past_due", "past_due": ["company.tax_id"] } } ``` ### Implementation Checklist For platforms with NL connected accounts: 1. **Audit existing accounts** ```javascript // Find affected accounts const accounts = await stripe.accounts.list({ limit: 100, // Filter for NL accounts in your system }); const affected = accounts.data.filter(a => a.country === 'NL' && a.business_type === 'individual' ); ``` 1. **Update account creation flows** - Remove `individual` option for NL accounts - Default to `company` with `sole_proprietorship` - Collect KvK number (company.tax_id) 1. **Handle the new error code** ```javascript if (account.requirements.errors.some(e => e.code === 'unsupported_business_type')) { // Prompt user to update business type // Guide them to select appropriate structure // Collect KvK number } ``` 1. **Communicate with affected connected accounts** - Explain why the change is needed - Provide guidance on selecting correct business structure - Help them locate their KvK number ### Testing Test your implementation with these scenarios: ```javascript // Test updating to valid business type const updated = await stripe.accounts.update('acct_test_123', { business_type: 'company', company: { structure: 'sole_proprietorship', tax_id: '12345678' // Test KvK } }); ``` ### Additional considerations #### Individual freelancers In the Netherlands, even individual freelancers must register as a business (eenmanszaak) and obtain a KvK number. They should select `company` → `sole_proprietorship`. #### How to find the KvK number for connected accounts The KvK number is on their Chamber of Commerce registration certificate (uittreksel Kamer van Koophandel). #### Backward compatibility In older API versions, `unsupported_business_type` appears as `invalid_value_other` with a `detailed_code` field containing the specific error. ## New error codes ### Verification error codes (Private preview) The new error code `verification_data_not_found` can appear in the `requirements.errors` array on the `Account` object. This error signals that Stripe was unable to retrieve information (such as UBO or Director/Officer data) from third-party verification providers using the connected account’s known legal entity details. That can happen for a number of reasons, but it’s often because the account entered their information incorrectly. This “data not found” error is distinct from existing verification error codes: - **`verification_missing_owners`**: Indicates that known owners are missing from the account. - **`verification_failed_keyed_match`**: Indicates a mismatch between submitted information and verification sources. ```shell // Example: verification_data_not_found error { "requirements": { "errors": [{ "requirement": "owners", "code": "verification_data_not_found", "reason": "Stripe was unable to retrieve ownership or director information from third-party providers based on the current legal entity details. Verify that the business information on the account is correct." }] } } ``` To handle this error, prompt the connected account to review and correct their legal entity information (company name, registration number, address). If they update their information, Stripe automatically attempts to verify it again. If the account information is correct, or if Stripe still can’t verify updated information, use a manual verification method such as document upload or digital attestation. ## Testing You can create test accounts to use when developing and testing your integration. Test accounts can simulate different verification outcomes, allowing you to see how the API returns requirements and errors for each case. The following examples help you prepare for the upcoming EU requirements changes. For more information about Connect testing in general, see [Testing Stripe Connect](https://docs.stripe.com/connect/testing.md). ### Create a test account Create a test `Account` by sending a POST request to the Accounts API using your [sandbox secret key](https://docs.stripe.com/keys.md). To access the new requirements before they’re released to non-test mode accounts, set a header enabling a preview version of the API, enable the experimental onboarding preview feature, and enable the preview version when requesting a capability. For example: ```shell curl https://api.stripe.com/v1/accounts \ -u sk_test_123: \ -H "Stripe-Version: 2026-01-28.preview;experimental_onboarding_preview=v2" \ -d 'type'='custom' \ -d 'country'='ES' \ -d 'capabilities[card_payments][requested]'='true' \ -d 'capabilities[card_payments][preview]'='true' \ -d 'capabilities[transfers][requested]'='true' \ -d 'capabilities[transfers][preview]'='true' ``` The examples below demonstrate how to simulate different situations by using values that trigger specific responses for test accounts. ### Test an Account belonging to an individual This example creates an account that doesn’t require relationship verification because the business entity type is `individual`. Create a test account following [the earlier instructions](https://docs.stripe.com/connect/upcoming-requirements-updates.md#create-a-test-account), then set the basic business details: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d business_type=individual \ -d "business_profile[mcc]"=5995 \ -d "business_profile[url]"="https://accessible.stripe.com" ``` The response includes the basic requirements for an individual. You can meet these requirements by creating a representative: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123/persons \ -u sk_test_123: \ -d "first_name=Marie" \ -d "last_name=Dupont" \ -d "dob[year]=1901" \ -d "dob[month]=1" \ -d "dob[day]=1" \ -d "address[line1]=address_full_match" \ -d "address[city]=Madrid" \ -d "address[postal_code]=28009" \ -d "address[country]=ES" \ -d "email=test@example.com" \ -d "phone=%2B35366666666" \ -d "nationality=ES" \ -d "relationship[representative]=true" ``` Specifying the DOB 1901-01-01 triggers successful identity verification in test mode. For other result triggers, see [Test dates of birth](https://docs.stripe.com/connect/testing.md#test-dobs). Similarly, setting the first line of the address to the string `address_full_match` triggers successful verification of the address. For other result triggers, see [Test business addresses](https://docs.stripe.com/connect/testing.md#test-validation-addresses). The response shows that the individual’s requirements have become pending. If you wait a few moments and retrieve the `Account`, you can see that those requirements have been cleared: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123 ``` The only remaining requirements are for the bank account (`external_account`) and terms of service (TOS). To clear the terms of service requirements, set the `Account`’s `tos_acceptance` hash: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d "tos_acceptance[date]=1540248693" \ -d "tos_acceptance[ip]=10.0.0.1" ``` To clear the bank account requirements, create a test bank account for the `Account`. Specify [a test bank account number according to its country](https://docs.stripe.com/connect/testing.md#account-numbers): ```shell curl https://api.stripe.com/v1/accounts/acct_test_123/external_accounts \ -u sk_test_123: \ -d "external_account[object]=bank_account" \ -d "external_account[account_number]=ES0700120345030000067890" \ -d "external_account[country]=ES" \ -d "external_account[currency]=EUR" ``` ### Test an Account belonging to a company This example creates an account that is subject to relationship verification requirements because the business entity type is `company`. > The UK requires verification of both the ultimate beneficial owners (UBOs) and the directors. If you’ll have connected accounts in the UK, make sure to test with accounts that have the country set to `GB`. Create a test account following [the earlier instructions](https://docs.stripe.com/connect/upcoming-requirements-updates.md#create-a-test-account), then set the basic business details: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d business_type=company \ -d "business_profile[mcc]"=5995 \ -d "business_profile[url]"="https://accessible.stripe.com" \ -d "company[name]=Test company" \ -d "company[phone]=628123456787" \ -d "company[address][line1]=address_full_match" \ -d "company[address][city]=Madrid" \ -d "company[address][postal_code]=28009" \ -d "company[address][country]=ES" \ -d "company[tax_id]=000000000" ``` Specifying the tax ID number `000000000` triggers successful verification of the company. For other result triggers, see [Test business tax IDs](https://docs.stripe.com/connect/testing.md#test-business-tax-ids). Next, provide a representative. ```shell curl https://api.stripe.com/v1/accounts/acct_test_123/persons \ -u sk_test_123: \ -d "first_name=Adam" \ -d "last_name=" \ -d "dob[year]=1901" \ -d "dob[month]=1" \ -d "dob[day]=1" \ -d "address[line1]=address_full_match" \ -d "address[city]=Madrid" \ -d "address[postal_code]=28009" \ -d "address[country]=ES" \ -d "email=test@example.com" \ -d "phone=%2B35366666666" \ -d "nationality=ES" \ -d "relationship[representative]=true" \ -d "relationship[title]=CEO" ``` After the verification process for the representative completes, you can see the remaining requirements with a GET request: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: ``` The requirements in the `requirements.currently_due` array list the details we need about the owners on the `Account`. The `requirements.alternatives` array can include optional information that you can provide to fulfill certain requirements. For example: ```json { "alternative_fields_due": [ "company.owners_provided", "documents.proof_of_ultimate_beneficial_ownership.files", "owners.first_name", "owners.last_name" ], "original_fields_due": [ "company.owners_provided", "owners.first_name", "owners.last_name" ] } ``` You can provide the fields listed in `alternative_fields_due` as another way to fulfill the requirements in the corresponding `original_fields_due` list. In this example, `alternative_fields_due` includes the properties in `original_fields_due`, plus `documents.proof_of_ultimate_beneficial_ownership.files`. That means the original information is required, but you have the option to also provide a document proving ultimate beneficial ownership to help the verification process. To meet the owner requirements, create two persons and mark them as owners. The names in this example are hard-coded values for test accounts that use the tax ID number `000000000`. ```shell curl https://api.stripe.com/v1/accounts/acct_test_123/persons \ -u sk_test_123: \ -d "first_name=Marie" \ -d "last_name=Dupont" \ -d "dob[year]=1901" \ -d "dob[month]=1" \ -d "dob[day]=1" \ -d "address[line1]=address_full_match" \ -d "address[city]=Madrid" \ -d "address[postal_code]=28009" \ -d "address[country]=ES" \ -d "email=owner@example.com" \ -d "relationship[owner]=true" curl https://api.stripe.com/v1/accounts/acct_test_123/persons \ -u sk_test_123: \ -d "first_name=Louis" \ -d "last_name=Martin" \ -d "dob[year]=1901" \ -d "dob[month]=1" \ -d "dob[day]=1" \ -d "address[line1]=address_full_match" \ -d "address[city]=Madrid" \ -d "address[postal_code]=28009" \ -d "address[country]=ES" \ -d "email=owner@example.com" \ -d "relationship[owner]=true" ``` Indicate that you’ve created all of the `Account`’s owners by setting `company.owners_provided` to true: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d "company[owners_provided]=true" ``` Completing this request removes all the owner requirements from the `Account`. ### Test fallback to document verification An `Account`’s owner requirements remain in `currently_due` (or in `pending_verification`, if verification is in progress) until verification is successful. When verification fails, one of your options is to upload a document. This example shows how to do so using the API. Create a test account following [the earlier instructions](https://docs.stripe.com/connect/upcoming-requirements-updates.md#create-a-test-account), then set the basic business details. Set the tax ID number to `222221001`, which triggers owner verification failure. ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d business_type=company \ -d "business_profile[mcc]"=5995 \ -d "business_profile[url]"="https://accessible.stripe.com" \ -d "company[name]=Test company" \ -d "company[phone]=628123456787" \ -d "company[address][line1]=address_full_match" \ -d "company[address][city]=Madrid" \ -d "company[address][postal_code]=28009" \ -d "company[address][country]=ES" \ -d "company[tax_id]=222221001" ``` Next, provide a representative: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123/persons \ -u sk_test_123: \ -d "first_name=Marie" \ -d "last_name=Dupont" \ -d "dob[year]=1901" \ -d "dob[month]=1" \ -d "dob[day]=1" \ -d "address[line1]=address_full_match" \ -d "address[city]=Madrid" \ -d "address[postal_code]=28009" \ -d "address[country]=ES" \ -d "email=test@example.com" \ -d "phone=%2B35366666666" \ -d "nationality=ES" \ -d "relationship[representative]=true" \ -d "relationship[title]=CEO" ``` Then, create an owner: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123/persons \ -u sk_test_123: \ -d "first_name=Adam" \ -d "last_name=Smith" \ -d "dob[year]=1901" \ -d "dob[month]=1" \ -d "dob[day]=1" \ -d "address[line1]=address_full_match" \ -d "address[city]=Madrid" \ -d "address[postal_code]=28009" \ -d "address[country]=ES" \ -d "email=owner@example.com" \ -d "relationship[owner]=true" ``` Indicate that you’re done creating owners by setting `company.owners_provided` to true: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d "company[owners_provided]=true" ``` If you examine the `Account`, you can see that the owner requirements remain and the `requirements.errors` array contains an entry with a `requirement` of `owners` and a `code` of `verification_failed_other`. That means Stripe wasn’t able to verify the owners using the provided company information. > If you’re using the private preview version of the API, the error code is [verification_data_not_found](https://docs.stripe.com/changelog/clover/2025-10-29/accounts-verification-data-error.md) instead of `verification_failed_other`. If you receive this error for a real `Account`, check that you entered the details for the correct legal entity. This example assumes that the details are correct, and that you need to provide a document to verify them. For a real `Account`, [use the Files API to upload a document](https://docs.stripe.com/file-upload.md), then update the `Account` using the token returned in the response. For this example, use the test token `file_relationship_document_success`. ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d "documents[proof_of_ultimate_beneficial_ownership][files][]"=file_relationship_document_success ``` A few moments after updating the `Account`, you can get the current requirements and see that the owner requirements have been cleared. ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: ``` ### Test a company with no applicable owners If a company has no owners with more than 25% ownership, Stripe requires the director information instead. This example demonstrates how to provide director information. Create a test account following [the earlier instructions](https://docs.stripe.com/connect/upcoming-requirements-updates.md#create-a-test-account), then set the basic business details. Set the tax ID number to `000000000`, which triggers company verification success. ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d business_type=company \ -d "business_profile[mcc]"=5995 \ -d "business_profile[url]"="https://accessible.stripe.com" \ -d "company[name]=Test company" \ -d "company[phone]=628123456787" \ -d "company[address][line1]=address_full_match" \ -d "company[address][city]=Madrid" \ -d "company[address][postal_code]=28009" \ -d "company[address][country]=ES" \ -d "company[tax_id]=000000000" ``` Next, provide a representative: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123/persons \ -u sk_test_123: \ -d "first_name=Marie" \ -d "last_name=Dupont" \ -d "dob[year]=1901" \ -d "dob[month]=1" \ -d "dob[day]=1" \ -d "address[line1]=address_full_match" \ -d "address[city]=Madrid" \ -d "address[postal_code]=28009" \ -d "address[country]=ES" \ -d "email=test@example.com" \ -d "phone=%2B35366666666" \ -d "nationality=ES" \ -d "relationship[representative]=true" \ -d "relationship[title]=CEO" ``` To indicate that the business has no relevant owners, set `company.owners_provided` to true without creating any owners. To reuse an existing test `Account` that has owners, you can remove all the existing owners. ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d "company[owners_provided]=true" ``` The `requirements.alternatives` array contains a set of director properties as an alternative to the owner properties. The process for creating a director is very similar to the process for creating an owner: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123/persons \ -u sk_test_123: \ -d "first_name=Adam" \ -d "last_name=Smith" \ -d "dob[year]=1901" \ -d "dob[month]=1" \ -d "dob[day]=1" \ -d "address[line1]=address_full_match" \ -d "address[city]=Madrid" \ -d "address[postal_code]=28009" \ -d "address[country]=ES" \ -d "email=owner@example.com" \ -d "relationship[director]=true" \ -d "relationship[title]=President" ``` Indicate that you’re done creating directors by setting `company.directors_provided` to true: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d "company[directors_provided]=true" ``` To simulate a successful relationship verification, set `company.name` to the string `match_name_relationships`: ```shell curl https://api.stripe.com/v1/accounts/acct_test_123 \ -u sk_test_123: \ -d "company[name]=match_name_relationships" ``` ### Other test cases The following tests are also valuable: - A `non_profit` type entity, which requires director verification (UBO verification isn’t an option). - Meeting director verification requirements using a document. - Companies in the UK that require both UBO verification and director verification. #### Program - US *Last updated: September 23, 2025* ## What’s changing - **Required information collected from connected accounts:** We’re updating the information we require from sole proprietorships, non-profits and single-member LLCs and simplifying how we obtain legal guardian consent for accounts opened by minors. In addition, an email for the account representative is now required for all legal entity types, and a change for government entities and public companies. - **How we verify business information and provide new detailed verification responses:** We’re updating our criteria for valid business information and introducing new verification error codes when we unable to accept or verify information provided. - **Threshold at which we verify tax identification numbers (TINs):** For Custom and Express connected accounts, we’re lowering the payments volume threshold at which we verify TINs to align with current federal tax reporting thresholds. - **How we prefill statement descriptors and statement descriptor prefixes:** If a statement descriptor isn’t provided, the prefill logic has changed to use either the business profile name, the business URL, or the legal entity name of the connected account. These changes will affect all users with a requested [card_payments](https://docs.stripe.com/api/accounts/object.md#account_object-capabilities-card_payments) capability in the US. ## Required information collected from connected accounts New information collected and new fields added to the API: - Businesses that are [company.structure](https://docs.stripe.com/api/accounts/create.md#create_account-company-structure) of `sole_proprietorship` and `single_member_llc`, must provide their business address (“company address”). In the event that the business address is the same as the representative’s personal address, your connected accounts can provide the same values for both. - Legal entities that are [company.structure](https://docs.stripe.com/api/accounts/create.md#create_account-company-structure) of `government_instrumentality`, `tax_exempt_government_instrumentality`, `governmental_unit`, `public_company`, `public_corporation`, and `public_partnership` must provide an email for the account representative. This requirement now applies to all legal entity types. - To simplify how we obtain a legal guardian’s consent for accounts opened by minors, the [Persons API](https://docs.stripe.com/api/persons.md) has been updated with a new relationship type of `legal_guardian` as well as an `additional_tos_acceptances` field to record the legal guardian’s agreement to the Stripe Terms of Service. If the account representative’s date of birth indicates the individual is a minor, then an account requirement is triggered to add a `legal_guardian` before the account can be activated. ## How we verify business information and provide new detailed verification responses ### Updates to the information we already collect We’ll request the following information from your connected accounts: | Field | Updated requirements | Additional considerations | | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | | SSN or ITIN collected from US-resident Representatives (Reps) | Last four digits required at onboarding for all account types (including Custom and Express connected accounts) | This is the current behavior for Standard connected accounts. | | SSN or ITIN collected from US-resident Owners | Last four digits required once payments volume exceeds 500K USD for all account types (including Custom and Express connected accounts) | See *SSN Full 9 Digit Note* below | | National ID or verification document collected from non-US-resident Representatives | National ID or verification document at onboarding for all account types (including Custom and Express connected accounts) | Only applies to non-US-resident Reps | | National ID or verification document collected from non-US-resident Owners | National ID or verification document once payments volume exceeds 500K USD for all account types (including Custom and Express connected accounts) | Only applies to non-US resident Owners | > If we can’t programmatically obtain the full nine digit SSN for an individual associated with your account using information already provided, you must provide the full nine digits. ### New verification error codes When we’re unable to verify information provided by your connected accounts, we’ll surface detailed verification responses as new error codes in the [requirements.errors](https://docs.stripe.com/api/accounts/object.md#account_object-requirements-errors) array. [View docs](https://docs.stripe.com/connect/handling-api-verification.md#validation-and-verification-errors). #### Synchronous errors | Field | New error code | Error message | | ---------------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- | | Product Description | `invalid_product_description_length` | Your product description must be at least 10 characters. | | Product Description | `invalid_product_description_url_match` | Your product description must be different from your URL. | | (Full) Statement Descriptor | `invalid_statement_descriptor_length` | Your statement descriptor must be between 5 and 22 characters. | | (Full) Statement Descriptor | `invalid_statement_descriptor_business_mismatch` | Your statement descriptor must be similar to your business name, legal entity name, or URL. | | (Full) Statement Descriptor | `invalid_statement_descriptor_denylisted` | Generic or well-known statement descriptors aren’t supported. | | (Short) Statement Descriptor | `invalid_statement_descriptor_prefix_mismatch` | The statement descriptor prefix must be similar to your statement descriptor, business name, legal entity name, or URL. | | (Short) Statement Descriptor | `invalid_statement_descriptor_prefix_denylisted` | Generic or well-known statement descriptor prefixes aren’t supported. | | LE Business Name | `invalid_company_name_denylisted` | Generic or well-known business names aren’t supported. | | Business Profile Name (DBA) | `invalid_business_profile_name_denylisted` | Generic or well-known business names aren’t supported. | | Business Profile Name (DBA) | `invalid_business_profile_name` | Business profile names must consist of recognizable words. | | Persons DOB | `invalid_dob_age_under_minimum` | Person must be at least 13 years old. | | Persons DOB | `invalid_dob_age_over_maximum` | Date of birth must be within in the last 120 years. | | Persons phone | `invalid_phone_number` | The phone number doesn’t seem to be valid. Make sure it’s formatted correctly. | | LE Business Phone | `invalid_phone_number` | The phone number doesn’t seem to be valid. Make sure it’s formatted correctly. | | Company TaxID | `invalid_tax_id_format` | Tax IDs must be a unique set of 9 numbers without dashes or other special characters. | | URL | `invalid_url_format` | Format as https://example.com | | URL | `invalid_url_denylisted` | Generic business URLs aren’t supported. | #### Asynchronous errors | Field | New error code | Error message | | ----- | --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | URL | `invalid_url_website_inaccessible` | This URL couldn’t be reached. Make sure it’s available and entered correctly or provide another. | | URL | `invalid_url_website_business_information_mismatch` | The business information on your website must match the details you provided to Stripe. | | URL | `invalid_url_website_incomplete` | Your website seems to be missing some required information. Learn about website requirements | | URL | `invalid_url_website_other` | We weren’t able to verify your business using the URL you provided. Make sure it’s entered correctly or provide another URL. | | URL | `invalid_url_web_presence_detected` | Because you use a website, app, social media page, or online profile to sell products or services, you must provide a URL for your business. | ### Update to the threshold at which we verify tax identification numbers (TINs) To align with the IRS reporting thresholds for Forms 1099-K, 1099-NEC, and 1099-MISC, we’re updating the threshold at which we verify the TIN to when your payments volume reaches 600 USD or within 30 days of first charge, whichever comes first. ### How we prefill statement descriptors and statement descriptor prefixes If not provided, the statement descriptor is prefilled using the following supplied fields (in this order): [business_profile.name](https://docs.stripe.com/api/accounts/object.md#account_object-business_profile-name) (“doing business as”), [business_profile.url](https://docs.stripe.com/api/accounts/object.md#account_object-business_profile-url), the legal entity name (either [individual.first_name](https://docs.stripe.com/api/accounts/object.md#account_object-individual-first_name) + [individual.last_name](https://docs.stripe.com/api/accounts/object.md#account_object-individual-last_name) or [company.name](https://docs.stripe.com/api/accounts/object.md#account_object-company-name))`. In addition, if the statement descriptor prefix isn’t provided, it’s prefilled from the first 10 characters of the statement descriptor. #### Program - Singapore *Last updated: May 21, 2025* ## Integration recommendations The integration changes you need to make depend upon how you collect onboarding information from your Connected Accounts. You also need to plan to update your internal and external documentation about verification requirements, and train your support teams to address any questions your users might have. > Stripe strongly recommends using [Stripe-hosted](https://docs.stripe.com/connect/hosted-onboarding.md) or [Embedded Onboarding](https://docs.stripe.com/connect/embedded-onboarding.md) to handle the collection of business and identity verification information. Stripe-hosted and embedded onboarding provide a guided experience with extra information about beneficial owners and directors, that isn’t currently available in the API. This information is retrieved from government databases and reduces verification information collected from connected accounts. ### Integration Overview Starting in mid-March, the [future_requirements](https://docs.stripe.com/api/accounts/object.md#account_object-future_requirements) hash will allow you to preview upcoming new requirements and their deadline for your connected accounts. You can avoid disruption of your connected accounts’ capabilities by planning the collection of updated information before the `current_deadline`. New Custom connected accounts created from April 2025 forward will also be required to meet the new verification requirements. Detect account status changes by listening to the account.updated event. Refer to our [FAQ page](https://support.stripe.com/questions/singapore-verification-requirements-for-custom-connected-accounts-faq) for more information on timelines. Make sure your integration is set up to [handle verification updates](https://docs.stripe.com/connect/handle-verification-updates.md) when onboarding new accounts and collecting updated information from existing accounts. Specifically for embedded or Stripe-hosted onboarding flows, you can customize the behavior to optionally collect [future_requirements](https://docs.stripe.com/api/accounts/object.md#account_object-future_requirements) upfront. For Stripe-hosted onboarding, set the `collection_options.future_requirements` parameter to `include` when [creating an Account Link](https://docs.stripe.com/api/account_links/create.md#create_account_link-collection_options). For embedded onboarding, set the futureRequirements field of the [`collectionOptions`](https://docs.stripe.com/connect/supported-embedded-components/account-onboarding.md#requirements-collection-options) attribute to `include`. ### Requirements Overview | Entity Type | Ultimate beneficial ownership (UBO) verification | Directorship collection | Proof of authority (PoA) | Letter of Authority | | --------------------- | ------------------------------------------------------------------------------------------------------------- | ----------------------- | ------------------------ | ------------------------ | | Individuals | Doesn’t apply | Doesn’t apply | Doesn’t apply | Doesn’t apply | | Sole proprietorships | Doesn’t apply | Doesn’t apply | Always applies | Doesn’t apply | | Private companies | Required for owners with 25% or more ownership* Can be exempted | Always applies | Always applies | Alternative if PoA fails | | Partnerships | Required for all partners and managers and any other individual with 25% or more ownership Can be exempted | Doesn’t apply | Always applies | Alternative if PoA fails | | Government entities** | Doesn’t apply | Doesn’t apply | Always applies | Always applies | | Public companies** | Exempted | Always applies | Always applies | Alternative if PoA fails | | Non-profits | All directors and key executives Can be exempted | Doesn’t apply | Always applies*** | Alternative if PoA fails | > \* In cases where there are no owners with 25% or more ownership, all directors are treated as the UBOs. > > \** Government entities and public companies are new entity types in Singapore. Reach out to [Stripe Support](https://support.stripe.com/) to request access. > > \*** Non-profits not listed on charities.gov.sg must upload a [proof_of_ultimate_beneficial_ownership](https://docs.stripe.com/api/accounts/update.md#update_account-documents-proof_of_ultimate_beneficial_ownership) document to indicate all directors and key executives. ## Business types and structures supported You have different verification requirements depending on your business type. For a business type `company`, you can further classify your user’s business by identifying its legal (business) structure. A business structure describes the details of a business entity such as day-to-day operations, tax burdens, liability, and organizational structure. You can classify it by using the [company.structure](https://docs.stripe.com/api/accounts/create.md#create_account-company-structure) field in the Account object. A company is considered private by default if information on the [company.structure](https://docs.stripe.com/api/accounts/create.md#create_account-company-structure) isn’t provided. Aligned with Singapore’s guidelines, all company types must be registered on [ACRA](https://www.acra.gov.sg/). These are the suggested mappings to transition from the `business_type`-only classification to [business_type](https://docs.stripe.com/api/accounts/object.md#account_object-business_type) and [company.structure](https://docs.stripe.com/api/accounts/create.md#create_account-company-structure). | Existing business type | New business type and company structure combination | Description | | ------------------------- | --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `individual` | type: `individual`, structure: `nil` | A single person engaging in a business activity who isn’t operating under a corporate structure. | | `sole_prop` | type: `company`, structure: `sole_proprietorship` | An unincorporated business owned by one individual. The business is registered as a Sole Proprietorship on [ACRA](https://www.acra.gov.sg/how-to-guides/before-you-start/choosing-a-business-structure). | | `company` / `corporation` | type: `company`, structure: `private_company` | An association or relationship between two or more individuals, corporations, trusts, or partnerships that join together to carry on a trade or business. The business is registered as a Company on [ACRA](https://www.acra.gov.sg/how-to-guides/before-you-start/choosing-a-business-structure), including companies limited by guarantee. | | `partnership` | type: `company`, structure: `private_partnership` | An association or relationship between two or more individuals, corporations, trusts, or partnerships that join together to carry on a trade or business. The business is registered as a Partnership on [ACRA](https://www.acra.gov.sg/how-to-guides/before-you-start/choosing-a-business-structure). | | `public_company` | type: `company`, structure: `public_company` | A company that offers its securities for sale to the general public. This business structure is restricted—contact [Stripe Support](https://support.stripe.com/) for information on how to use it. The business is registered as a Company on [ACRA](https://www.acra.gov.sg/how-to-guides/before-you-start/choosing-a-business-structure). | | `non_profit` | type: `non_profit`, structure: `nil` | An organization operating for a purpose other than generating profit, often with the objective of advancing social, educational, charitable, or other community goals. | > If the business is a non-profit registered on ACRA, the requirements for the business type registered on ACRA apply. ## Business representative verification ### Enhanced identity verification In Singapore, enhanced identity verification of representatives for all business types is required using [Singpass MyInfo](https://www.singpass.gov.sg/main/individuals/), a popular digital identity provider. If users don’t have access to MyInfo, they must verify liveness using [Stripe Identity](https://docs.stripe.com/identity.md). Successful completion of enhanced identity verification using either SingPass MyInfo or Stripe Identity requires integrating with [Connect Onboarding or Embedded Onboarding](https://docs.stripe.com/connect/custom/onboarding.md). If you’re using the Stripe API to onboard connected accounts, you must update your forms to collect the new required verification information from your users, and redirect them to Connect Onboarding at the final stage to complete the enhanced identity verification. ### Address verification Verification of the business representative’s address is required for all businesses. If Stripe can’t verify the address, you must collect a [proof of address document](https://docs.stripe.com/acceptable-verification-documents.md?country=SG&document-type=address). ## Proof of authority verification Stripe is required to verify that the [account representative has sufficient authority](https://support.stripe.com/questions/representative-authority-verification) to open an account on behalf of the legal entity. If we can’t verify this programmatically, you must change the representative to a person with sufficient authority. If a person with sufficient authority can’t be the business representative, you can add them as a person with the [authorizer](https://docs.stripe.com/api/persons/update.md#update_person-relationship-authorizer) position. The business must then provide a [Letter of Authorization](https://b.stripecdn.com/content/Letter_of_authorization_for_Stripe_Singapore.pdf) signed by the [authorizer](https://docs.stripe.com/api/persons/update.md#update_person-relationship-authorizer) permitting the business representative to manage the account. This must be provided as the representative’s [company_authorization](https://docs.stripe.com/api/persons/update.md#update_person-documents-company_authorization). You must add the [first name](https://docs.stripe.com/api/persons/object.md#person_object-first_name) and [last name](https://docs.stripe.com/api/persons/object.md#person_object-last_name) of the authorizer to the account, along with a copy of their [ID Document](https://docs.stripe.com/api/persons/update.md#update_person-verification-document). > Stripe currently only accepts the [Letter of Authorization](https://b.stripecdn.com/content/Letter_of_authorization_for_Stripe_Singapore.pdf) template provided. ``` { "id": ""{{CONNECTED_ACCOUNT_ID}}"", "future_requirements": { "past_due": [ "authorizer.first_name", "authorizer.last_name", "authorizer.id_document", "{{REPRESENTATIVE_ID}}.documents.company_authorization.files" ], "alternatives": [ { "original_fields_due": [ "authorizer.first_name", "authorizer.last_name", "authorizer.id_document", "{{REPRESENTATIVE_ID}}.documents.company_authorization.files" ], "alternative_fields_due": [ "{{REPRESENTATIVE_ID}}.first_name", "{{REPRESENTATIVE_ID}}.last_name", "{{REPRESENTATIVE_ID}}.id_number" ] } ], "errors": [ { "code": "verification_failed_representative_authority", "requirement": "authorizer.first_name", "reason": "..." }, { "code": "verification_failed_representative_authority", "requirement": "authorizer.last_name", "reason": "..." }, ... ], ... }, ... } ``` Additionally, the Letter of Authorization requirement can expose document-related errors such as `verification_document_name_mismatch`, or `verification_document_type_not_supported`. Make sure you can handle [Document Verification Errors](https://docs.stripe.com/connect/handling-api-verification.md#handle-document-verification-problems) and the [New verification error codes](https://docs.stripe.com/connect/upcoming-requirements-updates.md#new-verification-error-codes). ## Legal entity verification Verification of business name, UEN and legal entity type is required for all businesses. If Stripe can’t verify the existence of the company, you must collect a company document. Stripe is also required to check that the business type and business structure matches the local government records. When a mismatch in [business type](https://docs.stripe.com/api/accounts/object.md#account_object-business_type) or [business structure](https://docs.stripe.com/api/accounts/object.md#account_object-company-structure) occurs, it generates a `verification_legal_entity_structure_mismatch` error, and the business type or structure needs to be updated or a company document will be required to verify the legal entity. ``` { "id": ""{{CONNECTED_ACCOUNT_ID}}"", "future_requirements": { "past_due": [ "company.verification.document" ], "errors": [ { "code": "verification_legal_entity_structure_mismatch", "requirement": "company.verification.document", "reason": "Business type or structure seems to be incorrect. Provide the correct business type and structure for this account." }, ... ], ... }, ... } ``` ## Ultimate beneficial ownership verification ### Determining owners based on entity type #### Private Companies Stripe defines and attempts to identify any individual with 25% or more ownership as the ultimate beneficial owner (UBO). We recommend using [Stripe-hosted](https://docs.stripe.com/connect/hosted-onboarding.md) or [Embedded Onboarding](https://docs.stripe.com/connect/embedded-onboarding.md) to allow your users to preview and confirm the owners. Alternatively, you can collect and add all UBOs to the account using the [owner](https://docs.stripe.com/api/persons/object.md) position in the API. If Stripe can’t determine these individuals, a company must submit a [proof of ultimate beneficial ownership document](https://docs.stripe.com/acceptable-verification-documents.md?country=SG&document-type=relationship) to attest to their ownership structure. This must include proof of ownership documents for any holding companies owning 25% or more shares of the connected account. Stripe-hosted or embedded onboarding automatically seeks to collect these documents or you can collect and submit them using the v1/accounts API. You must add all UBOs listed on the proof of ultimate beneficial ownership to the account. > Connected accounts can submit a single [ultimate beneficial owner attestation](https://docs.stripe.com/acceptable-verification-documents.md?country=SG&document-type=relationship) as an alternative to one document for the business and another for each holding company with significant ownership. > > If the company has no owners with 25% or more ownership, all directors listed on government records (and available for preview on Stripe-hosted or embedded onboarding) will be considered to be the UBOs and must be added to the account. #### Partnerships Partnerships must verify the relationship between the business and all partners, managers and any other individual with 25% or more ownership. These persons must be added to the account with the [owner](https://docs.stripe.com/api/persons/object.md#person_object-relationship-owner) position in the API. #### Non-Profits In the case of non-profits, all key executives and directors are considered UBOs. This includes: - President - Director - CEO - Treasurer - Secretary or General Secretary - Chairman - Trustee - Newly added positions - And any of these positions in an Assistant, Deputy, or Vice capacity. Stripe attempts to identify all directors and key executives of charities registered in Singapore, which can be previewed and confirmed on Stripe-hosted or embedded onboarding. All other non-profits must provide a [proof of ultimate beneficial ownership document](https://docs.stripe.com/acceptable-verification-documents.md?country=SG&document-type=relationship) and the listed individuals must be added to the account with the [director](https://docs.stripe.com/api/persons/object.md#person_object-relationship-director) position in the API. ### Integration details [First name](https://docs.stripe.com/api/persons/object.md#person_object-first_name), [last name](https://docs.stripe.com/api/persons/object.md#person_object-last_name), [ID number](https://docs.stripe.com/api/persons/update.md#update_person-id_number), and [aliases](https://docs.stripe.com/api/persons/object.md#person_object-full_name_aliases) of all natural persons who ultimately own or manage the legal entity must be added to the account with the [owner](https://docs.stripe.com/api/persons/object.md#person_object-relationship-owner) or [director](https://docs.stripe.com/api/persons/object.md#person_object-relationship-director) position in the API. UBOs are defined differently based on the entity type. Verification of beneficial ownership is required for private companies, private partnerships, and non-profits. When we can’t successfully verify the UBO, you need to collect an [ID Document](https://docs.stripe.com/api/persons/update.md#update_person-verification-document) for the unverified UBO. ``` { "id": ""{{CONNECTED_ACCOUNT_ID}}"", "future_requirements": { "past_due": [ "{{REPRESENTATIVE_ID}}.verification.document" ], "errors": [ { "code": "verification_failed_keyed_identity", "requirement": "{{REPRESENTATIVE_ID}}.verification.document", "reason": "..." }, ... ], ... }, ... } ``` If Stripe determines that the account is missing owners, directors, or documentation of holding companies, the `documents.proof_of_ultimate_beneficial_ownership.files` field will be returned in [future_requirements](https://docs.stripe.com/api/accounts/object.md#account_object-future_requirements). A complete list of acceptable documents for Singapore can be found at [Acceptable Verification Documents](https://docs.stripe.com/acceptable-verification-documents.md?country=SG&document-type=relationship). Stripe-hosted and embedded onboarding display a list of missing [owners](https://docs.stripe.com/api/persons/object.md#person_object-relationship-owner) and [directors](https://docs.stripe.com/api/persons/object.md#person_object-relationship-director), which allows the user to add them to their account by clicking on them. Adding the suggested individuals fulfills the UBO requirement for companies without any holding companies in their ownership structure. For companies with holding companies, Stripe attempts to verify its owners. If we can’t, the user receives a prompt to upload either an [ultimate beneficial owner attestation document](https://docs.stripe.com/acceptable-verification-documents.md?country=SG&document-type=relationship) or relevant [ownership documents](https://docs.stripe.com/acceptable-verification-documents.md?country=SG&document-type=relationship) to determine the account’s ultimate beneficial owners. (This also applies to other business types, such as non-profits.) Accounts with missing beneficial owners have a `verification_missing_owners` error code in the errors hash of [future_requirements](https://docs.stripe.com/api/accounts/object.md#account_object-future_requirements-errors). Similarly, accounts with missing directors have a `verification_document_directors_mismatch` error code. Lastly, accounts where Stripe requires additional information regarding their ownership have a `verification_requires_additional_proof_of_registration` error code. ``` { "id": ""{{CONNECTED_ACCOUNT_ID}}"", "future_requirements": { "past_due": [ "documents.proof_of_ultimate_beneficial_ownership.files", ], "errors": [ { "code": "verification_missing_owners", "requirement": "documents.proof_of_ultimate_beneficial_ownership.files", "reason": "..." }, ... ], ... }, ... } ``` ### Exemptions In certain situations, a business entity might not need to declare its ownership. To qualify for an exemption, a legitimate reason must be provided in the [company.ownership_exemption_reason](https://docs.stripe.com/api/accounts/update.md#update_account-company-ownership_exemption_reason) field. Valid reasons for exemption include: - `qualified_entity_exceeds_ownership_threshold`: If a government, publicly listed company, or financial institution owns at least 75% of the business, the business is exempt from providing ownership details. - `qualifies_as_financial_institution`: Businesses that are financial institutions regulated by the [Monetary Authority of Singapore](https://eservices.mas.gov.sg/fid/institution?sector=Banking&category=Finance%20Company) are exempt from sharing ownership details. ``` { "id": ""{{CONNECTED_ACCOUNT_ID}}"", "future_requirements": { "past_due": [ "documents.proof_of_ultimate_beneficial_ownership.files", ], "alternatives": [ { "original_fields_due": [ "documents.proof_of_ultimate_beneficial_ownership.files", ], "alternative_fields_due": [ "company.ownership_exemption_reason", ] } ], ... }, ... } ``` After submitting an exemption reason, we’ll review the business entity’s details. During this review, the requirement will be moved to [future_requirements.pending_verification](https://docs.stripe.com/api/accounts/object.md#account_object-future_requirements-pending_verification). If Stripe determines that the business entity doesn’t qualify for the exemption, we display an error message, and the ownership requirement will remain: ``` { "id": ""{{CONNECTED_ACCOUNT_ID}}"", "future_requirements": { "past_due": [ "documents.proof_of_ultimate_beneficial_ownership.files", ], "alternatives": [ { "original_fields_due": [ "documents.proof_of_ultimate_beneficial_ownership.files", ], "alternative_fields_due": [ "company.ownership_exemption_reason", ] } ], "errors": [ { "code": "verification_rejected_ownership_exemption_reason", "reason": "The ownership exemption reason was rejected.", "requirement": "company.ownership_exemption_reason" } ], ... }, ... } ``` ## Directorship collection You must collect and submit the [first name](https://docs.stripe.com/api/persons/object.md#person_object-first_name), [last name](https://docs.stripe.com/api/persons/object.md#person_object-last_name), [ID number](https://docs.stripe.com/api/persons/update.md#update_person-id_number), and [aliases](https://docs.stripe.com/api/persons/object.md#person_object-full_name_aliases) of all [directors](https://docs.stripe.com/api/persons/object.md#person_object-relationship-director) listed in the connected account’s government registry records, for private companies, publicly listed companies, and non-profits. Additionally, you could be asked to attest that the list of directors is current and correct by setting the `company.directorship_declaration.ip`, `company.directorship_declaration.date`, and optionally the `company.directorship_declaration.user_agent` fields in the API. If a discrepancy in your list of directors is detected, Stripe might request a new declaration by returning the `company.directorship_declaration.ip`, `company.directorship_declaration.date` requirements in the requirements field. ## New verification error codes If Stripe can’t verify information provided by your Connected accounts, details of verification responses will be included as new error codes in the [requirements.errors](https://docs.stripe.com/api/accounts/object.md#account_object-requirements-errors) array of the Accounts object. API version [2025-03-31](https://docs.stripe.com/upgrades.md#2025-03-31) introduces the error codes below. Earlier API versions receive `verification_failed_other` instead. Alternatively, a beta header can be added to your API integration which exposes the new error codes without changing your API version. Contact [Stripe Support](https://support.stripe.com/) to get access to this beta header. | Error code | Error description | | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `verification_legal_entity_structure_mismatch` | Business type or structure seems to be incorrect. Provide the correct business type and structure for this account. | | `verification_failed_representative_authority` | We couldn’t verify the authority of the account representative. Add an authorizer to the account and provide a Letter of Authorization signed by the authorizer. Refer to our [Representative authority verification](https://support.stripe.com/questions/representative-authority-verification) support article. | | `verification_failed_authorizer_authority` | We couldn’t verify the authority of the provided authorizer. Change the authorizer to a person who is registered as an authorized representative. Refer to our [Representative authority verification](https://support.stripe.com/questions/representative-authority-verification) support article. | | `verification_rejected_ownership_exemption_reason` | The ownership exemption reason was rejected. Choose a different exemption reason or upload a proof of ultimate beneficial ownership document instead. | | `information_missing` | Refer to the error message to understand what information was missing in the document or keyed-in data. If related to holding companies with significant ownership, the error code also provides the missing holding companies we’ve identified. For more information, refer to our [beneficial ownership verification for holding companies](https://support.stripe.com/questions/beneficial-ownership-verification-for-holding-companies) support article. | | `verification_missing_owners` | Business owners not provided. Provide information for all business owners or invite them to provide it themselves. The owners we’ve identified as missing are: [Name1, Name2]. | | `verification_missing_directors` | Directors are missing from the account. Update the account and upload a registration document with current directors. | | `verification_document_directors_mismatch` | Directors from the document are missing from the account. Update the account and upload a registration document with current directors. | ## See also - [Connect onboarding for Custom accounts](https://docs.stripe.com/connect/custom/hosted-onboarding.md) - [Onboarding solutions for Custom accounts](https://docs.stripe.com/connect/custom/onboarding.md) - [Updating accounts](https://docs.stripe.com/connect/updating-service-agreements.md) - [Handling identity verification with the API](https://docs.stripe.com/connect/handling-api-verification.md) - [Testing Custom account identity verification](https://docs.stripe.com/connect/testing-verification.md)