curl --request POST \
--url https://api.portalhq.io/api/v3/clients/me/integrations/cctp/transfers/{id}/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"txHash": "0xc7c227eee90af289fceb0d33c66b472457c65b74811f2ba02a8ab21727496dfb"
}
'{
"data": {
"id": "cmuzgyc2105hw41rg2h19pomm",
"status": "SUBMITTED",
"sourceChain": "eip155:84532",
"destinationChain": "eip155:43113",
"amount": "0.09",
"amountOut": "0.035807",
"sender": "0xa7f0c09f250b7f9cc73068c02ceb296a013c0c0c",
"recipient": "0xa7f0c09f250b7f9cc73068c02ceb296a013c0c0c",
"speed": "fast",
"fees": {
"maxFee": "0.054193",
"custodian": "0"
},
"totalDebit": "0.09",
"sourceTxHash": "0xc7c227eee90af289fceb0d33c66b472457c65b74811f2ba02a8ab21727496dfb",
"sourceExplorerUrl": "https://sepolia.basescan.org/tx/0xc7c227eee90af289fceb0d33c66b472457c65b74811f2ba02a8ab21727496dfb",
"estimatedCompletionAt": "2026-10-08T11:44:54.347Z",
"pollAfterMs": 2000,
"createdAt": "2026-10-08T11:44:32.137Z",
"updatedAt": "2026-10-08T11:44:46.349Z"
}
}{
"error": "Submit the txHash of the broadcast burn transaction"
}{
"error": "<string>"
}{
"error": "CCTP transfer does not exist."
}{
"error": "This transfer was already submitted with a different hash",
"id": "ALREADY_SUBMITTED"
}Submit a CCTP transfer
Tells Portal which transaction to track. Send exactly one of:
txHash: the burn transaction hash (0x), for EOA clients on an EVM source. For a Solana source, the base58 signature of the burn transaction, for every client including Account Abstraction clients.userOpHash: the user operation hash, for Account Abstraction clients on an EVM source.
Submitting the approve or a fee transfer hash instead of the burn hash ends the
transfer as FAILED with failureReason TX_MISMATCH. A Solana signature that
doesn’t appear on chain within 30 minutes ends it as FAILED with
SOURCE_TX_NOT_FOUND.
Safe to retry: the same hash again returns the transfer. A different hash, or a
hash already submitted for another transfer, returns 409 with the id
ALREADY_SUBMITTED. A transfer marked ABANDONED still accepts a late submit.
Works even if the integration was disabled after the transfer was created.
curl --request POST \
--url https://api.portalhq.io/api/v3/clients/me/integrations/cctp/transfers/{id}/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"txHash": "0xc7c227eee90af289fceb0d33c66b472457c65b74811f2ba02a8ab21727496dfb"
}
'{
"data": {
"id": "cmuzgyc2105hw41rg2h19pomm",
"status": "SUBMITTED",
"sourceChain": "eip155:84532",
"destinationChain": "eip155:43113",
"amount": "0.09",
"amountOut": "0.035807",
"sender": "0xa7f0c09f250b7f9cc73068c02ceb296a013c0c0c",
"recipient": "0xa7f0c09f250b7f9cc73068c02ceb296a013c0c0c",
"speed": "fast",
"fees": {
"maxFee": "0.054193",
"custodian": "0"
},
"totalDebit": "0.09",
"sourceTxHash": "0xc7c227eee90af289fceb0d33c66b472457c65b74811f2ba02a8ab21727496dfb",
"sourceExplorerUrl": "https://sepolia.basescan.org/tx/0xc7c227eee90af289fceb0d33c66b472457c65b74811f2ba02a8ab21727496dfb",
"estimatedCompletionAt": "2026-10-08T11:44:54.347Z",
"pollAfterMs": 2000,
"createdAt": "2026-10-08T11:44:32.137Z",
"updatedAt": "2026-10-08T11:44:46.349Z"
}
}{
"error": "Submit the txHash of the broadcast burn transaction"
}{
"error": "<string>"
}{
"error": "CCTP transfer does not exist."
}{
"error": "This transfer was already submitted with a different hash",
"id": "ALREADY_SUBMITTED"
}Authorizations
Client API Key or Client Session Token (CST). Pass as a Bearer token in the Authorization header.
Path Parameters
The transferId from the create response.
Body
- Option 1
- Option 2
Send exactly one of txHash (EOA clients on an EVM source, and every client on a Solana source) or userOpHash (Account Abstraction clients on an EVM source).
The burn transaction hash (0x, EVM source) or the base58 signature of the burn transaction (Solana source). Not the approve or a fee transfer hash.
^(0x[0-9a-fA-F]{64}|[1-9A-HJ-NP-Za-km-z]{64,88})$The hash of the broadcast user operation.
^0x[0-9a-fA-F]{64}$Response
Transfer submitted
Show child attributes
Show child attributes
Was this page helpful?