openapi: 3.0.3
info:
title: Jack Henry Payments
description: |
Jack Henry Payments developer portal — described as "Everything you
need to simplify and seamlessly make, take, and manage payments."
Unifies ACH origination, wire / A2A payments, Bill Payments, Remote
Deposit Capture (consumer + commercial), card acceptance, and
peer-to-peer rails behind a single sandbox-equipped developer surface.
The Payments Orchestrator routes across rails and supports virtual
accounts.
version: v1
servers:
- url: https://api.payments.jackhenry.com
description: Jack Henry Payments production
- url: https://api.payments.sandbox.jackhenry.com
description: Jack Henry Payments sandbox
tags:
- name: ACH Origination
description: ACH credit and debit origination.
- name: Wire Transfers
description: Domestic A2A wire payments.
- name: Bill Payments
description: Consumer and small-business bill pay.
- name: Remote Deposit Capture
description: Consumer and commercial RDC.
- name: Cards
description: Card acceptance and processing.
- name: Peer To Peer
description: P2P transfers via partner networks.
- name: Payments Orchestrator
description: Cross-rail routing and virtual accounts.
security:
- bearerAuth: []
paths:
/payments/v1/ach/credits:
post:
summary: Originate ACH Credit
operationId: originateAchCredit
tags: [ACH Origination]
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/AchCreditRequest' }
responses:
'201':
description: ACH credit accepted.
content:
application/json:
schema: { $ref: '#/components/schemas/AchTransaction' }
/payments/v1/ach/debits:
post:
summary: Originate ACH Debit
operationId: originateAchDebit
tags: [ACH Origination]
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/AchDebitRequest' }
responses:
'201':
description: ACH debit accepted.
content:
application/json:
schema: { $ref: '#/components/schemas/AchTransaction' }
/payments/v1/wires:
post:
summary: Send Wire
operationId: sendWire
tags: [Wire Transfers]
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/WireRequest' }
responses:
'201':
description: Wire submitted.
content:
application/json:
schema: { $ref: '#/components/schemas/Wire' }
/payments/v1/bill-pay/payments:
post:
summary: Submit Bill Payment
operationId: submitBillPayment
tags: [Bill Payments]
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/BillPaymentRequest' }
responses:
'201':
description: Bill payment scheduled.
content:
application/json:
schema: { $ref: '#/components/schemas/BillPayment' }
/payments/v1/rdc/deposits:
post:
summary: Submit Remote Deposit
operationId: submitRemoteDeposit
tags: [Remote Deposit Capture]
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required: [accountNumber, amount, frontImage, backImage]
properties:
accountNumber: { type: string }
amount: { type: number, format: double }
frontImage: { type: string, format: binary }
backImage: { type: string, format: binary }
responses:
'201':
description: RDC deposit accepted.
content:
application/json:
schema: { $ref: '#/components/schemas/RdcDeposit' }
/payments/v1/cards/authorizations:
post:
summary: Authorize Card Payment
operationId: authorizeCard
tags: [Cards]
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/CardAuthRequest' }
responses:
'201':
description: Card authorization result.
content:
application/json:
schema: { $ref: '#/components/schemas/CardAuthResult' }
/payments/v1/p2p/transfers:
post:
summary: Send Peer To Peer Transfer
operationId: sendP2P
tags: [Peer To Peer]
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/P2PRequest' }
responses:
'201':
description: P2P transfer submitted.
content:
application/json:
schema: { $ref: '#/components/schemas/P2PTransfer' }
/payments/v1/orchestrator/payments:
post:
summary: Route Payment Through Orchestrator
operationId: routePayment
tags: [Payments Orchestrator]
description: |
Submit a single payment intent; the Orchestrator selects the
appropriate rail (ACH, Wire, Card, RTP) based on cost, speed,
and policy.
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/OrchestratorRequest' }
responses:
'201':
description: Payment routed.
content:
application/json:
schema: { $ref: '#/components/schemas/OrchestratorResult' }
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
schemas:
AchCreditRequest:
type: object
required: [originatorAccountId, beneficiaryRoutingNumber, beneficiaryAccountNumber, amount, secCode]
properties:
originatorAccountId: { type: string }
beneficiaryRoutingNumber: { type: string, pattern: '^[0-9]{9}$' }
beneficiaryAccountNumber: { type: string }
beneficiaryName: { type: string }
amount: { type: number, format: double }
secCode:
type: string
enum: [PPD, CCD, WEB, TEL]
effectiveDate: { type: string, format: date }
memo: { type: string }
AchDebitRequest:
allOf:
- $ref: '#/components/schemas/AchCreditRequest'
AchTransaction:
type: object
properties:
id: { type: string, format: uuid }
status:
type: string
enum: [Submitted, Processing, Settled, Returned, Failed]
traceNumber: { type: string }
effectiveDate: { type: string, format: date }
amount: { type: number, format: double }
WireRequest:
type: object
required: [originatorAccountId, beneficiaryName, beneficiaryAccountNumber, beneficiaryRoutingNumber, amount]
properties:
originatorAccountId: { type: string }
beneficiaryName: { type: string }
beneficiaryAccountNumber: { type: string }
beneficiaryRoutingNumber: { type: string, pattern: '^[0-9]{9}$' }
amount: { type: number, format: double }
currency: { type: string, default: USD }
memo: { type: string }
Wire:
type: object
properties:
id: { type: string, format: uuid }
status:
type: string
enum: [Pending, Processing, Sent, Failed, Cancelled]
imadOmad: { type: string, description: Federal Reserve IMAD/OMAD reference }
amount: { type: number }
sentAt: { type: string, format: date-time, nullable: true }
BillPaymentRequest:
type: object
required: [payerAccountId, payeeId, amount, dueDate]
properties:
payerAccountId: { type: string }
payeeId: { type: string }
amount: { type: number, format: double }
dueDate: { type: string, format: date }
memo: { type: string }
BillPayment:
type: object
properties:
id: { type: string, format: uuid }
deliveryMethod:
type: string
enum: [Electronic, Check]
estimatedDeliveryDate: { type: string, format: date }
status:
type: string
enum: [Scheduled, Processing, Delivered, Failed, Cancelled]
RdcDeposit:
type: object
properties:
id: { type: string, format: uuid }
status:
type: string
enum: [Pending, Accepted, Rejected, Held]
availableDate: { type: string, format: date }
amount: { type: number, format: double }
CardAuthRequest:
type: object
required: [cardToken, amount, merchantId]
properties:
cardToken: { type: string }
amount: { type: number, format: double }
currency: { type: string, default: USD }
merchantId: { type: string }
cvvProvided: { type: boolean }
CardAuthResult:
type: object
properties:
id: { type: string, format: uuid }
approved: { type: boolean }
responseCode: { type: string }
authCode: { type: string }
networkReference: { type: string }
P2PRequest:
type: object
required: [senderAccountId, recipientToken, amount]
properties:
senderAccountId: { type: string }
recipientToken: { type: string, description: Email or phone number }
amount: { type: number, format: double }
network:
type: string
enum: [Zelle, RTP]
memo: { type: string }
P2PTransfer:
type: object
properties:
id: { type: string, format: uuid }
status:
type: string
enum: [Pending, Sent, Delivered, Failed]
network: { type: string }
OrchestratorRequest:
type: object
required: [originatorAccountId, beneficiary, amount]
properties:
originatorAccountId: { type: string }
beneficiary:
type: object
properties:
name: { type: string }
accountNumber: { type: string }
routingNumber: { type: string }
email: { type: string }
phone: { type: string }
amount: { type: number, format: double }
currency: { type: string, default: USD }
speed:
type: string
enum: [SameDay, NextDay, Standard, Instant]
memo: { type: string }
policyHints:
type: object
additionalProperties: true
OrchestratorResult:
type: object
properties:
id: { type: string, format: uuid }
chosenRail:
type: string
enum: [ACH, Wire, Card, RTP, Zelle]
status:
type: string
enum: [Routed, Pending, Failed]
downstreamId: { type: string }