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

# Debit Process — ACH

> Pull funds from a bank account via Standard ACH or Same-Day ACH (v12 debit gateway).



## OpenAPI

````yaml specs/ingopay-debit-process-ach.yaml POST /gateway/v12/debit/process--ach
openapi: 3.0.3
info:
  title: IngoPay API — Debit/Pull Method ACH / Same-Day ACH
  description: >
    Submit a request to pull funds from a customer's bank account via Standard
    ACH or Same-Day ACH (account_type: AC or SD).


    This endpoint uses a different request envelope structure from the push
    (credit) process endpoint. The request body is wrapped in `request{}` and
    `transaction{}` objects rather than flat top-level fields.


    **`account_type` determines the rail:**

    - `AC` — Standard ACH

    - `SD` — Same-Day ACH


    **Clients should ASSUME FAILURE** for any Debit Process requests where a
    response has not been received from Ingo Payments. Do not assume the
    transaction succeeded — consult the Idempotency documentation for guidance
    on retry handling.


    > **Log Transaction ID:** Log the Ingo `transaction_id` and
    `participant_unique_id1` for every transaction — Ingo Payment Services will
    request these values for any support interactions.


    > **ACH character limits for `additional_detail`:** `source_name` and
    `descriptive_purpose` have a combined maximum of 21 characters. The first 10
    characters of `source_name` and the first 11 characters of
    `descriptive_purpose` are always accepted — additional characters may be
    truncated depending on the length of the other field.


    **Client configuration determines additional field requirements:**

    - `transaction.store{}` and `transaction.card_track{}` — Required when
      the client is configured as a retail participant (`retail` flag on the
      client debit configuration). Both objects are nested within
      `transaction{}`.

    - `retail_location{}` — Required at the top level when the client is
      configured with the retail location flag (`retail_object` flag on the
      client debit configuration), independent of the `retail` flag. Contact
      your Ingo integration manager to confirm your configuration.
  version: '12'
  contact:
    name: Ingo Money Developer Support
    url: https://developers.ingomoney.com
servers:
  - url: https://payapi-sandbox.ingo.money
    description: Sandbox
  - url: https://payapi.ingo.money
    description: Production
security:
  - HmacAuth: []
paths:
  /gateway/v12/debit/process--ach:
    post:
      tags:
        - Pull Payments
      summary: Pull funds from a bank account via ACH or Same-Day ACH
      description: >
        Initiates a pull (debit) from a customer's bank account using a token
        from a prior Verify call. Set `account_type` to `AC` for Standard ACH or
        `SD` for Same-Day ACH.
      operationId: debitProcessACH
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DebitProcessACHRequest'
            example:
              request:
                participant_id: '12345'
                timestamp: '1547143063'
              transaction:
                account_type: AC
                transaction_amount:
                  currency_code: USD
                  amount: '101.96'
                participant_unique_ids:
                  participant_unique_id1: eba1fff2-b74b-401f-957e-cc8a16c49408
                  participant_unique_id2: cd5f2b0c-69be-458d-a3a5-5f96cf5171df
                customer_account_token: 4153e416-d81d-4420-a494-9feceed4eef3
                source_of_funds: 4
                recipient_phone: '5555550100'
                risk_assessment_token: 36f6b449-fa29-4f9e-919f-ad1e6433f1d5
                additional_detail:
                  source_name: CorpDisb
                  descriptive_purpose: Reimbursement
              ledger:
                api_key: lk_live_abc123xyz
                user_id: usr_00456
                entity_type: program
                entity_id: ent_00789
      responses:
        '200':
          description: Pull payment accepted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DebitProcessACHResponse'
              example:
                request:
                  participant_id: '12345'
                  timestamp: '1547143063'
                response:
                  status: '100'
                  message: Success
                  duration: '1.1809'
                transaction:
                  estimated_posting_date: 04/23/2026
                  estimated_posting_time: Payment will post 04/23/2026
                  transaction_id: '1237775'
                  customer_account_token: 4153e416-d81d-4420-a494-9feceed4eef3
                  participant_unique_ids:
                    participant_unique_id1: eba1fff2-b74b-401f-957e-cc8a16c49408
                    participant_unique_id2: cd5f2b0c-69be-458d-a3a5-5f96cf5171df
        '400':
          description: Validation error — check request body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                request:
                  participant_id: '12345'
                  timestamp: '1547143063'
                response:
                  status: '604'
                  message: Insufficient funds
                  duration: '0.7614'
components:
  schemas:
    DebitProcessACHRequest:
      type: object
      required:
        - request
        - transaction
      properties:
        request:
          type: object
          required:
            - participant_id
            - timestamp
          description: |
            General information associated with the API request.
          properties:
            participant_id:
              type: string
              maxLength: 5
              description: Unique participant identifier assigned by Ingo.
              example: '12345'
            timestamp:
              type: string
              maxLength: 32
              description: Unix timestamp of the request.
              example: '1547143063'
        transaction:
          type: object
          required:
            - account_type
            - transaction_amount
            - participant_unique_ids
            - customer_account_token
            - source_of_funds
          description: |
            General transaction information for the pull request.
          properties:
            account_type:
              type: string
              enum:
                - AC
                - SD
              minLength: 1
              description: >
                Determines the payment rail. `AC` = Standard ACH, `SD` =
                Same-Day ACH.
              example: AC
            transaction_amount:
              type: object
              required:
                - currency_code
                - amount
              properties:
                currency_code:
                  type: string
                  minLength: 3
                  maxLength: 3
                  pattern: ^[A-Z]{3}$
                  description: |
                    3-character ISO-4217 (alpha) currency code.
                  example: USD
                amount:
                  type: string
                  maxLength: 12
                  description: >
                    Amount in the currency indicated by `currency_code`. Must be
                    greater than 0 with a maximum of 2 decimal places.
                  example: '101.96'
            participant_unique_ids:
              type: object
              required:
                - participant_unique_id1
              properties:
                participant_unique_id1:
                  type: string
                  minLength: 1
                  maxLength: 100
                  description: >
                    Participant assigned transaction ID for the process request.
                    Value must be unique and may not contain NPI data. Used for
                    idempotency — a duplicate value returns an idempotent
                    response without initiating a new pull request. Appears on
                    daily reconciliation reports.
                  example: eba1fff2-b74b-401f-957e-cc8a16c49408
                participant_unique_id2:
                  type: string
                  maxLength: 100
                  nullable: true
                  description: >
                    Optional second participant assigned transaction ID. Does
                    not appear on daily reconciliation reports.
                  example: cd5f2b0c-69be-458d-a3a5-5f96cf5171df
            customer_account_token:
              type: string
              minLength: 1
              maxLength: 254
              description: >
                Token representing the account number and customer data as
                provided in the response from a previous Verify API call.
              example: 4153e416-d81d-4420-a494-9feceed4eef3
            source_of_funds:
              type: integer
              enum:
                - 1
                - 2
                - 3
                - 4
              description: >
                Funding source indicator: 1 = Cash, 2 = Check, 3 = Combo of Cash
                & Check, 4 = Corp Disbursement.
              example: 4
            recipient_phone:
              type: string
              pattern: ^[0-9]{10}$
              nullable: true
              description: 10-digit recipient phone number.
              example: '4045550100'
            additional_detail:
              type: object
              nullable: true
              description: >
                Additional transaction details specific to ACH. For ACH
                transactions, `source_name` and `descriptive_purpose` have a
                combined maximum of 21 characters.
              properties:
                source_name:
                  type: string
                  maxLength: 50
                  nullable: true
                  description: >
                    Name of the transaction source as easily recognizable to the
                    receiver. The first 10 characters are always accepted —
                    additional characters may be truncated depending on the
                    length of `descriptive_purpose`.
                  example: CorpDisb
                descriptive_purpose:
                  type: string
                  maxLength: 50
                  nullable: true
                  description: >
                    Description of the purpose of the transaction. The first 11
                    characters are always accepted — additional characters may
                    be truncated depending on the length of `source_name`.
                  example: Reimbursement
            risk_assessment_token:
              type: string
              maxLength: 36
              nullable: true
              description: >
                Associated risk assessment token returned by a prior RiskScore
                (`/risk/riskscore/v2`) response. Required when the client is
                configured to use the Ingo Risk API.
              example: 36f6b449-fa29-4f9e-919f-ad1e6433f1d5
            store:
              type: object
              description: >
                Retail store information. Required when the client is configured
                as a retail participant (`retail` flag enabled on client debit
                configuration).
              required:
                - store_id
                - clerk_id
                - terminal_id
              properties:
                store_id:
                  type: string
                  minLength: 1
                  maxLength: 254
                  description: Client assigned store ID.
                  example: STORE-001
                clerk_id:
                  type: string
                  minLength: 1
                  maxLength: 254
                  description: Client assigned clerk ID.
                  example: CLK-007
                terminal_id:
                  type: string
                  minLength: 1
                  maxLength: 254
                  description: Client assigned terminal ID.
                  example: TERM-042
            card_track:
              type: object
              description: >
                Card track data captured at point of sale. Required when the
                client is configured as a retail participant (`retail` flag
                enabled on client debit configuration).
              required:
                - track1
                - track2
              properties:
                track1:
                  type: string
                  maxLength: 255
                  pattern: >-
                    ^(%B)([0-9]{12,22})([/^])([\s\S]*)([/^])([0-9]{2})([0-9]{2})([0-9]*)([?])$
                  description: >
                    URL-encoded Track 1 data from and including the beginning
                    sentinel to and including the ending sentinel.
                  example: >-
                    %B4111111111111111^ROCKETS/JOHNNY^2612101000000000000000000000000?
                track2:
                  type: string
                  maxLength: 255
                  pattern: ^(;)([0-9]{12,22})(=)([0-9]{2})([0-9]{2})([0-9])*([?])$
                  description: >
                    Track 2 data from and including the beginning sentinel to
                    and including the ending sentinel.
                  example: ;4111111111111111=26121010000000000000?
        retail_location:
          type: object
          description: >
            Client assigned retail location information. Required when the
            client is configured with the retail location flag (`retail_object`
            flag enabled on client debit configuration). This flag is
            independent of the `retail` flag — confirm with your Ingo
            integration manager.
          required:
            - location_name
            - location_id
            - location_address
            - location_city
            - location_state
            - location_zip
          properties:
            location_name:
              type: string
              minLength: 1
              maxLength: 150
              description: Client assigned retail location name.
              example: ABC Retail
            location_id:
              type: string
              minLength: 1
              maxLength: 150
              description: Client assigned retail location ID.
              example: LOC-1234
            location_address:
              type: string
              minLength: 1
              maxLength: 150
              description: Client assigned retail location address.
              example: 456 Retail St.
            location_city:
              type: string
              minLength: 1
              maxLength: 150
              description: Client assigned retail location city.
              example: Atlanta
            location_state:
              type: string
              minLength: 2
              maxLength: 2
              pattern: >-
                ^(?:A[LKSZRAEP]|C[AOT]|D[EC]|F[LM]|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEHINOPST]|N[CDEHJMVY]|O[HKR]|P[ARW]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$
              description: >
                Client assigned retail location state (standard US postal
                abbreviation).
              example: GA
            location_zip:
              type: string
              minLength: 1
              maxLength: 10
              pattern: ^[0-9]{5}(?:-[0-9]{4})?$
              description: Client assigned retail location zip code.
              example: '30333'
        ledger:
          $ref: '#/components/schemas/Ledger'
        sender:
          type: object
          description: >-
            Data about the transaction sender. Required for clients using
            certain sender-funded transaction configurations.
          properties:
            name_personal:
              type: object
              description: Personal name of the sender.
              required:
                - first_name
                - last_name
              properties:
                first_name:
                  type: string
                  maxLength: 150
                  description: Sender first name.
                  example: Alex
                last_name:
                  type: string
                  maxLength: 150
                  description: Sender last name.
                  example: Rivera
            contact_address:
              type: object
              description: Address of the sender.
              required:
                - address1
                - city
                - state
                - zip
              properties:
                address1:
                  type: string
                  maxLength: 150
                  description: Street address line 1.
                  example: 100 Innovation Way
                address2:
                  type: string
                  maxLength: 150
                  description: Street address line 2 (optional).
                city:
                  type: string
                  maxLength: 150
                  description: City.
                  example: Anytown
                state:
                  type: string
                  maxLength: 2
                  description: State (standard two-letter postal abbreviation).
                  example: GA
                zip:
                  type: string
                  maxLength: 10
                  description: ZIP code (5-digit or zip+4 format).
                  example: '00000'
            contact_telcom:
              type: object
              description: Telecommunications contact points for the sender.
              required:
                - email
              properties:
                email:
                  type: string
                  maxLength: 150
                  description: Email address.
                  example: sender@example.com
                phone_home:
                  type: string
                  maxLength: 10
                  description: Home phone number. Digits only.
                  example: '5555550100'
                phone_mobile:
                  type: string
                  maxLength: 10
                  description: Mobile phone number. Digits only.
                  example: '5555550101'
        retail:
          type: object
          description: >-
            Retail store information. Required for clients using retail
            card-present configuration.
          properties:
            location_address:
              type: string
              maxLength: 150
              description: Retail location street address.
              example: 100 Innovation Way
            location_city:
              type: string
              maxLength: 150
              description: Retail location city.
              example: Anytown
            location_state:
              type: string
              maxLength: 2
              description: Retail location state.
              example: GA
            location_zip:
              type: string
              maxLength: 10
              description: Retail location ZIP code.
              example: '00000'
        sender_account:
          type: string
          maxLength: 100
          description: >-
            Sender account identifier. Required for sender-funded debit
            transactions.
          example: SENDER-ACCT-001
    DebitProcessACHResponse:
      type: object
      properties:
        request:
          type: object
          description: Echo of the request envelope.
          properties:
            participant_id:
              type: string
              description: Echo of participant ID from request.
              example: '12345'
            timestamp:
              type: string
              description: Echo of timestamp from request.
              example: '1547143063'
        response:
          type: object
          description: Outcome of the API call.
          properties:
            status:
              type: string
              description: >
                Numeric code describing the status of the API request. 100 =
                Success.
              example: '100'
            message:
              type: string
              description: Text description associated with the status code.
              example: Success
            duration:
              type: string
              description: Time in seconds to complete the request.
              example: '1.1809'
        transaction:
          type: object
          description: Transaction outcome data.
          properties:
            estimated_posting_date:
              type: string
              description: Provided on success. Estimated posting date.
              example: 04/23/2026
            estimated_posting_time:
              type: string
              description: Provided on success. Estimated posting time narrative.
              example: Payment will post 04/23/2026
            transaction_id:
              type: string
              nullable: true
              description: >
                Always provided on success and in certain failure conditions.
                Unique transaction identifier. Log this value — Ingo Payment
                Services will request it for support interactions.
              example: '1237775'
            customer_account_token:
              type: string
              description: Echo of value from request. Provided on success.
              example: 4153e416-d81d-4420-a494-9feceed4eef3
            participant_unique_ids:
              type: object
              description: Echo of participant IDs from request.
              properties:
                participant_unique_id1:
                  type: string
                  description: Echo of participant_unique_id1 from request.
                  example: eba1fff2-b74b-401f-957e-cc8a16c49408
                participant_unique_id2:
                  type: string
                  nullable: true
                  description: |
                    Echo of participant_unique_id2 from request if provided.
                  example: cd5f2b0c-69be-458d-a3a5-5f96cf5171df
    ErrorResponse:
      type: object
      properties:
        request:
          type: object
          properties:
            participant_id:
              type: string
              example: '12345'
            timestamp:
              type: string
              example: '1547143063'
        response:
          type: object
          properties:
            status:
              type: string
              example: '604'
            message:
              type: string
              example: Insufficient funds
            duration:
              type: string
              example: '0.7614'
    Ledger:
      type: object
      description: >
        Required for clients configured for ledger service. Exclude entirely if
        not applicable to your integration.
      required:
        - api_key
        - user_id
        - entity_type
        - entity_id
      properties:
        api_key:
          type: string
          minLength: 1
          maxLength: 100
          description: API key associated with the ledger program.
          example: lk_live_abc123xyz
        user_id:
          type: string
          minLength: 1
          maxLength: 100
          description: User ID associated with the ledger program.
          example: usr_00456
        entity_type:
          type: string
          minLength: 1
          maxLength: 50
          enum:
            - program
            - business
            - user
          description: >
            Entity type for the ledger. Accepted values: `program`, `business`,
            `user`.
          example: program
        entity_id:
          type: string
          maxLength: 100
          nullable: true
          description: Entity ID associated with the ledger.
          example: ent_00789
  securitySchemes:
    HmacAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        HMAC-SHA512 signed Authorization header. See the Authentication page for
        the complete signing guide.

````