Skip to main content
After submitting a crosschain transaction via the Route or Bundle API, the bridge delivery is asynchronous. Enso provides protocol-specific status endpoints to track delivery progress on the destination chain.

Quick Reference

Bridge ProtocolStatus EndpointStatus Field
StargateGET /api/v1/stargate/bridge/checkstatus
CCIPGET /api/v1/ccip/bridge/checkstatus
RelayGET /api/v1/relay/bridge/checkstatus
All endpoints accept two query parameters:
  • chainId — source chain ID (number)
  • txHash — source transaction hash (string, 0x + 64 hex characters)
Rate limit: All bridge status endpoints are limited to 1 request per 10 seconds per API key (or per IP if unauthenticated). Exceeding this returns HTTP 429. Enforce a minimum 10-second interval between polls.

Status Lifecycle

Bridge transactions progress through a unified status lifecycle:
  • pending — Source transaction confirmed, bridge protocol hasn’t picked it up yet
  • inflight — Bridge protocol is processing the cross-chain message
  • delivered — Tokens and callbacks successfully delivered on the destination chain
  • failed — Bridge or callback execution failed (check error and ensoDestinationEvent for details)
  • unknown — Status could not be determined

Identifying the Bridge Protocol

When using the Route API, the response tells you which bridge was automatically selected:
  1. Check the route array for the hop where action === "bridge" — its protocol field contains the bridge protocol
  2. The bridgingEstimates array provides the protocol name and estimated delivery time
const route = await ensoClient.getRouteData({
  fromAddress: "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
  chainId: 1,
  destinationChainId: 8453,
  tokenIn: ["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"],
  tokenOut: ["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],
  amountIn: ["1000000000"],
  slippage: "300",
  routingStrategy: "delegate",
});

// Extract bridge protocol from the route hops
const bridgeHop = route.route.find((hop) => hop.action === "bridge");
const bridgeProtocol = bridgeHop?.protocol; // "stargate" | "ccip" | "relay"

// Get estimated delivery time (useful for initial polling delay)
const estimatedSeconds = route.bridgingEstimates?.[0]?.estimatedSeconds;

Status Check Endpoints

GET /api/v1/stargate/bridge/check — Check Stargate (LayerZero) bridge transaction status.
const API_KEY = process.env.ENSO_API_KEY;
const chainId = 1; // Source chain
const txHash = "0x80f1faf..."; // Source transaction hash

const response = await fetch(
  `https://api.enso.finance/api/v1/stargate/bridge/check?chainId=${chainId}&txHash=${txHash}`,
  {
    headers: { Authorization: `Bearer ${API_KEY}` },
  }
);
const data = await response.json();

console.log(data.status); // "pending" | "inflight" | "delivered" | "failed" | "unknown"
console.log(data.destinationTxHash); // Destination tx hash when delivered
Response fields:
FieldTypeDescription
statusstringpending / inflight / delivered / failed / unknown
sourceChainIdnumberSource chain ID
sourceTxHashstringSource transaction hash
destinationChainIdnumber?Destination chain ID (when known)
destinationTxHashstring?Destination tx hash (when delivered)
isMultiBridgeboolean?true for multi-hop bridge transactions
hopsarray?Individual hop details for multi-bridge transactions
layerZeroMessageobject?LayerZero message pathway and timing details
ensoSourceEventobject | nullEnso execution event on source chain
ensoDestinationEventobject | nullEnso callback execution event on destination
ensoMetadataobject?Request metadata (tokenIn, tokenOut, amountIn)
errorstring?Error message if something went wrong
Multi-hop support: Stargate supports multi-hop transactions (up to 5 sequential bridges). When isMultiBridge is true, the hops array contains per-hop status tracking with individual sourceChainId, destinationChainId, status, and layerZeroMessage fields.
GET /api/v1/relay/bridge/check — Check Relay bridge transaction status.
const API_KEY = process.env.ENSO_API_KEY;
const chainId = 1; // Source chain
const txHash = "0x94e5ea9..."; // Source transaction hash

const response = await fetch(
  `https://api.enso.finance/api/v1/relay/bridge/check?chainId=${chainId}&txHash=${txHash}`,
  {
    headers: { Authorization: `Bearer ${API_KEY}` },
  }
);
const data = await response.json();

console.log(data.status); // "pending" | "inflight" | "delivered" | "failed" | "unknown"
console.log(data.destinationTxHash); // Destination tx hash when delivered
Response fields:
FieldTypeDescription
statusstringpending / inflight / delivered / failed / unknown
sourceChainIdnumberSource chain ID
sourceTxHashstringSource transaction hash
destinationChainIdnumber?Destination chain ID
destinationTxHashstring?Destination tx hash (when delivered)
relayRequestobject?Relay details: raw status, user, recipient, in/out txs, fee breakdown, timestamps
ensoSourceEventobject | nullEnso execution event on source chain
ensoDestinationEventobject | nullEnso callback execution event on destination
errorstring?Error message if something went wrong
Fee breakdown: relayRequest.fees provides a detailed breakdown in wei (gas, fixed, price), and relayRequest.feesUsd gives USD equivalents for each component.

Callback Execution Events

All three protocols include ensoSourceEvent and ensoDestinationEvent in their responses. These track whether Enso’s callback logic executed successfully on each chain.
FieldValueMeaning
ensoSourceEventnullSource event not yet found
ensoSourceEvent.successtrueSource chain execution succeeded
ensoSourceEvent.successfalseSource chain execution failed — check error field
ensoDestinationEventnullDestination event not yet found (bridge still in transit)
ensoDestinationEvent.successtrueDestination callback executed successfully
ensoDestinationEvent.successfalseDestination callback failed — check error and refundDetails
When a callback fails, refundDetails provides information about where funds were sent:
{
  "refundDetails": {
    "token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
    "amount": "1000000000",
    "recipient": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
    "isNative": false
  }
}

Resources

Updated