Skip to main content

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:
Anyone who has the link can open the page — no sign-in, no API key — and see the live status of that transaction with a step-by-step timeline, the full receipt detail and the option to download the PDF receipt. The {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. You never build the URL yourself — the platform hands it to you:
  1. verify_url in receipt payloads. When a transaction reaches a final state, its receipt includes verify_url. With the tracker enabled, that URL now points to https://business.cbpayapp.com/t/{code}.
  2. Receipt emails. The branded receipt email your customer receives carries the same link (“Verify online” / tracking button).
  3. The QR on every PDF receipt encodes the same code — scanning it opens the tracker.
Forward the link as-is to your customer, your support desk or your finance team. Everyone with the link sees the same page. Receipts and emails always carry the link, but you don’t need to download anything to get it: call GET /v1/track-link with the transaction’s kind and id to power a “Share link” button in your own UI.
Response 200 OK:
The 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:
No authentication. Response for a completed payout:

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

Returns the branded PDF receipt (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

The link is a capability: whoever has the link can see the transaction. Share it only with the intended recipient, the same way you would share the PDF receipt itself.

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 cookie cbpay_pay_locale (HttpOnly=false, Secure, SameSite=Lax, 30 days), then the merchant account, then the org default_locale, then Accept-Language, then English. The portal SSR cookie cbpay_lang is a separate front cookie — the API does not read it.
  • The JSON API translates fields/amounts labels 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 a 302 redirect to the tracker page.
  • An API client receives the same JSON payload as always.
New receipts and receipt emails generate tracker URLs directly; receipts issued before this change keep working forever through the redirect.

Errors

See the errors reference for the global error shape.

FAQ

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.
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.
Never. Only real timestamps are rendered: when the transaction was created and when it reached its current terminal step. Intermediate steps show no date.
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.
Last modified on August 18, 2026