Connect
Service agreement types

Service agreement types

A service agreement establishes the relationship between Stripe and the platform’s users.

The connected account’s service agreement type determines what capabilities the account has access to, and which service agreement applies to the platform’s users.

Supported agreement types

Connected accounts can be under one of the following service agreement types: full or recipient. After the connected account’s service agreement is accepted, the type of service agreement can’t be modified.

Full service agreement

A full service agreement creates a service relationship between Stripe and the connected account holder. Connected accounts under the full service agreement can process card payments and request the card_payments capability.

For the legal language, see the Stripe Connected Account Agreement.

Recipient service agreement

A recipient service agreement clarifies that there is no service relationship between Stripe and the recipient, and that the recipient’s relationship is with the platform. Connected accounts under the recipient service agreement can’t process payments, e.g., request the card_payments capability.

Transfers to recipient accounts take an extra 24 hours to become available in the connected account’s balance. To learn more about pending balances, see the account balances page.

Cross-border payouts only work with accounts under the recipient service agreement.

For the legal language, see the Stripe Recipient Agreement.

Choosing the agreement type

You can specify the type through the Accounts API. For Express accounts, the type can also be preset for all new accounts.

Accounts API

To choose a recipient service agreement when creating an account, specify the type with tos_acceptance[service_agreement]:

curl https://api.stripe.com/v1/accounts \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d country=SG \ -d type=custom \ -d "capabilities[transfers][requested]"=true \ -d "tos_acceptance[service_agreement]"=recipient
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' account = Stripe::Account.create({ country: 'SG', type: 'custom', capabilities: { transfers: { 'requested': true, }, }, tos_acceptance: { service_agreement: 'recipient', }, })
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' account = stripe.Account.create( country='SG', type='custom', capabilities={ 'transfers': { 'requested': True, }, }, tos_acceptance={ 'service_agreement': 'recipient', }, )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); $account = \Stripe\Account::create([ 'country' => 'SG', 'type' => 'custom', 'capabilities' => [ 'transfers' => [ 'requested' => true, ], ], 'tos_acceptance' => [ 'service_agreement' => 'recipient', ], ]);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; AccountCreateParams params = AccountCreateParams.builder() .setCountry("SG") .setType(AccountCreateParams.Type.CUSTOM) .setCapabilities( AccountCreateParams.Capabilities.builder() .setTransfers( AccountCreateParams.Capabilities.Transfers.builder() .setRequested(true) .build()) .build()) .setTosAcceptance( AccountCreateParams.TosAcceptance.builder() .setServiceAgreement(AccountCreateParams.TosAcceptance.ServiceAgreement.RECIPIENT) .build()) .build(); Account account = Account.create(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const account = await stripe.accounts.create({ country: 'SG', type: 'custom', capabilities: { transfers: { requested: true, }, }, tos_acceptance: { service_agreement: 'recipient', }, });
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.AccountParams{ Type: stripe.String(string(stripe.AccountTypeCustom)), Country: stripe.String("SG"), Capabilities: &stripe.AccountCapabilitiesParams{ Transfers: &stripe.AccountCapabilitiesTransfersParams{ Requested: stripe.Bool(true), }, }, TOSAcceptance: &stripe.AccountTOSAcceptanceParams{ ServiceAgreement: stripe.String(string(stripe.AccountTOSAcceptanceServiceAgreementRecipient)), }, } acct, _ := account.New(params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new AccountCreateOptions { Type = "custom", Country = "SG", Capabilities = new AccountCapabilitiesOptions { Transfers = new AccountCapabilitiesTransfersOptions { Requested = true, }, }, TosAcceptance = new AccountTosAcceptanceOptions { Service_Agreement = "recipient", }, }; var service = new AccountService(); var account = service.Create(options);

The same principle applies when updating an account:

curl https://api.stripe.com/v1/accounts/{{CONNECTED_STRIPE_ACCOUNT_ID}} \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d "tos_acceptance[service_agreement]"=recipient
# Set your secret key. Remember to switch 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( '{{CONNECTED_STRIPE_ACCOUNT_ID}}', { tos_acceptance: { service_agreement: 'recipient', }, } )
# Set your secret key. Remember to switch 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( '{{CONNECTED_STRIPE_ACCOUNT_ID}}', tos_acceptance={'service_agreement': 'recipient'}, )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); \Stripe\Account::update( '{{CONNECTED_STRIPE_ACCOUNT_ID}}', [ 'tos_acceptance' => ['service_agreement' => 'recipient'], ] );
// Set your secret key. Remember to switch 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("{{CONNECTED_STRIPE_ACCOUNT_ID}}"); AccountUpdateParams params = AccountUpdateParams.builder() .putMetadata("internal_id", "42") .setTosAcceptance( AccountUpdateParams.TosAcceptance.builder() .setServiceAgreement(AccountCreateParams.TosAcceptance.ServiceAgreement.RECIPIENT) .build() ) .build(); account = account.update(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const account = await stripe.accounts.update( '{{CONNECTED_STRIPE_ACCOUNT_ID}}', { tos_acceptance: { service_agreement: 'recipient', }, } );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.AccountParams{ TOSAcceptance: &stripe.AccountTOSAcceptanceParams{ ServiceAgreement: stripe.String("recipient"), }, } acct, _ := account.Update("{{CONNECTED_STRIPE_ACCOUNT_ID}}", params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new AccountUpdateOptions { TosAcceptance = new Dictionary<string, string> { { "service_agreement", "recipient" }, }, }; var service = new AccountService(); service.Update("{{CONNECTED_STRIPE_ACCOUNT_ID}}", options);

Connect Configuration settings

To choose a recipient service agreement for all new Express accounts, select the Transfers option with the Restricted Capability Access icon in the Configuration settings section of the Stripe Dashboard.

You can override the Configuration settings for an individual account by specifying its capabilities and service agreement type with the Accounts API.

Accepting the correct agreement

For Express and Connect Onboarding for Custom accounts, Stripe handles the service agreement acceptance.

For other Custom accounts, the platform must attest that their user has seen and accepted the service agreement. See service agreement acceptance to learn how.

Was this page helpful?
Questions? Contact us.
Developer tutorials on YouTube.