What it is
Every receipt the platform issues (payout, payin, refund, internal transfer, swap, crypto withdrawal or deposit, banking operation, card purchase) has a public tracking link, in the style of Wise:{code} is the same HMAC-signed code that already backs receipt verification (GET /verify/receipts/{code} and the QR printed on every PDF). The link is the capability: it cannot be guessed or forged, and it only ever exposes that one transaction.
Where the link comes from
You never build the URL yourself — the platform hands it to you:verify_urlin receipt payloads. When a transaction reaches a final state, its receipt includesverify_url. With the tracker enabled, that URL now points tohttps://business.cbpayapp.com/t/{code}.- Receipt emails. The branded receipt email your customer receives carries the same link (“Verify online” / tracking button).
- The QR on every PDF receipt encodes the same code — scanning it opens the tracker.
Get the link for an existing transaction (API)
Receipts and emails always carry the link, but you don’t need to download anything to get it: callGET /v1/track-link with the transaction’s kind and id to power a “Share link” button in your own UI.
200 OK:
code is the same HMAC-signed code printed as a QR on every receipt, so the link is deterministic: calling the endpoint twice for the same transaction always returns the same URL.
Who can call it. The transaction’s own account (API key or member session), org admins and platform admins — the same read scope as receipts. A transaction outside your scope (or an unknown kind) answers 404 not_found, never 403: existence is never leaked. A missing kind or id answers 400 invalid_payload.
What the page shows
- Status badge — a public, human-readable status (
completed,processing,failed) with the operation detail (recipient, reference, amounts, exchange rate). - Timeline — a fixed step sequence per operation type (for example, a payout: Initiated → Processing → In transit → Completed). Only real timestamps are shown: the first step carries the creation time and the reached final step carries the last update; intermediate steps never display fabricated dates.
- PDF receipt — the same branded, verifiable receipt, generated on the fly, downloadable directly from the page.
- Your branding — your organization’s name, logo, website and accent color (white-label by design).
- Blockchain explorer link — for crypto transactions with an on-chain hash, a link to the public explorer.
- Support block — “Problems with this transfer?” pointing to your organization’s website.
Public JSON API (build your own tracker)
The same data the hosted page renders is available as JSON — useful if you want to embed tracking inside your own portal instead of redirecting to ours:Public status (anti tipping-off)
Sensitive internal states are generalized before they reach the public page — an operation under compliance review must not be distinguishable from one that is simply being processed:Timeline sequences
The step sequence is fixed per operation family — the recipient always sees the same steps for the same product:
While the operation advances, steps before the current one are
complete, the current one is in_progress and the rest are upcoming. When an operation fails, the step where it stopped is marked failed, the previous steps stay complete and the later ones stay upcoming. When it completes, every step is complete.
PDF receipt endpoint
Content-Type: application/pdf, Content-Disposition: attachment), generated on the fly with the same renderer as the authenticated endpoints — including full Chinese rendering (Noto Sans SC font). The PDF endpoint shares the same per-IP rate limit as the JSON one.
Privacy and security
Languages
The page and the PDF are fully trilingual — English, Spanish and Simplified Chinese:- Resolution (public chain):
?lang=/?locale=(invalid values are ignored, never 400), then payer cookiecbpay_pay_locale(HttpOnly=false, Secure, SameSite=Lax, 30 days), then the merchant account, then the orgdefault_locale, then Accept-Language, then English. The portal SSR cookiecbpay_langis a separate front cookie — the API does not read it. - The JSON API translates
fields/amountslabels server-side with the same parameter. - The PDF renders entirely in the requested language, Chinese included.
Legacy verification endpoint (unchanged)
GET /platform/v1/verify/receipts/{code} stays alive — nothing to migrate:
- A browser opening it (request with
Accept: text/html) receives a302redirect to the tracker page. - An API client receives the same JSON payload as always.
Errors
See the errors reference for the global error shape.
FAQ
Do I need an API key or sign-in to open a tracking link?
Do I need an API key or sign-in to open a tracking link?
No. The signed code in the URL is the credential. That’s what makes the link safe to share with your customer by email, chat or SMS.
Can someone enumerate transactions by guessing codes?
Can someone enumerate transactions by guessing codes?
No. Codes are HMAC-signed with 80 bits of entropy per transaction, invalid codes are indistinguishable from valid-but-nonexistent ones (uniform 404), and per-IP rate limiting blocks brute force.
Why does a transaction show 'processing' for longer than usual?
Why does a transaction show 'processing' for longer than usual?
processing covers every transient state, including internal compliance review. The public page intentionally does not distinguish review states — the operation will move to completed or failed when resolved.Does the timeline ever show estimated dates?
Does the timeline ever show estimated dates?
Never. Only real timestamps are rendered: when the transaction was created and when it reached its current terminal step. Intermediate steps show no date.
Is the legacy /verify/receipts link I already integrated going to break?
Is the legacy /verify/receipts link I already integrated going to break?
No. It keeps returning JSON for API clients and now redirects browsers to the tracker page. Both behaviors are permanent.
Can I hide the tracker and keep only the JSON verification?
Can I hide the tracker and keep only the JSON verification?
The tracker is the public face of the same signed code and is enabled platform-wide. If you prefer not to expose the hosted page, simply don’t share the URL — the JSON endpoint keeps working either way.
Receipts
How receipts are generated, their PDF layout and the verification QR.
Errors
Global error catalog and response shape.