API reference/Payment collection and payment links
Payment collection and payment links
Get paid into your balance by a public payment link with bank transfer, card and crypto methods, by a fixed-amount payment request tied to an invoice, or by a virtual account in your company’s name in USD, EUR or MXN. A request is marked paid only when an incoming payment matches amount, currency, timing and owner unambiguously; unmatched bank transfers still credit your balance.
Create a payment link
/payment-links| Field | Type | required | Notes |
|---|---|---|---|
| name | string | optional | |
| methods | array | optional | |
| published | boolean | optional |
Request
{
"name": "Invoices",
"methods": [
"bank_transfer",
"card",
"crypto"
],
"published": true
}Response 201
{
"id": "pl_7a2c",
"name": "Invoices",
"url": "https://decaf.so/pay/cargo-ledger",
"methods": [
{
"type": "bank_transfer",
"ready": true
},
{
"type": "card",
"ready": true
},
{
"type": "crypto",
"ready": true
}
],
"published": true
}List payment links
/payment-linksGet a payment link
/payment-links/{id}Parameters
idpathstringrequired
Update methods or publication
/payment-links/{id}Parameters
idpathstringrequired
| Field | Type | required | Notes |
|---|---|---|---|
| name | string | optional | |
| methods | array | optional | |
| published | boolean | optional |
Create a fixed-amount payment request
/payment-requestsMarked paid only when an incoming payment matches amount, currency, timing and owner unambiguously. Unmatched bank transfers still credit your balance as deposits.
| Field | Type | required | Notes |
|---|---|---|---|
| payment_link_id | string | required | |
| amount | Amount | required | Decimal string. Up to two decimals for fiat, six for USDC. |
| currency | string | required | |
| reference | string | optional | |
| expires_at | string | optional |
Request
{
"payment_link_id": "pl_7a2c",
"amount": "1250.00",
"currency": "USD",
"reference": "INV-0912",
"expires_at": "2026-09-30T00:00:00Z"
}Response 201
{
"id": "pr_31aa",
"url": "https://decaf.so/pay/cargo-ledger/pr_31aa",
"amount": "1250.00",
"currency": "USD",
"reference": "INV-0912",
"status": "open",
"expires_at": "2026-09-30T00:00:00Z"
}Examples: Create a fixed-amount payment request
curl -X POST https://sandbox.api.decaf.so/v1/payment-requests \
-H "Authorization: Bearer $DECAF_API_KEY" \
-H "Content-Type: application/json" \
-d '{"payment_link_id":"pl_7a2c","amount":"1250.00","currency":"USD","reference":"INV-0912","expires_at":"2026-09-30T00:00:00Z"}'Open a virtual account
/virtual-accountsRequires business verification and the corridor. Details are returned masked.
| Field | Type | required | Notes |
|---|---|---|---|
| currency | enum: USD, EUR, MXN | required |
Request
{
"currency": "EUR"
}Response 201
{
"id": "va_1f3e",
"currency": "EUR",
"rail": "sepa",
"status": "active",
"details": {
"iban": "DE•• •••• 3310",
"bic": "•••",
"beneficiary_name": "Cargo Ledger GmbH"
},
"reference_required": true
}Errors: 403 verification_required
Examples: Open a virtual account
curl -X POST https://sandbox.api.decaf.so/v1/virtual-accounts \
-H "Authorization: Bearer $DECAF_API_KEY" \
-H "Content-Type: application/json" \
-d '{"currency":"EUR"}'List virtual accounts
/virtual-accountsGet access
Build against the sandbox this week.
Tell us the corridors you need and the recipients you pay. Sandbox keys are issued by a person.