---
title: "Create New ACH Transfer"
method: POST
path: "/programs/{programCode}/transfers/ach"
tags: ["Transfers"]
---

# Create New ACH Transfer

`POST /programs/{programCode}/transfers/ach`

Creates a new ACH Out or ACH Pull transfer to move funds between a Green Dot account and an external bank account. Supports daily limits for ACH Out transfers. On success, returns details of the created ACH transfer. Refer to the API documentation for event types and webhook behavior.

## Path parameters

- `programCode` string, required

## Headers

- `X-GD-RequestId` string, required

## Request body

- CreateACHRequest — Represents a request to create an ACH (Automated Clearing House) transfer, supporting both ACH Out (to external bank) and ACH Pull (from external bank) transactions. This request is used to initiate the movement of funds between a Green Dot account and an external bank account.
  - `transferIdentifier` string, nullable — Required: A unique identifier for the transfer. This value is generated by the client and used for idempotency and tracking.
  - `transferType` string, nullable — Required: The type of ACH transfer to perform. Valid values: "achOut" (move funds to an external bank account), "achPull" (pull funds from an external bank account).
  - `currency` string, nullable — Required: The ISO 4217 currency code for the transfer (e.g., "USD") in string.
  - `deviceType` 'Unknown' | 'Web' | 'IOS' | 'Android' — Required: The device type from which the transfer is initiated. Valid values: Unknown, Web, IOS, Android.
  - `verificationIdentifier` string, nullable — Optional: The identifier for the bank account verification process. Required for ACH Pull transfers when bank account verification is needed.
  - `userIdentifier` string, nullable — Optional: The unique identifier of the user initiating the transfer. Required for both ACH Out and ACH Pull transfers.
  - `transferRoute` TransferRoute — Represents the routing details and required data for initiating a transfer operation. Contains transaction amount, delivery type, source and target endpoints, recurring and verification details, and ACH-specific flags. Used to define and process the flow of funds between accounts or external endpoints, supporting ACH, purse-to-purse, and partner-to-account transfers.
    - `transactionAmount` number, double, nullable — The amount to be transferred in the transaction.
    - `deliveryType` string, nullable — The delivery type for the transfer (e.g., standard, expedited), as a string code.
    - `sourceTransferEndpoint` EndPoint — Represents the endpoint details for a transfer operation. Contains the type of transfer endpoint (such as account, purse, or program funding source) and, if applicable, the account identifier. Used to specify the source or destination in transfer workflows, except for ACH transfers with a bank account type.
      - `transferEndpointType` string, nullable — The type of transfer endpoint (e.g., "account", "purse", "programFundingSource"). Required except for ACH transfers with a bank account type.
      - `accountIdentifier` string, nullable — Conditional: The unique identifier of the account, present if the endpoint type is "account".
    - `targetTransferEndpoint` ACHEndPoint — Represents the ACH (Automated Clearing House) endpoint details required for ACH-based transfers. Contains encrypted or plain bank account information and a reference identifier for the bank account. Used to securely provide all necessary details for initiating or processing ACH transfers, supporting both encrypted and plain data flows.
      - `encryptedBankAccount` EncryptedData — Represents a container for encrypted data used in secure data transfer operations. Contains the encrypted payload and associated cryptographic metadata, including encryption version, ephemeral public key, and public key hash. Used to securely transmit sensitive information such as user data, ensuring confidentiality and integrity during transport.
        - `version` string, nullable — The version of the encryption algorithm used to encrypt the data (e.g., "v1", "v2").
        - `ephemeralPublicKey` string, nullable — The ephemeral public key used in the encryption process, typically for key exchange or session establishment.
        - `publicKeyHash` string, nullable — The hash of the public key used to verify the integrity and authenticity of the encryption key.
        - `data` string, nullable — The encrypted data payload, typically base64-encoded, containing the sensitive information.
      - `bankAccount` BankAccount — Container for bank account details.
        - `routingNumber` string, nullable — External bank routing number.
        - `accountNumber` string, nullable — External bank account number.
        - `bankName` string, nullable — External bank name.
        - `firstName` string, nullable — Customer first name.
        - `lastName` string, nullable — Customer last name.
        - `accountType` string, nullable — External bank account type.
        - `businessName` string, nullable — Business name.
      - `bankAccountReferenceId` string, nullable — Conditional: The reference identifier for the bank account, used to reference a previously stored or verified account. Used if consumed by ACH transfer type.
    - `recurringType` string, nullable — The type of recurring transfer, if applicable (e.g., "Monthly", "Weekly").
    - `bankAccountVerificationMethod` string, nullable — The method used to verify the bank account (e.g., "Instant", "MicroDeposit").
    - `bankAccountVerificationDate` string, nullable — The date when the bank account was verified, if applicable.
    - `bankAccountAuthorizationDate` string, nullable — The date when the bank account was authorized for transfers, if applicable.
    - `businessThirdPartyACH` boolean — Indicates whether the transfer is a business third-party ACH transaction.
  - `transferDescription` string, nullable — An optional description for the transfer, such as the purpose or reference for the transaction.

## Response `200`

OK

- CreateACHResponse — Create ACH transfer response
  - `transfer` CreateTransfersAch
    - `transferIdentifier` string, nullable — Required: The unique identifier assigned to the ACH transfer. This value is used for tracking and idempotency.
    - `transferStatus` string, nullable — Required: The current status of the ACH transfer (e.g., "pending", "completed", "failed"). Indicates the processing state of the transfer.
    - `publicToken` string, nullable — A public token associated with the transfer, which can be used by clients for secure reference or follow-up actions.
    - `accounts` Account[], nullable — A list of accounts involved in the transfer, including source and destination account details. Each account object contains identifiers, product information, status, and other relevant data.
      - `accountIdentifier` string, nullable — The unique identifier assigned to the account. Used for all account-related operations and references.
      - `accountReferenceNumber` string, nullable — The reference number associated with the account, typically used for display or reporting purposes.
      - `partnerConsumerId` string, nullable — Gets or sets the identifier for the partner's consumer.
      - `productCode` string, nullable — The product code that identifies the type of account or product (e.g., card program, account type).
      - `productTierKey` integer — The tier key for the product, indicating the account's product tier or level.
      - `cipLevel` string, nullable — The Customer Identification Program (CIP) level for the account, indicating the level of identity verification completed.
      - `productMaterialType` string, nullable — The material type of the product (e.g., "plastic", "virtual").
      - `currency` string, nullable — The ISO 4217 currency code for the account (e.g., "USD").
      - `status` string, nullable — The current status of the account.
      - `instantIssue` boolean — Indicates whether the account was issued instantly.
      - `statusReasons` string[], nullable — A list of reasons for the current account status, if any.
      - `statusCure` string, nullable — The action or process required to cure the current account status, if applicable.
      - `accountStatusChangedDateTime` string, nullable — The date and time when the account status last changed.
      - `activationDate` string, nullable — The date and time when the account was activated.
      - `directDepositInformation` DirectDepositInformation — Represents the direct deposit information for an account. Contains the account number and routing number required to receive ACH direct deposits. Used to provide customers and partners with the necessary banking details for setting up direct deposit transactions.
        - `accountNumber` string, nullable — The account number used for receiving direct deposits via ACH.
        - `routingNumber` string, nullable — The routing number of the financial institution for ACH direct deposits.
      - `purses` Purse[], nullable — The list of purses (sub-accounts or balances) associated with the account, including primary and additional purses.
        - `purseIdentifier` string, nullable — The unique identifier for the purse.
        - `purseType` string, nullable — The type of purse (e.g., "Savings", "Spending", "Goal").
        - `purseDescription` string, nullable — A human-readable description of the purse.
        - `availableBalance` number, double — The available balance in the purse, representing funds that can be spent or withdrawn.
        - `ledgerBalance` number, double — The ledger balance in the purse, representing the total balance including pending transactions.
        - `availableBalanceAsOfDateTime` string, nullable — The date and time when the available balance was last updated.
        - `ledgerBalanceAsOfDateTime` string, nullable — The date and time when the ledger balance was last updated.
        - `isHidden` boolean — Indicates whether the purse is hidden from the user interface.
        - `status` string, nullable — The current status of the purse.
        - `goalAmount` number, double, nullable — The goal amount set for the purse, if applicable (e.g., for savings goals).
        - `goalDate` string, nullable — The target date for achieving the goal amount.
        - `iconName` string, nullable — The name of the icon associated with the purse for display purposes.
        - `createDate` string, date-time, nullable — The date and time when the purse was created.
        - `changeDate` string, date-time, nullable — The date and time when the purse was last changed or updated.
        - `purseNumber` string, nullable — The purse number, which may be used for display or reference purposes.
        - `interestRateTierIdentifier` string, nullable — The identifier for the interest rate tier applied to the purse, if applicable.
        - `interestRateTier` string, nullable — The name or description of the interest rate tier applied to the purse.
        - `interestYieldStartDate` string, nullable — The start date for interest yield calculation.
        - `interestYieldEndDate` string, nullable — The end date for interest yield calculation.
        - `APY` number, double, nullable — The annual percentage yield (APY) for the purse, if applicable.
        - `purseSubType` string, nullable — The subtype of the purse, providing additional categorization (e.g., "RoundUp", "EmergencyFund").
        - `interestRate` number, double, nullable — The interest rate applied to the purse, if applicable.
        - `isRoundUp` boolean — Indicates whether the purse is configured for round-up savings functionality.
      - `additionalPurses` Purse[], nullable — Additional purses associated with the account, if any.
        - `purseIdentifier` string, nullable — The unique identifier for the purse.
        - `purseType` string, nullable — The type of purse (e.g., "Savings", "Spending", "Goal").
        - `purseDescription` string, nullable — A human-readable description of the purse.
        - `availableBalance` number, double — The available balance in the purse, representing funds that can be spent or withdrawn.
        - `ledgerBalance` number, double — The ledger balance in the purse, representing the total balance including pending transactions.
        - `availableBalanceAsOfDateTime` string, nullable — The date and time when the available balance was last updated.
        - `ledgerBalanceAsOfDateTime` string, nullable — The date and time when the ledger balance was last updated.
        - `isHidden` boolean — Indicates whether the purse is hidden from the user interface.
        - `status` string, nullable — The current status of the purse.
        - `goalAmount` number, double, nullable — The goal amount set for the purse, if applicable (e.g., for savings goals).
        - `goalDate` string, nullable — The target date for achieving the goal amount.
        - `iconName` string, nullable — The name of the icon associated with the purse for display purposes.
        - `createDate` string, date-time, nullable — The date and time when the purse was created.
        - `changeDate` string, date-time, nullable — The date and time when the purse was last changed or updated.
        - `purseNumber` string, nullable — The purse number, which may be used for display or reference purposes.
        - `interestRateTierIdentifier` string, nullable — The identifier for the interest rate tier applied to the purse, if applicable.
        - `interestRateTier` string, nullable — The name or description of the interest rate tier applied to the purse.
        - `interestYieldStartDate` string, nullable — The start date for interest yield calculation.
        - `interestYieldEndDate` string, nullable — The end date for interest yield calculation.
        - `APY` number, double, nullable — The annual percentage yield (APY) for the purse, if applicable.
        - `purseSubType` string, nullable — The subtype of the purse, providing additional categorization (e.g., "RoundUp", "EmergencyFund").
        - `interestRate` number, double, nullable — The interest rate applied to the purse, if applicable.
        - `isRoundUp` boolean — Indicates whether the purse is configured for round-up savings functionality.
      - `accountHolders` AccountHolder[], nullable — The list of account holders associated with the account, including primary and secondary users.
        - `paymentInstruments` PaymentInstrument[], nullable — A list of payment instruments (e.g., cards, payment methods) associated with the account holder.
          - `encryptedPrivatePaymentInstrumentData` EncryptedData — Represents a container for encrypted data used in secure data transfer operations. Contains the encrypted payload and associated cryptographic metadata, including encryption version, ephemeral public key, and public key hash. Used to securely transmit sensitive information such as user data, ensuring confidentiality and integrity during transport.
            - `version` string, nullable — The version of the encryption algorithm used to encrypt the data (e.g., "v1", "v2").
            - `ephemeralPublicKey` string, nullable — The ephemeral public key used in the encryption process, typically for key exchange or session establishment.
            - `publicKeyHash` string, nullable — The hash of the public key used to verify the integrity and authenticity of the encryption key.
            - `data` string, nullable — The encrypted data payload, typically base64-encoded, containing the sensitive information.
          - `privatePaymentInstrumentData` PrivateCardData — Represents sensitive card data associated with a payment instrument. Contains the primary account number (PAN), card verification value (CVV), and expiration details. Used to securely store and transmit card information for payment processing, typically in encrypted or restricted contexts.
            - `pan` string, nullable — The primary account number (PAN) of the card, typically a 16-digit number.
            - `cvv` string, nullable — Card Verification Value (CVV) of the card.
            - `expiration` Expiration — Container for expiration details
              - …
          - `paymentIdentifier` string, nullable — Unique identifier for the payment (may be used for transaction tracking).
          - `paymentInstrumentIdentifier` string, nullable — Base class for payment instrument details.
          - `paymentInstrumentType` string, nullable — The type of payment instrument (e.g., "card", "virtualCard").
          - `status` string, nullable — The current status of the payment instrument (e.g., "active", "inactive", "blocked").
          - `statusReasons` string[], nullable — The list of reasons for the current status of the payment instrument.
          - `isPinSet` boolean — Indicates whether the PIN has been set for this payment instrument.
          - `last4Pan` string, nullable — The last four digits of the payment instrument's PAN (Primary Account Number).
          - `activatedDateTime` string, nullable — The date and time when the payment instrument was activated, if applicable.
          - `cardPausedDateTime` string, nullable — The date and time when the payment instrument was paused, if applicable.
          - `issuedDateTime` string, nullable — The date and time when the payment instrument was issued.
          - `isOverIssuedDaysLimit` boolean, nullable — Indicates if the instrument is over the allowed days since issuance.
          - `isPrivateDataViewable` boolean — Indicates if private card data is viewable in the response.
          - `embossedName` string, nullable — The name embossed on the card, if applicable.
          - `customCardImageIdentifier` string, nullable — Identifier for a custom card image, if used.
          - `paymentInstrumentLevel` 'personalized' | 'nonpersonalized', nullable — The level of the payment instrument (e.g., personalized, nonpersonalized).
          - `productMaterialType` string, nullable — The product material type (e.g., "plastic", "virtual").
          - `cardIssueSource` string, nullable — The source of card issuance (e.g., "online", "branch").
          - `paymentIdentifierBin` string, nullable — The BIN (Bank Identification Number) associated with the payment instrument.
        - `user` User — Represents user profile information associated with an account holder. Contains personal details, identity information, account status, and KYC (Know Your Customer) state data. Used to provide a comprehensive view of the user's identity, preferences, and compliance status within the system.
          - `firstName` string, nullable — The user's first name.
          - `lastName` string, nullable — The user's last name.
          - `dobStatus` string, nullable — The status of the user's date of birth verification.
          - `last4Identity` string, nullable — The last four digits of the user's identity number.
          - `identityType` string, nullable — The type of identity document or number provided (e.g., "SSN", "Passport", "DriverLicense").
          - `userIdentifier` string, nullable — The unique identifier assigned to the user within the system.
          - `peerTransferAcceptPreference` string, nullable — The user's preference for accepting peer-to-peer transfers (e.g., "AutoAccept", "ManualAccept").
          - `status` string, nullable — The current status of the user (e.g., "Active", "Inactive", "Suspended").
          - `isPrimaryAccountHolder` boolean — Indicates whether the user is the primary account holder.
          - `kycStateData` KycStateData — Represents the Know Your Customer (KYC) state data for a user. Contains information about OFAC (Office of Foreign Assets Control) screening status, overall KYC status, and any pending KYC gates. Used to track regulatory compliance and the current state of user verification during onboarding or account management.
            - `ofacStatus` string, nullable — The OFAC (Office of Foreign Assets Control) screening status for the user. Typical values: "Passed", "Failed", "Pending", or other business-specific status indicators.
            - `kycStatus` string, nullable — The overall KYC (Know Your Customer) status for the user. Typical values: "Verified", "Pending", "Failed", or other business-specific status indicators.
            - `kycPendingGate` string, nullable — The name or code of any pending KYC gate or step that must be completed for full verification. Example: "DocumentVerification", "AddressCheck", or null if no gates are pending.
          - `partnerConsumerId` string, nullable — The partner consumer identifier associated with the user.
        - `accountHolderIdentifier` string, nullable — The unique identifier for the account holder.
      - `termsAcceptances` TermsAcceptance[], nullable — The list of terms and conditions acceptances for the account.
        - `termsIdentifier` string, nullable — The unique identifier for the terms and conditions that were presented to the user.
        - `termsAcceptanceDateTime` string, nullable — The date and time when the user accepted the terms, typically in ISO 8601 format (e.g., "2023-07-01T12:34:56Z").
        - `termsAcceptanceFlag` boolean, nullable — Indicates whether the user accepted the terms (true) or declined (false).
      - `fraudData` object, nullable — Optional. A dictionary of key/value pairs containing fraud detection data associated with the account.
      - `accountType` string, nullable — The type of account (e.g., "personal", "business", "joint").
      - `language` string, nullable — The preferred language for the account (e.g., "en", "es").
      - `accountCycleDay` integer, nullable — The account cycle day, if applicable (e.g., billing or statement cycle day).
      - `accountEligibility` AccountEligibility — Represents the eligibility status of a Green Dot account for specific actions or changes. Contains information about whether the account is eligible to update contact details such as address, email, or phone number.
        - `contactChangeEligibility` ContactChangeEligibility — Represents the eligibility of a Green Dot account to update specific contact information. Contains lists of eligible or ineligible contact types (address, email, phone) that can be changed, based on business rules, account status, or regulatory requirements.
          - `address` string[], nullable — A list of address types (e.g., "home", "mailing") that are eligible for update on the account. If the list is empty or missing, address changes may not be allowed.
          - `email` string[], nullable — A list of email types (e.g., "primary", "secondary") that are eligible for update on the account. If the list is empty or missing, email changes may not be allowed.
          - `phone` string[], nullable — A list of phone types (e.g., "mobile", "home", "work") that are eligible for update on the account. If the list is empty or missing, phone number changes may not be allowed.
      - `upgradeKycStateData` KycStateData — Represents the Know Your Customer (KYC) state data for a user. Contains information about OFAC (Office of Foreign Assets Control) screening status, overall KYC status, and any pending KYC gates. Used to track regulatory compliance and the current state of user verification during onboarding or account management.
        - `ofacStatus` string, nullable — The OFAC (Office of Foreign Assets Control) screening status for the user. Typical values: "Passed", "Failed", "Pending", or other business-specific status indicators.
        - `kycStatus` string, nullable — The overall KYC (Know Your Customer) status for the user. Typical values: "Verified", "Pending", "Failed", or other business-specific status indicators.
        - `kycPendingGate` string, nullable — The name or code of any pending KYC gate or step that must be completed for full verification. Example: "DocumentVerification", "AddressCheck", or null if no gates are pending.
      - `targetUserType` string, nullable — The type of user targeted by the account (e.g., "primary", "secondary", "authorized user").
      - `partnerAccountId` string, nullable — The partner-specific account identifier, if the account is linked to a partner system.
      - `productClass` string, nullable — The product class for the account, indicating the broader product grouping or classification.
      - `enrollmentSource` string, nullable — The source of enrollment for the account (e.g., "web", "mobile", "partner").
    - `fraudData` object, nullable — Conditional: A dictionary of key/value pairs containing fraud detection data associated with the transaction. This data may be returned if fraud checks were performed during the transfer process.
  - `responseDetails` ResponseDetail[], nullable — Required: A list of response details providing status codes, descriptions, and additional information about the result of the operation.
    - `code` integer — The primary status or error code for the response (e.g., 200 for success, 400 for validation error).
    - `subCode` integer, nullable — An optional subcode providing more granular detail about the response or error.
    - `description` string, nullable — A human-readable description of the response, error, or status.
    - `url` string, nullable — A URL linking to documentation or a web page with more information about the response code.

## Other responses

- `401` — Unauthorized
- `403` — Forbidden
- `500` — Internal Server Error
- `503` — Service Unavailable

---

[API](https://skmtc.net/greendot/apis/baas-apis.md) · [All operations](https://skmtc.net/greendot/apis/baas-apis/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/greendot/baas-apis/versions/666553766b78/schema)
