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

# Create an ACH bank account

> Create a bank account for ACH transfers.



## OpenAPI

````yaml openapi/accounts.yaml post /v1/banks/ach
openapi: 3.0.2
info:
  version: 1.0.0
  title: Accounts (Stablecoin) API
  description: >
    Circle's Accounts API provides endpoints for managing stablecoin accounts --
    including transfers,

    withdrawals, deposits, wire and ACH bank accounts, and blockchain addresses.


    An **Account** is a general representation of a ledger or custody object
    that holds balances. It can be a business account,

    a stablecoin account ledger for an end user, an extra sub-ledger, or any
    future custody solution.
  license:
    name: Circle License
    url: https://circle.com/terms
servers:
  - url: https://api-sandbox.circle.com
  - url: https://api.circle.com
security: []
tags:
  - name: Accounts
    description: Manage accounts.
  - name: Account Groups
    description: Manage custody account groups and their memberships.
  - name: Transactions
    description: |
      Get a unified, customer-friendly view of account transaction activity.
  - name: Transfers
    description: Manage account transfers.
  - name: Withdrawals
    description: Manage account bank withdrawals (fiat offramp).
  - name: Wires
    description: Manage account bank accounts for wire transfers.
  - name: ACH
    description: Manage account bank accounts for ACH transfers.
  - name: Deposits
    description: Get information on account bank deposits.
  - name: Deposit Addresses
    description: Manage account deposit addresses.
  - name: Recipient Addresses
    description: Manage account recipient addresses used for transfers.
paths:
  /v1/banks/ach:
    post:
      tags:
        - ACH
      summary: Create an ACH bank account
      description: Create a bank account for ACH transfers.
      operationId: createACHAccount
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ACHCreationRequest'
      responses:
        '201':
          description: Successfully created a bank account for ACH transfers.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateACHAccountResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/NotAuthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - bearerAuth: []
components:
  schemas:
    ACHCreationRequest:
      description: Request object used to create a bank account for ACH transfers.
      type: object
      required:
        - idempotencyKey
        - accountNumber
        - routingNumber
        - accountType
        - billingDetails
      properties:
        idempotencyKey:
          $ref: '#/components/schemas/IdempotencyKey'
        accountNumber:
          description: Account number that identifies the bank account.
          type: string
          maxLength: 30
          example: '424233434333'
        routingNumber:
          description: ABA routing number for the bank account.
          type: string
          minLength: 9
          maxLength: 9
          example: '121000248'
        accountType:
          $ref: '#/components/schemas/ACHAccountType'
        billingDetails:
          $ref: '#/components/schemas/ACHBillingDetailsRequest'
    CreateACHAccountResponse:
      title: CreateACHAccountResponse
      properties:
        data:
          $ref: '#/components/schemas/ACH'
      example:
        data:
          id: 4771bc24-fcb7-4046-a94d-39feec11a4a0
          status: pending
          routingNumber: '121000248'
          description: WELLS FARGO BANK, NA ****4333
          accountType: checking
          billingDetails:
            name: Joe Bloggs
            line1: Address1
            line2: Address2
            city: City
            postalCode: '123'
            district: CA
            country: US
          fingerprint: 8c2afcd1-640f-4160-a303-659e1919b8e5
          createDate: '2026-06-08T21:56:49.310Z'
          updateDate: '2026-06-08T21:56:49.310Z'
    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
    ACHAccountType:
      description: Type of the bank account.
      type: string
      enum:
        - checking
        - savings
      example: checking
    ACHBillingDetailsRequest:
      type: object
      required:
        - name
      properties:
        name:
          type: string
          description: Full name of the bank account holder.
          maxLength: 1024
          minLength: 3
          pattern: ^[\x20-\x7E]{3,1024}$
          example: Joe Bloggs
        line1:
          type: string
          description: Line one of the street address.
          maxLength: 1024
          example: Address1
        line2:
          type: string
          description: Line two of the street address.
          maxLength: 1024
          example: Address2
        city:
          type: string
          description: City portion of the address.
          maxLength: 1024
          example: City
        postalCode:
          type: string
          description: Postal / ZIP code of the address.
          maxLength: 16
          example: '123'
        district:
          type: string
          description: State / County / Province / Region portion of the address.
          example: CA
        country:
          type: string
          description: Country portion of the address. ISO 3166-1 alpha-2.
          example: US
        email:
          type: string
          description: Email address of the bank account holder.
          maxLength: 1024
          example: joe.bloggs@example.com
        phone:
          type: string
          description: Phone number of the bank account holder in E.164 format.
          pattern: ^\+?[1-9]\d{1,14}$
          example: '+14155550100'
    XRequestId:
      type: string
      format: uuid
      example: 2adba88e-9d63-44bc-b975-9b6ae3440dde
    ACH:
      type: object
      description: An ACH bank account.
      required:
        - id
        - status
        - routingNumber
        - description
        - accountType
        - billingDetails
        - fingerprint
        - createDate
        - updateDate
      properties:
        id:
          $ref: '#/components/schemas/Id'
        type:
          type: string
          example: ach
        status:
          $ref: '#/components/schemas/ExternalFiatAccountStatus'
        routingNumber:
          description: ABA routing number for the bank account.
          type: string
          example: '121000248'
        description:
          type: string
          description: Bank name plus last four digits of the bank account number.
          example: WELLS FARGO BANK, NA ****4333
        accountType:
          $ref: '#/components/schemas/ACHAccountType'
        billingDetails:
          $ref: '#/components/schemas/BillingDetails'
        fingerprint:
          $ref: '#/components/schemas/Fingerprint'
        riskEvaluation:
          $ref: '#/components/schemas/RiskEvaluation'
        createDate:
          $ref: '#/components/schemas/UtcTimestamp'
        updateDate:
          $ref: '#/components/schemas/UtcTimestamp'
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: integer
          description: >
            Circle internal status code from the platform `CoreStatusCode` enum
            (and its domain-specific extensions). **This is not the HTTP status
            code** — `-1` is the catch-all unknown error, `1`/`2` indicate API
            parameter problems, `3` is forbidden, `4` is unauthorized, and
            larger values identify domain-specific failures. Consumers should
            rely on the HTTP status line for transport-level error class and on
            this field for the specific Circle error case.
          example: 2
        message:
          type: string
          description: >-
            Internal error message; suitable for logging but not for end-user
            display.
          example: API parameter invalid.
        externalMessage:
          type: string
          description: >
            End-user-displayable error message. Present when the server has
            generated a customer-facing variant for this error; omitted
            otherwise.
          example: The provided amount exceeds the maximum allowed.
    Id:
      type: string
      description: Unique system-generated identifier for the entity.
      format: uuid
      example: b8627ae8-732b-4d25-b947-1df8f4007a29
    ExternalFiatAccountStatus:
      description: Status of the account.
      type: string
      enum:
        - pending
        - complete
        - failed
    BillingDetails:
      type: object
      required:
        - name
        - city
        - country
        - line1
        - postalCode
      properties:
        name:
          type: string
          description: Full name of the card or bank account holder.
          maxLength: 1024
          example: Satoshi Nakamoto
        city:
          type: string
          description: City portion of the address.
          maxLength: 1024
          example: Boston
        country:
          type: string
          description: Country portion of the address. ISO 3166-1 alpha-2.
          maxLength: 2
          example: US
        line1:
          type: string
          description: Line one of the street address.
          maxLength: 1024
          example: 100 Money Street
        line2:
          type: string
          description: Line two of the street address.
          maxLength: 1024
          example: Suite 1
        district:
          description: State / County / Province / Region portion of the address.
          type: string
          maxLength: 16
          example: MA
        postalCode:
          type: string
          description: Postal / ZIP code of the address.
          maxLength: 16
          example: '01234'
        valid:
          type: boolean
          description: Whether the billing details have been validated.
    Fingerprint:
      type: string
      description: A UUID that uniquely identifies the account number.
      example: eb170539-9e1c-4e92-bf4f-1d09534fdca2
    RiskEvaluation:
      type: object
      description: >-
        Results of risk evaluation. Only present if the payment is denied by
        Circle's risk service.
      nullable: true
      properties:
        decision:
          description: Enumerated decision of the account.
          type: string
          enum:
            - approved
            - denied
            - review
        reason:
          description: Risk reason for the definitive decision outcome.
          type: string
          nullable: true
          example: '3000'
    UtcTimestamp:
      type: string
      description: ISO-8601 UTC date/time format.
      example: '2020-04-10T02:13:30.000Z'
  headers:
    XRequestId:
      description: >
        Circle-generated universally unique identifier (UUID v4). Useful for
        identifying a specific request when communicating with Circle Support.
      schema:
        $ref: '#/components/schemas/XRequestId'
  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:
            $ref: '#/components/schemas/Error'
          example:
            code: 2
            message: API parameter invalid.
    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:
            $ref: '#/components/schemas/Error'
          example:
            code: 4
            message: Unauthorized.
    NotFound:
      description: The specified resource was not found.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: 404
            message: Not found.
    InternalServerError:
      description: >-
        The server encountered an unexpected condition that prevented it from
        fulfilling the request.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: -1
            message: 'Something went wrong. errId: 1f0b0c455e40f753f07b4f0ae6abd4b4'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````