3. On-ramp: fund the account

Send funds to the account

Share the deposit instruction that matches the rail your customer will use, and have them quote the memo on the transfer so the credit is matched to the account. Funds must be sent by the account holder.

Inbound credits are observed, not initiated: POST /v1/payments/deposits returns 422 OPERATION_NOT_SUPPORTED on this corridor.

Watch for the credit

List transactions for the account and filter on deposits.

GET /v1/payments/transactions?account_id={account_id}&type=DEPOSIT

curl "https://api-staging.checker.finance/v1/payments/transactions?account_id=acc_01ARZ3NDEKTSV4RRFFQ69G5USD&type=DEPOSIT" \
  -H "X-Api-Key: $API_KEY" \
  -H "X-Timestamp: $TIMESTAMP" \
  -H "X-Nonce: $(uuidgen)" \
  -H "X-Signature: $SIGNATURE"

Then retrieve the deposit itself.

GET /v1/payments/deposits/{deposit_id}

Response — 200 OK:

{
  "deposit_id": "dep_01ARZ3NDEKTSV4RRFFQ69G5FAV",
  "account_id": "acc_01ARZ3NDEKTSV4RRFFQ69G5USD",
  "amount": "1000.00",
  "fee_amount": "10.00",
  "status": "COMPLETED",
  "source": {
    "name": "Wholesale Buyer Co",
    "reference": "PO-8842",
    "rail": "ACH"
  },
  "created_at": "2026-09-23T15:00:00Z",
  "updated_at": "2026-09-23T15:05:12Z"
}

Confirm the balance once the deposit is COMPLETED.

GET /v1/payments/accounts/{account_id}/balance

{
  "total": "990.00",
  "available": "990.00",
  "currency": "USD",
  "last_updated_at": "2026-09-23T15:05:12Z"
}

available is the spendable balance after pending holds; total is the balance before them.

Convert into a stablecoin (for on-chain payouts)

Skip this if you are paying out in USD. To pay a wallet, convert the USD balance into the stablecoin first: request a quote, execute it, and wait for settlement.

POST /v1/payments/quotes

curl -X POST https://api-staging.checker.finance/v1/payments/quotes \
  -H "X-Api-Key: $API_KEY" \
  -H "X-Timestamp: $TIMESTAMP" \
  -H "X-Nonce: $(uuidgen)" \
  -H "X-Signature: $SIGNATURE" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "source_currency": "USD",
    "target_currency": "USDT",
    "target_amount": "100.00",
    "customer_id": "cus_01ARZ3NDEKTSV4RRFFQ69G5FAV"
  }'

Each customer has its own USD account, so customer_id is required: without it the quote is rejected with VALIDATION_ERROR. The conversion then debits and credits that customer's accounts.

POST /v1/payments/conversions

curl -X POST https://api-staging.checker.finance/v1/payments/conversions \
  -H "X-Api-Key: $API_KEY" \
  -H "X-Timestamp: $TIMESTAMP" \
  -H "X-Nonce: $(uuidgen)" \
  -H "X-Signature: $SIGNATURE" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{ "quote_id": "qte_01ARZ3NDEKTSV4RRFFQ69G5FAV" }'

Response — 201 Created:

{
  "conversion_id": "con_01ARZ3NDEKTSV4RRFFQ69G5FAV",
  "quote_id": "qte_01ARZ3NDEKTSV4RRFFQ69G5FAV",
  "provider": "provider-a",
  "source_currency": "USD",
  "target_currency": "USDT",
  "source_amount": "100.05",
  "target_amount": "100.00",
  "fee_amount": "0.100000",
  "fee_currency": "USDT",
  "status": "PENDING",
  "created_at": "2026-09-23T15:06:00Z",
  "updated_at": "2026-09-23T15:06:00Z"
}

Poll GET /v1/payments/conversions/{conversion_id} until COMPLETED before paying the balance out.

Notes:

  • fee_amount / fee_currency report the conversion fee once the provider reports one. The fee is already reflected in source_amount / target_amount, so do not deduct it again. Both fields are omitted when no fee applies.

  • Quote and conversion are two calls but one window. Execute promptly; QUOTE_EXPIRED is a normal outcome — request a fresh quote and retry.

  • Settled on-chain balances are full precision and can sit a fraction below the quoted target_amount. Read the wallet balance rather than relying on the quoted amount, and leave headroom for the payout fee: the withdrawal fee is debited on top of the withdrawal amount (see Send a payout).



Did this page help you?