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

> ## Agent Instructions
> Before reading these docs, install the relevant Circle Skill to get pre-loaded context — skills are LLM-optimized and cover architecture decisions, correct flows, and common pitfalls. In Claude Code: run /plugin marketplace add circlefin/skills then /plugin install circle-skills@circle. With Vercel Skills CLI: run npx skills add circlefin/skills. Available skills: use-usdc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-usdc/SKILL.md (balances, transfers, approvals on EVM and Solana); EURC has no skill — see https://developers.circle.com/stablecoins/what-is-eurc.md; bridge-stablecoin https://github.com/circlefin/skills/blob/master/plugins/circle/skills/bridge-stablecoin/SKILL.md (crosschain transfers via CCTP, USDC, EURC, and third-party assets); use-arc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-arc/SKILL.md (Arc chain config, contract deployment, USDC bridging — Arc docs: https://docs.arc.io/llms.txt); use-circle-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-circle-wallets/SKILL.md (choose wallet type); use-developer-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-developer-controlled-wallets/SKILL.md (custodial wallets for payouts and treasury); use-user-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-user-controlled-wallets/SKILL.md (embedded wallets with Web2 login); use-modular-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-modular-wallets/SKILL.md (smart contract wallets with passkeys and ERC-4337); use-gateway https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-gateway/SKILL.md (unified USDC balance, nanopayments); use-smart-contract-platform https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-smart-contract-platform/SKILL.md (deploy, interact, monitor contracts). Pair any skill with the Circle MCP server for live SDK signatures, contract addresses, and chain IDs: {"mcpServers":{"circle":{"url":"https://api.circle.com/v1/codegen/mcp"}}}.
> Read the product overview first. Each product has an overview explaining when and why to use it. Read it before quickstarts.
> Pick the right wallet type. Developer-controlled (you hold keys), user-controlled (end user holds keys via PIN/social login), or modular (smart contract wallets with passkeys). See https://developers.circle.com/wallets.md.
> Use CCTP V2 for crosschain transfers. CCTP natively transfers USDC and EURC via burn-and-mint, and supports permissionless wrapping of third-party assets via lock-and-mint. V1 is legacy; always use V2 unless V1 is specified or the chain requires it (Noble, Sui, and Aptos still require V1). Migration guide: https://developers.circle.com/cctp/migration-from-v1-to-v2.md.
> Use Bridge Kit for frontend bridging. Wraps CCTP with a simpler SDK for user-facing apps. Use CCTP directly for backend transfers.
> Gas Station vs Paymaster. Gas Station sponsors gas for Circle Wallet transactions. Paymaster lets users pay gas in USDC. Different use cases — read both overviews.
> Gateway Nanopayments for sub-cent payments. Gasless USDC micropayments down to $0.000001 via x402 and batched settlement. For pay-per-request APIs, AI agent payments, streaming.
> Look up USDC addresses per chain. Never hardcode — use https://developers.circle.com/stablecoins/usdc-contract-addresses.md.
> Prefer SDKs over raw API calls. Node.js and Python SDKs handle auth, retries, and errors.
> API key required. Bearer token in Authorization header. Testnet and mainnet use separate keys and may use different base URLs depending on the product.
> Set up webhooks when available. Most operations are async. Webhooks deliver transaction confirmations and state changes.
> When calling list endpoints, paginate using pageSize and pageAfter until no nextPageAfter cursor is returned—stopping at the first page silently misses records.
> Building an AI agent? Start with the Agent Stack—Circle CLI, agent wallets, and nanopayments built for autonomous use cases: https://developers.circle.com/agent-stack.md.

# Create a transfer attestation for transferring tokens

> Generates a transfer attestation and operator signature for transferring tokens between domains



## OpenAPI

````yaml openapi/gateway.yaml post /v1/transfer
openapi: 3.0.3
info:
  title: Circle Gateway
  version: 1.0.0
  description: >
    Circle Gateway allows you to create a chain-abstracted USDC balance and
    transfer it instantly to any supported destination chain.
servers:
  - url: https://gateway-api-testnet.circle.com
  - url: https://gateway-api.circle.com
security: []
tags:
  - name: Gateway
    description: >-
      Endpoints for getting a unified USDC balance and creating attestations for
      transfer
  - name: Gateway Batch
    description: Endpoints for batch processing of EIP-3009 authorizations
  - name: Webhook Subscriptions
    description: Manage webhook subscriptions for Gateway event notifications.
paths:
  /v1/transfer:
    post:
      tags:
        - Gateway
      summary: Create a transfer attestation for transferring tokens
      description: >-
        Generates a transfer attestation and operator signature for transferring
        tokens between domains
      operationId: CreateTransferAttestation
      parameters:
        - in: query
          name: maxAttestationSize
          required: false
          schema:
            type: integer
            minimum: 1
          description: >-
            Maximum allowed size (in bytes) for the encoded attestation. If the
            attestation exceeds this size, the request will be rejected with a
            400 error.
        - in: query
          name: enableForwarder
          required: false
          schema:
            type: boolean
            default: false
          description: >-
            Whether to enable the forwarding service for automatic mint
            submission.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAttestationRequest'
      responses:
        '201':
          description: Successfully created transfer attestation or attestation set
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferResponse'
        '400':
          description: Invalid request parameters or invalid burn intent(s)
        '500':
          description: Internal server error
components:
  schemas:
    CreateAttestationRequest:
      type: array
      description: >-
        Batch of signed burn intents or burn intent sets. Burn intent sets are
        only supported for EVM source domains.
      minItems: 1
      items:
        oneOf:
          - $ref: '#/components/schemas/SignedBurnIntent'
          - $ref: '#/components/schemas/SignedBurnIntentSet'
    TransferResponse:
      type: object
      description: >-
        Response containing a transfer attestation or attestation set and
        operator signature
      properties:
        transferId:
          type: string
          format: uuid
          description: The unique identifier of the transfer.
        attestation:
          type: string
          pattern: ^0x[a-fA-F0-9]+$
          description: >-
            The byte-encoded transfer attestation or attestation set that should
            be passed to the minter contract
        signature:
          type: string
          pattern: ^0x[a-fA-F0-9]+$
          description: >-
            The signature of the operator on the byte-encoded transfer
            attestation or attestation set
        fees:
          $ref: '#/components/schemas/FeeSummary'
          description: Information on the transfer fees to be charged.
        expirationBlock:
          type: string
          description: >-
            The block number on the destination chain after which this
            attestation expires.
      required:
        - attestation
        - signature
        - transferId
        - fees
        - expirationBlock
    SignedBurnIntent:
      type: object
      properties:
        burnIntent:
          $ref: '#/components/schemas/BurnIntent'
        signature:
          type: string
          pattern: ^0x[a-fA-F0-9]+$
          description: The signature over the burnIntent.
      required:
        - burnIntent
        - signature
    SignedBurnIntentSet:
      type: object
      properties:
        burnIntentSet:
          $ref: '#/components/schemas/BurnIntentSet'
        signature:
          type: string
          pattern: ^0x[a-fA-F0-9]+$
          description: The signature over the burnIntentSet.
      required:
        - burnIntentSet
        - signature
    FeeSummary:
      type: object
      description: Aggregated fee information for a transfer request.
      properties:
        total:
          type: string
          description: Total fees from all burn intents across chains.
          example: '1.178'
        token:
          $ref: '#/components/schemas/Token'
          description: Token symbol.
          example: USDC
        perIntent:
          type: array
          items:
            $ref: '#/components/schemas/IntentFee'
          description: List of fee breakdowns for each burn intent.
        forwardingFee:
          type: string
          description: Forwarding fee charged for the transfer.
          example: '0.210000'
      required:
        - total
        - token
        - perIntent
    BurnIntent:
      type: object
      properties:
        maxBlockHeight:
          $ref: '#/components/schemas/Uint256'
          description: The maximum block height at which this burn is valid.
        maxFee:
          $ref: '#/components/schemas/Uint256'
          description: The maximum fee the user is willing to pay.
        spec:
          $ref: '#/components/schemas/TransferSpec'
        recipientSetupOptions:
          $ref: '#/components/schemas/RecipientSetupOptions'
      required:
        - maxBlockHeight
        - maxFee
        - spec
    BurnIntentSet:
      type: object
      properties:
        intents:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/BurnIntent'
      required:
        - intents
    Token:
      type: string
      description: Supported tokens for Gateway
      enum:
        - USDC
    IntentFee:
      type: object
      description: Fee breakdown for a single burn intent.
      properties:
        transferSpecHash:
          $ref: '#/components/schemas/Bytes32'
          description: Keccak256 hash of the encoded transfer specification.
        domain:
          $ref: '#/components/schemas/Domain'
          description: >-
            The domain ID of the chain where the burn intent originated
            (uint32).
        baseFee:
          type: string
          description: Fixed gas fee charged for the burn transaction.
          example: '2'
        transferFee:
          type: string
          description: Variable fee based on transfer amount. Omitted for same-chain burns.
          example: '0.125'
      required:
        - transferSpecHash
        - domain
        - baseFee
    Uint256:
      type: string
      description: A large integer value, represented as a string.
      example: '1000000000000000000'
    TransferSpec:
      type: object
      properties:
        version:
          type: integer
          minimum: 0
          maximum: 4294967295
          description: Version of the transfer spec (uint32).
          example: 1
        sourceDomain:
          type: integer
          minimum: 0
          maximum: 4294967295
          description: The domain of the wallet contract this transfer came from (uint32).
          example: 0
        destinationDomain:
          type: integer
          minimum: 0
          maximum: 4294967295
          description: >-
            The domain of the minter contract this transfer is valid for
            (uint32).
          example: 4
        sourceContract:
          $ref: '#/components/schemas/Bytes32'
          description: >-
            The address of the wallet contract on the source domain (32-byte
            padded).
        destinationContract:
          $ref: '#/components/schemas/Bytes32'
          description: >-
            The address of the minter contract on the destination domain
            (32-byte padded).
        sourceToken:
          $ref: '#/components/schemas/Bytes32'
          description: The token address on the source domain (32-byte padded).
        destinationToken:
          $ref: '#/components/schemas/Bytes32'
          description: The token address on the destination domain (32-byte padded).
        sourceDepositor:
          $ref: '#/components/schemas/Bytes32'
          description: >-
            The address to debit within the wallet contract on the source domain
            (32-byte padded).
        destinationRecipient:
          $ref: '#/components/schemas/Bytes32'
          description: >-
            The address that should receive the funds on the destination domain
            (32-byte padded).
        sourceSigner:
          $ref: '#/components/schemas/Bytes32'
          description: The signer who signed for the transfer (32-byte padded).
        destinationCaller:
          $ref: '#/components/schemas/Bytes32'
          description: >-
            The address of the caller who may use the attestation, 0 address if
            any caller (32-byte padded).
        value:
          $ref: '#/components/schemas/Uint256'
          description: The amount to be transferred.
        salt:
          $ref: '#/components/schemas/Bytes32'
          description: An arbitrary value chosen by the user to be unique.
        hookData:
          $ref: '#/components/schemas/Hex'
          description: Arbitrary bytes that may be used for onchain composition (optional).
      required:
        - version
        - sourceDomain
        - destinationDomain
        - sourceContract
        - destinationContract
        - sourceToken
        - destinationToken
        - sourceDepositor
        - destinationRecipient
        - sourceSigner
        - destinationCaller
        - value
        - salt
    RecipientSetupOptions:
      type: object
      description: >-
        Options for automatic Associated Token Account (ATA) creation on Solana.
        When the destination chain is Solana, the destinationRecipient must be
        an initialized USDC token account. If the recipient does not already
        have one, the Forwarding Service can create the ATA as part of the mint
        transaction. Omit this field if the recipient already has a USDC token
        account.
      properties:
        includeRecipientSetup:
          type: boolean
          description: >-
            Set to true to request automatic ATA creation. The Solana rent cost
            for token account creation will be included in the forwarding fee.
        recipientOwnerAddress:
          $ref: '#/components/schemas/Bytes32'
          description: >-
            The recipient's Solana wallet address in bytes32 hex format (32
            bytes, hex-encoded).
      required:
        - includeRecipientSetup
        - recipientOwnerAddress
    Bytes32:
      type: string
      pattern: ^0x[a-fA-F0-9]{64}$
      example: '0x1234567890123456789012345678901234567890123456789012345678901234'
      description: A 32-byte hex string.
    Domain:
      type: integer
      enum:
        - 0
        - 1
        - 2
        - 3
        - 5
        - 6
        - 7
        - 10
        - 13
        - 14
        - 16
        - 19
        - 26
      description: |
        Circle domain identifiers for supported chains:

        - 0 - Ethereum
        - 1 - Avalanche
        - 2 - OP
        - 3 - Arbitrum
        - 5 - Solana
        - 6 - Base
        - 7 - Polygon PoS
        - 10 - Unichain
        - 13 - Sonic
        - 14 - World Chain
        - 16 - Sei
        - 19 - HyperEVM
        - 26 - Arc
    Hex:
      type: string
      pattern: ^0x[a-fA-F0-9]*$
      example: '0x1a2b3c4d'
      description: A hex string.

````