curl --request POST \
--url https://api.example.com/rpc/Trails/SearchIntents \
--header 'Content-Type: application/json' \
--data '
{
"byIntentId": "<string>",
"byProjectId": 123,
"byTransactionHash": "<string>",
"byOwnerAddress": "<string>",
"byOriginIntentAddress": "<string>",
"byDestinationIntentAddress": "<string>",
"byQueryString": "<string>"
}
'{
"intents": [
{
"id": 123,
"projectId": 123,
"intentId": "<string>",
"status": "QUOTED",
"quoteRequest": {
"ownerAddress": "<string>",
"originChainId": 123,
"originTokenAddress": "<string>",
"destinationChainId": 123,
"destinationTokenAddress": "<string>",
"destinationToAddress": "<string>",
"destinationApproveAddress": "<string>",
"destinationCallData": "<string>",
"destinationCallValue": 123,
"originTokenAmount": 123,
"destinationTokenAmount": 123,
"tradeType": "EXACT_INPUT",
"fundMethod": "WALLET",
"onlyNativeGasFee": true,
"options": {
"intentProtocol": "v1",
"swapProvider": "AUTO",
"bridgeProvider": "AUTO",
"swapProviderFallback": true,
"bridgeProviderFallback": true,
"preference": "RECOMMENDED",
"slippageTolerance": 123,
"trailsAddressOverrides": {
"sequenceWalletFactoryAddress": "<string>",
"sequenceWalletMainModuleAddress": "<string>",
"sequenceWalletMainModuleUpgradableAddress": "<string>",
"sequenceWalletGuestModuleAddress": "<string>",
"sequenceWalletUtilsAddress": "<string>"
}
}
},
"ownerAddress": "<string>",
"originChainId": 123,
"destinationChainId": 123,
"originTokenAddress": "<string>",
"destinationTokenAddress": "<string>",
"originIntentAddress": "<string>",
"salt": 123,
"depositTransaction": {
"toAddress": "<string>",
"tokenAddress": "<string>",
"amount": 123,
"chainId": 123,
"to": "<string>",
"data": "<string>",
"value": 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>",
"bridgeGas": 123
},
"quote": {
"routeProviders": [
"AUTO"
],
"routeProvidersRequestIds": [
"<string>"
],
"routeProvidersFeeUsd": [
123
],
"fromAmount": 123,
"fromAmountMin": 123,
"fromAmountUsd": 123,
"fromAmountMinUsd": 123,
"toAmount": 123,
"toAmountMin": 123,
"toAmountUsd": 123,
"toAmountMinUsd": 123,
"maxSlippage": 123,
"priceImpact": 123,
"priceImpactUsd": 123,
"priceImpactDetails": {
"executionPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
},
"marketPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
},
"providerFeesPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
},
"trailsFeesPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
},
"netPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
}
},
"estimatedDuration": 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,
"quoteProviderWithTrailsFee": 123,
"providerWithTrailsFeeUsd": 123,
"totalFeeAmount": 123,
"totalFeeUsd": 123
},
"feeTokenAddress": "<string>",
"feeTokenAmount": 123,
"feeTokenUsd": 123,
"feeTokenTotal": 123,
"gasFeeTotal": 123,
"gasFeeUsd": 123,
"trailsFeeTotal": 123,
"trailsFeeUsd": 123,
"collectorFeeTotal": 123,
"collectorFeeUsd": 123,
"providerFeeTotal": 123,
"providerFeeUsd": 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>",
"trailsContracts": {
"trailsIntentEntrypointAddress": "<string>",
"trailsRouterAddress": "<string>",
"trailsRouterShimAddress": "<string>",
"trailsUtilsAddress": "<string>"
},
"expiresAt": "<string>",
"destinationIntentAddress": "<string>",
"passthrough": true,
"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>",
"bridgeGas": 123
},
"intentProtocol": "v1",
"updatedAt": "<string>",
"createdAt": "<string>"
}
]
}curl --request POST \
--url https://api.example.com/rpc/Trails/SearchIntents \
--header 'Content-Type: application/json' \
--data '
{
"byIntentId": "<string>",
"byProjectId": 123,
"byTransactionHash": "<string>",
"byOwnerAddress": "<string>",
"byOriginIntentAddress": "<string>",
"byDestinationIntentAddress": "<string>",
"byQueryString": "<string>"
}
'{
"intents": [
{
"id": 123,
"projectId": 123,
"intentId": "<string>",
"status": "QUOTED",
"quoteRequest": {
"ownerAddress": "<string>",
"originChainId": 123,
"originTokenAddress": "<string>",
"destinationChainId": 123,
"destinationTokenAddress": "<string>",
"destinationToAddress": "<string>",
"destinationApproveAddress": "<string>",
"destinationCallData": "<string>",
"destinationCallValue": 123,
"originTokenAmount": 123,
"destinationTokenAmount": 123,
"tradeType": "EXACT_INPUT",
"fundMethod": "WALLET",
"onlyNativeGasFee": true,
"options": {
"intentProtocol": "v1",
"swapProvider": "AUTO",
"bridgeProvider": "AUTO",
"swapProviderFallback": true,
"bridgeProviderFallback": true,
"preference": "RECOMMENDED",
"slippageTolerance": 123,
"trailsAddressOverrides": {
"sequenceWalletFactoryAddress": "<string>",
"sequenceWalletMainModuleAddress": "<string>",
"sequenceWalletMainModuleUpgradableAddress": "<string>",
"sequenceWalletGuestModuleAddress": "<string>",
"sequenceWalletUtilsAddress": "<string>"
}
}
},
"ownerAddress": "<string>",
"originChainId": 123,
"destinationChainId": 123,
"originTokenAddress": "<string>",
"destinationTokenAddress": "<string>",
"originIntentAddress": "<string>",
"salt": 123,
"depositTransaction": {
"toAddress": "<string>",
"tokenAddress": "<string>",
"amount": 123,
"chainId": 123,
"to": "<string>",
"data": "<string>",
"value": 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>",
"bridgeGas": 123
},
"quote": {
"routeProviders": [
"AUTO"
],
"routeProvidersRequestIds": [
"<string>"
],
"routeProvidersFeeUsd": [
123
],
"fromAmount": 123,
"fromAmountMin": 123,
"fromAmountUsd": 123,
"fromAmountMinUsd": 123,
"toAmount": 123,
"toAmountMin": 123,
"toAmountUsd": 123,
"toAmountMinUsd": 123,
"maxSlippage": 123,
"priceImpact": 123,
"priceImpactUsd": 123,
"priceImpactDetails": {
"executionPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
},
"marketPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
},
"providerFeesPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
},
"trailsFeesPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
},
"netPriceImpact": {
"priceImpact": 123,
"priceImpactUsd": 123
}
},
"estimatedDuration": 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,
"quoteProviderWithTrailsFee": 123,
"providerWithTrailsFeeUsd": 123,
"totalFeeAmount": 123,
"totalFeeUsd": 123
},
"feeTokenAddress": "<string>",
"feeTokenAmount": 123,
"feeTokenUsd": 123,
"feeTokenTotal": 123,
"gasFeeTotal": 123,
"gasFeeUsd": 123,
"trailsFeeTotal": 123,
"trailsFeeUsd": 123,
"collectorFeeTotal": 123,
"collectorFeeUsd": 123,
"providerFeeTotal": 123,
"providerFeeUsd": 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>",
"trailsContracts": {
"trailsIntentEntrypointAddress": "<string>",
"trailsRouterAddress": "<string>",
"trailsRouterShimAddress": "<string>",
"trailsUtilsAddress": "<string>"
},
"expiresAt": "<string>",
"destinationIntentAddress": "<string>",
"passthrough": true,
"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>",
"bridgeGas": 123
},
"intentProtocol": "v1",
"updatedAt": "<string>",
"createdAt": "<string>"
}
]
}SearchIntents endpoint allows you to search for intents using various criteria such as owner address, intent address, or deposit transaction hash. This is useful for finding all intents associated with a wallet or tracking specific transactions.
GetIntent endpoint.
const searchResponse = await fetch('https://trails-api.sequence.app/rpc/Trails/SearchIntents', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Access-Key': 'YOUR_ACCESS_KEY'
},
body: JSON.stringify({
byOwnerAddress: '0x0709CF2d5D4f3D38f5948d697fE64d7FB3639Eb1'
})
});
const { intents } = await searchResponse.json();
console.log(`Found ${intents.length} intents`);
intents.forEach(intent => {
console.log(`Intent ${intent.intentId}: ${intent.status}`);
});
const searchResponse = await fetch('https://trails-api.sequence.app/rpc/Trails/SearchIntents', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Access-Key': 'YOUR_ACCESS_KEY'
},
body: JSON.stringify({
byDepositTransactionHash: '0x1234567890abcdef...'
})
});
const { intents } = await searchResponse.json();
if (intents.length > 0) {
console.log('Found intent:', intents[0].intentId);
console.log('Status:', intents[0].status);
} else {
console.log('No intent found for this transaction');
}
const searchResponse = await fetch('https://trails-api.sequence.app/rpc/Trails/SearchIntents', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Access-Key': 'YOUR_ACCESS_KEY'
},
body: JSON.stringify({
byOriginIntentAddress: '0xabcdef1234567890...'
})
});
const { intents } = await searchResponse.json();
console.log('Found intents:', intents.map(i => i.intentId));
async function getTransactionHistory(userAddress: string) {
const { intents } = await fetch('https://trails-api.sequence.app/rpc/Trails/SearchIntents', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Access-Key': 'YOUR_ACCESS_KEY'
},
body: JSON.stringify({
byOwnerAddress: userAddress
})
}).then(r => r.json());
// Sort by creation date (newest first)
const sorted = intents.sort((a, b) =>
new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()
);
// Format for display
return sorted.map(intent => ({
id: intent.intentId,
status: intent.status,
fromChain: intent.quoteRequest.originChainId,
toChain: intent.quoteRequest.destinationChainId,
fromAmount: intent.quote.fromAmount,
toAmount: intent.quote.toAmount,
totalFees: intent.fees.totalFeeUsd,
createdAt: intent.createdAt,
expiresAt: intent.expiresAt
}));
}
const history = await getTransactionHistory('0x0709CF2d5D4f3D38f5948d697fE64d7FB3639Eb1');
console.table(history);
import { useState, useEffect } from 'react';
import type { Intent } from '0xtrails';
function IntentHistory({ userAddress }: { userAddress: string }) {
const [intents, setIntents] = useState<Intent[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function loadIntents() {
try {
const response = await fetch(
'https://trails-api.sequence.app/rpc/Trails/SearchIntents',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Access-Key': 'YOUR_ACCESS_KEY'
},
body: JSON.stringify({
byOwnerAddress: userAddress
})
}
);
const { intents } = await response.json();
setIntents(intents);
} catch (error) {
console.error('Failed to load intents:', error);
} finally {
setLoading(false);
}
}
loadIntents();
}, [userAddress]);
if (loading) return <div>Loading...</div>;
return (
<div className="intent-history">
<h2>Transaction History</h2>
{intents.length === 0 ? (
<p>No transactions found</p>
) : (
<ul>
{intents.map(intent => (
<li key={intent.intentId}>
<div>
<strong>{intent.intentId}</strong>
<span className={`status-${intent.status.toLowerCase()}`}>
{intent.status}
</span>
</div>
<div>
Chain {intent.quoteRequest.originChainId} →
Chain {intent.quoteRequest.destinationChainId}
</div>
<div>
{intent.quote.fromAmount} → {intent.quote.toAmount}
</div>
<div>
Fee: ${intent.fees.totalFeeUsd}
</div>
<div>
{new Date(intent.createdAt).toLocaleString()}
</div>
</li>
))}
</ul>
)}
</div>
);
}
import { TrailsApi, type Intent } from '@0xtrails/api'
const trailsApi = new TrailsApi('YOUR_API_KEY')
async function analyzeUserActivity(userAddress: string) {
const { intents } = await trailsApi.searchIntents({ byOwnerAddress: userAddress });
const stats = {
total: intents.length,
succeeded: intents.filter((i: Intent) => i.status === 'SUCCEEDED').length,
failed: intents.filter((i: Intent) => i.status === 'FAILED').length,
pending: intents.filter((i: Intent) =>
['QUOTED', 'COMMITTED', 'EXECUTING'].includes(i.status)
).length,
totalVolume: intents.reduce((sum: number, i: Intent) => sum + Number(i.quote.fromAmount), 0),
totalFees: intents.reduce((sum: number, i: Intent) => sum + (i.fees.totalFeeUsd), 0),
chains: [...new Set(intents.flatMap((i: Intent) =>
[i.quoteRequest.originChainId, i.quoteRequest.destinationChainId]
))],
providers: [...new Set(intents.map((i: Intent) => i.quote.quoteProvider))]
};
return stats;
}
const stats = await analyzeUserActivity('0x0709CF2d5D4f3D38f5948d697fE64d7FB3639Eb1');
console.log('User Activity:', stats);
SearchIntents endpoint may return a large number of results for active addresses. Consider implementing client-side pagination or using GetIntentHistory for paginated results.createdAt timestamps to filter by date rangeimport { TrailsApi, type Intent } from '@0xtrails/api'
const trailsApi = new TrailsApi('YOUR_API_KEY')
async function getRecentActiveIntents(userAddress: string, hoursAgo: number = 24) {
const { intents } = await trailsApi.searchIntents({ byOwnerAddress: userAddress });
const cutoff = Date.now() - (hoursAgo * 60 * 60 * 1000);
return intents
.filter((i: Intent) => i.createdAt && new Date(i.createdAt).getTime() > cutoff)
.filter((i: Intent) => ['COMMITTED', 'EXECUTING'].includes(i.status))
.sort((a, b) =>
new Date(b.createdAt ?? '').getTime() - new Date(a.createdAt ?? '').getTime()
);
}
const activeIntents = await getRecentActiveIntents(userAddress, 24);
console.log('Active intents in last 24h:', activeIntents.length);
GetIntentHistory endpoint instead.GetIntent to get full details for specific intentsGetIntentReceipt to get transaction hashes and statusGetIntentHistory for paginated history views with receiptsWas this page helpful?