> ## Documentation Index
> Fetch the complete documentation index at: https://docs.portalhq.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 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 `transactions` in order, waiting for each
  to be mined successfully before signing the next; stop if one fails. An
  `approve` comes first when the allowance is too low, then the `burn`, then one
  `fee` transfer for your custodian fee.
- **EVM source, Account Abstraction clients**: sign `userOperation`, which already
  contains every call in `transactions`.
- **Solana source**: `transactions` holds one Solana transaction with
  `serializedTransaction`, already partially signed by Circle's event account and
  with any fee transfers inside. Sign and broadcast it with
  `sol_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`.




## OpenAPI

````yaml /openapi/client-api.yaml post /clients/me/integrations/cctp/transfers
openapi: 3.1.0
info:
  title: Portal Client API
  version: '3.0'
  description: >
    The Portal Client API provides endpoints for managing wallets, building
    transactions,

    and interacting with blockchain networks. All endpoints require
    authentication via a

    Client API Key or Client Session Token (CST) passed as a Bearer token.


    ## Base URL

    `https://api.portalhq.io/api/v3`


    ## Authentication

    Include your Client API Key or Client Session Token as a Bearer token in the

    `Authorization` header of every request.


    ## Chain ID Format

    Chain parameters use either friendly names (e.g. `ethereum`, `solana`) or
    CAIP-2 format

    (e.g. `eip155:1`, `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`). When using
    CAIP-2 format

    in URLs, ensure the colon is URI-encoded (`%3A`).
servers:
  - url: https://api.portalhq.io/api/v3
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Clients
    description: Core client management endpoints
  - name: Wallet
    description: >-
      Read wallet state — balances, NFTs, transaction history, capabilities, and
      transaction details
  - name: Transactions
    description: Build, broadcast, and evaluate blockchain transactions
  - name: Funding
    description: Fund wallets with testnet tokens
  - name: Wallet Shares
    description: Manage signing and backup share pairs
  - name: Delegations
    description: Manage token approvals, revocations, and delegated transfers
  - name: Session Keys
    description: Manage EIP-7702 session keys for smart accounts
  - name: 0x
    description: Token swap endpoints powered by the 0x protocol
  - name: Yield.xyz
    description: Yield opportunities and staking actions powered by Yield.xyz
  - name: Yield.xyz Borrow
    description: >-
      Supply collateral, borrow, repay and withdraw from lending markets (Aave
      V3, Morpho Blue, SparkLend, Lista) powered by Yield.xyz Borrow
  - name: Yield.xyz Perps
    description: >-
      Trade perpetual futures — open/close leveraged positions, manage
      stop-loss/take-profit, and fund/withdraw a trading account — powered by
      Yield.xyz Perps
  - name: Li.Fi
    description: Cross-chain swaps and bridging powered by Li.Fi
  - name: CCTP
    description: >-
      Crosschain USDC transfers powered by Circle's Cross-Chain Transfer
      Protocol (CCTP)
  - name: Blockaid
    description: Transaction and address security scanning powered by Blockaid
  - name: Hypernative
    description: >-
      Transaction, address, token, and NFT security scanning powered by
      Hypernative
  - name: Noah
    description: KYC onboarding, payins, and payouts powered by Noah
  - name: Meld
    description: Buy and sell crypto with fiat through aggregated providers powered by Meld
  - name: Due
    description: Payins, payouts, virtual accounts, and FX powered by Due
  - name: EIP-7702
    description: EIP-7702 account type detection and authorization management
  - name: Deprecated
    description: >-
      Legacy endpoints scheduled for removal. Use the newer equivalents listed
      in each endpoint's description.
paths:
  /clients/me/integrations/cctp/transfers:
    post:
      tags:
        - CCTP
      summary: Create a CCTP transfer
      description: >
        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 `transactions` in order, waiting for
        each
          to be mined successfully before signing the next; stop if one fails. An
          `approve` comes first when the allowance is too low, then the `burn`, then one
          `fee` transfer for your custodian fee.
        - **EVM source, Account Abstraction clients**: sign `userOperation`,
        which already
          contains every call in `transactions`.
        - **Solana source**: `transactions` holds one Solana transaction with
          `serializedTransaction`, already partially signed by Circle's event account and
          with any fee transfers inside. Sign and broadcast it with
          `sol_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`.
      operationId: createCctpTransfer
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            type: string
            maxLength: 255
          description: >-
            Optional key to deduplicate retries. Scoped to the client. Up to 255
            characters from `A-Z`, `a-z`, `0-9`, `-`, `.`, `_` and `~`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CctpTransferRequest'
            examples:
              evm:
                summary: Base Sepolia to Avalanche Fuji
                value:
                  sourceChain: eip155:84532
                  destinationChain: eip155:43113
                  amount: '0.09'
                  speed: auto
              solana:
                summary: Solana Devnet to Base Sepolia
                value:
                  sourceChain: solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1
                  destinationChain: eip155:84532
                  amount: '0.09'
                  speed: auto
      responses:
        '200':
          description: Transfer built
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CctpCreateTransferResponse'
              examples:
                evm:
                  summary: EVM source (EOA client)
                  value:
                    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
                solana:
                  summary: Solana source (environment's gas sponsor pays the SOL)
                  value:
                    data:
                      transferId: cmuzgzaj405hy41rgx2gai5e2
                      sourceChain: solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1
                      destinationChain: eip155:84532
                      amount: '0.09'
                      amountRaw: '90000'
                      speed: standard
                      minFinalityThreshold: 2000
                      fees:
                        protocol: '0'
                        forwarding: '0.054001'
                        maxFee: '0.054001'
                        custodian: '0'
                      totalDebit: '0.09'
                      amountOut: '0.035999'
                      minAmount: '0.054002'
                      sourceGas:
                        payer: sponsor
                        estimatedLamports: '3002040'
                      estimatedSeconds: 25
                      sender: CFDVxCGxPsdYFfHCgwgjq9Nv8rQ8X14ZrsLaQmJ6c4AD
                      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
                        - id: SPONSORSHIP
                          ok: true
                          message: The environment's gas sponsor pays the fees and rent
                      transactions:
                        - kind: burn
                          namespace: solana
                          serializedTransaction: >-
                            AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYsZk5N/Z9giVAiEFxWmbXo5GXC1B1YXo7ACcHRvIhjSqmykJrNHAjnFXnEUIhDcEdh3qLzWbfBU1FqNIacRYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMACxL1B4ViaC0+8+Orgnvxi5G+Yg12vwcf8J62bySsUPQV3jWmZCQYU9KocWrA11kLkFrsF1UwKZnmlo204DQg8naRpxTSA7Nqxxk6Cm8Wswm8OpQNHyTuu/5uoEBmTTjLkWozqSA7+ycCsBaj/ewJeZX6GJDDLSOGv59Nu6j1t1KAbTtELLORIVfxOpM9ATQoLQMrX/7NAaLb8bd5BgjfAC6nXoOp1THIOPl15AR6Mo0tOX1cirITMUCr7RyRTqmjTNUHbq7us12Dfla4X7yoM1XeoxQbnP1bkLPoxu58CjSULwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFKaiGfuw3xJfThgGzO10dOrBI17FLYOsqlzxXrR5VRQtx71r2jruWGPiFgQi7ixv89aruYChuVkAhwQ4h3atSVEAM/zHgAPw39W+Z1B0m4S59II7nMg7bLVPGtsM7iBujmtqMVIduprQivBrbYzpqqz6gh6ncSy7S5JpSm8DNvuinDqDdYX+UHhjHQQ4hkY+XjXzhkrbn9qjCfID1GW9SKZfyBzhntzS0sNAsC+mG+HVut3hWSgz3fkgCdjPaFRVpl/IHQ/vqIYMs7g/CJsCJL6KZoe3rkn1lMC5tNfpOJPBTtP+v/MbiUnJ1BEgKbxdPv9Q2rMvQWSL1hOTczPhv873EbHc1dbneQ8vj1ZRMy4+fZWZriOO1hKhu462jjTsBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKmqPIJ0AVPI7M9VKLu/2p/MUafbk2Qk8H8KN6F2H9f6VgEOFAIACQMQBgsMDwUEAQ0OEQcKDggNhAFv9T6DzGzfm5BfAQAAAAAABgAAAAAAAAAAAAAAAAAAAKfwwJ8lC3+cxzBowCzrKWoBPAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx0gAAAAAAANAHAAAgAAAAY2N0cC1mb3J3YXJkAAAAAAAAAAAAAAAAAAAAAAAAAAA=
                          lastValidBlockHeight: 496041811
        '400':
          description: >
            Bad request. Common causes:

            - A preflight check failed (`CCTP_PREFLIGHT_FAILED`);
            `details.failed` lists every failed check

            - The body is malformed, has unknown fields, or has an invalid
            `Idempotency-Key` (no `id`)

            - The body has both or neither of `amount` and `amountOut`
            (`INVALID_AMOUNT`)

            - The integration isn't enabled (`CCTP_NOT_ENABLED`)
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/CctpPreflightFailedErrorResponse'
                  - $ref: '#/components/schemas/CctpErrorResponse'
              example:
                error: 'CCTP transfer can''t be built: SOURCE_GAS'
                details:
                  failed:
                    - SOURCE_GAS
                  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: false
                      message: >-
                        Native balance 0 wei is below the ~1237440000000 wei
                        needed for gas
                      fix: Fund the wallet with native gas on eip155:84532
                id: CCTP_PREFLIGHT_FAILED
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            A transaction policy blocked the user operation (Account Abstraction
            clients).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CctpPolicyViolationErrorResponse'
              example:
                error: 'Policy violation: amount exceeds limit (Max transfer)'
                details:
                  policyViolation:
                    policyId: policyId
                    policyName: Max transfer
                    reason: amount exceeds limit (Max transfer)
                    ruleId: ruleId
                id: POLICY_VIOLATION
        '409':
          description: >-
            The `Idempotency-Key` was already used with a different body
            (`IDEMPOTENCY_KEY_REUSED`), Portal can't confirm the transfer's
            earlier burn didn't land (`CCTP_REBUILD_UNAVAILABLE`), or the
            transfer was built less than 2 minutes ago and its burn may still be
            pending (`CCTP_REBUILD_TOO_SOON`, retry after
            `details.retryAfterSeconds`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CctpErrorResponse'
              example:
                error: >-
                  Idempotency-Key was already used for a different CCTP transfer
                  request
                id: IDEMPOTENCY_KEY_REUSED
        '503':
          description: >-
            Circle's API is temporarily unavailable. Retry after
            `details.retryAfterSeconds`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CctpUpstreamUnavailableErrorResponse'
              example:
                error: Circle Iris is temporarily unavailable; retry later
                details:
                  retryAfterSeconds: 30
                id: CCTP_UPSTREAM_UNAVAILABLE
components:
  schemas:
    CctpTransferRequest:
      type: object
      description: >-
        Send exactly one of `amount` or `amountOut`. Unknown fields are
        rejected.
      required:
        - sourceChain
        - destinationChain
      oneOf:
        - required:
            - amount
        - required:
            - amountOut
      properties:
        sourceChain:
          type: string
          pattern: ^(eip155:\d+|solana:[1-9A-HJ-NP-Za-km-z]{32})$
          description: CAIP-2 id of the chain to send from, an EVM chain or Solana.
          example: eip155:11155111
        destinationChain:
          type: string
          pattern: ^(eip155:\d+|solana:[1-9A-HJ-NP-Za-km-z]{32})$
          description: CAIP-2 id of the chain to send to, an EVM chain or Solana.
          example: eip155:84532
        amount:
          type: string
          pattern: ^\d+(\.\d{1,6})?$
          description: >-
            USDC to burn on the source chain, as a decimal string with up to 6
            decimals (not base units).
          example: '0.1'
        amountOut:
          type: string
          pattern: ^\d+(\.\d{1,6})?$
          description: >-
            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).
          example: '0.045735'
        speed:
          type: string
          enum:
            - auto
            - fast
            - standard
          default: auto
          description: >-
            `auto` and `fast` use Fast when the source chain offers it,
            otherwise Standard. `standard` always uses Standard.
        recipient:
          type: string
          minLength: 1
          maxLength: 64
          description: >-
            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.
      additionalProperties: false
    CctpCreateTransferResponse:
      type: object
      properties:
        data:
          anyOf:
            - $ref: '#/components/schemas/CctpCreatedTransfer'
            - $ref: '#/components/schemas/CctpReplayedTransfer'
    CctpPreflightFailedErrorResponse:
      type: object
      required:
        - error
        - details
        - id
      properties:
        error:
          type: string
          example: 'CCTP transfer can''t be built: BALANCE'
        details:
          type: object
          required:
            - failed
            - checks
          properties:
            failed:
              type: array
              description: The id of every failed check.
              items:
                type: string
            checks:
              type: array
              items:
                $ref: '#/components/schemas/CctpCheck'
            minAmount:
              type: string
              description: >-
                The smallest amount that works. Only present when
                `AMOUNT_ABOVE_MINIMUM` failed.
        id:
          type: string
          enum:
            - CCTP_PREFLIGHT_FAILED
    CctpErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: string
        id:
          type: string
          enum:
            - CCTP_NOT_ENABLED
            - INVALID_AMOUNT
            - IDEMPOTENCY_KEY_REUSED
            - CCTP_REBUILD_UNAVAILABLE
            - CCTP_REBUILD_TOO_SOON
            - ALREADY_SUBMITTED
          description: Stable error id. Absent on malformed request errors.
        details:
          type: object
          additionalProperties: true
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Error message describing what went wrong
    CctpPolicyViolationErrorResponse:
      type: object
      properties:
        error:
          type: string
        details:
          type: object
          properties:
            policyViolation:
              type: object
              properties:
                policyId:
                  type: string
                policyName:
                  type: string
                reason:
                  type: string
                ruleId:
                  type: string
        id:
          type: string
          enum:
            - POLICY_VIOLATION
    CctpUpstreamUnavailableErrorResponse:
      type: object
      properties:
        error:
          type: string
        details:
          type: object
          properties:
            retryAfterSeconds:
              type: integer
              description: Seconds to wait before retrying.
        id:
          type: string
          enum:
            - CCTP_UPSTREAM_UNAVAILABLE
    CctpCreatedTransfer:
      title: Built transfer
      allOf:
        - type: object
          required:
            - transferId
          properties:
            transferId:
              type: string
              description: Use it to submit and track the transfer.
        - $ref: '#/components/schemas/CctpQuote'
        - type: object
          properties:
            transactions:
              type: array
              description: >-
                On an EVM source, EOA clients sign these in order. An `approve`
                comes first when the allowance is too low, then the `burn`, then
                any `fee` transfers. For Account Abstraction clients, these are
                the calls inside `userOperation`. On a Solana source, this holds
                one Solana transaction for every client.
              items:
                $ref: '#/components/schemas/CctpTransaction'
            userOperation:
              $ref: '#/components/schemas/CctpUserOperation'
    CctpReplayedTransfer:
      title: Already submitted (idempotent replay)
      description: >-
        Returned for a repeated `Idempotency-Key` once the transfer has been
        submitted.
      allOf:
        - type: object
          required:
            - transferId
          properties:
            transferId:
              type: string
        - $ref: '#/components/schemas/CctpTransfer'
    CctpCheck:
      type: object
      required:
        - id
        - ok
      properties:
        id:
          type: string
          enum:
            - ROUTE_SUPPORTED
            - AMOUNT_ABOVE_MINIMUM
            - BALANCE
            - RECIPIENT_ALLOWED
            - SOURCE_GAS
            - SPONSORSHIP
          description: >-
            `SPONSORSHIP` is only returned for Account Abstraction clients and
            for Solana sources.
        ok:
          type: boolean
          nullable: true
          description: >-
            `true` passed, `false` failed and blocks the transfer, `null` can't
            be known at this stage or a check it depends on failed.
        message:
          type: string
        fix:
          type: string
          description: What to do about a failed check.
    CctpQuote:
      type: object
      description: >-
        When `ROUTE_SUPPORTED` fails, only `sourceChain`, `destinationChain`,
        `ready` and `checks` are returned.
      required:
        - sourceChain
        - destinationChain
        - ready
        - checks
      properties:
        sourceChain:
          type: string
        destinationChain:
          type: string
        amount:
          type: string
          description: USDC to burn on the source chain.
        amountRaw:
          type: string
          description: '`amount` in base units (6 decimals).'
        speed:
          type: string
          enum:
            - fast
            - standard
          description: The speed Portal picked.
        minFinalityThreshold:
          type: integer
          description: >-
            CCTP finality threshold for the speed (`1000` Fast, `2000`
            Standard).
        fees:
          $ref: '#/components/schemas/CctpFees'
        totalDebit:
          type: string
          description: >-
            The USDC that leaves the wallet, `amount + fees.custodian`. The
            `BALANCE` check compares the wallet's balance against it.
          example: '0.1005'
        amountOut:
          type: string
          description: >-
            What the recipient receives, `amount - fees.maxFee`. Circle can
            charge less than `maxFee`, so the recipient never gets less; in
            practice it charges the full `maxFee`.
        minAmount:
          type: string
          description: The smallest `amount` that delivers anything on this route.
        sourceGas:
          type: object
          properties:
            payer:
              type: string
              enum:
                - user
                - sponsor
              description: >-
                `sponsor` when the user operation is gas sponsored (Account
                Abstraction clients on an EVM source, on create), or when the
                environment's Solana gas sponsor pays the transaction fee and
                rent (Solana source).
            estimatedWei:
              type: string
              description: >-
                EVM source. Estimated source chain gas in wei for all the
                transactions or the user operation.
            estimatedLamports:
              type: string
              description: >-
                Solana source. Estimated SOL cost in lamports of the transaction
                fees and the rent for Circle's event account (and for any fee
                address token account that doesn't exist yet).
        estimatedSeconds:
          type: integer
          description: Estimated transfer time at the picked speed.
        sender:
          type: string
          description: >-
            The address that signs and sends the burn (the smart account for
            Account Abstraction clients on an EVM source, the Solana wallet for
            a Solana source). Use it as `from` when signing on EVM.
        recipient:
          type: string
          description: >-
            The address that receives the USDC on the destination chain. On
            Solana, the wallet that owns the USDC token account Circle mints
            into.
        warnings:
          type: array
          items:
            type: string
            enum:
              - LONG_FINALITY
              - EXTERNAL_RECIPIENT
              - RECIPIENT_ACCOUNT_SETUP
          description: >-
            Warnings never block the transfer. `RECIPIENT_ACCOUNT_SETUP` means
            the Solana recipient has no USDC token account yet, so Circle
            creates it during the mint and charges a higher forwarding fee.
        ready:
          type: boolean
          description: '`true` when no check has `ok: false`.'
        checks:
          type: array
          items:
            $ref: '#/components/schemas/CctpCheck'
    CctpTransaction:
      description: >-
        What to sign on the source chain. An EVM transaction for an EVM source,
        or one Solana transaction for a Solana source.
      oneOf:
        - $ref: '#/components/schemas/CctpEvmTransaction'
        - $ref: '#/components/schemas/CctpSolanaTransaction'
    CctpUserOperation:
      type: object
      description: The user operation to sign and broadcast (Account Abstraction clients).
      properties:
        userOperation:
          type: string
          description: >-
            The user operation as a JSON string. Pass it unchanged to
            `broadcast-user-operation`.
        userOpHash:
          type: string
          description: The hash to sign with `POST /v1/raw/sign/SECP256K1` (without `0x`).
        sponsored:
          type: boolean
          description: When `false`, the smart account pays for gas.
        estimatedGasCostWei:
          type: string
    CctpTransfer:
      type: object
      properties:
        id:
          type: string
        status:
          $ref: '#/components/schemas/CctpTransferStatus'
        failureReason:
          type: string
          enum:
            - SOURCE_REVERTED
            - TX_MISMATCH
            - USER_OP_NOT_FOUND
            - SOURCE_TX_NOT_FOUND
          description: >-
            Set when `status` is `FAILED`. `SOURCE_TX_NOT_FOUND` means the
            submitted Solana signature didn't appear on chain within 30 minutes.
        delayReason:
          type: string
          description: >-
            Circle's reason while the transfer is `DELAYED`, for example
            `insufficient_fee`, `amount_above_max` or
            `insufficient_allowance_available`.
        sourceChain:
          type: string
        destinationChain:
          type: string
        amount:
          type: string
        amountOut:
          type: string
          description: >-
            What the recipient receives, `amount - fees.feeExecuted` once known,
            otherwise `amount - fees.maxFee`. Never less than the quoted
            `amountOut`, since `feeExecuted` is at most `maxFee`.
        sender:
          type: string
          description: >-
            The address that burns the USDC (the smart account for Account
            Abstraction clients on an EVM source, the Solana wallet for a Solana
            source).
        recipient:
          type: string
        speed:
          type: string
          enum:
            - fast
            - standard
        fees:
          type: object
          properties:
            maxFee:
              type: string
              description: >-
                Circle's protocol and forwarding fees, which come out of
                `amount`.
            custodian:
              type: string
              description: Your fee in USDC, paid on top of `amount`.
            feeExecuted:
              type: string
              description: The fee Circle actually charged, once known.
        totalDebit:
          type: string
          description: The USDC that leaves the wallet, `amount + fees.custodian`.
        sourceTxHash:
          type: string
          description: >-
            The burn transaction hash, or its base58 signature on Solana. For
            Account Abstraction clients on an EVM source, present once the user
            operation is included on chain.
        userOpHash:
          type: string
        destinationTxHash:
          type: string
          description: >-
            The mint transaction on the destination chain, a base58 signature on
            Solana. Set when `COMPLETED`.
        sourceExplorerUrl:
          type: string
          description: Links to Solscan for a Solana source.
        destinationExplorerUrl:
          type: string
          description: Links to Solscan for a Solana destination.
        estimatedCompletionAt:
          type: string
          format: date-time
          description: Only present until the status is final.
        pollAfterMs:
          type: integer
          minimum: 2000
          description: >-
            How long to wait before reading again. Only present until the status
            is final.
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    CctpFees:
      type: object
      description: >-
        Circle's fees (`protocol`, `forwarding`, `maxFee`) come out of `amount`.
        The `custodian` fee is paid on top of `amount`, in USDC on the source
        chain.
      properties:
        protocol:
          type: string
          description: >-
            Circle's protocol fee in USDC, in basis points of the amount,
            rounded up to 0.000001.
          example: '0.00001'
        forwarding:
          type: string
          description: >-
            Circle's fee in USDC for minting on the destination chain and paying
            the gas there. Higher into a Solana wallet that has no USDC token
            account yet.
          example: '0.054255'
        maxFee:
          type: string
          description: '`protocol` plus `forwarding`.'
          example: '0.054265'
        custodian:
          type: string
          description: >-
            Your fee in USDC, set on the CCTP card in the Portal Dashboard (a
            percentage of `amount`, a flat amount, or both). `0` when no fee is
            set.
          example: '0.0005'
    CctpEvmTransaction:
      type: object
      title: EVM transaction
      description: A transaction to sign with `eth_sendTransaction` on an EVM source chain.
      required:
        - to
        - data
        - value
        - kind
      properties:
        to:
          type: string
          description: >-
            The USDC contract for `approve` and `fee`, Circle's TokenMessenger
            for `burn`.
        data:
          type: string
        value:
          type: string
          enum:
            - '0'
        kind:
          type: string
          enum:
            - approve
            - burn
            - fee
          description: >-
            `approve` (only when the allowance is too low), then `burn`, then a
            USDC `fee` transfer for your fee.
    CctpSolanaTransaction:
      type: object
      title: Solana transaction
      description: >-
        The burn transaction for a Solana source, including any fee transfers.
        Sign and broadcast it with `POST /v1/sign` on the Enclave MPC API,
        method `sol_signAndSendTransaction`, and submit the signature it
        returns.
      required:
        - kind
        - namespace
        - serializedTransaction
        - lastValidBlockHeight
      properties:
        kind:
          type: string
          enum:
            - burn
        namespace:
          type: string
          enum:
            - solana
        serializedTransaction:
          type: string
          description: >-
            Base64 Solana transaction, already partially signed by the one-time
            event account Circle's program requires. Sign it as returned;
            changing it (for example its fee payer) invalidates that signature.
            When a gas sponsor pays, it's already the fee payer.
        lastValidBlockHeight:
          type: integer
          description: >-
            The block height after which the transaction's blockhash expires,
            roughly a minute after it was built. To get a fresh transaction,
            call `POST /transfers` again with the same `Idempotency-Key` and
            body.
    CctpTransferStatus:
      type: string
      enum:
        - BUILT
        - SUBMITTED
        - PENDING_SOURCE
        - ATTESTING
        - DELAYED
        - FORWARDING
        - COMPLETED
        - FAILED
        - ABANDONED
        - STALLED
      description: >-
        `COMPLETED`, `FAILED` and `STALLED` are final. `ABANDONED` means built
        but not submitted within 1 hour; a late submit is still accepted.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Client API Key or Client Session Token (CST). Pass as a Bearer token in
        the

        Authorization header.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.