Skip to main content
For a one-off payment attributed to an existing campaign creator, use Campaign quick pay. The trigger endpoints below send standalone payouts without campaign attribution. All endpoints below require:
  • X-Application-Id
  • X-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 of USD, CAD, GBP, EUR)
  • exactly one of:
    • payoutAmount (positive; max 2 decimals)
    • lineItems (array; each item requires quantity and perItemAmount)
  • requireConfirmation (optional; defaults to true)
  • returnPayoutLink (optional boolean; when true, successful executed payout responses include payout_link)
  • platformFeePayerOverride (optional; one of INHERIT, CREATOR_PAYS_ALL, AGENCY_PAYS_ALL, CUSTOM_SPLIT)
  • platformFeeAgencySharePercent (required when platformFeePayerOverride is CUSTOM_SPLIT; number between 0 and 100)
If you need to override who covers the platform fee for this payout only, send:
Omit 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 includes payout_link when returnPayoutLink is true)

Common errors

  • 400: invalid payload (missing fields, currency not supported, >2 decimals, etc.)
  • 400: insufficient funds (includes sufficient: false, requiredAmount, currency: "USD")
  • 401: missing/invalid SDK headers
  • 403: origin not allowed (when allowlist is configured and Origin is 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 includes payout_link when an item sets returnPayoutLink to true)
If any entry fails in immediate mode, the response success will be false and results will contain both successes and failures.

POST /sdk/v1/payouts/pending

Fetch a single pending payout preview/status by pending_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 plus missing IDs:

GET /sdk/v1/payouts/pending

List pending payouts for the application (table-friendly).

Query parameters

  • page (default 1)
  • limit (default 50, max 100)
  • includeExpired (true|false, default false)
  • includeConfirmed (true|false, default false)

Response

Each row includes expiresInSeconds 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)
If the pending payout is expired: 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 include missing.

GET /sdk/v1/payouts/:payoutId/breakdown

Fetch the saved line items and contract breakdown for a campaign or direct payout using its CCPAY_... ID. The payout must belong to the agency authenticated by your SDK credentials. This includes payouts created in the dashboard, as with GET /sdk/v1/payouts.

Path parameters

  • payoutId (required): the CCPAY_... reference returned by the payout list or trigger endpoint.

Response

  • lineItems preserves the stored item fields, including media IDs, view counts, and per-media breakdowns when available. Item fields vary by payout type and age.
  • lineItemsSource is payout when saved payout items exist, invoice when falling back to invoice items, or none when neither is available. Invoice items can include platform fee adjustments.
  • lineItemsCurrency is the shared output currency recorded on every saved payout item (amountCurrency/amount_currency, outputCurrency/output_currency, or governing-history segments’ output currency). It is null if any item’s output currency is unknown or the currencies differ. Contract, historical, and display currencies can describe amounts before conversion, so they are not used to label the payable amounts. For invoice items, this field is the invoice currency; displayAmount and displayCurrency describe the original amount separately.
  • contractBreakdown contains the captured contract terms (fixed, performance, bonus, and pay-cycle settings) and payment-term components. Current contract edits do not change this response. Older snapshots can contain components with terms: null.
  • contractBreakdown.snapshots preserves all captured contract versions for payouts spanning multiple historical contracts. Each snapshot includes campaign_creator_contract_history_id, line_item_indexes (zero-based indexes of the captured payout items), terms_snapshot, and contract_terms. terms is the primary contract projection; use snapshots for each governing version. Older payouts return an empty array.
  • Direct payouts have campaignId: null and campaignCreatorRecordId: null. Payouts without saved contract details return contractBreakdown: null; missing line items return [].
Historical breakdowns remain available for cancelled payouts and archived or deleted campaigns. A breakdown does not indicate that funds were delivered; use the payout status endpoint to check delivery.

Common errors

  • 400: invalid CCPAY ID (maximum 64 characters).
  • 401: missing or invalid SDK credentials.
  • 404: payout does not exist or belongs to another agency.

POST /sdk/v1/payouts/cancel

Cancel an in-flight payout.

Headers

  • X-Idempotency-Key (required)

Body

Provide either payoutId or payoutReferenceId:

Response

If the payout was already cancelled, the response may include:

GET /sdk/v1/payouts

List agency payouts.

Query parameters

  • page (default 1)
  • limit (default 50, max 100)
  • sortBy (optional)
  • sortOrder (asc|desc, default desc)
  • search (optional)
  • payoutType (optional; currently supports DIRECT)
  • statuses (optional; comma-separated)
  • from and to (optional; ISO timestamps)
If 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): csv or pdf
  • from and to (required): ISO timestamps
  • All filters supported by GET /sdk/v1/payouts (statuses, search, sortBy, sortOrder, …)
  • timeZone (optional; used for PDF rendering)

Responses

  • text/csv with Content-Disposition: attachment; filename="payout-transactions-YYYY-MM-DD.csv"
  • application/pdf with Content-Disposition: attachment; filename="payout-transactions-YYYY-MM-DD.pdf"
If the export would exceed 10,000 rows: 413 with a JSON error.