Protocol reference · public

ISO 8583:1987 (ASCII)

61 data elements, 8 messages. 7 private elements are omitted from this variant.

Version 2.2.0

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.

0110 — Authorization Response

Issuer decision for an authorization request.

A response. It answers 0100.

0200 — Financial Request

Request to authorize and post a financial transaction.

A request. Its response is 0210.

0210 — Financial Response

Issuer decision for a financial request.

A response. It answers 0200.

0400 — Reversal Request

Request to reverse a prior authorization or financial transaction.

A request. Its response is 0410.

0410 — Reversal Response

Acknowledgement of a reversal request.

A response. It answers 0400.

0800 — Network Management Request

Network housekeeping such as echo test or key exchange.

A request. Its response is 0810.

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.

  • 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.
  • Alias pan
  • Format pan
  • Classification pan

DE 3 — Processing Code

Describes the transaction type and the accounts affected. Composed of three positional subfields.

  • Alias proc_code

Parts (positional)

#NameValues
1Transaction typeprocessing_txn_type
2Account type, fromaccount_type
3Account type, toaccount_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.
  • Alias txn_amount
  • Format amount in the minor unit of DE 49
InUsageResponse valueNote
0100, 0200mandatory
0110, 0210mandatorymodifiedPartial approval returns less than the amount asked for, so this is not compared for equality.

DE 5 — Amount, Settlement

DE 6 — Amount, Cardholder Billing

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.

DE 8 — Amount, Cardholder Billing Fee

DE 9 — Conversion Rate, Settlement

DE 10 — Conversion Rate, Cardholder Billing

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.
  • Alias stan
InUsageResponse valueNote
0100, 0200mandatory
0110, 0210mandatoryechoSTAN echoed unchanged from the request.
0400, 0410mandatory
0800, 0810mandatory

DE 12 — Time, Local Transaction

DE 13 — Date, Local Transaction

DE 14 — Date, Expiration

Card expiration date, YYMM.

InUsageWhenNote
0100, 0200mandatorypresent(35) == falseExpiration date required when Track 2 is absent.

DE 15 — Date, Settlement

DE 16 — Date, Conversion

DE 17 — Date, Capture

DE 18 — Merchant Type

DE 19 — Acquiring Institution Country Code

DE 20 — PAN Extended, Country Code

DE 21 — Forwarding Institution Country Code

DE 22 — Point of Service Entry Mode

How the PAN and PIN were captured at the point of service.

  • Alias pos_entry_mode

Values — this list is complete; anything else is invalid.

ValueName
01Manual (key entered)
02Magnetic stripe
05Integrated circuit card (chip)
07Contactless (chip)
90Magnetic stripe, full track available
91Contactless (magnetic stripe)

DE 23 — Application PAN Sequence Number

DE 24 — Function Code

DE 25 — Point of Service Condition Code

DE 26 — Point of Service PIN Capture Code

InUsage
0100, 0200optional

DE 27 — Authorizing Identification Response Length

DE 28 — Amount, Transaction Fee

DE 29 — Amount, Settlement Fee

DE 30 — Amount, Transaction Processing Fee

DE 31 — Amount, Settlement Processing Fee

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
InUsage
0100, 0200optional

DE 36 — Track 3 Data

  • Classification sad

DE 37 — Retrieval Reference Number

Reference assigned by the acquirer to retrieve the original transaction.

  • Alias rrn
InUsageResponse value
0110, 0210mandatoryecho

DE 38 — Authorization Identification Response

Approval code returned by the issuer when a transaction is approved.

  • Alias auth_code
InUsageResponse valueWhenNote
0110, 0210mandatorynewfield(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.
  • Alias resp_code
InUsageResponse valueNote
0110, 0210mandatorynew
0410mandatorynewIssuer disposition of the reversal, originated here.
0810mandatorynew
0400forbiddenA reversal request states what is being reversed, not how it was answered.
0800forbiddenA network management request carries no disposition.

Values — the documented set. Others may occur.

ValueNameGroup
00Approvedapproved
01Refer to card issuerreferral
03Invalid merchanterror
05Do not honordecline_soft
12Invalid transactionerror
13Invalid amounterror
14Invalid card numbererror
30Format errorerror
41Lost carddecline_hard
43Stolen carddecline_hard
51Insufficient fundsdecline_soft
54Expired carddecline_hard
55Incorrect PINdecline_soft
57Transaction not permitted to cardholderdecline_hard
61Exceeds withdrawal amount limitdecline_soft
91Issuer or switch inoperativesystem
96System malfunctionsystem

DE 40 — Service Restriction Code

  • Classification chd

DE 41 — Card Acceptor Terminal Identification

Identifier of the terminal at the card acceptor location.

  • Alias terminal_id

DE 42 — Card Acceptor Identification Code

Identifier of the merchant (card acceptor).

  • Alias merchant_id

DE 43 — Card Acceptor Name/Location

DE 44 — Additional Response Data

InUsageResponse value
0110, 0210optionalnew

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.

  • Alias txn_currency

Values — this list is complete; anything else is invalid.

ValueNameDescription
840USDUS dollar
858UYUUruguayan peso
978EUREuro

DE 50 — Currency Code, Settlement

Values — this list is complete; anything else is invalid.

ValueNameDescription
840USDUS dollar
858UYUUruguayan peso
978EUREuro

DE 51 — Currency Code, Cardholder Billing

Values — this list is complete; anything else is invalid.

ValueNameDescription
840USDUS dollar
858UYUUruguayan peso
978EUREuro

DE 54 — Additional Amounts

Up to six repeating 20-character amount groups (e.g. cashback, tip, balances).

Parts (positional)

#NameValues
1Account typeaccount_type
2Amount type
3Currency codecurrency_iso4217
4Sign2 listed
5Amount

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
InUsageWhenNote
0100, 0200mandatoryfield(22) == '05' || field(22) == '07'Chip read; the cryptogram travels here.
0100, 0200forbiddenfield(22) == '02' || field(22) == '90'Magnetic stripe read; there is no chip data to carry.
0100, 0200optionalAny other entry mode: not expected, not forbidden.

Parts (tlv)

TagNameValues
9F02Amount, Authorized
5F2ATransaction Currency Codecurrency_iso4217
9F36Application 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.

  • Alias net_mgmt_code

Values — the documented set. Others may occur.

ValueName
001Sign-on
002Sign-off
301Echo test
801Key change

DE 90 — Original Data Elements

Key fields of the original transaction, used to match a reversal to its financial request.

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

UsageMeaning
mandatoryThe element must be present.
optionalIt may be present.
forbiddenIt must not be present.
conditionalWhich 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_valueMeaning
echoCarries the request's value; a difference is a fault.
newOriginated by the responder.
modifiedDerived 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

Governs DE 3, DE 54.

This list is complete; anything else is invalid.

ValueName
00Default / unspecified
10Savings
20Checking
30Credit

currency_iso4217

Governs DE 49, DE 50, DE 51, DE 54, DE 55.

This list is complete; anything else is invalid.

ValueNameDescription
840USDUS dollar
858UYUUruguayan peso
978EUREuro

network_mgmt_code

Governs DE 70.

The documented set. Others may occur.

ValueName
001Sign-on
002Sign-off
301Echo test
801Key change

pos_entry_mode

Governs DE 22.

This list is complete; anything else is invalid.

ValueName
01Manual (key entered)
02Magnetic stripe
05Integrated circuit card (chip)
07Contactless (chip)
90Magnetic stripe, full track available
91Contactless (magnetic stripe)

processing_txn_type

Governs DE 3.

This list is complete; anything else is invalid.

ValueName
00Goods and services
01Cash withdrawal
09Goods and services with cash back
20Refund
30Balance inquiry

response_code

Governs DE 39.

The documented set. Others may occur.

ValueNameGroup
00Approvedapproved
01Refer to card issuerreferral
03Invalid merchanterror
05Do not honordecline_soft
12Invalid transactionerror
13Invalid amounterror
14Invalid card numbererror
30Format errorerror
41Lost carddecline_hard
43Stolen carddecline_hard
51Insufficient fundsdecline_soft
54Expired carddecline_hard
55Incorrect PINdecline_soft
57Transaction not permitted to cardholderdecline_hard
61Exceeds withdrawal amount limitdecline_soft
91Issuer or switch inoperativesystem
96System malfunctionsystem

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.

# yaml-language-server: $schema=./spec.fluxrig.schema.json
# fluxRig SDL: ISO 8583:1987 (ASCII) — reference example
#
# This file is the canonical example of a fluxrig protocol spec. It demonstrates
# the two-layer design and is the fixture the spec-conformance and simulation
# Robot Framework suites validate against.
#
# Wire layer (parsing): NOT restated here. `spec.wire` names Moov's canonical
# spec87ascii as the base and declares this dialect's differences as an
# differences, so the base cannot drift from upstream and the delta is reviewable
# in one place. See the block below for provenance and licence.
#
# Semantic core (open, portable): `messages`, `enums`, `checks`, plus per-field
# `alias`, `description`, `scope`, `messages`, `validValues`/`values_ref`,
# `format`, `sensitivity`, `subfields`. Validates against
# spec.core.schema.json on its own.
#
# fluxrig extensions (`x-fluxrig-*`): behavioural sections that drive fluxrig
# engines, namespaced so this document stays a valid core spec for other
# tooling. Currently `x-fluxrig-simulation` and `x-fluxrig-observability`.
#
# Conventions:
# - `scope` defaults to `public`. Mark `private` for proprietary extensions that
# must be excluded from the public documentation output.
# - `validValues` is a map of code -> { name, description? }. Reuse shared sets
# with `values_ref: <enum name>`. The special `values_ref: "@messages"` means
# the valid values are the keys of the message catalog (used by DE 0, the MTI).
# - `spec.wire` is the only place wire attributes may be set. It takes a
# `source` — a Moov base (`moov:<name>`) or a wire document beside the spec —
# and `fields`, merged over whatever the source produced. Either alone is
# valid: a spec with no upstream base carries its whole wire layer in
# `fields`. A field entry under `spec.fields` carries semantics only, and the
# loader rejects a wire key there, so the two layers cannot fuse by accident.
# - `subfields` is split like everything else. The wire layer frames the parts —
# `from`/`to` for `positional` (1-based, inclusive), `tag` for `tlv`, plus
# `repeat` and `unknown_tags` — and the field says what they mean. Positional
# parts bind by order, TLV parts by tag. All three layouts compile to Moov's
# native Composite; for `tlv`, `unknown_tags: preserve` round-trips tags not
# declared here (no silent drop, no hard fail).
# - `messages` on a field is its per-message matrix; see section 2. `usage`
# states what the field is once an entry matches, so there is no
# `conditional`: the entry's `when` is the condition.
# - `when` is a minimal expression over the message: `field(N)`, `present(N)`,
# `mti`, string literals, `==` `!=` `&&` `||`, and parentheses. Comparisons on
# fields with a `format` are typed (dates compare chronologically, amounts in
# minor units).
# - `format` declares a field's semantic kind: pan (Luhn + default masking),
# amount (+ currency_field binding), date/time (+ layout, tz).
# - `sensitivity` is the PCI-aligned data classification (pan | chd | sad |
# pii | none): log_mask defaults from it (pan/sad -> masked), SAD is never
# persisted post-authorization, and the scenario compliance lint uses it
# (e.g. a SAD field mapped into a file sink is rejected at apply time).
# `scope` is documentation visibility; `sensitivity` is data handling —
# independent axes. `crypto.role` (pin_block, mac) marks fields for future
# HSM / MAC-verification gears.
# - enum values may carry `category` (bounded classification, e.g. approved /
# decline_soft), usable as a telemetry dimension and by simulator mixes.
# - `validation_policy.unlisted` fixes what an unnamed field means; per-MTI
# `checks` are named cross-field assertions; response rules take
# `response_value: echo|new|modified` (see section 2).
#
# Sourcing: all definitions are drawn from public, industry-standard references
# (the ISO 8583:1987 data-element dictionary, ISO 4217 currency codes, and widely
# published response / POS-entry-mode code lists). No proprietary dialect data.
spec:
id: "iso8583-v87-ascii"
name: "ISO 8583:1987 (ASCII)"
version: "2.2.0"
encoding: "ascii"
overview: |-
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.
references:
- title: "ISO 8583-1:2003, Financial transaction card originated messages"
publisher: "International Organization for Standardization"
note: "Sold by ISO and by national standards bodies. The 1987 edition this spec follows is withdrawn and obtained the same way."
url: "https://www.iso.org/standard/31628.html"
- title: "EMV Integrated Circuit Card Specifications, Book 3 — Application Specification"
publisher: "EMVCo, LLC"
note: "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."
url: "https://www.emvco.com/specifications/"
- title: "Scheme interface manuals"
note: "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."
- title: "moov-io/iso8583"
publisher: "Moov Financial, Inc."
note: "The wire vocabulary this spec consumes rather than restates. Apache 2.0."
url: "https://github.com/moov-io/iso8583"
wire:
source: "moov:spec87ascii"
format: moov
fields:
# Zero-padding on fixed-length numerics. ISO 8583 carries these as
# zero-filled digit strings, and the base leaves padding to the caller on
# all but a few fields. Declaring it here keeps encoding a spec decision
# rather than something each gear remembers.
0: {padding: {type: Left, pad: "0"}}
7: {padding: {type: Left, pad: "0"}}
8: {padding: {type: Left, pad: "0"}}
9: {padding: {type: Left, pad: "0"}}
10: {padding: {type: Left, pad: "0"}}
11: {padding: {type: Left, pad: "0"}}
12: {padding: {type: Left, pad: "0"}}
13: {padding: {type: Left, pad: "0"}}
14: {padding: {type: Left, pad: "0"}}
15: {padding: {type: Left, pad: "0"}}
16: {padding: {type: Left, pad: "0"}}
17: {padding: {type: Left, pad: "0"}}
18: {padding: {type: Left, pad: "0"}}
19: {padding: {type: Left, pad: "0"}}
20: {padding: {type: Left, pad: "0"}}
21: {padding: {type: Left, pad: "0"}}
22: {padding: {type: Left, pad: "0"}}
23: {padding: {type: Left, pad: "0"}}
24: {padding: {type: Left, pad: "0"}}
25: {padding: {type: Left, pad: "0"}}
26: {padding: {type: Left, pad: "0"}}
27: {padding: {type: Left, pad: "0"}}
28: {padding: {type: Left, pad: "0"}}
29: {padding: {type: Left, pad: "0"}}
30: {padding: {type: Left, pad: "0"}}
31: {padding: {type: Left, pad: "0"}}
49: {padding: {type: Left, pad: "0"}}
50: {padding: {type: Left, pad: "0"}}
51: {padding: {type: Left, pad: "0"}}
# Structural upgrades. Typed fields and composites the base leaves as
# opaque strings, plus the two elements this dialect defines.
3:
subfields:
layout: positional
parts:
- from: 1
to: 2
- from: 3
to: 4
- from: 5
to: 6
35:
type: Track2
54:
subfields:
layout: positional
repeat:
length: 20
max: 6
parts:
- from: 1
to: 2
- from: 3
to: 4
- from: 5
to: 7
- from: 8
to: 8
- from: 9
to: 20
55:
type: Composite
subfields:
layout: tlv
unknown_tags: preserve
parts:
- tag: 9F02
type: Numeric
length: 6
- tag: 5F2A
type: Numeric
length: 3
- tag: 9F36
type: Binary
length: 2
70:
type: String
length: 3
enc: ASCII
prefix: ASCII.Fixed
padding:
type: Left
pad: '0'
104:
type: Composite
length: 999
enc: ASCII
prefix: ASCII.LLL
subfields:
layout: tlv
unknown_tags: preserve
parts:
- tag: '01'
type: String
length: 20
- tag: 1A
type: String
length: 99
# --- 0. Message catalog (which MTIs exist, how they pair, how they flow) ------
messages:
catalog:
"0100":
name: "Authorization Request"
flow: request
pairs_with: "0110"
response_timeout: 30s
meaning: "Request to authorize a transaction without immediate funds movement."
"0110":
name: "Authorization Response"
flow: response
pairs_with: "0100"
meaning: "Issuer decision for an authorization request."
"0200":
name: "Financial Request"
flow: request
pairs_with: "0210"
response_timeout: 30s
meaning: "Request to authorize and post a financial transaction."
"0210":
name: "Financial Response"
flow: response
pairs_with: "0200"
meaning: "Issuer decision for a financial request."
"0400":
name: "Reversal Request"
flow: request
pairs_with: "0410"
meaning: "Request to reverse a prior authorization or financial transaction."
"0410":
name: "Reversal Response"
flow: response
pairs_with: "0400"
meaning: "Acknowledgement of a reversal request."
"0800":
name: "Network Management Request"
flow: request
pairs_with: "0810"
response_timeout: 10s
class: network # excluded from business-traffic metrics (default: business)
meaning: "Network housekeeping such as echo test or key exchange."
"0810":
name: "Network Management Response"
flow: response
pairs_with: "0800"
class: network
meaning: "Acknowledgement of a network management request."
transitions:
- from: "0100"
to: "0200"
trigger: capture
meaning: "An approved authorization may be captured by a financial request."
- from: "0200"
to: "0400"
trigger: reversal
meaning: "A financial transaction may be reversed by a reversal request."
# Match keys pairing a response (or reversal) to its originating request.
# Consumed by orphan/timeout telemetry, the simulator, and the Correlator.
correlate_on: [stan, txn_datetime, terminal_id]
enums:
account_type:
closed: true
values:
"00": {name: "Default / unspecified"}
"10": {name: "Savings"}
"20": {name: "Checking"}
"30": {name: "Credit"}
processing_txn_type:
closed: true
values:
"00": {name: "Goods and services"}
"01": {name: "Cash withdrawal"}
"09": {name: "Goods and services with cash back"}
"20": {name: "Refund"}
"30": {name: "Balance inquiry"}
pos_entry_mode:
closed: true
values:
"01": {name: "Manual (key entered)"}
"02": {name: "Magnetic stripe"}
"05": {name: "Integrated circuit card (chip)"}
"07": {name: "Contactless (chip)"}
"90": {name: "Magnetic stripe, full track available"}
"91": {name: "Contactless (magnetic stripe)"}
# `category` is a bounded classification usable as a telemetry dimension
# (approval rate, decline-class panels) and by the simulator's mixes.
response_code:
closed: false
values:
"00": {name: "Approved", category: approved}
"01": {name: "Refer to card issuer", category: referral}
"03": {name: "Invalid merchant", category: error}
"05": {name: "Do not honor", category: decline_soft}
"12": {name: "Invalid transaction", category: error}
"13": {name: "Invalid amount", category: error}
"14": {name: "Invalid card number", category: error}
"30": {name: "Format error", category: error}
"41": {name: "Lost card", category: decline_hard}
"43": {name: "Stolen card", category: decline_hard}
"51": {name: "Insufficient funds", category: decline_soft}
"54": {name: "Expired card", category: decline_hard}
"55": {name: "Incorrect PIN", category: decline_soft}
"57": {name: "Transaction not permitted to cardholder", category: decline_hard}
"61": {name: "Exceeds withdrawal amount limit", category: decline_soft}
"91": {name: "Issuer or switch inoperative", category: system}
"96": {name: "System malfunction", category: system}
currency_iso4217:
closed: true
values:
"840": {name: "USD", meaning: "US dollar"}
"858": {name: "UYU", meaning: "Uruguayan peso"}
"978": {name: "EUR", meaning: "Euro"}
network_mgmt_code:
closed: false
values:
"001": {name: "Sign-on"}
"002": {name: "Sign-off"}
"301": {name: "Echo test"}
"801": {name: "Key change"}
fields:
0:
alias: "mti"
scope: public
meaning: "Identifies the message class, function, and origin. Valid values are the keys of the message catalog above."
values_ref: "@messages"
1:
scope: public
meaning: "Indicates which data elements are present in the message."
2:
messages:
- mti: ["0100", "0200"]
usage: mandatory
- mti: ["0800", "0810"]
usage: forbidden
alias: "pan"
scope: public
meaning: "The cardholder account number. Sensitive; subject to masking and tokenization policy."
note: "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."
log_mask: true
format:
kind: pan # implies Luhn validation and default masking
sensitivity: pan # PCI classification: pan | chd | sad | pii | none
# (log_mask defaults to true for pan/sad)
3:
messages:
- mti: ["0100", "0200"]
usage: mandatory
alias: "proc_code"
scope: public
meaning: "Describes the transaction type and the accounts affected. Composed of three positional subfields."
subfields:
layout: positional
parts:
- name: Transaction type
meaning: The kind of financial transaction.
values_ref: processing_txn_type
- name: Account type, from
meaning: Account debited or sourced.
values_ref: account_type
- name: Account type, to
meaning: Account credited or targeted.
values_ref: account_type
4:
name: "Amount, Transaction"
messages:
- mti: ["0100", "0200"]
usage: mandatory
- mti: ["0110", "0210"]
usage: mandatory
response_value: modified
note: "Partial approval returns less than the amount asked for, so this is not compared for equality."
alias: "txn_amount"
scope: public
meaning: "Transaction amount in the minor unit of the transaction currency (DE 49)."
note: "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."
format:
kind: amount
currency_field: 49 # binds amount to its currency for histograms and docs
5:
name: "Amount, Settlement"
format:
kind: amount
currency_field: 50
6:
name: "Amount, Cardholder Billing"
format:
kind: amount
currency_field: 51
7:
messages:
- mti: ["0100", "0200"]
usage: mandatory
- mti: ["0800", "0810"]
usage: mandatory
alias: "txn_datetime"
scope: public
meaning: "Date and time the message entered the network, MMDDhhmmss in UTC."
note: "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."
format:
kind: datetime
layout: "MMDDhhmmss"
tz: utc
8:
name: "Amount, Cardholder Billing Fee"
9:
name: "Conversion Rate, Settlement"
10:
name: "Conversion Rate, Cardholder Billing"
11:
name: "Systems Trace Audit Number"
messages:
- mti: ["0100", "0200"]
usage: mandatory
- mti: ["0110", "0210"]
usage: mandatory
response_value: echo
note: "STAN echoed unchanged from the request."
- mti: ["0400", "0410"]
usage: mandatory
- mti: ["0800", "0810"]
usage: mandatory
alias: "stan"
scope: public
meaning: "Sender-assigned trace number that identifies the transaction within the day."
note: "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."
12:
name: "Time, Local Transaction"
format:
kind: time
layout: "hhmmss"
13:
name: "Date, Local Transaction"
format:
kind: date
layout: "MMDD"
14:
name: "Date, Expiration"
messages:
- mti: ["0100", "0200"]
usage: mandatory
when: "present(35) == false"
note: "Expiration date required when Track 2 is absent."
scope: public
meaning: "Card expiration date, YYMM."
format:
kind: date
layout: "YYMM" # `when` comparisons on this field are chronological, not numeric
sensitivity: chd # cardholder data (PAN, name, expiry, service code)
15:
name: "Date, Settlement"
16:
name: "Date, Conversion"
17:
name: "Date, Capture"
20:
name: "PAN Extended, Country Code"
22:
name: "Point of Service Entry Mode"
messages:
- mti: ["0100", "0200"]
usage: mandatory
alias: "pos_entry_mode"
scope: public
meaning: "How the PAN and PIN were captured at the point of service."
values_ref: "pos_entry_mode"
23:
name: "Application PAN Sequence Number"
26:
messages:
- mti: ["0100", "0200"]
usage: optional
28:
name: "Amount, Transaction Fee"
29:
name: "Amount, Settlement Fee"
30:
name: "Amount, Transaction Processing Fee"
31:
name: "Amount, Settlement Processing Fee"
32:
name: "Acquiring Institution ID Code"
33:
name: "Forwarding Institution ID Code"
34:
name: "Primary Account Number, Extended"
35:
messages:
- mti: ["0100", "0200"]
usage: optional
alias: "track2"
scope: public
meaning: "Magnetic stripe track 2. Parsed natively into PAN, expiration, service code, and discretionary data."
log_mask: true
sensitivity: sad # full track data: never storable post-authorization
36:
sensitivity: sad
37:
messages:
- mti: ["0110", "0210"]
usage: mandatory
response_value: echo
alias: "rrn"
scope: public
meaning: "Reference assigned by the acquirer to retrieve the original transaction."
38:
messages:
- mti: ["0110", "0210"]
usage: mandatory
when: "field(39) == '00'"
response_value: new
note: "Authorization code present when approved."
alias: "auth_code"
scope: public
meaning: "Approval code returned by the issuer when a transaction is approved."
39:
messages:
- mti: ["0110", "0210"]
usage: mandatory
response_value: new
- mti: "0410"
usage: mandatory
note: "Issuer disposition of the reversal, originated here."
response_value: new
- mti: "0810"
usage: mandatory
response_value: new
- mti: "0400"
usage: forbidden
note: "A reversal request states what is being reversed, not how it was answered."
- mti: "0800"
usage: forbidden
note: "A network management request carries no disposition."
alias: "resp_code"
scope: public
meaning: "Issuer or switch disposition of the transaction."
note: "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."
values_ref: "response_code"
40:
sensitivity: chd
41:
messages:
- mti: ["0100", "0200"]
usage: mandatory
alias: "terminal_id"
scope: public
meaning: "Identifier of the terminal at the card acceptor location."
42:
messages:
- mti: ["0100", "0200"]
usage: mandatory
alias: "merchant_id"
scope: public
meaning: "Identifier of the merchant (card acceptor)."
44:
name: "Additional Response Data"
messages:
- mti: ["0110", "0210"]
usage: optional
response_value: new
45:
log_mask: true
sensitivity: sad
46:
name: "Additional Data - ISO"
47:
name: "Additional Data - National"
48:
name: "Additional Data - Private"
49:
name: "Currency Code, Transaction"
messages:
- mti: ["0100", "0200"]
usage: mandatory
alias: "txn_currency"
scope: public
meaning: "ISO 4217 numeric currency code for DE 4."
values_ref: "currency_iso4217"
50:
name: "Currency Code, Settlement"
values_ref: "currency_iso4217"
51:
name: "Currency Code, Cardholder Billing"
values_ref: "currency_iso4217"
# (a private element is withheld from this variant)
54:
scope: public
meaning: "Up to six repeating 20-character amount groups (e.g. cashback, tip, balances)."
subfields:
layout: positional
parts:
- name: Account type
values_ref: account_type
- name: Amount type
- name: Currency code
values_ref: currency_iso4217
- name: Sign
validValues:
closed: true
values:
C:
name: Credit
D:
name: Debit
- name: Amount
55:
name: "ICC Data"
messages:
- mti: ["0100", "0200"]
usage: mandatory
when: "field(22) == '05' || field(22) == '07'"
note: "Chip read; the cryptogram travels here."
- mti: ["0100", "0200"]
usage: forbidden
when: "field(22) == '02' || field(22) == '90'"
note: "Magnetic stripe read; there is no chip data to carry."
- mti: ["0100", "0200"]
usage: optional
note: "Any other entry mode: not expected, not forbidden."
alias: "icc_data"
scope: public
meaning: "EMV chip data as BER-TLV. Tags not declared here are preserved on decode and re-emitted on encode."
subfields:
layout: tlv
parts:
- tag: 9F02
name: Amount, Authorized
- tag: 5F2A
name: Transaction Currency Code
values_ref: currency_iso4217
- tag: 9F36
name: Application Transaction Counter
note: "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."
# (a private element is withheld from this variant)
90:
messages:
- mti: ["0400", "0410"]
usage: mandatory
scope: public
meaning: "Key fields of the original transaction, used to match a reversal to its financial request."
70:
name: "Network Management Information Code"
messages:
- mti: ["0800", "0810"]
usage: mandatory
alias: "net_mgmt_code"
scope: public
meaning: "Identifies the network management function for 0800/0810 messages."
values_ref: "network_mgmt_code"
# (a private element is withheld from this variant)
# --- 3. Validation (cross-field only; per-field rules live on the fields) -----
# Presence and value domain per message sit on the field itself, under `mti:`
# in section 2. What remains here is what no single field can state: an
# assertion across several. `assert` is a `when` expression; severity `warn`
# reports without rejecting (monitor-only rollout).
validation_policy:
unlisted: optional # fields not named in a group are permitted (permissive
# switch posture); strict conformance dialects set: forbidden
checks:
- mti: ["0100", "0200"]
name: "Credential present"
assert: "present(2) || present(35)"
severity: reject
note: "At least one credential: PAN or Track 2."
- mti: ["0100", "0200"]
name: "Amount is positive"
assert: "field(4) > 0"
severity: warn
# --- 4. Simulation (defaults + per-MTI overrides, macro-driven) ---------------
# Generators derive the field set from the fields' `messages` matrix (mandatory
# always; entries with `when` by evaluating it on the partially built message),
# then fill values: template override > defaults macro > enum-aware synthesis >
# filler.
#
# A value is a literal, a macro, or a choice.
#
# Macros are part of the spec contract and every one is deterministic under
# the run's seed, so a failing suite replays exactly: `$PAN(prefix,len)`
# (Luhn-valid), `$STAN`, `$RRN`, `$SEQ(start)` (monotonic within the run),
# `$RAND(min,max)`, `$UUID`, `$NOW` (rendered in the target field's declared
# `format`, which is why there is no date-macro zoo), `$ENUM` (a valid value
# from the field's own set) and `$INVALID` (deliberately outside it, for
# generating traffic that should be rejected).
#
# A choice is either an inline list or a draw from a value set this spec
# already declares — the second so the codes are not restated here, where
# they would drift from the set. Weights are relative rather than
# percentages: adding a case does not mean rewriting the others, and a set
# drawn from with `weights` leaves everything unlisted evenly likely.
#
# The loader checks these like every other reference: a draw from a set nobody
# declared, a weight on a code the set does not contain, or a mix generating a
# message outside the catalog all fail the spec at load.
x-fluxrig-simulation:
mix: # traffic profile for generator gears/tools
- use: "0100"
weight: 85
- use: "0200"
weight: 10
- use: "0800"
weight: 5
defaults:
7: "$NOW" # rendered in each field's declared format
11: "$SEQ(1)" # monotonic within the run, so a trace number is never reused
12: "$NOW"
13: "$NOW"
37: "$RRN"
"0100":
0: "0100"
2:
choose:
- {value: "$PAN(4111, 16)", weight: 70, note: "Visa test range"}
- {value: "$PAN(5500, 16)", weight: 25, note: "Mastercard test range"}
- {value: "$PAN(340000, 15)", weight: 5, note: "Amex: fifteen digits, and the length is the point"}
3:
choose:
from: processing_txn_type
4: "$RAND(100, 5000)"
22:
choose:
from: pos_entry_mode
weights: {"05": 60, "07": 25, "90": 15}
41: "TERM0001"
42: "MERCHANT0000001"
49:
choose:
from: currency_iso4217
"0200":
0: "0200"
2: "$PAN(4111, 16)"
3: "000000"
4: "$RAND(100, 20000)"
22: "$ENUM"
41: "TERM0001"
42: "MERCHANT0000001"
49: "858"
"0800":
0: "0800"
70:
choose:
from: network_mgmt_code
weights: {"301": 90}
responder:
echo: valid_in_response
delay: 50ms # simulated scheme latency; a rule may set its own delay
default:
39: "00"
38: "$AUTH"
rules:
- name: "Insufficient funds over limit"
when: "field(4) > 1000000"
set:
39: "51"
- name: "Expired card"
when: "field(14) < 2501"
set:
39: "54"
# --- 5. Observability (spec-driven telemetry) ----------------------------------
# `dimensions` lists fields eligible as metric labels. Each entry MUST resolve
# to an enum-bounded field or subfield (values_ref/validValues) so the label
# space is closed; the loader rejects unbounded fields at load time. Wire
# values outside the enum are reported under the reserved label value "_other".
# Message-catalog `class` (business/network) partitions traffic metrics, and
# `log_mask` governs what may ever appear in logs, traces, and dumps.
x-fluxrig-observability:
dimensions:
- "mti" # catalog-bounded (DE 0)
- "resp_code" # DE 39, response_code enum
- "3.1" # processing code, transaction-type part
- "pos_entry_mode" # DE 22
histograms:
- field: "txn_amount"
by: "txn_currency"
unit: minor_units

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.

fields:
"0":
description: Message Type Indicator
enc: ASCII
length: 4
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"1":
description: Bitmap
enc: HexToASCII
length: 16
prefix: Hex.Fixed
type: Bitmap
"2":
description: Primary Account Number
enc: ASCII
length: 19
prefix: ASCII.LL
type: String
"3":
description: Processing Code
length: 6
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
subfields:
"1":
enc: ASCII
length: 2
prefix: ASCII.Fixed
type: String
"2":
enc: ASCII
length: 2
prefix: ASCII.Fixed
type: String
"3":
enc: ASCII
length: 2
prefix: ASCII.Fixed
type: String
tag:
sort: StringsByInt
type: Numeric
"4":
description: Transaction Amount
enc: ASCII
length: 12
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"5":
description: Settlement Amount
enc: ASCII
length: 12
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"6":
description: Billing Amount
enc: ASCII
length: 12
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"7":
description: Transmission Date & Time
enc: ASCII
length: 10
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"8":
description: Billing Fee Amount
enc: ASCII
length: 8
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"9":
description: Settlement Conversion Rate
enc: ASCII
length: 8
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"10":
description: Cardholder Billing Conversion Rate
enc: ASCII
length: 8
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"11":
description: Systems Trace Audit Number (STAN)
enc: ASCII
length: 6
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"12":
description: Local Transaction Time
enc: ASCII
length: 6
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"13":
description: Local Transaction Date
enc: ASCII
length: 4
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"14":
description: Expiration Date
enc: ASCII
length: 4
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"15":
description: Settlement Date
enc: ASCII
length: 4
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"16":
description: Currency Conversion Date
enc: ASCII
length: 4
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"17":
description: Capture Date
enc: ASCII
length: 4
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"18":
description: Merchant Type
enc: ASCII
length: 4
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"19":
description: Acquiring Institution Country Code
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"20":
description: PAN Extended Country Code
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"21":
description: Forwarding Institution Country Code
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"22":
description: Point of Sale (POS) Entry Mode
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"23":
description: Card Sequence Number (CSN)
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"24":
description: Function Code
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"25":
description: Point of Service Condition Code
enc: ASCII
length: 2
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"26":
description: Point of Service PIN Capture Code
enc: ASCII
length: 2
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"27":
description: Authorizing Identification Response Length
enc: ASCII
length: 1
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"28":
description: Transaction Fee Amount
enc: ASCII
length: 9
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"29":
description: Settlement Fee Amount
enc: ASCII
length: 9
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"30":
description: Transaction Processing Fee Amount
enc: ASCII
length: 9
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"31":
description: Settlement Processing Fee Amount
enc: ASCII
length: 9
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"32":
description: Acquiring Institution Identification Code
enc: ASCII
length: 11
prefix: ASCII.LL
type: String
"33":
description: Forwarding Institution Identification Code
enc: ASCII
length: 11
prefix: ASCII.LL
type: String
"34":
description: Extended Primary Account Number
enc: ASCII
length: 28
prefix: ASCII.LL
type: String
"35":
description: Track 2 Data
enc: ASCII
length: 37
prefix: ASCII.LL
type: Track2
"36":
description: Track 3 Data
enc: ASCII
length: 104
prefix: ASCII.LLL
type: String
"37":
description: Retrieval Reference Number
enc: ASCII
length: 12
prefix: ASCII.Fixed
type: String
"38":
description: Authorization Identification Response
enc: ASCII
length: 6
prefix: ASCII.Fixed
type: String
"39":
description: Response Code
enc: ASCII
length: 2
prefix: ASCII.Fixed
type: String
"40":
description: Service Restriction Code
enc: ASCII
length: 3
prefix: ASCII.Fixed
type: String
"41":
description: Card Acceptor Terminal Identification
enc: ASCII
length: 8
prefix: ASCII.Fixed
type: String
"42":
description: Card Acceptor Identification Code
enc: ASCII
length: 15
prefix: ASCII.Fixed
type: String
"43":
description: Card Acceptor Name/Location
enc: ASCII
length: 40
prefix: ASCII.Fixed
type: String
"44":
description: Additional Data
enc: ASCII
length: 99
prefix: ASCII.LL
type: String
"45":
description: Track 1 Data
enc: ASCII
length: 76
prefix: ASCII.LL
type: String
"46":
description: Additional data (ISO)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"47":
description: Additional data (National)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"48":
description: Additional data (Private)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"49":
description: Transaction Currency Code
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"50":
description: Settlement Currency Code
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"51":
description: Cardholder Billing Currency Code
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"52":
description: PIN Data
enc: HexToASCII
length: 8
prefix: Hex.Fixed
type: String
"53":
description: Security Related Control Information
enc: ASCII
length: 16
prefix: ASCII.Fixed
type: String
"54":
description: Additional Amounts
length: 120
prefix: ASCII.LLL
subfields:
"1":
enc: ASCII
length: 2
prefix: ASCII.Fixed
type: String
"2":
enc: ASCII
length: 2
prefix: ASCII.Fixed
type: String
"3":
enc: ASCII
length: 3
prefix: ASCII.Fixed
type: String
"4":
enc: ASCII
length: 1
prefix: ASCII.Fixed
type: String
"5":
enc: ASCII
length: 12
prefix: ASCII.Fixed
type: String
tag:
sort: StringsByInt
type: String
"55":
description: ICC Data – EMV Having Multiple Tags
length: 999
prefix: ASCII.LLL
subfields:
5F2A:
enc: ASCII
length: 3
prefix: ASCII.Fixed
type: Numeric
9F02:
enc: ASCII
length: 6
prefix: ASCII.Fixed
type: Numeric
9F36:
enc: ASCII
length: 2
prefix: ASCII.Fixed
type: Binary
tag:
enc: BerTLVTag
skipUnknownTLVTags: true
sort: StringsByInt
storeUnknownTLVTags: true
type: Composite
"56":
description: Reserved (ISO)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"57":
description: Reserved (National)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"58":
description: Reserved (National)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"59":
description: Reserved (National)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"60":
description: Reserved (National)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"61":
description: Reserved (Private)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"62":
description: Reserved (Private)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"63":
description: Reserved (Private)
enc: ASCII
length: 999
prefix: ASCII.LLL
type: String
"64":
description: Message Authentication Code (MAC)
enc: HexToASCII
length: 8
prefix: Hex.Fixed
type: String
"70":
enc: ASCII
length: 3
padding:
pad: "0"
type: Left
prefix: ASCII.Fixed
type: String
"90":
description: Original Data Elements
enc: ASCII
length: 42
prefix: ASCII.Fixed
type: String
"104":
length: 999
prefix: ASCII.LLL
subfields:
1A:
enc: ASCII
length: 99
prefix: ASCII.Fixed
type: String
"01":
enc: ASCII
length: 20
prefix: ASCII.Fixed
type: String
tag:
enc: BerTLVTag
skipUnknownTLVTags: true
sort: StringsByInt
storeUnknownTLVTags: true
type: Composite
name: ISO 8583:1987 (ASCII)