Compose Finance
Withdrawals

Create customer withdrawal

Creates a withdrawal to the customer's registered bank account. **Prerequisites** API withdrawals must be enabled for your organization. If not enabled, this endpoint returns `403 Forbidden`. Contact support to enable API withdrawals. **Execution Modes** 1. **Automatic Execution** (`PROCESSING`) — Withdrawal executes immediately when: - Sufficient available allowance - Sufficient USDC balance in wallet 2. **Manual Approval** (`PROPOSED`) — Transaction created for dashboard approval when: - Withdrawal exceeds available allowance - Insufficient USDC balance in wallet (user can deposit funds before signing) - Automatic execution fails (transaction converted to manual approval) **Amount Specification** Specify the withdrawal amount using one of: - `sourceAmount`: Amount in USDC to withdraw - `targetAmount`: Amount to receive in the bank's currency The target currency is automatically determined by the withdrawal bank's configured currency. **Idempotency** Use the `idempotencyKey` to safely retry requests. Duplicate requests with the same key return the original transaction without creating a new one.

POST
/api/v2/customers/{customerId}/withdrawal

Creates a withdrawal to the customer's registered bank account.

Prerequisites

API withdrawals must be enabled for your organization. If not enabled, this endpoint returns 403 Forbidden. Contact support to enable API withdrawals.

Execution Modes

  1. Automatic Execution (PROCESSING) — Withdrawal executes immediately when:

    • Sufficient available allowance
    • Sufficient USDC balance in wallet
  2. Manual Approval (PROPOSED) — Transaction created for dashboard approval when:

    • Withdrawal exceeds available allowance
    • Insufficient USDC balance in wallet (user can deposit funds before signing)
    • Automatic execution fails (transaction converted to manual approval)

Amount Specification

Specify the withdrawal amount using one of:

  • sourceAmount: Amount in USDC to withdraw
  • targetAmount: Amount to receive in the bank's currency

The target currency is automatically determined by the withdrawal bank's configured currency.

Idempotency

Use the idempotencyKey to safely retry requests. Duplicate requests with the same key return the original transaction without creating a new one.

Authorization

bearerAuth
AuthorizationBearer <token>

Organization API key obtained from PropelAuth

In: header

Path Parameters

customerId*string

Unique identifier of the customer

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST 'https://compose.finance/api/v2/customers/{customerId}/withdrawal' \  -H 'Authorization: Bearer YOUR_API_KEY' \  -H 'Content-Type: application/json' \  -d '{    "withdrawalBankId": "bank_123abc",    "idempotencyKey": "550e8400-e29b-41d4-a716-446655440001",    "targetAmount": "850"  }'

{
  "id": "txn_abc123",
  "type": "WITHDRAWAL",
  "status": "PROCESSING",
  "requiresUiAction": false,
  "createdAt": "2024-01-15T10:30:00.000Z",
  "completedAt": null,
  "reference": "txn_abc123",
  "sourceCurrency": "USDC",
  "targetCurrency": "EUR",
  "sourceAmount": "1000",
  "targetAmount": "865.50",
  "exchangeRate": "0.865",
  "fee": "2.5",
  "withdrawalBank": {
    "id": "bank_123abc",
    "beneficiaryName": "JOHN DOE",
    "iban": "DE89370400440532013000"
  },
  "walletAddress": null,
  "developerFee": null,
  "txHash": null
}

{
  "error": "Provide either 'sourceAmount' (USDC) or 'targetAmount' (amount in bank currency)"
}

{
  "error": "Unauthorized - Invalid or missing API key or session"
}

{
  "error": "API withdrawals are not enabled for this organization"
}

{
  "error": "Customer not found"
}

{
  "error": "Failed to execute withdrawal"
}