Skip to main content
Share a pay URL. The payer chooses network and token on the hosted page. You receive stablecoins at your destination wallet. Scopes: collections:read, collections:write
API path: /v1/collections (ledger: kind: "collection")
Dashboard: Payment LinksInvoices and Checkout tabs

Invoice vs checkout

Every payment link has a linkMode. This controls how many times the URL can be used and how payments are tracked.
Invoice (linkMode: "invoice")Checkout (linkMode: "checkout")
Use caseOne bill, one payer, one paymentStorefront, donation page, reusable pay button
URLSingle-use — tied to one paymentReusable — same URL for every visitor
ResourceOne API object = one paymentOne parent link + a session per payment
Initial statusawaiting_originParent stays active
After payer quotesSame object moves to awaiting_depositNew session id; track payment on the session
EmbedEmbed the invoice idEmbed the checkout parent id (sessions created automatically)
List in APIOne row per invoiceOne row per checkout link (sessionCount on parent)

Fixed vs open amount

Both modes support pricingType:
pricingTypeBehavior
fixedYou set amount. Payer must send the quoted amount before the quote expires (~1 min).
openNo preset amount. Payer sends any amount; you receive the equivalent on settlement. Same origin can re-quote and reuse the deposit address.
Typical pairings:
  • 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 stays active until you cancel it.

Merchant endpoints

Auth: API key or dashboard JWT. Writes with an API key need Idempotency-Key. Discover supported networks and corridors in Networks & corridors (GET /collections/chains and GET /collections/corridors mirror the payment-routes discovery endpoints).
MethodPathPurpose
POST/collectionsCreate link → returns payUrl, embedUrl
GET/collectionsList 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}/syncPull latest deposit status from chain
POST/collections/{id}/logoUpload logo (multipart, max 2 MB)

Create an invoice

curl -X POST https://api.remitflex.io/v1/collections \
  -H "Authorization: Bearer $REMITFLEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "linkMode": "invoice",
    "pricingType": "fixed",
    "amount": 500,
    "destinationChainKey": "solana",
    "destinationCurrency": "USDC",
    "destinationAddress": "YOUR_WALLET",
    "label": "Invoice #1042"
  }'
Share payUrl. The payer quotes and pays on that same id. Poll GET /collections/{id} or GET /pay/{id} for status.
curl -X POST https://api.remitflex.io/v1/collections \
  -H "Authorization: Bearer $REMITFLEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "linkMode": "checkout",
    "pricingType": "fixed",
    "amount": 49,
    "destinationChainKey": "solana",
    "destinationCurrency": "USDC",
    "destinationAddress": "YOUR_WALLET",
    "label": "Pro plan"
  }'
The parent returns 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}.
FieldValuesNotes
linkModeinvoice, checkoutDefault invoice
pricingTypefixed, openFixed requires amount
fromName, payeeName, labelstringsOptional pay-page labels
successRedirectUrlURLRedirect after successful payment
embedConfigobjectOptional theme at create

Update

Use PATCH /collections/{id} on the parent link (invoice or checkout). Sessions cannot be PATCHed.
# Edit labels
curl -X PATCH https://api.remitflex.io/v1/collections/{id} \
  -H "Authorization: Bearer $REMITFLEX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"label": "Invoice #1042 — revised", "fromName": "Acme Ltd"}'

# Save embed theme
curl -X PATCH https://api.remitflex.io/v1/collections/{id} \
  -H "Authorization: Bearer $REMITFLEX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"embedConfig": {"layout": "minimal", "accentColor": "#0F766E"}}'

# Cancel invoice or checkout parent
curl -X PATCH https://api.remitflex.io/v1/collections/{id} \
  -H "Authorization: Bearer $REMITFLEX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status": "cancelled"}'
LogoPOST /collections/{id}/logo (multipart). SyncPOST /collections/{id}/sync. Legacy aliases POST .../cancel and PATCH .../embed-config still work.

Payer endpoints

No auth.
MethodPathPurpose
GET/pay/{id}Pay page data (destination, options, status)
POST/pay/{id}/quoteChoose origin + return address → deposit address
GET/pay/{id}/logoPublic logo image
GET/pay/{id}/embed-configTheme for embed iframe
curl -X POST https://api.remitflex.io/v1/pay/{id}/quote \
  -H "Content-Type: application/json" \
  -d '{
    "originChainKey": "tron",
    "originCurrency": "USDT",
    "payerSource": "wallet",
    "refundTo": "TRON_RETURN_ADDRESS"
  }'
refundTo is required on every deposit quote.

Payer details

When creating a link, set payerFields to collect information from payers before quoting:
keyPurpose
namePayer full name
emailEmail address
phonePhone number
kycDocument type, number, and country
metadataCustom field — set label (e.g. Tax ID, PO number)
Each field has required: true or false. On quote (POST /pay/{id}/quote), send collected values in payerDetails:
{
  "originChainKey": "base",
  "originCurrency": "USDC",
  "payerSource": "wallet",
  "refundTo": "0x…",
  "payerDetails": {
    "name": "Jane Doe",
    "email": "jane@example.com",
    "phone": "+2348012345678",
    "kyc": {
      "documentType": "passport",
      "documentNumber": "A12345678",
      "country": "NG"
    },
    "metadata": {
      "Tax ID": "12345678"
    }
  }
}
Collected 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

StatusInvoiceCheckout
activeParent link is live
awaiting_originCreated, no quote yetSession created, no quote yet
awaiting_depositQuote ready, waiting for transferSame, on session
deposit_receivedTransfer detected, settlingSame, on session
completedDelivered to destinationSession complete; parent stays active
refunded / failed / expired / cancelledTerminalTerminal (session or cancelled parent)
Fixed pricing: quote expires in ~1 min (quoteValidUntil). Open pricing: re-quote on the same origin reuses the deposit address.

Embed

Works for invoice and checkout parent ids.
  1. ThemePATCH /collections/{id} (embedConfig) or dashboard Payment Links → Embed
  2. Loaderembed.js opens a modal or inline iframe at /embed/{linkId}
  3. Pay UI — theme from GET /pay/{id}/embed-config (checkout sessions inherit parent theme)
Modal button:
<script src="https://pay.remitflex.io/embed.js" data-pay-host="https://pay.remitflex.io" async></script>
<button data-remitflex-pay="LINK_ID">Pay</button>
Inline:
Remitflex.inline({
  linkId: "LINK_ID",
  container: "#checkout",
  payHost: "https://pay.remitflex.io",
});
EventspostMessage (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 linksPayment routes
Hosted pay page; payer picks originYou set origin at create
Invoice (one-off) or checkout (reusable)Standing deposit address
Payment routes for API-driven pay-ins without a hosted page

Testing

Integration testing: Testing.