Contents
Messages
- 0100 Authorization Request
- 0110 Authorization Response
- 0200 Financial Request
- 0210 Financial Response
- 0400 Reversal Request
- 0410 Reversal Response
- 0800 Network Management Request
- 0810 Network Management Response
Data elements
- 0 Message Type Indicator
- 1 Bitmap
- 2 Primary Account Number
- 3 Processing Code
- 4 Amount, Transaction
- 5 Amount, Settlement
- 6 Amount, Cardholder Billing
- 7 Transmission Date & Time
- 8 Amount, Cardholder Billing Fee
- 9 Conversion Rate, Settlement
- 10 Conversion Rate, Cardholder Billing
- 11 Systems Trace Audit Number
- 12 Time, Local Transaction
- 13 Date, Local Transaction
- 14 Date, Expiration
- 15 Date, Settlement
- 16 Date, Conversion
- 17 Date, Capture
- 18 Merchant Type
- 19 Acquiring Institution Country Code
- 20 PAN Extended, Country Code
- 21 Forwarding Institution Country Code
- 22 Point of Service Entry Mode
- 23 Application PAN Sequence Number
- 24 Function Code
- 25 Point of Service Condition Code
- 26 Point of Service PIN Capture Code
- 27 Authorizing Identification Response Length
- 28 Amount, Transaction Fee
- 29 Amount, Settlement Fee
- 30 Amount, Transaction Processing Fee
- 31 Amount, Settlement Processing Fee
- 32 Acquiring Institution ID Code
- 33 Forwarding Institution ID Code
- 34 Primary Account Number, Extended
- 35 Track 2 Data
- 36 Track 3 Data
- 37 Retrieval Reference Number
- 38 Authorization Identification Response
- 39 Response Code
- 40 Service Restriction Code
- 41 Card Acceptor Terminal Identification
- 42 Card Acceptor Identification Code
- 43 Card Acceptor Name/Location
- 44 Additional Response Data
- 45 Track 1 Data
- 46 Additional Data - ISO
- 47 Additional Data - National
- 48 Additional Data - Private
- 49 Currency Code, Transaction
- 50 Currency Code, Settlement
- 51 Currency Code, Cardholder Billing
- 54 Additional Amounts
- 55 ICC Data
- 56 Reserved (ISO)
- 57 Reserved (National)
- 58 Reserved (National)
- 59 Reserved (National)
- 60 Reserved (National)
- 70 Network Management Information Code
- 90 Original Data Elements
Messages
0100 — Authorization Request
Request to authorize a transaction without immediate funds movement.
A request. Its response is 0110.
| Element | Name | Usage | When |
|---|---|---|---|
| 2 | Primary Account Number | mandatory | — |
| 3 | Processing Code | mandatory | — |
| 4 | Amount, Transaction | mandatory | — |
| 7 | Transmission Date & Time | mandatory | — |
| 11 | Systems Trace Audit Number | mandatory | — |
| 14 | Date, Expiration | mandatory | present(35) == false |
| 22 | Point of Service Entry Mode | mandatory | — |
| 26 | Point of Service PIN Capture Code | optional | — |
| 35 | Track 2 Data | optional | — |
| 41 | Card Acceptor Terminal Identification | mandatory | — |
| 42 | Card Acceptor Identification Code | mandatory | — |
| 49 | Currency Code, Transaction | mandatory | — |
| 55 | ICC Data | conditional | mandatory when field(22) == '05' || field(22) == '07'forbidden when field(22) == '02' || field(22) == '90'optional otherwise |
0110 — Authorization Response
Issuer decision for an authorization request.
A response. It answers 0100.
| Element | Name | Usage | Response value | When |
|---|---|---|---|---|
| 4 | Amount, Transaction | mandatory | modified | — |
| 11 | Systems Trace Audit Number | mandatory | echo | — |
| 37 | Retrieval Reference Number | mandatory | echo | — |
| 38 | Authorization Identification Response | mandatory | new | field(39) == '00' |
| 39 | Response Code | mandatory | new | — |
| 44 | Additional Response Data | optional | new | — |
0200 — Financial Request
Request to authorize and post a financial transaction.
A request. Its response is 0210.
| Element | Name | Usage | When |
|---|---|---|---|
| 2 | Primary Account Number | mandatory | — |
| 3 | Processing Code | mandatory | — |
| 4 | Amount, Transaction | mandatory | — |
| 7 | Transmission Date & Time | mandatory | — |
| 11 | Systems Trace Audit Number | mandatory | — |
| 14 | Date, Expiration | mandatory | present(35) == false |
| 22 | Point of Service Entry Mode | mandatory | — |
| 26 | Point of Service PIN Capture Code | optional | — |
| 35 | Track 2 Data | optional | — |
| 41 | Card Acceptor Terminal Identification | mandatory | — |
| 42 | Card Acceptor Identification Code | mandatory | — |
| 49 | Currency Code, Transaction | mandatory | — |
| 55 | ICC Data | conditional | mandatory when field(22) == '05' || field(22) == '07'forbidden when field(22) == '02' || field(22) == '90'optional otherwise |
0210 — Financial Response
Issuer decision for a financial request.
A response. It answers 0200.
| Element | Name | Usage | Response value | When |
|---|---|---|---|---|
| 4 | Amount, Transaction | mandatory | modified | — |
| 11 | Systems Trace Audit Number | mandatory | echo | — |
| 37 | Retrieval Reference Number | mandatory | echo | — |
| 38 | Authorization Identification Response | mandatory | new | field(39) == '00' |
| 39 | Response Code | mandatory | new | — |
| 44 | Additional Response Data | optional | new | — |
0400 — Reversal Request
Request to reverse a prior authorization or financial transaction.
A request. Its response is 0410.
| Element | Name | Usage |
|---|---|---|
| 11 | Systems Trace Audit Number | mandatory |
| 39 | Response Code | forbidden |
| 90 | Original Data Elements | mandatory |
0410 — Reversal Response
Acknowledgement of a reversal request.
A response. It answers 0400.
| Element | Name | Usage | Response value |
|---|---|---|---|
| 11 | Systems Trace Audit Number | mandatory | — |
| 39 | Response Code | mandatory | new |
| 90 | Original Data Elements | mandatory | — |
0800 — Network Management Request
Network housekeeping such as echo test or key exchange.
A request. Its response is 0810.
| Element | Name | Usage |
|---|---|---|
| 2 | Primary Account Number | forbidden |
| 7 | Transmission Date & Time | mandatory |
| 11 | Systems Trace Audit Number | mandatory |
| 39 | Response Code | forbidden |
| 70 | Network Management Information Code | mandatory |
0810 — Network Management Response
Acknowledgement of a network management request.
A response. It answers 0800.
Data elements
DE 0 — Message Type Indicator
Identifies the message class, function, and origin. Valid values are the keys of the message catalog above.
- Wire type String
- Length 4
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
- Alias
mti
DE 1 — Bitmap
Indicates which data elements are present in the message.
- Wire type Bitmap
- Length 16
- Encoding HexToASCII
- Length prefix Hex.Fixed
DE 2 — Primary Account Number
The cardholder account number. Sensitive; subject to masking and tokenization policy.
Track 2 carries the account number as well. When both DE 2 and DE 35 are present they must agree; a switch that trusts one and forwards the other has two answers to the same question.
DE 3 — Processing Code
Describes the transaction type and the accounts affected. Composed of three positional subfields.
- Wire type Numeric
- Length 6
- Length prefix ASCII.Fixed
- Padding Left with 0
- Alias
proc_code
Parts (positional)
| # | Name | Values |
|---|---|---|
| 1 | Transaction type | processing_txn_type |
| 2 | Account type, from | account_type |
| 3 | Account type, to | account_type |
DE 4 — Amount, Transaction
Transaction amount in the minor unit of the transaction currency (DE 49).
Minor units, so 1000 is 10.00 in a two-decimal currency — and not every currency has two. JPY has none, so 1000 is 1000; a fixed divisor of 100 is the mistake this field invites.
- Wire type String
- Length 12
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
| In | Usage | Response value | Note |
|---|---|---|---|
| 0100, 0200 | mandatory | — | — |
| 0110, 0210 | mandatory | modified | Partial approval returns less than the amount asked for, so this is not compared for equality. |
DE 5 — Amount, Settlement
- Wire type String
- Length 12
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 6 — Amount, Cardholder Billing
- Wire type String
- Length 12
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 7 — Transmission Date & Time
Date and time the message entered the network, MMDDhhmmss in UTC.
UTC, not local time. DE 12 and DE 13 carry the local time and date, and the two disagree by the acquirer's offset on purpose.
- Wire type String
- Length 10
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
- Alias
txn_datetime - Format datetime
DE 8 — Amount, Cardholder Billing Fee
- Wire type String
- Length 8
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 9 — Conversion Rate, Settlement
- Wire type String
- Length 8
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 10 — Conversion Rate, Cardholder Billing
- Wire type String
- Length 8
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 11 — Systems Trace Audit Number
Sender-assigned trace number that identifies the transaction within the day.
Unique per acquirer per day, not globally, and it wraps at 999999. Correlating on the STAN alone collides across acquirers and again the next day.
- Wire type String
- Length 6
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
- Alias
stan
| In | Usage | Response value | Note |
|---|---|---|---|
| 0100, 0200 | mandatory | — | — |
| 0110, 0210 | mandatory | echo | STAN echoed unchanged from the request. |
| 0400, 0410 | mandatory | — | — |
| 0800, 0810 | mandatory | — | — |
DE 12 — Time, Local Transaction
- Wire type String
- Length 6
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
- Format time
DE 13 — Date, Local Transaction
- Wire type String
- Length 4
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
- Format date
DE 14 — Date, Expiration
Card expiration date, YYMM.
- Wire type String
- Length 4
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
| In | Usage | When | Note |
|---|---|---|---|
| 0100, 0200 | mandatory | present(35) == false | Expiration date required when Track 2 is absent. |
DE 15 — Date, Settlement
- Wire type String
- Length 4
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 16 — Date, Conversion
- Wire type String
- Length 4
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 17 — Date, Capture
- Wire type String
- Length 4
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 18 — Merchant Type
- Wire type String
- Length 4
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 19 — Acquiring Institution Country Code
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 20 — PAN Extended, Country Code
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 21 — Forwarding Institution Country Code
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 22 — Point of Service Entry Mode
How the PAN and PIN were captured at the point of service.
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
- Alias
pos_entry_mode
Values — this list is complete; anything else is invalid.
| Value | Name |
|---|---|
01 | Manual (key entered) |
02 | Magnetic stripe |
05 | Integrated circuit card (chip) |
07 | Contactless (chip) |
90 | Magnetic stripe, full track available |
91 | Contactless (magnetic stripe) |
DE 23 — Application PAN Sequence Number
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 24 — Function Code
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 25 — Point of Service Condition Code
- Wire type String
- Length 2
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 26 — Point of Service PIN Capture Code
- Wire type String
- Length 2
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 27 — Authorizing Identification Response Length
- Wire type String
- Length 1
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 28 — Amount, Transaction Fee
- Wire type String
- Length 9
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 29 — Amount, Settlement Fee
- Wire type String
- Length 9
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 30 — Amount, Transaction Processing Fee
- Wire type String
- Length 9
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 31 — Amount, Settlement Processing Fee
- Wire type String
- Length 9
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
DE 32 — Acquiring Institution ID Code
DE 33 — Forwarding Institution ID Code
DE 34 — Primary Account Number, Extended
DE 35 — Track 2 Data
Magnetic stripe track 2. Parsed natively into PAN, expiration, service code, and discretionary data.
- Alias
track2 - Classification sad
DE 36 — Track 3 Data
- Classification sad
DE 37 — Retrieval Reference Number
Reference assigned by the acquirer to retrieve the original transaction.
- Wire type String
- Length 12
- Encoding ASCII
- Length prefix ASCII.Fixed
- Alias
rrn
DE 38 — Authorization Identification Response
Approval code returned by the issuer when a transaction is approved.
- Wire type String
- Length 6
- Encoding ASCII
- Length prefix ASCII.Fixed
- Alias
auth_code
| In | Usage | Response value | When | Note |
|---|---|---|---|---|
| 0110, 0210 | mandatory | new | field(39) == '00' | Authorization code present when approved. |
DE 39 — Response Code
Issuer or switch disposition of the transaction.
A code this spec does not list is not necessarily an error: schemes issue their own. Reject on an unrecognised code and the first proprietary decline takes production down.
- Wire type String
- Length 2
- Encoding ASCII
- Length prefix ASCII.Fixed
- Alias
resp_code
| In | Usage | Response value | Note |
|---|---|---|---|
| 0110, 0210 | mandatory | new | — |
| 0410 | mandatory | new | Issuer disposition of the reversal, originated here. |
| 0810 | mandatory | new | — |
| 0400 | forbidden | — | A reversal request states what is being reversed, not how it was answered. |
| 0800 | forbidden | — | A network management request carries no disposition. |
Values — the documented set. Others may occur.
| Value | Name | Group |
|---|---|---|
00 | Approved | approved |
01 | Refer to card issuer | referral |
03 | Invalid merchant | error |
05 | Do not honor | decline_soft |
12 | Invalid transaction | error |
13 | Invalid amount | error |
14 | Invalid card number | error |
30 | Format error | error |
41 | Lost card | decline_hard |
43 | Stolen card | decline_hard |
51 | Insufficient funds | decline_soft |
54 | Expired card | decline_hard |
55 | Incorrect PIN | decline_soft |
57 | Transaction not permitted to cardholder | decline_hard |
61 | Exceeds withdrawal amount limit | decline_soft |
91 | Issuer or switch inoperative | system |
96 | System malfunction | system |
DE 40 — Service Restriction Code
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Classification chd
DE 41 — Card Acceptor Terminal Identification
Identifier of the terminal at the card acceptor location.
- Wire type String
- Length 8
- Encoding ASCII
- Length prefix ASCII.Fixed
- Alias
terminal_id
DE 42 — Card Acceptor Identification Code
Identifier of the merchant (card acceptor).
- Wire type String
- Length 15
- Encoding ASCII
- Length prefix ASCII.Fixed
- Alias
merchant_id
DE 43 — Card Acceptor Name/Location
- Wire type String
- Length 40
- Encoding ASCII
- Length prefix ASCII.Fixed
DE 44 — Additional Response Data
DE 45 — Track 1 Data
- Classification sad
DE 46 — Additional Data - ISO
DE 47 — Additional Data - National
DE 48 — Additional Data - Private
DE 49 — Currency Code, Transaction
ISO 4217 numeric currency code for DE 4.
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
- Alias
txn_currency
Values — this list is complete; anything else is invalid.
| Value | Name | Description |
|---|---|---|
840 | USD | US dollar |
858 | UYU | Uruguayan peso |
978 | EUR | Euro |
DE 50 — Currency Code, Settlement
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
Values — this list is complete; anything else is invalid.
| Value | Name | Description |
|---|---|---|
840 | USD | US dollar |
858 | UYU | Uruguayan peso |
978 | EUR | Euro |
DE 51 — Currency Code, Cardholder Billing
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
Values — this list is complete; anything else is invalid.
| Value | Name | Description |
|---|---|---|
840 | USD | US dollar |
858 | UYU | Uruguayan peso |
978 | EUR | Euro |
DE 54 — Additional Amounts
Up to six repeating 20-character amount groups (e.g. cashback, tip, balances).
Parts (positional)
| # | Name | Values |
|---|---|---|
| 1 | Account type | account_type |
| 2 | Amount type | — |
| 3 | Currency code | currency_iso4217 |
| 4 | Sign | 2 listed |
| 5 | Amount | — |
DE 55 — ICC Data
EMV chip data as BER-TLV. Tags not declared here are preserved on decode and re-emitted on encode.
The tags named here are the three this dialect declares, not the ones a chip sends: real chip data carries far more. Their numbers and names come from EMV Book 3, Annex A — see References. Anything undeclared is preserved on the way through, which is what a switch forwarding to a scheme depends on.
- Alias
icc_data
| In | Usage | When | Note |
|---|---|---|---|
| 0100, 0200 | mandatory | field(22) == '05' || field(22) == '07' | Chip read; the cryptogram travels here. |
| 0100, 0200 | forbidden | field(22) == '02' || field(22) == '90' | Magnetic stripe read; there is no chip data to carry. |
| 0100, 0200 | optional | — | Any other entry mode: not expected, not forbidden. |
Parts (tlv)
| Tag | Name | Values |
|---|---|---|
| 9F02 | Amount, Authorized | — |
| 5F2A | Transaction Currency Code | currency_iso4217 |
| 9F36 | Application Transaction Counter | — |
DE 56 — Reserved (ISO)
DE 57 — Reserved (National)
DE 58 — Reserved (National)
DE 59 — Reserved (National)
DE 60 — Reserved (National)
DE 70 — Network Management Information Code
Identifies the network management function for 0800/0810 messages.
- Wire type String
- Length 3
- Encoding ASCII
- Length prefix ASCII.Fixed
- Padding Left with 0
- Alias
net_mgmt_code
Values — the documented set. Others may occur.
| Value | Name |
|---|---|
001 | Sign-on |
002 | Sign-off |
301 | Echo test |
801 | Key change |
DE 90 — Original Data Elements
Key fields of the original transaction, used to match a reversal to its financial request.
- Wire type String
- Length 42
- Encoding ASCII
- Length prefix ASCII.Fixed
Introduction
An ISO 8583 message is a message type indicator, a bitmap, and the data elements the bitmap says are present.
The message type indicator is four digits and each one means something. The first is the version of the standard; the second is the class of business — authorization, financial, reversal, network management; the third is the function, which is what separates a request from the response that answers it; and the fourth is who originated it. That is why 0100 and 0110 are a pair: same version, same class, one asks and one answers.
The bitmap says which data elements the message carries. Each bit stands for one element, so a message contains only what it needs and a reader knows what to expect before parsing any of it. Elements are numbered, not named, and the names in this document are what the standard calls them.
An element may be a single value or a composite of parts. Positional parts are fixed slices of a fixed-width field, read by their offset. TLV parts each carry their own tag and length, so a message may carry parts this document does not list, and those are preserved rather than dropped.
Amounts are in the minor unit of their currency, which is the last thing to get wrong: 1000 in a two-decimal currency is 10.00, and in a currency with no minor unit it is 1000. Each amount here names the element that carries its currency.
What this document cannot tell you is what a scheme requires of you. The standard defines the elements; a scheme decides which ones it wants, what its own codes mean, and what it does with the ones it did not anticipate. Those are in the documents under References, and they are obtained from their publishers.
How to read this
| Usage | Meaning |
|---|---|
| mandatory | The element must be present. |
| optional | It may be present. |
| forbidden | It must not be present. |
| conditional | Which of the above applies depends on the message's own contents. |
A rule may carry a condition, shown under When: it applies only where the condition holds, and the first matching rule wins.
response_value | Meaning |
|---|---|
| echo | Carries the request's value; a difference is a fault. |
| new | Originated by the responder. |
| modified | Derived from the request's value and may legitimately differ. |
Help
The words this reference uses, and what each one means. Every one of them is a link from wherever it appears above.
Usage
conditional- The element has more than one rule in this message, and which applies depends on what else the message carries. The rules are listed beside it under When, in the order they are evaluated: the first match wins.
forbidden- The element must not be present. A request carrying a response code is the usual example — the answer to a question nobody has answered yet.
mandatory- The element must be present in that message. A message without it is malformed, whatever else it carries.
optional- The element may be present. Saying so is not the same as leaving it unlisted: it records that someone considered it and decided either way is correct.
Response value
echo- The response must carry the same value the request did. It is the sharpest conformance check available: a trace number that comes back changed means correlation is broken, and the switch that changed it is the fault.
modified- The value comes from the request's but may differ, and the difference is the point. A partial approval returns less than the amount asked for, so this must not be compared for equality — only that it relates.
new- The responder produced this value; there was nothing in the request to echo. A response code is the case — the issuer decides it, and comparing it to anything in the request is meaningless.
varies- This element's rules for the message do not agree on where its value comes from. The distinction is per case, and the element's own section carries it.
Composites
bitmapped- A leading bitmap says which parts the element carries, the same way a message's bitmap says which elements it carries.
positional- The element is a fixed-width string cut into parts at fixed offsets. Nothing in the message says where one part ends, so the layout is the only thing that knows.
tlv- Each part announces itself with a tag and a length, so a message may carry parts this document does not list. Those are preserved on the way through rather than dropped: a switch that discards what it did not recognise breaks the parties either side of it.
Value kinds
amount- A figure in the minor unit of the currency named beside it: 1000 is 10.00 where the currency has two decimals, and 1000 where it has none. Dividing by a fixed hundred is the mistake this kind exists to prevent. A rule compares it as a number, so it matches whatever padding the element is written with.
date- A date in the layout the element declares. Comparisons on it are chronological rather than lexical, so an expiry compares as a date and not as a string of digits.
datetime- A combined date and time in the layout the element declares, compared chronologically.
numeric- A value that is a number rather than a code: a trace number, a sequence, a count. A rule compares it as a number, so the padding it is written with does not matter. This is the difference from an element with no kind at all, which compares as the characters it carries -- and has to, because a response code of "00" is not "0".
time- A time in the layout the element declares, compared chronologically.
Classification
chd- Cardholder data under the PCI definition: masked in logs and console output.
pan- The cardholder's account number. It is masked in logs and console output wherever it appears, and the masking follows the classification: it cannot be switched off by the spec that declared it. It is digits and it is not a number: a leading zero makes it a different card, so a rule compares the characters it carries.
pii- Personal data about the cardholder rather than the card. Masked in logs and console output.
sad- Sensitive authentication data — a PIN block, a cryptogram, track data. Masked in logs, and never retained after authorization.
Wire types
Binary- Raw bytes, passed through without interpretation.
Bitmap- The bitmap itself: one bit per element, saying which the message carries. A second bitmap follows when the first says so.
Composite- An element built from parts rather than holding one value. How the parts are found is the layout — positional, tlv or bitmapped.
Hex- Bytes written as pairs of hexadecimal characters, so one byte occupies two.
Numeric- Digits, right-aligned and padded with zeros to the declared length.
String- The value is characters in the field's encoding. Most elements are this, including numeric ones that travel as digits rather than as packed numbers.
Track2- Track 2 of a magnetic stripe, with its own separator between the account number and the rest.
Encodings
ASCII- Characters as ASCII, one byte each. The most common encoding in a modern interface.
BCD- Binary-coded decimal: two digits share a byte, so a six-digit value occupies three. Halves the bytes on the wire and doubles the ways to get the length wrong.
BerTLVTag- A BER-TLV tag as EMV writes them: one byte, or two when the first says the tag continues.
EBCDIC- The character encoding of IBM mainframes, still in use wherever the host at one end of the link is one.
Length prefixes
ASCII.Fixed- There is no length on the wire. The element is exactly as long as the spec says, always.
ASCII.LL- Two ASCII digits precede the value and give its length, so the element can be up to 99 long.
ASCII.LLL- Three ASCII digits precede the value and give its length, up to 999.
BerTLV- A BER length: one byte for short values, or a byte saying how many length bytes follow for longer ones.
Value sets
Every set this spec declares, and the elements it governs. A set is documented here once; the elements that use it link back to this.
account_type
This list is complete; anything else is invalid.
| Value | Name |
|---|---|
00 | Default / unspecified |
10 | Savings |
20 | Checking |
30 | Credit |
currency_iso4217
Governs DE 49, DE 50, DE 51, DE 54, DE 55.
This list is complete; anything else is invalid.
| Value | Name | Description |
|---|---|---|
840 | USD | US dollar |
858 | UYU | Uruguayan peso |
978 | EUR | Euro |
network_mgmt_code
Governs DE 70.
The documented set. Others may occur.
| Value | Name |
|---|---|
001 | Sign-on |
002 | Sign-off |
301 | Echo test |
801 | Key change |
pos_entry_mode
Governs DE 22.
This list is complete; anything else is invalid.
| Value | Name |
|---|---|
01 | Manual (key entered) |
02 | Magnetic stripe |
05 | Integrated circuit card (chip) |
07 | Contactless (chip) |
90 | Magnetic stripe, full track available |
91 | Contactless (magnetic stripe) |
processing_txn_type
Governs DE 3.
This list is complete; anything else is invalid.
| Value | Name |
|---|---|
00 | Goods and services |
01 | Cash withdrawal |
09 | Goods and services with cash back |
20 | Refund |
30 | Balance inquiry |
response_code
Governs DE 39.
The documented set. Others may occur.
| Value | Name | Group |
|---|---|---|
00 | Approved | approved |
01 | Refer to card issuer | referral |
03 | Invalid merchant | error |
05 | Do not honor | decline_soft |
12 | Invalid transaction | error |
13 | Invalid amount | error |
14 | Invalid card number | error |
30 | Format error | error |
41 | Lost card | decline_hard |
43 | Stolen card | decline_hard |
51 | Insufficient funds | decline_soft |
54 | Expired card | decline_hard |
55 | Incorrect PIN | decline_soft |
57 | Transaction not permitted to cardholder | decline_hard |
61 | Exceeds withdrawal amount limit | decline_soft |
91 | Issuer or switch inoperative | system |
96 | System malfunction | system |
References
The documents this spec was written from. They are cited, not carried: a standards body sells its own, and a scheme issues its own under its terms.
- ISO 8583-1:2003, Financial transaction card originated messages — International Organization for Standardization
Sold by ISO and by national standards bodies. The 1987 edition this spec follows is withdrawn and obtained the same way.
https://www.iso.org/standard/31628.html - EMV Integrated Circuit Card Specifications, Book 3 — Application Specification — EMVCo, LLC
Annex A is the data element dictionary the tags under DE 55 come from. EMVCo publishes the specifications for download at no charge, under its own terms of use; the tag numbers and short names here are the labels, not the dictionary text.
https://www.emvco.com/specifications/ - Scheme interface manuals
Each scheme issues its own under its own terms, to its members. They are what decide which elements a scheme requires, what its private codes mean, and how it treats values it did not anticipate — none of which the standard settles. - moov-io/iso8583 — Moov Financial, Inc.
The wire vocabulary this spec consumes rather than restates. Apache 2.0.
https://github.com/moov-io/iso8583
The spec
The spec, as written
Sections fold; the top two levels start open.
# published response / POS-entry-mode code lists). No proprietary dialect data.
spec:
overview: |-
elements the bitmap says are present.
version, same class, one asks and one answers.
in this document are what the standard calls them.
list, and those are preserved rather than dropped.
unit it is 1000. Each amount here names the element that carries its currency.
references:
- title: "ISO 8583-1:2003, Financial transaction card originated messages"
- title: "EMV Integrated Circuit Card Specifications, Book 3 — Application Specification"
- title: "Scheme interface manuals"
- title: "moov-io/iso8583"
wire:
fields:
51: {padding: {type: Left, pad: "0"}}
3:
subfields:
parts:
- from: 1
- from: 3
- from: 5
35:
54:
subfields:
repeat:
parts:
- from: 1
- from: 3
- from: 5
- from: 8
- from: 9
55:
70:
messages:
catalog:
"0100":
"0110":
"0200":
"0210":
"0400":
"0410":
"0800":
"0810":
transitions:
- from: "0100"
- from: "0200"
enums:
account_type:
values:
processing_txn_type:
values:
pos_entry_mode:
values:
response_code:
values:
currency_iso4217:
values:
network_mgmt_code:
values:
fields:
0:
1:
2:
messages:
- mti: ["0100", "0200"]
- mti: ["0800", "0810"]
format:
sensitivity: pan # PCI classification: pan | chd | sad | pii | none
3:
messages:
- mti: ["0100", "0200"]
subfields:
parts:
- name: Transaction type
- name: Account type, from
- name: Account type, to
4:
messages:
- mti: ["0100", "0200"]
- mti: ["0110", "0210"]
format:
5:
format:
6:
format:
7:
messages:
- mti: ["0100", "0200"]
- mti: ["0800", "0810"]
format:
8:
9:
10:
11:
messages:
- mti: ["0100", "0200"]
- mti: ["0110", "0210"]
- mti: ["0400", "0410"]
- mti: ["0800", "0810"]
12:
format:
13:
format:
14:
messages:
- mti: ["0100", "0200"]
format:
15:
16:
17:
20:
22:
messages:
- mti: ["0100", "0200"]
23:
26:
messages:
- mti: ["0100", "0200"]
28:
29:
30:
31:
32:
33:
34:
35:
messages:
- mti: ["0100", "0200"]
36:
37:
messages:
- mti: ["0110", "0210"]
38:
messages:
- mti: ["0110", "0210"]
39:
messages:
- mti: ["0110", "0210"]
- mti: "0410"
- mti: "0810"
- mti: "0400"
- mti: "0800"
40:
41:
messages:
- mti: ["0100", "0200"]
42:
messages:
- mti: ["0100", "0200"]
44:
messages:
- mti: ["0110", "0210"]
45:
46:
47:
48:
49:
messages:
- mti: ["0100", "0200"]
50:
51:
54:
subfields:
parts:
- name: Account type
- name: Currency code
- name: Sign
validValues:
values:
C:
D:
55:
messages:
- mti: ["0100", "0200"]
- mti: ["0100", "0200"]
- mti: ["0100", "0200"]
subfields:
parts:
- tag: 9F02
- tag: 5F2A
- tag: 9F36
90:
messages:
- mti: ["0400", "0410"]
70:
messages:
- mti: ["0800", "0810"]
values_ref: "network_mgmt_code"
validation_policy:
unlisted: optional # fields not named in a group are permitted (permissive
checks:
- mti: ["0100", "0200"]
- mti: ["0100", "0200"]
x-fluxrig-simulation:
mix: # traffic profile for generator gears/tools
- use: "0100"
- use: "0200"
- use: "0800"
weight: 5
defaults:
"0100":
2:
choose:
3:
choose:
22:
choose:
49:
choose:
"0200":
"0800":
70:
choose:
responder:
default:
rules:
- name: "Insufficient funds over limit"
set:
- name: "Expired card"
set:
39: "54"
x-fluxrig-observability:
dimensions:
histograms:
- field: "txn_amount"
The wire layer, resolved
Not part of the document above. moov:spec87ascii names a base resolved from the linked library, so it cannot drift from upstream and arrives with a dependency update. This is that base with this spec's own overrides applied.