Transfers move USDC from your Videpay merchant balance to external wallets: vendors, contractors, treasury cold storage, or bank-offramp wallets. Register recipients once, grant payout consent from the dashboard or API, then execute single or batch transfers with full webhook lifecycle and inbound transfer detection. Payroll Friday, but automated and on-chain.
Need machine-readable request/response bodies for your AI or codebase? Download this page as plain Markdown.
Every Friday your script lists active recipients, calls POST /transfer/batch with raw USDC amounts for each contractor, and marks invoices paid when transfer.batch.updated shows executed. Failed rows retry via POST /transfer/{id}/retry. Your finance team gets a webhook trail instead of a spreadsheet séance.
Everything in the dashboard maps to the API
Open Dashboard → Transfers. The Recipients panel covers recipient CRUD and status. The Consent panel covers payout token approvals and owner consent signing. Create transfer and Batch transfer forms mirror POST /transfer and POST /transfer/batch, pick USDC, enter 25, same fields your API sends (`token`, `amount`). authorization (PIN, OTP, 2FA) is dashboard-only and is not used with a secret API key. UI and API in sync, no 'works in dashboard, breaks in prod' lore.
Same shape as checkout
Use `token`: `"USDC"` and `amount`: `"25"`: human-readable units, just like checkout `asset` and `amount`. Responses include raw values (`amount.raw`, `grossAmountRaw`) for reconciliation and webhooks.
| Field | Type | Required | Description |
|---|---|---|---|
amount | decimal string | Yes | How much to send in human token units: same as checkout (e.g. `"25"` for 25 USDC, `"10.5"` when decimals allow). Videpay converts to on-chain smallest units using the token decimals. |
token | string | Yes | Payout token symbol for the selected chain: same as checkout (e.g. `"USDC"`). Videpay resolves the on-chain contract address from your business token registry. Must be a supported non-native token on that chain. |
Preview protocol and network fees before executing a payout. The response includes asset.symbol and asset.address so you can confirm the token contract before creating a transfer.
| Field | Type | Required | Description |
|---|---|---|---|
businessId | uuid | No | Target business. Omit when your API key is scoped to one business. |
chain | string | No | Chain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically. |
amount | decimal string | Yes | How much to send in human token units: same as checkout (e.g. `"25"` for 25 USDC, `"10.5"` when decimals allow). Videpay converts to on-chain smallest units using the token decimals. |
token | string | Yes | Payout token symbol for the selected chain: same as checkout (e.g. `"USDC"`). Videpay resolves the on-chain contract address from your business token registry. Must be a supported non-native token on that chain. |
/transfer/quote-feePreview fee, net, and applied bps for a raw transfer amount.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{02 "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03 "chain": "base",04 "token": "USDC",05 "amount": "1"06}Before consent or transfers, verify whether the merchant wallet has sufficient ERC-20 allowance for the payout token. The dashboard consent panel runs this automatically; use the API when building custom onboarding.
| Field | Type | Required | Description |
|---|---|---|---|
businessId | uuid | No | Target business. Omit when your API key is scoped to one business. |
chain | string | No | Chain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically. |
amount | decimal string | Yes | How much to send in human token units: same as checkout (e.g. `"25"` for 25 USDC, `"10.5"` when decimals allow). Videpay converts to on-chain smallest units using the token decimals. |
token | string | Yes | Payout token symbol for the selected chain: same as checkout (e.g. `"USDC"`). Videpay resolves the on-chain contract address from your business token registry. Must be a supported non-native token on that chain. |
/transfer/token-approvalCheck allowance and return approval transaction data when allowance is insufficient.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{02 "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03 "chain": "base",04 "token": "USDC",05 "amount": "1"06}/transfer/consent/payout-tokensList registered payout tokens with symbol, name, and on-chain contract address per chain. Use the **symbol** (e.g. USDC) as the **token** field in POST /transfer.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/jsonRegister wallets once and reference them by recipientId on every payout. Recipients can be deactivated without deleting history.
| Field | Type | Required | Description |
|---|---|---|---|
businessId | uuid | No | Target business. Omit when your API key is scoped to one business. |
chain | string | No | Chain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically. |
walletAddress | address | Yes | Destination wallet for outbound transfers. |
recipientType | enum | Yes | wallet or internal. Use wallet for external payouts. |
name | string | Yes | Human-readable label shown in dashboard and API responses. |
recipientId | uuid | No | Optional custom recipient UUID. Videpay generates one when omitted. |
includeInactive | boolean | No | Query param on list. Default false. |
offset / limit | integer | No | Pagination. limit is 1–100, default 20. |
/transfer/recipientsCreate a recipient. Emits transfer.recipient.created.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{02 "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03 "chain": "base",04 "walletAddress": "0xRecipientAddress123456789012345678901234567890",05 "recipientType": "wallet",06 "name": "Acme Vendor"07}/transfer/recipients?limit=20List recipients. Set includeInactive=true for deactivated records.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/recipients/:rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2dRetrieve a single recipient by recipientId.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/recipients/:rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2dUpdate wallet address or name. Emits transfer.recipient.updated.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{02 "name": "Acme Vendor LLC"03}/transfer/recipients/:rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d/deactivateDeactivate a recipient. Emits transfer.recipient.deactivated.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{}/transfer/recipients/:rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d/reactivateReactivate a deactivated recipient. Emits transfer.recipient.reactivated.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{}Before your first outbound transfer on a chain, the merchant owner must sign EIP-712 transfer consent. Complete this from the dashboard (connect owner wallet → Grant consent) or via prepare → sign → complete when automating onboarding.
| Field | Type | Required | Description |
|---|---|---|---|
businessId | uuid | No | Target business. Omit when your API key is scoped to one business. |
chain | string | No | Chain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically. |
approved | boolean | Yes | Set true to grant transfer consent, false to revoke. |
businessId | uuid | No | Target business. Omit when your API key is scoped to one business. |
chain | string | No | Chain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically. |
approved | boolean | Yes | Must match the value used in prepare. |
version | string | Yes | Consent version from prepare response typedData.message.version. |
deadline | integer | Yes | Unix timestamp deadline from typedData.message.deadline. |
approvalSignature | string | Yes | Owner wallet EIP-712 signature over the consent typed data. |
/transfer/consent/preparePrepare consent typed data and optional payout token approvals.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{02 "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03 "chain": "base",04 "approved": true05}/transfer/consentSubmit signed consent. Emits transfer.consent.updated.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{02 "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03 "chain": "base",04 "approved": true,05 "version": "0",06 "deadline": 1735689600,07 "approvalSignature": "0x..."08}Authenticate with your secret API key from server-side code. Do not include `authorization`: that field is for logged-in dashboard sessions only and is ignored for API key requests.
| Field | Type | Required | Description |
|---|---|---|---|
businessId | uuid | No | Target business. Omit when your API key is scoped to one business. |
chain | string | No | Chain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically. |
amount | decimal string | Yes | How much to send in human token units: same as checkout (e.g. `"25"` for 25 USDC, `"10.5"` when decimals allow). Videpay converts to on-chain smallest units using the token decimals. |
token | string | Yes | Payout token symbol for the selected chain: same as checkout (e.g. `"USDC"`). Videpay resolves the on-chain contract address from your business token registry. Must be a supported non-native token on that chain. |
recipientId | uuid | No | Registered recipient from POST /transfer/recipients. Provide recipientId or recipientAddress: at least one required. |
recipientAddress | address | No | One-off payout address when you skip recipient registry. |
reference | string | No | Your reconciliation reference (unique per business when used). |
memo | string | No | Optional memo stored on-chain and echoed in webhooks. |
metadata | object | No | Arbitrary JSON stored on the transfer record. |
ttlSeconds | integer | No | Signature validity window for relayer submission (30–86400, default 300). |
/transferSend USDC to a registered recipient or one-off address. Emits transfer.updated through lifecycle.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{02 "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03 "chain": "base",04 "recipientId": ":rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d",05 "token": "USDC",06 "amount": "1",07 "reference": "payout-001",08 "memo": "Weekly vendor payment"09}/transfer/:trf_5c8d2e1f-9a3b-4c7d-8e6f-1a2b3c4d5e6fGet transfer status, txHash, and amount by transfer id.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/reference/payout-001Lookup transfer by your reference string.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/:trf_5c8d2e1f-9a3b-4c7d-8e6f-1a2b3c4d5e6f/retryRetry a failed transfer submission.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{}/transfer/:trf_5c8d2e1f-9a3b-4c7d-8e6f-1a2b3c4d5e6f/webhook-replayRe-emit transfer.updated for reconciliation or missed deliveries.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{}Submit up to 50 transfers in one on-chain batch with a shared batchReference. Each item carries its own token, amount, and recipient. Omit `authorization`: API key integrations do not use dashboard step-up auth.
| Field | Type | Required | Description |
|---|---|---|---|
businessId | uuid | No | Target business. Omit when your API key is scoped to one business. |
chain | string | No | Chain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically. |
batchReference | string | No | Your batch reconciliation reference. |
transfers | array | Yes | 1–50 transfer items. Each item uses the same fields as a single transfer (token, amount, recipientId or recipientAddress, reference, memo, metadata). |
ttlSeconds | integer | No | Shared TTL for the entire batch (30–86400). |
/transfer/batchExecute multiple transfers atomically. Emits transfer.batch.updated.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{02 "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03 "chain": "base",04 "batchReference": "payroll-week-28",05 "transfers": [06 {07 "recipientId": ":rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d",08 "token": "USDC",09 "amount": "1",10 "memo": "Alice"11 },12 {13 "recipientId": "rcp_bbb...",14 "token": "USDC",15 "amount": "2",16 "memo": "Bob"17 }18 ]19}/transfer/batch/:bat_8e4f1a2b-3c5d-4e6f-7a8b-9c0d1e2f3a4bGet batch status by batch id.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/batch/reference/payroll-week-28Lookup batch by batchReference.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/batch/:bat_8e4f1a2b-3c5d-4e6f-7a8b-9c0d1e2f3a4b/retryRetry failed items in a batch.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{}/transfer/batch/:bat_8e4f1a2b-3c5d-4e6f-7a8b-9c0d1e2f3a4b/webhook-replayRe-emit transfer.batch.updated. Set includeTransfers=true to replay child transfer.updated events.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{02 "includeTransfers": true03}| Field | Type | Required | Description |
|---|---|---|---|
businessId | uuid | No | Target business. Omit when your API key is scoped to one business. |
chain | string | No | Chain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically. |
period | enum | No | Analytics window: 7d, 30d, or 90d (default 30d). |
fromBlock / toBlock | integer | No | Optional block range for history sync. |
/transfer/limitGet per-chain transfer limits and remaining daily capacity.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/history?limit=20Sync on-chain transfer history into Videpay records.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/analytics?period=30dAggregated outbound transfer metrics for 7d, 30d, or 90d.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/jsonWhen external wallets send USDC to your merchant address, Videpay indexes the transfer and emits transfer.received. List and retrieve inbound records for treasury reconciliation.
| Field | Type | Required | Description |
|---|---|---|---|
businessId | uuid | No | Target business. Omit when your API key is scoped to one business. |
chain | string | No | Chain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically. |
/transfer/inbound?limit=20List detected inbound transfers to your merchant.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/inbound/inb_...Retrieve a single inbound transfer.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json/transfer/outbound/:trf_5c8d2e1f-9a3b-4c7d-8e6f-1a2b3c4d5e6f/replay-inboundLink or replay inbound detection for an outbound transfer when debugging reconciliation.
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json01{}transfer.updated webhooks and GET responses serialize transfers with raw amount and embedded recipient.
| Field | Type | Required | Description |
|---|---|---|---|
id | uuid | No | Videpay transfer record ID. |
reference / referenceHash | string / bytes32 | No | Your reconciliation reference and on-chain hash. |
status | enum | No | processing, executed, or failed. |
amount.raw | string | No | Raw token amount in smallest units. |
recipient.recipientId / recipient.address | uuid / address | No | Registry recipient or one-off address with source field. |
txHash / blockNumber / logIndex | string / integer | No | On-chain execution coordinates when executed. |
batch | object | No | Embedded batch summary when transfer belongs to a batch. |
Register a webhook endpoint and verify the X-Protocol-Signature header on every delivery before fulfilling orders or updating your database.
transfer.updatedSent when an outbound transfer status changes.
01Content-Type: application/json02User-Agent: Protocol-Webhooks/1.003X-Protocol-Event: transfer.updated04X-Protocol-Delivery: wev_1a2b3c4d-5e6f-7890-abcd-ef123456789005X-Protocol-Business-Id: a1b2c3d4-e5f6-7890-abcd-ef123456789006X-Protocol-Attempt: 107X-Protocol-Signature: sha256=abc123def456...transfer.consent.updatedSent when payout transfer consent is granted or revoked.
01Content-Type: application/json02User-Agent: Protocol-Webhooks/1.003X-Protocol-Event: transfer.consent.updated04X-Protocol-Delivery: wev_1a2b3c4d-5e6f-7890-abcd-ef123456789005X-Protocol-Business-Id: a1b2c3d4-e5f6-7890-abcd-ef123456789006X-Protocol-Attempt: 107X-Protocol-Signature: sha256=abc123def456...transfer.batch.updatedSent when a batch transfer status changes.
01Content-Type: application/json02User-Agent: Protocol-Webhooks/1.003X-Protocol-Event: transfer.batch.updated04X-Protocol-Delivery: wev_1a2b3c4d-5e6f-7890-abcd-ef123456789005X-Protocol-Business-Id: a1b2c3d4-e5f6-7890-abcd-ef123456789006X-Protocol-Attempt: 107X-Protocol-Signature: sha256=abc123def456...transfer.recipient.createdSent when a new payout recipient is registered on-chain.
01Content-Type: application/json02User-Agent: Protocol-Webhooks/1.003X-Protocol-Event: transfer.recipient.created04X-Protocol-Delivery: wev_1a2b3c4d-5e6f-7890-abcd-ef123456789005X-Protocol-Business-Id: a1b2c3d4-e5f6-7890-abcd-ef123456789006X-Protocol-Attempt: 107X-Protocol-Signature: sha256=abc123def456...transfer.recipient.updatedSent when recipient name or wallet address changes.
01Content-Type: application/json02User-Agent: Protocol-Webhooks/1.003X-Protocol-Event: transfer.recipient.updated04X-Protocol-Delivery: wev_1a2b3c4d-5e6f-7890-abcd-ef123456789005X-Protocol-Business-Id: a1b2c3d4-e5f6-7890-abcd-ef123456789006X-Protocol-Attempt: 107X-Protocol-Signature: sha256=abc123def456...transfer.recipient.deactivatedSent when a recipient is deactivated.
01Content-Type: application/json02User-Agent: Protocol-Webhooks/1.003X-Protocol-Event: transfer.recipient.deactivated04X-Protocol-Delivery: wev_1a2b3c4d-5e6f-7890-abcd-ef123456789005X-Protocol-Business-Id: a1b2c3d4-e5f6-7890-abcd-ef123456789006X-Protocol-Attempt: 107X-Protocol-Signature: sha256=abc123def456...transfer.recipient.reactivatedSent when a deactivated recipient is reactivated.
01Content-Type: application/json02User-Agent: Protocol-Webhooks/1.003X-Protocol-Event: transfer.recipient.reactivated04X-Protocol-Delivery: wev_1a2b3c4d-5e6f-7890-abcd-ef123456789005X-Protocol-Business-Id: a1b2c3d4-e5f6-7890-abcd-ef123456789006X-Protocol-Attempt: 107X-Protocol-Signature: sha256=abc123def456...transfer.receivedSent when an inbound USDC transfer to your merchant is detected.
01Content-Type: application/json02User-Agent: Protocol-Webhooks/1.003X-Protocol-Event: transfer.received04X-Protocol-Delivery: wev_1a2b3c4d-5e6f-7890-abcd-ef123456789005X-Protocol-Business-Id: a1b2c3d4-e5f6-7890-abcd-ef123456789006X-Protocol-Attempt: 107X-Protocol-Signature: sha256=abc123def456...