Skip to content
payrocdevelopers

Run a bank-transfer (ACH/PAD) sale.

Run a bank-transfer (ACH/PAD) sale.

Actors

Customerhuman

Account holder who presents the payment method.

Merchant / integratorclient

Calls the Payroc API on the customer's behalf.

Payroc gatewayapi

The Payroc API surface these steps call.

Payment processorexternal-system

Downstream ACH network that authorizes the funds; not directly callable.

Sequence

Customer (context: no step in this flow starts or ends here)
Merchant / integrator
Payroc gateway
Payment processor (context: no step in this flow starts or ends here)

Follow the numbered steps in order. Each step is described under Steps.

Steps

Follow the workflow

Simulate API steps with synthetic inputs. Confirm manual steps yourself before continuing.

Interactive workflow tests are unavailable in this profile. Use the linked reference and source files to send API requests with your own client.

  1. 1

    Run bank transfer sale

    API request

    Run a bank-transfer sale by POSTing to /bank-transfer-payments with the customer's ACH (US) or PAD (Canada) bank details. The example uses an ACH payload; for PAD send `type: pad` with transit/institution details. There is no autoCapture flag on this endpoint — a bank-transfer payment is always a sale.

    Merchant / integrator → Payroc gateway

    POST/bank-transfer-payments
Arazzo workflow source
arazzo: 1.0.0
info:
  title: Run a bank-transfer sale
  summary: Take funds from a customer using their bank account (ACH/PAD).
  description: |
    The "take a payment" capability of the Payroc API for bank transfers. A merchant runs a bank-transfer sale to capture funds from a customer's bank account via ACH (US) or PAD (Canada).
    Runs POST /bank-transfer-payments (operationId `bankTransferPayment`).
    Agent gotchas captured here:
    - There is no autoCapture flag on this endpoint — a bank-transfer payment is
      always a sale.

    - Idempotency-Key: the POST REQUIRES a unique UUID v4 `Idempotency-Key`
      header per request.

    - The example uses an ACH payload; for PAD send `type: pad` with
      transit/institution details.

    To take a card sale instead, use the run-a-card-sale workflow.
    The terminal outcome is a created payment (HTTP 201) with a `paymentId` and a `transactionResult` that a later workflow can retrieve, adjust, reverse, or refund.
  version: 1.0.0
sourceDescriptions:
  - name: payroc-api
    url: /openapi.yaml
    type: openapi
workflows:
  - workflowId: run-a-bank-transfer-sale
    summary: Run a bank-transfer (ACH/PAD) sale.
    description: |
      Run a bank-transfer sale by POSTing to /bank-transfer-payments with the customer's ACH (US) or PAD (Canada) bank details.
    x-actors:
      - id: customer
        name: Customer
        type: human
        description: Account holder who presents the payment method.
      - id: merchant
        name: Merchant / integrator
        type: client
        description: Calls the Payroc API on the customer's behalf.
      - id: payroc-gateway
        name: Payroc gateway
        type: api
        description: The Payroc API surface these steps call.
      - id: processor
        name: Payment processor
        type: external-system
        description: Downstream ACH network that authorizes the funds; not directly
          callable.
    inputs:
      type: object
      required:
        - idempotencyKey
        - processingTerminalId
        - orderId
        - amount
        - currency
        - accountType
        - nameOnAccount
        - accountNumber
        - routingNumber
      properties:
        idempotencyKey:
          type: string
          description: Unique UUID v4 sent in the Idempotency-Key header. Generate a fresh
            value per request.
          example: f32c9ad6-c97f-4998-9356-f3b6718b1b68
        processingTerminalId:
          type: string
          description: Unique identifier of the processing terminal that runs the sale.
          example: "1234001"
        orderId:
          type: string
          description: Merchant-assigned unique identifier for the order.
          example: OrderRef6543
        description:
          type: string
          description: Description of the transaction.
          example: Large Pepperoni Pizza
        amount:
          type: integer
          description: Total transaction amount in the currency's lowest denomination (for
            example, cents).
          example: 4999
        currency:
          type: string
          description: ISO 4217 currency code.
          example: USD
        accountType:
          type: string
          description: Bank account type, checking or savings.
          example: checking
        nameOnAccount:
          type: string
          description: Name on the customer's bank account.
          example: Sarah Hazel Hopper
        accountNumber:
          type: string
          description: Customer's bank account number.
          example: "11101010"
        routingNumber:
          type: string
          description: ACH routing number.
          example: "053200983"
    steps:
      - stepId: runBankTransferSale
        x-actor: merchant
        x-actor-to: payroc-gateway
        x-label: bank-transfer sale request
        description: |
          Run a bank-transfer sale by POSTing to /bank-transfer-payments with the customer's ACH (US) or PAD (Canada) bank details. The example uses an ACH payload; for PAD send `type: pad` with transit/institution details. There is no autoCapture flag on this endpoint — a bank-transfer payment is always a sale.
        operationId: bankTransferPayment
        parameters:
          - name: Idempotency-Key
            in: header
            value: $inputs.idempotencyKey
        requestBody:
          contentType: application/json
          payload:
            processingTerminalId: $inputs.processingTerminalId
            order:
              orderId: $inputs.orderId
              description: $inputs.description
              amount: $inputs.amount
              currency: $inputs.currency
            paymentMethod:
              type: ach
              accountType: $inputs.accountType
              nameOnAccount: $inputs.nameOnAccount
              accountNumber: $inputs.accountNumber
              routingNumber: $inputs.routingNumber
              secCode: web
        successCriteria:
          - condition: $statusCode == 201
        outputs:
          paymentId: $response.body#/paymentId
          status: $response.body#/transactionResult/status
    outputs:
      paymentId: $steps.runBankTransferSale.outputs.paymentId
      status: $steps.runBankTransferSale.outputs.status
Download Arazzo

Search documentation

API reference169
Guides118
Knowledge38
legal1
Solutions32
Workflows74
↑↓highlight↵openView all search results

Menu

Theme

Sign out

Your saved plans remain in your organization. This browser’s private draft and account view will be cleared.

Talk to an engineer