X-Application-IdX-Api-Key
POST /sdk/v1/payouts/trigger
Create a single payout. Supports immediate execution or returning a pending confirmation token.This endpoint does not calculate campaign contract terms or tiered bonus templates. To configure reusable campaign bonuses, use
/sdk/v1/bonus-templates, apply the returned templateId to a campaign contract, and let Grade calculate eligible bonus line items from tracked campaign media.Headers
X-Idempotency-Key(required)
Body
You must provide:payoutRecipientEmail(required; must be a valid email)payoutCurrency(required; one ofUSD,CAD,GBP,EUR)- exactly one of:
payoutAmount(positive; max 2 decimals)lineItems(array; each item requiresquantityandperItemAmount)
requireConfirmation(optional; defaults totrue)returnPayoutLink(optional boolean; whentrue, successful executed payout responses includepayout_link)platformFeePayerOverride(optional; one ofINHERIT,CREATOR_PAYS_ALL,AGENCY_PAYS_ALL,CUSTOM_SPLIT)platformFeeAgencySharePercent(required whenplatformFeePayerOverrideisCUSTOM_SPLIT; number between0and100)
platformFeePayerOverride, or set it to INHERIT, to use the agency default. The returned preview.platformFee values reflect the effective override.
Set returnPayoutLink to true when you need the payout link in the execution response. Pending trigger responses do not include a link because the payout has not been executed yet; the confirmed payout response includes payout_link if the original trigger requested it. If the link cannot be resolved at response time after a successful payout, payout_link is null.
Response
- If
requireConfirmation: true:201
- If
requireConfirmation: false:200(example includespayout_linkwhenreturnPayoutLinkistrue)
Common errors
400: invalid payload (missing fields, currency not supported, >2 decimals, etc.)400: insufficient funds (includessufficient: false,requiredAmount,currency: "USD")401: missing/invalid SDK headers403: origin not allowed (when allowlist is configured andOriginis present)
POST /sdk/v1/payouts/trigger-bulk
Create up to 100 payouts in one request.Headers
X-Idempotency-Key(required)
Body
payouts must be a non-empty array, max length 100. Each item is the same shape as POST /payouts/trigger.
All items must share the same requireConfirmation value.
Each item can set its own platformFeePayerOverride and platformFeeAgencySharePercent.
Response
- If
requireConfirmation: true:201
- If
requireConfirmation: false:200(example includespayout_linkwhen an item setsreturnPayoutLinktotrue)
success will be false and results will contain both successes and failures.
POST /sdk/v1/payouts/pending
Fetch a single pending payout preview/status bypending_payout_id.
Body
Response
POST /sdk/v1/payouts/pending-bulk
Fetch multiple pending payout previews/statuses.Body
Accepts a string (comma-separated) or an array:Response
Returns found items plusmissing IDs:
GET /sdk/v1/payouts/pending
List pending payouts for the application (table-friendly).Query parameters
page(default1)limit(default50, max100)includeExpired(true|false, defaultfalse)includeConfirmed(true|false, defaultfalse)
Response
Each row includesexpiresInSeconds and expired.
POST /sdk/v1/payouts/confirm
Confirm and execute a pending payout.Headers
X-Idempotency-Key(required)
Body
Response
On success:200 (example includes payout_link when the original trigger set returnPayoutLink to true)
410 { "success": false, "message": "Pending payout has expired." }
POST /sdk/v1/payouts/confirm-bulk
Confirm and execute up to 100 pending payouts.Headers
X-Idempotency-Key(required)
Body
Accepts a string (comma-separated) or an array:Response
success is true only if all confirmations returned status: 200.
POST /sdk/v1/payouts/status
Fetch payout status records for specific payout IDs (up to 100).Body
Accepts multiple aliases; preferred:Response
Results preserve request order for found items and includemissing.
POST /sdk/v1/payouts/cancel
Cancel an in-flight payout.Headers
X-Idempotency-Key(required)
Body
Provide eitherpayoutId or payoutReferenceId:
Response
GET /sdk/v1/payouts
List agency payouts.Query parameters
page(default1)limit(default50, max100)sortBy(optional)sortOrder(asc|desc, defaultdesc)search(optional)payoutType(optional; currently supportsDIRECT)statuses(optional; comma-separated)fromandto(optional; ISO timestamps)
from/to is provided without a timezone offset, it is treated as UTC.
Supported statuses values (invalid values are ignored):
processing, created, delivery_pending, delivery_failed, sent, delivered, claimed, reversed, canceled, expired, failed, pending, completed, flagged, delayed
Response
GET /sdk/v1/payouts/export
Export payouts as CSV or PDF.Query parameters
format(required):csvorpdffromandto(required): ISO timestamps- All filters supported by
GET /sdk/v1/payouts(statuses,search,sortBy,sortOrder, …) timeZone(optional; used for PDF rendering)
Responses
text/csvwithContent-Disposition: attachment; filename="payout-transactions-YYYY-MM-DD.csv"application/pdfwithContent-Disposition: attachment; filename="payout-transactions-YYYY-MM-DD.pdf"
413 with a JSON error.