universal-parcel-scraper 0.665.0-main.3166 → 0.665.2-main.3170

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -155,7 +155,7 @@ createTracker({ providers: ['ParcelsApp', 'Ship24', '17TRACK', 'Postal Ninja', '
155
155
  <!-- GENERATED:stages -->
156
156
  <img src="docs/assets/stages.svg" alt="DHL: Die Sendung wurde in das Zustellfahrzeug geladen.; Mondial Relay: En cours de livraison; Correios Brazil: Objeto saiu para entrega ao destinatário; Correos Express: EN REPARTO; Yamato Transport: 配達中; La Poste / Colissimo: DISTOU. All are filed under out_for_delivery." width="760">
157
157
 
158
- The carrier folders record 16,537 such statuses, each filed under one stage.
158
+ The carrier folders record 16,540 such statuses, each filed under one stage.
159
159
  <!-- /GENERATED:stages -->
160
160
 
161
161
  Wording nobody recorded yet goes through a classifier that reads seven European languages.
@@ -30080,6 +30080,8 @@ function Hc(e) {
30080
30080
  if (/^preparing to leave (?:the )?(?:[a-z]+ ){0,3}operation cent(?:er|re)$/.test(t)) return "in_transit";
30081
30081
  if (/^(?:the )?item is ready for shipment$/.test(t)) return "registered";
30082
30082
  if (/^consignment received at (?:the )?postnl acceptance cent(?:re|er)$/.test(t)) return "accepted";
30083
+ if (/^as requested, (?:the )?(?:ups my choice®? )?delivery change (?:was|has been) completed$|^(?:the )?(?:delivery )?address (?:was|has been) changed as (?:the )?(?:receiver|recipient) requested$/.test(t)) return "in_transit";
30084
+ if (/^the company or receiver name is incorrect\. this will delay delivery\b/.test(t)) return "exception";
30083
30085
  if (/^(?:received in office|export to foreign provider)$/.test(t) || /^(?:(?:the )?(?:shipment|parcel|package|item) )?(?:(?:has been|was) )?(?:sent|dispatched|forwarded) abroad$/.test(t)) return "in_transit";
30084
30086
  if (/^(?:posting\/collection|posted|origin scan)$|received at (?:our |the )?(?:[a-z]+ )?origin (?:office|facility|hub)|dropped off (?:after|before) (?:the )?latest drop ?off time/.test(t)) return "accepted";
30085
30087
  if (/(?:\b(?:not|never)|n't)(?: (?:be|been|being))? accepted\b/.test(t)) return "exception";
@@ -2,6 +2,7 @@
2
2
  "carrier": "dayone",
3
3
  "entries": [
4
4
  {"wording": "Shipment has begun. In transit to destination city", "stage": "in_transit", "language": "en", "confirmedBy": "live", "note": "The single scan of a parcel the tracker lists with a YunExpress number, whose tracker carries the rest of its history."},
5
+ {"wording": "Clearence processing completed - Export", "stage": "in_transit", "language": "en", "confirmedBy": "live", "note": "YunExpress's export clearance, spelt as YunExpress writes it, relayed for a parcel DayOne handed to YunExpress."},
5
6
  {"wording": "Order processed by shipper", "stage": "registered", "language": "en", "confirmedBy": "live", "note": "Yanwen's record of the merchant's order data, the first scan."},
6
7
  {"wording": "SHIPPING INFORMATION RECEIVED", "stage": "registered", "language": "en", "confirmedBy": "live"},
7
8
  {"wording": "SHIPPING INFORMATION RECEIVED BY AUSTRALIA POST", "stage": "registered", "language": "en", "confirmedBy": "live", "note": "Australia Post's manifest, relayed: it comes after the parcel has moved and is no step back."},
@@ -1,5 +1,7 @@
1
1
  const CODES = new Map([
2
2
  ['100', { status: 'pending', stage: 'registered' }],
3
+ // The label voided after it was created: no parcel is coming under the number.
4
+ ['101', { status: 'exception', stage: 'exception' }],
3
5
  // A pickup exception: GOFO has not received the parcel from the sender's warehouse yet.
4
6
  ['802', { status: 'pending', stage: 'registered' }],
5
7
  ...['200', '201', '202', '203', '411', '412', '414', '810'].map(code => [code, { status: 'in_transit', stage: 'in_transit' }]),
@@ -8,6 +8,15 @@
8
8
  "stage": "registered",
9
9
  "confirmedBy": "live"
10
10
  },
11
+ {
12
+ "code": "101",
13
+ "wording": "Label Cancelled",
14
+ "language": "en",
15
+ "stage": "exception",
16
+ "confirmedBy": "live",
17
+ "firstSeen": "2026-10-23",
18
+ "note": "The label voided after code 100 created it, and no scan follows: no parcel is coming under the number."
19
+ },
11
20
  {
12
21
  "code": "802",
13
22
  "wording": "Pickup Exception, GOFO has not Received the Package from the Warehouse yet.",
@@ -76,6 +76,9 @@ const ACTIVITY_STAGES = new Map([
76
76
  // Receiver absent, absent again at the final attempt, business closed, or
77
77
  // diverted to an access point after a failed attempt.
78
78
  ['48', 'failed_attempt'], ['49', 'failed_attempt'], ['G3', 'failed_attempt'], ['5R', 'failed_attempt'],
79
+ // The receiver's or company's name is wrong, which holds the delivery until
80
+ // UPS has the right one.
81
+ ['AD', 'exception'],
79
82
  // Delivered to an access point, and held there.
80
83
  ['2Q', 'ready_for_pickup'], ['ZP', 'ready_for_pickup'],
81
84
  // Delivered, including collection from an access point and delivery by the
@@ -48,6 +48,7 @@
48
48
  { "code": "49", "language": "en", "stage": "failed_attempt", "confirmedBy": "live", "firstSeen": "2026-10-17", "note": "actCode: \"The receiver was not available at the time of the final delivery attempt.\" Seen after two 48 scans. The attempt failed; a hold, an access point or a return comes as a later scan." },
49
49
  { "code": "G3", "language": "en", "stage": "failed_attempt", "confirmedBy": "live", "firstSeen": "2026-10-07", "note": "actCode: the business was closed; a second attempt follows." },
50
50
  { "code": "5R", "language": "en", "stage": "failed_attempt", "confirmedBy": "live", "firstSeen": "2026-10-07", "note": "actCode: UPS could not deliver and is taking the parcel to an access point." },
51
+ { "code": "AD", "language": "en", "stage": "exception", "confirmedBy": "live", "firstSeen": "2026-10-22", "note": "actCode: \"The company or receiver name is incorrect. This will delay delivery. We're attempting to update this information.\" Seen after Out For Delivery, before the receiver moved the delivery to an access point: the delivery waits on the receiver's details, as an incorrect address does." },
51
52
  { "code": "2Q", "language": "en", "stage": "ready_for_pickup", "confirmedBy": "live", "firstSeen": "2026-10-07", "note": "actCode: \"Delivered to UPS Access Point™\"." },
52
53
  { "code": "ZP", "language": "en", "stage": "ready_for_pickup", "confirmedBy": "live", "firstSeen": "2026-10-07", "note": "actCode: \"UPS Access Point™ possession\", right after 2Q. The shared classifier left it in transit." },
53
54
  { "code": "9E", "language": "en", "stage": "delivered", "confirmedBy": "live", "firstSeen": "2026-10-07", "note": "actCode: \"DELIVERED\"." },
@@ -463,6 +463,12 @@ export function trackingLanguageStage(description) {
463
463
  return 'registered';
464
464
  if (/^consignment received at (?:the )?postnl acceptance cent(?:re|er)$/.test(text))
465
465
  return 'accepted';
466
+ // UPS's scans as providers relay them without its activity codes, read as UPS's own map reads them: a delivery
467
+ // change the receiver asked for, carried out, and a wrong company or receiver name holding the delivery.
468
+ if (/^as requested, (?:the )?(?:ups my choice®? )?delivery change (?:was|has been) completed$|^(?:the )?(?:delivery )?address (?:was|has been) changed as (?:the )?(?:receiver|recipient) requested$/.test(text))
469
+ return 'in_transit';
470
+ if (/^the company or receiver name is incorrect\. this will delay delivery\b/.test(text))
471
+ return 'exception';
466
472
  if (/^(?:received in office|export to foreign provider)$/.test(text))
467
473
  return 'in_transit';
468
474
  // Sent on to another country: "Sent abroad".
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Universal Parcel Scraper",
5
- "version": "0.665.0"
5
+ "version": "0.665.2"
6
6
  },
7
7
  "paths": {
8
8
  "/health": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-parcel-scraper",
3
- "version": "0.665.0-main.3166",
3
+ "version": "0.665.2-main.3170",
4
4
  "description": "Self-hosted parcel tracking: carrier detection, dedicated scrapers and optional universal providers.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",