Jump to content

S10 (UPU standard)

From Wikipedia, the free encyclopedia

This is an old revision of this page, as edited by Frap (talk | contribs) at 22:43, 27 July 2020. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

The UPU S10 standard defines a system for assigning 13-character identifiers to international postal items for the purpose of tracking and tracing them during shipping.

The identifiers consist of a two letter service indicator code, an eight digit serial number (in the range 00000000 to 99999999), a single check-digit, and a two-letter ISO country code—the latter identifying the issuing postal administration's country.[1]

With increased liberalization and the possibility of multiple postal services operating in the same country, the use of country codes to designate the postal service is a problem. To solve this, each country has a designated postal service that controls all S10 identifiers from that country; any competing postal services will have to cooperate with the designated owner. The organization assigned by the UPU member country shall manage the issue and use of S10 identifiers, among all the operators under the authority of that UPU member country, in such a way as to ensure that no S10 identifier is reused within a period of 12 calendar months. A period of 24 calendar months, or longer, is recommended.

Service indicator codes

Code Interpretation[2]
AV–AZ domestic, bilateral, multilateral use only, identifying RFID-tracked e-commerce items
BA–BZ for domestic, bilateral, multilateral use only
CA–CZ Parcel post; the use of CZ requires bilateral agreement. It is not required to use CV for insured parcels but if the service indicator CV is used, then it is recommended that it be used only on insured parcels.
DA–DZ for domestic, bilateral, multilateral use only
EA–EZ EMS; the use of EX–EZ requires bilateral agreement
GA for domestic, bilateral, multilateral use only
GD for domestic, bilateral, multilateral use only
HA–HZ e-commerce parcels; the use of HX–HY requires multilateral agreement; the use of HZ requires bilateral agreement
JA–JZ reserved; cannot be assigned as valid service indicator values
KA–KZ reserved; cannot be assigned as valid service indicator values
LA–LZ Letter post trackable, several subtypes; the use of LZ requires bilateral agreement
MA–MZ Letter post: M bags
NA–NZ for domestic, bilateral, multilateral use only
PA–PZ for domestic, bilateral, multilateral use only
QA–QM Letter post: IBRS (International Business Reply Service)
RA–RZ Letter post: registered, but not insured delivery. The use of RZ requires bilateral agreement.
SA–SZ reserved; cannot be assigned as valid service indicator values
TA–TZ reserved; cannot be assigned as valid service indicator values
UA–UZ Letter post: items other than LA–LZ (Express), MA–MZ (M bags), QA–QM (IBRS), RA–RZ (registered), VA–VZ (insured), subject to customs control, i.e. bearing a CN 22 or CN 23
VA–VZ Letter post insured; the use of VZ requires bilateral agreement
WA–WZ reserved; cannot be assigned as valid service indicator values
ZA–ZZ for domestic, bilateral, multilateral use only

Check-digit calculation

Ignore the Service Indicator Code and Country Code
Assign the weights 8, 6, 4, 2, 3, 5, 9, 7 to the 8 digits, from left to right
Calculate S, the sum of each digit multiplied by its weight.  
For example, for the number 47312482, S = 4*8 + 7*6 + 3*4 + 1*2 + 2*3 + 4*5 + 8*9 + 2*7 = 200
Calculate the check digit, C, from C = 11 - (S mod 11)
If C = 10, change to C = 0
If C = 11, change to C = 5
For the example 47312482 C = 11 - (200 mod 11) = 11 - 2 = 9.

Python code for check-digit calculation

For Python 3.6 or later:

def get_check_digit(num: int):
    """Get S10 check digit."""
    weights = [8, 6, 4, 2, 3, 5, 9, 7]
    sum = 0
    for i, digit in enumerate(f"{num:08}"):
        sum += weights[i] * int(digit)
    sum = 11 - (sum % 11)
    if sum == 10:
        sum = 0
    elif sum == 11:
        sum = 5
    return sum

JavaScript code for check-digit calculation

function getCheckDigit(num) {
    const weights = [8, 6, 4, 2, 3, 5, 9, 7];
    const numArr = Array.from(String(num), Number);
    let sum = 0;
    numArr.forEach((n, i) => sum = sum + (n * weights[i]));
    sum = 11 - (sum % 11);
    if (sum == 10) sum = 0;
    else if (sum == 11) sum = 5;
    return sum;
}

See also

References

  1. ^ "S10 Identification of postal items – 13-character identifier" (PDF). UPU. 2017-10-17. Retrieved 2018-02-08.
  2. ^ http://www.upu.int, Service Indicator Codes Archived 2010-04-20 at the Wayback Machine