# Set up an Issuing and Connect integration Learn how to issue cards on connected accounts. *Stripe Connect* (Connect is Stripe's solution for multi-party businesses, such as marketplace or software platforms, to route payments between sellers, customers, and other recipients) provides Stripe Issuing platforms with foundational infrastructure to manage funds flows and compliance requirements. In a Connect integration, the platform account makes API calls on behalf of the connected accounts. ## When to use Connect If you need to issue cards for users that aren’t directly employed by your business, set up Stripe Connect for your Issuing integration. For example, a business building a new expense management product for small businesses can integrate with Connect. Each small business that uses the expense management product is set up as a connected account. After you set up and onboard connected accounts, your customers can support their card spend by funding their Issuing balance from their external bank account (or, in certain cases, your customers’ spend can be supported by your platform Issuing balance). Alternatively, they can create a financial account that they can fund and support their card spend. Your customers can also create cardholders and cards and set up spending controls. > #### Create multiple types of cards on the same connected account > > Platforms can enable connected accounts to create different types of cards with the [programs API](https://docs.stripe.com/api/issuing/programs.md). ## Create connected accounts with Issuing capabilities To issue cards, each business entity must use a connected account. Issuing only supports connected accounts that don’t use a Stripe-hosted Dashboard, and where your platform is responsible for requirements collection and loss liability, also known as a Custom connected account. Learn how to [create connected accounts](https://docs.stripe.com/connect/interactive-platform-guide.md?connect-charge-type=direct&connect-loss-liability-owner=platform) with the [Accounts v2 APIs](https://docs.stripe.com/connect/accounts-v2.md) that work with Issuing. Connected accounts require specific capabilities enabled on the account to use features of Issuing. The capabilities requested for a connected account might require additional information about your connected account owners. Stripe Issuing works with [Account v2](https://docs.stripe.com/api/v2/core/accounts.md) objects. An Account v2 object represents a company, individual, or other entity that interacts with a platform on Stripe. It contains identifying information and properties that control its behavior and functionality. An account can have one or more configurations that enable sets of related features, such as allowing it to act as a business, a customer, a recipient, a storer or a card creator. Usage of the `card_creator` configuration allows accounts to control functionality on Issuing. All accounts that require Issuing functionality must also request the `recipient` configuration with the `stripe_balance.stripe_transfers` capability requested. As the platform, you can create connected accounts with required capabilities for Issuing. You can onboard the connected account by providing all necessary details. #### Create an account Create a new connected account [through the Dashboard](https://docs.stripe.com/connect/dashboard/managing-individual-accounts.md#creating-accounts) or using the API with [create Account](https://docs.stripe.com/api/v2/core/accounts/create.md). > #### Start with test accounts > > In testing environments, connected accounts can’t receive or spend real money and can’t be used in live mode, but they’re identical in configuration and functionality. Use [POST /v2/core/accounts](https://docs.stripe.com/api/v2/core/accounts/create.md) to create a new connected account. Use the [include](https://docs.stripe.com/api/include_dependent_response_values.md?api-version=2025-09-30.preview) parameter to specify properties returned in the response. You can also request the `card_creator` config, the `merchant` config and the `recipient` config with the `stripe_balance.stripe_transfers` capability. You can request from the following `card_creator` capabilities for the account, which enable different functionalities for Issuing UK: | Capability | Description | Persona | | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | -------------- | | `configuration.card_creator.capabilities.commercial.stripe.charge_card` | Allows the connected account to create charge cards with Stripe as the BIN sponsor. | `card_creator` | | `configuration.card_creator.capabilities.commercial.prepaid_card.stripe` | Allows the connected account to create prepaid cards with Stripe as the BIN sponsor. | `card_creator` | ```curl curl -X POST https://api.stripe.com/v2/core/accounts \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2025-09-30.preview" \ --json '{ "include": [ "configuration.card_creator", "configuration.recipient" ], "contact_email": "test@example.com", "display_name": "John Smith", "identity": { "country": "gb", "entity_type": "individual" }, "configuration": { "merchant": { "mcc": "5045", "statement_descriptor": { "descriptor": "test1" }, "support": { "phone": "7325460697" } }, "card_creator": { "capabilities": { "commercial": { "stripe": { "charge_card": { "requested": true } } } } }, "recipient": { "capabilities": { "stripe_balance": { "stripe_transfers": { "requested": true } } } } }, "dashboard": "none", "defaults": { "currency": "gbp", "responsibilities": { "fees_collector": "application", "losses_collector": "application" } } }' ``` If successful, the response you receive confirms the connected account and requested storer configuration: ```json { "id": "acct_123", "object": "v2.core.account", "applied_configurations": [ "card_creator", "recipient", "merchant" ], "configuration": { "customer": null, "merchant": null, "recipient": { "capabilities": { "stripe_balance": { "stripe_transfers": { "requested": true, "status": "restricted", "status_details": [ { "code": "requirements_past_due", "resolution": "provide_info" } ] } } } }, "card_creator": { "capabilities": { "commercial": { "stripe": { "charge_card": { "requested": true, "status": "restricted", "status_details": [ { "code": "requirements_past_due", "resolution": "provide_info" } ] } } } } } }, "contact_email": "test@example.com", "created": "2025-06-18T00:48:16.000Z", "dashboard": "none", "identity": null, "defaults": null, "display_name": "John Smith", "metadata": {}, "requirements": null, "livemode": false } ``` Learn more about [how account calls return data](https://docs.stripe.com/connect/accounts-v2.md). #### Enable Issuing on the connected accounts Create the program with the appropriate `platform_program` value. You can list your programs using the [programs API](https://docs.stripe.com/issuing/cards/beta/programs.md#list-of-programs) with the `issuing_program_beta=v2` header. ```curl curl https://api.stripe.com/v1/issuing/programs \ -u "<>:" \ -H "Stripe-Version: 2026-05-27.preview; issuing_program_beta=v2" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d platform_program=iprg_123 \ -d is_default=true ``` Stripe automatically requests the necessary capability. If you request the capability directly, Stripe won’t create the program for you, and you need a program to create cards. > #### Issuing and Treasury for platforms > > If your platform already has [connected accounts](https://docs.stripe.com/connect/accounts.md), make sure they have a supported configuration for Issuing or Treasury for platforms. Issuing only supports connected accounts that don’t use a Stripe-hosted Dashboard, and where your platform is responsible for requirements collection and loss liability, also known as a Custom connected account. If this isn’t the case, you must create new accounts to use Issuing or Treasury for platforms. You can see your existing account’s configuration on the [Connected accounts](https://dashboard.stripe.com/connect/accounts) page in your Dashboard. #### Retrieve the connected account You can also use the API to retrieve the account information and verify that the capabilities property has the relevant Issuing capability requested. The capability won’t be active until all the requirements are fulfilled. ```curl curl -G https://api.stripe.com/v2/core/accounts/acct_1234567890 \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2025-09-30.preview" \ -d "include[0]=identity" \ -d "include[1]=configuration.card_creator" ``` #### Update a connected account to request a new capability If you already have a connected account, you can request to add `card_creator` capabilities for a connected account with the following request: ```curl curl -X POST https://api.stripe.com/v2/core/accounts/{{CONNECTEDACCOUNT_ID}} \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2025-09-30.preview" \ --json '{ "configuration": { "card_creator": { "capabilities": { "commercial": { "stripe": { "charge_card": { "requested": true } } } } } } }' ``` ## Start the identity verification process After you create a connected account, you need to provide more information about the account holder. The [Account](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-requirements-entries-awaiting_action_from) object that represents the connected account has a `requirements` hash that contains `awaiting_action_from` [identity verification](https://docs.stripe.com/connect/handling-api-verification.md) requirements. The user on your platform must provide the details in the `requirements` hash to enable capabilities on their connected account. If you create a test `Account` object and want to bypass onboarding requirements to test functionality, use the [Accounts update API](https://docs.stripe.com/api/v2/core/accounts/update.md) to provide [test values](https://docs.stripe.com/connect/testing-verification.md) that fulfill all the requirements. Depending on the [business type](https://docs.stripe.com/connect/identity-verification.md#business-type), the user provides details about the individual, company, non-profit organization, or government entity (Treasury for platforms doesn’t support government entities). Choose one of the following onboarding options: #### Stripe-hosted onboarding [Stripe-hosted onboarding](https://docs.stripe.com/connect/hosted-onboarding.md) is a web form hosted by Stripe with your brand’s name, color, and icon. Stripe-hosted onboarding uses the [Accounts API](https://docs.stripe.com/api/accounts.md) to read the requirements and generate an onboarding form with robust data validation and is localized for all Stripe-supported countries. Before using Connect Onboarding, you must provide the name, color, and icon of your brand in the Branding section of your [Connect settings page](https://dashboard.stripe.com/test/settings/connect). You can use hosted onboarding to allow connected accounts to link an `external_account` (which is required for payouts) by enabling it through your [Connect Onboarding settings](https://dashboard.stripe.com/settings/connect). To create an onboarding link for the connected account, use the [Account Links API](https://docs.stripe.com/api/account_links/create.md). ```curl curl https://api.stripe.com/v1/account_links \ -u "<>:" \ -d account={{CONNECTED_ACCOUNT_ID}} \ --data-urlencode "refresh_url=https://example.com/reauth" \ --data-urlencode "return_url=https://example.com/return" \ -d type=account_onboarding ``` > For security reasons, don’t email, text, or send account link URLs directly to your connected account. We recommend that you distribute the account link URL from within your platform’s application, where their account is authenticated. The response you receive includes the `url` parameter containing the link for your connected account to onboard to your platform. ```json { "object": "account_link", "created": 1612927106, "expires_at": 1612927406, "url": "https://connect.stripe.com/setup/s/…" } ``` #### Embedded onboarding Embedded onboarding is a themeable onboarding UI with limited Stripe branding. Your platform embeds the [Account onboarding component](https://docs.stripe.com/connect/supported-embedded-components/account-onboarding.md) in your application, and your connected accounts interact with the embedded component without leaving your application. Embedded onboarding uses the [Accounts API](https://docs.stripe.com/api/accounts.md) to read the requirements and generate an onboarding form with robust data validation that’s localized for all Stripe-supported countries. With embedded onboarding, you get a customized onboarding flow without the complexity and maintenance associated with updating your onboarding integration as compliance requirements change. #### API onboarding If you prefer to build custom onboarding for your connected accounts, use the [Accounts update API](https://docs.stripe.com/api/accounts/update.md) and [Persons update API](https://docs.stripe.com/api/persons/update.md) to update the relevant `Account` and `Person` objects with the required information. You must show the [required agreements for Issuing](https://docs.stripe.com/issuing/compliance-us.md#issuing-terms) and record acceptance from connected accounts through the [Issuing TOS acceptance](https://docs.stripe.com/api/accounts/object.md#account_object-settings-card_issuing-tos_acceptance) hash. ```curl curl https://api.stripe.com/v1/accounts/{{CONNECTED_ACCOUNT_ID}} \ -u "<>:" \ -d business_type=company \ -d "business_profile[mcc]=5999" \ --data-urlencode "business_profile[url]=https://www.wesellsocks.com" \ -d "business_profile[estimated_worker_count]=100" \ -d "business_profile[annual_revenue][amount]=1000000" \ -d "business_profile[annual_revenue][currency]=usd" \ -d "business_profile[annual_revenue][fiscal_year_end]=2023-12-31" \ -d "company[name]=Rocket Rides" \ -d "company[tax_id]=11-3456789" \ -d "company[address][line1]=123 Main St" \ -d "company[address][city]=San Francisco" \ -d "company[address][state]=CA" \ -d "company[address][postal_code]=94111" \ -d "company[address][country]=US" \ -d "settings[card_issuing][tos_acceptance][ip]=192.168.123.132" \ -d "settings[card_issuing][tos_acceptance][date]=1696634647" ``` ```curl curl https://api.stripe.com/v1/accounts/{{CONNECTED_ACCOUNT_ID}}/persons \ -u "<>:" \ -d first_name=Jenny \ -d last_name=Rosen \ -d "dob[day]=12" \ -d "dob[month]=11" \ -d "dob[year]=1978" \ -d "address[line1]=510 Townsend Street" \ -d "address[city]=San Francisco" \ -d "address[state]=CA" \ -d "address[postal_code]=94111" \ -d "address[country]=US" \ -d id_number=123456789 \ --data-urlencode "email=jenny.rosen@example.com" \ -d "relationship[representative]=true" \ -d "relationship[owner]=true" \ -d "relationship[percent_ownership]=0.75" ``` See [Handling verification with the API](https://docs.stripe.com/connect/handling-api-verification.md) for additional details on fulfilling onboarding requirements. ## Collect and verify required information To activate a capability, you must first request it by setting its requested property to true. This triggers collection of the capability’s requirements, which is handled by your platform. Requirements can involve identity and compliance documentation, and risk data. When Stripe verifies that a capability’s requirements are fulfilled, it becomes active. ### Requirements Requirements, which describe the information that Stripe requires to enable capabilities for the account, can include: - The type of information - Why Stripe needs the information - Whether the requirement is overdue (the deadline can be a date or some other type of threshold, such as a certain volume of payments) - Consequences that Stripe imposes at the deadline if we can’t verify the information with acceptable documentation, such as suspending certain functionality or stopping payouts from the Stripe balance for the account - Who must take action In addition to any capability-specific consequences, if a capability has overdue requirements, its status becomes `restricted`, with a `status_details.code` of `requirements_past_due`. To see all the requirements for the requested capabilities for an `Account`, [retrieve the Account](https://docs.stripe.com/api/v2/core/accounts/retrieve.md) and specify the `requirements` and the assigned configuration types in the `include` parameter. The following example returns the status and requirements for capabilities that belong to the `card_creator` configuration. ```curl curl -X POST https://api.stripe.com/v2/core/accounts/{{CONNECTEDACCOUNT_ID}} \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2025-09-30.preview" \ --json '{ "include": [ "configuration.card_creator", "requirements" ], "configuration": { "card_creator": { "capabilities": { "commercial": { "stripe": { "charge_card": { "requested": true } } } } } } }' ``` In the example response, the `card_creator.commercial.stripe.charge_card` capability has been requested, but its requirements are past due: ```json { "id": "{{CONNECTED_ACCOUNT}}", "object": "v2.core.account", "applied_configurations": [ "card_creator" ], "configuration": { "customer": null, "merchant": null, "recipient": null, "storer": null, "card_creator": { "capabilities": { "commercial": { "stripe": { "charge_card": {"requested": true, "status": "restricted", "status_details": [ { "code": "requirements_past_due", "resolution": "provide_info" } ] } } } } } }, "contact_email": "test@example.com", "created": "2025-06-18T00:48:16.000Z", "dashboard": "none", "identity": null, "defaults": null, "display_name": "Test Account", "metadata": {}, "requirements": { "collector": "application", "entries": [ { "awaiting_action_from": "user", "description": "identity.attestations.persons_provided.executives", "errors": [], "impact": { "restricts_capabilities": [ { "capability": "commercial.stripe.charge_card", "configuration": "card_creator", "deadline": { "status": "past_due" } } ] }, "minimum_deadline": { "status": "past_due" }, "reference": null, "requested_reasons": [ { "code": "routine_onboarding" } ] } ] }, "livemode": false } ``` If the capability is already `active` and the account doesn’t satisfy new requirements due on that capability before the deadline, the capability becomes `inactive` until the requirements are satisfied. ### Document uploads If an account’s information can’t be verified, Stripe might require a document to verify the identity of a person (for example, a Passport) or to verify information about the legal entity (for example, a letter from the tax authority). To satisfy document requirements, platforms can send the user to Connect Onboarding (where they’ll be [prompted to upload the document](https://docs.stripe.com/connect/custom/hosted-onboarding.md#new-reqs-due)), or collect the document from the account in another interface and [upload it through the API](https://docs.stripe.com/connect/handling-api-verification.md#upload-a-file). ### Failure to verify identity within 29 days of the initial application After an account submits all the [required information](https://docs.stripe.com/issuing/connect.md#required-verification-information) for Issuing and accepts the Issuing terms of service, Stripe considers the application complete. If we can’t verify an account’s information, the capability remains `inactive` until the account provides additional information or uploads a document. If the account remains `inactive` 29 days after completing the application, you must send an email notice to the account informing them that we couldn’t verify their identity ([see the template](https://docs.stripe.com/issuing/compliance-us/issuing-regulated-customer-notices.md?issuing-notices-sender=stripe#spend-card-application-rejected-for-failure-to-verify-identity)). Stripe monitors for completed applications with unverified identities, and takes the following action after 29 days in live mode and after 1 hour in [testing environments](https://docs.stripe.com/connect/testing.md): - [Generates an account notice](https://docs.stripe.com/issuing/compliance-us/issuing-regulated-customer-notices.md?issuing-notices-sender=stripe#events-that-require-a-customer-notice) - Clears the [terms of service acceptance hash](https://docs.stripe.com/api/v2/core/accounts/update.md#v2_update_accounts-identity-attestations-terms_of_service) so terms acceptance becomes a requirement that is awaiting action. You can submit a new application at any time by updating the business information and recording a new acceptance of Issuing’s terms. Stripe recommends that you present the terms of service as the last step of onboarding, which allows you to track the timing of application completion by referring to the term’s [acceptance date](https://docs.stripe.com/api/v2/core/accounts/object.md#v2_account_object-identity-attestations-terms_of_service-account-date). ### Terms of service violations If Stripe identifies a connect account that has violated Stripe’s terms of service, Stripe sets the Issuing capability on the account to `inactive`, deactivates any cards, and notifies the account (see [the email template](https://docs.stripe.com/issuing/compliance-us/issuing-regulated-customer-notices.md?issuing-notices-sender=stripe#account-closed-by-stripe-for-terms-of-service-violation)). This might happen when an account’s cards are used in relation to [prohibited or restricted businesses](https://stripe.com/legal/restricted-businesses), such as illegal activities, gambling, firearms, adult content, or cryptocurrencies, or in relation to [prohibited activities for Issuing ](https://stripe.com/legal/restricted-businesses#additional-product-specific-prohibitions), such as consumer spending, primarily international use, lending, or other abusive or noncompliant use. ### Accounts inactive for more than 395 days Stripe disables issuing on accounts that haven’t completed any card transactions in the past 13 months (395 days). For accounts with additional capabilities, Stripe only disables Issuing if there have also been no payments or Treasury for platforms transactions in the prior 395 days, and the financial account balance is 9.99 USD or less. When Issuing is disabled for inactivity, the Connect account’s card_creator capability status changes to `restricted`. Learn more about [managing inactive accounts](https://support.stripe.com/questions/issuing-managing-inactive-connect-accounts) with Issuing. ### Webhooks When the status of requested capabilities change for a connected account, you receive a `v2.core.account[configuration.].capability_status_updated` [webhook](https://docs.stripe.com/webhooks.md) confirming the change: ```json { "created": "2025-06-18T02:08:15.025Z", "id": "evt_test_321", "object": "v2.core.event", "type": "v2.core.account[configuration.card_creator].capability_status_updated", "data": { "updated_capability": "commercial.stripe.charge_card" }, "related_object": { "id": "acct_123", "type": "v2.core.account", "url": "/v2/core/accounts/{{CONNECTED_ACCOUNT}}?include=configuration.card_creator" }, "changes": ..., ... } ``` ## Create cardholders and cards A `Cardholder` object represents an individual or business entity that you can issue cards to. Each cardholder needs to be associated with a connected account to be issued a virtual or physical card. One connected account can have many cardholders. Learn more about [Cardholders and cards](https://docs.stripe.com/issuing/connect/cardholders-and-cards.md). ## Add funds The card can use funds from the Issuing balance or the financial account balance based on how it’s configured. ### Use the Issuing balance The Issuing balance is separate from the connected account’s main balance. When issued cards are used for transactions, they draw from the Issuing balance. Before an issued card can be used for transactions, you must first allocate funds to the connected account’s [Issuing balance](https://docs.stripe.com/issuing/funding/balance.md) associated with the card. An Issuing Balance holds funds reserved for the card and is safely separated from earnings, [payouts](https://docs.stripe.com/payouts.md), and funds from other Stripe products. Learn how to [fund connected accounts](https://docs.stripe.com/issuing/connect/funding.md) for Issuing. (See full diagram at https://docs.stripe.com/issuing/connect-v2) ## Use the Dashboard for Issuing with Connect View the connected accounts on your platform and create new accounts from the [Connected accounts](https://dashboard.stripe.com/connect/accounts) page in the Dashboard. An account might appear as `restricted` in the Dashboard if requirements are `past_due` for any of the requested capabilities. You can also do the following from the dashboard: - View account activity for a selected account. - Edit business and personal details for a selected account. - Create cardholders, cards, or test authorizations on the account. To do so, view your connected account details, then go to **Card issuing**. - View program details for a selected account. Follow the above steps to **View Dashboard as (account name)**, then go to **Settings**, the **Issuing** section, and click [Card programs](https://dashboard.stripe.com/settings/issuing/card-programs). You can also access the Issuing page for a connected account directly by navigating to this URL and replacing `{{CONNECT_ACCOUNT_ID}}` with the appropriate value: `https://dashboard.stripe.com/connect/accounts/{{CONNECT_ACCOUNT_ID}}/issuing/cards` As the platform, only you can view the Dashboard on behalf of your connected accounts. Your connected accounts won’t have a Stripe username or password, or access to the Dashboard. ## Optional: Set up spending controls You can use spending controls to block [merchant categories](https://docs.stripe.com/issuing/categories.md) (for example, bakeries), or to set spending limits such as 100 USD per authorization or 3000 USD per month. You can apply them to [Cards](https://docs.stripe.com/api/issuing/cards/object.md#issuing_card_object-spending_controls) and [Cardholders](https://docs.stripe.com/api/issuing/cardholders/object.md#issuing_cardholder_object-spending_controls) by either setting their `spending_controls` fields when you create them or by updating them later. Spending controls are set up for the cards and cardholders in a connected account. Learn more about [spending controls](https://docs.stripe.com/issuing/controls/spending-controls.md).