universal-parcel-scraper 0.119.0-main.1065 → 0.121.0-main.1069
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 +2 -2
- package/data/catalog.json +11 -4
- package/data/coverage-summary.json +1 -1
- package/data/detection-golden.json +27 -0
- package/dist/browser/scraper.js +13 -5
- package/dist/carriers/jitsu/adapter.d.ts +15 -0
- package/dist/carriers/jitsu/adapter.js +75 -0
- package/dist/carriers/jitsu/carrier.json +61 -9
- package/dist/carriers/jitsu/numbers.json +40 -18
- package/dist/carriers/jitsu/parser.d.ts +22 -0
- package/dist/carriers/jitsu/parser.js +229 -0
- package/dist/carriers/jitsu/status.d.ts +22 -0
- package/dist/carriers/jitsu/status.js +99 -0
- package/dist/carriers/jitsu/statuses.json +39 -1
- package/dist/carriers/osm-worldwide/adapter.d.ts +16 -0
- package/dist/carriers/osm-worldwide/adapter.js +81 -0
- package/dist/carriers/osm-worldwide/carrier.json +53 -7
- package/dist/carriers/osm-worldwide/numbers.json +38 -0
- package/dist/carriers/osm-worldwide/parser.d.ts +20 -0
- package/dist/carriers/osm-worldwide/parser.js +156 -0
- package/dist/carriers/osm-worldwide/status.d.ts +23 -0
- package/dist/carriers/osm-worldwide/status.js +66 -0
- package/dist/carriers/osm-worldwide/statuses.json +9 -1
- package/dist/core/catalog/statusMaps.js +5 -2
- package/dist/data/catalog.json +11 -4
- package/dist/generated/catalog.d.ts +10 -4
- package/dist/generated/catalog.js +12 -5
- package/dist/generated/recognition.js +2 -0
- package/dist/generated/registry.js +6 -2
- package/dist/server/openapi.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ The engine behind [Peek](https://peektracker.com) ([GitHub](https://github.com/p
|
|
|
13
13
|
[](LICENSE)
|
|
14
14
|
|
|
15
15
|
<!-- GENERATED:summary -->
|
|
16
|
-
**3,500+ carriers** through **
|
|
16
|
+
**3,500+ carriers** through **180 dedicated adapters** and **5 universal fallbacks**
|
|
17
17
|
|
|
18
18
|
<sub>208 catalog entries · 66 countries represented</sub>
|
|
19
19
|
<!-- /GENERATED:summary -->
|
|
@@ -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 5,
|
|
158
|
+
The carrier folders record 5,319 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.
|
package/data/catalog.json
CHANGED
|
@@ -6954,10 +6954,11 @@
|
|
|
6954
6954
|
"timezone": "America/Los_Angeles",
|
|
6955
6955
|
"tracking": {
|
|
6956
6956
|
"mode": "automatic",
|
|
6957
|
-
"adapter": "
|
|
6957
|
+
"adapter": "jitsu",
|
|
6958
|
+
"recognitionRank": 85
|
|
6958
6959
|
},
|
|
6959
6960
|
"canaryUrl": "https://recipient.gojitsu.com/",
|
|
6960
|
-
"trackingUrlTemplate": "https://recipient.gojitsu.com/{trackingNumber}",
|
|
6961
|
+
"trackingUrlTemplate": "https://recipient.gojitsu.com/noredirect/{trackingNumber}",
|
|
6961
6962
|
"trackingSearchUrl": "https://recipient.gojitsu.com/",
|
|
6962
6963
|
"linkRules": [
|
|
6963
6964
|
{
|
|
@@ -6967,7 +6968,7 @@
|
|
|
6967
6968
|
"tracking.gojitsu.com",
|
|
6968
6969
|
"tracking.axlehire.com"
|
|
6969
6970
|
],
|
|
6970
|
-
"path": "^/([^/?#]+)/?$"
|
|
6971
|
+
"path": "^/(?:noredirect/)?([^/?#]+)/?$"
|
|
6971
6972
|
}
|
|
6972
6973
|
],
|
|
6973
6974
|
"detectionRules": []
|
|
@@ -7648,7 +7649,9 @@
|
|
|
7648
7649
|
"timezone": "America/Chicago",
|
|
7649
7650
|
"tracking": {
|
|
7650
7651
|
"mode": "automatic",
|
|
7651
|
-
"adapter": "
|
|
7652
|
+
"adapter": "osm-worldwide",
|
|
7653
|
+
"recognitionRank": 75,
|
|
7654
|
+
"localClocks": true
|
|
7652
7655
|
},
|
|
7653
7656
|
"canaryUrl": "https://www.osmworldwide.com/tracking/",
|
|
7654
7657
|
"trackingUrlTemplate": "https://www.osmworldwide.com/tracking/?trackingIds={trackingNumber}",
|
|
@@ -7669,6 +7672,10 @@
|
|
|
7669
7672
|
{
|
|
7670
7673
|
"pattern": "^A\\d{10}[A-Z]{3}\\d{8}$",
|
|
7671
7674
|
"confidence": "high"
|
|
7675
|
+
},
|
|
7676
|
+
{
|
|
7677
|
+
"pattern": "^OSM[0-9A-Z]{14}$",
|
|
7678
|
+
"confidence": "high"
|
|
7672
7679
|
}
|
|
7673
7680
|
]
|
|
7674
7681
|
},
|
|
@@ -16694,6 +16694,17 @@
|
|
|
16694
16694
|
"confidence": "none",
|
|
16695
16695
|
"candidates": []
|
|
16696
16696
|
},
|
|
16697
|
+
{
|
|
16698
|
+
"input": "4AUMF4FWVRB5",
|
|
16699
|
+
"carrier": "unknown",
|
|
16700
|
+
"confidence": "low",
|
|
16701
|
+
"candidates": [
|
|
16702
|
+
"colis-prive"
|
|
16703
|
+
],
|
|
16704
|
+
"asked": [
|
|
16705
|
+
"colis-prive"
|
|
16706
|
+
]
|
|
16707
|
+
},
|
|
16697
16708
|
{
|
|
16698
16709
|
"input": "4C003925742US",
|
|
16699
16710
|
"carrier": "uniuni",
|
|
@@ -32830,6 +32841,22 @@
|
|
|
32830
32841
|
"confidence": "none",
|
|
32831
32842
|
"candidates": []
|
|
32832
32843
|
},
|
|
32844
|
+
{
|
|
32845
|
+
"input": "OSM000000LM0060VO",
|
|
32846
|
+
"carrier": "osm-worldwide",
|
|
32847
|
+
"confidence": "high",
|
|
32848
|
+
"candidates": [
|
|
32849
|
+
"osm-worldwide"
|
|
32850
|
+
]
|
|
32851
|
+
},
|
|
32852
|
+
{
|
|
32853
|
+
"input": "OSM000000LM00B0LO",
|
|
32854
|
+
"carrier": "osm-worldwide",
|
|
32855
|
+
"confidence": "high",
|
|
32856
|
+
"candidates": [
|
|
32857
|
+
"osm-worldwide"
|
|
32858
|
+
]
|
|
32859
|
+
},
|
|
32833
32860
|
{
|
|
32834
32861
|
"input": "P2Q5J87J96",
|
|
32835
32862
|
"carrier": "unknown",
|
package/dist/browser/scraper.js
CHANGED
|
@@ -5542,10 +5542,11 @@ var De = {
|
|
|
5542
5542
|
timezone: "America/Los_Angeles",
|
|
5543
5543
|
tracking: {
|
|
5544
5544
|
mode: "automatic",
|
|
5545
|
-
adapter: "
|
|
5545
|
+
adapter: "jitsu",
|
|
5546
|
+
recognitionRank: 85
|
|
5546
5547
|
},
|
|
5547
5548
|
canaryUrl: "https://recipient.gojitsu.com/",
|
|
5548
|
-
trackingUrlTemplate: "https://recipient.gojitsu.com/{trackingNumber}",
|
|
5549
|
+
trackingUrlTemplate: "https://recipient.gojitsu.com/noredirect/{trackingNumber}",
|
|
5549
5550
|
trackingSearchUrl: "https://recipient.gojitsu.com/",
|
|
5550
5551
|
linkRules: [{
|
|
5551
5552
|
domains: [
|
|
@@ -5554,7 +5555,7 @@ var De = {
|
|
|
5554
5555
|
"tracking.gojitsu.com",
|
|
5555
5556
|
"tracking.axlehire.com"
|
|
5556
5557
|
],
|
|
5557
|
-
path: "^/([^/?#]+)/?$"
|
|
5558
|
+
path: "^/(?:noredirect/)?([^/?#]+)/?$"
|
|
5558
5559
|
}],
|
|
5559
5560
|
detectionRules: []
|
|
5560
5561
|
},
|
|
@@ -6066,7 +6067,9 @@ var De = {
|
|
|
6066
6067
|
timezone: "America/Chicago",
|
|
6067
6068
|
tracking: {
|
|
6068
6069
|
mode: "automatic",
|
|
6069
|
-
adapter: "
|
|
6070
|
+
adapter: "osm-worldwide",
|
|
6071
|
+
recognitionRank: 75,
|
|
6072
|
+
localClocks: !0
|
|
6070
6073
|
},
|
|
6071
6074
|
canaryUrl: "https://www.osmworldwide.com/tracking/",
|
|
6072
6075
|
trackingUrlTemplate: "https://www.osmworldwide.com/tracking/?trackingIds={trackingNumber}",
|
|
@@ -6079,6 +6082,9 @@ var De = {
|
|
|
6079
6082
|
detectionRules: [{
|
|
6080
6083
|
pattern: "^A\\d{10}[A-Z]{3}\\d{8}$",
|
|
6081
6084
|
confidence: "high"
|
|
6085
|
+
}, {
|
|
6086
|
+
pattern: "^OSM[0-9A-Z]{14}$",
|
|
6087
|
+
confidence: "high"
|
|
6082
6088
|
}]
|
|
6083
6089
|
},
|
|
6084
6090
|
paquetexpress: {
|
|
@@ -7362,7 +7368,7 @@ var De = {
|
|
|
7362
7368
|
"omniva-s10"
|
|
7363
7369
|
],
|
|
7364
7370
|
"orlen-paczka": ["orlen-paczka-1"],
|
|
7365
|
-
"osm-worldwide": ["osm-worldwide-1"],
|
|
7371
|
+
"osm-worldwide": ["osm-worldwide-1", "osm-worldwide-2"],
|
|
7366
7372
|
paquetexpress: [],
|
|
7367
7373
|
passport: ["passport-1"],
|
|
7368
7374
|
"post-luxembourg": ["post-luxembourg-s10"],
|
|
@@ -12364,6 +12370,7 @@ var Qc = {
|
|
|
12364
12370
|
inpost: 820,
|
|
12365
12371
|
"j-and-t": 530,
|
|
12366
12372
|
"j-and-t-cargo": 910,
|
|
12373
|
+
jitsu: 85,
|
|
12367
12374
|
"kuehne-nagel": 435,
|
|
12368
12375
|
"la-poste": 1e3,
|
|
12369
12376
|
"latvijas-pasts": 100,
|
|
@@ -12381,6 +12388,7 @@ var Qc = {
|
|
|
12381
12388
|
omniva: 300,
|
|
12382
12389
|
ontrac: 650,
|
|
12383
12390
|
"orlen-paczka": 495,
|
|
12391
|
+
"osm-worldwide": 75,
|
|
12384
12392
|
"poczta-polska": 750,
|
|
12385
12393
|
"post-luxembourg": 80,
|
|
12386
12394
|
"posta-slovenije": 130,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type AdapterFactory, type TrackingContext } from '../../core/adapter/index.js';
|
|
2
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
3
|
+
import { type StepRecorder } from '../../core/telemetry/index.js';
|
|
4
|
+
export declare const JITSU_ENDPOINT = "https://api.recipient.gojitsu.com/delivery/";
|
|
5
|
+
export declare function jitsuTrackingUrl(raw: string): string;
|
|
6
|
+
export declare class JitsuTracker {
|
|
7
|
+
private readonly options;
|
|
8
|
+
constructor(options?: {
|
|
9
|
+
fetcher?: typeof fetch;
|
|
10
|
+
recorder?: StepRecorder;
|
|
11
|
+
userAgent?: string;
|
|
12
|
+
});
|
|
13
|
+
fetch(raw: string, context?: TrackingContext): Promise<CarrierResult>;
|
|
14
|
+
}
|
|
15
|
+
export declare const adapter: AdapterFactory;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { accepted, recognizeFromLookup } from '../../core/adapter/index.js';
|
|
2
|
+
import { ChallengeError, IndeterminateError, NotFoundError, SchemaError, TransportError } from '../../core/errors/index.js';
|
|
3
|
+
import { runSteps } from '../../core/runner/index.js';
|
|
4
|
+
import { firstAttemptMs, networkRetryStep } from '../../core/runner/networkRetry.js';
|
|
5
|
+
import { NOOP_RECORDER } from '../../core/telemetry/index.js';
|
|
6
|
+
import { decodeText, fetchBounded, userAgentOf } from '../../core/transport/index.js';
|
|
7
|
+
import { isJitsuNotFound, JITSU_MAX_BYTES, normalizeJitsuNumber, parseJitsu, PROVIDER } from './parser.js';
|
|
8
|
+
// The service Jitsu's tracker and recipient app ask for a delivery by its code.
|
|
9
|
+
export const JITSU_ENDPOINT = 'https://api.recipient.gojitsu.com/delivery/';
|
|
10
|
+
const REDIRECTS = [301, 302, 303, 307, 308];
|
|
11
|
+
// Statuses that alone say nothing about the code: only the service's own 404 body does.
|
|
12
|
+
const GONE = [404, 410];
|
|
13
|
+
// A challenge page, which can come instead of the reply.
|
|
14
|
+
const CHALLENGE = /_cf_chl_opt|cf-turnstile|<title>\s*(?:Just a moment|Attention Required)/i;
|
|
15
|
+
export function jitsuTrackingUrl(raw) {
|
|
16
|
+
return `${JITSU_ENDPOINT}${normalizeJitsuNumber(raw)}`;
|
|
17
|
+
}
|
|
18
|
+
function json(body) {
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(body);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (CHALLENGE.test(body.slice(0, 64_000)))
|
|
24
|
+
throw new ChallengeError(PROVIDER, 'Jitsu answered with a browser challenge', { cause: error });
|
|
25
|
+
throw new SchemaError(PROVIDER, 'Jitsu returned a reply that is not JSON', { cause: error });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class JitsuTracker {
|
|
29
|
+
options;
|
|
30
|
+
constructor(options = {}) {
|
|
31
|
+
this.options = options;
|
|
32
|
+
}
|
|
33
|
+
async fetch(raw, context = {}) {
|
|
34
|
+
const number = normalizeJitsuNumber(raw);
|
|
35
|
+
const url = `${JITSU_ENDPOINT}${number}`;
|
|
36
|
+
const read = async (signal, timeoutMs) => {
|
|
37
|
+
// The tracker sends no token for this read; a token only unlocks the
|
|
38
|
+
// recipient's own details and changes, which the adapter never asks for.
|
|
39
|
+
const { response, bytes } = await fetchBounded(url, { method: 'GET', signal, headers: {
|
|
40
|
+
Accept: 'application/json', 'User-Agent': userAgentOf(this.options.userAgent),
|
|
41
|
+
} }, { provider: PROVIDER, timeoutMs: Math.max(1, Math.floor(timeoutMs)), maxBytes: JITSU_MAX_BYTES, redirect: 'manual',
|
|
42
|
+
allowHttpStatuses: [...REDIRECTS, ...GONE], fetcher: this.options.fetcher });
|
|
43
|
+
if (REDIRECTS.includes(response.status))
|
|
44
|
+
throw new IndeterminateError(PROVIDER, 'Jitsu moved its tracking service');
|
|
45
|
+
const body = decodeText(bytes);
|
|
46
|
+
if (GONE.includes(response.status)) {
|
|
47
|
+
let reply = null;
|
|
48
|
+
try {
|
|
49
|
+
reply = JSON.parse(body);
|
|
50
|
+
}
|
|
51
|
+
catch { /* not the service's own answer */ }
|
|
52
|
+
if (response.status === 404 && isJitsuNotFound(reply, number))
|
|
53
|
+
throw new NotFoundError(PROVIDER);
|
|
54
|
+
// A route the service does not serve, which says nothing about the code.
|
|
55
|
+
throw new TransportError(PROVIDER, 'Jitsu tracking service is unavailable');
|
|
56
|
+
}
|
|
57
|
+
return parseJitsu(json(body), number);
|
|
58
|
+
};
|
|
59
|
+
// A request that fails to reach Jitsu, or hangs, gets one more try: the
|
|
60
|
+
// first gets half of the budget, so the retry fits in the rest.
|
|
61
|
+
return runSteps({ carrier: 'jitsu', budgetMs: context.budgetMs ?? 15_000, signal: context.signal,
|
|
62
|
+
recorder: this.options.recorder ?? NOOP_RECORDER }, [
|
|
63
|
+
{ id: 'direct', run: ({ signal, remainingMs }) => read(signal, firstAttemptMs(remainingMs)) },
|
|
64
|
+
networkRetryStep(({ signal, remainingMs }) => read(signal, remainingMs)),
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export const adapter = (environment) => {
|
|
69
|
+
const tracker = new JitsuTracker({ fetcher: environment.fetcher, recorder: environment.recorder, userAgent: environment.userAgent });
|
|
70
|
+
return {
|
|
71
|
+
id: 'jitsu', recordsSteps: true, steps: ['direct', 'retry'],
|
|
72
|
+
track: (input, context) => tracker.fetch(input.number, context),
|
|
73
|
+
recognize: (number, context) => recognizeFromLookup(() => tracker.fetch(number, context), () => accepted(() => normalizeJitsuNumber(number))),
|
|
74
|
+
};
|
|
75
|
+
};
|
|
@@ -17,18 +17,70 @@
|
|
|
17
17
|
"timezone": "America/Los_Angeles",
|
|
18
18
|
"tracking": {
|
|
19
19
|
"mode": "automatic",
|
|
20
|
-
"adapter": "
|
|
21
|
-
"steps": [
|
|
20
|
+
"adapter": "jitsu",
|
|
21
|
+
"steps": [
|
|
22
|
+
"direct",
|
|
23
|
+
"retry"
|
|
24
|
+
],
|
|
25
|
+
"recognition": {
|
|
26
|
+
"rank": 85
|
|
27
|
+
}
|
|
22
28
|
},
|
|
23
|
-
"capabilities": [
|
|
29
|
+
"capabilities": [
|
|
30
|
+
"history",
|
|
31
|
+
"location",
|
|
32
|
+
"eta",
|
|
33
|
+
"delivered_at",
|
|
34
|
+
"provider_code"
|
|
35
|
+
],
|
|
24
36
|
"portal": {
|
|
25
|
-
"url": "https://recipient.gojitsu.com/{trackingNumber}",
|
|
37
|
+
"url": "https://recipient.gojitsu.com/noredirect/{trackingNumber}",
|
|
26
38
|
"searchUrl": "https://recipient.gojitsu.com/",
|
|
27
39
|
"canaryUrl": "https://recipient.gojitsu.com/",
|
|
28
|
-
"shows": [
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
40
|
+
"shows": [
|
|
41
|
+
"status",
|
|
42
|
+
"progress_rail",
|
|
43
|
+
"history",
|
|
44
|
+
"location",
|
|
45
|
+
"eta",
|
|
46
|
+
"eta_window",
|
|
47
|
+
"delivered_at",
|
|
48
|
+
"sender_name",
|
|
49
|
+
"coordinates",
|
|
50
|
+
"proof_of_delivery",
|
|
51
|
+
"signature",
|
|
52
|
+
"driver_name",
|
|
53
|
+
"delivery_instructions"
|
|
54
|
+
],
|
|
55
|
+
"scraped": [
|
|
56
|
+
"status",
|
|
57
|
+
"history",
|
|
58
|
+
"location",
|
|
59
|
+
"eta",
|
|
60
|
+
"eta_window",
|
|
61
|
+
"delivered_at",
|
|
62
|
+
"provider_code",
|
|
63
|
+
"offset_timestamps"
|
|
64
|
+
],
|
|
65
|
+
"discarded": [
|
|
66
|
+
"progress_rail",
|
|
67
|
+
"sender_name",
|
|
68
|
+
"coordinates",
|
|
69
|
+
"proof_of_delivery",
|
|
70
|
+
"signature",
|
|
71
|
+
"driver_name",
|
|
72
|
+
"delivery_instructions",
|
|
73
|
+
"recipient_address",
|
|
74
|
+
"postcodes",
|
|
75
|
+
"contact_details",
|
|
76
|
+
"remarks",
|
|
77
|
+
"customer_reference",
|
|
78
|
+
"service_name"
|
|
79
|
+
],
|
|
80
|
+
"unavailable": [
|
|
81
|
+
"weight",
|
|
82
|
+
"dimensions"
|
|
83
|
+
]
|
|
32
84
|
},
|
|
33
85
|
"links": [
|
|
34
86
|
{
|
|
@@ -38,7 +90,7 @@
|
|
|
38
90
|
"tracking.gojitsu.com",
|
|
39
91
|
"tracking.axlehire.com"
|
|
40
92
|
],
|
|
41
|
-
"path": "^/([^/?#]+)/?$"
|
|
93
|
+
"path": "^/(?:noredirect/)?([^/?#]+)/?$"
|
|
42
94
|
}
|
|
43
95
|
],
|
|
44
96
|
"detection": []
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
"access": "full_page"
|
|
13
13
|
},
|
|
14
14
|
"context": {
|
|
15
|
-
"assessment": "
|
|
15
|
+
"assessment": "confirmed"
|
|
16
16
|
},
|
|
17
17
|
"expect": {
|
|
18
18
|
"carrier": "unknown",
|
|
19
19
|
"confidence": "none"
|
|
20
20
|
},
|
|
21
|
-
"note": "A review on AxleHire's Trustpilot page gives it as the tracking code."
|
|
21
|
+
"note": "A review on AxleHire's Trustpilot page gives it as the tracking code. Jitsu's tracking service knows it."
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"number": "SCD0970110404013031",
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
"access": "indexed_excerpt"
|
|
32
32
|
},
|
|
33
33
|
"context": {
|
|
34
|
-
"assessment": "
|
|
34
|
+
"assessment": "confirmed"
|
|
35
35
|
},
|
|
36
36
|
"expect": {
|
|
37
37
|
"carrier": "unknown",
|
|
38
38
|
"confidence": "none"
|
|
39
39
|
},
|
|
40
|
-
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened."
|
|
40
|
+
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened. Jitsu's tracking service knows it."
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
"number": "SCD0000015902735263",
|
|
@@ -50,13 +50,13 @@
|
|
|
50
50
|
"access": "indexed_excerpt"
|
|
51
51
|
},
|
|
52
52
|
"context": {
|
|
53
|
-
"assessment": "
|
|
53
|
+
"assessment": "confirmed"
|
|
54
54
|
},
|
|
55
55
|
"expect": {
|
|
56
56
|
"carrier": "unknown",
|
|
57
57
|
"confidence": "none"
|
|
58
58
|
},
|
|
59
|
-
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened."
|
|
59
|
+
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened. Jitsu's tracking service knows it."
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
62
|
"number": "SCD0000F00200029177",
|
|
@@ -69,13 +69,13 @@
|
|
|
69
69
|
"access": "indexed_excerpt"
|
|
70
70
|
},
|
|
71
71
|
"context": {
|
|
72
|
-
"assessment": "
|
|
72
|
+
"assessment": "confirmed"
|
|
73
73
|
},
|
|
74
74
|
"expect": {
|
|
75
75
|
"carrier": "unknown",
|
|
76
76
|
"confidence": "none"
|
|
77
77
|
},
|
|
78
|
-
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened."
|
|
78
|
+
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened. Jitsu's tracking service knows it."
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"number": "SCD0000H00500673206",
|
|
@@ -88,13 +88,13 @@
|
|
|
88
88
|
"access": "indexed_excerpt"
|
|
89
89
|
},
|
|
90
90
|
"context": {
|
|
91
|
-
"assessment": "
|
|
91
|
+
"assessment": "confirmed"
|
|
92
92
|
},
|
|
93
93
|
"expect": {
|
|
94
94
|
"carrier": "unknown",
|
|
95
95
|
"confidence": "none"
|
|
96
96
|
},
|
|
97
|
-
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened."
|
|
97
|
+
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened. Jitsu's tracking service knows it."
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
100
|
"number": "lyqnxet59476nx3e",
|
|
@@ -107,13 +107,13 @@
|
|
|
107
107
|
"access": "indexed_excerpt"
|
|
108
108
|
},
|
|
109
109
|
"context": {
|
|
110
|
-
"assessment": "
|
|
110
|
+
"assessment": "confirmed"
|
|
111
111
|
},
|
|
112
112
|
"expect": {
|
|
113
113
|
"carrier": "unknown",
|
|
114
114
|
"confidence": "none"
|
|
115
115
|
},
|
|
116
|
-
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened."
|
|
116
|
+
"note": "Looked up on AxleHire's own tracker, as an archived address shows; the capture was not opened. Jitsu's tracking service knows it."
|
|
117
117
|
},
|
|
118
118
|
{
|
|
119
119
|
"number": "2f9es65v3g4gt72z",
|
|
@@ -126,13 +126,13 @@
|
|
|
126
126
|
"access": "indexed_excerpt"
|
|
127
127
|
},
|
|
128
128
|
"context": {
|
|
129
|
-
"assessment": "
|
|
129
|
+
"assessment": "confirmed"
|
|
130
130
|
},
|
|
131
131
|
"expect": {
|
|
132
132
|
"carrier": "unknown",
|
|
133
133
|
"confidence": "none"
|
|
134
134
|
},
|
|
135
|
-
"note": "Looked up on Jitsu's own tracker, as an archived address shows; the capture was not opened."
|
|
135
|
+
"note": "Looked up on Jitsu's own tracker, as an archived address shows; the capture was not opened. Jitsu's tracking service knows it."
|
|
136
136
|
},
|
|
137
137
|
{
|
|
138
138
|
"number": "SCD0000H00411947817",
|
|
@@ -145,13 +145,13 @@
|
|
|
145
145
|
"access": "indexed_excerpt"
|
|
146
146
|
},
|
|
147
147
|
"context": {
|
|
148
|
-
"assessment": "
|
|
148
|
+
"assessment": "confirmed"
|
|
149
149
|
},
|
|
150
150
|
"expect": {
|
|
151
151
|
"carrier": "unknown",
|
|
152
152
|
"confidence": "none"
|
|
153
153
|
},
|
|
154
|
-
"note": "Looked up on Jitsu's own tracker, as an archived address shows; the capture was not opened."
|
|
154
|
+
"note": "Looked up on Jitsu's own tracker, as an archived address shows; the capture was not opened. Jitsu's tracking service knows it."
|
|
155
155
|
},
|
|
156
156
|
{
|
|
157
157
|
"number": "SCD0000F00410922107",
|
|
@@ -164,13 +164,35 @@
|
|
|
164
164
|
"access": "indexed_excerpt"
|
|
165
165
|
},
|
|
166
166
|
"context": {
|
|
167
|
-
"assessment": "
|
|
167
|
+
"assessment": "confirmed"
|
|
168
168
|
},
|
|
169
169
|
"expect": {
|
|
170
170
|
"carrier": "unknown",
|
|
171
171
|
"confidence": "none"
|
|
172
172
|
},
|
|
173
|
-
"note": "Looked up on Jitsu's own tracker, as an archived address shows; the capture was not opened."
|
|
173
|
+
"note": "Looked up on Jitsu's own tracker, as an archived address shows; the capture was not opened. Jitsu's tracking service knows it."
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"number": "4AUMF4FWVRB5",
|
|
177
|
+
"role": "shipment",
|
|
178
|
+
"evidence": "public_shipment_report",
|
|
179
|
+
"source": {
|
|
180
|
+
"url": "https://www.parcelpanel.com/couriers/axlehire/",
|
|
181
|
+
"date": "2026-10-12",
|
|
182
|
+
"dateKind": "capture",
|
|
183
|
+
"access": "full_page"
|
|
184
|
+
},
|
|
185
|
+
"context": {
|
|
186
|
+
"assessment": "confirmed"
|
|
187
|
+
},
|
|
188
|
+
"expect": {
|
|
189
|
+
"carrier": "unknown",
|
|
190
|
+
"confidence": "low",
|
|
191
|
+
"candidates": [
|
|
192
|
+
"colis-prive"
|
|
193
|
+
]
|
|
194
|
+
},
|
|
195
|
+
"note": "ParcelPanel's AxleHire page offered it as a sample to try. Jitsu's tracking service knows it."
|
|
174
196
|
}
|
|
175
197
|
]
|
|
176
198
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
2
|
+
export declare const PROVIDER = "Jitsu";
|
|
3
|
+
export declare const JITSU_MAX_BYTES = 1000000;
|
|
4
|
+
/** A tracking code the service can look up: letters and digits, upper-cased as the library stores them. */
|
|
5
|
+
export declare function normalizeJitsuNumber(raw: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* The reply of `GET /delivery/{code}` on Jitsu's recipient service: the
|
|
8
|
+
* shipment, its events newest first, and the tracker's settings. The shipment's
|
|
9
|
+
* tracking code must be the one requested, in any case. Events are read as
|
|
10
|
+
* the tracker lists them: by clock, newest first, without the address updates
|
|
11
|
+
* the recipient made, and without a facility's first scan that repeats its
|
|
12
|
+
* receipt. The recipient's contact details, address, postcode and position,
|
|
13
|
+
* the driver, delivery remarks, photos, signatures and access codes are never
|
|
14
|
+
* read.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseJitsu(payload: unknown, raw: string): CarrierResult;
|
|
17
|
+
/**
|
|
18
|
+
* Whether a 404 is the service's own answer that it has no delivery for the
|
|
19
|
+
* code: its servlet's not-found body naming the path asked. A route the service
|
|
20
|
+
* no longer serves answers another body.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isJitsuNotFound(payload: unknown, number: string): boolean;
|