Documentation

Transfers

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.

When should I use this?

  • You pay vendors, contractors, or affiliates from merchant balance after settlement.
  • You run weekly or monthly payroll to multiple registered wallets.
  • You need inbound transfer webhooks when external parties send USDC to your merchant.

Why use Videpay?

  • Dashboard + API parity: everything in the Transfers tab is available programmatically.
  • Recipient registry with deactivate/reactivate lifecycle.
  • Batch up to 50 payouts in one on-chain batch with shared reference.
  • Analytics, history sync, limits, and webhook replay for reconciliation.

Weekly contractor payroll

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.

Before you start

  • Merchant registered on-chain for the target chain
  • Payout token consent active (dashboard Grant consent or API consent flow)
  • At least one active recipient or a one-off recipientAddress per transfer

How transfers work

  1. Register payout recipients (or pass recipientAddress for one-off payouts).
  2. Grant transfer consent: owner wallet approves payout tokens and signs EIP-712 consent.
  3. Quote fees with POST /transfer/quote-fee using token symbol and human amount.
  4. Create a transfer or batch: relayer submits on-chain; status moves through processing → executed or failed.
  5. Listen for transfer.updated and transfer.batch.updated webhooks to reconcile.
  6. Inbound USDC to your merchant emits transfer.received for treasury visibility.

Dashboard features

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.

  1. Recipients: add wallet, edit name/address, deactivate, reactivate.
  2. Consent: connect owner wallet, approve payout tokens per chain, grant or revoke transfer consent.
  3. Create transfer: pick recipient, choose USDC, enter amount: same `token` + `amount` the API accepts.
  4. Batch transfer: upload or enter multiple rows, shared batch reference, one owner confirmation step in the browser.
  5. History and analytics panels read from GET /transfer/history and GET /transfer/analytics.

Amount and payout token

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.

FieldTypeRequiredDescription
amountdecimal stringYesHow 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.
tokenstringYesPayout 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.

Quote transfer fee

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.

FieldTypeRequiredDescription
businessIduuidNoTarget business. Omit when your API key is scoped to one business.
chainstringNoChain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically.
amountdecimal stringYesHow 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.
tokenstringYesPayout 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.
POST/transfer/quote-fee

Preview fee, net, and applied bps for a raw transfer amount.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{02  "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03  "chain": "base",04  "token": "USDC",05  "amount": "1"06}

Payout token approval check

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.

FieldTypeRequiredDescription
businessIduuidNoTarget business. Omit when your API key is scoped to one business.
chainstringNoChain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically.
amountdecimal stringYesHow 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.
tokenstringYesPayout 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.
POST/transfer/token-approval

Check allowance and return approval transaction data when allowance is insufficient.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{02  "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03  "chain": "base",04  "token": "USDC",05  "amount": "1"06}
GET/transfer/consent/payout-tokens

List 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.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Recipient registry

Register wallets once and reference them by recipientId on every payout. Recipients can be deactivated without deleting history.

FieldTypeRequiredDescription
businessIduuidNoTarget business. Omit when your API key is scoped to one business.
chainstringNoChain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically.
walletAddressaddressYesDestination wallet for outbound transfers.
recipientTypeenumYeswallet or internal. Use wallet for external payouts.
namestringYesHuman-readable label shown in dashboard and API responses.
recipientIduuidNoOptional custom recipient UUID. Videpay generates one when omitted.
includeInactivebooleanNoQuery param on list. Default false.
offset / limitintegerNoPagination. limit is 1–100, default 20.
POST/transfer/recipients

Create a recipient. Emits transfer.recipient.created.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{02  "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03  "chain": "base",04  "walletAddress": "0xRecipientAddress123456789012345678901234567890",05  "recipientType": "wallet",06  "name": "Acme Vendor"07}
GET/transfer/recipients?limit=20

List recipients. Set includeInactive=true for deactivated records.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
GET/transfer/recipients/:rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d

Retrieve a single recipient by recipientId.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
POST/transfer/recipients/:rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d

Update wallet address or name. Emits transfer.recipient.updated.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{02  "name": "Acme Vendor LLC"03}
POST/transfer/recipients/:rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d/deactivate

Deactivate a recipient. Emits transfer.recipient.deactivated.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{}
POST/transfer/recipients/:rcp_7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d/reactivate

Reactivate a deactivated recipient. Emits transfer.recipient.reactivated.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{}

Transfer consent

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.

  1. POST /transfer/consent/prepare with approved: true: returns typedData for owner wallet.
  2. Owner signs typed data in wallet.
  3. POST /transfer/consent with approved, version, deadline, and approvalSignature.
  4. Listen for transfer.consent.updated when consent becomes active or revoked.
FieldTypeRequiredDescription
businessIduuidNoTarget business. Omit when your API key is scoped to one business.
chainstringNoChain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically.
approvedbooleanYesSet true to grant transfer consent, false to revoke.
businessIduuidNoTarget business. Omit when your API key is scoped to one business.
chainstringNoChain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically.
approvedbooleanYesMust match the value used in prepare.
versionstringYesConsent version from prepare response typedData.message.version.
deadlineintegerYesUnix timestamp deadline from typedData.message.deadline.
approvalSignaturestringYesOwner wallet EIP-712 signature over the consent typed data.
POST/transfer/consent/prepare

Prepare consent typed data and optional payout token approvals.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{02  "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03  "chain": "base",04  "approved": true05}
POST/transfer/consent

Submit signed consent. Emits transfer.consent.updated.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{02  "businessId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",03  "chain": "base",04  "approved": true,05  "version": "0",06  "deadline": 1735689600,07  "approvalSignature": "0x..."08}

Execute a transfer

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.

FieldTypeRequiredDescription
businessIduuidNoTarget business. Omit when your API key is scoped to one business.
chainstringNoChain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically.
amountdecimal stringYesHow 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.
tokenstringYesPayout 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.
recipientIduuidNoRegistered recipient from POST /transfer/recipients. Provide recipientId or recipientAddress: at least one required.
recipientAddressaddressNoOne-off payout address when you skip recipient registry.
referencestringNoYour reconciliation reference (unique per business when used).
memostringNoOptional memo stored on-chain and echoed in webhooks.
metadataobjectNoArbitrary JSON stored on the transfer record.
ttlSecondsintegerNoSignature validity window for relayer submission (30–86400, default 300).
POST/transfer

Send USDC to a registered recipient or one-off address. Emits transfer.updated through lifecycle.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{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}
GET/transfer/:trf_5c8d2e1f-9a3b-4c7d-8e6f-1a2b3c4d5e6f

Get transfer status, txHash, and amount by transfer id.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
GET/transfer/reference/payout-001

Lookup transfer by your reference string.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
POST/transfer/:trf_5c8d2e1f-9a3b-4c7d-8e6f-1a2b3c4d5e6f/retry

Retry a failed transfer submission.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{}
POST/transfer/:trf_5c8d2e1f-9a3b-4c7d-8e6f-1a2b3c4d5e6f/webhook-replay

Re-emit transfer.updated for reconciliation or missed deliveries.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{}

Batch transfers

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.

FieldTypeRequiredDescription
businessIduuidNoTarget business. Omit when your API key is scoped to one business.
chainstringNoChain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically.
batchReferencestringNoYour batch reconciliation reference.
transfersarrayYes1–50 transfer items. Each item uses the same fields as a single transfer (token, amount, recipientId or recipientAddress, reference, memo, metadata).
ttlSecondsintegerNoShared TTL for the entire batch (30–86400).
POST/transfer/batch

Execute multiple transfers atomically. Emits transfer.batch.updated.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{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}
GET/transfer/batch/:bat_8e4f1a2b-3c5d-4e6f-7a8b-9c0d1e2f3a4b

Get batch status by batch id.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
GET/transfer/batch/reference/payroll-week-28

Lookup batch by batchReference.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
POST/transfer/batch/:bat_8e4f1a2b-3c5d-4e6f-7a8b-9c0d1e2f3a4b/retry

Retry failed items in a batch.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{}
POST/transfer/batch/:bat_8e4f1a2b-3c5d-4e6f-7a8b-9c0d1e2f3a4b/webhook-replay

Re-emit transfer.batch.updated. Set includeTransfers=true to replay child transfer.updated events.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{02  "includeTransfers": true03}

Limits, history, and analytics

FieldTypeRequiredDescription
businessIduuidNoTarget business. Omit when your API key is scoped to one business.
chainstringNoChain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically.
periodenumNoAnalytics window: 7d, 30d, or 90d (default 30d).
fromBlock / toBlockintegerNoOptional block range for history sync.
GET/transfer/limit

Get per-chain transfer limits and remaining daily capacity.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
GET/transfer/history?limit=20

Sync on-chain transfer history into Videpay records.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
GET/transfer/analytics?period=30d

Aggregated outbound transfer metrics for 7d, 30d, or 90d.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Inbound transfers

When external wallets send USDC to your merchant address, Videpay indexes the transfer and emits transfer.received. List and retrieve inbound records for treasury reconciliation.

FieldTypeRequiredDescription
businessIduuidNoTarget business. Omit when your API key is scoped to one business.
chainstringNoChain scope for settlement APIs (base, polygon, etc.). Required for wallet direct/intent prepare. Sandbox resolves to testnets automatically.
GET/transfer/inbound?limit=20

List detected inbound transfers to your merchant.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
GET/transfer/inbound/inb_...

Retrieve a single inbound transfer.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json
POST/transfer/outbound/:trf_5c8d2e1f-9a3b-4c7d-8e6f-1a2b3c4d5e6f/replay-inbound

Link or replay inbound detection for an outbound transfer when debugging reconciliation.

Headers

headers
01x-api-key: sk_AbCdEfGhIj_XyZ1234567890abcdefghijklmnopqrstuvwxyz01234502Content-Type: application/json

Request body

request.json
01{}

Transfer object reference

transfer.updated webhooks and GET responses serialize transfers with raw amount and embedded recipient.

FieldTypeRequiredDescription
iduuidNoVidepay transfer record ID.
reference / referenceHashstring / bytes32NoYour reconciliation reference and on-chain hash.
statusenumNoprocessing, executed, or failed.
amount.rawstringNoRaw token amount in smallest units.
recipient.recipientId / recipient.addressuuid / addressNoRegistry recipient or one-off address with source field.
txHash / blockNumber / logIndexstring / integerNoOn-chain execution coordinates when executed.
batchobjectNoEmbedded batch summary when transfer belongs to a batch.

Webhooks you'll receive

Register a webhook endpoint and verify the X-Protocol-Signature header on every delivery before fulfilling orders or updating your database.

Webhooktransfer.updated

Sent when an outbound transfer status changes.

Delivery headers

webhook-headers
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...
Webhooktransfer.consent.updated

Sent when payout transfer consent is granted or revoked.

Delivery headers

webhook-headers
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...
Webhooktransfer.batch.updated

Sent when a batch transfer status changes.

Delivery headers

webhook-headers
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...
Webhooktransfer.recipient.created

Sent when a new payout recipient is registered on-chain.

Delivery headers

webhook-headers
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...
Webhooktransfer.recipient.updated

Sent when recipient name or wallet address changes.

Delivery headers

webhook-headers
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...
Webhooktransfer.recipient.deactivated

Sent when a recipient is deactivated.

Delivery headers

webhook-headers
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...
Webhooktransfer.recipient.reactivated

Sent when a deactivated recipient is reactivated.

Delivery headers

webhook-headers
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...
Webhooktransfer.received

Sent when an inbound USDC transfer to your merchant is detected.

Delivery headers

webhook-headers
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...