collections:read, collections:writeAPI path:
/v1/collections (ledger: kind: "collection")Dashboard: Payment Links — Invoices and Checkout tabs
Invoice vs checkout
Every payment link has alinkMode. This controls how many times the URL can be used and how payments are tracked.
Invoice (linkMode: "invoice") | Checkout (linkMode: "checkout") | |
|---|---|---|
| Use case | One bill, one payer, one payment | Storefront, donation page, reusable pay button |
| URL | Single-use — tied to one payment | Reusable — same URL for every visitor |
| Resource | One API object = one payment | One parent link + a session per payment |
| Initial status | awaiting_origin | Parent stays active |
| After payer quotes | Same object moves to awaiting_deposit | New session id; track payment on the session |
| Embed | Embed the invoice id | Embed the checkout parent id (sessions created automatically) |
| List in API | One row per invoice | One row per checkout link (sessionCount on parent) |
Fixed vs open amount
Both modes supportpricingType:
pricingType | Behavior |
|---|---|
fixed | You set amount. Payer must send the quoted amount before the quote expires (~1 min). |
open | No preset amount. Payer sends any amount; you receive the equivalent on settlement. Same origin can re-quote and reuse the deposit address. |
- Invoice + fixed — “Pay invoice #1042 for $500”
- Invoice + open — “Send whatever you owe on this bill”
- Checkout + fixed — “Buy this product for $49” (new session each visit)
- Checkout + open — “Donate any amount” (new session each visit)
When to use which
Choose invoice when you create a link for a specific payment event — billing a client, a one-off request, an API-generated link per order line. Choose checkout when one URL should stay live on your site — pricing page, embed widget, “Pay with crypto” button. Each visitor gets their own payment session; the parent link staysactive until you cancel it.
Merchant endpoints
Auth: API key or dashboard JWT. Writes with an API key needIdempotency-Key.
Discover supported networks and corridors in Networks & corridors (GET /collections/chains and GET /collections/corridors mirror the payment-routes discovery endpoints).
| Method | Path | Purpose |
|---|---|---|
POST | /collections | Create link → returns payUrl, embedUrl |
GET | /collections | List parent links only (?customerId= optional) |
GET | /collections/{id} | Get link; checkout parents include sessions[] |
PATCH | /collections/{id} | Update metadata, embed theme, or cancel |
POST | /collections/{id}/sync | Pull latest deposit status from chain |
POST | /collections/{id}/logo | Upload logo (multipart, max 2 MB) |
Create an invoice
payUrl. The payer quotes and pays on that same id. Poll GET /collections/{id} or GET /pay/{id} for status.
Create a checkout link
status: "active". Share payUrl or embed the parent id.
When a payer requests a quote (POST /pay/{parentId}/quote), Remitflex creates a session (child collection). Track that payment with GET /pay/{sessionId} or list sessions on GET /collections/{parentId}.
| Field | Values | Notes |
|---|---|---|
linkMode | invoice, checkout | Default invoice |
pricingType | fixed, open | Fixed requires amount |
fromName, payeeName, label | strings | Optional pay-page labels |
successRedirectUrl | URL | Redirect after successful payment |
embedConfig | object | Optional theme at create |
Update
UsePATCH /collections/{id} on the parent link (invoice or checkout). Sessions cannot be PATCHed.
POST /collections/{id}/logo (multipart). Sync — POST /collections/{id}/sync. Legacy aliases POST .../cancel and PATCH .../embed-config still work.
Payer endpoints
No auth.| Method | Path | Purpose |
|---|---|---|
GET | /pay/{id} | Pay page data (destination, options, status) |
POST | /pay/{id}/quote | Choose origin + return address → deposit address |
GET | /pay/{id}/logo | Public logo image |
GET | /pay/{id}/embed-config | Theme for embed iframe |
refundTo is required on every deposit quote.
Payer details
When creating a link, setpayerFields to collect information from payers before quoting:
key | Purpose |
|---|---|
name | Payer full name |
email | Email address |
phone | Phone number |
kyc | Document type, number, and country |
metadata | Custom field — set label (e.g. Tax ID, PO number) |
required: true or false. On quote (POST /pay/{id}/quote), send collected values in payerDetails:
payerDetails appear on GET /collections/{id} and checkout session lists.
On the hosted pay page, Connect wallet is available for EVM and Solana fixed-amount payments. Bitcoin and Tron payers use Send manually — copy the deposit address and pay from any wallet or exchange.
- Invoice: quote on the invoice
id. - Checkout: quote on the parent checkout
id→ response uses the new session id for deposit and status.
Status values
| Status | Invoice | Checkout |
|---|---|---|
active | — | Parent link is live |
awaiting_origin | Created, no quote yet | Session created, no quote yet |
awaiting_deposit | Quote ready, waiting for transfer | Same, on session |
deposit_received | Transfer detected, settling | Same, on session |
completed | Delivered to destination | Session complete; parent stays active |
refunded / failed / expired / cancelled | Terminal | Terminal (session or cancelled parent) |
quoteValidUntil). Open pricing: re-quote on the same origin reuses the deposit address.
Embed
Works for invoice and checkout parent ids.- Theme —
PATCH /collections/{id}(embedConfig) or dashboard Payment Links → Embed - Loader —
embed.jsopens a modal or inline iframe at/embed/{linkId} - Pay UI — theme from
GET /pay/{id}/embed-config(checkout sessions inherit parent theme)
postMessage (type: "remitflex.payment"): opened, status, completed, failed, resize.
Pass ?origin=https://yoursite.com on the iframe URL so messages target your domain only.
vs payment routes
| Payment links | Payment routes |
|---|---|
| Hosted pay page; payer picks origin | You set origin at create |
| Invoice (one-off) or checkout (reusable) | Standing deposit address |
| Payment routes for API-driven pay-ins without a hosted page |