Capabilities Overview

    Learn about Capabilities and some of the use cases they support.

    This page explains Capabilities, how each capability functions, and illustrates some use cases they support. After completing your platform profile, Stripe provides recommendations for your integration and enables some Capabilities for your account.

    Capabilities framework

    You can think of Capabilities as permissions that are applied to a connected account: they enable specific functionality on individual accounts, and consequently determine the information that needs to be collected from your users to verify accounts before they go live. These requirements are determined by government regulations that vary widely across the world.

    To make onboarding as easy as possible for your platform, users, and Stripe you should only use the capabilities you require. If you request more capabilities than your accounts need, it’s likely that more information will need to be collected from your users.

    For example, a business like Lyft can use the platform_payments capability to specify that drivers can receive payments from Lyft’s platform with a simple onboarding flow—the regulatory requirements are minimal. And businesses like Shopify can use the card_payments capability to enable sellers to accept payments directly from their customers. Requirements are generally more stringent for connected accounts that process payments and using the card_paymentscapability ensures that appropriate information is collected.

    The currently supported Capabilities are:

    Stripe will continue to add Capabilities as more features are enabled for our accounts. For example, Klarna payments and card issuing are two Capabilities we’d like to add in the future.

    Platform payments in detail

    Connected accounts with this capability receive payments from the platform. On-demand platforms often use this capability so they can pay their connected accounts. For example, a ride-hailing platform (e.g., Lyft) would use this capability so they can pay their drivers. The diagram below helps illustrate the flow of funds and the relationship between the customer, platform, and connected account.

    Relationship between the customer, connected account, and platform.

    Your platform’s information is displayed on the customer’s bank statement when you process charges this way, rather than the connected account’s. This is because the charges are processed on your platform, instead of the connected accounts.

    You can use platform_payments with the following account and charge types:

    Account types Charge types Stripe's recommendation
    Express Destination Express with destination charges
    Custom Separate charges and transfers

    Card payments in detail

    Connected accounts with this capability process their own card payments (they can also receive payments from the platform without having to add the platform_payments capability). E-commerce platforms often use this capability so their connected accounts can collect payments from customers. For example, an e-commerce platform (e.g., Shopify) would use this capability so each storefront can collect payments. The diagram below helps illustrate the flow of funds and the relationship between the customer, platform, and connected account.

    Relationship between the customer, connected account, and platform.

    Connected accounts with the card_payments capability have their statement descriptor displayed on the customer’s bank statement, not the platform’s.

    You can use card_payments with the following account and charge types:

    Account types Charge types Stripe's recommendation
    Standard Direct Standard with direct charges
    Express Destination
    Custom Separate charges and transfers

    Creating accounts with Capabilities

    Capabilities are set on the Account object. When creating accounts, use the requested_capabilities argument to assign Capabilities:

    curl https://api.stripe.com/v1/accounts \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d type=custom \
      -d country=US \
      -d business_type=company \
      -d requested_capabilities[]=card_payments
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
    
    Stripe::Account.create({
      type: 'custom',
      country: 'US',
      business_type: 'company',
      requested_capabilities: ['card_payments'],
    })
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    stripe.Account.create(
      type='custom',
      country='US',
      business_type='company',
      requested_capabilities=['card_payments']
    )
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    StripeAccount::create([
      "type" => "custom",
      "country" => "US",
      "business_type" => "company",
      "requested_capabilities" => ["card_payments"],
    ]);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    Map<String, Object> accountParams = new HashMap<String, Object>();
    accountParams.put("type", "custom");
    accountParams.put("country", "US");
    accountParams.put("business_type", "company");
    accountParams.put("requested_capabilities", Arrays.asList("card_payments"));
    
    Account.create(accountParams);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    stripe.accounts.create({
      type: 'custom',
      country: 'US',
      business_type: 'company',
      requested_capabilities: ['card_payments']
    }, function(err, account) {
      // asynchronously called
    });
    

    If you create accounts with the business_type set to individual, you need to provide at least one individual property (e.g., individual.first_name so that a Person object is created automatically. If you create accounts with the business_type set to company, you need to create each Person for the account.

    Capabilities are inactive until requirements for each Capability are met. These requirements vary depending on the Capability, but they often relate to identity verification, accepting Stripe’s terms of service, or other information specific to a payment type.

    You can add Capabilities to an existing Custom or Express account with the Update API call:

    curl https://api.stripe.com/v1/accounts/acct_1032D82eZvKYlo2C \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d requested_capabilities[]=card_payments
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
    
    Stripe::Account.update(
      'acct_1032D82eZvKYlo2C',
      {
        requested_capabilities: ['card_payments'],
      }
    )
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    stripe.Account.modify(
      'acct_1032D82eZvKYlo2C',
      requested_capabilities=['card_payments']
    )
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    StripeAccount::retrieve(
      'acct_1032D82eZvKYlo2C',
      [
        'requested_capabilities' => ['card_payments'],
      ]
    );
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    Account account = Account.retrieve("acct_1032D82eZvKYlo2C", null);
    Map params = new HashMap<String, String>();
    params.put("requested_capabilities", Arrays.asList("card_payments"));
    account.update(params);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    stripe.accounts.update("acct_1032D82eZvKYlo2C", {
      requested_capabilities: ['card_payments']
    })
    

    You can read more about creating Standard, Express, and Custom accounts in their respective sections.

    Questions?

    We're always happy to help with code or other questions you might have! Search our documentation, contact support, or connect with our sales team. You can also chat live with other developers in #stripe on freenode

    Was this page helpful? Yes No

    Send

    Thank you for helping improve Stripe's documentation. If you need help or have any questions, please consider contacting support.