Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.enso.build/llms.txt

Use this file to discover all available pages before exploring further.

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
CCIPGET /api/v1/ccip/bridge/checkstatus
CCTPGET /api/v1/cctp/bridge/checkstatus
RelayGET /api/v1/relay/bridge/checkstatus
StargateGET /api/v1/stargate/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" | "cctp"

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

Status Check Endpoints

GET /api/v1/cctp/bridge/check — Check Circle CCTP v2 bridge transaction status.
const API_KEY = process.env.ENSO_API_KEY;
const chainId = 8453; // Source chain (e.g., Base)
const txHash = "0x4ac72089..."; // Source transaction hash

const response = await fetch(
`https://api.enso.finance/api/v1/cctp/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.cctpTransferType); // "fast" | "standard" (executed mode)
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 (resolved from CCTP domain)
destinationTxHashstring?Destination tx hash (when minted)
cctpTransferType"fast" | "standard"?Reflects finalityThresholdExecuted (may differ from requested type)
depositForBurnobject?Raw depositForBurn params — present only when the source call had no hookData
depositForBurnDecodedobject?Decoded depositForBurn: token metadata, chain IDs, maxFee vs feeExecuted, finality info
depositForBurnWithHookobject?Raw depositForBurnWithHook params — present only when hookData is non-empty
depositForBurnWithHookDecodedobject?Decoded form including hookData.forwardingService (true when bytes match Circle’s cctp-forward magic)
ensoSourceEventobject | nullEnso execution event on source chain
errorstring?Error message if the check failed
Fast vs Standard detection: After the burn is attested, cctpTransferType is set from finalityThresholdExecuted (≤ 1000 = fast, ≥ 2000 = standard). This is the actual path Circle took — it can differ from your requested cctpTransferType if Fast allowance was exhausted or the source chain didn’t support Fast.
Manual claim: If a transfer gets stuck, call GET /api/v1/cctp/bridge/claim to get a ready-to-submit receiveMessage transaction for the destination chain. Both endpoints are rate-limited to 1 request per 10 seconds.
Upstream source: this endpoint is backed by Circle’s Iris GET /v2/messages/{sourceDomainId} — Enso wraps it with on-chain enrichment (token metadata, chain IDs decoded from CCTP domains, executed-fee vs requested-fee). See Circle’s supported blockchains matrix for which chains support Fast Transfer.
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.
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.

Callback Execution Events

Stargate, CCIP, and Relay include both ensoSourceEvent and ensoDestinationEvent in their responses — these track whether Enso’s callback logic executed successfully on each chain. CCTP returns only ensoSourceEvent (no Enso callback runs on the destination because CCTP doesn’t support post-bridge actions — the mint is a pure Circle receiveMessage).
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