Staging
split.pay

API reference

Everything your servers need to create split payments, read their results and receive webhooks.

split.pay API · v0.1.0 · OpenAPI 3.1

Download OpenAPI (JSON)

Getting started

API keys and modes

Create keys in the merchant dashboard, under Developers. Keys starting with sp_test_ only see test data and move no real money; sp_live_ keys work on live data. The key decides the mode, so requests carry no mode parameter. A key is shown once: keep it on your server only.

Authentication

Send the key as a Bearer token: Authorization: Bearer sp_test_… Each key has scopes, and each endpoint below names the scope it needs; a key without it gets 403 insufficient_scope.

Idempotency

Endpoints marked Idempotency-Key require that header (8 to 255 characters from letters, digits and . _ : -). Repeating a request with the same key returns the first response with the header Idempotent-Replayed: true; the same key with a different request is refused with 409 idempotency_key_reused.

Pagination

Lists return data and next_cursor. Pass next_cursor as cursor to get the next page; limit is 1 to 100.

Buyer fee and who pays it

The first share (position 1) pays no processing fee; every other share adds the per-currency fixed fee from GET /v1/processing-fees. Example: USD 100.00 split in 4 means share #1 pays 25.00, shares #2 to #4 pay 25.30 each, and the payers pay 100.90 in total. The total the payers pay is amount + fee × (participants − 1). List the buyer (the person checking out) first so they get the free share. If the processor’s actual fixed fee is higher, you bear the difference.

Errors

Errors are JSON: { "error": { "type", "code", "message", "request_id", "details" } }. Use the HTTP status and the code, never the message, in your code. Quote request_id when you contact support.

Rate limits

600 requests per minute for each API key, and 3000 per minute for each IP address. Past the limit you get 429 rate_limited; wait for the number of seconds in the Retry-After header.

Webhooks and signatures

Create an endpoint with POST /v1/webhook-endpoints and keep its signing secret. Every delivery carries the Splitpay-Signature header: t=<unix seconds>,v1=<hex HMAC-SHA256 of "t.body" with the secret>, computed over the raw request body. Reject a request when no v1 matches or when t differs from your clock by more than 5 minutes. Delivery is at least once: deduplicate on the event id.

Catching up after downtime

GET /v1/events returns the same envelopes your endpoint received. After downtime, list the events created since you went offline (created_from) and skip the ids you already handled. Events are kept for 90 days.

Checkout SDK

The Checkout SDK opens the payment page in a popup over your site, so the customer does not leave it. Load the script from the split.pay payment page origin and pass the payment_url of a new session to SplitPay.open. The script has no dependencies, sets no cookies and tracks nothing.

<script src="https://pay.example.com/sdk/v1/splitpay.js"></script>
<script>
  // payment_url comes from POST /v1/split-sessions, created on your server.
  const checkout = SplitPay.open(paymentUrl, {
    onEvent: ({ type, state }) => {
      if (type === 'session_paid') showOrderStatus(); // a hint: your server confirms
    },
    onClose: ({ reason }) => showOrderStatus(), // reason: 'closed' | 'blocked'
    fallback: 'redirect', // or 'none'
  });
  // checkout.close(), checkout.focus(), checkout.closed
</script>

onEvent receives { type, state } (state is the public session state). The types:

  • share_authorized — The customer authorized their share.
  • session_authorized — Every share is authorized.
  • session_paid — The session is paid.
  • session_cancelled — The session was cancelled.
  • session_expired — The session expired.
  • return — The customer pressed the back-to-merchant button, just before leaving.
  • cancel — The customer pressed Cancel, just before leaving.

If the browser blocks the popup, the tab is redirected to the payment page (fallback "redirect", the default). With fallback "none", onClose is called with reason "blocked" so you can show a button instead. onClose is also called, once, when the window is closed. SplitPay.open throws a TypeError for a URL that is not on the origin of the script. Messages are sent only when the session has a return_url or cancel_url, and only to the origin of that URL.

These events are hints for your page only. Always confirm the outcome on your server: read the session with GET /v1/split-sessions/{id}, or rely on webhooks and the events feed.

Endpoints

Split sessions

One bill paid by several people.

POST/v1/split-sessions

Create a split session

Creates a split session and its payment link. Share payment_url with the people who pay.

Scope: split_sessions:write

Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYesMakes the request safe to repeat: the same key returns the first response (header Idempotent-Replayed: true). The same key with a different request is refused with 409 idempotency_key_reused.
Request body
NameTypeRequiredDescription
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
participantsinteger | array<object>No
Fields
NameTypeRequiredDescription
#1array<object>No
Fields
NameTypeRequiredDescription
amountintegerYesmin > 0, max 999999999999
labelstringNomin length 1, max length 60
orderobjectYes
Fields
NameTypeRequiredDescription
referencestringYesmin length 1, max length 100
descriptionstringNomin length 1, max length 200
return_urlstringNomax length 2048
cancel_urlstringNomax length 2048
expires_inintegerNomin 600, max 518400
Response 201
NameTypeRequiredDescription
split_sessionobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
stateenum: created | collecting | all_authorized | capturing | paid | expiring | expired | cancelling | cancelled | capture_partial_failure | compensating | failed_reversedYes
split_modeenum: merchant_defined | payer_definedYes
amountintegerYesmin > 0, max 999999999999
processing_fee_per_shareintegerYesmin 0, max 9007199254740991
total_chargedintegerYesmin 0, max 9007199254740991
currencystringYespattern ^[A-Z]{3}$
orderobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
referencestringYes
descriptionstring | nullYes
participantsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
positionintegerYesmin 1, max 9007199254740991
labelstring | nullYes
amountintegerYesmin > 0, max 999999999999
amount_chargedintegerYesmin > 0, max 999999999999
application_fee_amountintegerYesmin 0, max 9007199254740991
stateenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedYes
amount_refundedintegerYesmin 0, max 9007199254740991
feesobjectYes
Fields
NameTypeRequiredDescription
policy_versionstringYes
application_fee_totalintegerYesmin 0, max 9007199254740991
payment_urlstringYes
expires_atstring (date-time)Yes
created_atstring (date-time)Yes
amount_refundedintegerYesmin 0, max 9007199254740991

GET/v1/split-sessions

List split sessions

Newest first. The key decides the mode.

Scope: split_sessions:read

Parameters
NameInTypeRequiredDescription
limitqueryintegerNomin 1, max 100, default 25
cursorquerystring (uuid)No
statequeryenum: created | collecting | all_authorized | capturing | paid | expiring | expired | cancelling | cancelled | capture_partial_failure | compensating | failed_reversedNo
referencequerystringNomin length 1, max length 100
created_fromquerystring (date-time)No
created_toquerystring (date-time)No
Response 200
NameTypeRequiredDescription
dataarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
stateenum: created | collecting | all_authorized | capturing | paid | expiring | expired | cancelling | cancelled | capture_partial_failure | compensating | failed_reversedYes
split_modeenum: merchant_defined | payer_definedYes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
participant_countintegerYesmin 0, max 9007199254740991
participants_summaryobjectYes
Fields
NameTypeRequiredDescription
countsarray<object>Yes
Fields
NameTypeRequiredDescription
stateenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedYes
countintegerYesmin 1, max 9007199254740991
itemsarray<object>Yes
Fields
NameTypeRequiredDescription
labelstring | nullYes
stateenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedYes
orderobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
referencestringYes
descriptionstring | nullYes
amount_refundedintegerYesmin 0, max 9007199254740991
sourceenum: merchant_api | merchant_dashboardYes
expires_atstring (date-time)Yes
created_atstring (date-time)Yes
next_cursorstring | nullYes

GET/v1/split-sessions/{split_session_id}

Retrieve a split session

Scope: split_sessions:read

Parameters
NameInTypeRequiredDescription
split_session_idpathstring (uuid)Yes
Response 200
NameTypeRequiredDescription
split_sessionobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
stateenum: created | collecting | all_authorized | capturing | paid | expiring | expired | cancelling | cancelled | capture_partial_failure | compensating | failed_reversedYes
split_modeenum: merchant_defined | payer_definedYes
amountintegerYesmin > 0, max 999999999999
processing_fee_per_shareintegerYesmin 0, max 9007199254740991
total_chargedintegerYesmin 0, max 9007199254740991
currencystringYespattern ^[A-Z]{3}$
orderobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
referencestringYes
descriptionstring | nullYes
participantsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
positionintegerYesmin 1, max 9007199254740991
labelstring | nullYes
amountintegerYesmin > 0, max 999999999999
amount_chargedintegerYesmin > 0, max 999999999999
application_fee_amountintegerYesmin 0, max 9007199254740991
stateenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedYes
amount_refundedintegerYesmin 0, max 9007199254740991
feesobjectYes
Fields
NameTypeRequiredDescription
policy_versionstringYes
application_fee_totalintegerYesmin 0, max 9007199254740991
payment_urlstringYes
expires_atstring (date-time)Yes
created_atstring (date-time)Yes
amount_refundedintegerYesmin 0, max 9007199254740991

POST/v1/split-sessions/{split_session_id}/cancel

Cancel a split session

Releases the card holds of a session that is not yet paid.

Scope: split_sessions:write

Parameters
NameInTypeRequiredDescription
split_session_idpathstring (uuid)Yes
Idempotency-KeyheaderstringYesMakes the request safe to repeat: the same key returns the first response (header Idempotent-Replayed: true). The same key with a different request is refused with 409 idempotency_key_reused.
Response 200
NameTypeRequiredDescription
split_sessionobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
stateenum: created | collecting | all_authorized | capturing | paid | expiring | expired | cancelling | cancelled | capture_partial_failure | compensating | failed_reversedYes
split_modeenum: merchant_defined | payer_definedYes
amountintegerYesmin > 0, max 999999999999
processing_fee_per_shareintegerYesmin 0, max 9007199254740991
total_chargedintegerYesmin 0, max 9007199254740991
currencystringYespattern ^[A-Z]{3}$
orderobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
referencestringYes
descriptionstring | nullYes
participantsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
positionintegerYesmin 1, max 9007199254740991
labelstring | nullYes
amountintegerYesmin > 0, max 999999999999
amount_chargedintegerYesmin > 0, max 999999999999
application_fee_amountintegerYesmin 0, max 9007199254740991
stateenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedYes
amount_refundedintegerYesmin 0, max 9007199254740991
feesobjectYes
Fields
NameTypeRequiredDescription
policy_versionstringYes
application_fee_totalintegerYesmin 0, max 9007199254740991
payment_urlstringYes
expires_atstring (date-time)Yes
created_atstring (date-time)Yes
amount_refundedintegerYesmin 0, max 9007199254740991

Refunds

Return money to the participants of a paid order.

POST/v1/orders/{order_id}/refunds

Refund an order

Without an amount, the whole remaining refundable amount is refunded.

Scope: refunds:write

Parameters
NameInTypeRequiredDescription
order_idpathstring (uuid)Yes
Idempotency-KeyheaderstringYesMakes the request safe to repeat: the same key returns the first response (header Idempotent-Replayed: true). The same key with a different request is refused with 409 idempotency_key_reused.
Request body
NameTypeRequiredDescription
amountintegerNomin > 0, max 999999999999
reasonenum: requested_by_customer | duplicate | fraudulent | otherNo
Response 201
NameTypeRequiredDescription
refundobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"refund"Yes
order_idstring (uuid)Yes
split_session_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
reasonenum: requested_by_customer | duplicate | fraudulent | other | nullYes
statusenum: pending | processing | succeeded | partially_succeeded | failedYes
allocationsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
participant_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
statusenum: pending | processing | succeeded | failedYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

GET/v1/refunds/{refund_id}

Retrieve a refund

Scope: refunds:read

Parameters
NameInTypeRequiredDescription
refund_idpathstring (uuid)Yes
Response 200
NameTypeRequiredDescription
refundobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"refund"Yes
order_idstring (uuid)Yes
split_session_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
reasonenum: requested_by_customer | duplicate | fraudulent | other | nullYes
statusenum: pending | processing | succeeded | partially_succeeded | failedYes
allocationsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
participant_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
statusenum: pending | processing | succeeded | failedYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

GET/v1/refunds

List refunds

Newest first. The key decides the mode.

Scope: refunds:read

Parameters
NameInTypeRequiredDescription
limitqueryintegerNomin 1, max 100, default 25
cursorquerystring (uuid)No
statusqueryenum: pending | processing | succeeded | partially_succeeded | failedNo
referencequerystringNomin length 1, max length 100
created_fromquerystring (date-time)No
created_toquerystring (date-time)No
Response 200
NameTypeRequiredDescription
dataarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"refund"Yes
order_idstring (uuid)Yes
split_session_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
reasonenum: requested_by_customer | duplicate | fraudulent | other | nullYes
statusenum: pending | processing | succeeded | partially_succeeded | failedYes
allocationsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
participant_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
statusenum: pending | processing | succeeded | failedYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
settled_amountinteger | nullYes
settled_currencystring | nullYes
next_cursorstring | nullYes

Payments

The individual payments of your split sessions.

GET/v1/payments

List payments

Newest first. The key decides the mode.

Scope: payments:read

Parameters
NameInTypeRequiredDescription
limitqueryintegerNomin 1, max 100, default 25
cursorquerystring (uuid)No
statequeryenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedNo
referencequerystringNomin length 1, max length 100
created_fromquerystring (date-time)No
created_toquerystring (date-time)No
Response 200
NameTypeRequiredDescription
dataarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"payment"Yes
split_session_idstring (uuid)Yes
order_idstring (uuid)Yes
order_referencestringYes
participant_idstring (uuid)Yes
participant_labelstring | nullYes
amountintegerYesmin > 0, max 999999999999
application_fee_amountintegerYesmin 0, max 9007199254740991
currencystringYespattern ^[A-Z]{3}$
presentment_amountinteger | nullYes
presentment_currencystring | nullYes
stateenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedYes
amount_refundedintegerYesmin 0, max 9007199254740991
settled_amountinteger | nullYes
settled_currencystring | nullYes
refunded_settledinteger | nullYes
fees_totalinteger | nullYes
netinteger | nullYes
fees_currencystring | nullYes
gateway_feeinteger | nullYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
next_cursorstring | nullYes

GET/v1/payments/{payment_id}

Retrieve a payment

Scope: payments:read

Parameters
NameInTypeRequiredDescription
payment_idpathstring (uuid)Yes
Response 200
NameTypeRequiredDescription
paymentobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"payment"Yes
split_session_idstring (uuid)Yes
order_idstring (uuid)Yes
order_referencestringYes
participant_idstring (uuid)Yes
participant_labelstring | nullYes
amountintegerYesmin > 0, max 999999999999
application_fee_amountintegerYesmin 0, max 9007199254740991
currencystringYespattern ^[A-Z]{3}$
presentment_amountinteger | nullYes
presentment_currencystring | nullYes
stateenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedYes
amount_refundedintegerYesmin 0, max 9007199254740991
settled_amountinteger | nullYes
settled_currencystring | nullYes
refunded_settledinteger | nullYes
fees_totalinteger | nullYes
netinteger | nullYes
fees_currencystring | nullYes
gateway_feeinteger | nullYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Events

The events behind your webhooks, to catch up after downtime.

GET/v1/events

List events

Each event is the envelope a webhook endpoint received. Use it to catch up after downtime.

Scope: events:read

Parameters
NameInTypeRequiredDescription
limitqueryintegerNomin 1, max 100, default 25
cursorquerystring (uuid)No
typequeryenum: split_session.paid | split_session.failed | split_session.cancelled | split_session.expired | refund.succeeded | refund.partially_succeeded | refund.failed | dispute.created | dispute.updated | dispute.closedNo
created_fromquerystring (date-time)No
created_toquerystring (date-time)No
Response 200
NameTypeRequiredDescription
dataarray<object | object | object>Yes
Fields
NameTypeRequiredDescription
#1objectNo
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"event"Yes
created_atstring (date-time)Yes
livemodebooleanYes
typeenum: split_session.paid | split_session.failed | split_session.cancelled | split_session.expiredYes
dataobjectYes
Fields
NameTypeRequiredDescription
objectobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
stateenum: created | collecting | all_authorized | capturing | paid | expiring | expired | cancelling | cancelled | capture_partial_failure | compensating | failed_reversedYes
split_modeenum: merchant_defined | payer_definedYes
amountintegerYesmin > 0, max 999999999999
processing_fee_per_shareintegerYesmin 0, max 9007199254740991
total_chargedintegerYesmin 0, max 9007199254740991
currencystringYespattern ^[A-Z]{3}$
orderobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
referencestringYes
descriptionstring | nullYes
participantsarray<object>Yes
feesobjectYes
Fields
NameTypeRequiredDescription
policy_versionstringYes
application_fee_totalintegerYesmin 0, max 9007199254740991
payment_urlstringYes
expires_atstring (date-time)Yes
created_atstring (date-time)Yes
amount_refundedintegerYesmin 0, max 9007199254740991
#2objectNo
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"event"Yes
created_atstring (date-time)Yes
livemodebooleanYes
typeenum: refund.succeeded | refund.partially_succeeded | refund.failedYes
dataobjectYes
Fields
NameTypeRequiredDescription
objectobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"refund"Yes
order_idstring (uuid)Yes
split_session_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
reasonenum: requested_by_customer | duplicate | fraudulent | other | nullYes
statusenum: pending | processing | succeeded | partially_succeeded | failedYes
allocationsarray<object>Yes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
#3objectNo
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"event"Yes
created_atstring (date-time)Yes
livemodebooleanYes
typeenum: dispute.created | dispute.updated | dispute.closedYes
dataobjectYes
Fields
NameTypeRequiredDescription
objectobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"dispute"Yes
payment_idstring (uuid) | nullYes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
statusenum: needs_response | under_review | won | lost | closedYes
reasonenum: fraudulent | duplicate | product_not_received | product_unacceptable | credit_not_processed | subscription_canceled | unrecognized | processing_error | generalYes
evidence_due_bystring (date-time) | nullYes
created_atstring (date-time)Yes
next_cursorstring | nullYes

GET/v1/events/{event_id}

Retrieve an event

Scope: events:read

Parameters
NameInTypeRequiredDescription
event_idpathstring (uuid)Yes
Response 200
NameTypeRequiredDescription
#1objectNo
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"event"Yes
created_atstring (date-time)Yes
livemodebooleanYes
typeenum: split_session.paid | split_session.failed | split_session.cancelled | split_session.expiredYes
dataobjectYes
Fields
NameTypeRequiredDescription
objectobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
stateenum: created | collecting | all_authorized | capturing | paid | expiring | expired | cancelling | cancelled | capture_partial_failure | compensating | failed_reversedYes
split_modeenum: merchant_defined | payer_definedYes
amountintegerYesmin > 0, max 999999999999
processing_fee_per_shareintegerYesmin 0, max 9007199254740991
total_chargedintegerYesmin 0, max 9007199254740991
currencystringYespattern ^[A-Z]{3}$
orderobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
referencestringYes
descriptionstring | nullYes
participantsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
positionintegerYesmin 1, max 9007199254740991
labelstring | nullYes
amountintegerYesmin > 0, max 999999999999
amount_chargedintegerYesmin > 0, max 999999999999
application_fee_amountintegerYesmin 0, max 9007199254740991
stateenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedYes
amount_refundedintegerYesmin 0, max 9007199254740991
feesobjectYes
Fields
NameTypeRequiredDescription
policy_versionstringYes
application_fee_totalintegerYesmin 0, max 9007199254740991
payment_urlstringYes
expires_atstring (date-time)Yes
created_atstring (date-time)Yes
amount_refundedintegerYesmin 0, max 9007199254740991
#2objectNo
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"event"Yes
created_atstring (date-time)Yes
livemodebooleanYes
typeenum: refund.succeeded | refund.partially_succeeded | refund.failedYes
dataobjectYes
Fields
NameTypeRequiredDescription
objectobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"refund"Yes
order_idstring (uuid)Yes
split_session_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
reasonenum: requested_by_customer | duplicate | fraudulent | other | nullYes
statusenum: pending | processing | succeeded | partially_succeeded | failedYes
allocationsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
participant_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
statusenum: pending | processing | succeeded | failedYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
#3objectNo
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"event"Yes
created_atstring (date-time)Yes
livemodebooleanYes
typeenum: dispute.created | dispute.updated | dispute.closedYes
dataobjectYes
Fields
NameTypeRequiredDescription
objectobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"dispute"Yes
payment_idstring (uuid) | nullYes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
statusenum: needs_response | under_review | won | lost | closedYes
reasonenum: fraudulent | duplicate | product_not_received | product_unacceptable | credit_not_processed | subscription_canceled | unrecognized | processing_error | generalYes
evidence_due_bystring (date-time) | nullYes
created_atstring (date-time)Yes

Reports

CSV downloads.

GET/v1/reports/payments.csv

Download the payments report

UTF-8 CSV with a header row; at most 25 months per download.

Scope: reports:read

Parameters
NameInTypeRequiredDescription
fromquerystring (date-time)Yes
toquerystring (date-time)Yes
tzquerystringYesmin length 1, max length 64
Response 200

A UTF-8 CSV file.

GET/v1/reports/refunds.csv

Download the refunds report

UTF-8 CSV with a header row; at most 25 months per download.

Scope: reports:read

Parameters
NameInTypeRequiredDescription
fromquerystring (date-time)Yes
toquerystring (date-time)Yes
tzquerystringYesmin length 1, max length 64
Response 200

A UTF-8 CSV file.

GET/v1/reports/split-sessions.csv

Download the split sessions report

UTF-8 CSV with a header row; at most 25 months per download.

Scope: reports:read

Parameters
NameInTypeRequiredDescription
fromquerystring (date-time)Yes
toquerystring (date-time)Yes
tzquerystringYesmin length 1, max length 64
Response 200

A UTF-8 CSV file.

Webhook endpoints

Where split.pay delivers your events.

POST/v1/webhook-endpoints

Create a webhook endpoint

The signing secret is returned only here and when it is rotated.

Scope: webhook_endpoints:write

Request body
NameTypeRequiredDescription
urlstringYesmax length 2048
enabled_eventsarray<any> | array<enum: split_session.paid | split_session.failed | split_session.cancelled | split_session.expired | refund.succeeded | refund.partially_succeeded | refund.failed | dispute.created | dispute.updated | dispute.closed>Yes
descriptionstringNomin length 1, max length 200
Response 201
NameTypeRequiredDescription
webhook_endpointobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"webhook_endpoint"Yes
urlstringYes
enabled_eventsarray<string>Yes
statusenum: enabled | disabledYes
descriptionstring | nullYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
secretstringYes

GET/v1/webhook-endpoints

List webhook endpoints

Scope: webhook_endpoints:read

Response 200
NameTypeRequiredDescription
dataarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"webhook_endpoint"Yes
urlstringYes
enabled_eventsarray<string>Yes
statusenum: enabled | disabledYes
descriptionstring | nullYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
next_cursorstring | nullYes

GET/v1/webhook-endpoints/{webhook_endpoint_id}

Retrieve a webhook endpoint

Scope: webhook_endpoints:read

Parameters
NameInTypeRequiredDescription
webhook_endpoint_idpathstring (uuid)Yes
Response 200
NameTypeRequiredDescription
webhook_endpointobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"webhook_endpoint"Yes
urlstringYes
enabled_eventsarray<string>Yes
statusenum: enabled | disabledYes
descriptionstring | nullYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

PATCH/v1/webhook-endpoints/{webhook_endpoint_id}

Update a webhook endpoint

Scope: webhook_endpoints:write

Parameters
NameInTypeRequiredDescription
webhook_endpoint_idpathstring (uuid)Yes
Request body
NameTypeRequiredDescription
urlstringNomax length 2048
enabled_eventsarray<any> | array<enum: split_session.paid | split_session.failed | split_session.cancelled | split_session.expired | refund.succeeded | refund.partially_succeeded | refund.failed | dispute.created | dispute.updated | dispute.closed>No
statusenum: enabled | disabledNo
descriptionstring | nullNo
Response 200
NameTypeRequiredDescription
webhook_endpointobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"webhook_endpoint"Yes
urlstringYes
enabled_eventsarray<string>Yes
statusenum: enabled | disabledYes
descriptionstring | nullYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

DELETE/v1/webhook-endpoints/{webhook_endpoint_id}

Delete a webhook endpoint

Past deliveries stay available for history.

Scope: webhook_endpoints:write

Parameters
NameInTypeRequiredDescription
webhook_endpoint_idpathstring (uuid)Yes
Response 204

No body.

POST/v1/webhook-endpoints/{webhook_endpoint_id}/rotate-secret

Rotate the signing secret

Returns the new secret once. The previous secret keeps signing for 24 hours, so deliveries made in that window carry two signatures.

Scope: webhook_endpoints:write

Parameters
NameInTypeRequiredDescription
webhook_endpoint_idpathstring (uuid)Yes
Response 200
NameTypeRequiredDescription
webhook_endpointobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"webhook_endpoint"Yes
urlstringYes
enabled_eventsarray<string>Yes
statusenum: enabled | disabledYes
descriptionstring | nullYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
secretstringYes

Reference data

Currencies and split.pay fees.

GET/v1/processing-fees

List the split.pay fee per share

The fixed fee per share, for each currency. Share #1 pays no fee; every other share adds it, so the total the payers pay is amount + fee × (participants − 1).

Scope: split_sessions:read

Response 200
NameTypeRequiredDescription
processing_feesarray<object>Yes
Fields
NameTypeRequiredDescription
currencystringYespattern ^[A-Z]{3}$
processing_fee_per_shareintegerYesmin 0, max 9007199254740991

GET/v1/currencies

List supported currencies

Public: no API key needed.

No API key needed

Response 200
NameTypeRequiredDescription
currenciesarray<object>Yes
Fields
NameTypeRequiredDescription
codestringYespattern ^[A-Z]{3}$
exponentintegerYesmin 0, max 3
processing_fee_per_shareinteger | nullYes

Webhook events

  • split_session.paid — The session was paid in full.
  • split_session.failed — The session failed after authorisation and its payments were reversed.
  • split_session.cancelled — The session was cancelled.
  • split_session.expired — The session expired before everyone paid.
Payload
NameTypeRequiredDescription
idstring (uuid)Yes
object"event"Yes
created_atstring (date-time)Yes
livemodebooleanYes
typeenum: split_session.paid | split_session.failed | split_session.cancelled | split_session.expiredYes
dataobjectYes
Fields
NameTypeRequiredDescription
objectobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
stateenum: created | collecting | all_authorized | capturing | paid | expiring | expired | cancelling | cancelled | capture_partial_failure | compensating | failed_reversedYes
split_modeenum: merchant_defined | payer_definedYes
amountintegerYesmin > 0, max 999999999999
processing_fee_per_shareintegerYesmin 0, max 9007199254740991
total_chargedintegerYesmin 0, max 9007199254740991
currencystringYespattern ^[A-Z]{3}$
orderobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
referencestringYes
descriptionstring | nullYes
participantsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
positionintegerYesmin 1, max 9007199254740991
labelstring | nullYes
amountintegerYesmin > 0, max 999999999999
amount_chargedintegerYesmin > 0, max 999999999999
application_fee_amountintegerYesmin 0, max 9007199254740991
stateenum: created | waiting_for_payment_method | confirming | requires_action | authorized | capturing | captured | cancelling | cancelled | failed | refunding | partially_refunded | refundedYes
amount_refundedintegerYesmin 0, max 9007199254740991
feesobjectYes
Fields
NameTypeRequiredDescription
policy_versionstringYes
application_fee_totalintegerYesmin 0, max 9007199254740991
payment_urlstringYes
expires_atstring (date-time)Yes
created_atstring (date-time)Yes
amount_refundedintegerYesmin 0, max 9007199254740991
  • refund.succeeded — A refund completed.
  • refund.partially_succeeded — A refund completed for some participants only.
  • refund.failed — A refund failed.
Payload
NameTypeRequiredDescription
idstring (uuid)Yes
object"event"Yes
created_atstring (date-time)Yes
livemodebooleanYes
typeenum: refund.succeeded | refund.partially_succeeded | refund.failedYes
dataobjectYes
Fields
NameTypeRequiredDescription
objectobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"refund"Yes
order_idstring (uuid)Yes
split_session_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
reasonenum: requested_by_customer | duplicate | fraudulent | other | nullYes
statusenum: pending | processing | succeeded | partially_succeeded | failedYes
allocationsarray<object>Yes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
participant_idstring (uuid)Yes
amountintegerYesmin > 0, max 999999999999
statusenum: pending | processing | succeeded | failedYes
created_atstring (date-time)Yes
updated_atstring (date-time)Yes
  • dispute.created — A customer opened a dispute.
  • dispute.updated — A dispute changed.
  • dispute.closed — A dispute was closed.
Payload
NameTypeRequiredDescription
idstring (uuid)Yes
object"event"Yes
created_atstring (date-time)Yes
livemodebooleanYes
typeenum: dispute.created | dispute.updated | dispute.closedYes
dataobjectYes
Fields
NameTypeRequiredDescription
objectobjectYes
Fields
NameTypeRequiredDescription
idstring (uuid)Yes
object"dispute"Yes
payment_idstring (uuid) | nullYes
amountintegerYesmin > 0, max 999999999999
currencystringYespattern ^[A-Z]{3}$
statusenum: needs_response | under_review | won | lost | closedYes
reasonenum: fraudulent | duplicate | product_not_received | product_unacceptable | credit_not_processed | subscription_canceled | unrecognized | processing_error | generalYes
evidence_due_bystring (date-time) | nullYes
created_atstring (date-time)Yes