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 CHANGED
@@ -13,7 +13,7 @@ The engine behind [Peek](https://peektracker.com) ([GitHub](https://github.com/p
13
13
  [![License: Apache-2.0](https://img.shields.io/badge/core-Apache--2.0-blue.svg)](LICENSE)
14
14
 
15
15
  <!-- GENERATED:summary -->
16
- **3,500+ carriers** through **178 dedicated adapters** and **5 universal fallbacks**
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,275 such statuses, each filed under one stage.
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": "universal"
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": "universal"
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
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "catalog": 208,
3
- "activeAdapters": 178,
3
+ "activeAdapters": 180,
4
4
  "countries": 66,
5
5
  "referenceCarriers": 100,
6
6
  "comparison": {
@@ -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",
@@ -5542,10 +5542,11 @@ var De = {
5542
5542
  timezone: "America/Los_Angeles",
5543
5543
  tracking: {
5544
5544
  mode: "automatic",
5545
- adapter: "universal"
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: "universal"
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": "universal",
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
- "scraped": [],
30
- "discarded": [],
31
- "unavailable": []
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": "candidate"
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": "candidate"
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": "candidate"
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": "candidate"
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": "candidate"
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": "candidate"
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": "candidate"
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": "candidate"
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": "candidate"
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;