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

# Quote a CCTP transfer

> Returns Circle's fees, your custodian fee, the exact amount the
recipient receives, the total that leaves the wallet (`totalDebit`) and the
preflight checks for a transfer. Nothing is stored. A quote that can't go ahead
still returns `200`, with `ready: false` and a `message` and `fix` on each failed
check.

For Account Abstraction clients on an EVM source, the `SOURCE_GAS` and
`SPONSORSHIP` checks are `null` on a quote, because the user operation is only
built when you create the transfer. For a Solana source, both are known on the
quote.




## OpenAPI

````yaml /openapi/client-api.yaml post /clients/me/integrations/cctp/quote
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/quote:
    post:
      tags:
        - CCTP
      summary: Quote a CCTP transfer
      description: >
        Returns Circle's fees, your custodian fee, the exact amount the

        recipient receives, the total that leaves the wallet (`totalDebit`) and
        the

        preflight checks for a transfer. Nothing is stored. A quote that can't
        go ahead

        still returns `200`, with `ready: false` and a `message` and `fix` on
        each failed

        check.


        For Account Abstraction clients on an EVM source, the `SOURCE_GAS` and

        `SPONSORSHIP` checks are `null` on a quote, because the user operation
        is only

        built when you create the transfer. For a Solana source, both are known
        on the

        quote.
      operationId: getCctpQuote
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CctpTransferRequest'
            example:
              sourceChain: eip155:84532
              destinationChain: eip155:43113
              amount: '0.09'
              speed: auto
      responses:
        '200':
          description: Quote
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CctpQuoteResponse'
              example:
                data:
                  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
        '400':
          description: >
            Bad request. Common causes:

            - The body is malformed or has unknown fields (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:
                $ref: '#/components/schemas/CctpErrorResponse'
              example:
                error: Send exactly one of amount or amountOut
                id: INVALID_AMOUNT
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: >-
            Circle's API is temporarily unavailable. Retry after
            `details.retryAfterSeconds`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CctpUpstreamUnavailableErrorResponse'
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
    CctpQuoteResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/CctpQuote'
    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
    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
    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'
    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'
    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.
  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.