# Use Terminal with Connect Integrate Stripe Terminal with your Connect platform. Stripe Terminal is compatible with *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), allowing your platform and connected accounts to accept in-person payments. Integrate Terminal with Connect according to how your platform processes payments for your connected accounts. - If you use [direct charges](https://docs.stripe.com/connect/direct-charges.md), you submit Terminal API requests to configure readers and accept payments using your platform’s API key and the `Stripe-Account` header to identify the connected account. - If you use [destination charges](https://docs.stripe.com/connect/destination-charges.md), you submit Terminal API requests to configure readers and accept payments using your platform API key and identify the connected account using metadata. - If you use [separate charges and transfers](https://docs.stripe.com/connect/separate-charges-and-transfers.md), you submit Terminal API requests using your platform API key to create charges on your platform account, then create separate transfers to move funds to your connected accounts. In all cases, use [locations](https://docs.stripe.com/api/terminal/locations.md) to group readers applicably. > Terminal connected accounts must have the `card_payments` capability to perform transactions. # Direct charges ## Connected accounts own readers With this integration, all API resources belong to the connected account rather than your platform. The connected account is responsible for the cost of Stripe fees, refunds, and chargebacks. In the Dashboard, you can view your Terminal data by logging in as the connected account. ### Create locations and readers (Server-side) Create [Locations](https://docs.stripe.com/terminal/fleet/locations-and-zones.md?dashboard-or-api=dashboard#create-locations-and-zones) and [Readers](https://docs.stripe.com/terminal/payments/connect-reader.md?reader-type=internet) for connected accounts by including the `Stripe-Account` header in the API requests. You can also register the reader by clicking **View as** in the Stripe Dashboard for your connected account. ```curl curl https://api.stripe.com/v1/terminal/locations \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d display_name=HQ \ -d "address[line1]=1272 Valencia Street" \ -d "address[city]=San Francisco" \ -d "address[state]=CA" \ -d "address[country]=US" \ -d "address[postal_code]=94110" ``` ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` ### Create connection tokens (Server-side) > When using [Connect OAuth](https://docs.stripe.com/connect/oauth-reference.md) authentication, you must authorize the connected account separately for live mode and sandboxes using each mode’s respective application Client ID. When creating a [ConnectionToken](https://docs.stripe.com/api/terminal/connection_tokens.md) for the Terminal SDK, set the `Stripe-Account` header to the connected account accepting payments. You can also provide a `location` parameter to control access to readers. If you provide a location, only readers assigned to that location can use the `ConnectionToken`. If you don’t provide a location, all readers can use the `ConnectionToken`. ```curl curl https://api.stripe.com/v1/terminal/connection_tokens \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d "location={{TERMINALLOCATION_ID}}" ``` If you’re using a server-driven integration, you don’t need to create a connection token. ### Create PaymentIntents (Client-side) (Server-side) With the iOS, Android, and React Native SDKs, you can create a `PaymentIntent` on the client or server. The JavaScript SDK only supports server-side creation. #### Client-side When creating a `PaymentIntent` client-side for direct charges, don’t specify any additional parameters for the `PaymentIntent`. Instead, create a `ConnectionToken` with the `Stripe-Account` header for the connected account accepting payments. The client SDKs create the `PaymentIntent` on the same connected account the `ConnectionToken` belongs to. For more information, see [Create PaymentIntents client-side](https://docs.stripe.com/terminal/payments/collect-card-payment.md#create-client-side). #### Server-side The JavaScript SDK requires you to create the `PaymentIntent` on your server. For the other client SDKs, you might want to create the `PaymentIntent` on your server if the information required to start a payment isn’t readily available in your app. For more information, see [Create PaymentIntents Server-side](https://docs.stripe.com/terminal/payments/collect-card-payment.md?terminal-sdk-platform=js#create-payment). When creating a `PaymentIntent` server-side for direct charges, set the `Stripe-Account` header to the connected account. ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d amount=1000 \ -d currency=usd \ -d "payment_method_types[]=card_present" \ -d capture_method=manual ``` Then follow the steps to [collect a payment](https://docs.stripe.com/terminal/payments/collect-card-payment.md) to process the PaymentIntent. ## Platform-owned readers (Private preview) > [Contact us](mailto:stripe-terminal-betas@stripe.com) if you’re interested in letting the platform own and manage readers with direct charges. This private preview feature is currently available for [smart readers](https://docs.stripe.com/terminal/smart-readers.md) using a [server-driven integration](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=server-driven). This integration works only with connected accounts that you control through a single platform. With this integration, your platform owns device resources like [Locations](https://docs.stripe.com/api/terminal/locations.md) and [Readers](https://docs.stripe.com/api/terminal/readers.md), and your connected accounts own payment resources like [PaymentIntents](https://docs.stripe.com/api/payment_intents.md). This allows your platform to manage a single reader that processes payments for multiple connected accounts. The connected accounts are responsible for the cost of Stripe fees, refunds, and chargebacks. In the Dashboard, you can view your Terminal device management data directly when logged into your platform account. You can view payment data by logging in as the connected account. ### Create locations and readers The best way to group Reader objects by connected account is by assigning them to `Locations`. On your platform account, [create a Location](https://docs.stripe.com/terminal/fleet/locations-and-zones.md?dashboard-or-api=dashboard#create-locations-and-zones) for a connected account using a display name that identifies the account. ```curl curl https://api.stripe.com/v1/terminal/locations \ -u "<>:" \ -d display_name=HQ \ -d "address[line1]=1272 Valencia Street" \ -d "address[city]=San Francisco" \ -d "address[state]=CA" \ -d "address[country]=US" \ -d "address[postal_code]=94110" ``` Before you can connect your application to a [smart reader](https://docs.stripe.com/terminal/payments/connect-reader.md?reader-type=internet), you must register the reader to your platform account. ```curl curl https://api.stripe.com/v1/terminal/readers \ -u "<>:" \ -d registration_code={{READER_REGISTRATION_CODE}} \ --data-urlencode "label=Alice's reader" \ -d "location={{TERMINALLOCATION_ID}}" ``` ### Create PaymentIntents When creating a `PaymentIntent` for direct charges, set the `Stripe-Account` header to the connected account. > The platform can only process PaymentIntents later if you create them for connected accounts that you control through a single platform. ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \ -d amount=1000 \ -d currency=usd \ -d "payment_method_types[]=card_present" \ -d capture_method=manual ``` ### Process PaymentIntents The platform can process the connected account’s `PaymentIntent` with the platform-owned reader. > The PaymentIntent can only be processed if you create it using the `Stripe-Account` header. ```curl curl https://api.stripe.com/v1/terminal/readers/{{TERMINALREADER_ID}}/process_payment_intent \ -u "<>:" \ -d "payment_intent={{PAYMENTINTENT_ID}}" ``` ## See also - [Cart display](https://docs.stripe.com/terminal/features/display.md) - [Receipts](https://docs.stripe.com/terminal/features/receipts.md)