Skip to main content
The Money Management API is in private beta. Requires an approved Platform Partner account.

Overview

The Money Management API gives your platform programmatic control over how funds flow between Pandabase, your merchants, and your platform. You can query balances, place and release holds, initiate transfers between merchant accounts, and trigger on-demand payouts. This API is designed for platforms that need fine-grained financial control beyond the default settlement pipeline.

Merchant balances

Every merchant has two balance components:
BalanceDescription
availableFunds that can be paid out or transferred. This is the merchant’s cleared balance after all holds and pending settlements.
pendingFunds from completed intents that are still in the compliance hold period (T+0 to T+2). These will move to available once the hold clears.

Retrieving a merchant’s balance

GET /v2/platforms/merchants/{merchantId}/balance
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}
Response:
{
  "ok": true,
  "data": {
    "merchantId": "shp_provisioned_xxx",
    "currency": "USD",
    "available": 125000,
    "pending": 34500,
    "held": 0,
    "total": 159500,
    "updatedAt": "2026-03-20T12:00:00.000Z"
  }
}
FieldDescription
availableCleared funds ready for payout or transfer (in cents)
pendingFunds in the settlement pipeline, not yet available (in cents)
heldFunds placed on hold by your platform or by Pandabase (in cents)
totalSum of available + pending + held (in cents)

Listing balances across all merchants

GET /v2/platforms/balances?page=1&limit=50
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}
Response:
{
  "ok": true,
  "data": {
    "items": [
      {
        "merchantId": "shp_xxx",
        "businessName": "Coffee Shop Co",
        "currency": "USD",
        "available": 125000,
        "pending": 34500,
        "held": 0,
        "total": 159500
      },
      {
        "merchantId": "shp_yyy",
        "businessName": "Design Studio",
        "currency": "USD",
        "available": 48200,
        "pending": 12000,
        "held": 5000,
        "total": 65200
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 48,
      "totalPages": 1
    },
    "summary": {
      "totalAvailable": 173200,
      "totalPending": 46500,
      "totalHeld": 5000,
      "grandTotal": 224700
    }
  }
}

Balance holds

Holds let your platform temporarily reserve a portion of a merchant’s available balance. Held funds cannot be paid out or transferred until the hold is released. This is useful for dispute reserves, performance guarantees, or compliance investigations.

Placing a hold

POST /v2/platforms/merchants/{merchantId}/holds
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}
X-Idempotency-Key: hold_abc123

{
  "amount": 5000,
  "reason": "Dispute reserve for pti_xxx",
  "expiresAt": "2026-04-20T00:00:00.000Z",
  "metadata": {
    "disputeId": "dsp_xxx",
    "intentId": "pti_xxx"
  }
}
Response:
{
  "ok": true,
  "data": {
    "holdId": "hld_xxx",
    "merchantId": "shp_provisioned_xxx",
    "amount": 5000,
    "reason": "Dispute reserve for pti_xxx",
    "status": "ACTIVE",
    "expiresAt": "2026-04-20T00:00:00.000Z",
    "createdAt": "2026-03-20T12:00:00.000Z"
  }
}

Hold fields

FieldTypeRequiredDescription
amountintegerYesAmount to hold in cents. Cannot exceed the merchant’s available balance.
reasonstringYesHuman-readable reason for the hold. Max 500 characters.
expiresAtstringNoISO 8601 expiry date. If set, the hold is automatically released at this time. Max 180 days from creation.
metadataobjectNoArbitrary key-value pairs. Max 20 keys.

Releasing a hold

POST /v2/platforms/holds/{holdId}/release
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}

{
  "reason": "Dispute resolved in merchant's favor"
}
Released funds are returned to the merchant’s available balance immediately.

Listing holds

GET /v2/platforms/merchants/{merchantId}/holds?status=ACTIVE
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}

Hold statuses

StatusDescription
ACTIVEHold is in effect. Funds are reserved.
RELEASEDHold was released by the platform or by expiry.
CONSUMEDHold was consumed by a deduction (e.g., dispute loss).

Transfers

Transfer funds between merchant accounts on your platform. This is useful for marketplace scenarios where a single order involves multiple merchants, or for platform-level adjustments and corrections.

Creating a transfer

POST /v2/platforms/transfers
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}
X-Idempotency-Key: transfer_abc123

{
  "from": "shp_xxx",
  "to": "shp_yyy",
  "amount": 10000,
  "description": "Revenue share for order_12345",
  "metadata": {
    "orderId": "order_12345",
    "splitType": "revenue_share"
  }
}
Response:
{
  "ok": true,
  "data": {
    "transferId": "txf_xxx",
    "from": "shp_xxx",
    "to": "shp_yyy",
    "amount": 10000,
    "description": "Revenue share for order_12345",
    "status": "COMPLETED",
    "createdAt": "2026-03-20T12:00:00.000Z"
  }
}

Transfer rules

  • The source merchant must have sufficient available balance
  • Both merchants must be in ACTIVE status
  • Transfers are instant and irreversible
  • There is no fee for inter-merchant transfers
  • Maximum transfer amount is $50,000 per transaction
  • Maximum 100 transfers per merchant per day

Listing transfers

GET /v2/platforms/transfers?merchantId=shp_xxx&from=2026-03-01&to=2026-03-31
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}
The merchantId filter returns transfers where the specified merchant is either the sender or recipient.

On-demand payouts

By default, merchant settlements follow the T+2 schedule. The on-demand payout API lets your platform trigger immediate payouts from a merchant’s available balance to their bank account.

Initiating a payout

POST /v2/platforms/merchants/{merchantId}/payouts
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}
X-Idempotency-Key: payout_abc123

{
  "amount": 50000,
  "description": "On-demand payout requested by merchant",
  "priority": "standard"
}
Response:
{
  "ok": true,
  "data": {
    "payoutId": "mpo_xxx",
    "merchantId": "shp_provisioned_xxx",
    "amount": 50000,
    "description": "On-demand payout requested by merchant",
    "priority": "standard",
    "status": "PROCESSING",
    "bankAccount": {
      "last4": "7890",
      "bankName": "Chase",
      "type": "ACH"
    },
    "estimatedArrival": "2026-03-22T08:00:00.000Z",
    "createdAt": "2026-03-20T12:00:00.000Z"
  }
}

Payout options

FieldTypeRequiredDescription
amountintegerYesAmount in cents. Must be at least $1.00 and cannot exceed the merchant’s available balance.
descriptionstringNoHuman-readable description. Max 500 characters.
prioritystringNostandard (1 to 3 business days) or express (same day, where available). Default: standard.

Priority pricing

PriorityProcessing timeAdditional fee
standard1 to 3 business daysNo additional fee
expressSame business day (if initiated before 14:00 UTC)$2.50 per payout
Express payouts are only available for merchants with bank accounts that support same-day ACH or SEPA Instant. If express is not available for the merchant’s bank, the request falls back to standard processing.

Payout statuses

StatusDescription
PROCESSINGPayout initiated, funds being transferred
COMPLETEDFunds delivered to the merchant’s bank account
FAILEDPayout failed (invalid bank details, bank rejection)
CANCELLEDPayout cancelled before processing completed

Listing merchant payouts

GET /v2/platforms/merchants/{merchantId}/payouts?status=COMPLETED&from=2026-03-01&to=2026-03-31
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}

Balance transactions

Query a detailed ledger of all balance-affecting events for a merchant. This includes intent completions, refunds, disputes, transfers, holds, and payouts.
GET /v2/platforms/merchants/{merchantId}/transactions?page=1&limit=50
Authorization: Platform plt_xxx
X-Platform-Signature: {signature}
Response:
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "btx_001",
        "type": "INTENT_SETTLEMENT",
        "amount": 4184,
        "direction": "credit",
        "balance": 129184,
        "description": "Settlement for pti_xxx",
        "intentId": "pti_xxx",
        "createdAt": "2026-03-20T12:00:00.000Z"
      },
      {
        "id": "btx_002",
        "type": "TRANSFER_OUT",
        "amount": -10000,
        "direction": "debit",
        "balance": 119184,
        "description": "Revenue share for order_12345",
        "transferId": "txf_xxx",
        "createdAt": "2026-03-20T12:05:00.000Z"
      },
      {
        "id": "btx_003",
        "type": "PAYOUT",
        "amount": -50000,
        "direction": "debit",
        "balance": 69184,
        "description": "On-demand payout",
        "payoutId": "mpo_xxx",
        "createdAt": "2026-03-20T12:10:00.000Z"
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 312,
      "totalPages": 7
    }
  }
}

Transaction types

TypeDirectionDescription
INTENT_SETTLEMENTCreditFunds from a completed Platform Intent (net of fees)
REFUNDDebitRefund issued for a Platform Intent
DISPUTE_HOLDDebitFunds held for an active dispute
DISPUTE_REVERSALCreditFunds returned after winning a dispute
TRANSFER_INCreditIncoming transfer from another merchant
TRANSFER_OUTDebitOutgoing transfer to another merchant
HOLD_PLACEDDebitFunds moved to held balance
HOLD_RELEASEDCreditFunds returned from held balance
PAYOUTDebitFunds paid out to the merchant’s bank account
ADJUSTMENTCredit/DebitManual adjustment by Pandabase (corrections, credits)

Query parameters

ParameterTypeDefaultDescription
typestringAllFilter by transaction type
directionstringAllFilter by credit or debit
fromstringStart date (ISO 8601)
tostringEnd date (ISO 8601)
pageinteger1Page number
limitinteger50Items per page (max 100)

Webhooks

EventDescription
BALANCE_UPDATEDMerchant balance changed (any credit or debit)
HOLD_PLACEDA hold was placed on a merchant’s balance
HOLD_RELEASEDA hold was released
HOLD_CONSUMEDA hold was consumed by a deduction
HOLD_EXPIREDA hold expired and was automatically released
TRANSFER_COMPLETEDAn inter-merchant transfer completed
MERCHANT_PAYOUT_PROCESSINGOn-demand merchant payout initiated
MERCHANT_PAYOUT_COMPLETEDOn-demand merchant payout delivered
MERCHANT_PAYOUT_FAILEDOn-demand merchant payout failed

Example webhook payload

{
  "event": "TRANSFER_COMPLETED",
  "platformId": "plt_xxx",
  "timestamp": "2026-03-20T12:00:00.000Z",
  "data": {
    "transferId": "txf_xxx",
    "from": {
      "merchantId": "shp_xxx",
      "newBalance": 119184
    },
    "to": {
      "merchantId": "shp_yyy",
      "newBalance": 58200
    },
    "amount": 10000,
    "description": "Revenue share for order_12345"
  }
}

Error codes

CodeStatusDescription
INSUFFICIENT_BALANCE400The merchant’s available balance is insufficient for this operation
HOLD_NOT_FOUND404No hold found with the given ID
HOLD_ALREADY_RELEASED409The hold has already been released or consumed
HOLD_EXPIRED409The hold has expired and was automatically released
TRANSFER_LIMIT_EXCEEDED400Transfer exceeds the $50,000 per-transaction limit
TRANSFER_DAILY_LIMIT429Merchant has exceeded the 100 transfers per day limit
MERCHANT_NOT_ACTIVE403One or both merchants are not in ACTIVE status
PAYOUT_MINIMUM400Payout amount is below the $1.00 minimum
EXPRESS_NOT_AVAILABLE400Express payout is not supported for this merchant’s bank account
PAYOUT_IN_PROGRESS409A payout is already processing for this merchant