curl --request POST \
--url https://trails-api.sequence.app/rpc/Trails/GetIntent \
--header 'Content-Type: application/json' \
--header 'X-Access-Key: <api-key>' \
--data '
{
"intentId": "<string>"
}
'{
"intent": {
"id": 123,
"projectId": 123,
"intentId": "<string>",
"status": "QUOTED",
"quoteRequest": {
"ownerAddress": "<string>",
"originChainId": 123,
"originTokenAddress": "<string>",
"destinationChainId": 123,
"destinationTokenAddress": "<string>",
"destinationToAddress": "<string>",
"destinationCallData": "<string>",
"destinationCallValue": 123,
"originTokenAmount": 123,
"destinationTokenAmount": 123,
"tradeType": "EXACT_INPUT",
"onlyNativeGasFee": true,
"options": {
"swapProvider": "AUTO",
"bridgeProvider": "AUTO",
"slippageTolerance": 123,
"trailsAddressOverrides": {
"sequenceWalletFactoryAddress": "<string>",
"sequenceWalletMainModuleAddress": "<string>",
"sequenceWalletMainModuleUpgradableAddress": "<string>",
"sequenceWalletGuestModuleAddress": "<string>",
"sequenceWalletUtilsAddress": "<string>"
}
}
},
"ownerAddress": "<string>",
"originChainId": 123,
"destinationChainId": 123,
"originIntentAddress": "<string>",
"salt": 123,
"depositTransaction": {
"toAddress": "<string>",
"tokenAddress": "<string>",
"amount": 123,
"decimals": 123
},
"originCalls": {
"chainId": 123,
"calls": [
{
"to": "<string>",
"value": 123,
"data": "<string>",
"gasLimit": 123,
"delegateCall": true,
"onlyFallback": true,
"behaviorOnError": 123
}
],
"space": 123,
"nonce": 123
},
"originPrecondition": {
"type": "<string>",
"chainId": 123,
"ownerAddress": "<string>",
"tokenAddress": "<string>",
"minAmount": 123
},
"originMetaTxn": {
"id": "<string>",
"chainId": 123,
"walletAddress": "<string>",
"contract": "<string>",
"input": "<string>"
},
"quote": {
"routeProviders": [
"AUTO"
],
"routeProvidersRequestIds": [
"<string>"
],
"routeProvidersFeeUsd": [
123
],
"quoteProvider": "<string>",
"quoteProviderRequestId": "<string>",
"quoteProviderFeeUsd": 123,
"fromAmount": 123,
"fromAmountMin": 123,
"toAmount": 123,
"toAmountMin": 123,
"maxSlippage": 123,
"priceImpact": 123,
"priceImpactUsd": 123
},
"fees": {
"originGas": {
"chainId": 123,
"totalGasLimit": 123,
"gasPrice": 123,
"nativeTokenSymbol": "<string>",
"chainGasUsageStatus": "NORMAL",
"totalFeeAmount": 123,
"totalFeeUsd": "<string>",
"metaTxnFeeDetails": {
"metaTxnId": "<string>",
"estimatedGasLimit": 123,
"feeNative": 123
},
"metaTxnGasQuote": "<string>",
"nativeTokenPriceUsd": 123
},
"provider": {
"quoteProvider": "<string>",
"quoteProviderFee": 123,
"quoteProviderFeeUsd": 123,
"trailsFee": 123,
"trailsFeeUsd": 123,
"totalFeeAmount": 123,
"totalFeeUsd": 123
},
"feeTokenAddress": "<string>",
"feeTokenTotal": 123,
"totalFeeAmount": 123,
"totalFeeUsd": 123,
"destinationGas": {
"chainId": 123,
"totalGasLimit": 123,
"gasPrice": 123,
"nativeTokenSymbol": "<string>",
"chainGasUsageStatus": "NORMAL",
"totalFeeAmount": 123,
"totalFeeUsd": "<string>",
"metaTxnFeeDetails": {
"metaTxnId": "<string>",
"estimatedGasLimit": 123,
"feeNative": 123
},
"metaTxnGasQuote": "<string>",
"nativeTokenPriceUsd": 123
}
},
"trailsVersion": "<string>",
"expiresAt": "<string>",
"destinationIntentAddress": "<string>",
"destinationCalls": {
"chainId": 123,
"calls": [
{
"to": "<string>",
"value": 123,
"data": "<string>",
"gasLimit": 123,
"delegateCall": true,
"onlyFallback": true,
"behaviorOnError": 123
}
],
"space": 123,
"nonce": 123
},
"destinationPrecondition": {
"type": "<string>",
"chainId": 123,
"ownerAddress": "<string>",
"tokenAddress": "<string>",
"minAmount": 123
},
"destinationMetaTxn": {
"id": "<string>",
"chainId": 123,
"walletAddress": "<string>",
"contract": "<string>",
"input": "<string>"
},
"updatedAt": "<string>",
"createdAt": "<string>"
}
}Retrieve a specific intent by ID
curl --request POST \
--url https://trails-api.sequence.app/rpc/Trails/GetIntent \
--header 'Content-Type: application/json' \
--header 'X-Access-Key: <api-key>' \
--data '
{
"intentId": "<string>"
}
'{
"intent": {
"id": 123,
"projectId": 123,
"intentId": "<string>",
"status": "QUOTED",
"quoteRequest": {
"ownerAddress": "<string>",
"originChainId": 123,
"originTokenAddress": "<string>",
"destinationChainId": 123,
"destinationTokenAddress": "<string>",
"destinationToAddress": "<string>",
"destinationCallData": "<string>",
"destinationCallValue": 123,
"originTokenAmount": 123,
"destinationTokenAmount": 123,
"tradeType": "EXACT_INPUT",
"onlyNativeGasFee": true,
"options": {
"swapProvider": "AUTO",
"bridgeProvider": "AUTO",
"slippageTolerance": 123,
"trailsAddressOverrides": {
"sequenceWalletFactoryAddress": "<string>",
"sequenceWalletMainModuleAddress": "<string>",
"sequenceWalletMainModuleUpgradableAddress": "<string>",
"sequenceWalletGuestModuleAddress": "<string>",
"sequenceWalletUtilsAddress": "<string>"
}
}
},
"ownerAddress": "<string>",
"originChainId": 123,
"destinationChainId": 123,
"originIntentAddress": "<string>",
"salt": 123,
"depositTransaction": {
"toAddress": "<string>",
"tokenAddress": "<string>",
"amount": 123,
"decimals": 123
},
"originCalls": {
"chainId": 123,
"calls": [
{
"to": "<string>",
"value": 123,
"data": "<string>",
"gasLimit": 123,
"delegateCall": true,
"onlyFallback": true,
"behaviorOnError": 123
}
],
"space": 123,
"nonce": 123
},
"originPrecondition": {
"type": "<string>",
"chainId": 123,
"ownerAddress": "<string>",
"tokenAddress": "<string>",
"minAmount": 123
},
"originMetaTxn": {
"id": "<string>",
"chainId": 123,
"walletAddress": "<string>",
"contract": "<string>",
"input": "<string>"
},
"quote": {
"routeProviders": [
"AUTO"
],
"routeProvidersRequestIds": [
"<string>"
],
"routeProvidersFeeUsd": [
123
],
"quoteProvider": "<string>",
"quoteProviderRequestId": "<string>",
"quoteProviderFeeUsd": 123,
"fromAmount": 123,
"fromAmountMin": 123,
"toAmount": 123,
"toAmountMin": 123,
"maxSlippage": 123,
"priceImpact": 123,
"priceImpactUsd": 123
},
"fees": {
"originGas": {
"chainId": 123,
"totalGasLimit": 123,
"gasPrice": 123,
"nativeTokenSymbol": "<string>",
"chainGasUsageStatus": "NORMAL",
"totalFeeAmount": 123,
"totalFeeUsd": "<string>",
"metaTxnFeeDetails": {
"metaTxnId": "<string>",
"estimatedGasLimit": 123,
"feeNative": 123
},
"metaTxnGasQuote": "<string>",
"nativeTokenPriceUsd": 123
},
"provider": {
"quoteProvider": "<string>",
"quoteProviderFee": 123,
"quoteProviderFeeUsd": 123,
"trailsFee": 123,
"trailsFeeUsd": 123,
"totalFeeAmount": 123,
"totalFeeUsd": 123
},
"feeTokenAddress": "<string>",
"feeTokenTotal": 123,
"totalFeeAmount": 123,
"totalFeeUsd": 123,
"destinationGas": {
"chainId": 123,
"totalGasLimit": 123,
"gasPrice": 123,
"nativeTokenSymbol": "<string>",
"chainGasUsageStatus": "NORMAL",
"totalFeeAmount": 123,
"totalFeeUsd": "<string>",
"metaTxnFeeDetails": {
"metaTxnId": "<string>",
"estimatedGasLimit": 123,
"feeNative": 123
},
"metaTxnGasQuote": "<string>",
"nativeTokenPriceUsd": 123
}
},
"trailsVersion": "<string>",
"expiresAt": "<string>",
"destinationIntentAddress": "<string>",
"destinationCalls": {
"chainId": 123,
"calls": [
{
"to": "<string>",
"value": 123,
"data": "<string>",
"gasLimit": 123,
"delegateCall": true,
"onlyFallback": true,
"behaviorOnError": 123
}
],
"space": 123,
"nonce": 123
},
"destinationPrecondition": {
"type": "<string>",
"chainId": 123,
"ownerAddress": "<string>",
"tokenAddress": "<string>",
"minAmount": 123
},
"destinationMetaTxn": {
"id": "<string>",
"chainId": 123,
"walletAddress": "<string>",
"contract": "<string>",
"input": "<string>"
},
"updatedAt": "<string>",
"createdAt": "<string>"
}
}GetIntent endpoint retrieves the complete intent object for a specific intent ID. This provides all the details about the intent including quote information, fee breakdown, transaction calls, and metadata.
const intentResponse = await fetch('https://trails-api.sequence.app/rpc/Trails/GetIntent', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Access-Key': 'YOUR_ACCESS_KEY'
},
body: JSON.stringify({
intentId: 'intent_123abc'
})
});
const { intent } = await intentResponse.json();
console.log('Intent ID:', intent.intentId);
console.log('Status:', intent.status);
console.log('Owner:', intent.ownerAddress);
console.log('Expires:', intent.expiresAt);
// Quote information
console.log('From Amount:', intent.quote.fromAmount);
console.log('To Amount:', intent.quote.toAmount);
console.log('Price Impact:', intent.quote.priceImpact);
// Fee breakdown
console.log('Total Fee (USD):', intent.fees.totalFeeUsd);
console.log('Origin Gas Fee:', intent.fees.originGas.totalFeeUsd);
console.log('Destination Gas Fee:', intent.fees.destinationGas?.totalFeeUsd);
console.log('Provider Fee:', intent.fees.provider.totalFeeUsd);
function analyzeFees(intent: Intent) {
const fees = intent.fees;
console.log('=== Fee Breakdown ===');
// Gas fees
console.log('\nOrigin Chain Gas:');
console.log(' Chain ID:', fees.originGas.chainId);
console.log(' Gas Limit:', fees.originGas.totalGasLimit);
console.log(' Gas Price:', fees.originGas.gasPrice);
console.log(' Native Token:', fees.originGas.nativeTokenSymbol);
console.log(' Cost (USD):', fees.originGas.totalFeeUsd);
console.log(' Network Status:', fees.originGas.chainGasUsageStatus);
console.log('\nDestination Chain Gas:');
console.log(' Chain ID:', fees.destinationGas?.chainId);
console.log(' Gas Limit:', fees.destinationGas?.totalGasLimit);
console.log(' Gas Price:', fees.destinationGas?.gasPrice);
console.log(' Native Token:', fees.destinationGas?.nativeTokenSymbol);
console.log(' Cost (USD):', fees.destinationGas?.totalFeeUsd);
console.log(' Network Status:', fees.destinationGas?.chainGasUsageStatus);
// Provider fees
console.log('\nProvider Fees:');
console.log(' Quote Provider:', fees.provider.quoteProvider);
console.log(' Provider Fee:', fees.provider.quoteProviderFeeUsd, 'USD');
console.log(' Trails Fee:', fees.provider.trailsFeeUsd, 'USD');
console.log(' Total Provider:', fees.provider.totalFeeUsd, 'USD');
// Grand total
console.log('\n=== TOTAL ===');
console.log('Fee Token:', fees.feeTokenAddress);
console.log('Total Amount:', fees.totalFeeAmount);
console.log('Total USD:', fees.totalFeeUsd);
}
const { intent } = await getIntent('intent_123abc');
analyzeFees(intent);
function inspectCalls(intent: Intent) {
console.log('=== Transaction Origin Calls ===\n');
console.log('Origin Chain ID:', intent.originCalls.chainId);
console.log('Origin Space:', intent.originCalls.space);
console.log('Origin Nonce:', intent.originCalls.nonce);
console.log('Origin Calls:', intent.originCalls.calls.length);
intent.originCalls.calls.forEach((call, callIndex) => {
console.log(`\n Call ${callIndex + 1}:`);
console.log(' To:', call.to);
console.log(' Value:', call.value);
console.log(' Data:', call.data);
console.log(' Gas Limit:', call.gasLimit);
console.log(' Delegate:', call.delegateCall);
});
console.log('=== Transaction Destination Calls ===\n');
console.log('Destination Chain ID:', intent.destinationCalls?.chainId);
console.log('Destination Space:', intent.destinationCalls?.space);
console.log('Destination Nonce:', intent.destinationCalls?.nonce);
console.log('Destination Calls:', intent.destinationCalls?.calls.length);
intent.destinationCalls?.calls.forEach((call, callIndex) => {
console.log(`\n Call ${callIndex + 1}:`);
console.log(' To:', call.to);
console.log(' Value:', call.value);
console.log(' Data:', call.data);
console.log(' Gas Limit:', call.gasLimit);
console.log(' Delegate:', call.delegateCall);
});
}
const { intent } = await getIntent('intent_123abc');
inspectCalls(intent);
import { TrailsApi, type Intent } from "@0xtrails/api";
import { useEffect, useState } from "react";
const trailsApi = new TrailsApi('YOUR_API_KEY')
export const IntentSummary = ({ intentId }: { intentId: string }) => {
const [intent, setIntent] = useState<Intent | null>(null);
useEffect(() => {
trailsApi.getIntent({ intentId }).then(({ intent }) => setIntent(intent));
}, [intentId]);
if (!intent) return <div>Loading...</div>;
return (
<div>
<h2>Intent {intent.intentId}</h2>
<div>Status: {intent.status}</div>
<div>From: Chain {intent.quoteRequest.originChainId}</div>
<div>To: Chain {intent.quoteRequest.destinationChainId}</div>
<div>Amount: {intent.quote.fromAmount} → {intent.quote.toAmount}</div>
<div>Total Fee: ${intent.fees.totalFeeUsd}</div>
<div>Expires: {new Date(intent.expiresAt).toLocaleString()}</div>
</div>
);
}
import { TrailsApi } from "@0xtrails/api";
const trailsApi = new TrailsApi('YOUR_API_KEY')
export async function verifyBeforeSigning(intentId: string) {
const { intent } = await trailsApi.getIntent({ intentId });
// Check expiration
const expiresAt = new Date(intent.expiresAt);
const now = new Date();
if (expiresAt < now) {
throw new Error('Intent has expired');
}
// Check fees are reasonable
if (intent.fees.totalFeeUsd > 10) {
console.warn('High fees detected:', intent.fees.totalFeeUsd);
}
const slippage = (intent.quote.fromAmount - intent.quote.fromAmountMin) / intent.quote.fromAmount;
// Check if slippage is greater than 5%
if (slippage > 0.05) {
console.warn('High slippage:', slippage * BigInt(100), '%');
}
return intent;
}
GetIntentReceipt to check execution status and get transaction hashesSearchIntents to find all intents for a specific addressAPI Key for authenticating requests, get an access key at https://trails.build and request early access
Successful response
Show child attributes
Represented as uint8 on the server side
QUOTED, COMMITTED, EXECUTING, FAILED, SUCCEEDED Show child attributes
Represented as string on the server side
EXACT_INPUT, EXACT_OUTPUT Show child attributes
Represented as string on the server side
AUTO, CCTP, LIFI, RELAY, SUSHI, ZEROX Represented as string on the server side
AUTO, CCTP, LIFI, RELAY, SUSHI, ZEROX Show child attributes
Show child attributes
[]TransactionCall
Show child attributes
Show child attributes
[]RouteProvider
Represented as string on the server side
AUTO, CCTP, LIFI, RELAY, SUSHI, ZEROX []string
[]float64
Show child attributes
Show child attributes
Represented as string on the server side
NORMAL, BUSY, VERY_BUSY Show child attributes
Show child attributes
Represented as string on the server side
NORMAL, BUSY, VERY_BUSY Show child attributes
[]TransactionCall
Show child attributes
Was this page helpful?