Open a collection
Mint a reference and a dedicated USD deposit account for one collection, read the fee terms up front, then read the collection back at any time.
Collections are a separate product from the sell/buy USDT rails covered elsewhere in these guides — see Products and scopes for which credential you need. A collection is one thing: a reference plus a dedicated USD deposit account, opened for one purpose you choose — a single contribution, or many contributions from one community over time.
sequenceDiagram
autonumber
accTitle: Opening a collection and reading it back
accDescr: You create a collection, naming its currency and your own reference. OnLink mints a reference and opens a dedicated USD deposit account, returning both plus the fee terms. You hand the deposit instructions to your contributor. Later you read the collection by id, or list your collections filtered by reference, status and date.
participant You
participant OnLink
participant Contributor
You->>OnLink: POST /v1/collections (currency, partnerReference, payerLabel)
OnLink->>OnLink: mint a reference, open a dedicated deposit account
OnLink-->>You: 201 id, reference, depositInstructions, fee
You->>Contributor: hand over the deposit instructions
You->>OnLink: GET /v1/collections/:id (any time)
OnLink-->>You: the collection, refreshed1. Create the collection
POST /v1/collections takes the currency, your own reference for the
collection, and a label for your own records:
| Field | Notes |
|---|---|
currency | Only USD is supported today. |
partnerReference | Your own handle — a community id, a campaign name. Stored for your records; never used to look anything up. |
payerLabel | A plain-text label for your own records (e.g. "St Mark's Sunday offering"). Never shown to the contributor. |
expectedAmount | Optional, advisory only. A mismatch against what actually arrives is reported later, never refused here. |
Response — 201 Created:
{
"id": "a1b2c3d4-0000-4000-8000-000000000001",
"reference": "DEMO-7K3Q2M",
"status": "open",
"currency": "USD",
"depositInstructions": {
"beneficiaryName": "Onlink Technology, Inc.",
"bankName": "Bank Name",
"routingNumber": "000000000",
"accountNumber": "0000000000",
"rails": ["ach_push", "fednow", "wire"],
"depositMessage": "BRGBFRC25ZJZ4RAVXEZK"
},
"fee": {
"percentBps": 175,
"flatMinor": 30,
"capMinor": null,
"currency": "USD"
},
"createdAt": "2026-09-22T17:38:46.915Z"
}reference is minted for you — an unambiguous code (no 0, 1, I, L or
O, which are the characters people misread off a screen or a bank
statement). depositInstructions is a complete set of US deposit
details — a beneficiary name, a bank, a routing number and an account number.
We never compose any of these fields ourselves; what you see here is exactly
what your contributor should be given, unedited.
Hand over the deposit instructions exactly as given
Do not retype, reformat or "clean up" any field in depositInstructions —
copy it exactly. A beneficiary name, account number or depositMessage
decides whether the money lands or is attributed to this collection at all.
depositMessage — quote it, or expect delays
Most collections share ONE deposit account across many references, each
distinguished by depositMessage — a code we mint (never chosen by you or
your contributor). Your contributor must include it in their transfer (a
wire memo, an ACH description) for the deposit to be attributed to this
collection. A deposit that arrives without it matches no collection, so it is
not credited and does not appear on this collection at any status — it has to
be reconciled by hand, or returned to your contributor.
A small number of collections instead get a dedicated account number with
no depositMessage at all — in that case the field is simply absent, and any
deposit into that account is already unambiguous. Branch on whether the field
is present; never assume one shape or the other.
2. Read the fee terms up front
fee on the create response is your own pricing terms — a percentage, a flat
amount, and an optional cap — shown before any money has moved. capMinor: null means uncapped. These are TERMS, not a computed amount: nothing has been
deposited yet, so there is nothing to compute a real fee against. Once a
deposit is attributed to this collection, the actual gross, fee and net
appear on a read of the same collection (see below).
3. Read a collection back at any time
GET /v1/collections/:id returns the same shape, refreshed — including the
gross, fee and net once a deposit has been attributed:
{
"id": "a1b2c3d4-0000-4000-8000-000000000001",
"reference": "DEMO-7K3Q2M",
"status": "received",
"currency": "USD",
"fee": {
"percentBps": 175,
"flatMinor": 30,
"capMinor": null,
"currency": "USD"
},
"grossAmount": "100.00",
"feeAmount": "1.18",
"netAmount": "98.82",
"createdAt": "2026-09-22T17:38:46.915Z"
}GET /v1/collections?reference=&status=&from=&to= lists your own
collections, newest first, filtered by any combination of your own reference,
a status, and a creation-time window. Every filter is optional and every
result is scoped to your own partner account — a collection you did not open
never appears, whatever you search for.
Statuses you will see
status | Meaning |
|---|---|
open | The deposit account is live; nothing has arrived yet. |
received | A deposit was attributed to this collection and the fee applied. |
crediting | The net amount is on its way to your USD balance. |
credited | The net amount has been added to your USD balance. |
refunded | The deposit was returned to its sender. |
expired | No deposit arrived within this collection's active window. |
What you will never see here
A collection never shows you a token, a chain, or an exchange rate — only a reference, a gross, a fee, a net, and a USD credit. What happens between a deposit landing and your USD balance moving is entirely ours to run.
Errors worth handling
Every code on this route is catalogued in Errors — Collections. The two worth knowing before you build:
| Status | Meaning |
|---|---|
503 | Collections are not yet enabled for your account, or we could not open the deposit account. |
404 | No collection with that id belongs to you. |
Send USDT from your wallet
Create an instruction, your registered person confirms it with a one-time code, then it executes. One rail, one consent step, one honest failure model.
Collect in the US, pay out in Kenya
End to end: take USD from US contributors by ACH, FedNow or wire, then convert and pay out KES to M-PESA, a bank account or PesaLink.