Skip to main content
Split Payments lets platforms and marketplaces distribute the funds of a single payment across multiple recipients. When a customer pays through a Checkout Session, Fintoc splits the payout according to your rules and transfers each share to the recipient’s own bank account. You do not need manual transfers or reconciliation on your side. Each recipient is an Entity: the legal holder that receives a share of the payment. An Entity declares the account where it gets paid as part of its onboarding, so there is no separate account resource to manage. There are three steps to accept split payments:
  1. Create an Entity for each recipient
  2. Onboard the Entity, including the account where it will be paid
  3. Create a Checkout Session with a split array, then send the customer to its redirect_url

Before you begin

Before you start, make sure you have:
  • A Fintoc account with Collects enabled
  • Your Secret Key and Public Key
  • Recipient business and bank account information for each Entity you need to onboard

Step 1: Create an Entity

An Entity represents the legal holder that receives a share of a payment, such as a seller, a partner, a professional, or a business unit.
A new Entity starts in waiting_initialization. It cannot receive a split until it reaches operational, which happens once its onboarding is approved.
If the recipient already exists as an Entity in your organization, reuse its id. Creating a second Entity with the same holder_id returns 409 entity_holder_id_already_exists_for_organization.
List and retrieve entities with GET /v2/entities — which accepts holder_id, status and is_root filters — and GET /v2/entities/{id}.

Step 2: Onboard the Entity

During onboarding, the Entity declares who it is and the bank account where Fintoc pays split funds. Fintoc reviews the onboarding. After approval, the Entity becomes operational. You complete onboarding through the API in Chile and Mexico.

Create the onboarding

Onboarding type

type is required when you create the onboarding. It declares what the Entity will do with Fintoc, it cannot be changed afterwards, and it determines how much information the onboarding asks for. settlement_recipient — the Entity only receives money. Its share of each split is transferred to the bank account it declares in settlement_account, and nothing else: it does not hold a balance at Fintoc, cannot receive transfers from third parties, and cannot send money out. Because it only gets paid, the onboarding asks for the minimum needed to identify who is being paid. This is the value to use for Split Payments. account_holder — the Entity operates an account at Fintoc. It can receive incoming transfers, send outgoing ones and hold a balance. That capability carries a higher risk profile, so the onboarding requires the full set of information: transactional profile, ownership structure and supporting documents.

The settlement account

Fintoc transfers this Entity’s share of every split to data.company_information.settlement_account. The settlement_account field is the only Split Payments addition to the onboarding. It carries no holder fields: the account holder is the company being onboarded, so the tax ID is already known.
An Entity has exactly one settlement account. To change it, create a new onboarding. See Changing the settlement account.

Onboarding fields

Submit the onboarding

Once the information is complete, submit it for review:
The onboarding moves through these statuses: Two webhooks tell you the outcome:
  • entity.onboarding.approved: the Entity is ready to receive splits.
  • entity.onboarding.rejected: the review failed.
Compliance review typically takes one to two business days. Design your flow so the recipient can be created and shown as pending while the review runs.

Changing the settlement account

Create a new onboarding for the same Entity with the new account. While the new onboarding is under review, the previous account stays in effect and the Entity keeps receiving splits. When the new onboarding is approved, the new account replaces the previous one. If the new onboarding is rejected, nothing changes.

Step 3: Create a Checkout Session with split

Add a split array to the Checkout Session. Each entry names an Entity and its share.
Split rules must add up to the payment amount exactly. No residual remains. If you keep part of the payment, declare your own root Entity as another entry, as in the example above. Retrieve your root Entity with GET /v2/entities?is_root=true.
Percentages are expressed in basis points. 10000 = 100%, 1000 = 10%, 1 = 0.01%. To assign 90%, send 9000.
The response echoes the split array as you sent it, along with the redirect_url of the payment page. Send the customer there to complete the payment.

Step 4: Handle post-payment events

checkout_session.finished and payment_intent.succeeded include a split_applied array with the amount resolved for each recipient.
checkout_session.finished can arrive before the payment has reached a final state. Mark the order as paid only when data.payment_resource.payment_intent.status is succeeded.
Events to handle:

How and when recipients are paid

Payouts follow your organization’s settlement schedule. In each cycle, Fintoc groups every share owed to the same Entity into one transfer to its settlement account. For example, a recipient that appears in 200 payments during a cycle receives a single transfer. Retrieve a payout with GET /v1/payouts/{id}, list them with GET /v1/payouts, and get the payments it covers with GET /v1/payouts/{id}/resources.
payout.* events fire only in live mode. Payouts settle against real balances, so test mode does not emit payout.created, payout.succeeded, payout.canceled, or payout.returned.

Rules and validations

Fintoc validates the split array when you create a Checkout Session. The request fails with 400 Bad Request and invalid_request_error if any rule is violated. Per entry
  • entity_id must reference an Entity in operational status
  • The Entity’s country_code must match the payment currency
  • For flat, amount must be greater than 0 and less than or equal to the Checkout Session amount.
  • For percentage: 0 < amount <= 10000
Global
  • Between 1 and 10 entries
  • No duplicate entity_id values
  • Every entry must use the same type
  • The sum of all split[].amount values, after converting percentages, must equal the Checkout Session amount exactly.
  • For percentage, the values must add up to exactly 10000 bps
Rounding. Percentage amounts are calculated as floor(amount_total * amount / 10000). The accumulated rounding difference is assigned to the entry with charge_processing_fee: true.

Errors