Skip to main content
The Reporting API lets your server read the Blink deposits flowing into your platform and look up the users behind them. Two read-only, paginated endpoints:
  • GET /v1/merchant-users — your Blink users, with each user’s total deposited and the embedded wallets they used. Look a user up by their embedded wallet to answer “has this user deposited with Blink before?”
  • GET /v1/merchant-deposits — settled deposits across both funding rails, filterable by user, chain, and date range, each with the on-chain transactions that credited your wallet.
Both are scoped entirely to your merchant account and return only the data you need to reconcile deposits — never the source wallet a user paid from, nor the transaction that funded a deposit, nor any personally identifying information.
On the testnet sandbox? Swap the host for https://api-sandbox.blink.cash.

Authentication

Every request is authenticated with a signed X-Merchant-Authorization header — the same identity credential used across the server-to-server API. See Merchant Authentication for how to build it.

Typical flow

The two endpoints compose. To check whether a returning user has deposited before and then pull their history:
1

Look the user up by their embedded wallet

GET /v1/merchant-users?embeddedWalletAddress=0x1a5F…&chainId=8453. An empty items array means they have never deposited to you. A hit returns their userId and total deposited.
2

Pull that user's deposits

Take the userId from step 1 and call GET /v1/merchant-deposits?userId=<userId>.
The userId is an opaque Blink-internal identifier — stable for a given user, safe to store, and the join key between the two endpoints.

Pagination

Both endpoints are cursor-paginated. Each response includes a nextCursor:
  • If nextCursor is a string, pass it back as ?cursor=<nextCursor> to fetch the next page.
  • If nextCursor is null, you have reached the last page.
Use limit (1–100, default 25) to set the page size. Treat the cursor as opaque — don’t parse or construct it. Deposits are returned newest-first; users are returned in a stable order suitable for walking the full list.
GET https://api.blink.cash/v1/merchant-users Lists the users who have deposited to you, each with their total completed deposits and the distinct embedded wallets they deposited into. Supply embeddedWalletAddress (optionally narrowed by chainId) to return only the user owning that wallet.

Query parameters

Response

amounts holds bucketed totals: total (all statuses, gross intended) and completed (money actually received). More status facets (for example a pending breakdown) can be added later without a breaking change.

List deposits

GET https://api.blink.cash/v1/merchant-deposits Lists settled deposits into your platform, newest first. Deposits that have not landed are never returned. Both funding rails create a record long before money moves — a wallet deposit the moment it is authorized, a manual transfer the moment a user picks a source — and most are abandoned. Those are intents, not deposits, so status on every item is always completed. Both funding rails appear in one list, distinguished by type:
  • blink — the user paid from a wallet they connected to the Blink widget.
  • manual_transfer — the user sent funds to a Blink deposit address themselves, typically a withdrawal from an exchange.
One consequence follows from manual_transfer deposits having no signed-in user: userId is always null for them, so filtering by userId returns blink deposits only — and /v1/merchant-users totals likewise cover blink deposits only.

Query parameters

Response

transactions[]

Usually one element. A manual transfer sent straight to the deposit address can be funded by more than one transfer, and each one is its own settlement. Only transactions on your side of the deposit are listed. The transaction that funded a deposit is deliberately not exposed — it sits on the source chain and would identify the wallet your user paid from.
An empty transactions array does not mean the deposit has not settled. Reconcile on status, never on this array being non-empty.It is empty before a deposit settles, and also whenever the settlement transaction is not recoverable — for example when the routing provider reports success without returning a fill hash, when a same-chain same-token deposit’s funding transaction cannot be identified on-chain, or for deposits that completed before Blink began recording this. Deposits from before that point will show an empty array permanently.
Settled deposits only. Pending and failed deposits are not returned, so you never have to filter abandoned checkout attempts out of your reconciliation. If you need visibility into deposits that failed or were refunded, tell us — it is not exposed here today.

Response codes

Error shape

Errors use the standard Blink error envelope: