> ## 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 recipient address

> Stores an external blockchain address. Once added, the recipient address must be verified to ensure that you know and trust each new address.

**cirBTC recipients:** Recipient addresses for cirBTC flows are registered with one of these `chain` and `currency` pairs:
- `chain=ETH` with `currency=CIRBTC` for onchain cirBTC transfers.
- `chain=BTC` with `currency=BTC` for native Bitcoin recipients. To redeem cirBTC to native Bitcoin, create a transfer with `amount.currency=CIRBTC` to a recipient of this form; Circle will burn the cirBTC and release the equivalent amount of native Bitcoin (1:1) to the Bitcoin address.

**For France customers:**

Circle Mint France customers must verify all transfer recipients using the UI in the Circle Console, as transfers from unverified addresses will be held in pending status. Please see Help Center articles below for details:
- [Circle Mint France Travel Rule](https://help.circle.com/s/article/Circle-Mint-France-Travel-Rule)
- [Circle Mint France wallet verification](https://help.circle.com/s/article/Circle-Mint-France-wallet-verification)




## OpenAPI

````yaml openapi/account.yaml post /v1/businessAccount/wallets/addresses/recipient
openapi: 3.0.2
info:
  version: ${version}
  title: Core Functionality
  description: >
    All of Circle's APIs share a common set of core functionality that lets you
    manage your Circle Account in a programmatic way.


    With a Circle Account your business can deposit traditional money from 80+
    countries and seamlessly convert them into "digital currency dollars": USDC.
    You can then use USDC for everyday payments and treasury flows.
servers:
  - url: https://api-sandbox.circle.com
  - url: https://api.circle.com
security: []
tags:
  - name: Balances
    description: Get information on settled and unsettled balances.
  - name: Payouts
    description: Create and get information on 1st party payouts.
  - name: Wires
    description: >-
      Create, get instructions, and get information on 1st party bank accounts
      for wire transfers.
  - name: CUBIX
    description: Create and get information on CUBIX accounts.
  - name: PIX
    description: Create and get information on PIX accounts.
  - name: Transfers
    description: Create and get information on 1st party transfers.
  - name: Addresses
    description: Generate and get information on blockchain addresses.
  - name: Deposits
    description: Get information on 1st party deposits.
  - name: Payments
    description: Create, cancel, refund, and get updates on card payments.
  - name: Settlement Bank Routing
    description: View and manage settlement bank routing preferences for fiat accounts.
  - name: Reporting
    description: >-
      Retrieve transaction and balance reports, including ISO 20022 (CAMT.053)
      statements and managed-payment reports.
paths:
  /v1/businessAccount/wallets/addresses/recipient:
    post:
      tags:
        - Addresses
      summary: Create a recipient address
      description: >
        Stores an external blockchain address. Once added, the recipient address
        must be verified to ensure that you know and trust each new address.


        **cirBTC recipients:** Recipient addresses for cirBTC flows are
        registered with one of these `chain` and `currency` pairs:

        - `chain=ETH` with `currency=CIRBTC` for onchain cirBTC transfers.

        - `chain=BTC` with `currency=BTC` for native Bitcoin recipients. To
        redeem cirBTC to native Bitcoin, create a transfer with
        `amount.currency=CIRBTC` to a recipient of this form; Circle will burn
        the cirBTC and release the equivalent amount of native Bitcoin (1:1) to
        the Bitcoin address.


        **For France customers:**


        Circle Mint France customers must verify all transfer recipients using
        the UI in the Circle Console, as transfers from unverified addresses
        will be held in pending status. Please see Help Center articles below
        for details:

        - [Circle Mint France Travel
        Rule](https://help.circle.com/s/article/Circle-Mint-France-Travel-Rule)

        - [Circle Mint France wallet
        verification](https://help.circle.com/s/article/Circle-Mint-France-wallet-verification)
      operationId: createBusinessRecipientAddress
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BusinessRecipientAddressCreationRequest'
      responses:
        '200':
          description: Successfully added a recipient address.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                title: CreateBusinessRecipientAddressResponse
                properties:
                  data:
                    $ref: '#/components/schemas/BusinessRecipientAddressObject'
              examples:
                response:
                  value:
                    data:
                      id: b8627ae8-732b-4d25-b947-1df8f4007a29
                      address: '0x8381470ED67C3802402dbbFa0058E8871F017A6F'
                      addressTag: '123456789'
                      chain: ALGO
                      currency: USD
                      description: My USDC address at a cryptocurrency exchange
                      status: active
                      verificationChallenge:
                        satoshiTest:
                          destinationAddress: '0x8f3b2c1a9d4e4f6ab7c81e2d3f4a5b6c7d8e9f01'
                          paymentId: '1234567890'
                          amount:
                            amount: '0.42'
                            currency: USD
                          status: active
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/NotAuthorized'
      security:
        - bearerAuth: []
components:
  schemas:
    BusinessRecipientAddressCreationRequest:
      type: object
      description: >-
        Adds a recipient address. The currency parameter will default to USD for
        all chains except for BTC where it defaults to BTC.
      required:
        - idempotencyKey
        - address
        - chain
        - description
      properties:
        idempotencyKey:
          $ref: '#/components/schemas/IdempotencyKey'
        address:
          $ref: '#/components/schemas/Address'
        addressTag:
          $ref: '#/components/schemas/AddressTag'
        chain:
          $ref: '#/components/schemas/Chain'
        currency:
          $ref: '#/components/schemas/Currency'
        description:
          $ref: '#/components/schemas/AddressDescription'
        ownership:
          $ref: '#/components/schemas/AddressBookRecipientOwnership'
    BusinessRecipientAddressObject:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/Id'
        address:
          $ref: '#/components/schemas/Address'
        addressTag:
          $ref: '#/components/schemas/AddressTag'
        chain:
          $ref: '#/components/schemas/Chain'
        currency:
          $ref: '#/components/schemas/Currency'
        description:
          $ref: '#/components/schemas/AddressDescription'
        status:
          type: string
          enum:
            - active
            - pending_verification
            - verification_succeeded
        verificationChallenge:
          $ref: '#/components/schemas/RecipientVerificationChallenge'
    IdempotencyKey:
      type: string
      description: >-
        Universally unique identifier (UUID v4) idempotency key. This key is
        utilized to ensure exactly-once execution of mutating requests.
      format: uuid
      example: ba943ff1-ca16-49b2-ba55-1057e70ca5c7
    Address:
      type: string
      description: >
        An alphanumeric string representing a blockchain address. Formatting
        varies by blockchain.

        Be sure to preserve the exact formatting and capitalization of the
        address.  

        **Important:** For Ripple (XRP) addresses, only the classic address
        format is supported (for example,
        `rPEPPER7kfTD9w2To4CQk6UCfuHM9c6GDY`).  

        The `x-address` format is NOT supported currently (for example,
        `XV5sbjUmgPpvXv4ixFWZ5ptAYZ6PD2q1qM6owqNbug8W6KV`).
      example: '0x8381470ED67C3802402dbbFa0058E8871F017A6F'
    AddressTag:
      type: string
      description: >-
        The secondary identifier for a blockchain address. An example of this is
        the memo field on the Stellar network, which can be text, id, or hash
        format.
      nullable: true
      example: '123456789'
    Chain:
      type: string
      description: A blockchain that a given currency is available on.
      enum:
        - ALGO
        - APTOS
        - ARB
        - ARC
        - AVAX
        - BASE
        - BTC
        - CELO
        - CODEX
        - ETH
        - HBAR
        - HYPEREVM
        - INK
        - LINEA
        - NEAR
        - NOBLE
        - OP
        - PLUME
        - PAH
        - PLASMA
        - POLY
        - SEI
        - SOL
        - SONIC
        - SUI
        - UNI
        - WORLDCHAIN
        - XLAYER
        - XDC
        - XLM
        - XRP
        - ZKS
    Currency:
      type: string
      description: A currency associated with a balance or address.
      nullable: true
      enum:
        - USD
        - EUR
        - BTC
        - ETH
        - CIRBTC
    AddressDescription:
      type: string
      description: An identifier or sentence that describes the recipient.
      example: My USDC address at a cryptocurrency exchange
    AddressBookRecipientOwnership:
      type: object
      description: >
        Ownership and custody of the wallet for Travel Rule and compliance.


        Validation errors can include codes such as `2025` (ownership missing),
        `2026` (VASP ID missing when required), `2027`–`2030`, `2035` (VASP ID
        not allowed when custody is `self_hosted`), and `2037` (ownership cannot
        be updated via PATCH).
      required:
        - type
        - custody
      properties:
        type:
          type: string
          description: Whether the wallet is first-party or third-party.
          enum:
            - first_party
            - third_party
        custody:
          $ref: '#/components/schemas/AddressBookRecipientCustody'
    Id:
      type: string
      description: Unique system generated identifier for the entity.
      format: uuid
      example: b8627ae8-732b-4d25-b947-1df8f4007a29
    RecipientVerificationChallenge:
      type: object
      description: |
        Verification challenge for a self-hosted recipient address.
      properties:
        satoshiTest:
          type: object
          description: Satoshi-test verification challenge details.
          properties:
            destinationAddress:
              type: string
              description: Circle-controlled address to send the satoshi-test deposit to.
              example: '0x8f3b2c1a9d4e4f6ab7c81e2d3f4a5b6c7d8e9f01'
            paymentId:
              type: string
              description: >-
                Secondary identifier (memo, tag, or paymentId) to include with
                the deposit when the chain requires it.
              example: '1234567890'
            amount:
              type: object
              description: >-
                The satoshi-test deposit amount to send. The currency matches
                the recipient address's `currency`.
              properties:
                amount:
                  type: string
                  description: Amount, in units of the currency.
                  example: '0.42'
                currency:
                  $ref: '#/components/schemas/Currency'
            status:
              type: string
              description: Current state of the verification challenge.
              enum:
                - active
                - expired
                - succeeded
    AddressBookRecipientCustody:
      type: object
      description: >
        Wallet custody details. When `type` is `hosted`, `vaspId` is required
        and must match an identifier returned by `GET /v1/addressBook/vasps`.
        When `type` is `self_hosted`, do not send `vaspId`.
      required:
        - type
      properties:
        type:
          type: string
          description: >-
            Whether the wallet is hosted by a Virtual Asset Service Provider
            (VASP) or self-hosted.
          enum:
            - hosted
            - self_hosted
        vaspId:
          type: string
          format: uuid
          description: >-
            Identifier of the VASP that hosts the wallet. Required when `type`
            is `hosted`. Must not be set when `type` is `self_hosted`.
          example: 550e8400-e29b-41d4-a716-446655440000
  headers:
    XRequestId:
      description: >-
        Universally unique identifier (UUID v4) for the request. Helpful for
        identifying a request when communicating with Circle support.
      schema:
        type: string
        format: uuid
        example: 2adba88e-9d63-44bc-b975-9b6ae3440dde
  responses:
    BadRequest:
      description: The request cannot be processed due to a client error.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            type: object
            title: BadRequest
            required:
              - code
              - message
            properties:
              code:
                type: integer
                example: 400
              message:
                type: string
                example: Something went wrong.
            example:
              code: 400
              message: Bad request.
          examples:
            response:
              value:
                code: 400
                message: Bad request.
    NotAuthorized:
      description: >-
        The request has not been applied because it lacks valid authentication
        credentials.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            type: object
            title: NotAuthorized
            required:
              - code
              - message
            properties:
              code:
                type: integer
                example: 400
              message:
                type: string
                example: Something went wrong.
            example:
              code: 401
              message: Malformed authorization.
          examples:
            response:
              value:
                code: 401
                message: Malformed authorization.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````