GET /v1/onchain/{orderId}/fill
What the hub’s own observers saw on the chains, keyed by the on-chain order id. Unlike the
status reads, these routes are not scoped to your organization (chain data is public, and a refund
may be sent from another device than the one that ordered). They take your secret key or your
project id, so a web page can follow the orders it submits on chain itself.
Never send an empty id:
/onchain//fill is not a route.
Request
Path parameters
Response
data (OnchainFill):
EventFact is {chainDomain, txHash, blockNumber, observedAt}. observedAt is when the hub
stored the observation, not the block time. No amounts are served here (the GET /orders legs
carry them). The first observation of each event wins.
Behavior
The dating rule. An absent fact means “not observed (yet)”, never an error — with one guard: an absentfilled is only returned if the hub can date it.
- The hub finds the order’s destination chains from its observed Open (each output’s chain). With no usable Open, it uses every chain the deployment knows.
- For each of those chains it needs a published observer watermark no older than
infinity.chains.readMaxStalenessMs(default 30 000 ms). - If a destination chain cannot be resolved, or any watermark is missing or stale, the answer is
refused with
EIN0051— which means “cannot tell”, never “not filled”. - When
filledis present the watermarks are disclosure only.
Errors
This route never returns
EIN0009.
The gateway’s own refusals — a refused credential, a route not open to it, a rate limit, the hub unreachable or too slow — can come back from every route, with an EPX code and a real HTTP status (Errors — gateway codes); EIN0049 (internal, scrubbed) can come back from any route.
Example
Response
Illustrative values; formats follow the Response table.settled and refunded are absent: unobserved at this snapshot. watermarks holds only
eip155-56, the Open’s output chain.
See also
- SDK:
client.api.getOnchainFill();client.trackOrder()reads it for you (Tracking) - Refunds
- Order lifecycle