Balance-Inquiry

PIN Debit & EBT balance check

1. Method & Path

POST /payment/balance-inquiry

2. Supported Variants

#Card TypeEntry ModeNotes
1PIN DebitcontactlessTap debit card
2PIN DebitcontactChip insert (EMV)
3PIN DebitswipedMagnetic stripe — requires pin_block + ksn
4EBTFood (SNAP)ebtCategory: "FOOD"
5EBTCashebtCategory: "CASH"

3. Handler module

payment.payment.handler — branched on paymentType: "balance_inquiry". Validation uses payment.model.balance_inquiry.BalanceInquiryRequest (which mandates commerceIndicator: "retail").

4. Request fields

Same scaffolding as /payment/auth plus:

FieldTypeRequiredNotes
paymentType"balance_inquiry"yesLiteral
commerceIndicator"retail"yesAlways retail
entryModeenumyesswiped, contact, contactless, msd (no manual / keyed)
cardData.trackData (or emvData.trackData)stringyesCard-present required
pin_blockhex stringconditionalRequired for swiped entry mode
ksnhex stringconditionalRequired for swiped entry mode
ebtCategory"FOOD" or "CASH"conditionalRequired for EBT inquiries only

No amount field — the response IS the amount.

Entry mode differences

Entry ModeCard Data RequiredPIN Required
contactlessemvData.trackData + emvData.tagsNo
contactemvData.trackData + emvData.tagsNo
swipedcardData.trackDataYes (pin_block + ksn)

5. Response fields

Top-level fields

FieldTypeDescription
responseCodestringISO 8583 response code. "00" = approved.
ref_idUUIDIdempotency key echoed back from the request
transaction_idstringValor-assigned transaction identifier
statusenumAUTHORIZED, ERROR
creatorNamestringProcessor name (e.g. "VALOR")
txn_typestringAlways "balance_inquiry" for this endpoint
tran_nointegerSequential transaction number within the terminal session
batch_nostringCurrent open batch number
authCodestringAuthorization code from the issuer
referencestringRetrieval reference number (RRN)
createdISO 8601Timestamp of the transaction

balance object

FieldTypeDescription
amountstringSigned decimal balance (e.g. "+20.00")
accountTypestringTwo-digit code identifying the account type (see table below)
amountTypestringTwo-digit code identifying the type of balance returned (see table below)

cardInformation object

FieldTypeDescription
maskedPanstringMasked card number (e.g. "411111XXXXXX1111")
expiryDatestringCard expiry in MMYY format

accountType codes (verified via CyberSource)

CodeAccount TypeDescription
00DefaultNot specified / generic
10SavingsSavings account
20CheckingChecking account
30CreditCredit card account (non-PIN-debit only)
40UniversalDefault debit account (PIN debit when no specific account selected)
96EBT CashCash benefit account (TANF, general assistance)
98EBT Food (SNAP)Supplemental Nutrition Assistance Program benefits

PIN Debit cards return a single balance response with account type 40 (universal).

EBT cards typically return two separate balance responses — one for SNAP food (98) and one for cash benefits (96).

amountType codes (verified via CyberSource)

For deposit accounts (PIN debit, EBT):

CodeAmount TypeDescription
01Ledger balanceCurrent posted balance (total including pending/held amounts)
02Available balanceFunds currently available for use (ledger minus outstanding auths; may include pending deposits and overdraft line)

For credit card accounts:

CodeAmount TypeDescription
01Open to buyCredit amount remaining for customer
02Credit limitTotal credit limit on the account

Note: CyberSource states "the issuer determines the value that is returned." For EBT and PIN debit balance inquiries, amountType is typically "02" (available balance).

responseCode values (common)

CodeMeaning
00Approved
05Do not honor
12Invalid transaction
14Invalid card number
51Insufficient funds
54Expired card
55Incorrect PIN
91Issuer unavailable
96System malfunction

6. Sample requests

PIN Debit — contactless

{
  "merchantId": "855500000027",
  "terminalId": "48593451",
  "paymentType": "balance_inquiry",
  "commerceIndicator": "retail",
  "entryMode": "contactless",
  "ref_id": "00000000-0000-0000-0000-000000000001",
  "cardData": {
    "panNumber": "4111111111111111",
    "expiryDate": "1233",
    "emvData": {
      "trackData": "9F2608ABCDEF",
      "tags": "9F1A0208"
    }
  }
}

PIN Debit — contact (chip)

{
  "merchantId": "855500000027",
  "terminalId": "48593451",
  "paymentType": "balance_inquiry",
  "commerceIndicator": "retail",
  "entryMode": "contact",
  "ref_id": "00000000-0000-0000-0000-000000000002",
  "cardData": {
    "panNumber": "4111111111111111",
    "expiryDate": "1233",
    "emvData": {
      "trackData": "9F2608ABCDEF",
      "tags": "9F1A0208"
    }
  }
}

PIN Debit — swiped

{
  "merchantId": "855500000027",
  "terminalId": "48593451",
  "paymentType": "balance_inquiry",
  "commerceIndicator": "retail",
  "entryMode": "swiped",
  "ref_id": "00000000-0000-0000-0000-000000000003",
  "cardData": {
    "trackData": "%B4111111111111111^TEST^30121011000000?;4111111111111111=30121011?"
  },
  "pin_block": "1A2B3C4D5E6F7890",
  "ksn": "FFFF9876543210E00001"
}

EBT — Food (SNAP)

{
  "merchantId": "855500000027",
  "terminalId": "48593451",
  "paymentType": "balance_inquiry",
  "commerceIndicator": "retail",
  "entryMode": "swiped",
  "ebtCategory": "FOOD",
  "ref_id": "00000000-0000-0000-0000-000000000004",
  "cardData": {
    "trackData": "%B4111111111111111^TEST^30121011000000?;4111111111111111=30121011?"
  },
  "pin_block": "1A2B3C4D5E6F7890",
  "ksn": "FFFF9876543210E00001"
}

EBT — Cash

{
  "merchantId": "855500000027",
  "terminalId": "48593451",
  "paymentType": "balance_inquiry",
  "commerceIndicator": "retail",
  "entryMode": "swiped",
  "ebtCategory": "CASH",
  "ref_id": "00000000-0000-0000-0000-000000000005",
  "cardData": {
    "trackData": "%B5061120000009012^TEST^30121011000000?;5061120000009012=30121011?"
  },
  "pin_block": "1A2B3C4D5E6F7890",
  "ksn": "FFFF9876543210E00001"
}

7. Sample responses

PIN Debit balance inquiry (accountType 40)

{
  "responseCode": "00",
  "ref_id": "d5fd7466-01d3-45ad-82e8-724926db8571",
  "transaction_id": "827517653749LD8",
  "status": "AUTHORIZED",
  "creatorName": "VALOR",
  "txn_type": "balance_inquiry",
  "tran_no": 54,
  "batch_no": "1",
  "balance": {
    "amount": "+20.00",
    "accountType": "40",
    "amountType": "02"
  },
  "authCode": "925513",
  "reference": "123456660749",
  "cardInformation": {
    "maskedPan": "411111XXXXXX1111",
    "expiryDate": "1233"
  },
  "created": "2026-06-25T16:06:05Z"
}

EBT Food (SNAP) balance inquiry (accountType 98)

{
  "responseCode": "00",
  "ref_id": "a0d49c05-6828-4c89-8ae1-0fad51306ade",
  "transaction_id": "827517611387O93",
  "status": "AUTHORIZED",
  "creatorName": "VALOR",
  "txn_type": "balance_inquiry",
  "tran_no": 35,
  "batch_no": "1",
  "balance": {
    "amount": "+20.00",
    "accountType": "98",
    "amountType": "02"
  },
  "authCode": "450136",
  "reference": "123456647008",
  "cardInformation": {
    "maskedPan": "411111XXXXXX1111",
    "expiryDate": "1233"
  },
  "created": "2026-06-25T13:12:10Z"
}

EBT Cash balance inquiry (accountType 96)

{
  "responseCode": "00",
  "ref_id": "d56b2ade-1b2e-4184-a17f-96e2be9d90dd",
  "transaction_id": "827517610024AGK",
  "status": "AUTHORIZED",
  "creatorName": "VALOR",
  "txn_type": "balance_inquiry",
  "tran_no": 36,
  "batch_no": "1",
  "balance": {
    "amount": "+20.00",
    "accountType": "96",
    "amountType": "02"
  },
  "authCode": "649585",
  "reference": "123456647070",
  "cardInformation": {
    "maskedPan": "506112XXXXXX9012",
    "expiryDate": "1233"
  },
  "created": "2026-06-25T13:12:46Z"
}

8. Errors

Same matrix as auth.md. Additionally:

TriggerResult
entryMode not in swiped/contact/contactless/msd400 — entry mode validation
commerceIndicator != "retail"400 — Pydantic literal rejection
Missing pin_block + ksn for swiped400 — _validate_swiped_entry
Missing ebtCategory for EBT card400 — validation error