# Track any transfer

> Look up any bridge or aggregator transfer by its source transaction, not only LayerHop orders, and get its status, the destination transaction and the next step.

Source: https://docs.layerhop.com/guides/track-transfers

"Where's my money?" is the most common question after a bridge. [`GET /v1/track/{txHash}`](/api-reference#track-any-bridge-transfer) answers it for any transfer, from any app, given the transaction the user sent on the source chain (an EVM hash or a Solana signature). The same tool runs at [layerhop.com/track](https://layerhop.com/track) and [app.layerhop.com/track](https://app.layerhop.com/track).

```bash
curl "https://api.layerhop.com/v1/track/0xd9a702a19c7ce879cf38ea79ea4a2ddae514ea3736f725221fe7d6a2269c3c60?chain=soneium"
```

```json
{
  "txHash": "0xd9a702a19c7ce879cf38ea79ea4a2ddae514ea3736f725221fe7d6a2269c3c60",
  "chainId": 1868,
  "source": "success",
  "protocol": { "id": "lifi", "name": "LI.FI", "via": "across", "supportUrl": "https://help.li.fi" },
  "status": "filled",
  "dstChainId": 8453,
  "dstTxHash": "0x066e173cec4e7bbc0109529c056c83d203170771aeaf1912d2500564b8095406",
  "next": { "kind": "done", "message": "Delivered. The funds arrived on the destination chain.", "url": "https://basescan.org/tx/0x066e…5406" },
  "sources": ["lifi", "across"]
}
```

## How it works

1. **Find the transaction.** On `chain` when you pass it, otherwise on about 30 popular chains at once (passing `chain` is faster). Solana signatures are looked up on Solana.
2. **Detect the protocol** from the contract the transaction called and the events it emitted: LI.FI's `LiFiTransferStarted`, Across `FundsDeposited`, LayerZero `PacketSent` (Stargate and other OFTs), Circle CCTP v2 `MessageSent`, Wormhole `LogMessagePublished`, native-bridge deposits and withdrawals, and the Mayan, deBridge and Gas.zip contracts. The contract the user called wins over what it used underneath (Mayan over CCTP), and an aggregator's own event wins over the bridge it routed through (LI.FI via Across).
3. **Ask the protocols** through their public status APIs: Relay, LI.FI, Across, deBridge DLN, Mayan, LayerZero Scan, Wormholescan, Circle's attestation service (plus the destination chain, to see whether the message was received) and Gas.zip. Native-bridge withdrawals are read on chain, the same way as [Recover](/guides/recover-withdrawals).

LayerHop's own orders keep their existing path ([`GET /v1/orders/{provider}/{id}`](/api-reference#get-order-status)) and come back with `protocol.id: "layerhop"` and `layerhopProvider`.

## Status and next step

| `status` | Meaning |
| --- | --- |
| `pending` | In flight. |
| `filled` | Delivered; `dstTxHash` when the protocol reports it. |
| `refunded` | Returned on the source chain; `refundTxHash` when known. |
| `failed` | The protocol reports a failure (or the source transaction reverted: `source: "reverted"`). |
| `needs_claim` | Waiting for a second transaction: a native-bridge withdrawal, or a Wormhole Portal transfer nobody redeemed after an hour, or an attested CCTP message not yet received. |
| `unknown` | Not found, or no protocol has indexed it yet. |

`next.kind` turns that into one instruction for the user, with `next.url` where to act:

- `wait`: in progress and within the usual time (`typicalSeconds`).
- `late`: pending for more than 3× the usual time (and at least 15 minutes): contact the protocol's support with the transaction hash.
- `claim`: a native withdrawal goes to [Recover](https://app.layerhop.com/recover); other claims to the protocol's own site.
- `refunded`, `support` (failed), `source_failed` (reverted on the source chain, only gas was spent), `done`.
- `not_found` / `unrecognized`: we couldn't find the transaction, or found it but couldn't match a bridge we track.

## Limits

Answers are cached: 20 seconds while a transfer can still change, 10 minutes once it's final, and 5 minutes for a hash that no chain and no protocol knows (pass `chain` right after sending if the transaction is that fresh). At most 20 uncached lookups per IP per minute, within a budget shared by all clients (a busy tracker answers `RATE_LIMITED` with `retry-after`). Without `chain`, an EVM hash is looked for on the 8 most used chains first and on the others only while a shared budget lasts, so passing `chain` is faster and always complete. Relay looks transactions up through `GET /requests/v3` when the operator sets `TRACK_RELAY_API_KEY` (a key only for the tracker); without one it uses the keyless v2, which Relay throttles and retires on 2026-11-24. Arbitrum *deposits* are reported as in progress with the usual 10–15 minutes; we don't check their retryable ticket, so a late one points to the Arbitrum bridge.
