Moov Bank Accounts API

Link and manage bank accounts as funding sources for ACH and RTP transfers. Includes micro-deposit and instant verification flows.

OpenAPI Specification

moov-bank-accounts-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Moov Accounts Bank Accounts API
  description: The Moov API is a RESTful financial infrastructure platform that enables developers to integrate money movement capabilities into their applications. The API supports a full range of financial operations including account management, payment method onboarding, transfers, sweeps, refunds, dispute resolution, card issuing, and payment links. It provides capabilities for accepting payments, storing funds in digital wallets, sending money between accounts, and issuing cards for spend management. Authentication uses OAuth2 access tokens with permission scopes, and the API returns JSON responses using standard HTTP response codes.
  version: 2026.01.00
  contact:
    name: Moov Support
    url: https://docs.moov.io/
  termsOfService: https://moov.io/legal/platform-agreement/
servers:
- url: https://api.moov.io
  description: Production Server
security:
- bearerAuth: []
tags:
- name: Bank Accounts
  description: Link and manage bank accounts as funding sources for ACH and RTP transfers. Includes micro-deposit and instant verification flows.
paths:
  /accounts/{accountID}/bank-accounts:
    post:
      operationId: linkBankAccount
      summary: Link a bank account
      description: Connect a bank account to a Moov account as a funding source for ACH and RTP transfers. After linking, verify the bank account using either instant verification or micro-deposits before it can be used for transfers.
      tags:
      - Bank Accounts
      parameters:
      - $ref: '#/components/parameters/AccountIDParam'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LinkBankAccountRequest'
      responses:
        '200':
          description: Bank account linked successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccount'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
    get:
      operationId: listBankAccounts
      summary: List bank accounts
      description: Retrieve all bank accounts linked to a Moov account, including their verification status and account details.
      tags:
      - Bank Accounts
      parameters:
      - $ref: '#/components/parameters/AccountIDParam'
      responses:
        '200':
          description: Bank accounts returned successfully.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BankAccount'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /accounts/{accountID}/bank-accounts/{bankAccountID}:
    get:
      operationId: getBankAccount
      summary: Retrieve a bank account
      description: Fetch the details and verification status of a specific bank account linked to a Moov account.
      tags:
      - Bank Accounts
      parameters:
      - $ref: '#/components/parameters/AccountIDParam'
      - $ref: '#/components/parameters/BankAccountIDParam'
      responses:
        '200':
          description: Bank account details returned successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccount'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteBankAccount
      summary: Delete a bank account
      description: Unlink and remove a bank account from a Moov account. This does not close the underlying bank account, only removes it from the Moov platform.
      tags:
      - Bank Accounts
      parameters:
      - $ref: '#/components/parameters/AccountIDParam'
      - $ref: '#/components/parameters/BankAccountIDParam'
      responses:
        '204':
          description: Bank account deleted successfully.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /accounts/{accountID}/bank-accounts/{bankAccountID}/verify:
    post:
      operationId: initiateBankAccountVerification
      summary: Initiate bank account verification
      description: Start the instant verification flow for a linked bank account. This method uses real-time data to verify the account without requiring micro-deposits, providing faster time-to-use for the funding source.
      tags:
      - Bank Accounts
      parameters:
      - $ref: '#/components/parameters/AccountIDParam'
      - $ref: '#/components/parameters/BankAccountIDParam'
      responses:
        '200':
          description: Bank account verification initiated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccountVerification'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
    put:
      operationId: completeBankAccountVerification
      summary: Complete bank account verification
      description: Submit the verification code or confirmation to finalize instant verification of a linked bank account.
      tags:
      - Bank Accounts
      parameters:
      - $ref: '#/components/parameters/AccountIDParam'
      - $ref: '#/components/parameters/BankAccountIDParam'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompleteVerificationRequest'
      responses:
        '200':
          description: Bank account verification completed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccount'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
    get:
      operationId: getBankAccountVerificationStatus
      summary: Get verification status
      description: Check the current status of a bank account verification attempt, including whether it is pending, completed, or has failed.
      tags:
      - Bank Accounts
      parameters:
      - $ref: '#/components/parameters/AccountIDParam'
      - $ref: '#/components/parameters/BankAccountIDParam'
      responses:
        '200':
          description: Verification status returned successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccountVerification'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /accounts/{accountID}/bank-accounts/{bankAccountID}/micro-deposits:
    post:
      operationId: initiateMicroDeposits
      summary: Initiate micro-deposits
      description: Start the micro-deposit verification process by sending two small amounts to the linked bank account. The account holder must confirm these amounts to complete verification.
      tags:
      - Bank Accounts
      parameters:
      - $ref: '#/components/parameters/AccountIDParam'
      - $ref: '#/components/parameters/BankAccountIDParam'
      responses:
        '204':
          description: Micro-deposits initiated successfully.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
    put:
      operationId: completeMicroDeposits
      summary: Complete micro-deposit verification
      description: Confirm the micro-deposit amounts that were sent to the linked bank account to complete the verification process and activate the bank account for transfers.
      tags:
      - Bank Accounts
      parameters:
      - $ref: '#/components/parameters/AccountIDParam'
      - $ref: '#/components/parameters/BankAccountIDParam'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MicroDepositConfirmation'
      responses:
        '200':
          description: Micro-deposit verification completed successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccount'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  schemas:
    CompleteVerificationRequest:
      type: object
      description: Request body for completing instant bank account verification.
      properties:
        code:
          type: string
          description: The verification code provided during the instant verification flow.
    LinkBankAccountRequest:
      type: object
      description: Request body for linking a bank account to a Moov account.
      properties:
        account:
          type: object
          description: Bank account details for direct linking.
          properties:
            routingNumber:
              type: string
              description: ABA routing transit number.
              pattern: ^\d{9}$
            accountNumber:
              type: string
              description: Bank account number.
            bankAccountType:
              type: string
              description: Type of bank account.
              enum:
              - checking
              - savings
            holderName:
              type: string
              description: Name of the account holder.
            holderType:
              type: string
              description: Whether the account is held by an individual or business.
              enum:
              - individual
              - business
        plaid:
          type: object
          description: Link via Plaid public token for pre-verified accounts.
          properties:
            token:
              type: string
              description: Plaid public token from the Plaid Link flow.
        mx:
          type: object
          description: Link via MX widget token for pre-verified accounts.
          properties:
            token:
              type: string
              description: MX widget token.
    Error:
      type: object
      description: Standard error response returned by the Moov API.
      properties:
        error:
          type: string
          description: Human-readable description of the error.
        code:
          type: string
          description: Machine-readable error code.
    MicroDepositConfirmation:
      type: object
      description: Request body for confirming micro-deposit amounts.
      required:
      - amounts
      properties:
        amounts:
          type: array
          description: The two micro-deposit amounts in cents that were sent to the bank account.
          items:
            type: integer
            minimum: 1
          minItems: 2
          maxItems: 2
    BankAccountVerification:
      type: object
      description: Status and details of a bank account verification attempt.
      properties:
        status:
          type: string
          description: Current status of the verification.
          enum:
          - pending
          - completed
          - failed
        exceptionDetails:
          type: string
          description: Error details if the verification failed.
    BankAccount:
      type: object
      description: A bank account linked to a Moov account as a funding source for ACH and RTP transfers.
      properties:
        bankAccountID:
          type: string
          format: uuid
          description: Unique identifier for the bank account.
        bankName:
          type: string
          description: Name of the financial institution.
        bankAccountType:
          type: string
          description: Type of bank account.
          enum:
          - checking
          - savings
          - loan
        routingNumber:
          type: string
          description: ABA routing transit number for the bank.
          pattern: ^\d{9}$
        lastFourAccountNumber:
          type: string
          description: Last four digits of the bank account number.
          pattern: ^\d{4}$
        status:
          type: string
          description: Verification and usability status of the bank account.
          enum:
          - new
          - unverified
          - pending
          - verified
          - errored
        verificationStatus:
          type: string
          description: Current state of the bank account verification process.
          enum:
          - unverified
          - pending
          - verificationFailed
          - verified
          - mxVerified
        createdOn:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the bank account was linked.
        updatedOn:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the bank account was last updated.
  parameters:
    AccountIDParam:
      name: accountID
      in: path
      required: true
      description: Unique identifier for the Moov account.
      schema:
        type: string
        format: uuid
    BankAccountIDParam:
      name: bankAccountID
      in: path
      required: true
      description: Unique identifier for the bank account.
      schema:
        type: string
        format: uuid
  responses:
    Unauthorized:
      description: Authentication failed. Ensure a valid Bearer token is provided with the required scopes for this operation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadRequest:
      description: The request was malformed or contained invalid parameters.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: OAuth2 bearer token obtained from the /oauth2/token endpoint. Include in the Authorization header as "Bearer {token}".
externalDocs:
  description: Moov API Documentation
  url: https://docs.moov.io/api/