curl --request POST \
--url https://api.portalhq.io/api/v3/clients/me/integrations/cctp/transfers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sourceChain": "eip155:84532",
"destinationChain": "eip155:43113",
"amount": "0.09",
"speed": "auto"
}
'{
"data": {
"transferId": "cmuzgyc2105hw41rg2h19pomm",
"sourceChain": "eip155:84532",
"destinationChain": "eip155:43113",
"amount": "0.09",
"amountRaw": "90000",
"speed": "fast",
"minFinalityThreshold": 1000,
"fees": {
"protocol": "0.000012",
"forwarding": "0.054181",
"maxFee": "0.054193",
"custodian": "0"
},
"totalDebit": "0.09",
"amountOut": "0.035807",
"minAmount": "0.05419",
"sourceGas": {
"payer": "user",
"estimatedWei": "1237440000000"
},
"estimatedSeconds": 8,
"sender": "0xa7f0c09f250b7f9cc73068c02ceb296a013c0c0c",
"recipient": "0xa7f0c09f250b7f9cc73068c02ceb296a013c0c0c",
"warnings": [],
"ready": true,
"checks": [
{
"id": "ROUTE_SUPPORTED",
"ok": true
},
{
"id": "AMOUNT_ABOVE_MINIMUM",
"ok": true
},
{
"id": "BALANCE",
"ok": true
},
{
"id": "RECIPIENT_ALLOWED",
"ok": true
},
{
"id": "SOURCE_GAS",
"ok": true
}
],
"transactions": [
{
"to": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
"data": "0x095ea7b30000000000000000000000008fe6b999dc680ccfdd5bf7eb0974218be2542daa0000000000000000000000000000000000000000000000000000000000015f90",
"value": "0",
"kind": "approve"
},
{
"to": "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
"data": "0x779b432d0000000000000000000000000000000000000000000000000000000000015f900000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a7f0c09f250b7f9cc73068c02ceb296a013c0c0c000000000000000000000000036cbd53842c5426634e7929541ec2318f3dcf7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3b100000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020636374702d666f72776172640000000000000000000000000000000000000000",
"value": "0",
"kind": "burn"
}
]
}
}Create a CCTP transfer
Quotes again with fresh fees, runs every preflight check and, when they all pass,
stores the transfer as BUILT and returns what to sign. If any check fails,
nothing is stored and the response is 400 with the id CCTP_PREFLIGHT_FAILED.
- EVM source, EOA clients: sign
transactionsin order, waiting for each to be mined successfully before signing the next; stop if one fails. Anapprovecomes first when the allowance is too low, then theburn, then onefeetransfer for your custodian fee. - EVM source, Account Abstraction clients: sign
userOperation, which already contains every call intransactions. - Solana source:
transactionsholds one Solana transaction withserializedTransaction, already partially signed by Circle’s event account and with any fee transfers inside. Sign and broadcast it withsol_signAndSendTransaction. Its blockhash expires after roughly a minute.
Sign and broadcast on the source chain, then call submit with the burn
transaction hash (EOA), the user operation hash (Account Abstraction on an EVM
source) or the Solana signature (Solana source).
With an Idempotency-Key, the same key and body return the same transfer: with
freshly built transactions while it’s BUILT or ABANDONED, or its current
state (without transactions) once it’s submitted. If Portal can’t confirm that
an earlier burn for the transfer never landed, it returns 409 with the id
CCTP_REBUILD_UNAVAILABLE instead of new transactions. The same key with a
different body returns 409 with the id IDEMPOTENCY_KEY_REUSED.
curl --request POST \
--url https://api.portalhq.io/api/v3/clients/me/integrations/cctp/transfers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sourceChain": "eip155:84532",
"destinationChain": "eip155:43113",
"amount": "0.09",
"speed": "auto"
}
'{
"data": {
"transferId": "cmuzgyc2105hw41rg2h19pomm",
"sourceChain": "eip155:84532",
"destinationChain": "eip155:43113",
"amount": "0.09",
"amountRaw": "90000",
"speed": "fast",
"minFinalityThreshold": 1000,
"fees": {
"protocol": "0.000012",
"forwarding": "0.054181",
"maxFee": "0.054193",
"custodian": "0"
},
"totalDebit": "0.09",
"amountOut": "0.035807",
"minAmount": "0.05419",
"sourceGas": {
"payer": "user",
"estimatedWei": "1237440000000"
},
"estimatedSeconds": 8,
"sender": "0xa7f0c09f250b7f9cc73068c02ceb296a013c0c0c",
"recipient": "0xa7f0c09f250b7f9cc73068c02ceb296a013c0c0c",
"warnings": [],
"ready": true,
"checks": [
{
"id": "ROUTE_SUPPORTED",
"ok": true
},
{
"id": "AMOUNT_ABOVE_MINIMUM",
"ok": true
},
{
"id": "BALANCE",
"ok": true
},
{
"id": "RECIPIENT_ALLOWED",
"ok": true
},
{
"id": "SOURCE_GAS",
"ok": true
}
],
"transactions": [
{
"to": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
"data": "0x095ea7b30000000000000000000000008fe6b999dc680ccfdd5bf7eb0974218be2542daa0000000000000000000000000000000000000000000000000000000000015f90",
"value": "0",
"kind": "approve"
},
{
"to": "0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA",
"data": "0x779b432d0000000000000000000000000000000000000000000000000000000000015f900000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a7f0c09f250b7f9cc73068c02ceb296a013c0c0c000000000000000000000000036cbd53842c5426634e7929541ec2318f3dcf7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3b100000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020636374702d666f72776172640000000000000000000000000000000000000000",
"value": "0",
"kind": "burn"
}
]
}
}Authorizations
Client API Key or Client Session Token (CST). Pass as a Bearer token in the Authorization header.
Headers
Optional key to deduplicate retries. Scoped to the client. Up to 255 characters from A-Z, a-z, 0-9, -, ., _ and ~.
255Body
- Option 1
- Option 2
Send exactly one of amount or amountOut. Unknown fields are rejected.
CAIP-2 id of the chain to send from, an EVM chain or Solana.
^(eip155:\d+|solana:[1-9A-HJ-NP-Za-km-z]{32})$"eip155:11155111"
CAIP-2 id of the chain to send to, an EVM chain or Solana.
^(eip155:\d+|solana:[1-9A-HJ-NP-Za-km-z]{32})$"eip155:84532"
USDC to burn on the source chain, as a decimal string with up to 6 decimals (not base units).
^\d+(\.\d{1,6})?$"0.1"
USDC the recipient must receive (exact-out). Portal works out the amount to burn so the recipient gets at least this after fees (exactly this when Circle charges the full maxFee, as it does in practice).
^\d+(\.\d{1,6})?$"0.045735"
auto and fast use Fast when the source chain offers it, otherwise Standard. standard always uses Standard.
auto, fast, standard Address to receive the USDC, validated against the destination chain. An EVM address for an EVM destination, or a Solana wallet address (not a token account) for a Solana destination, where Circle mints into the wallet's USDC token account. Defaults to the client's own address on the destination chain. Any other address must be on the environment's destination allowlist.
1 - 64Response
Transfer built
When ROUTE_SUPPORTED fails, only sourceChain, destinationChain, ready and checks are returned.
- Built transfer
- Already submitted (idempotent replay)
Show child attributes
Show child attributes
Was this page helpful?