Skip to main content
Version: v2

Migrate from API v1

CCIP API v1 is being retired. Move your integration to API v2.

Timeline​

DateWhat happens
November 11, 2026v1 is disabled. All v1 requests return 410 Gone with a link to this guide.
November 30, 2026v1 is permanently retired. All v1 requests keep returning 410 Gone.

Why migrate​

v1 returns data that is no longer accurate:

  • Lane latency. v1 uses an outdated estimation methodology that aggregates all messages on a lane regardless of lane version or token. v2 uses a more accurate methodology based on message properties — lane version and token now factor into the estimate — so values better reflect actual delivery times. For example, Ethereum to BNB Chain reported about 18.7 minutes on v1 and 16.1 minutes on v2 on November 5, 2026.
  • Messages. CCIP v2 is not supported on API v1.

Endpoint mapping​

Replace the base URL https://api.ccip.chain.link/v1 with https://api.ccip.chain.link/v2. Only the message path changes:

v1 pathv2 path
GET /lanes/latencyGET /lanes/latency
GET /message/{messageId}GET /messages/{messageId}
POST /intents/quotesPOST /intents/quotes
GET /intents/tx/{txHash}GET /intents/tx/{txHash}
GET /intents/id/{intentId}GET /intents/id/{intentId}

Lane latency​

Existing parameters and response fields are unchanged. v2 adds fields to lane.sourceNetworkInfo and lane.destNetworkInfo, and rejects selector pairs that mix mainnet and testnet with 400. Also:

  • totalMs is estimated with a more accurate methodology that factors in message properties such as lane version and token, so expect values that better reflect actual delivery times.
  • Two optional query parameters are available: numOfBlocks (block confirmations to estimate against; 0 or omitted means full finality) and sourceTokenAddress (token-specific latency).
Bash
# v1
curl "https://api.ccip.chain.link/v1/lanes/latency?sourceChainSelector=5009297550715157269&destChainSelector=11344663589394136015"

# v2
curl "https://api.ccip.chain.link/v2/lanes/latency?sourceChainSelector=5009297550715157269&destChainSelector=11344663589394136015"

Message by ID​

The path is plural and these fields are renamed:

  • feeToken → fees.fixedFeesDetails.tokenAddress
  • feeTokenAmount → fees.fixedFeesDetails.totalAmount
  • ready_for_manual_execution → readyForManualExecution
  • tokenAmounts[].tokenAddress → tokenAmounts[].sourceTokenAddress

EVM addresses are lowercase in v1 and checksummed (mixed case) in v2. Compare addresses case-insensitively.

New in v2:

  • tokenAmounts[] also carries destTokenAddress, sourcePoolAddress, extraData, and destGasAmount.
  • fees.bpsFeeDetails lists proportional fees charged by token pools, when any apply.
  • status can also be VERIFYING or VERIFIED (CCIP 2.0 lanes) and UNCONFIRMED (CCIP 1.x lanes to TON). Handle unknown values, since the list can grow.
  • sourceNetworkInfo and destNetworkInfo add displayName, environment, isPrivate, and deprecated.
  • Message metadata: sequenceNumber, nonce, onramp, offramp, version, sendBlockNumber, sendLogIndex, receiptBlockNumber, deliveryTime, encodedMessage, finality, finalityType, verifiers, and executor.
Bash
# v1
curl "https://api.ccip.chain.link/v1/message/0xe364a6e4fcd258ecad9903c5540e788a20e45edf5d5535aeb16ef302f6aba195" | jq '{feeToken, feeTokenAmount, ready_for_manual_execution}'

# v2
curl "https://api.ccip.chain.link/v2/messages/0xe364a6e4fcd258ecad9903c5540e788a20e45edf5d5535aeb16ef302f6aba195" | jq '{fee: .fees.fixedFeesDetails, readyForManualExecution}'

Intents​

Paths, request bodies, and the x-api-key header are unchanged. Only the base URL moves to /v2.

Using the SDK instead​

@chainlink/ccip-sdk and @chainlink/ccip-cli 0.95.0 and later call v2. Versions 0.93.0 and 0.94.0 call v1 for lane latency, so upgrade:

TypeScript
import { CCIPAPIClient } from '@chainlink/ccip-sdk'

const api = new CCIPAPIClient()
const latency = await api.getLaneLatency(5009297550715157269n, 11344663589394136015n)
const message = await api.getMessageById(
'0xe364a6e4fcd258ecad9903c5540e788a20e45edf5d5535aeb16ef302f6aba195',
)

Next steps​