Get started

Developers

Build splits and payouts
in an afternoon

One REST API for the whole money flow: create a payment, split it across sellers, onboard connected accounts and pay them out same-day. Idempotent, signed webhooks, and SDKs in the language you already ship.

Quickstart

One call to charge and split

Send a single request describing the charge and how it should be divided. Pabopay captures the buyer's payment, books each seller's share and your platform fee on the ledger, and returns the splits ready for payout.

  • Authenticate with a secret key over HTTPS — no SDK required
  • Pass an Idempotency-Key so retries never double-charge
  • Describe splits by percentage, fixed amount or per line item
  • Get a webhook the moment funds are captured and settled
See webhook events
create-payment.sh
curl https://api.pabopay.com/v1/payments \
  -H "Authorization: Bearer sk_live_2f9a..." \
  -H "Idempotency-Key: pay_80432" \
  -d amount=100000 \
  -d currency=eur \
  -d source=tok_visa \
  -d "splits[0][account]=acct_atelier_mora" \
  -d "splits[0][amount]=61200" \
  -d "splits[1][account]=acct_loomwork" \
  -d "splits[1][amount]=32700" \
  -d "fee_amount=6100"

# 200 OK
# { "id": "pay_80432", "status": "captured",
#   "amount": 100000, "currency": "eur",
#   "splits": [ … ], "balanced": true }
create-payment.js
import Pabopay from "pabopay";
const pabo = new Pabopay(process.env.PABO_SECRET_KEY);

const payment = await pabo.payments.create(
  {
    amount: 100000,        // €1,000.00 in cents
    currency: "eur",
    source: "tok_visa",
    splits: [
      { account: "acct_atelier_mora", amount: 61200 },
      { account: "acct_loomwork",    amount: 32700 }
    ],
    fee_amount: 6100          // your platform fee
  },
  { idempotencyKey: "pay_80432" }
);

console.log(payment.status); // "captured"
create_payment.py
import pabopay
pabo = pabopay.Client(api_key="sk_live_2f9a...")

payment = pabo.payments.create(
    amount=100000,            # €1,000.00 in cents
    currency="eur",
    source="tok_visa",
    splits=[
        {"account": "acct_atelier_mora", "amount": 61200},
        {"account": "acct_loomwork",    "amount": 32700},
    ],
    fee_amount=6100,            # your platform fee
    idempotency_key="pay_80432",
)

print(payment.status)        # "captured"

API reference

Six resource groups, one ledger

Every endpoint is REST over HTTPS, returns JSON, and accepts an idempotency key. Resources reference each other by id so a payment, its splits and the resulting payouts always reconcile.

POST /v1/payments

Payments

Create, capture, refund and retrieve buyer payments. Attach a splits array to divide funds at capture, or capture first and split later once an order ships.

POST /v1/splits

Splits

Define how a payment is divided across sellers and your platform fee — by percentage, fixed amount or per line item. Splits are atomic: they balance to the cent or they don't apply.

POST /v1/accounts

Connected accounts

Onboard sellers as connected accounts, kick off embedded KYC, and check verification status. Returns a hosted onboarding link and a clean verified / pending / rejected state.

POST /v1/payouts

Payouts

Move a seller's balance to their bank, card or wallet in 58 currencies. Choose instant where the rail supports it, or schedule daily runs — FX is applied at interbank rates.

GET /v1/balances

Balances

Read available and pending balances per connected account, transfer between wallets, top up and place reserves — all backed by a real double-entry ledger with full history.

POST /v1/webhook_endpoints

Webhooks

Register endpoints, choose the events you care about and verify the signature on every delivery. Pabopay retries with exponential backoff until you return a 2xx.

Webhooks

Know the moment money moves

Subscribe to the lifecycle of every payment, account and payout. Each event is signed with your endpoint secret and delivered at least once, with automatic retries for up to three days.

  • payment.captured — a buyer's payment cleared and is ready to split
  • split.settled — each seller's share is booked on the ledger
  • account.verified — a seller passed KYC and can receive funds
  • payout.paid — funds landed in a seller's bank, card or wallet
  • payout.failed — a payout bounced and was queued for retry
  • reserve.released — a risk hold expired and funds freed up
payout.paid · event payload
{
  "id": "evt_9b2f71c4a0",
  "type": "payout.paid",
  "created": 1771072800,
  "data": {
    "object": {
      "id": "po_4Kd02Lm",
      "account": "acct_atelier_mora",
      "amount": 61200,
      "currency": "eur",
      "rail": "sepa_instant",
      "status": "paid",
      "arrival": "instant",
      "source_payment": "pay_80432"
    }
  }
}

# Verify: Pabopay-Signature header
# t=1771072800,v1=4f8d…  (HMAC-SHA256)

SDKs

Official libraries for every stack

Typed, versioned and idempotent by default. Install from your usual package manager and you're making test payments in minutes.

Node.jsStable

npm install pabopay

PythonStable

pip install pabopay

RubyStable

gem install pabopay

PHPStable

composer require pabopay/pabopay-php

GoStable

go get github.com/pabopay/pabopay-go

JavaBeta

com.pabopay:pabopay-java

REST
JSON over HTTPS, predictable resource URLs
0
Measured API uptime, last 12 months
Idempotent
Safe retries on every write endpoint
0SDKs
Official libraries, plus a typed OpenAPI spec

Grab a test key and ship a split today

Sandbox keys are free and unmetered. Create a payment, split it across test sellers and watch the payouts land — no contract, no sales call.