Skip to content
FractionalPay

Split payment API

The split payment API for platforms

FractionalPay is a split payment API: send one payment, get back every party's share, the balanced ledger entries and the payout date. Rules live in the dashboard or in code, and money stays in your own payment account.

  • Percentage and fixed lines, priorities and a remainder party
  • Idempotent requests, signed webhooks, test and live keys
  • Flat monthly plan, no per-transaction fee from us

POST /v1/splits/simulate

200 OK

curl -X POST https://fractionalpay.com/api/v1/splits/simulate \
  -H "Authorization: Bearer fp_test_4eC39H..." \
  -H "Idempotency-Key: 42d766c9-order" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 100000,
    "currency": "USD",
    "parties": [
      {"role": "Provider", "kind": "percent", "value": 70},
      {
        "role": "Platform",
        "kind": "percent",
        "value": 15,
        "platform": true
      },
      {"role": "Partner", "kind": "percent", "value": 10},
      {"role": "Subcontractor", "kind": "fixed", "value": 5000}
    ],
    "schedule": "weekly"
  }'
{
  "object": "split_simulation",
  "amount": 100000,
  "currency": "USD",
  "refund": 0,
  "schedule": "weekly",
  "hold": false,
  "balanced": true,
  "allocations": [
    {
      "role": "Provider",
      "kind": "percent",
      "value": 70,
      "platform": false,
      "remainder": false,
      "amount": 70000,
      "share_percent": 70,
      "held": 0,
      "refund_reversal": 0,
      "net": 70000,
      "available_now": 70000
    },
    {
      "role": "Platform",
      "kind": "percent",
      "value": 15,
      "platform": true,
      "remainder": true,
      "amount": 15000,
      "share_percent": 15,
      "held": 0,
      "refund_reversal": 0,
      "net": 15000,
      "available_now": 15000
    },
    {
      "role": "Partner",
      "kind": "percent",
      "value": 10,
      "platform": false,
      "remainder": false,
      "amount": 10000,
      "share_percent": 10,
      "held": 0,
      "refund_reversal": 0,
      "net": 10000,
      "available_now": 10000
    },
    {
      "role": "Subcontractor",
      "kind": "fixed",
      "value": 5000,
      "platform": false,
      "remainder": false,
      "amount": 5000,
      "share_percent": 5,
      "held": 0,
      "refund_reversal": 0,
      "net": 5000,
      "available_now": 5000
    }
  ],
  "payouts": [
    {
      "date": "2026-10-23",
      "party": "Provider",
      "amount": 70000,
      "note": "Scheduled payout"
    },
    {
      "date": "2026-10-23",
      "party": "Partner",
      "amount": 10000,
      "note": "Scheduled payout"
    },
    {
      "date": "2026-10-23",
      "party": "Subcontractor",
      "amount": 5000,
      "note": "Scheduled payout"
    }
  ]
}

How the API works

One payment in, every share out

Your checkout stays where it is. Payments arrive from the platform account you connect at your payment operator, or you record them with POST /payments. FractionalPay matches a rule, writes the split and tells you what happened. You never move funds through us, because we never hold them.

  1. 01

    Create beneficiaries

    Sellers, partners, affiliates or subcontractors, each linked to its connected account id at your operator.

  2. 02

    Define a rule

    Percent and fixed lines, a priority, a match on product or metadata, and the party that receives the remainder.

  3. 03

    Payment succeeds

    The split runs once per payment. The allocations and a ledger transaction that balances to zero are written in the same step.

  4. 04

    Payouts and webhooks

    Shares become available, move into payouts on your schedule and every change fires a signed event.

Worked example

A 1,000 USD payment split four ways

A customer pays 1,000.00 USD for a service. The provider earns 70 percent, the platform keeps 15 percent, the referring partner gets 10 percent and a subcontractor is owed a fixed 50.00 USD. Fixed lines are applied first, then percentages of the gross amount, and the sum of all shares always equals the payment.

  • Provider

    Rule
    70%
    Share
    $700.00
  • Platform

    Rule
    15%
    Share
    $150.00
  • Partner

    Rule
    10%
    Share
    $100.00
  • Subcontractor

    Rule
    Fixed $50.00
    Share
    $50.00
  • Total

    Rule
    Share
    $1,000.00

When percentages do not divide evenly, for example 33.33 percent of 100.00 USD, FractionalPay rounds with the largest remainder method and sends the leftover cent to the remainder party you chose. Nobody gets a fraction of a cent and the ledger never drifts. You can run the same numbers in the split simulator without an account.

Ledger journal

Balanced

txn_4Q8M2R ·Split of order-1000 by rule v3

  • Operator balance (your account) Dr$1,000.00
  • Payable to Provider Cr$700.00
  • Platform revenue Cr$150.00
  • Payable to Partner Cr$100.00
  • Payable to Subcontractor Cr$50.00

TotalDr $1,000.00 · Cr $1,000.00

Build or buy

What a split payment API saves your engineers

Dividing a number by four is the easy part. The work is everything around it: the parts finance asks about months later, when a refund lands on an order that was already paid out.

FractionalPay ships all six behind one API and a dashboard your finance team can use without opening a ticket. If you only need the raw ledger and payout calls, start with the payouts API; if reconciliation is the pain, read about payment reconciliation software.

  1. 1

    Double-entry ledger

    Append-only entries, accounts per beneficiary, every transaction balancing to zero, balances you can rebuild at any date.

  2. 2

    Idempotency

    Operator events arrive twice and retries happen. Every write needs a key so one payment never becomes two splits.

  3. 3

    Rounding and remainders

    Percentages of odd amounts, mixed fixed and percent lines, currencies with different minor units, and a rule for the leftover cent.

  4. 4

    Refunds and disputes

    Reversing a split proportionally, carrying negative balances into the next payout and keeping the history readable.

  5. 5

    Payout scheduling

    Availability dates, holds, minimum thresholds, approvals and a retry path for failed transfers.

  6. 6

    Reconciliation

    Matching your ledger to the operator's balance transactions every day and flagging what does not match.

For developers

Predictable endpoints and signed events

Amounts are integers in minor units with a three-letter currency. Every POST accepts an Idempotency-Key, and the same key with the same body returns the first result for 24 hours. Test keys start with fp_test_ and work in the sandbox; live keys start with fp_live_.

Each split fires split.created. Refunds fire split.reversed, payouts fire payout.scheduled, payout.paid or payout.failed. Deliveries are signed with HMAC SHA-256 and retried with backoff for 24 hours.

  • Record a payment and split it with POST /payments
  • Reverse part of it with POST /payments/{id}/refunds
  • Read balances per beneficiary with GET /balances

POST /v1/payments

201 Created

curl -X POST https://fractionalpay.com/api/v1/payments \
  -H "Authorization: Bearer fp_test_4eC39H..." \
  -H "Idempotency-Key: adcbad10-order" \
  -H "Content-Type: application/json" \
  -d '{
    "external_id": "order_48213",
    "amount": 100000,
    "currency": "USD",
    "product_ref": "service"
  }'
{
  "id": 48213,
  "object": "payment",
  "external_id": "order_48213",
  "amount": 100000,
  "currency": "USD",
  "fee": 0,
  "net": 100000,
  "customer_ref": null,
  "product_ref": "service",
  "metadata": {},
  "livemode": false,
  "status": "succeeded",
  "occurred_at": 1792062776,
  "created": 1792062776,
  "split": {
    "id": 48213,
    "object": "split",
    "status": "calculated",
    "rule_id": 3,
    "rule_version": 3,
    "gross": 100000,
    "currency": "USD",
    "queued_reason": null,
    "calculated_at": 1792062776,
    "allocations": [
      {
        "id": 7101,
        "beneficiary_id": 41,
        "role_key": null,
        "amount": 70000,
        "currency": "USD",
        "held_amount": 0,
        "held_until": null,
        "status": "available",
        "payout_id": null
      },
      {
        "id": 7102,
        "beneficiary_id": 42,
        "role_key": null,
        "amount": 10000,
        "currency": "USD",
        "held_amount": 0,
        "held_until": null,
        "status": "available",
        "payout_id": null
      },
      {
        "id": 7103,
        "beneficiary_id": 43,
        "role_key": null,
        "amount": 5000,
        "currency": "USD",
        "held_amount": 0,
        "held_until": null,
        "status": "available",
        "payout_id": null
      },
      {
        "id": 7104,
        "beneficiary_id": null,
        "role_key": "platform",
        "amount": 15000,
        "currency": "USD",
        "held_amount": 0,
        "held_until": null,
        "status": "available",
        "payout_id": null
      }
    ]
  },
  "refunds": []
}

Webhook delivery · split.created

200 delivered

POST https://api.yourplatform.com/hooks/fractionalpay

FractionalPay-Signature: t=1760534400,v1=5257a869e7ec...

{
  "id": "evt_7c92f0e38760fc81336796a2",
  "type": "split.created",
  "created": 1760534400,
  "livemode": false,
  "data": {
    "split": {
      "id": 48213,
      "object": "split",
      "status": "calculated",
      "rule_id": 3,
      "rule_version": 3,
      "gross": 100000,
      "currency": "USD",
      "queued_reason": null,
      "calculated_at": 1792062776,
      "allocations": [
        {
          "id": 7101,
          "beneficiary_id": 41,
          "role_key": null,
          "amount": 70000,
          "currency": "USD",
          "held_amount": 0,
          "held_until": null,
          "status": "available",
          "payout_id": null
        },
        {
          "id": 7102,
          "beneficiary_id": 42,
          "role_key": null,
          "amount": 10000,
          "currency": "USD",
          "held_amount": 0,
          "held_until": null,
          "status": "available",
          "payout_id": null
        },
        {
          "id": 7103,
          "beneficiary_id": 43,
          "role_key": null,
          "amount": 5000,
          "currency": "USD",
          "held_amount": 0,
          "held_until": null,
          "status": "available",
          "payout_id": null
        },
        {
          "id": 7104,
          "beneficiary_id": null,
          "role_key": "platform",
          "amount": 15000,
          "currency": "USD",
          "held_amount": 0,
          "held_until": null,
          "status": "available",
          "payout_id": null
        }
      ]
    },
    "payment_id": 48213,
    "external_id": "order_48213"
  }
}

Split payment software

What every plan includes

The API and the dashboard are the same product. Engineers call endpoints, finance edits rules and approves payouts in the browser, and both see one ledger.

Each feature is included from the plan shown and in every plan above it. Compare plans.

  • Percentage and fixed rules

    Starter+

    Priorities, product and metadata matching, caps and a remainder party.

  • Proportional refunds

    Starter+

    Refunds and chargebacks reversed across every share automatically.

  • Payout schedules

    Starter+

    Daily, weekly or monthly payouts with a minimum amount per beneficiary.

  • Recurring splits

    Growth+

    Subscription renewals split again on every invoice, with time-limited partner lines.

  • Holds and reserves

    Growth+

    Keep a percentage back until a return window or delivery date passes.

  • Multiple entities

    Scale

    Several connected accounts and currencies with a ledger per entity.

Split rule

Version 3 · Active

Rule name

Services, default

Applies to

Product is service

  1. 1 Provider 70%
  2. 2 Partner 10%
  3. 3 Subcontractor $50.00
Remainder and rounding go to Platform Test on $1,000.00 passes

Who builds with it

Made for the team that owns the money flow

A lead engineer usually starts with the sandbox and a test key on day one. Finance joins when the first rule goes live, because the ledger and the payout calendar answer the question they ask every Monday: how much do we owe whom right now.

Marketplaces use the same API to pay sellers, as described on our marketplace payments page, and subscription businesses use it for revenue sharing with resellers.

Questions

Frequently asked questions

Something else on your mind? Write to [email protected] or read the API documentation.

Does FractionalPay hold or move our money?
No. Payments land in your own platform account at your payment operator. FractionalPay calculates the split, keeps the ledger and sends payout instructions to that account. We never hold, pool or transmit funds and we are not a payment institution.
Which payment operator does the split payment API work with?
You connect your own Stripe Connect platform account today. Payments, refunds and disputes are mirrored from it automatically. More operators are listed on the integrations section of the docs.
How are refunds handled after a split?
A refund is reversed in proportion to each share by default, or platform first if your rule says so. If a beneficiary was already paid, the negative amount is carried into their next payout and recorded in the ledger.
Can we test without live money?
Yes. The sandbox works with fp_test_ keys and demo data. POST /splits/simulate returns allocations, ledger lines and payouts without saving anything.
Is there a per-transaction fee?
No. Each plan has a monthly split flow limit (100,000, 1,000,000 or 10,000,000 USD) and a flat price. Your operator's own fees stay as they are. See pricing.
What are the API rate limits?
Up to 100 requests per second per key. Monthly request quotas are 50,000 on Starter, 500,000 on Growth and 5,000,000 on Scale, and you see the meter in the dashboard.

Run your own split through the API

Start with the simulator on the homepage, then create a sandbox key and send the same request from your terminal.

No transaction fees from us. Runs on your own payment account at a licensed operator. FractionalPay never holds your funds.