Skip to main content
GET /intent-factory/status returns the status of one escrow that a continuation.settle node registered. The status comes unchanged from LI.FI’s settlement service (intent-factory). Use it to track a continuation, cross-chain or same-chain, to completion or refund. For the bridge of a cross-chain flow, poll LI.FI’s /v1/status.
LI.FI plans a dedicated settlement status endpoint, which can have a different path and response shape. This endpoint keeps working while you move to the new one.

Request

The endpoint lives on the Composer base URL, https://composer.li.quest. It is a read-only GET: polling it never changes the escrow.

Authentication

string
required
Your LI.FI API key, the same key you pass to createComposeSdk. A request without a key fails with 401. Keep the key on your server; see Before you start.

Query parameters

Both values come from the compile response: settlements[<settle id>].escrow.chainId and settlements[<settle id>].escrow.address. Together they identify one escrow.
integer
required
The chain the escrow lives on. A positive integer. For a bridge-funded settle node this is the bridge’s destination chain, not the chain the user signed on.
string
required
The escrow address: 0x followed by 40 hex characters. A mixed-case address must carry a valid EIP-55 checksum, or the request fails with 400. An all-lowercase address is always accepted, and the lookup ignores case.

Response

A 200 response wraps the escrow’s state in data:
boolean
true on a 200.
object

Status values

A new status value can be added in a minor Composer release. Handle unknown values in your client, for example by continuing to poll.

Typical paths

  • Happy path: AWAITING_FUNDS → READY → EXECUTING → COMPLETED. The destination flow runs at most once per escrow.
  • Funded but not run: AWAITING_FUNDS → EXPIRED → AWAITING_REFUND → REFUNDED for an escrow that holds funds below escrow.floor, and READY → EXPIRED → AWAITING_REFUND → REFUNDED for a READY escrow whose destination flow does not run before its expiry.
  • Never funded: AWAITING_FUNDS → EXPIRED, and it stays EXPIRED. There is nothing to refund. This happens when the user never sends the transaction, the bridge fails before delivering, or an external payer never pays.
  • Failed run: READY → EXECUTING → FAILED_FINAL → AWAITING_REFUND → REFUNDED. A temporary failure goes back to AWAITING_FUNDS and is retried until it succeeds, fails for good, or the escrow expires.
The refund is automatic and needs no action from the user. Funds that land after expiry are never used for a run. For about an hour after expiry (six checks, ten minutes apart), the settlement service keeps checking the escrow and refunds any balance it finds.
Do not send funds to an escrow after expiresAt. Funds that land after the settlement service stops checking, or after the escrow reached COMPLETED or REFUNDED, stay in the escrow, which escrow.owner controls; contact LI.FI support with the escrow’s chainId and address to recover them.

Errors

Errors use the same envelope: { "success": false, "error": { "type", "message" } }. Example 404:

What to show your user

Most statuses are steps your user doesn’t need to see. A pending screen needs about five states. Map the statuses to them, and adapt the copy to your flow: Treat an unknown status as Finishing and keep polling.

Polling

Poll the endpoint to read the escrow’s current state. Stop at COMPLETED or REFUNDED. A REFUND_FAILED refund is retried automatically a limited number of times, so keep polling for a while before you treat it as final. Also stop when the status is still EXPIRED well past expiresAt: the escrow was never funded. The settlement service keeps checking an expired escrow for about an hour (six checks, ten minutes apart), so the sample waits 90 minutes. On 503, wait the Retry-After seconds, then retry.
Call it with the escrow from the compile response: waitForEscrow(escrow.chainId, escrow.address).

See also