> ## 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 payment intent

> Create a continuous (default) or transient payment intent. Continuous payment intents are created by default. To create a transient payment intent, the `type` field must be explicitly set to `transient`.

`purposeOfTransfer` is conditionally required: it must be supplied when the entity's legal entity is Circle SG (`CIRCLE_SG`), Circle Inc (`CIRCLE_INC`) with Managed Payments enabled, or Circle SAS (`CIRCLE_FR`); it is optional for other legal entities. `PMT006` is not allowed.

Eligible Circle SG (`CIRCLE_SG`) merchants can link a transient payment intent to a Travel Rule customer wallet by supplying `customerWalletId`.




## OpenAPI

````yaml openapi/payments.yaml post /v1/paymentIntents
openapi: 3.0.2
info:
  version: ${version}
  title: Crypto Deposits API
  description: >
    The Circle Payments API allows you to take payments from your end users via
    traditional methods such as debit & credit cards and receive settlement in
    USDC.


    The Circle Payments API has been designed with any business or internet
    commerce in mind, not just crypto applications, and it's based on Circle's
    extensive experience processing millions of card payments since 2014.
servers:
  - url: https://api-sandbox.circle.com
  - url: https://api.circle.com
security: []
tags:
  - name: Payments
    description: Create, cancel, refund, and get updates on card payments.
  - name: Crypto Payment Intents
    description: Create and track intent for end user to pay via crypto.
  - name: Crypto Payment Customers
    description: >-
      Create and manage Travel Rule customers and customer wallets for crypto
      payment attribution.
  - name: Crypto Payment Refund Addresses
    description: Create refund address-book entries for crypto payment refunds.
paths:
  /v1/paymentIntents:
    post:
      tags:
        - Crypto Payment Intents
      summary: Create a payment intent
      description: >
        Create a continuous (default) or transient payment intent. Continuous
        payment intents are created by default. To create a transient payment
        intent, the `type` field must be explicitly set to `transient`.


        `purposeOfTransfer` is conditionally required: it must be supplied when
        the entity's legal entity is Circle SG (`CIRCLE_SG`), Circle Inc
        (`CIRCLE_INC`) with Managed Payments enabled, or Circle SAS
        (`CIRCLE_FR`); it is optional for other legal entities. `PMT006` is not
        allowed.


        Eligible Circle SG (`CIRCLE_SG`) merchants can link a transient payment
        intent to a Travel Rule customer wallet by supplying `customerWalletId`.
      operationId: createPaymentIntent
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/ContinuousPaymentIntentCreationRequest'
                - $ref: '#/components/schemas/PaymentIntentCreationRequest'
              discriminator:
                propertyName: type
                mapping:
                  continuous: '#/components/schemas/ContinuousPaymentIntentCreationRequest'
                  transient: '#/components/schemas/PaymentIntentCreationRequest'
            examples:
              Transient Payment Intent:
                value:
                  idempotencyKey: ba943ff1-ca16-49b2-ba55-1057e70ca5c7
                  type: transient
                  amount:
                    amount: '3.14'
                    currency: USD
                  settlementCurrency: USD
                  paymentMethods:
                    - type: blockchain
                      chain: ETH
                  purposeOfTransfer: PMT001
                  expiresOn: '2026-07-01T20:13:35.578678Z'
                  customerWalletId: 9b8a7d6c-5e4f-4321-9c8b-123456789abc
                  metadata:
                    customerExternalRef: 310c458a-18eb-4cbd-8a9a-586d9448ae69
              Continuous Payment Intent:
                value:
                  idempotencyKey: ff0bcbfb-c58e-4f36-b0f3-beb4747f1c30
                  type: continuous
                  currency: USD
                  settlementCurrency: USD
                  paymentMethods:
                    - type: blockchain
                      chain: ETH
                  merchantWalletId: '212000'
                  purposeOfTransfer: PMT001
                  metadata:
                    customerExternalRef: 310c458a-18eb-4cbd-8a9a-586d9448ae69
      responses:
        '201':
          description: Successfully created a payment intent.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                title: CreatePaymentIntentResponse
                properties:
                  data:
                    oneOf:
                      - $ref: '#/components/schemas/PaymentIntent'
                      - $ref: '#/components/schemas/ContinuousPaymentIntent'
              examples:
                Transient Payment Intent:
                  value:
                    data:
                      id: 8755d0ea-14f9-4259-b092-de23c14b6568
                      amount:
                        amount: '3.14'
                        currency: USD
                      amountPaid:
                        amount: '0.00'
                        currency: USD
                      settlementCurrency: USD
                      paymentMethods:
                        - type: blockchain
                          chain: ETH
                          address: '0x8381470ED67C3802402dbbFa0058E8871F017A6F'
                      paymentIds: []
                      customerExternalRef: 310c458a-18eb-4cbd-8a9a-586d9448ae69
                      timeline:
                        - status: created
                          time: '2022-07-21T20:13:35.579331Z'
                      purposeOfTransfer: PMT001
                      expiresOn: '2022-08-04T20:13:35.578678Z'
                      customerWalletId: 9b8a7d6c-5e4f-4321-9c8b-123456789abc
                      createDate: '2022-07-21T20:13:35.578678Z'
                      updateDate: '2022-07-21T20:19:24.859052Z'
                Continuous Payment Intent:
                  value:
                    data:
                      id: e2e90ba3-9d1f-490d-9460-24ac6eb55a1b
                      currency: USD
                      settlementCurrency: USD
                      amountPaid:
                        amount: '0.00'
                        currency: USD
                      paymentMethods:
                        - type: blockchain
                          chain: ETH
                          address: '0x8381470ED67C3802402dbbFa0058E8871F017A6F'
                      timeline:
                        - status: created
                          time: '2023-01-21T20:13:35.579331Z'
                      type: continuous
                      purposeOfTransfer: PMT001
                      createDate: '2023-01-21T20:13:35.578678Z'
                      updateDate: '2023-01-21T20:13:35.578678Z'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/NotAuthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
        - bearerAuth: []
components:
  schemas:
    ContinuousPaymentIntentCreationRequest:
      type: object
      required:
        - idempotencyKey
        - currency
        - settlementCurrency
        - paymentMethods
        - merchantWalletId
      properties:
        idempotencyKey:
          $ref: '#/components/schemas/IdempotencyKey'
        currency:
          description: Desired currency for the payment
          type: string
          enum:
            - USD
            - EUR
        settlementCurrency:
          description: >-
            Desired currency for the payments to settle in. This must match the
            currency used for the payment.
          type: string
          enum:
            - USD
            - EUR
        paymentMethods:
          type: array
          items:
            $ref: '#/components/schemas/PaymentMethodBlockchainRequest'
        merchantWalletId:
          $ref: '#/components/schemas/MerchantWalletId'
        purposeOfTransfer:
          $ref: '#/components/schemas/PaymentIntentPurposeOfTransfer'
        type:
          type: string
          description: Payment intent type. Defaults to 'continuous' if not specified.
          enum:
            - continuous
          default: continuous
        metadata:
          $ref: '#/components/schemas/PaymentIntentMetadata'
    PaymentIntentCreationRequest:
      type: object
      required:
        - idempotencyKey
        - amount
        - settlementCurrency
        - paymentMethods
        - type
      properties:
        idempotencyKey:
          $ref: '#/components/schemas/IdempotencyKey'
        amount:
          $ref: '#/components/schemas/CryptoPaymentsMoney'
        settlementCurrency:
          description: >-
            Desired currency for the payments to settle in. This must match the
            currency used for the payment method.
          type: string
          enum:
            - USD
            - EUR
        paymentMethods:
          type: array
          items:
            $ref: '#/components/schemas/PaymentMethodBlockchain'
        merchantWalletId:
          $ref: '#/components/schemas/MerchantWalletId'
        purposeOfTransfer:
          $ref: '#/components/schemas/PaymentIntentPurposeOfTransfer'
        type:
          type: string
          description: >-
            Payment intent type. Must be explicitly set to 'transient' for
            transient payment intents.
          enum:
            - transient
        expiresOn:
          description: >
            The time at which the transient payment intent expires. Once
            expired, the payment intent will no longer accept payments.


            Required for merchants registered under Circle's US LLC or Singapore
            legal entities.
          allOf:
            - $ref: '#/components/schemas/UtcTimestamp'
        metadata:
          $ref: '#/components/schemas/PaymentIntentMetadata'
        customerWalletId:
          type: string
          format: uuid
          description: >-
            The ID of a registered customer wallet to link to this transient
            payment intent. Available for Circle Singapore (`CIRCLE_SG`)
            merchants with the Travel Rule customer entitlement. Supported on
            `transient` intents only.
          example: b3d9d2d5-4c12-4946-a09d-953e82fae2b0
        beneficiaryLei:
          $ref: '#/components/schemas/LegalEntityIdentifier'
    PaymentIntent:
      type: object
      required:
        - amount
        - settlementCurrency
        - paymentMethods
      properties:
        id:
          type: string
          description: Unique system generated identifier for the entity.
          format: uuid
          example: b8627ae8-732b-4d25-b947-1df8f4007a29
        amount:
          $ref: '#/components/schemas/CryptoPaymentsMoney'
        amountPaid:
          $ref: '#/components/schemas/CryptoPaymentsMoney'
        amountRefunded:
          $ref: '#/components/schemas/CryptoPaymentsMoney'
        settlementCurrency:
          description: Desired currency for the payments to settle in.
          type: string
          enum:
            - USD
        paymentMethods:
          type: array
          items:
            $ref: '#/components/schemas/PaymentMethodBlockchain'
        fees:
          type: array
          items:
            $ref: '#/components/schemas/PaymentIntentFees'
        paymentIds:
          description: List of associated payments.
          type: array
          items:
            type: string
            format: uuid
            example: 69808f36-3e5e-4f37-bf82-ca79e4d70fc1
        refundIds:
          description: List of associated refunds.
          type: array
          items:
            type: string
            format: uuid
            example: 425dca6d-ac79-43b6-b0f9-43fdc51de91b
        timeline:
          description: State management timeline.
          type: array
          items:
            $ref: '#/components/schemas/Timeline'
        expiresOn:
          $ref: '#/components/schemas/UtcTimestamp'
          description: >-
            The time at which the transient payment intent expires. Once
            expired, the payment intent will no longer accept payments. Must be
            no more than 24 hours after the time of creation. Values beyond 24
            hours, or values that are missing, malformed, or in the past, return
            error `1128`.
        updateDate:
          $ref: '#/components/schemas/UtcTimestamp'
        createDate:
          $ref: '#/components/schemas/UtcTimestamp'
        merchantWalletId:
          $ref: '#/components/schemas/MerchantWalletId'
        purposeOfTransfer:
          $ref: '#/components/schemas/PaymentIntentPurposeOfTransfer'
        customerExternalRef:
          $ref: '#/components/schemas/PaymentCustomerExternalRef'
          description: A customer-supplied reference to reconcile transactions.
        customerWalletId:
          type: string
          format: uuid
          description: >-
            Identifier of the customer wallet linked to the transient payment
            intent, when one was supplied at creation time.
          example: 9b8a7d6c-5e4f-4321-9c8b-123456789abc
    ContinuousPaymentIntent:
      type: object
      required:
        - currency
        - settlementCurrency
        - paymentMethods
        - type
      properties:
        id:
          $ref: '#/components/schemas/Id'
        currency:
          description: Desired currency of the payment.
          type: string
          enum:
            - USD
        amountPaid:
          $ref: '#/components/schemas/CryptoPaymentsMoney'
        amountRefunded:
          $ref: '#/components/schemas/CryptoPaymentsMoney'
        settlementCurrency:
          description: Desired currency for the payments to settle in.
          type: string
          enum:
            - USD
        paymentMethods:
          type: array
          items:
            $ref: '#/components/schemas/PaymentMethodBlockchain'
        fees:
          type: array
          items:
            $ref: '#/components/schemas/PaymentIntentFees'
        timeline:
          description: State management timeline.
          type: array
          items:
            $ref: '#/components/schemas/Timeline'
        updateDate:
          $ref: '#/components/schemas/UtcTimestamp'
        createDate:
          $ref: '#/components/schemas/UtcTimestamp'
        type:
          type: string
          enum:
            - continuous
        merchantWalletId:
          $ref: '#/components/schemas/MerchantWalletId'
        purposeOfTransfer:
          $ref: '#/components/schemas/PaymentIntentPurposeOfTransfer'
        customerExternalRef:
          $ref: '#/components/schemas/PaymentCustomerExternalRef'
          description: A customer-supplied reference to reconcile transactions.
    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
    PaymentMethodBlockchainRequest:
      type: object
      required:
        - type
        - chain
      properties:
        type:
          type: string
          enum:
            - blockchain
        chain:
          $ref: '#/components/schemas/Chain'
    MerchantWalletId:
      type: string
      description: Unique system generated identifier for the wallet of the merchant.
      maxLength: 36
      example: '212000'
    PaymentIntentPurposeOfTransfer:
      type: string
      description: >
        Payment reason code describing the purpose of the transfer for the
        payment intent.


        Conditionally required: it must be supplied when the entity's legal
        entity is Circle SG (`CIRCLE_SG`), or Circle Inc (`CIRCLE_INC`) with
        Managed Payments enabled. It is optional for all other legal entities.


        `PMT006` (Transfer to own account) is not allowed for payment intents. A
        missing value (when required) or a disallowed/invalid value returns
        error code `INVALID_PURPOSE_OF_TRANSFER`.
      enum:
        - PMT000
        - PMT001
        - PMT002
        - PMT003
        - PMT004
        - PMT005
        - PMT007
        - PMT008
        - PMT009
        - PMT010
        - PMT011
        - PMT012
        - PMT013
        - PMT014
        - PMT015
        - PMT016
        - PMT017
        - PMT018
        - PMT019
        - PMT020
        - PMT021
        - PMT022
        - PMT023
        - PMT024
        - PMT025
        - PMT026
        - PMT027
        - PMT028
        - PMT029
        - PMT030
      example: PMT001
    PaymentIntentMetadata:
      type: object
      description: Optional metadata associated with the payment intent.
      properties:
        customerExternalRef:
          $ref: '#/components/schemas/PaymentCustomerExternalRef'
          description: A customer-supplied reference to reconcile transactions.
    CryptoPaymentsMoney:
      type: object
      required:
        - amount
        - currency
      properties:
        amount:
          description: Magnitude of the amount, in units of the currency, with a `.`.
          type: string
          example: '3.14'
        currency:
          description: Currency code.
          type: string
          enum:
            - USD
            - EUR
    PaymentMethodBlockchain:
      type: object
      required:
        - type
        - chain
      properties:
        type:
          type: string
          enum:
            - blockchain
        chain:
          type: string
          description: The blockchain network for the payment.
          enum:
            - ALGO
            - ARB
            - AVAX
            - BASE
            - BTC
            - ETH
            - HBAR
            - NOBLE
            - OP
            - POLY
            - SOL
            - SUI
            - XLM
        address:
          type: string
          example: '0x8381470ED67C3802402dbbFa0058E8871F017A6F'
    UtcTimestamp:
      type: string
      description: ISO-8601 UTC date/time format.
      example: '2020-04-10T02:13:30.000Z'
    LegalEntityIdentifier:
      type: string
      description: >
        Optional. Legal entity identifier (LEI). Unique global identifier for
        legal entities. Primarily relevant for French (CIRCLE_FR) entities.
      example: 529900T8BM49AURSDO55
    PaymentIntentFees:
      type: object
      required:
        - type
        - amount
        - currency
      properties:
        type:
          type: string
          enum:
            - blockchainLeaseFee
            - totalPaymentFees
        amount:
          description: Magnitude of the amount, in units of the currency, with a `.`.
          type: string
          example: '3.14'
        currency:
          description: Currency code.
          type: string
          enum:
            - USD
    Timeline:
      type: object
      required:
        - status
        - time
      properties:
        status:
          type: string
          enum:
            - created
            - pending
            - complete
            - expired
            - failed
            - refunded
        context:
          type: string
          enum:
            - underpaid
            - paid
            - overpaid
        reason:
          type: string
          enum:
            - requested_by_merchant
            - fee_collection_failed
        time:
          description: ISO-8601 UTC date/time format.
          type: string
          format: date-time
    PaymentCustomerExternalRef:
      type: string
      format: uuid
      description: >-
        A customer-supplied reference for reconciliation purposes, used on
        payment intents, payments, and refunds. Must be a UUID. Payouts and
        transfers use a separate 21-character limit schema.
      example: 310c458a-18eb-4cbd-8a9a-586d9448ae69
    Id:
      type: string
      description: Unique system generated identifier for the entity.
      format: uuid
      example: b8627ae8-732b-4d25-b947-1df8f4007a29
    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
  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.
    Forbidden:
      description: >-
        The request provides authentication, but the authenticated user does not
        possess sufficient permissions for accessing this resource.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            type: object
            title: Forbidden
            required:
              - code
              - message
            properties:
              code:
                type: integer
                example: 400
              message:
                type: string
                example: Something went wrong.
            example:
              code: 3
              message: Forbidden
          examples:
            response:
              value:
                code: 3
                message: Forbidden
    NotFound:
      description: The specified resource was not found.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            type: object
            title: NotFound
            required:
              - code
              - message
            properties:
              code:
                type: integer
                example: 400
              message:
                type: string
                example: Something went wrong.
            example:
              code: 404
              message: Not found.
          examples:
            response:
              value:
                code: 404
                message: Not found.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````