universal-parcel-scraper 0.415.0-main.2136 → 0.417.1-main.2143

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.
Files changed (35) hide show
  1. package/README.md +3 -3
  2. package/data/catalog.json +39 -2
  3. package/data/coverage-summary.json +2 -2
  4. package/data/detection-golden.json +22 -0
  5. package/dist/browser/scraper.js +35 -3
  6. package/dist/carriers/australia-post/adapter.js +1 -1
  7. package/dist/carriers/fedex-freight/carrier.json +46 -0
  8. package/dist/carriers/fedex-freight/numbers.json +33 -0
  9. package/dist/carriers/fedex-freight/statuses.json +4 -0
  10. package/dist/carriers/sapx-express/adapter.d.ts +14 -0
  11. package/dist/carriers/sapx-express/adapter.js +56 -0
  12. package/dist/carriers/sapx-express/carrier.json +52 -7
  13. package/dist/carriers/sapx-express/numbers.json +4 -3
  14. package/dist/carriers/sapx-express/parser.d.ts +15 -0
  15. package/dist/carriers/sapx-express/parser.js +170 -0
  16. package/dist/carriers/sapx-express/status.d.ts +12 -0
  17. package/dist/carriers/sapx-express/status.js +51 -0
  18. package/dist/carriers/sapx-express/statuses.json +5 -0
  19. package/dist/carriers/sendex/adapter.d.ts +14 -0
  20. package/dist/carriers/sendex/adapter.js +54 -0
  21. package/dist/carriers/sendex/carrier.json +56 -7
  22. package/dist/carriers/sendex/numbers.json +21 -21
  23. package/dist/carriers/sendex/parser.d.ts +13 -0
  24. package/dist/carriers/sendex/parser.js +168 -0
  25. package/dist/carriers/sendex/status.d.ts +8 -0
  26. package/dist/carriers/sendex/status.js +54 -0
  27. package/dist/carriers/sendex/statuses.json +16 -5
  28. package/dist/core/catalog/statusMaps.js +5 -2
  29. package/dist/data/catalog.json +39 -2
  30. package/dist/generated/catalog.d.ts +28 -3
  31. package/dist/generated/catalog.js +41 -2
  32. package/dist/generated/recognition.js +2 -0
  33. package/dist/generated/registry.js +7 -2
  34. package/dist/server/openapi.json +1 -1
  35. package/package.json +1 -1
package/README.md CHANGED
@@ -13,9 +13,9 @@ 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 **450 dedicated adapters** and **5 universal fallbacks**
16
+ **3,500+ carriers** through **452 dedicated adapters** and **5 universal fallbacks**
17
17
 
18
- <sub>760 catalog entries · 134 countries represented</sub>
18
+ <sub>761 catalog entries · 134 countries represented</sub>
19
19
  <!-- /GENERATED:summary -->
20
20
 
21
21
  [Try it](#try-it) · [Ways to run it](#ways-to-run-it) · [Benchmark](#benchmark) · [Carriers](carriers/) · [Add a carrier](CONTRIBUTING.md)
@@ -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 14,300 such statuses, each filed under one stage.
158
+ The carrier folders record 14,316 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
@@ -13312,6 +13312,39 @@
13312
13312
  ],
13313
13313
  "detectionRules": []
13314
13314
  },
13315
+ "fedex-freight": {
13316
+ "displayName": "FedEx Freight",
13317
+ "color": "#de002e",
13318
+ "aliases": [
13319
+ "FedEx Freight LTL"
13320
+ ],
13321
+ "countries": [
13322
+ "US",
13323
+ "CA",
13324
+ "MX"
13325
+ ],
13326
+ "selectable": true,
13327
+ "timezone": "America/Chicago",
13328
+ "tracking": {
13329
+ "mode": "automatic",
13330
+ "adapter": "universal"
13331
+ },
13332
+ "canaryUrl": "https://www.fedexfreight.com/en-us/tracking",
13333
+ "trackingUrlTemplate": "https://www.fedexfreight.com/fedextrack/?trknbr={trackingNumber}",
13334
+ "trackingSearchUrl": "https://www.fedexfreight.com/en-us/tracking",
13335
+ "linkRules": [
13336
+ {
13337
+ "domains": [
13338
+ "www.fedexfreight.com"
13339
+ ],
13340
+ "pathPattern": "^/fedextrack/?$",
13341
+ "params": [
13342
+ "trknbr"
13343
+ ]
13344
+ }
13345
+ ],
13346
+ "detectionRules": []
13347
+ },
13315
13348
  "fedex-pl": {
13316
13349
  "displayName": "FedEx Poland",
13317
13350
  "color": "#4d148c",
@@ -24782,7 +24815,9 @@
24782
24815
  "timezone": "Asia/Jakarta",
24783
24816
  "tracking": {
24784
24817
  "mode": "automatic",
24785
- "adapter": "universal"
24818
+ "adapter": "sapx-express",
24819
+ "recognitionRank": 795,
24820
+ "localClocks": true
24786
24821
  },
24787
24822
  "canaryUrl": "https://www.sapx.id/id/cek-awb",
24788
24823
  "trackingUrlTemplate": "https://www.sapx.id/id/cek-awb/{trackingNumber}",
@@ -25074,7 +25109,9 @@
25074
25109
  "timezone": "America/Mexico_City",
25075
25110
  "tracking": {
25076
25111
  "mode": "automatic",
25077
- "adapter": "universal"
25112
+ "adapter": "sendex",
25113
+ "recognitionRank": 794,
25114
+ "localClocks": true
25078
25115
  },
25079
25116
  "canaryUrl": "https://sendex.coordi.com/rastreo/",
25080
25117
  "trackingSearchUrl": "https://sendex.coordi.com/rastreo/",
@@ -1,6 +1,6 @@
1
1
  {
2
- "catalog": 760,
3
- "activeAdapters": 450,
2
+ "catalog": 761,
3
+ "activeAdapters": 452,
4
4
  "countries": 134,
5
5
  "referenceCarriers": 100,
6
6
  "comparison": {
@@ -7684,6 +7684,28 @@
7684
7684
  "ecoscooting"
7685
7685
  ]
7686
7686
  },
7687
+ {
7688
+ "input": "0585862594",
7689
+ "carrier": "unknown",
7690
+ "confidence": "low",
7691
+ "candidates": [
7692
+ "dhl-express",
7693
+ "dhl",
7694
+ "mondial-relay",
7695
+ "relais-colis",
7696
+ "tipsa",
7697
+ "estafeta",
7698
+ "dhl-ecommerce-es"
7699
+ ],
7700
+ "preferred": [
7701
+ "dhl-express"
7702
+ ],
7703
+ "asked": [
7704
+ "dhl-express",
7705
+ "relais-colis",
7706
+ "dhl-ecommerce-es"
7707
+ ]
7708
+ },
7687
7709
  {
7688
7710
  "input": "06028364905",
7689
7711
  "carrier": "unknown",
@@ -10275,6 +10275,31 @@ var Re = {
10275
10275
  }],
10276
10276
  detectionRules: []
10277
10277
  },
10278
+ "fedex-freight": {
10279
+ displayName: "FedEx Freight",
10280
+ color: "#de002e",
10281
+ aliases: ["FedEx Freight LTL"],
10282
+ countries: [
10283
+ "US",
10284
+ "CA",
10285
+ "MX"
10286
+ ],
10287
+ selectable: !0,
10288
+ timezone: "America/Chicago",
10289
+ tracking: {
10290
+ mode: "automatic",
10291
+ adapter: "universal"
10292
+ },
10293
+ canaryUrl: "https://www.fedexfreight.com/en-us/tracking",
10294
+ trackingUrlTemplate: "https://www.fedexfreight.com/fedextrack/?trknbr={trackingNumber}",
10295
+ trackingSearchUrl: "https://www.fedexfreight.com/en-us/tracking",
10296
+ linkRules: [{
10297
+ domains: ["www.fedexfreight.com"],
10298
+ pathPattern: "^/fedextrack/?$",
10299
+ params: ["trknbr"]
10300
+ }],
10301
+ detectionRules: []
10302
+ },
10278
10303
  "fedex-pl": {
10279
10304
  displayName: "FedEx Poland",
10280
10305
  color: "#4d148c",
@@ -18728,7 +18753,9 @@ var Re = {
18728
18753
  timezone: "Asia/Jakarta",
18729
18754
  tracking: {
18730
18755
  mode: "automatic",
18731
- adapter: "universal"
18756
+ adapter: "sapx-express",
18757
+ recognitionRank: 795,
18758
+ localClocks: !0
18732
18759
  },
18733
18760
  canaryUrl: "https://www.sapx.id/id/cek-awb",
18734
18761
  trackingUrlTemplate: "https://www.sapx.id/id/cek-awb/{trackingNumber}",
@@ -18947,7 +18974,9 @@ var Re = {
18947
18974
  timezone: "America/Mexico_City",
18948
18975
  tracking: {
18949
18976
  mode: "automatic",
18950
- adapter: "universal"
18977
+ adapter: "sendex",
18978
+ recognitionRank: 794,
18979
+ localClocks: !0
18951
18980
  },
18952
18981
  canaryUrl: "https://sendex.coordi.com/rastreo/",
18953
18982
  trackingSearchUrl: "https://sendex.coordi.com/rastreo/",
@@ -22739,7 +22768,7 @@ var Re = {
22739
22768
  rawPattern: "^\\d{2}-[A-Z0-9]{6}(?:[A-Z0-9]|[A-Z0-9]{4})?-ZR$"
22740
22769
  }]
22741
22770
  }
22742
- }, ze = /* @__PURE__ */ "swiss-post.swiss-post-cargo.quickpac.planzer.aliexpress.sunyou.hermes.spring-gds.postlogistics.dachser.dhl.dhl-ecommerce.ups.amazon-logistics.amazon-shipping.fedex.gls-ch.dpd.dpd-fr.mondial-relay.relais-colis.la-poste.chronopost.gls-fr.colis-prive.geodis.colisweb.c-chez-vous.heppner.ciblex.paack.asendia.shipup.india-post.hermes-de.gls-de.delivengo.intl-post.unknown.royal-mail.parcelforce.evri.inpost.an-post.bpost.austrian-post.postnord.posti.correos-express.seur.mrw.nacex.ctt.ctt-express.poste-italiane.brt.ecoscooting.tipsa.ukrposhta.usps.canada-post.purolator.canpar.ontrac.speedx.uniuni.landmark-global.old-dominion.spee-dee.gofo.estafeta.correios-br.correos-chile.yunexpress.four-px.blue-dart.delhivery.nz-post.singapore-post.japan-post.sf-express.sto.yunda.yto.zto.jd-logistics.yamato.korea-post.thailand-post.dtdc.australia-post.hongkong-post.pos-malaysia.ninja-van.china-post.packeta.poczta-polska.bring-posten.aramex.tnt.correos-spain.yanwen.the-courier-guy.j-and-t.ems.139express.17feia.247express.2go.4-72.4sides.5post.99minutos.a-duie-pyle.a-tu-hora-express.a1-post.aaa-cooper.ab-courier.abf-freight.aci-express-kr.acs-courier.aeropost.aex-paraguay.afghan-post.air-star-xpress.airpak-express.ajex.akash-ganga.aks-express.alem-tat.algerie-poste.allegro-one.am-home-delivery.ameex.american-west-express.amerijet.ampm.andreani.anjun.anousith.anteraja.ap-cargo.apc-overnight.apc-postal-logistics.apple-express.aramex-au.aramex-nz.aras-kargo.arrow-xl.asyad-express.atlantic-courier.averitt.aymakan.azerpost.azul-cargo.bangladesh-post.barid-al-maghrib.belpost.best-express-my.best-express-vn.best-overnite-express.best-transport.better-trucks.bex-express.big-smart.bjs-home-delivery.blue-express.blueex.bombino.bookurier.border-express.bosta.botswana-post.box-now.bringer-parcel.bts-uz.budbee.buffalo-ex.bulgarian-posts.burd-delivery.bussgods.byhd.c3x.cacesa.campost.cargus.castores.cbl-logistica.ccfs.cdek.cdl.celeritas.central-transport.ceska-posta.ceva-logistics.chazki.chilexpress.chit-chats.chronodiali.chunghwa-post.chunil.city-express-rs.citylink-express.citymail.citysprint.cj-logistics.cj-packet.closer-logistics.cne.codexpress.connect-couriers.coordinadora.copa-courier.corre.correo-argentino.correo-uruguayo.correos-bolivia.correos-cuba.correos-de-mexico.correos-el-salvador.correos-nicaragua.courier-center.courier-it.courier-plus-ng.couriersplease.credifin.cruz-del-sur.cse-russia.cst-italia.cttyex.custom-companies.cycloon.cyprus-post.d-express.daewoo-fastex.dai-post.daily-xpress.danske-fragtmaend.dao.day-ross.daylight-transport.dayton-freight.dellin.delnext.deppon.deprisa.designer-transport.dhl-ecommerce-es.dhl-ecommerce-nl.dhl-ecommerce-pl.dhl-ecommerce-uk.dhl-express.dhl-freight.dhlink.direct-couriers.direct-freight-express.direx.dnx-cargo.dobropost.dohrn-transfer.domain-logistics.domex.dpd-at.dpd-be.dpd-de.dpd-ie.dpd-nl.dpd-pl.dpd-pt.dpd-uk.dpd-za.dpex.dragon-star-curier.drop2shop.dropp.dsv.dx.dynalogic.early-bird.easy-mail.ecms-express.eco-express-ae.econt.ecourier.egypt-post.ekart.elta.emile.emirates-post.ems-vietnam.energia-tk.energo.envia-colombia.envialia.eparcel-kr.epost-global.equick.estes.estes-forwarding.ethiopian-post.eurodis.euroexpress-ba.europochta.evdemo-lojistik.evri-uk.evropat.ewe.exelot.exline-kz.exmate.express-one.fan-courier.fargo-courier.fargo-uz.fastdrop.fastfrate.fedex-pl.fermopoint.fg-delivery.first-delivery-tn.first-fly-express.flash-express.flash-express-ph.fleetex.fleetoptics.flippost.fliway.flyking.followmont.forward-air.forza-delivery.foxpost.franch-express.fukuyama.gaash.gati.gdex.gebrueder-weiss.geis.gel-express.geniki-taxydromiki.geodis-pl.ghana-post.ghn.ghtk.globalpost.gls-at.gls-es.gls-it.gls-pl.gms-worldwide.go-express.go4.gobolt.gofo-fr.gofo-it.gofo-nl.gogo-xpress.goodluck-courier.grand-slam-express.groupe-guilbault.gs-postbox.gsi-express.gta-airskip.gtl-goto.guatex.gzyl.hanjin.hapdong.happy-post.haypost.hct-logistics.helthjem.hepsijet.hercules-freight.hermes-at.hi-trans.hispapost.homexpress.horoz.hound-express.houng-ah-loun.hovership.hp-mostar.hr-parcel.hrvatska-posta.hunter-express.hywl.icc-worldwide.icl-express.ics-courier.idexpress.ids-logistik.ilyang-logis.imile.indah-logistik.instabox.integral-pack.intelcom.inter-courier.intereuropa.internet-express.interrapidisimo.intex-paketdienst.iran-post.israel-post.j-and-t-br.j-and-t-cargo.j-and-t-cn.j-and-t-middle-east.j-and-t-mx.jadlog.jamaica-post.janio.jeebly.jersey-post.jet-logistic.jetline-couriers.jhgj.jitsu.jne.jordan-post.jrs-express.jrt.js-express.kargoist.kazpost.kerry-tj.kex.kex-express-hk.kit-tk.kolay-gelsin.kronos-express.ktd.kuehne-nagel.kunyoung.kwick-box.kyoungdong.kyrgyz-post.l-post.la-poste-burkina-faso.la-poste-ci.la-poste-senegal.la-poste-tunisienne.laar-courier.labaih.lao-post.last-one-mile-coop.latvijas-pasts.lbc-express.leopards-courier.libanpost.liccardi.lietuvos-pastas.lightning-express.line-clear.linhan.lion-parcel.logen.loggi.logistiq.logoix.loomis-express.lotte-global.lso.m-and-p.m-one.madhur-courier.magyar-posta.mailamericas.mailplus-au.mainfreight.major-express.makati-express.maltapost.mandae.maritime-ontario.maruti-air.matkahuolto.mauritius-post.mayiyinfu.mds-collivery.meest.messenger-cz.method.metropolitan-warehouse.micro-express.midland-transport.mng-kargo.mongol-infinity-post.montenegro-post.morning-global.mrl-global.mtscn.mylerz.naqel.nationex.ncs-courier.neighbour-express.nepal-post.netpost-vn.next-level-delivery.nhat-tin.nim-express.nipost.nippon-express.noest.nord-wheel.norsk-global.northline.nova-global.nova-poshta.nox.nz-couriers.oak-harbor.oca.ocasa.ocs-ana.olva-courier.omgo.omniva.one-world-express.opt-nc.orian.orlen-paczka.osm-worldwide.overseas-express.ozon-logistics.pack-man.packli-punkt.packlink.packs.pakistan-post.palletways.pandu-logistics.pannon-xp.paperfly.paquetexpress.parcelpoint.pargo.passport.pathao-courier.pavan-courier.paxel.paxi.pbt.pcp-express.pcs-logistics-vn.pdn-express.pdq-chile.pecom.peddler.pelican-express.peqasus-az.pfc-express.phlpost.pickupp.pickupp-sg.pigeon-express.pilot-freight.pitney-bowes.pitt-ohio.pmm.polaris-transport.pony-express.pos-indonesia.post-haste.post-luxembourg.posta-faroe.posta-kenya.posta-moldovei.posta-north-macedonia.posta-romana.posta-shqiptare.posta-slovenije.posta-srbije.postaplus.postex.postmedia-parcel-services.postplus.posturinn.ppl.precision-deliveries.pro-carrier.professional-couriers.prompt-xpress.pronto-lanka.proships.pts-worldwide-express.ptt.pullman-cargo.pushpak-courier.quantium-solutions.quicksilver-sa.quiqup.raben.ram-hand-to-hand.redpack.redur.redx.relaytech.rivigo.rl-carriers.roadie.roadrunner.royal-express-mm.rpx-hk.rpx-indonesia.rr-express-sg.russian-post.saee.sagawa.sagawa-global.sahara-express.saia.sailpost.sameday.sapx-express.sat-ukraine.saudi-post.sbs-sokuhai.scg-express.seino.seko.sendex.sending.serpost.servientrega.seven-eleven-tw.sfc.shadowfax.shipa.shipblu.shipentegra.shree-anjani.shree-mahabali-express.shree-mahavir.shree-maruti.shree-nandan.sicepat.skroutz-last-mile.skyex-ae.skyking.skynet-sa.skynet-worldwide.slgtrax.slovak-parcel-service.slovenska-posta.smsa-express.south-african-post-office.southeastern-freight-lines.sp-express.speed-and-safe.speedaf.speedex.speedpak.speedy.spx-br.spx-id.spx-my.spx-ph.spx-sg.spx-th.spx-tw.spx-vn.sri-lanka-post.st-courier.stallion-express.starex-az.starken.starlinks.steadfast.straightship.sundarban-courier.surat-kargo.swiftx.t-cat.t-group.tamdis.tanzania-posts.taxydema.tccs.tci-express.tcs-pakistan.tdn.tealca.team-express-ae.team-global-express.tej-couriers.teleship.tfm-express.tforce-freight.tforce-logistics.thhy.tiki.tirupati-courier.tmm-express.tnt-it.today-kr.toptrans.torrestir.total-express.tp-logistics-th.trackon.tracx-logis.trans-o-flex.transaher.transcorp.transmission.transport-rdl.trendyol-express.tsjy.tst-cf-express.tufesa.tusass.tws-express.ubi-smart-parcel.ues-uy.united-delivery-service.united-worldwide-couriers.upaya.urbano.urvaam.uzbekistan-post.valmo.vasp-expresso.veloces.venipak.vestovoy.via-cargo.viettel-post.vimenpaq.vinted-go.vitran-express.vnpost.vozovoz.vrl-logistics.wahana.wanbexpress.ward-trucking.whistl.winion-logis.winit.x-express-ba.x-trac.xde-logistics.xdp.xlcourier.xpo-ltl.xpressbees.yalidine.yc-delivery.yilong-logistics.yimidida.yurtici-kargo.zajil.zeleris.zheldor.zoom-ve.zr-express".split("."), Be = {
22771
+ }, ze = /* @__PURE__ */ "swiss-post.swiss-post-cargo.quickpac.planzer.aliexpress.sunyou.hermes.spring-gds.postlogistics.dachser.dhl.dhl-ecommerce.ups.amazon-logistics.amazon-shipping.fedex.gls-ch.dpd.dpd-fr.mondial-relay.relais-colis.la-poste.chronopost.gls-fr.colis-prive.geodis.colisweb.c-chez-vous.heppner.ciblex.paack.asendia.shipup.india-post.hermes-de.gls-de.delivengo.intl-post.unknown.royal-mail.parcelforce.evri.inpost.an-post.bpost.austrian-post.postnord.posti.correos-express.seur.mrw.nacex.ctt.ctt-express.poste-italiane.brt.ecoscooting.tipsa.ukrposhta.usps.canada-post.purolator.canpar.ontrac.speedx.uniuni.landmark-global.old-dominion.spee-dee.gofo.estafeta.correios-br.correos-chile.yunexpress.four-px.blue-dart.delhivery.nz-post.singapore-post.japan-post.sf-express.sto.yunda.yto.zto.jd-logistics.yamato.korea-post.thailand-post.dtdc.australia-post.hongkong-post.pos-malaysia.ninja-van.china-post.packeta.poczta-polska.bring-posten.aramex.tnt.correos-spain.yanwen.the-courier-guy.j-and-t.ems.139express.17feia.247express.2go.4-72.4sides.5post.99minutos.a-duie-pyle.a-tu-hora-express.a1-post.aaa-cooper.ab-courier.abf-freight.aci-express-kr.acs-courier.aeropost.aex-paraguay.afghan-post.air-star-xpress.airpak-express.ajex.akash-ganga.aks-express.alem-tat.algerie-poste.allegro-one.am-home-delivery.ameex.american-west-express.amerijet.ampm.andreani.anjun.anousith.anteraja.ap-cargo.apc-overnight.apc-postal-logistics.apple-express.aramex-au.aramex-nz.aras-kargo.arrow-xl.asyad-express.atlantic-courier.averitt.aymakan.azerpost.azul-cargo.bangladesh-post.barid-al-maghrib.belpost.best-express-my.best-express-vn.best-overnite-express.best-transport.better-trucks.bex-express.big-smart.bjs-home-delivery.blue-express.blueex.bombino.bookurier.border-express.bosta.botswana-post.box-now.bringer-parcel.bts-uz.budbee.buffalo-ex.bulgarian-posts.burd-delivery.bussgods.byhd.c3x.cacesa.campost.cargus.castores.cbl-logistica.ccfs.cdek.cdl.celeritas.central-transport.ceska-posta.ceva-logistics.chazki.chilexpress.chit-chats.chronodiali.chunghwa-post.chunil.city-express-rs.citylink-express.citymail.citysprint.cj-logistics.cj-packet.closer-logistics.cne.codexpress.connect-couriers.coordinadora.copa-courier.corre.correo-argentino.correo-uruguayo.correos-bolivia.correos-cuba.correos-de-mexico.correos-el-salvador.correos-nicaragua.courier-center.courier-it.courier-plus-ng.couriersplease.credifin.cruz-del-sur.cse-russia.cst-italia.cttyex.custom-companies.cycloon.cyprus-post.d-express.daewoo-fastex.dai-post.daily-xpress.danske-fragtmaend.dao.day-ross.daylight-transport.dayton-freight.dellin.delnext.deppon.deprisa.designer-transport.dhl-ecommerce-es.dhl-ecommerce-nl.dhl-ecommerce-pl.dhl-ecommerce-uk.dhl-express.dhl-freight.dhlink.direct-couriers.direct-freight-express.direx.dnx-cargo.dobropost.dohrn-transfer.domain-logistics.domex.dpd-at.dpd-be.dpd-de.dpd-ie.dpd-nl.dpd-pl.dpd-pt.dpd-uk.dpd-za.dpex.dragon-star-curier.drop2shop.dropp.dsv.dx.dynalogic.early-bird.easy-mail.ecms-express.eco-express-ae.econt.ecourier.egypt-post.ekart.elta.emile.emirates-post.ems-vietnam.energia-tk.energo.envia-colombia.envialia.eparcel-kr.epost-global.equick.estes.estes-forwarding.ethiopian-post.eurodis.euroexpress-ba.europochta.evdemo-lojistik.evri-uk.evropat.ewe.exelot.exline-kz.exmate.express-one.fan-courier.fargo-courier.fargo-uz.fastdrop.fastfrate.fedex-freight.fedex-pl.fermopoint.fg-delivery.first-delivery-tn.first-fly-express.flash-express.flash-express-ph.fleetex.fleetoptics.flippost.fliway.flyking.followmont.forward-air.forza-delivery.foxpost.franch-express.fukuyama.gaash.gati.gdex.gebrueder-weiss.geis.gel-express.geniki-taxydromiki.geodis-pl.ghana-post.ghn.ghtk.globalpost.gls-at.gls-es.gls-it.gls-pl.gms-worldwide.go-express.go4.gobolt.gofo-fr.gofo-it.gofo-nl.gogo-xpress.goodluck-courier.grand-slam-express.groupe-guilbault.gs-postbox.gsi-express.gta-airskip.gtl-goto.guatex.gzyl.hanjin.hapdong.happy-post.haypost.hct-logistics.helthjem.hepsijet.hercules-freight.hermes-at.hi-trans.hispapost.homexpress.horoz.hound-express.houng-ah-loun.hovership.hp-mostar.hr-parcel.hrvatska-posta.hunter-express.hywl.icc-worldwide.icl-express.ics-courier.idexpress.ids-logistik.ilyang-logis.imile.indah-logistik.instabox.integral-pack.intelcom.inter-courier.intereuropa.internet-express.interrapidisimo.intex-paketdienst.iran-post.israel-post.j-and-t-br.j-and-t-cargo.j-and-t-cn.j-and-t-middle-east.j-and-t-mx.jadlog.jamaica-post.janio.jeebly.jersey-post.jet-logistic.jetline-couriers.jhgj.jitsu.jne.jordan-post.jrs-express.jrt.js-express.kargoist.kazpost.kerry-tj.kex.kex-express-hk.kit-tk.kolay-gelsin.kronos-express.ktd.kuehne-nagel.kunyoung.kwick-box.kyoungdong.kyrgyz-post.l-post.la-poste-burkina-faso.la-poste-ci.la-poste-senegal.la-poste-tunisienne.laar-courier.labaih.lao-post.last-one-mile-coop.latvijas-pasts.lbc-express.leopards-courier.libanpost.liccardi.lietuvos-pastas.lightning-express.line-clear.linhan.lion-parcel.logen.loggi.logistiq.logoix.loomis-express.lotte-global.lso.m-and-p.m-one.madhur-courier.magyar-posta.mailamericas.mailplus-au.mainfreight.major-express.makati-express.maltapost.mandae.maritime-ontario.maruti-air.matkahuolto.mauritius-post.mayiyinfu.mds-collivery.meest.messenger-cz.method.metropolitan-warehouse.micro-express.midland-transport.mng-kargo.mongol-infinity-post.montenegro-post.morning-global.mrl-global.mtscn.mylerz.naqel.nationex.ncs-courier.neighbour-express.nepal-post.netpost-vn.next-level-delivery.nhat-tin.nim-express.nipost.nippon-express.noest.nord-wheel.norsk-global.northline.nova-global.nova-poshta.nox.nz-couriers.oak-harbor.oca.ocasa.ocs-ana.olva-courier.omgo.omniva.one-world-express.opt-nc.orian.orlen-paczka.osm-worldwide.overseas-express.ozon-logistics.pack-man.packli-punkt.packlink.packs.pakistan-post.palletways.pandu-logistics.pannon-xp.paperfly.paquetexpress.parcelpoint.pargo.passport.pathao-courier.pavan-courier.paxel.paxi.pbt.pcp-express.pcs-logistics-vn.pdn-express.pdq-chile.pecom.peddler.pelican-express.peqasus-az.pfc-express.phlpost.pickupp.pickupp-sg.pigeon-express.pilot-freight.pitney-bowes.pitt-ohio.pmm.polaris-transport.pony-express.pos-indonesia.post-haste.post-luxembourg.posta-faroe.posta-kenya.posta-moldovei.posta-north-macedonia.posta-romana.posta-shqiptare.posta-slovenije.posta-srbije.postaplus.postex.postmedia-parcel-services.postplus.posturinn.ppl.precision-deliveries.pro-carrier.professional-couriers.prompt-xpress.pronto-lanka.proships.pts-worldwide-express.ptt.pullman-cargo.pushpak-courier.quantium-solutions.quicksilver-sa.quiqup.raben.ram-hand-to-hand.redpack.redur.redx.relaytech.rivigo.rl-carriers.roadie.roadrunner.royal-express-mm.rpx-hk.rpx-indonesia.rr-express-sg.russian-post.saee.sagawa.sagawa-global.sahara-express.saia.sailpost.sameday.sapx-express.sat-ukraine.saudi-post.sbs-sokuhai.scg-express.seino.seko.sendex.sending.serpost.servientrega.seven-eleven-tw.sfc.shadowfax.shipa.shipblu.shipentegra.shree-anjani.shree-mahabali-express.shree-mahavir.shree-maruti.shree-nandan.sicepat.skroutz-last-mile.skyex-ae.skyking.skynet-sa.skynet-worldwide.slgtrax.slovak-parcel-service.slovenska-posta.smsa-express.south-african-post-office.southeastern-freight-lines.sp-express.speed-and-safe.speedaf.speedex.speedpak.speedy.spx-br.spx-id.spx-my.spx-ph.spx-sg.spx-th.spx-tw.spx-vn.sri-lanka-post.st-courier.stallion-express.starex-az.starken.starlinks.steadfast.straightship.sundarban-courier.surat-kargo.swiftx.t-cat.t-group.tamdis.tanzania-posts.taxydema.tccs.tci-express.tcs-pakistan.tdn.tealca.team-express-ae.team-global-express.tej-couriers.teleship.tfm-express.tforce-freight.tforce-logistics.thhy.tiki.tirupati-courier.tmm-express.tnt-it.today-kr.toptrans.torrestir.total-express.tp-logistics-th.trackon.tracx-logis.trans-o-flex.transaher.transcorp.transmission.transport-rdl.trendyol-express.tsjy.tst-cf-express.tufesa.tusass.tws-express.ubi-smart-parcel.ues-uy.united-delivery-service.united-worldwide-couriers.upaya.urbano.urvaam.uzbekistan-post.valmo.vasp-expresso.veloces.venipak.vestovoy.via-cargo.viettel-post.vimenpaq.vinted-go.vitran-express.vnpost.vozovoz.vrl-logistics.wahana.wanbexpress.ward-trucking.whistl.winion-logis.winit.x-express-ba.x-trac.xde-logistics.xdp.xlcourier.xpo-ltl.xpressbees.yalidine.yc-delivery.yilong-logistics.yimidida.yurtici-kargo.zajil.zeleris.zheldor.zoom-ve.zr-express".split("."), Be = {
22743
22772
  "swiss-post": ["swiss-post-1", "swiss-post-2"],
22744
22773
  "swiss-post-cargo": ["swiss-post-cargo-sscc", "swiss-post-cargo-pl-reference"],
22745
22774
  quickpac: ["quickpac-1"],
@@ -23367,6 +23396,7 @@ var Re = {
23367
23396
  "fargo-uz": [],
23368
23397
  fastdrop: [],
23369
23398
  fastfrate: [],
23399
+ "fedex-freight": [],
23370
23400
  "fedex-pl": ["fedex-pl-1"],
23371
23401
  fermopoint: ["fermopoint-1"],
23372
23402
  "fg-delivery": ["fg-delivery-fgd", "fg-delivery-1"],
@@ -29221,9 +29251,11 @@ var _l = {
29221
29251
  "rpx-indonesia": 947,
29222
29252
  saia: 12,
29223
29253
  sameday: 370,
29254
+ "sapx-express": 795,
29224
29255
  "saudi-post": 963,
29225
29256
  seino: 943,
29226
29257
  seko: 854,
29258
+ sendex: 794,
29227
29259
  sending: 891,
29228
29260
  serpost: 893,
29229
29261
  servientrega: 979,
@@ -100,7 +100,7 @@ export function parse(payload, trackingNumber) {
100
100
  ? articles[0] : null;
101
101
  // The consignment exists, but no single article answers for it.
102
102
  if (!selected && !matches.length && shipment.consignmentId === number && articles.length > 1) {
103
- throw new IndeterminateError(PROVIDER, 'Australia Post lists several articles under this consignment');
103
+ throw new IndeterminateError(PROVIDER, 'Australia Post lists several articles under this consignment', { reason: 'several_parcels' });
104
104
  }
105
105
  if (!selected)
106
106
  throw new SchemaError(PROVIDER, 'Australia Post returned a different or ambiguous article');
@@ -0,0 +1,46 @@
1
+ {
2
+ "id": "fedex-freight",
3
+ "displayName": "FedEx Freight",
4
+ "aliases": [
5
+ "FedEx Freight LTL"
6
+ ],
7
+ "region": {
8
+ "countries": [
9
+ "US",
10
+ "CA",
11
+ "MX"
12
+ ]
13
+ },
14
+ "brand": {
15
+ "color": "#de002e"
16
+ },
17
+ "selectable": true,
18
+ "timezone": "America/Chicago",
19
+ "tracking": {
20
+ "mode": "automatic",
21
+ "adapter": "universal",
22
+ "steps": []
23
+ },
24
+ "capabilities": [],
25
+ "portal": {
26
+ "url": "https://www.fedexfreight.com/fedextrack/?trknbr={trackingNumber}",
27
+ "searchUrl": "https://www.fedexfreight.com/en-us/tracking",
28
+ "canaryUrl": "https://www.fedexfreight.com/en-us/tracking",
29
+ "shows": [],
30
+ "scraped": [],
31
+ "discarded": [],
32
+ "unavailable": []
33
+ },
34
+ "links": [
35
+ {
36
+ "domains": [
37
+ "www.fedexfreight.com"
38
+ ],
39
+ "pathPattern": "^/fedextrack/?$",
40
+ "params": [
41
+ "trknbr"
42
+ ]
43
+ }
44
+ ],
45
+ "detection": []
46
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "carrier": "fedex-freight",
3
+ "records": [
4
+ {
5
+ "number": "0585862594",
6
+ "role": "shipment",
7
+ "evidence": "public_shipment_report",
8
+ "source": {
9
+ "url": "https://web.archive.org/web/20260703192004/https://www.fedexfreight.com/fedextrack/?trknbr=0585862594&trkqual=~0585862594~FDFR",
10
+ "date": "2026-07-03",
11
+ "dateKind": "capture",
12
+ "access": "full_page"
13
+ },
14
+ "context": {
15
+ "assessment": "candidate"
16
+ },
17
+ "expect": {
18
+ "carrier": "unknown",
19
+ "confidence": "low",
20
+ "candidates": [
21
+ "dhl-express",
22
+ "dhl",
23
+ "mondial-relay",
24
+ "relais-colis",
25
+ "tipsa",
26
+ "estafeta",
27
+ "dhl-ecommerce-es"
28
+ ]
29
+ },
30
+ "note": "An archived lookup on FedEx Freight's own tracking app carries this PRO with the FedEx Freight qualifier; the capture holds only the loading shell, so the history was not visible."
31
+ }
32
+ ]
33
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "carrier": "fedex-freight",
3
+ "entries": []
4
+ }
@@ -0,0 +1,14 @@
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 SAPX_ENDPOINT = "https://www.sapx.id/id/cek-awb/";
5
+ export declare class SapxTracker {
6
+ private readonly options;
7
+ constructor(options?: {
8
+ fetcher?: typeof fetch;
9
+ recorder?: StepRecorder;
10
+ userAgent?: string;
11
+ });
12
+ fetch(raw: string, context?: TrackingContext): Promise<CarrierResult>;
13
+ }
14
+ export declare const adapter: AdapterFactory;
@@ -0,0 +1,56 @@
1
+ import { accepted, recognizeFromLookup } from '../../core/adapter/index.js';
2
+ import { ChallengeError, IndeterminateError, 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 { normalizeSapxNumber, parseSapx, PROVIDER, SAPX_MAX_BYTES, sapxLookupNumber } from './parser.js';
8
+ // The tracker's result page for one resi, rendered on the server. The search
9
+ // form posts up to twenty numbers to `/id/cek-awb` and renders the same
10
+ // tables; this address needs no cookie, token, CAPTCHA or phone digits.
11
+ export const SAPX_ENDPOINT = 'https://www.sapx.id/id/cek-awb/';
12
+ const REDIRECTS = [301, 302, 303, 307, 308];
13
+ // A missing page is not a missing shipment: an unknown number gets a notice on the page.
14
+ const GONE = [404, 410];
15
+ export class SapxTracker {
16
+ options;
17
+ constructor(options = {}) {
18
+ this.options = options;
19
+ }
20
+ async fetch(raw, context = {}) {
21
+ const number = normalizeSapxNumber(raw);
22
+ const url = `${SAPX_ENDPOINT}${encodeURIComponent(sapxLookupNumber(number))}`;
23
+ const read = async (signal, timeoutMs) => {
24
+ const { response, bytes } = await fetchBounded(url, { method: 'GET', signal, headers: {
25
+ Accept: 'text/html,application/xhtml+xml', 'User-Agent': userAgentOf(this.options.userAgent),
26
+ } }, { provider: PROVIDER, timeoutMs: Math.max(1, Math.floor(timeoutMs)), maxBytes: SAPX_MAX_BYTES,
27
+ redirect: 'manual', allowHttpStatuses: [...REDIRECTS, ...GONE, 403], fetcher: this.options.fetcher });
28
+ if (REDIRECTS.includes(response.status))
29
+ throw new TransportError(PROVIDER, 'SAPX redirected its tracking page', { status: response.status });
30
+ if (GONE.includes(response.status))
31
+ throw new TransportError(PROVIDER, 'SAPX tracking page is unavailable', { status: response.status });
32
+ if (response.status === 403)
33
+ throw new ChallengeError(PROVIDER, 'SAPX refused the lookup', { status: 403 });
34
+ const html = decodeText(bytes);
35
+ if (!html.trim())
36
+ throw new IndeterminateError(PROVIDER, 'SAPX returned an empty page');
37
+ return parseSapx(html, number);
38
+ };
39
+ // A request that fails to reach SAPX, or hangs, gets one more try: the
40
+ // first gets half of the budget, so the retry fits in the rest. An HTTP
41
+ // status, a rate limit included, is never sent again.
42
+ return runSteps({ carrier: 'sapx-express', budgetMs: context.budgetMs ?? 15_000, signal: context.signal,
43
+ recorder: this.options.recorder ?? NOOP_RECORDER }, [
44
+ { id: 'direct', run: ({ signal, remainingMs }) => read(signal, firstAttemptMs(remainingMs)) },
45
+ networkRetryStep(({ signal, remainingMs }) => read(signal, remainingMs)),
46
+ ]);
47
+ }
48
+ }
49
+ export const adapter = (environment) => {
50
+ const tracker = new SapxTracker({ fetcher: environment.fetcher, recorder: environment.recorder, userAgent: environment.userAgent });
51
+ return {
52
+ id: 'sapx-express', recordsSteps: true, steps: ['direct', 'retry'],
53
+ track: (input, context) => tracker.fetch(input.number, context),
54
+ recognize: (number, context) => recognizeFromLookup(() => tracker.fetch(number, context), () => accepted(() => normalizeSapxNumber(number))),
55
+ };
56
+ };
@@ -19,18 +19,63 @@
19
19
  "timezone": "Asia/Jakarta",
20
20
  "tracking": {
21
21
  "mode": "automatic",
22
- "adapter": "universal",
23
- "steps": []
22
+ "adapter": "sapx-express",
23
+ "steps": [
24
+ "direct",
25
+ "retry"
26
+ ],
27
+ "recognition": {
28
+ "rank": 795
29
+ },
30
+ "localClocks": true
24
31
  },
25
- "capabilities": [],
32
+ "capabilities": [
33
+ "history",
34
+ "provider_code",
35
+ "location",
36
+ "service_name"
37
+ ],
26
38
  "portal": {
27
39
  "url": "https://www.sapx.id/id/cek-awb/{trackingNumber}",
28
40
  "searchUrl": "https://www.sapx.id/id/cek-awb",
29
41
  "canaryUrl": "https://www.sapx.id/id/cek-awb",
30
- "shows": [],
31
- "scraped": [],
32
- "discarded": [],
33
- "unavailable": []
42
+ "shows": [
43
+ "status",
44
+ "history",
45
+ "provider_code",
46
+ "location",
47
+ "service_name",
48
+ "failed_delivery_reason",
49
+ "origin",
50
+ "destination",
51
+ "signatory",
52
+ "driver_name",
53
+ "remarks"
54
+ ],
55
+ "scraped": [
56
+ "status",
57
+ "history",
58
+ "provider_code",
59
+ "location",
60
+ "service_name",
61
+ "failed_delivery_reason"
62
+ ],
63
+ "discarded": [
64
+ "origin",
65
+ "destination",
66
+ "signatory",
67
+ "driver_name",
68
+ "remarks"
69
+ ],
70
+ "unavailable": [
71
+ "eta",
72
+ "weight",
73
+ "delivered_at",
74
+ "offset_timestamps",
75
+ "proof_of_delivery",
76
+ "sender_name",
77
+ "recipient_address"
78
+ ]
34
79
  },
35
80
  "links": [
36
81
  {
@@ -174,7 +174,7 @@
174
174
  },
175
175
  {
176
176
  "number": "265370347094",
177
- "role": "shipment",
177
+ "role": "order_reference",
178
178
  "evidence": "public_shipment_report",
179
179
  "source": {
180
180
  "url": "https://mediakonsumen.com/2026/04/02/surat-pembaca/kartu-kredit-nex-bri-tidak-pernah-diantar-sap-express-malah-ubah-status-jadi-alamat-pindah-dan-diretur-ke-bank",
@@ -184,7 +184,8 @@
184
184
  },
185
185
  "quarantine": true,
186
186
  "context": {
187
- "assessment": "review"
187
+ "reportedRole": "resi",
188
+ "assessment": "auxiliary"
188
189
  },
189
190
  "expect": {
190
191
  "carrier": "unknown",
@@ -203,7 +204,7 @@
203
204
  "metropolitan-warehouse"
204
205
  ]
205
206
  },
206
- "note": "A Media Konsumen letter gives it as the SAP Express resi of a bank card delivery; twelve digits also fit a bank's own reference, so the attribution rests on the letter."
207
+ "note": "A Media Konsumen letter gives it as the SAP Express resi of a bank card delivery. SAPX's reference lookup finds the delivery's resi under it and the resi tracker does not take it, so it is the sender's reference."
207
208
  }
208
209
  ]
209
210
  }
@@ -0,0 +1,15 @@
1
+ import type { CarrierResult } from '../../core/result/index.js';
2
+ export declare const PROVIDER = "SAPX Express";
3
+ export declare const SAPX_MAX_BYTES: number;
4
+ /** A SAPX resi in capitals, as the tracker matches it; anything else is not one SAPX issues. */
5
+ export declare function normalizeSapxNumber(raw: string): string;
6
+ /** The form the tracker holds a number under: a Tokopedia booking code gets its dash back. */
7
+ export declare function sapxLookupNumber(raw: string): string;
8
+ /**
9
+ * The page `/id/cek-awb/{number}` renders for one resi: a table headed with
10
+ * the number it looked up and the service, origin, destination, status and
11
+ * receiver, then the events, newest first, each with a clock, a heading and a
12
+ * remark. A number it does not hold gets "Mohon Maaf Nomor Resi Anda Tidak
13
+ * Ditemukan." in place of both.
14
+ */
15
+ export declare function parseSapx(html: string, raw: string): CarrierResult;