Skip to main content

Overview

The 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.

Use Cases

  • Retrieve full intent details after creation
  • Review quote and fee information
  • Inspect transaction calls and preconditions
  • Verify intent parameters
  • Debug issues with intent execution
  • Display intent details in UI

Request Parameters

Required Fields

  • intentId (string): The unique identifier of the intent

Response

The response includes:
  • intent (Intent): Complete intent object with all details

Intent Object Structure

The intent object contains comprehensive information:

Core Fields

  • id (number): Internal database ID
  • intentId (string): Unique intent identifier
  • status (IntentStatus): Current status
  • ownerAddress (string): Wallet address of the intent owner
  • originIntentAddress (string): Intent contract address on origin chain
  • destinationIntentAddress (string): Intent contract address on destination chain
  • destinationSalt (number): Salt for deterministic intent address generation
  • trailsVersion (string): Version of Trails protocol used
  • expiresAt (string): Intent expiration timestamp
  • createdAt (string): Creation timestamp
  • updatedAt (string): Last update timestamp

Quote Request

  • quoteRequest (QuoteIntentRequest): Original quote parameters
    • Origin and destination chain/token details
    • Amounts and trade type
    • Options (provider, slippage, etc.)

Transaction Details

  • depositTransaction (DepositTransaction): Deposit details
    • Token address and amount
    • Recipient address
    • Token decimals
  • calls (IntentCalls[]): Cross-chain calls to execute
    • Chain ID for each call set
    • Transaction calls with calldata
    • Nonce and space information
  • preconditions (TransactionPrecondition[]): Pre-execution checks
    • Token balance requirements
    • Minimum amount validations
  • metaTxns (MetaTxn[]): Meta-transaction information
    • Meta-transaction IDs
    • Wallet addresses
    • Contract targets

Quote Information

  • quote (IntentProviderQuote): Quote provider details
    • Provider name and request ID
    • Input/output amounts and minimums
    • Slippage and price impact
    • Provider fees in USD

Fee Breakdown

  • fees (IntentFees): Comprehensive fee information
    • originGas: Origin chain gas fees
    • destinationGas: Destination chain gas fees
    • provider: Provider fees (quote provider + Trails)
    • feeTokenAddress: Token used for fees
    • feeTokenTotal: Total fee in fee token
    • totalFeeAmount: Total fee amount
    • totalFeeUsd: Total fee in USD

Example

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);

Detailed Fee Inspection

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);

Inspecting Transaction Calls

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);

Use Cases

1. Display Intent Summary in UI

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>
    );
}

2. Verify Intent Before Signing

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;
}
Use this endpoint to retrieve intent details at any time. The intent object remains accessible even after execution completes.

Next Steps

  • Use GetIntentReceipt to check execution status and get transaction hashes
  • Use SearchIntents to find all intents for a specific address
  • Modify and recommit expired intents with fresh quotes