# AfterShip vs. EasyPost vs. 17TRACK vs. TrackingMore vs. Ship24 vs. lastscanned (2026) URL: https://docs.lastscanned.com/aftership-vs-easypost-vs-17track-vs-lastscanned When evaluating a multi-carrier package tracking API in 2026, engineering and operations teams typically compare six platforms: **[lastscanned](https://lastscanned.com)**, **AfterShip**, **EasyPost**, **17TRACK**, **TrackingMore**, and **Ship24**. Most legacy tracking APIs were architected around asynchronous background queues: you `POST` a tracking number to register a tracker in their database, receive an empty `PENDING` response, and wait seconds or minutes for an inbound webhook before your application knows where the parcel is. Even when you only want to answer a customer's live *"Where is my order?"* question in a chat widget or AI agent, you are forced to manage state and pay enterprise monthly minimums. `lastscanned` combines **both models in one API** across **[549 carriers](https://docs.lastscanned.com/carriers)**: 1. **Synchronous single-`GET` lookups** (`GET /v1/track/:number` and batch `GET /v1/track?numbers=...`) that return the normalized status and full chronological scan history immediately in the HTTP response. 2. **Push [Watches and Webhooks](https://docs.lastscanned.com/webhooks)** (`POST /v1/watches`) that **also return the live tracking result immediately in the creation response**, then automatically re-check the parcel on an adaptive schedule (`15 min` when `out_for_delivery`, `30 min` on `exception`, `1 hr` in transit, `2 hr` on `label_created`) and send signed webhook events (`tracking.updated`, `watch.ended`) in either `lastscanned`'s native JSON format or **drop-in 17TRACK v2 webhook format** (`"format": "17track"`). --- ## 2026 Multi-Carrier Tracking API Comparison Matrix | Feature / Dimension | **lastscanned** | **AfterShip** | **EasyPost** | **17TRACK** | **TrackingMore** | **Ship24** | |---|---|---|---|---|---|---| | **Supported carriers** | **[549 carriers](https://docs.lastscanned.com/carriers)** | ~1,100+ listed (many require shipper credentials) | ~100+ (primarily label-generation carriers) | ~2,400+ listed | ~1,200+ listed | ~1,500+ listed | | **Synchronous single-`GET` lookup (`GET /v1/track/:number`)** | **Yes** — live normalized result in one HTTP call | **No** — requires async `POST` tracker creation first | **Partial** — `POST /v2/trackers` creates a tracker object | **No** — requires async `register` call + queue wait | **Partial** — realtime endpoint throttled / higher tier | **Paid plan** — Per-Call `POST /tracking/search` from `$99/mo`, can block about a minute | | **Push Webhooks (`POST /v1/watches` & Web UI Dashboard)** | **Yes** — returns live `result` immediately on `POST` (or paste up to 100 numbers in [`app.lastscanned.com/watches`](https://app.lastscanned.com/watches)), plus free scheduled re-checks & HMAC-SHA256 webhooks | **Yes** — async queue (initial response has empty events) | **Yes** — tied to `trk_...` object creation | **Yes** — async queue (`TRACKING_UPDATED`) | **Yes** — async queue | **Yes** — async queue | | **Drop-in 17TRACK v2 webhook compatibility** | **Built-in (`"format": "17track"` toggle in [Webhooks Dashboard](https://app.lastscanned.com/webhooks) or API + `sign` header)** | No | No | Native | No | No | | **Entry API plan with full REST + Webhook + MCP access** | **$0/mo Free** (5 numbers/day + 1 keyless lookup/day per IP) | **$59/mo Premium** (API excluded on `$29/mo` Essentials) | **$0.01–$0.03/tracker** (plus `$0.08/label` over 3k/mo & `3.75%` card top-up fee) | **200 free once**, then prepaid quota (price not verified) | **$11/mo Basic** (limited quota) or **$74/mo Pro** | **$0 Free** (10 shipments/mo), then **$39/mo** (async) or **$99/mo** (sync); All-in-One Free/Essential have no API | | **Cost for 1,000 unique packages / month** | **$4.99 / month** ([Pro](https://docs.lastscanned.com/plans)) | **$59.00 / month** (Premium) | **$20.00 / month** (`$0.02`/tracker) | Prepaid quota (current price not verified) | **$39.00 – $74.00 / month** | **$39.00 / month** (or `$99/mo` per-call) | | **Overage rate above 1,000 packages** | **$0.015** per extra unique tracking number | **$0.12** per shipment on Premium ($0.08 on Essentials, which has no API) | **$0.01–$0.03** per tracker | Tier upgrade required | **$0.04** per shipment | **$0.045 / $0.030 / $0.025** per shipment; **$0.015 / $0.012** per call | | **Cost of re-polling or watching an active package** | **$0** (unlimited re-polls & scheduled watch checks included on Pro) | Included after registration | Included on tracker object | Included after registration | Included after registration | **Charged per call** on `$99/mo` per-call plan | | **Failed / upstream carrier timeout billing** | **Always $0** (only `200` result or confirmed `404` counts) | Consumes quota on registration | Charged on tracker creation | Consumes quota on registration | Consumes quota on registration | Credit spent on `POST /trackers`, even if `pending` / `parcel_not_found` | | **Native Remote MCP Server** | **`https://mcp.lastscanned.com/mcp`** (Streamable HTTP) | None native | None native | Community stdio wrappers only | None native | `api.ship24.com/mcp`, paid `apik_…` key only (`401` without) | | **Keyless AI Agent Payments (`HTTP 402` Stripe MPP)** | **Yes** (`$0.50` / 25-number card pack or `$0.02` USDC on Tempo or Solana) | No | No | No | No | No | | **Storefront widget footprint** | **Zero third-party trackers, zero ads, clean ``** | Heavy post-purchase iframe / upsell scripts | None (developer-only) | Ad-heavy public pages & multi-script embeds | Branded portal iframe | Branded portal iframe | --- ## Where Each Platform Wins (and Where Teams Switch to `lastscanned`) ### 1. AfterShip vs. `lastscanned` - **Why teams run into friction with AfterShip:** AfterShip restricts REST API and webhook access to its **$59/month Premium tier** (and higher enterprise tiers), with **$0.12/shipment** overages beyond 6,000 shipments a year. Every tracking lookup requires creating a persistent tracker resource first, which returns an empty event list until AfterShip's background crawler finishes polling the carrier. - **Why developers switch to `lastscanned`:** With `lastscanned`, `GET /v1/track/:number` returns the live carrier timeline synchronously in a single request, and `POST /v1/watches` returns that exact same live result on creation while scheduling automatic background re-checks at no extra charge. At **$4.99/month for 1,000 unique tracking numbers** (`$0.015` per additional number), `lastscanned` cuts monthly tracking API spend by over **90%** for growing merchants and SaaS tools. ### 2. EasyPost vs. `lastscanned` - **Why teams run into friction with EasyPost:** Following EasyPost's February 2026 pricing update, merchants face **$0.08 per shipping label** above 3,000 labels/month, a **3.75% credit card wallet top-up fee** (or 0.50% ACH fee), and **$0.01–$0.03 per standalone tracking number**. Worse, EasyPost's carrier coverage is focused on traditional label-generation carriers, leaving major blind spots across cross-border consolidators (`Yanwen`, `4PX`, `Cainiao`, `YunExpress`, `CNE`, `SunYou`) and regional last-mile couriers (`UniUni`, `SpeedX`, `GOFO`, `Better Trucks`). - **Why developers switch to `lastscanned`:** Even if you buy labels through Pirate Ship, Shippo, or EasyPost, pointing your post-purchase tracking and WISMO AI agents at `lastscanned` gives you **549 carriers**, automatic cross-border last-mile handoff extraction (`"Handed to UniUni as UUS5BM1269395824723"`), and predictable unique-number billing without wallet top-up fees. See our full **[Pirate Ship vs. Shippo vs. EasyPost vs. Shopify Shipping (2026)](https://docs.lastscanned.com/pirate-ship-vs-shippo-vs-easypost-vs-shopify-shipping)** breakdown. ### 3. 17TRACK vs. `lastscanned` - **Why teams run into friction with 17TRACK:** 17TRACK's API requires calling `/track/v2.2/register` before querying `/gettrackinfo`, meaning your first call for an unregistered number returns zero scan events. On the storefront side, linking customers to 17TRACK exposes them to third-party display ads, while 17TRACK's numeric carrier codes (`100003`, `21051`, `190094`) require maintaining a separate lookup table. - **Zero-rewrite migration to `lastscanned`:** `lastscanned` supports 17TRACK's exact webhook payload and signature verification out of the box. Run: ```bash curl -X PUT https://api.lastscanned.com/v1/webhook \ -H "Authorization: Bearer $LASTSCANNED_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/hooks/tracking", "format": "17track"}' ``` Every watch update arrives as `TRACKING_UPDATED` with 17TRACK's `track_info` object and `sign` header (`sha256(rawBody + "/" + secret)`), while `POST /v1/watches` gives you the first tracking result synchronously in the response. See **[Migrating from 17TRACK](https://docs.lastscanned.com/migrate-from-17track)** for the complete side-by-side mapping. ### 4. TrackingMore & Ship24 vs. `lastscanned` - **Why teams run into friction with TrackingMore and Ship24:** Ship24 splits its pricing between an asynchronous per-shipment plan (`$39/mo`) and a synchronous per-call plan (**`$99/mo`**), where every poll spends a call: polling 1,000 parcels 40 times over a 7-day transit is 40,000 calls, or `$349/mo`, versus `$4.99/mo` on `lastscanned` Pro. Per-Shipment credits are spent on `POST /trackers` even when the tracker stays `pending`, and webhooks authenticate with one static Bearer secret rather than a per-message signature. TrackingMore's lower tiers restrict real-time synchronous endpoints and webhook throughput. - **Why developers switch to `lastscanned`:** On `lastscanned` Pro (`$4.99/mo`), **every lookup is synchronous**, **every re-poll of the same tracking number within your billing period is free**, and **watching a number via `POST /v1/watches` counts as just one unique number** regardless of how many background re-checks (`15 min` to `2 hr` intervals) occur until delivery. --- ## Code Comparison: Synchronous `GET` + Instant-Result `Watches` ```ts // 1. On-demand synchronous lookup (WISMO chatbot, order status page, CLI) const res = await fetch("https://api.lastscanned.com/v1/track/1Z54V8630394427740", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.carrier, pkg.status, pkg.estimatedDelivery); // 2. Create a background Watch (returns the live result immediately AND pushes webhooks on change) const watchRes = await fetch("https://api.lastscanned.com/v1/watches", { method: "POST", headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ trackingNumber: "UUS5BM1269395824723", metadata: { orderId: "ORD-90412", customerEmail: "buyer@example.com" }, }), }); const watch = await watchRes.json(); // watch.result -> immediate normalized TrackingResult (no waiting for a first webhook!) // Subsequent status changes POST signed `tracking.updated` events to your webhook URL for free. ``` --- ## Related Documentation & Tools - **[Watches and Webhooks (`/v1/watches` & `/v1/webhook`)](https://docs.lastscanned.com/webhooks)**: Adaptive check intervals, HMAC-SHA256 signature verification, and 17TRACK v2 compatibility mode. - **[Migrating from 17TRACK](https://docs.lastscanned.com/migrate-from-17track)**: Drop-in webhook and status mapping guide. - **[Regional & Cross-Border Carrier Tracking API Guide](https://docs.lastscanned.com/regional-carrier-tracking-api-uniuni-speedx-veho-gofo-ontrac)**: Technical reference for UniUni, SpeedX, Veho, GOFO, OnTrac, Yanwen, 4PX, Cainiao, and YunExpress. - **[2026 Carrier Surcharges & Rate Guide](https://docs.lastscanned.com/shipping-rates-and-surcharges-2026)**: Complete 2026 UPS, FedEx, USPS Ground Advantage Cubic, and regional carrier landed cost matrix. - **[Pirate Ship vs. Shippo vs. EasyPost vs. Shopify Shipping (2026)](https://docs.lastscanned.com/pirate-ship-vs-shippo-vs-easypost-vs-shopify-shipping)**: Label platform fee and surcharge pass-through comparison. # AI Agent Package Tracking via MCP & Keyless HTTP 402 Stripe MPP (2026) URL: https://docs.lastscanned.com/ai-agent-package-tracking-mcp-and-mpp Large language models and autonomous customer support agents (Claude, ChatGPT, Cursor, Gorgias AI, Zendesk AI, Ritzer AI, LangChain, Mastra, and Vercel AI SDK agents) cannot inspect live package status on their own—and calling carrier tracking pages directly from cloud/serverless environments fails immediately with `403 Forbidden` (Akamai Bot Manager on UPS, FedEx, and USPS; Firebase App Check on Veho; proof-of-work challenges on Sendle). **[lastscanned](https://lastscanned.com)** gives AI agents native, deterministic access to **[549 global carriers](https://docs.lastscanned.com/carriers)** through two purpose-built protocols: 1. **Remote Model Context Protocol (MCP) Server (`https://mcp.lastscanned.com/mcp`)**: A stateless Streamable HTTP MCP endpoint exposing `track_package`, `track_packages` (up to 100 numbers per call), `get_rates` (USPS, UPS and FedEx quotes between two US ZIP codes; quotes only, nothing is bought), and `list_carriers`. Works immediately with zero API key (1 free lookup/day and 5 free rate quotes/day per IP, `list_carriers` always free), a standard `lsk_live_...` key, or an `lsk_pack_...` credit token. 2. **Keyless HTTP 402 Machine Payments Protocol (Stripe MPP)**: Autonomous agents without an account or API key can call `GET https://api.lastscanned.com/v1/track/{trackingNumber}`, receive a standard `HTTP 402 Payment Required` (`WWW-Authenticate: Payment`) challenge, and pay **$0.02 per tracking number in USDC on Tempo (`tempo/charge`) or Solana (`solana/charge`; you pay the network fee in SOL)** or **$0.50 by card (`stripe/charge`) for a 25-lookup reusable credit pack (`lsk_pack_...`)**. A rate quote costs the same $0.02. --- ## Protocol Overview: When to Use MCP vs. REST API vs. HTTP 402 MPP | Integration Path | Endpoint | Auth / Payment Mechanism | Best For | |---|---|---|---| | **Remote MCP (Authenticated)** | `https://mcp.lastscanned.com/mcp` | `Authorization: Bearer lsk_live_...` (Free tier: 5/day · Pro: `$4.99/mo` for 1,000 unique numbers) | Production WISMO support agents, Claude Code, Cursor, ChatGPT Developer Mode, Windsurf, internal ops bots | | **Remote MCP (Keyless Trial)** | `https://mcp.lastscanned.com/mcp` | None required | Instant zero-signup testing (`1` free `track_package` lookup/day per IP; unlimited `list_carriers`) | | **REST API + Push Watches** | `GET /v1/track/:number` & `POST /v1/watches` | `Authorization: Bearer lsk_live_...` | Custom tool-calling agents (OpenAI `tools`, Anthropic `tool_use`, Vercel AI SDK, LangChain) & proactive webhook triggers | | **Keyless HTTP 402 Stripe MPP** | `GET https://api.lastscanned.com/v1/track/:number` | `WWW-Authenticate: Payment` ([mpp.dev](https://mpp.dev)): `$0.02` USDC on Tempo (`tempo/charge`) or Solana (`solana/charge`; you pay the network fee in SOL), or `$0.50` / 25-number Stripe card pack (`stripe/charge`) | Autonomous agents with an MPP wallet (for example, a Stripe Link agent wallet, or a wallet that pays USDC on Tempo or Solana) operating without human signup | --- ## 1. Connecting Any MCP Client to `https://mcp.lastscanned.com/mcp` `https://mcp.lastscanned.com/mcp` speaks stateless **Streamable HTTP** (`POST` JSON-RPC 2.0 requests returning plain JSON responses—no fragile SSE session state to drop). Discovery metadata is published at `https://mcp.lastscanned.com/.well-known/mcp.json`. ### Claude Code, Cursor, VS Code & ChatGPT Setup ```bash # Claude Code (with API key or MPP lsk_pack_ credit token) claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp \ --header "Authorization: Bearer lsk_live_YOUR_API_KEY" # Claude Code (keyless — 1 free lookup/day + unlimited list_carriers) claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp ``` Claude and ChatGPT connectors (including **ChatGPT Developer Mode**) sign in with OAuth instead of a key: add `https://mcp.lastscanned.com/mcp` as a custom connector, then sign in to lastscanned and choose Allow. Keys go in the `Authorization` header only, never in the URL. ### MCP Tool Signatures | Tool Name | Input Schema | Output | |---|---|---| | `track_package` | `{ "tracking_number": string, "carrier"?: string }` | Normalized `TrackingResult` JSON (`carrier`, `status`, `estimatedDelivery`, `signedBy`, `message`, chronological `events[]`) | | `track_packages` | `{ "tracking_numbers": string[], "carrier"?: string }` (up to 100 numbers, max 35 per carrier) | `{ "results": Array<{ "trackingNumber", "carrier", "result" \| "error" }> }` | | `get_rates` | `{ "from": string, "to": string, "weight": number, "weight_unit"?: "lb" \| "oz" \| "kg" \| "g", "residential"?: boolean, "length"?, "width"?, "height"?: number, "carriers"?: string[] }` (US ZIP codes) | `{ "quotes": Array<{ "carrier", "service", "amount", "rateType", "source", "deliveryDays" }>, "cheapest", "fastest", "errors" }` | | `list_carriers` | `{}` | All 549 carrier slugs, display names, categories, and example tracking numbers | --- ## 2. Autonomous Keyless Payments via HTTP 402 (Stripe MPP, Tempo USDC, and Solana USDC) When an autonomous agent calls `GET https://api.lastscanned.com/v1/track/{trackingNumber}` without an `Authorization` header (after the IP's 1 free daily lookup is used, or on any batch `GET /v1/track?numbers=...` call), `lastscanned` responds with `HTTP 402 Payment Required` and a machine-readable `WWW-Authenticate: Payment` header ([mpp.dev](https://mpp.dev), OpenAPI discovery at [`https://api.lastscanned.com/openapi.json`](https://api.lastscanned.com/openapi.json)): 1. **2-cent stablecoin rail (`tempo/charge` or `solana/charge`)**: The agent pays **$0.02 per tracking number** in USDC on Tempo or Solana and retries the request with `Authorization: Payment `. On Solana you pay the network fee in SOL. A rate quote costs the same $0.02. 2. **$0.50 Card Credit Pack Rail (`stripe/charge`)**: The agent pays **$0.50** using a Stripe Shared Payment Token (for example, from [Link's agent wallet](https://link.com/agents)) and receives **25 tracking number lookups**. - If the request looked up 1 tracking number, the remaining **24 lookups** are returned in the `x-lastscanned-key` response header (`lsk_pack_<32hex>`) and the JSON body: ```json { "trackingNumber": "1Z54V8630394427740", "carrier": "ups", "status": "delivered", "events": [ "..." ], "credits": { "key": "lsk_pack_9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c", "remaining": 24 } } ``` - The agent can pass `Authorization: Bearer lsk_pack_...` on subsequent `GET /v1/track` or `https://mcp.lastscanned.com/mcp` requests until all 25 lookups are used. - **Zero charge on carrier failures**: Only lookups where the carrier returns a tracking result (`200`) or confirms `not_found` (`404`) deduct a credit. Upstream carrier errors (`502 carrier_error`) or invalid formats never spend credits. --- ## 3. Giving OpenAI, Anthropic, LangChain & Vercel AI SDK Agents Live Tracking Tools If your agent framework uses native function/tool calling instead of MCP, wire `GET /v1/track/:number` directly as a tool. Because `lastscanned` auto-detects formats across 549 carriers and extracts cross-border handoff numbers into `message`, your tool function can automatically resolve both the origin waybill and the domestic last-mile courier in one turn: ```ts export async function trackOrderForAgent(trackingNumber: string, carrier?: string) { const url = new URL(`https://api.lastscanned.com/v1/track/${encodeURIComponent(trackingNumber)}`); if (carrier) url.searchParams.set("carrier", carrier); const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const data = await res.json(); // If a cross-border consolidator (Yanwen, 4PX, Cainiao, YunExpress) handed off to a local courier // (e.g. "Handed to UniUni as UUS5BM1269395824723"), fetch the local courier's live scans automatically: const handoff = data.message?.match(/Handed to .+ as ([A-Z0-9]{8,34})/i); if (handoff && data.status !== "delivered") { const localRes = await fetch( `https://api.lastscanned.com/v1/track/${encodeURIComponent(handoff[1])}`, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` } }, ); if (localRes.ok) { data.lastMileResult = await localRes.json(); } } return data; } ``` Want a ready-to-paste system prompt and JSON tool schema tailored to your exact carrier mix (`USPS`, `UPS`, `FedEx`, `UniUni`, `SpeedX`, `Veho`, `GOFO`, `OnTrac`, `Yanwen`, `4PX`)? Use the interactive **[WISMO AI Agent Prompt & Tool-Schema Builder](https://lastscanned.com/tools/wismo-ai-agent-builder)**. --- ## Related Documentation & Tools - **[MCP Server Reference (`https://mcp.lastscanned.com/mcp`)](https://docs.lastscanned.com/mcp)** - **[Authentication & HTTP 402 Stripe MPP](https://docs.lastscanned.com/authentication)** - **[WISMO AI Agents & Synchronous Tracking Guide](https://docs.lastscanned.com/wismo)** - **[Watches and Webhooks (`POST /v1/watches`)](https://docs.lastscanned.com/webhooks)** - **[Interactive MCP Config Generator](https://lastscanned.com/tools/mcp-config-generator)** # Authentication URL: https://docs.lastscanned.com/authentication Send your key in either header: ```http Authorization: Bearer lsk_live_… x-api-key: lsk_live_… ``` Every `/v1/*` route needs a key except `GET /v1/carriers`. ## Without a key `GET /v1/track/{trackingNumber}` works once a day without a key, per IP address, to try the API. A malformed number, a failure on our side, or a `not_found` (up to 5 a day) doesn't use it up. Requests from cloud and hosting networks (AWS, Google Cloud, Azure, Alibaba Cloud, Cloudflare Workers and the like) don't get it: use a free key there. After that: ```json { "error": { "code": "payment_required", "message": "You've used today's free lookup. Pay with MPP (see the WWW-Authenticate header): $0.50 by card for 25 tracking numbers. Or sign up at https://app.lastscanned.com for 5 free lookups a day.", "lookup_url": "https://lastscanned.com/lookup?number=1Z999AA10123456784&autorun=1" } } ``` `lookup_url` is the same lookup as a web page, for a person rather than a program: an assistant helping someone track a parcel can hand it over, and on that page they can buy a pack of 50 lookups for $1 by card, with no account. Opening an API tracking URL in a browser goes to that page too. ## Pay per request Agents can pay instead of signing up, with [MPP](https://mpp.dev). A tracking request without a key (once the free lookup is used, and always for `GET /v1/track?numbers=`) answers `402 Payment Required` with a `WWW-Authenticate: Payment` challenge. Pay and retry with `Authorization: Payment …`; any MPP client does this for you. | Pay with | Price | |---|---| | A card, as a shared payment token (`stripe/charge`, e.g. from [Link's agent wallet](https://link.com/agents)) | $0.50 for 25 tracking numbers | | Stablecoins (USDC on Tempo, `tempo/charge`, or Solana, `solana/charge`) | 2 cents per tracking number, and 2 cents per rate quote | On Solana you pay the network fee in SOL. The paid request spends what it looks up, and only if it gets an answer (a result, or the carrier saying it has no such number). What's left comes back as a credit key, in the `x-lastscanned-key` header and a `credits` field: ```json { "carrier": "ups", "status": "in_transit", "…": "…", "credits": { "key": "lsk_pack_…", "remaining": 24 } } ``` Send it like an API key on later tracking requests. Each response has `x-lastscanned-credits` with what's left. Credit keys work only for `/v1/track`; when one runs out you get `402` `credits_used`, and a request without the key pays again. Paid routes and prices are also listed at `https://api.lastscanned.com/openapi.json`. ## Keys - A key is `lsk_live_` followed by 32 hex characters. - It is shown once, when it is made. Only a hash is stored, so a lost key can't be recovered; make a new one. - Create and revoke keys in the [dashboard](https://app.lastscanned.com/keys), or with [`POST /v1/keys`](https://docs.lastscanned.com/reference/account/createKey) and [`DELETE /v1/keys/{prefix}`](https://docs.lastscanned.com/reference/account/revokeKey). The prefix is `lsk_live_` plus the key's first 8 hex characters, e.g. `lsk_live_1a2b3c4d`. - All keys on an account share its usage and limits. Call the API from your server. It sends no CORS headers, so browsers can't call it directly, and a key in front-end code is a leaked key. ## 401 Unauthorized ```json { "error": { "code": "unauthorized", "message": "Invalid API key" } } ``` Returned for a missing, malformed or revoked key, or a disabled account. # Bulk Package Tracking, CSV Export & Batch Tracking API (25 to 10,000+ Shipments) URL: https://docs.lastscanned.com/bulk-package-tracking-csv-and-batch-api Operations managers, 3PL teams, e-commerce fulfillment leads, and freight audit analysts frequently need to check **25, 100, or 10,000+ tracking numbers at once**—whether auditing weekly carrier SLAs, resolving a backlog of open orders, or monitoring in-transit shipments across multiple carriers. With **[lastscanned](https://lastscanned.com)**, you can run bulk package tracking **without writing a single line of code** in our Web UI, or automate batch lookups programmatically via `GET /v1/track?numbers=...` and `POST /v1/watches`. --- ## 4 Ways to Track Shipments in Bulk | Workflow | Best For | Max Numbers per Action | Exports & Alerts | Link / Endpoint | |---|---|---|---|---| | **1. Web UI Dashboard Watches (No Code)** | Ongoing monitoring of active open orders with automatic background polling | Paste up to **100 tracking numbers** per batch (unlimited batches) | Live status table (`pending`, `in_transit`, `out_for_delivery`, `delivered`, `exception`), carrier/label overrides, optional Webhook push | **[`app.lastscanned.com/watches`](https://app.lastscanned.com/watches)** | | **2. Bulk Tracking CSV & SLA Auditor (No Code)** | One-off spreadsheet audits, carrier SLA checks, and CSV exports | Paste multi-line tracking numbers (`tracking_number` or `carrier,tracking_number`) | One-click **CSV Export** (`carrier`, `status`, `sub_status`, `origin`, `destination`, `transit_days`, `delivered_at`, `last_event`) | **[`/tools/bulk-tracking-auditor`](https://lastscanned.com/tools/bulk-tracking-auditor)** | | **3. Instant 25-Number Credit Pack (`$0.50`)** | Ad-hoc batch checks with zero monthly subscription | **25 live lookups** per `$0.50` pack (`lsk_pack_...` token issued immediately after Stripe checkout) | Works across Web UI tools, `GET /v1/track`, and MCP | **[`/lookup`](https://lastscanned.com/lookup)** | | **4. Synchronous Batch API (`GET /v1/track?numbers=...`)** | ERP, WMS, OMS, and scheduled cron jobs | Up to **25 comma-separated numbers** per HTTP call (parallelizable to 10,000+ numbers) | Normalized JSON array with full `events[]`, `origin`, `destination`, and `subStatus` | **`GET https://api.lastscanned.com/v1/track?numbers=...`** | --- ## 1. No-Code Ongoing Bulk Monitoring: Web UI Dashboard Watches (`app.lastscanned.com/watches`) If your operations or support team wants to paste a list of open tracking numbers and watch them move to `delivered` or `exception` without writing code: 1. Sign in at **[`app.lastscanned.com/watches`](https://app.lastscanned.com/watches)**. 2. Paste up to **100 tracking numbers** into the **Add watches** box (one per line or comma-separated): ```text 9400111899223847162534 1Z9999999999999999 UUS5CN5366140981990 LP00592148291048 817817302 ``` 3. *(Optional)* Select a specific **carrier** (for example `UniUni`, `SpeedX`, `Yanwen`, `XPO LTL`, or `Central Transport`) or leave it on **Auto-detect**, and attach an order **label** (e.g., `"May Wholesale Batch #4"`). 4. Click **Watch**. Every tracking number is queried immediately so its current status (`in_transit`, `out_for_delivery`, `delivered`, `exception`), latest checkpoint description, and location populate right away in your dashboard table. 5. `lastscanned` automatically re-checks every active watch on an adaptive schedule (**every 15 minutes** when `out_for_delivery`, **every 30 minutes** on `exception`, and **every 1 hour** while `in_transit`) and stops automatically once `delivered`. 6. Need Slack, ERP, or helpdesk alerts? Add a webhook URL in **[`app.lastscanned.com/webhooks`](https://app.lastscanned.com/webhooks)** to receive HMAC-SHA256 signed `tracking.updated` events whenever any watched shipment changes status. --- ## 2. No-Code Spreadsheet & SLA Auditing: Bulk Tracking CSV Auditor (`/tools/bulk-tracking-auditor`) When finance or fulfillment teams need to audit a spreadsheet of tracking numbers and export a clean CSV with transit times and delivery timestamps: 1. Open the **[Bulk Tracking CSV & SLA Auditor (`lastscanned.com/tools/bulk-tracking-auditor`)](https://lastscanned.com/tools/bulk-tracking-auditor)**. 2. Paste your tracking numbers (one per line, or `carrier,tracking_number` such as `saia,77136436530`), or click **Load Multi-Carrier Audit Sample**. 3. Enter your `lsk_live_...` API key or a `$0.50` credit pack token (`lsk_pack_...`) for live carrier lookups. 4. Review the summary KPIs (**Delivered on Time**, **In Transit**, **Exceptions / Action Required**, and **Average Transit Days**) and click **Export CSV** to download a spreadsheet ready for Excel, Google Sheets, or chargeback/SLA claims. --- ## 3. Programmatic Batch API (`GET /v1/track?numbers=...`) For developers and data pipelines, `GET /v1/track` accepts up to **25 comma-separated tracking numbers** in a single request and fans them out in parallel across all 549 carriers: ```bash curl -s "https://api.lastscanned.com/v1/track?numbers=9400111899223847162534,1Z9999999999999999,UUS5CN5366140981990,SPXSG039323029482,4007854296017911" \ -H "Authorization: Bearer $LASTSCANNED_KEY" ``` ### Python Script: Convert a 5,000-Row CSV into Enriched Tracking Results ```python import csv import requests API_KEY = "lsk_live_..." BATCH_SIZE = 25 def chunked(iterable, size): for i in range(0, len(iterable), size): yield iterable[i:i + size] with open("shipments_in.csv", newline="") as f_in, open("shipments_out.csv", "w", newline="") as f_out: reader = csv.DictReader(f_in) writer = csv.writer(f_out) writer.writerow(["tracking_number", "carrier", "status", "sub_status", "delivered_at", "latest_checkpoint", "latest_location"]) rows = [r["tracking_number"].strip() for r in reader if r.get("tracking_number")] for batch in chunked(rows, BATCH_SIZE): resp = requests.get( "https://api.lastscanned.com/v1/track", params={"numbers": ",".join(batch)}, headers={"Authorization": f"Bearer {API_KEY}"}, timeout=30, ) resp.raise_for_status() data = resp.json() results = data if isinstance(data, list) else data.get("results", [data]) for item in results: events = item.get("events") or [] latest = events[0] if events else {} loc = latest.get("location") or {} loc_str = ", ".join(filter(None, [loc.get("city"), loc.get("state"), loc.get("country")])) writer.writerow([ item.get("trackingNumber"), item.get("carrier"), item.get("status"), item.get("subStatus"), item.get("deliveredAt"), latest.get("description"), loc_str, ]) ``` --- ## Transparent Bulk Pricing | Tier | Price | Included Live Lookups | Overages | Best For | |---|---|---|---|---| | **Sandbox / Preview** | **$0** | Unlimited zero-cost sample previews (`lastscanned.com/lookup`) | $0 | Testing UI & schema normalization | | **Keyless** | **$0** | 1 lookup / day per IP | Then `HTTP 402` Stripe MPP: $0.50 by card for a 25-number `lsk_pack_` credit pack, or $0.02 / number in USDC on Tempo or Solana | Autonomous AI agents & headless CLI scripts | | **Free** | **$0 / month** | 5 tracking numbers / day (every lookup counts, resets 00:00 UTC) | Upgrade to Pro | Testing & small stores | | **Pro Plan** | **$4.99 / month** | **1,000 unique tracking numbers / billing period**, no daily limit | **$0.015 / additional unique number**; re-polls and scheduled watch checks are free | Daily Web UI Dashboard Watches, webhooks & production APIs | --- ## Related Guides & Tools - **[Web UI Dashboard Watches (`app.lastscanned.com/watches`)](https://app.lastscanned.com/watches)** - **[Bulk Tracking CSV & SLA Auditor (`lastscanned.com/tools/bulk-tracking-auditor`)](https://lastscanned.com/tools/bulk-tracking-auditor)** - **[Batch Tracking JSON Tester (`lastscanned.com/tools/batch-tracking-tester`)](https://lastscanned.com/tools/batch-tracking-tester)** - **[Watches and Webhooks Guide (`/webhooks`)](https://docs.lastscanned.com/webhooks)** # Carriers URL: https://docs.lastscanned.com/carriers ## Carrier ids `GET /v1/carriers` lists all 549 supported carrier slugs. No key needed. ```bash curl https://api.lastscanned.com/v1/carriers ``` ```json { "carriers": ["ups", "usps", "dhl", "fedex", "amazon", "ontrac", "uniuni", "gofo", "veho", "speedee", "cdl", "bettertrucks", "axlehire", "cirro", "yanwen", "4px", "cainiao", "yunexpress", "speedx", "intelcom", "canadapost", "purolator", "tforce", "glsus", "osm", "pitneybowes", "cne", "sunyou", "ubi", "sendle", "asendia", "japanpost", "singpost", "koreapost", "nzpost", "dpduk", "apc", "landmark", "canpar", "loomis", "glscanada", "nationex", "bpost", "postnord", "austrianpost", "polishpost", "gls", "inpost", "packeta", "hermesde", "ydh", "equick", "topyou", "laposte", "postnl", "correos", "posteitaliane", "cjlogistics", "yamato", "delhivery", "bluedart", "evri", "anpost", "swisspost", "brt", "aramexau", "couriersplease", "teamglobalexpress", "ninjavan", "flashexpress", "icscourier", "chitchats", "passport", "epostglobal", "jyexpress", "sagawa", "aramex", "tcat", "hanjin", "lotte", "logen", "shadowfax", "sfc", "anjun", "winit", "nzcouriers", "posthaste", "castleparcels", "gaopost", "yfexpress", "gdwse", "chronopost", "bring", "posti", "ceskaposta", "ctt", "seur", "novaposhta", "sameday", "fancourier", "econt", "meest", "yurtici", "paquetexpress", "andreani", "thecourierguy", "postnet", "minutos99", "mainfreight", "yto", "spl", "kex", "posmalaysia", "gdex", "citylink", "lbc", "dhlecommerce", "dhlparcelnl", "dhlparceles", "dhlparcelpl", "dhlecommerceuk", "dhlfreight", "dhlink", "xqexpress", "alibusiness", "omniva", "ukrposhta", "speedy", "dpdro", "dpdpl", "dpd", "dpdpt", "thailandpost", "chunghwapost", "ems", "elta", "estafeta", "totalexpress", "sagawaglobal", "mrw", "nacex", "huahan", "chukou1", "ztointl", "sto", "oca", "ocasa", "coordinadora", "hct", "starken", "hunterexpress", "aras", "smsa", "naqel", "asusexp", "bdtpost", "byhd", "byt", "chengda", "chunhong", "cyexpress", "dhfex", "edlexpress", "edpost", "etscp", "fuhai618", "fujexp", "galaxyex", "gdasgyl", "gzbtygj", "gzymyt", "hlsz56", "hoyang", "hpgjwl", "hsdex", "hzjtex", "hzpdex", "jhgj", "jiudt", "leiyi", "lingdong", "mayiyinfu", "miuson", "pingda56", "pyexpress", "qfl", "qyexp", "qyun", "shangfang", "shsgexp", "starglobal", "sztdgyl", "thhy", "usky", "wmycc", "xsexp", "yanjin", "yilong", "yincag", "eshun", "acscourier", "airpakexpress", "allegroone", "anteraja", "aymakan", "cargus", "cdek", "correosexpress", "cttexpress", "daipost", "ecms", "ecoscooting", "geis", "jeebly", "mngkargo", "northline", "novaglobal", "omgo", "pakistanpost", "paperfly", "pathao", "phlpost", "planzer", "posindonesia", "postashqiptare", "postaslovenije", "postex", "posturinn", "procarrier", "ptsexpress", "quantium", "qwintry", "redur", "redx", "sapo", "seino", "sendex", "sending", "serpost", "servientrega", "shipa", "shipentegra", "shreemaruti", "skynetworldwide", "skypostal", "speedaf", "speedpak", "springgds", "sps", "spxid", "spxmy", "spxph", "spxth", "spxvn", "stallionexpress", "starex", "stcourier", "straightship", "swisspostcargo", "tipsa", "tmmexpress", "tnt", "toptrans", "tracxlogis", "twsexpress", "urvaam", "valmo", "vaspexpresso", "venipak", "vintedgo", "vozovoz", "zeleris", "zrexpress"] } ``` ## Detected formats & per-carrier API references ✓ marks formats that must also pass a check digit. Looser formats (`mayMatch`) are used only when no other carrier claims the number in Pass 1. Anything else needs `?carrier=`. Select a carrier below for its REST & MCP reference, regex rules, and normalized JSON sample. | Carrier | `id` | Detected formats (`matches`) | Looser formats (`mayMatch`) | Live tool | |---|---|---|---|---| | [UPS](https://docs.lastscanned.com/carriers/ups) | `ups` | `1Z` + 16 letters/digits ✓ | | [Track UPS](https://lastscanned.com/lookup/ups) | | [USPS](https://docs.lastscanned.com/carriers/usps) | `usps` | 22-digit labels starting `92`, `93`, `94` or `95`, optionally with a `420` + ZIP prefix; `EA123456785US`-style international ✓ | | [Track USPS](https://lastscanned.com/lookup/usps) | | [DHL](https://docs.lastscanned.com/carriers/dhl) | `dhl` | 10 digits (Express) ✓; `JD`/`JJD` + 10–20 digits; `GM` + 16–20 digits (eCommerce); 20 digits starting `0034043` (Paket); `RR123456785DE`-style Deutsche Post ✓ | | [Track DHL](https://lastscanned.com/lookup/dhl) | | [FedEx](https://docs.lastscanned.com/carriers/fedex) | `fedex` | 12, 15 or 20 digits; 22 digits starting `96` | | [Track FedEx](https://lastscanned.com/lookup/fedex) | | [Amazon](https://docs.lastscanned.com/carriers/amazon) | `amazon` | `TBA`/`TBC`/`TBM` + 12 digits | | [Track Amazon](https://lastscanned.com/lookup/amazon) | | [OnTrac](https://docs.lastscanned.com/carriers/ontrac) | `ontrac` | `C` or `D` + 14 digits; LaserShip `1LS` + 12–15 letters/digits and `LX12345678`-style | | [Track OnTrac](https://lastscanned.com/lookup/ontrac) | | [UniUni](https://docs.lastscanned.com/carriers/uniuni) | `uniuni` | `UUS` + 13–16 letters/digits | `UR…`, `U9999…`, `U000…` | [Track UniUni](https://lastscanned.com/lookup/uniuni) | | [GOFO](https://docs.lastscanned.com/carriers/gofo) | `gofo` | `GFUS` + 14 digits | `GF` + 13 digits | [Track GOFO](https://lastscanned.com/lookup/gofo) | | [Veho](https://docs.lastscanned.com/carriers/veho) | `veho` | `VH` + 12 letters/digits | | [Track Veho](https://lastscanned.com/lookup/veho) | | [Spee-Dee](https://docs.lastscanned.com/carriers/speedee) | `speedee` | `SP` + 16 or 18 digits | | [Track Spee-Dee](https://lastscanned.com/lookup/speedee) | | [CDL Last Mile](https://docs.lastscanned.com/carriers/cdl) | `cdl` | `CDL` + 11 digits | order numbers like `943506776-0` | [Track CDL](https://lastscanned.com/lookup/cdl) | | [Better Trucks](https://docs.lastscanned.com/carriers/bettertrucks) | `bettertrucks` | `BTS_` + 8–14 letters/digits; `BTP` + 12 letters/digits | | [Track Better Trucks](https://lastscanned.com/lookup/bettertrucks) | | [AxleHire (Jitsu)](https://docs.lastscanned.com/carriers/axlehire) | `axlehire` | | `SCD` + 16 letters/digits; 12- or 16-character letter/digit codes | [Track AxleHire](https://lastscanned.com/lookup/axlehire) | | [Cirro](https://docs.lastscanned.com/carriers/cirro) | `cirro` | `CR` + 12 digits; `CIFR` + 13 digits | | [Track Cirro](https://lastscanned.com/lookup/cirro) | | [Yanwen](https://docs.lastscanned.com/carriers/yanwen) | `yanwen` | `XX123456785YP`-style ✓; `YW` + 3 letters + 12 digits | | [Track Yanwen](https://lastscanned.com/lookup/yanwen) | | [4PX](https://docs.lastscanned.com/carriers/4px) | `4px` | `4PX` + 13 digits + `CN` | | [Track 4PX](https://lastscanned.com/lookup/4px) | | [Cainiao](https://docs.lastscanned.com/carriers/cainiao) | `cainiao` | `LP` + 14–17 digits; `AP` + 14 digits | | [Track Cainiao](https://lastscanned.com/lookup/cainiao) | | [YunExpress](https://docs.lastscanned.com/carriers/yunexpress) | `yunexpress` | `YT` + 16 digits | | [Track YunExpress](https://lastscanned.com/lookup/yunexpress) | | [SpeedX](https://docs.lastscanned.com/carriers/speedx) | `speedx` | `SPX` + 15 or 21 letters/digits | | [Track SpeedX](https://lastscanned.com/lookup/speedx) | | [Intelcom (Dragonfly)](https://docs.lastscanned.com/carriers/intelcom) | `intelcom` | `INTLCM` + 1 letter + 9 digits | | [Track Intelcom](https://lastscanned.com/lookup/intelcom) | | [Canada Post](https://docs.lastscanned.com/carriers/canadapost) | `canadapost` | 16 digits ✓ (GS1); `XX123456785CA`-style ✓ | | [Track Canada Post](https://lastscanned.com/lookup/canadapost) | | [Purolator](https://docs.lastscanned.com/carriers/purolator) | `purolator` | | 3 letters + 9 digits (12-digit PINs need `?carrier=purolator`) | [Track Purolator](https://lastscanned.com/lookup/purolator) | | [TForce Final Mile](https://docs.lastscanned.com/carriers/tforce) | `tforce` | `TF` + 18 digits | order pieces like `NJ0342070-1` | [Track TForce](https://lastscanned.com/lookup/tforce) | | [GLS US](https://docs.lastscanned.com/carriers/glsus) | `glsus` | | (none: needs `?carrier=glsus`) | [Track GLS US](https://lastscanned.com/lookup/glsus) | | [OSM Worldwide](https://docs.lastscanned.com/carriers/osm) | `osm` | `OSM` + 14 letters/digits | `A` + 10 digits + 3 letters + 8 digits (`92…` USPS barcodes need `?carrier=osm`) | [Track OSM](https://lastscanned.com/lookup/osm) | | [Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes) | `pitneybowes` | `UPAA` + 1 letter + 15 digits | (`92…` USPS barcodes need `?carrier=pitneybowes`) | [Track Pitney Bowes](https://lastscanned.com/lookup/pitneybowes) | | [CNE Express](https://docs.lastscanned.com/carriers/cne) | `cne` | `3A5V` + 9 digits | | [Track CNE](https://lastscanned.com/lookup/cne) | | [SunYou](https://docs.lastscanned.com/carriers/sunyou) | `sunyou` | `SY` + 2 letters + 9 digits | | [Track SunYou](https://lastscanned.com/lookup/sunyou) | | [UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi) | `ubi` | `AU` + 13 digits | | [Track UBI](https://lastscanned.com/lookup/ubi) | | [Sendle](https://docs.lastscanned.com/carriers/sendle) | `sendle` | `QSS` + 9 digits; `QS` + 6 digits | | [Track Sendle](https://lastscanned.com/lookup/sendle) | | [Asendia](https://docs.lastscanned.com/carriers/asendia) | `asendia` | `AHOY` + 8 letters/digits | (USPS, `AS…US` and destination numbers need `?carrier=asendia`) | [Track Asendia](https://lastscanned.com/lookup/asendia) | | [Japan Post](https://docs.lastscanned.com/carriers/japanpost) | `japanpost` | `XX123456785JP`-style ✓ | | [Track Japan Post](https://lastscanned.com/lookup/japanpost) | | [Singapore Post](https://docs.lastscanned.com/carriers/singpost) | `singpost` | `XX123456785SG`-style ✓ | | [Track Singapore Post](https://lastscanned.com/lookup/singpost) | | [Korea Post](https://docs.lastscanned.com/carriers/koreapost) | `koreapost` | `XX123456785KR`-style ✓ | | [Track Korea Post](https://lastscanned.com/lookup/koreapost) | | [NZ Post](https://docs.lastscanned.com/carriers/nzpost) | `nzpost` | `XX123456785NZ`-style ✓ | | [Track NZ Post](https://lastscanned.com/lookup/nzpost) | | [DPD UK](https://docs.lastscanned.com/carriers/dpduk) | `dpduk` | | `15` + 12 digits | [Track DPD UK](https://lastscanned.com/lookup/dpduk) | | [APC Postal Logistics](https://docs.lastscanned.com/carriers/apc) | `apc` | | (none: needs `?carrier=apc`) | [Track APC Postal Logistics](https://lastscanned.com/lookup/apc) | | [Landmark Global](https://docs.lastscanned.com/carriers/landmark) | `landmark` | `LTN` + 8–14 digits | | [Track Landmark Global](https://lastscanned.com/lookup/landmark) | | [Canpar Express](https://docs.lastscanned.com/carriers/canpar) | `canpar` | `D` + 15 digits | | [Track Canpar Express](https://lastscanned.com/lookup/canpar) | | [Loomis Express](https://docs.lastscanned.com/carriers/loomis) | `loomis` | | (none: needs `?carrier=loomis`) | [Track Loomis Express](https://lastscanned.com/lookup/loomis) | | [GLS Canada](https://docs.lastscanned.com/carriers/glscanada) | `glscanada` | | (none: needs `?carrier=glscanada`) | [Track GLS Canada](https://lastscanned.com/lookup/glscanada) | | [Nationex](https://docs.lastscanned.com/carriers/nationex) | `nationex` | | (none: needs `?carrier=nationex`) | [Track Nationex](https://lastscanned.com/lookup/nationex) | | [bpost](https://docs.lastscanned.com/carriers/bpost) | `bpost` | `XX123456785BE`-style ✓ | | [Track bpost](https://lastscanned.com/lookup/bpost) | | [PostNord](https://docs.lastscanned.com/carriers/postnord) | `postnord` | `XX123456785SE`/`…DK`-style ✓ | | [Track PostNord](https://lastscanned.com/lookup/postnord) | | [Österreichische Post](https://docs.lastscanned.com/carriers/austrianpost) | `austrianpost` | `XX123456785AT`-style ✓ | | [Track Österreichische Post](https://lastscanned.com/lookup/austrianpost) | | [Poczta Polska](https://docs.lastscanned.com/carriers/polishpost) | `polishpost` | `XX123456785PL`-style ✓ | | [Track Poczta Polska](https://lastscanned.com/lookup/polishpost) | | [GLS Group Europe](https://docs.lastscanned.com/carriers/gls) | `gls` | | 11 digits | [Track GLS Group Europe](https://lastscanned.com/lookup/gls) | | [InPost](https://docs.lastscanned.com/carriers/inpost) | `inpost` | `5` or `6` + 23 digits | | [Track InPost](https://lastscanned.com/lookup/inpost) | | [Packeta](https://docs.lastscanned.com/carriers/packeta) | `packeta` | `Z` + 9 or 10 digits | | [Track Packeta](https://lastscanned.com/lookup/packeta) | | [Hermes Germany](https://docs.lastscanned.com/carriers/hermesde) | `hermesde` | | (none: needs `?carrier=hermesde`) | [Track Hermes Germany](https://lastscanned.com/lookup/hermesde) | | [YDH](https://docs.lastscanned.com/carriers/ydh) | `ydh` | `YDH` + 10 digits + 2 letters | | [Track YDH](https://lastscanned.com/lookup/ydh) | | [Equick China](https://docs.lastscanned.com/carriers/equick) | `equick` | `EQK` + 2 letters + 10 digits + 2 letters | | [Track Equick China](https://lastscanned.com/lookup/equick) | | [TopYou](https://docs.lastscanned.com/carriers/topyou) | `topyou` | | (none: needs `?carrier=topyou`) | [Track TopYou](https://lastscanned.com/lookup/topyou) | | [La Poste / Colissimo](https://docs.lastscanned.com/carriers/laposte) | `laposte` | Colissimo digit + letter + 11 digits ✓ (GS1); `XX123456785FR`-style ✓ | | [Track La Poste / Colissimo](https://lastscanned.com/lookup/laposte) | | [PostNL](https://docs.lastscanned.com/carriers/postnl) | `postnl` | `3S` + 4 letters + 7–9 digits; `XX123456785NL`-style ✓ | | [Track PostNL](https://lastscanned.com/lookup/postnl) | | [Correos](https://docs.lastscanned.com/carriers/correos) | `correos` | `XX123456785ES`-style ✓ | `PQ` + 20–22 letters/digits | [Track Correos](https://lastscanned.com/lookup/correos) | | [Poste Italiane](https://docs.lastscanned.com/carriers/posteitaliane) | `posteitaliane` | `XX123456785IT`-style ✓ | | [Track Poste Italiane](https://lastscanned.com/lookup/posteitaliane) | | [CJ Logistics](https://docs.lastscanned.com/carriers/cjlogistics) | `cjlogistics` | | 10 digits failing DHL's check digit (12-digit waybills need `?carrier=cjlogistics`) | [Track CJ Logistics](https://lastscanned.com/lookup/cjlogistics) | | [Yamato Transport](https://docs.lastscanned.com/carriers/yamato) | `yamato` | | (12 digits is FedEx's: needs `?carrier=yamato`) | [Track Yamato Transport](https://lastscanned.com/lookup/yamato) | | [Delhivery](https://docs.lastscanned.com/carriers/delhivery) | `delhivery` | | 13 or 14 digits | [Track Delhivery](https://lastscanned.com/lookup/delhivery) | | [Blue Dart](https://docs.lastscanned.com/carriers/bluedart) | `bluedart` | | (none: needs `?carrier=bluedart`) | [Track Blue Dart](https://lastscanned.com/lookup/bluedart) | | [Evri](https://docs.lastscanned.com/carriers/evri) | `evri` | | (none: needs `?carrier=evri`) | [Track Evri](https://lastscanned.com/lookup/evri) | | [An Post](https://docs.lastscanned.com/carriers/anpost) | `anpost` | `XX123456785IE`-style ✓ | | [Track An Post](https://lastscanned.com/lookup/anpost) | | [Swiss Post](https://docs.lastscanned.com/carriers/swisspost) | `swisspost` | `XX123456785CH`-style ✓; `99` + 16 digits | | [Track Swiss Post](https://lastscanned.com/lookup/swisspost) | | [BRT (Bartolini)](https://docs.lastscanned.com/carriers/brt) | `brt` | | (none: needs `?carrier=brt`) | [Track BRT (Bartolini)](https://lastscanned.com/lookup/brt) | | [Aramex Australia / NZ](https://docs.lastscanned.com/carriers/aramexau) | `aramexau` | | (none: needs `?carrier=aramexau`) | [Track Aramex Australia / NZ](https://lastscanned.com/lookup/aramexau) | | [CouriersPlease](https://docs.lastscanned.com/carriers/couriersplease) | `couriersplease` | `CP` + 5 letters + 7 digits | | [Track CouriersPlease](https://lastscanned.com/lookup/couriersplease) | | [Team Global Express](https://docs.lastscanned.com/carriers/teamglobalexpress) | `teamglobalexpress` | | (none: needs `?carrier=teamglobalexpress`) | [Track Team Global Express](https://lastscanned.com/lookup/teamglobalexpress) | | [Ninja Van](https://docs.lastscanned.com/carriers/ninjavan) | `ninjavan` | | `NV`/`NL` + country code + 6–16 letters/digits | [Track Ninja Van](https://lastscanned.com/lookup/ninjavan) | | [Flash Express](https://docs.lastscanned.com/carriers/flashexpress) | `flashexpress` | | `TH` + 2 digits + 8–12 letters/digits + a letter | [Track Flash Express](https://lastscanned.com/lookup/flashexpress) | | [ICS Courier](https://docs.lastscanned.com/carriers/icscourier) | `icscourier` | 2 letters + digit + 11 letters/digits + postal code | | [Track ICS Courier](https://lastscanned.com/lookup/icscourier) | | [Chit Chats](https://docs.lastscanned.com/carriers/chitchats) | `chitchats` | | (none: needs `?carrier=chitchats`) | [Track Chit Chats](https://lastscanned.com/lookup/chitchats) | | [Passport](https://docs.lastscanned.com/carriers/passport) | `passport` | `PG` + 10–11 digits + 2 letters | | [Track Passport](https://lastscanned.com/lookup/passport) | | [ePost Global](https://docs.lastscanned.com/carriers/epostglobal) | `epostglobal` | `EPG` + 15 digits | | [Track ePost Global](https://lastscanned.com/lookup/epostglobal) | | [JYExpress](https://docs.lastscanned.com/carriers/jyexpress) | `jyexpress` | | (none: needs `?carrier=jyexpress`) | [Track JYExpress](https://lastscanned.com/lookup/jyexpress) | | [Sagawa Express](https://docs.lastscanned.com/carriers/sagawa) | `sagawa` | | (none: needs `?carrier=sagawa`) | [Track Sagawa Express](https://lastscanned.com/lookup/sagawa) | | [Aramex](https://docs.lastscanned.com/carriers/aramex) | `aramex` | | (none: needs `?carrier=aramex`) | [Track Aramex](https://lastscanned.com/lookup/aramex) | | [T-cat (Taiwan Pelican Express)](https://docs.lastscanned.com/carriers/tcat) | `tcat` | | (none: needs `?carrier=tcat`) | [Track T-cat (Taiwan Pelican Express)](https://lastscanned.com/lookup/tcat) | | [Hanjin](https://docs.lastscanned.com/carriers/hanjin) | `hanjin` | | (none: needs `?carrier=hanjin`) | [Track Hanjin](https://lastscanned.com/lookup/hanjin) | | [Lotte Global Logistics](https://docs.lastscanned.com/carriers/lotte) | `lotte` | | (none: needs `?carrier=lotte`) | [Track Lotte Global Logistics](https://lastscanned.com/lookup/lotte) | | [Logen](https://docs.lastscanned.com/carriers/logen) | `logen` | | (none: needs `?carrier=logen`) | [Track Logen](https://lastscanned.com/lookup/logen) | | [Shadowfax](https://docs.lastscanned.com/carriers/shadowfax) | `shadowfax` | | (none: needs `?carrier=shadowfax`) | [Track Shadowfax](https://lastscanned.com/lookup/shadowfax) | | [SFC (Sendfromchina)](https://docs.lastscanned.com/carriers/sfc) | `sfc` | | (none: needs `?carrier=sfc`) | [Track SFC (Sendfromchina)](https://lastscanned.com/lookup/sfc) | | [Anjun Logistics](https://docs.lastscanned.com/carriers/anjun) | `anjun` | | (none: needs `?carrier=anjun`) | [Track Anjun Logistics](https://lastscanned.com/lookup/anjun) | | [Winit](https://docs.lastscanned.com/carriers/winit) | `winit` | | (none: needs `?carrier=winit`) | [Track Winit](https://lastscanned.com/lookup/winit) | | [NZ Couriers](https://docs.lastscanned.com/carriers/nzcouriers) | `nzcouriers` | | (none: needs `?carrier=nzcouriers`) | [Track NZ Couriers](https://lastscanned.com/lookup/nzcouriers) | | [Post Haste](https://docs.lastscanned.com/carriers/posthaste) | `posthaste` | | (none: needs `?carrier=posthaste`) | [Track Post Haste](https://lastscanned.com/lookup/posthaste) | | [Castle Parcels](https://docs.lastscanned.com/carriers/castleparcels) | `castleparcels` | | (none: needs `?carrier=castleparcels`) | [Track Castle Parcels](https://lastscanned.com/lookup/castleparcels) | | [Gaopost](https://docs.lastscanned.com/carriers/gaopost) | `gaopost` | | (none: needs `?carrier=gaopost`) | [Track Gaopost](https://lastscanned.com/lookup/gaopost) | | [YF Express](https://docs.lastscanned.com/carriers/yfexpress) | `yfexpress` | | (none: needs `?carrier=yfexpress`) | [Track YF Express](https://lastscanned.com/lookup/yfexpress) | | [GDWSE](https://docs.lastscanned.com/carriers/gdwse) | `gdwse` | | (none: needs `?carrier=gdwse`) | [Track GDWSE](https://lastscanned.com/lookup/gdwse) | | [Chronopost](https://docs.lastscanned.com/carriers/chronopost) | `chronopost` | | (none: needs `?carrier=chronopost`) | [Track Chronopost](https://lastscanned.com/lookup/chronopost) | | [Bring / Posten Norge](https://docs.lastscanned.com/carriers/bring) | `bring` | `XX123456785NO`-style ✓ | `370` + 15 digits | [Track Bring / Posten Norge](https://lastscanned.com/lookup/bring) | | [Posti Finland](https://docs.lastscanned.com/carriers/posti) | `posti` | `XX123456785FI`-style ✓ | `JJFI` + 14 digits | [Track Posti Finland](https://lastscanned.com/lookup/posti) | | [Česká pošta](https://docs.lastscanned.com/carriers/ceskaposta) | `ceskaposta` | `XX123456785CZ`-style ✓ | | [Track Česká pošta](https://lastscanned.com/lookup/ceskaposta) | | [CTT Portugal](https://docs.lastscanned.com/carriers/ctt) | `ctt` | `XX123456785PT`-style ✓ | | [Track CTT Portugal](https://lastscanned.com/lookup/ctt) | | [SEUR](https://docs.lastscanned.com/carriers/seur) | `seur` | | (none: needs `?carrier=seur`) | [Track SEUR](https://lastscanned.com/lookup/seur) | | [Nova Poshta](https://docs.lastscanned.com/carriers/novaposhta) | `novaposhta` | | `20` or `59` + 12 digits | [Track Nova Poshta](https://lastscanned.com/lookup/novaposhta) | | [Sameday](https://docs.lastscanned.com/carriers/sameday) | `sameday` | | (none: needs `?carrier=sameday`) | [Track Sameday](https://lastscanned.com/lookup/sameday) | | [FAN Courier](https://docs.lastscanned.com/carriers/fancourier) | `fancourier` | | (none: needs `?carrier=fancourier`) | [Track FAN Courier](https://lastscanned.com/lookup/fancourier) | | [Econt](https://docs.lastscanned.com/carriers/econt) | `econt` | | (none: needs `?carrier=econt`) | [Track Econt](https://lastscanned.com/lookup/econt) | | [Meest](https://docs.lastscanned.com/carriers/meest) | `meest` | | `CV` + 9 digits + `UA` | [Track Meest](https://lastscanned.com/lookup/meest) | | [Yurtiçi Kargo](https://docs.lastscanned.com/carriers/yurtici) | `yurtici` | | (none: needs `?carrier=yurtici`) | [Track Yurtiçi Kargo](https://lastscanned.com/lookup/yurtici) | | [Paquetexpress](https://docs.lastscanned.com/carriers/paquetexpress) | `paquetexpress` | | 3 letters + 2 digits + 1–3 letters + 6–9 digits | [Track Paquetexpress](https://lastscanned.com/lookup/paquetexpress) | | [Andreani](https://docs.lastscanned.com/carriers/andreani) | `andreani` | | (none: needs `?carrier=andreani`) | [Track Andreani](https://lastscanned.com/lookup/andreani) | | [The Courier Guy](https://docs.lastscanned.com/carriers/thecourierguy) | `thecourierguy` | | (none: needs `?carrier=thecourierguy`) | [Track The Courier Guy](https://lastscanned.com/lookup/thecourierguy) | | [PostNet](https://docs.lastscanned.com/carriers/postnet) | `postnet` | | (none: needs `?carrier=postnet`) | [Track PostNet](https://lastscanned.com/lookup/postnet) | | [99minutos](https://docs.lastscanned.com/carriers/minutos99) | `minutos99` | | (none: needs `?carrier=minutos99`) | [Track 99minutos](https://lastscanned.com/lookup/minutos99) | | [Mainfreight](https://docs.lastscanned.com/carriers/mainfreight) | `mainfreight` | | (none: needs `?carrier=mainfreight`) | [Track Mainfreight](https://lastscanned.com/lookup/mainfreight) | | [YTO Express](https://docs.lastscanned.com/carriers/yto) | `yto` | `YT` + 13 digits, or `YTD`/`YTG`/`YTH`/`YTZ` + 12 digits | | [Track YTO Express](https://lastscanned.com/lookup/yto) | | [SPL Saudi Post](https://docs.lastscanned.com/carriers/spl) | `spl` | `XX123456785SA`-style ✓ | | [Track SPL Saudi Post](https://lastscanned.com/lookup/spl) | | [KEX Express Thailand](https://docs.lastscanned.com/carriers/kex) | `kex` | | (none: needs `?carrier=kex`) | [Track KEX Express Thailand](https://lastscanned.com/lookup/kex) | | [Pos Malaysia](https://docs.lastscanned.com/carriers/posmalaysia) | `posmalaysia` | `XX123456785MY`-style ✓ | | [Track Pos Malaysia](https://lastscanned.com/lookup/posmalaysia) | | [GDEX](https://docs.lastscanned.com/carriers/gdex) | `gdex` | | (none: needs `?carrier=gdex`) | [Track GDEX](https://lastscanned.com/lookup/gdex) | | [City-Link Express](https://docs.lastscanned.com/carriers/citylink) | `citylink` | | (none: needs `?carrier=citylink`) | [Track City-Link Express](https://lastscanned.com/lookup/citylink) | | [LBC Express](https://docs.lastscanned.com/carriers/lbc) | `lbc` | | (none: needs `?carrier=lbc`) | [Track LBC Express](https://lastscanned.com/lookup/lbc) | | [DHL eCommerce](https://docs.lastscanned.com/carriers/dhlecommerce) | `dhlecommerce` | | (none: needs `?carrier=dhlecommerce`) | [Track DHL eCommerce](https://lastscanned.com/lookup/dhlecommerce) | | [DHL Parcel NL](https://docs.lastscanned.com/carriers/dhlparcelnl) | `dhlparcelnl` | `JVGL` + 20 digits | | [Track DHL Parcel NL](https://lastscanned.com/lookup/dhlparcelnl) | | [DHL Parcel Iberia](https://docs.lastscanned.com/carriers/dhlparceles) | `dhlparceles` | | (none: needs `?carrier=dhlparceles`) | [Track DHL Parcel Iberia](https://lastscanned.com/lookup/dhlparceles) | | [DHL Parcel PL](https://docs.lastscanned.com/carriers/dhlparcelpl) | `dhlparcelpl` | | (none: needs `?carrier=dhlparcelpl`) | [Track DHL Parcel PL](https://lastscanned.com/lookup/dhlparcelpl) | | [DHL eCommerce UK](https://docs.lastscanned.com/carriers/dhlecommerceuk) | `dhlecommerceuk` | | (none: needs `?carrier=dhlecommerceuk`) | [Track DHL eCommerce UK](https://lastscanned.com/lookup/dhlecommerceuk) | | [DHL Freight](https://docs.lastscanned.com/carriers/dhlfreight) | `dhlfreight` | | (none: needs `?carrier=dhlfreight`) | [Track DHL Freight](https://lastscanned.com/lookup/dhlfreight) | | [DHLink](https://docs.lastscanned.com/carriers/dhlink) | `dhlink` | | (none: needs `?carrier=dhlink`) | [Track DHLink](https://lastscanned.com/lookup/dhlink) | | [XQ Express](https://docs.lastscanned.com/carriers/xqexpress) | `xqexpress` | | (none: needs `?carrier=xqexpress`) | [Track XQ Express](https://lastscanned.com/lookup/xqexpress) | | [Ali Business Logistics](https://docs.lastscanned.com/carriers/alibusiness) | `alibusiness` | | (none: needs `?carrier=alibusiness`) | [Track Ali Business Logistics](https://lastscanned.com/lookup/alibusiness) | | [Omniva](https://docs.lastscanned.com/carriers/omniva) | `omniva` | `S10 *EE` with a valid check digit (`/^[A-Z]{2}\d{9}EE$/`) | | [Track Omniva](https://lastscanned.com/lookup/omniva) | | [Ukrposhta](https://docs.lastscanned.com/carriers/ukrposhta) | `ukrposhta` | `S10 *UA` with a valid check digit (`/^[A-Z]{2}\d{9}UA$/`) | `/^05\d{11}$/` | [Track Ukrposhta](https://lastscanned.com/lookup/ukrposhta) | | [Speedy](https://docs.lastscanned.com/carriers/speedy) | `speedy` | | (none: needs `?carrier=speedy`) | [Track Speedy](https://lastscanned.com/lookup/speedy) | | [DPD Romania](https://docs.lastscanned.com/carriers/dpdro) | `dpdro` | | (none: needs `?carrier=dpdro`) | [Track DPD Romania](https://lastscanned.com/lookup/dpdro) | | [DPD Poland](https://docs.lastscanned.com/carriers/dpdpl) | `dpdpl` | | `/^\d{13}[A-Z]$/` | [Track DPD Poland](https://lastscanned.com/lookup/dpdpl) | | [DPD](https://docs.lastscanned.com/carriers/dpd) | `dpd` | | `/^0\d{13}$/` | [Track DPD](https://lastscanned.com/lookup/dpd) | | [DPD Portugal](https://docs.lastscanned.com/carriers/dpdpt) | `dpdpt` | | (none: needs `?carrier=dpdpt`) | [Track DPD Portugal](https://lastscanned.com/lookup/dpdpt) | | [Thailand Post](https://docs.lastscanned.com/carriers/thailandpost) | `thailandpost` | `S10 *TH` with a valid check digit (`/^[A-Z]{2}\d{9}TH$/`) | | [Track Thailand Post](https://lastscanned.com/lookup/thailandpost) | | [Chunghwa Post](https://docs.lastscanned.com/carriers/chunghwapost) | `chunghwapost` | `S10 *TW` with a valid check digit (`/^[A-Z]{2}\d{9}TW$/`) | | [Track Chunghwa Post](https://lastscanned.com/lookup/chunghwapost) | | [EMS](https://docs.lastscanned.com/carriers/ems) | `ems` | `/^E[A-Z]\d{9}CN$/` | | [Track EMS](https://lastscanned.com/lookup/ems) | | [ELTA](https://docs.lastscanned.com/carriers/elta) | `elta` | UPU S10 numbers ending in `GR` (check digit validated) | | [Track ELTA](https://lastscanned.com/lookup/elta) | | [Estafeta](https://docs.lastscanned.com/carriers/estafeta) | `estafeta` | `/^\d{12}[A-Z]\d{9}$/` (the 22-character guide) | | [Track Estafeta](https://lastscanned.com/lookup/estafeta) | | [Total Express](https://docs.lastscanned.com/carriers/totalexpress) | `totalexpress` | `/^[A-Z]{4}\d{9}TX$/` | | [Track Total Express](https://lastscanned.com/lookup/totalexpress) | | [Sagawa Global](https://docs.lastscanned.com/carriers/sagawaglobal) | `sagawaglobal` | `/^IDA\d{12}$/` | | [Track Sagawa Global](https://lastscanned.com/lookup/sagawaglobal) | | [MRW](https://docs.lastscanned.com/carriers/mrw) | `mrw` | `/^\d{5}[A-Z]\d{6}$/` | | [Track MRW](https://lastscanned.com/lookup/mrw) | | [Nacex](https://docs.lastscanned.com/carriers/nacex) | `nacex` | `/^\d{4}\/\d{8}$/` (agency/waybill) | | [Track Nacex](https://lastscanned.com/lookup/nacex) | | [HuaHan](https://docs.lastscanned.com/carriers/huahan) | `huahan` | `/^HHW[A-Z]{2}\d{10}[A-Z]{2}$/` | | [Track HuaHan](https://lastscanned.com/lookup/huahan) | | [Chukou1](https://docs.lastscanned.com/carriers/chukou1) | `chukou1` | | `/^[A-Z]{3}\d{6,7}LW\d{6,8}$/` | [Track Chukou1](https://lastscanned.com/lookup/chukou1) | | [ZTO International](https://docs.lastscanned.com/carriers/ztointl) | `ztointl` | | `/^77122\d{9}$/` | [Track ZTO International](https://lastscanned.com/lookup/ztointl) | | [STO Express](https://docs.lastscanned.com/carriers/sto) | `sto` | | (none: needs `?carrier=sto`) | [Track STO Express](https://lastscanned.com/lookup/sto) | | [ESHUN (ZES Express)](https://docs.lastscanned.com/carriers/eshun) | `eshun` | `/^ZES[A-Z]{2}\d{10}YQ$/` | | [Track ESHUN (ZES Express)](https://lastscanned.com/lookup/eshun) | | [ACS Courier](https://docs.lastscanned.com/carriers/acscourier) | `acscourier` | | (none: needs `?carrier=acscourier`) | [Track ACS Courier](https://lastscanned.com/lookup/acscourier) | | [Airpak Express](https://docs.lastscanned.com/carriers/airpakexpress) | `airpakexpress` | | (none: needs `?carrier=airpakexpress`) | [Track Airpak Express](https://lastscanned.com/lookup/airpakexpress) | | [Allegro One](https://docs.lastscanned.com/carriers/allegroone) | `allegroone` | `/^ALE\d{12}$/` | `/^A[0D][0-9A-Z]{8}$/` and `/^AD[0-9A-Z]{15}$/` | [Track Allegro One](https://lastscanned.com/lookup/allegroone) | | [Anteraja](https://docs.lastscanned.com/carriers/anteraja) | `anteraja` | | (none: needs `?carrier=anteraja`) | [Track Anteraja](https://lastscanned.com/lookup/anteraja) | | [AyMakan](https://docs.lastscanned.com/carriers/aymakan) | `aymakan` | `/^AY\d{9,11}$/` | | [Track AyMakan](https://lastscanned.com/lookup/aymakan) | | [Cargus](https://docs.lastscanned.com/carriers/cargus) | `cargus` | | (none: needs `?carrier=cargus`) | [Track Cargus](https://lastscanned.com/lookup/cargus) | | [CDEK](https://docs.lastscanned.com/carriers/cdek) | `cdek` | | (none: needs `?carrier=cdek`) | [Track CDEK](https://lastscanned.com/lookup/cdek) | | [Correos Express](https://docs.lastscanned.com/carriers/correosexpress) | `correosexpress` | | (none: needs `?carrier=correosexpress`) | [Track Correos Express](https://lastscanned.com/lookup/correosexpress) | | [CTT Express](https://docs.lastscanned.com/carriers/cttexpress) | `cttexpress` | | `/^00\d{20}$/` | [Track CTT Express](https://lastscanned.com/lookup/cttexpress) | | [DAI Post](https://docs.lastscanned.com/carriers/daipost) | `daipost` | | (none: needs `?carrier=daipost`) | [Track DAI Post](https://lastscanned.com/lookup/daipost) | | [ECMS Express](https://docs.lastscanned.com/carriers/ecms) | `ecms` | `/^EC[A-Z]{3}\d{11}$/` | | [Track ECMS Express](https://lastscanned.com/lookup/ecms) | | [Ecoscooting](https://docs.lastscanned.com/carriers/ecoscooting) | `ecoscooting` | | (none: needs `?carrier=ecoscooting`) | [Track Ecoscooting](https://lastscanned.com/lookup/ecoscooting) | | [Geis](https://docs.lastscanned.com/carriers/geis) | `geis` | | (none: needs `?carrier=geis`) | [Track Geis](https://lastscanned.com/lookup/geis) | | [Jeebly](https://docs.lastscanned.com/carriers/jeebly) | `jeebly` | `/^JB\d{6,7}$/ and /^JBP\d{6}$/` | | [Track Jeebly](https://lastscanned.com/lookup/jeebly) | | [DHL eCommerce Türkiye](https://docs.lastscanned.com/carriers/mngkargo) | `mngkargo` | | (none: needs `?carrier=mngkargo`) | [Track DHL eCommerce Türkiye](https://lastscanned.com/lookup/mngkargo) | | [Northline](https://docs.lastscanned.com/carriers/northline) | `northline` | | `/^\d[A-Z]{3}\d{5,8}$/` (customer-prefixed consignment notes) | [Track Northline](https://lastscanned.com/lookup/northline) | | [Nova Global](https://docs.lastscanned.com/carriers/novaglobal) | `novaglobal` | `/^WB\d{16}NPG$/` | | [Track Nova Global](https://lastscanned.com/lookup/novaglobal) | | [OMGO](https://docs.lastscanned.com/carriers/omgo) | `omgo` | `/^OMGO\d{13}$/` | | [Track OMGO](https://lastscanned.com/lookup/omgo) | | [Pakistan Post](https://docs.lastscanned.com/carriers/pakistanpost) | `pakistanpost` | Valid UPU S10 number ending `PK` (check digit verified), or `/^(RGL\ | | [Track Pakistan Post](https://lastscanned.com/lookup/pakistanpost) | | [Paperfly](https://docs.lastscanned.com/carriers/paperfly) | `paperfly` | `/^PFL-BD-CB-\d{10}$/` | `/^\d{6}-\d{6}-[A-Z]\d-[A-Z]\d$/` | [Track Paperfly](https://lastscanned.com/lookup/paperfly) | | [Pathao Courier](https://docs.lastscanned.com/carriers/pathao) | `pathao` | `/^D[A-Z]\d{6}[A-Z0-9]{6}$/` | | [Track Pathao Courier](https://lastscanned.com/lookup/pathao) | | [PHLPost](https://docs.lastscanned.com/carriers/phlpost) | `phlpost` | Valid UPU S10 number ending `PH` (check digit verified) | | [Track PHLPost](https://lastscanned.com/lookup/phlpost) | | [Planzer](https://docs.lastscanned.com/carriers/planzer) | `planzer` | `/^\d{5}\.\d{10}$/` | | [Track Planzer](https://lastscanned.com/lookup/planzer) | | [Pos Indonesia](https://docs.lastscanned.com/carriers/posindonesia) | `posindonesia` | | `/^P\d{2}(0[1-9] | [Track Pos Indonesia](https://lastscanned.com/lookup/posindonesia) | | [Posta Shqiptare](https://docs.lastscanned.com/carriers/postashqiptare) | `postashqiptare` | Valid UPU S10 number ending `AL` (check digit verified) | | [Track Posta Shqiptare](https://lastscanned.com/lookup/postashqiptare) | | [Pošta Slovenije](https://docs.lastscanned.com/carriers/postaslovenije) | `postaslovenije` | Valid UPU S10 number ending `SI` (check digit verified) | | [Track Pošta Slovenije](https://lastscanned.com/lookup/postaslovenije) | | [PostEx](https://docs.lastscanned.com/carriers/postex) | `postex` | | (none: needs `?carrier=postex`) | [Track PostEx](https://lastscanned.com/lookup/postex) | | [Pósturinn](https://docs.lastscanned.com/carriers/posturinn) | `posturinn` | UPU S10 `..IS`, valid check digit | | [Track Pósturinn](https://lastscanned.com/lookup/posturinn) | | [Pro Carrier](https://docs.lastscanned.com/carriers/procarrier) | `procarrier` | `/^UBG\d{9}$/` | | [Track Pro Carrier](https://lastscanned.com/lookup/procarrier) | | [PTS Worldwide Express](https://docs.lastscanned.com/carriers/ptsexpress) | `ptsexpress` | | (none: needs `?carrier=ptsexpress`) | [Track PTS Worldwide Express](https://lastscanned.com/lookup/ptsexpress) | | [Quantium Solutions](https://docs.lastscanned.com/carriers/quantium) | `quantium` | | (none: needs `?carrier=quantium`) | [Track Quantium Solutions](https://lastscanned.com/lookup/quantium) | | [Qwintry](https://docs.lastscanned.com/carriers/qwintry) | `qwintry` | `/^QR\d{8}$/` | | [Track Qwintry](https://lastscanned.com/lookup/qwintry) | | [Redur](https://docs.lastscanned.com/carriers/redur) | `redur` | | (none: needs `?carrier=redur`) | [Track Redur](https://lastscanned.com/lookup/redur) | | [RedX](https://docs.lastscanned.com/carriers/redx) | `redx` | | (none: needs `?carrier=redx`) | [Track RedX](https://lastscanned.com/lookup/redx) | | [South African Post Office](https://docs.lastscanned.com/carriers/sapo) | `sapo` | Valid UPU S10 number ending `ZA` (check digit verified) | | [Track South African Post Office](https://lastscanned.com/lookup/sapo) | | [Seino Transportation](https://docs.lastscanned.com/carriers/seino) | `seino` | | (none: needs `?carrier=seino`) | [Track Seino Transportation](https://lastscanned.com/lookup/seino) | | [Sendex](https://docs.lastscanned.com/carriers/sendex) | `sendex` | | (none: needs `?carrier=sendex`) | [Track Sendex](https://lastscanned.com/lookup/sendex) | | [Sending](https://docs.lastscanned.com/carriers/sending) | `sending` | | (none: needs `?carrier=sending`) | [Track Sending](https://lastscanned.com/lookup/sending) | | [Serpost](https://docs.lastscanned.com/carriers/serpost) | `serpost` | UPU S10 `..PE`, valid check digit | | [Track Serpost](https://lastscanned.com/lookup/serpost) | | [Servientrega](https://docs.lastscanned.com/carriers/servientrega) | `servientrega` | | (none: needs `?carrier=servientrega`) | [Track Servientrega](https://lastscanned.com/lookup/servientrega) | | [Shipa](https://docs.lastscanned.com/carriers/shipa) | `shipa` | `/^SD\d{9}$/` | | [Track Shipa](https://lastscanned.com/lookup/shipa) | | [ShipEntegra](https://docs.lastscanned.com/carriers/shipentegra) | `shipentegra` | `/^1SE\d{9}$/` | | [Track ShipEntegra](https://lastscanned.com/lookup/shipentegra) | | [Shree Maruti Courier](https://docs.lastscanned.com/carriers/shreemaruti) | `shreemaruti` | | (none: needs `?carrier=shreemaruti`) | [Track Shree Maruti Courier](https://lastscanned.com/lookup/shreemaruti) | | [SkyNet Worldwide Express](https://docs.lastscanned.com/carriers/skynetworldwide) | `skynetworldwide` | | (none: needs `?carrier=skynetworldwide`) | [Track SkyNet Worldwide Express](https://lastscanned.com/lookup/skynetworldwide) | | [SkyPostal](https://docs.lastscanned.com/carriers/skypostal) | `skypostal` | `/^SKAMZUS\d{10}$/` | `/^SP\d{11}BR$/` | [Track SkyPostal](https://lastscanned.com/lookup/skypostal) | | [Speedaf](https://docs.lastscanned.com/carriers/speedaf) | `speedaf` | `/^(AE | | [Track Speedaf](https://lastscanned.com/lookup/speedaf) | | [SpeedPAK](https://docs.lastscanned.com/carriers/speedpak) | `speedpak` | `/^E[ES][A-Z0-9]{26}$/` | | [Track SpeedPAK](https://lastscanned.com/lookup/speedpak) | | [PostNL (Spring GDS)](https://docs.lastscanned.com/carriers/springgds) | `springgds` | | (none: needs `?carrier=springgds`) | [Track PostNL (Spring GDS)](https://lastscanned.com/lookup/springgds) | | [Slovak Parcel Service](https://docs.lastscanned.com/carriers/sps) | `sps` | `/^703\d{11}(\d{2})?$/` (SPS's 703 prefix; the 11-digit shipment number alone is shared with other carriers) | | [Track Slovak Parcel Service](https://lastscanned.com/lookup/sps) | | [SPX Express Indonesia](https://docs.lastscanned.com/carriers/spxid) | `spxid` | `/^SPXID\d{11}[0-9A-Z]$/` | `/^ID\d{12}[0-9A-Z]?$/` | [Track SPX Express Indonesia](https://lastscanned.com/lookup/spxid) | | [SPX Express Malaysia](https://docs.lastscanned.com/carriers/spxmy) | `spxmy` | `/^SPXMY\d{11}[0-9A-Z]$/` | `/^MY\d{12}[0-9A-Z]$/` | [Track SPX Express Malaysia](https://lastscanned.com/lookup/spxmy) | | [SPX Express Philippines](https://docs.lastscanned.com/carriers/spxph) | `spxph` | `/^SPXPH\d{10,16}[A-Z]?$/`, `/^SPEPH\d{11}[0-9A-Z]$/` | `/^PH\d{12,14}[A-Z]?$/` | [Track SPX Express Philippines](https://lastscanned.com/lookup/spxph) | | [SPX Express Thailand](https://docs.lastscanned.com/carriers/spxth) | `spxth` | `/^SPXTH\d{11}[0-9A-Z]$/` | `/^TH\d{12}[0-9A-Z]?$/` | [Track SPX Express Thailand](https://lastscanned.com/lookup/spxth) | | [SPX Express Vietnam](https://docs.lastscanned.com/carriers/spxvn) | `spxvn` | `/^SPXVN\d{11}[0-9A-Z]$/` | `/^VN\d{12}[0-9A-Z]$/` | [Track SPX Express Vietnam](https://lastscanned.com/lookup/spxvn) | | [Stallion Express](https://docs.lastscanned.com/carriers/stallionexpress) | `stallionexpress` | | `/^(SE)?2\d(0[1-9] | [Track Stallion Express](https://lastscanned.com/lookup/stallionexpress) | | [Starex](https://docs.lastscanned.com/carriers/starex) | `starex` | `/^STR[A-Z]{2}\d{12}$/` | | [Track Starex](https://lastscanned.com/lookup/starex) | | [ST Courier](https://docs.lastscanned.com/carriers/stcourier) | `stcourier` | | (none: needs `?carrier=stcourier`) | [Track ST Courier](https://lastscanned.com/lookup/stcourier) | | [Straightship](https://docs.lastscanned.com/carriers/straightship) | `straightship` | `/^STR(TD\d{9} | | [Track Straightship](https://lastscanned.com/lookup/straightship) | | [Swiss Post Cargo](https://docs.lastscanned.com/carriers/swisspostcargo) | `swisspostcargo` | | (none: needs `?carrier=swisspostcargo`) | [Track Swiss Post Cargo](https://lastscanned.com/lookup/swisspostcargo) | | [TIPSA](https://docs.lastscanned.com/carriers/tipsa) | `tipsa` | | `/^\d{22}$/ (not starting `96`)` | [Track TIPSA](https://lastscanned.com/lookup/tipsa) | | [TMM Express](https://docs.lastscanned.com/carriers/tmmexpress) | `tmmexpress` | | (none: needs `?carrier=tmmexpress`) | [Track TMM Express](https://lastscanned.com/lookup/tmmexpress) | | [TNT](https://docs.lastscanned.com/carriers/tnt) | `tnt` | | (none: needs `?carrier=tnt`) | [Track TNT](https://lastscanned.com/lookup/tnt) | | [TOPTRANS](https://docs.lastscanned.com/carriers/toptrans) | `toptrans` | | (none: needs `?carrier=toptrans`) | [Track TOPTRANS](https://lastscanned.com/lookup/toptrans) | | [TracX Logis](https://docs.lastscanned.com/carriers/tracxlogis) | `tracxlogis` | `/^QSP\d{9}$/` | | [Track TracX Logis](https://lastscanned.com/lookup/tracxlogis) | | [TWS Express Courier](https://docs.lastscanned.com/carriers/twsexpress) | `twsexpress` | | `/^28\d{4}[A-Z]\d{6}$/` | [Track TWS Express Courier](https://lastscanned.com/lookup/twsexpress) | | [Urvaam](https://docs.lastscanned.com/carriers/urvaam) | `urvaam` | | (none: needs `?carrier=urvaam`) | [Track Urvaam](https://lastscanned.com/lookup/urvaam) | | [Valmo](https://docs.lastscanned.com/carriers/valmo) | `valmo` | `/^VL\d{13}$/` | | [Track Valmo](https://lastscanned.com/lookup/valmo) | | [Vasp Expresso](https://docs.lastscanned.com/carriers/vaspexpresso) | `vaspexpresso` | | (none: needs `?carrier=vaspexpresso`) | [Track Vasp Expresso](https://lastscanned.com/lookup/vaspexpresso) | | [Venipak](https://docs.lastscanned.com/carriers/venipak) | `venipak` | Parcel numbers: `/^V\d{5}E\d{7}$/` | | [Track Venipak](https://lastscanned.com/lookup/venipak) | | [Vinted Go](https://docs.lastscanned.com/carriers/vintedgo) | `vintedgo` | | `/^1[78]\d{14}$/` | [Track Vinted Go](https://lastscanned.com/lookup/vintedgo) | | [Vozovoz](https://docs.lastscanned.com/carriers/vozovoz) | `vozovoz` | | (none: needs `?carrier=vozovoz`) | [Track Vozovoz](https://lastscanned.com/lookup/vozovoz) | | [Zeleris](https://docs.lastscanned.com/carriers/zeleris) | `zeleris` | `/^[0-9A-F]{8}\d{9}[A-Z]$/` | | [Track Zeleris](https://lastscanned.com/lookup/zeleris) | | [ZR Express](https://docs.lastscanned.com/carriers/zrexpress) | `zrexpress` | `/^\d{1,2}-[A-Z0-9]{10}-ZR$/` | | [Track ZR Express](https://lastscanned.com/lookup/zrexpress) | | [4-72](https://docs.lastscanned.com/carriers/472) | `472` | `S10 *CO` with a valid check digit (`/^[A-Z]{2}\d{9}CO$/`) | | [Track 4-72](https://lastscanned.com/lookup/472) | | [Kuehne+Nagel](https://docs.lastscanned.com/carriers/kuehnenagel) | `kuehnenagel` | | `/^RWM\d{9}$\|^\d{2}A\d{9}$/` | [Track Kuehne+Nagel](https://lastscanned.com/lookup/kuehnenagel) | | [MailPlus](https://docs.lastscanned.com/carriers/mailplus) | `mailplus` | `/^MPXL\d{6}$/` | `/^MPX\d{9}$/` | [Track MailPlus](https://lastscanned.com/lookup/mailplus) | | [Amerijet](https://docs.lastscanned.com/carriers/amerijet) | `amerijet` | `/^810\d{8}$/` with the mod-7 check digit | | [Track Amerijet](https://lastscanned.com/lookup/amerijet) | | [Matkahuolto](https://docs.lastscanned.com/carriers/matkahuolto) | `matkahuolto` | `/^MH\d{9}FI$/` | `/^MA\d{19}$/` | [Track Matkahuolto](https://lastscanned.com/lookup/matkahuolto) | | [NOEST Express](https://docs.lastscanned.com/carriers/noest) | `noest` | | `/^[A-Z0-9]{3}-[A-Z0-9]{3}-\d{6,9}$/` | [Track NOEST Express](https://lastscanned.com/lookup/noest) | | [17FEIA](https://docs.lastscanned.com/carriers/17feia) | `17feia` | `/^FEI[A-Z]{2}\d{10}YQ$/` | | [Track 17FEIA](https://lastscanned.com/lookup/17feia) | | [2GO Express](https://docs.lastscanned.com/carriers/2go) | `2go` | | `/^[A-Z]\d{7}[A-Z]$/` | [Track 2GO Express](https://lastscanned.com/lookup/2go) | | [4Sides](https://docs.lastscanned.com/carriers/4sides) | `4sides` | `/^F[SE]\d{9}RU$/` | | [Track 4Sides](https://lastscanned.com/lookup/4sides) | | [5Post](https://docs.lastscanned.com/carriers/5post) | `5post` | | | [Track 5Post](https://lastscanned.com/lookup/5post) | | [A1 POST](https://docs.lastscanned.com/carriers/a1post) | `a1post` | | | [Track A1 POST](https://lastscanned.com/lookup/a1post) | | [ABF Freight](https://docs.lastscanned.com/carriers/abffreight) | `abffreight` | | | [Track ABF Freight](https://lastscanned.com/lookup/abffreight) | | [A. Duie Pyle](https://docs.lastscanned.com/carriers/aduiepyle) | `aduiepyle` | | | [Track A. Duie Pyle](https://lastscanned.com/lookup/aduiepyle) | | [AEX Paraguay](https://docs.lastscanned.com/carriers/aexparaguay) | `aexparaguay` | | `/^A\d{9}$/` | [Track AEX Paraguay](https://lastscanned.com/lookup/aexparaguay) | | [AIT Worldwide](https://docs.lastscanned.com/carriers/aitworldwide) | `aitworldwide` | | `/^S\d{8}$/` | [Track AIT Worldwide](https://lastscanned.com/lookup/aitworldwide) | | [AJEX](https://docs.lastscanned.com/carriers/ajex) | `ajex` | `/^AJ[AS]\d{12}$/` | | [Track AJEX](https://lastscanned.com/lookup/ajex) | | [AM Home Delivery](https://docs.lastscanned.com/carriers/amhomedelivery) | `amhomedelivery` | | `/^AM\d{9}$/` | [Track AM Home Delivery](https://lastscanned.com/lookup/amhomedelivery) | | [Grupo ampm](https://docs.lastscanned.com/carriers/ampm) | `ampm` | | `/^(CNA\d{12}\|IDTS\d{14})$/` | [Track Grupo ampm](https://lastscanned.com/lookup/ampm) | | [AnserX](https://docs.lastscanned.com/carriers/anserx) | `anserx` | `/^BTYCN\d{10}YQ$/` | | [Track AnserX](https://lastscanned.com/lookup/anserx) | | [APC Overnight](https://docs.lastscanned.com/carriers/apcovernight) | `apcovernight` | | `/^20[12]\d(0[1-9]\|1[0-2])(0[1-9]\|[12]\d\|3[01])\d{14}$/` | [Track APC Overnight](https://lastscanned.com/lookup/apcovernight) | | [Apple Express](https://docs.lastscanned.com/carriers/appleexpress) | `appleexpress` | `/^(APPL\d{13}\|CACAINIAO\d{11})$/` | | [Track Apple Express](https://lastscanned.com/lookup/appleexpress) | | [Aramex New Zealand](https://docs.lastscanned.com/carriers/aramexnz) | `aramexnz` | | | [Track Aramex New Zealand](https://lastscanned.com/lookup/aramexnz) | | [A Tu Hora Express](https://docs.lastscanned.com/carriers/atuhoraexpress) | `atuhoraexpress` | `/^0{6}\d{10}001\d{5}$/` | | [Track A Tu Hora Express](https://lastscanned.com/lookup/atuhoraexpress) | | [Bangladesh Post](https://docs.lastscanned.com/carriers/bangladeshpost) | `bangladeshpost` | | `S10 *BD` with a valid check digit (`/^[A-Z]{2}\d{9}BD$/`) | [Track Bangladesh Post](https://lastscanned.com/lookup/bangladeshpost) | | [BEX Express](https://docs.lastscanned.com/carriers/bexexpress) | `bexexpress` | | | [Track BEX Express](https://lastscanned.com/lookup/bexexpress) | | [BJS Home Delivery](https://docs.lastscanned.com/carriers/bjshomedelivery) | `bjshomedelivery` | | `/^B\d{7}-\d{4}$/` | [Track BJS Home Delivery](https://lastscanned.com/lookup/bjshomedelivery) | | [BlueEX](https://docs.lastscanned.com/carriers/blueex) | `blueex` | | `/^CP\d{12}$/` | [Track BlueEX](https://lastscanned.com/lookup/blueex) | | [Blue Express](https://docs.lastscanned.com/carriers/blueexpress) | `blueexpress` | | | [Track Blue Express](https://lastscanned.com/lookup/blueexpress) | | [Bombino Express](https://docs.lastscanned.com/carriers/bombino) | `bombino` | | | [Track Bombino Express](https://lastscanned.com/lookup/bombino) | | [Bookurier](https://docs.lastscanned.com/carriers/bookurier) | `bookurier` | `/^BOK\d{7}$/` | | [Track Bookurier](https://lastscanned.com/lookup/bookurier) | | [MRL Global](https://docs.lastscanned.com/carriers/mrlglobal) | `mrlglobal` | | `/^C[A-Z]{3}\d{6}$/` | [Track MRL Global](https://lastscanned.com/lookup/mrlglobal) | | [Border Express](https://docs.lastscanned.com/carriers/borderexpress) | `borderexpress` | | `/^[A-Z]{4}\d{5,8}$/` | [Track Border Express](https://lastscanned.com/lookup/borderexpress) | | [Bosta](https://docs.lastscanned.com/carriers/bosta) | `bosta` | | | [Track Bosta](https://lastscanned.com/lookup/bosta) | | [BOX NOW](https://docs.lastscanned.com/carriers/boxnow) | `boxnow` | | | [Track BOX NOW](https://lastscanned.com/lookup/boxnow) | | [Bringer Parcel Xpress](https://docs.lastscanned.com/carriers/bringerparcel) | `bringerparcel` | `/^BPS[A-Z0-9]{12,13}$/` | | [Track Bringer Parcel Xpress](https://lastscanned.com/lookup/bringerparcel) | | [Bulgarian Posts](https://docs.lastscanned.com/carriers/bulgarianposts) | `bulgarianposts` | `/^PS[0-9A-Z]{11}$/` | | [Track Bulgarian Posts](https://lastscanned.com/lookup/bulgarianposts) | | [Burd Delivery](https://docs.lastscanned.com/carriers/burddelivery) | `burddelivery` | `/^0574500\d{11}$/` | | [Track Burd Delivery](https://lastscanned.com/lookup/burddelivery) | | [C3X](https://docs.lastscanned.com/carriers/c3x) | `c3x` | | | [Track C3X](https://lastscanned.com/lookup/c3x) | | [Cacesa](https://docs.lastscanned.com/carriers/cacesa) | `cacesa` | `/^CNPRT\d{20}$/` | | [Track Cacesa](https://lastscanned.com/lookup/cacesa) | | [Castores](https://docs.lastscanned.com/carriers/castores) | `castores` | | | [Track Castores](https://lastscanned.com/lookup/castores) | | [CCFS](https://docs.lastscanned.com/carriers/ccfs) | `ccfs` | | | [Track CCFS](https://lastscanned.com/lookup/ccfs) | | [Central Transport](https://docs.lastscanned.com/carriers/centraltransport) | `centraltransport` | | | [Track Central Transport](https://lastscanned.com/lookup/centraltransport) | | [CEVA Logistics](https://docs.lastscanned.com/carriers/cevalogistics) | `cevalogistics` | | | [Track CEVA Logistics](https://lastscanned.com/lookup/cevalogistics) | | [Chazki](https://docs.lastscanned.com/carriers/chazki) | `chazki` | | | [Track Chazki](https://lastscanned.com/lookup/chazki) | | [Chilexpress](https://docs.lastscanned.com/carriers/chilexpress) | `chilexpress` | | | [Track Chilexpress](https://lastscanned.com/lookup/chilexpress) | | [Chronodiali](https://docs.lastscanned.com/carriers/chronodiali) | `chronodiali` | `/^(?:CHPU\d{19}\|CD\d{10})$/` | | [Track Chronodiali](https://lastscanned.com/lookup/chronodiali) | | [Ciblex](https://docs.lastscanned.com/carriers/ciblex) | `ciblex` | | | [Track Ciblex](https://lastscanned.com/lookup/ciblex) | | [City Express](https://docs.lastscanned.com/carriers/cityexpressrs) | `cityexpressrs` | `/^68800[125]\d{8}$/` | | [Track City Express](https://lastscanned.com/lookup/cityexpressrs) | | [CityMail](https://docs.lastscanned.com/carriers/citymail) | `citymail` | `/^BCM[A-Z]{1,2}\d{8,9}$/` | | [Track CityMail](https://lastscanned.com/lookup/citymail) | | [CJ Packet](https://docs.lastscanned.com/carriers/cjpacket) | `cjpacket` | `/^CJP[A-Z]{2,3}\d{10}YQ$/` | | [Track CJ Packet](https://lastscanned.com/lookup/cjpacket) | | [Closer Logistics](https://docs.lastscanned.com/carriers/closerlogistics) | `closerlogistics` | | | [Track Closer Logistics](https://lastscanned.com/lookup/closerlogistics) | | [Colisweb](https://docs.lastscanned.com/carriers/colisweb) | `colisweb` | | | [Track Colisweb](https://lastscanned.com/lookup/colisweb) | | [Connect Couriers](https://docs.lastscanned.com/carriers/connectcouriers) | `connectcouriers` | | | [Track Connect Couriers](https://lastscanned.com/lookup/connectcouriers) | | [Copa Airlines Courier](https://docs.lastscanned.com/carriers/copacourier) | `copacourier` | | `/^H\d{7}$/` | [Track Copa Airlines Courier](https://lastscanned.com/lookup/copacourier) | | [Correo Argentino](https://docs.lastscanned.com/carriers/correoargentino) | `correoargentino` | `S10 *AR` with a valid check digit (`/^[A-Z]{2}\d{9}AR$/`) | | [Track Correo Argentino](https://lastscanned.com/lookup/correoargentino) | | [Correos de México](https://docs.lastscanned.com/carriers/correosmexico) | `correosmexico` | `S10 *MX` with a valid check digit (`/^[A-Z]{2}\d{9}MX$/`) | | [Track Correos de México](https://lastscanned.com/lookup/correosmexico) | | [Correos de El Salvador](https://docs.lastscanned.com/carriers/correossalvador) | `correossalvador` | `S10 *SV` with a valid check digit (`/^[A-Z]{2}\d{9}SV$/`) | | [Track Correos de El Salvador](https://lastscanned.com/lookup/correossalvador) | | [Correo Uruguayo](https://docs.lastscanned.com/carriers/correouruguayo) | `correouruguayo` | `S10 *UY` with a valid check digit (`/^[A-Z]{2}\d{9}UY$/`) | | [Track Correo Uruguayo](https://lastscanned.com/lookup/correouruguayo) | | [Courier Center](https://docs.lastscanned.com/carriers/couriercenter) | `couriercenter` | | | [Track Courier Center](https://lastscanned.com/lookup/couriercenter) | | [CSE](https://docs.lastscanned.com/carriers/cserussia) | `cserussia` | | | [Track CSE](https://lastscanned.com/lookup/cserussia) | | [Cyprus Post](https://docs.lastscanned.com/carriers/cypruspost) | `cypruspost` | `S10 *CY` with a valid check digit (`/^[A-Z]{2}\d{9}CY$/`) | | [Track Cyprus Post](https://lastscanned.com/lookup/cypruspost) | | [Danske Fragtmænd](https://docs.lastscanned.com/carriers/danskefragtmaend) | `danskefragtmaend` | `/^\d{20}[A-Z]{2}\d{6}$/` | `/^[A-Z]{2}\d{6}$/` | [Track Danske Fragtmænd](https://lastscanned.com/lookup/danskefragtmaend) | | [Daylight Transport](https://docs.lastscanned.com/carriers/daylighttransport) | `daylighttransport` | | | [Track Daylight Transport](https://lastscanned.com/lookup/daylighttransport) | | [Day & Ross](https://docs.lastscanned.com/carriers/dayross) | `dayross` | | `/^A\d{8}$/` | [Track Day & Ross](https://lastscanned.com/lookup/dayross) | | [Dayton Freight](https://docs.lastscanned.com/carriers/daytonfreight) | `daytonfreight` | | | [Track Dayton Freight](https://lastscanned.com/lookup/daytonfreight) | | [Delovye Linii](https://docs.lastscanned.com/carriers/dellin) | `dellin` | | | [Track Delovye Linii](https://lastscanned.com/lookup/dellin) | | [GAASH Worldwide](https://docs.lastscanned.com/carriers/gaash) | `gaash` | `/^GAIH\d{8}$/` | `/^(?:GWD\d{9}\|PH\d{10})$/` | [Track GAASH Worldwide](https://lastscanned.com/lookup/gaash) | | [D Express](https://docs.lastscanned.com/carriers/dexpress) | `dexpress` | | `/^[A-Z]{2}\d{10}$/` | [Track D Express](https://lastscanned.com/lookup/dexpress) | | [Direx](https://docs.lastscanned.com/carriers/direx) | `direx` | | | [Track Direx](https://lastscanned.com/lookup/direx) | | [DobroPost](https://docs.lastscanned.com/carriers/dobropost) | `dobropost` | `/^DBRPST\d{10}$/` | | [Track DobroPost](https://lastscanned.com/lookup/dobropost) | | [Domain Logistics](https://docs.lastscanned.com/carriers/domainlogistics) | `domainlogistics` | | | [Track Domain Logistics](https://lastscanned.com/lookup/domainlogistics) | | [Domex](https://docs.lastscanned.com/carriers/domex) | `domex` | | | [Track Domex](https://lastscanned.com/lookup/domex) | | [DPD South Africa](https://docs.lastscanned.com/carriers/dpdza) | `dpdza` | | | [Track DPD South Africa](https://lastscanned.com/lookup/dpdza) | | [DPEX Worldwide](https://docs.lastscanned.com/carriers/dpex) | `dpex` | | | [Track DPEX Worldwide](https://lastscanned.com/lookup/dpex) | | [Dragon Star Curier](https://docs.lastscanned.com/carriers/dragonstarcurier) | `dragonstarcurier` | | | [Track Dragon Star Curier](https://lastscanned.com/lookup/dragonstarcurier) | | [Drop2Shop](https://docs.lastscanned.com/carriers/drop2shop) | `drop2shop` | `/^GLB\d{13}$/` | | [Track Drop2Shop](https://lastscanned.com/lookup/drop2shop) | | [Dropp](https://docs.lastscanned.com/carriers/dropp) | `dropp` | | | [Track Dropp](https://lastscanned.com/lookup/dropp) | | [DSV](https://docs.lastscanned.com/carriers/dsv) | `dsv` | | | [Track DSV](https://lastscanned.com/lookup/dsv) | | [Early Bird](https://docs.lastscanned.com/carriers/earlybird) | `earlybird` | | | [Track Early Bird](https://lastscanned.com/lookup/earlybird) | | [Easy Mail](https://docs.lastscanned.com/carriers/easymail) | `easymail` | | | [Track Easy Mail](https://lastscanned.com/lookup/easymail) | | [Egypt Post](https://docs.lastscanned.com/carriers/egyptpost) | `egyptpost` | `S10 *EG` with a valid check digit (`/^[A-Z]{2}\d{9}EG$/`) or `/^[A-Z]{3}\d{8}EG$/` | | [Track Egypt Post](https://lastscanned.com/lookup/egyptpost) | | [Ekart](https://docs.lastscanned.com/carriers/ekart) | `ekart` | `/^(?:AMI\|BAL\|BGS\|BSI\|DEL\|FLO\|FMP\|GLA\|LUA\|MY[ENS]\|SDL\|SHO\|SPO\|SRT\|TEL)[CPR]\d{10}$/` | | [Track Ekart](https://lastscanned.com/lookup/ekart) | | [eMile](https://docs.lastscanned.com/carriers/emile) | `emile` | `/^EM\d{12}CA$/` or `/^EM\d{16}CA$/` | | [Track eMile](https://lastscanned.com/lookup/emile) | | [EMS Vietnam](https://docs.lastscanned.com/carriers/emsvietnam) | `emsvietnam` | `S10 *VN` with a valid check digit (`/^[A-Z]{2}\d{9}VN$/`) or `/^E[A-Z]\d{9}VN$/` | | [Track EMS Vietnam](https://lastscanned.com/lookup/emsvietnam) | | [Envia Colombia](https://docs.lastscanned.com/carriers/enviacolombia) | `enviacolombia` | | | [Track Envia Colombia](https://lastscanned.com/lookup/enviacolombia) | | [Envialia](https://docs.lastscanned.com/carriers/envialia) | `envialia` | | | [Track Envialia](https://lastscanned.com/lookup/envialia) | | [Estes Express](https://docs.lastscanned.com/carriers/estes) | `estes` | | | [Track Estes Express](https://lastscanned.com/lookup/estes) | | [EuroExpress](https://docs.lastscanned.com/carriers/euroexpressba) | `euroexpressba` | | | [Track EuroExpress](https://lastscanned.com/lookup/euroexpressba) | | [Evdemo Lojistik](https://docs.lastscanned.com/carriers/evdemo) | `evdemo` | | | [Track Evdemo Lojistik](https://lastscanned.com/lookup/evdemo) | | [Evropat](https://docs.lastscanned.com/carriers/evropat) | `evropat` | | | [Track Evropat](https://lastscanned.com/lookup/evropat) | | [EWE](https://docs.lastscanned.com/carriers/ewe) | `ewe` | `/^EMC\d{11}$/` or `/^AMZ\d{10}$/` | | [Track EWE](https://lastscanned.com/lookup/ewe) | | [Exelot](https://docs.lastscanned.com/carriers/exelot) | `exelot` | `/^XLT\d{9}$/` | | [Track Exelot](https://lastscanned.com/lookup/exelot) | | [Exline](https://docs.lastscanned.com/carriers/exline) | `exline` | | | [Track Exline](https://lastscanned.com/lookup/exline) | | [Exmate](https://docs.lastscanned.com/carriers/exmate) | `exmate` | `/^EXK\d{8}J$/` | | [Track Exmate](https://lastscanned.com/lookup/exmate) | | [Express One](https://docs.lastscanned.com/carriers/expressone) | `expressone` | | | [Track Express One](https://lastscanned.com/lookup/expressone) | | [Fargo](https://docs.lastscanned.com/carriers/fargouz) | `fargouz` | `/^TEZ\d{6,10}$/` | | [Track Fargo](https://lastscanned.com/lookup/fargouz) | | [Fastfrate](https://docs.lastscanned.com/carriers/fastfrate) | `fastfrate` | | | [Track Fastfrate](https://lastscanned.com/lookup/fastfrate) | | [FedEx Freight](https://docs.lastscanned.com/carriers/fedexfreight) | `fedexfreight` | | | [Track FedEx Freight](https://lastscanned.com/lookup/fedexfreight) | | [FedEx Poland](https://docs.lastscanned.com/carriers/fedexpl) | `fedexpl` | | | [Track FedEx Poland](https://lastscanned.com/lookup/fedexpl) | | [Fermopoint](https://docs.lastscanned.com/carriers/fermopoint) | `fermopoint` | | | [Track Fermopoint](https://lastscanned.com/lookup/fermopoint) | | [First Line](https://docs.lastscanned.com/carriers/firstline) | `firstline` | `/^1ST\d{11}$/` | | [Track First Line](https://lastscanned.com/lookup/firstline) | | [Flash Express Philippines](https://docs.lastscanned.com/carriers/flashexpressph) | `flashexpressph` | | `/^P\d{4}[0-9A-Z]{6,7}[A-Z]$/` | [Track Flash Express Philippines](https://lastscanned.com/lookup/flashexpressph) | | [FleetExpress](https://docs.lastscanned.com/carriers/fleetex) | `fleetex` | | `/^(?:SR\|DS)\d{12}$/` | [Track FleetExpress](https://lastscanned.com/lookup/fleetex) | | [FleetOptics](https://docs.lastscanned.com/carriers/fleetoptics) | `fleetoptics` | `/^F(?:OAESH\d{7}\|ONSP\d{11}\|DAV\d{16}\|DYNS[0-9A-Z]{11}\|CLR\d{12}\|SLS\d{15}\|EPO\d{15})$/` | | [Track FleetOptics](https://lastscanned.com/lookup/fleetoptics) | | [Flip Post](https://docs.lastscanned.com/carriers/flippost) | `flippost` | `/^\d{2}-\d{3}-\d{3}$/` | | [Track Flip Post](https://lastscanned.com/lookup/flippost) | | [Followmont](https://docs.lastscanned.com/carriers/followmont) | `followmont` | | | [Track Followmont](https://lastscanned.com/lookup/followmont) | | [Forward Air](https://docs.lastscanned.com/carriers/forwardair) | `forwardair` | | | [Track Forward Air](https://lastscanned.com/lookup/forwardair) | | [Forza Delivery](https://docs.lastscanned.com/carriers/forzadelivery) | `forzadelivery` | `/^FD\d{6,9}$/` | | [Track Forza Delivery](https://lastscanned.com/lookup/forzadelivery) | | [Foxpost](https://docs.lastscanned.com/carriers/foxpost) | `foxpost` | `/^CLFOX\d{15}$/` | | [Track Foxpost](https://lastscanned.com/lookup/foxpost) | | [Franch Express](https://docs.lastscanned.com/carriers/franchexpress) | `franchexpress` | | | [Track Franch Express](https://lastscanned.com/lookup/franchexpress) | | [Geniki Taxydromiki](https://docs.lastscanned.com/carriers/genikitaxydromiki) | `genikitaxydromiki` | | | [Track Geniki Taxydromiki](https://lastscanned.com/lookup/genikitaxydromiki) | | [GlobalPost](https://docs.lastscanned.com/carriers/globalpost) | `globalpost` | `/^GP[A-Z]{4}\d{10}(US\|GB)$/` | | [Track GlobalPost](https://lastscanned.com/lookup/globalpost) | | [GLS France](https://docs.lastscanned.com/carriers/glsfr) | `glsfr` | | `/^00(?=[A-Z0-9]{6}$)(?=.*[A-Z])(?=.*\d)[A-Z0-9]{6}$/` | [Track GLS France](https://lastscanned.com/lookup/glsfr) | | [GLS Italy](https://docs.lastscanned.com/carriers/glsit) | `glsit` | | `/^[A-Z]{2}\d{9}$/` | [Track GLS Italy](https://lastscanned.com/lookup/glsit) | | [GMS Worldwide Express](https://docs.lastscanned.com/carriers/gmsworldwide) | `gmsworldwide` | | | [Track GMS Worldwide Express](https://lastscanned.com/lookup/gmsworldwide) | | [GO4](https://docs.lastscanned.com/carriers/go4) | `go4` | | | [Track GO4](https://lastscanned.com/lookup/go4) | | [GoBolt](https://docs.lastscanned.com/carriers/gobolt) | `gobolt` | | | [Track GoBolt](https://lastscanned.com/lookup/gobolt) | | [GO! Express](https://docs.lastscanned.com/carriers/goexpress) | `goexpress` | | | [Track GO! Express](https://lastscanned.com/lookup/goexpress) | | [GOFO France](https://docs.lastscanned.com/carriers/gofofr) | `gofofr` | `/^(GFFR\d{13,14}\|CIFR\d{14})$/` | `/^PK-?\d{19}-?\d$/` | [Track GOFO France](https://lastscanned.com/lookup/gofofr) | | [GOFO Italy](https://docs.lastscanned.com/carriers/gofoit) | `gofoit` | | | [Track GOFO Italy](https://lastscanned.com/lookup/gofoit) | | [GOFO Netherlands](https://docs.lastscanned.com/carriers/gofonl) | `gofonl` | | | [Track GOFO Netherlands](https://lastscanned.com/lookup/gofonl) | | [GoGo Xpress](https://docs.lastscanned.com/carriers/gogoxpress) | `gogoxpress` | | | [Track GoGo Xpress](https://lastscanned.com/lookup/gogoxpress) | | [Grand Slam Express](https://docs.lastscanned.com/carriers/grandslamexpress) | `grandslamexpress` | | | [Track Grand Slam Express](https://lastscanned.com/lookup/grandslamexpress) | | [GS Postbox](https://docs.lastscanned.com/carriers/gspostbox) | `gspostbox` | | | [Track GS Postbox](https://lastscanned.com/lookup/gspostbox) | | [GTA AirSkip](https://docs.lastscanned.com/carriers/gtaairskip) | `gtaairskip` | `/^GR[GS]\d{5}[0-9A-Z]{11}$/` | | [Track GTA AirSkip](https://lastscanned.com/lookup/gtaairskip) | | [GoTo Logistics](https://docs.lastscanned.com/carriers/gtlgoto) | `gtlgoto` | `/^(TKGTL[0-9A-Z]{11}\|GTL\d{10})$/` | | [Track GoTo Logistics](https://lastscanned.com/lookup/gtlgoto) | | [Happy-Post](https://docs.lastscanned.com/carriers/happypost) | `happypost` | | | [Track Happy-Post](https://lastscanned.com/lookup/happypost) | | [HayPost](https://docs.lastscanned.com/carriers/haypost) | `haypost` | `S10 *AM` with a valid check digit (`/^[A-Z]{2}\d{9}AM$/`) | | [Track HayPost](https://lastscanned.com/lookup/haypost) | | [Helthjem](https://docs.lastscanned.com/carriers/helthjem) | `helthjem` | `/^(00)?37072476\d{10}$/` | | [Track Helthjem](https://lastscanned.com/lookup/helthjem) | | [HepsiJET](https://docs.lastscanned.com/carriers/hepsijet) | `hepsijet` | | | [Track HepsiJET](https://lastscanned.com/lookup/hepsijet) | | [Hermes Austria](https://docs.lastscanned.com/carriers/hermesat) | `hermesat` | | | [Track Hermes Austria](https://lastscanned.com/lookup/hermesat) | | [Hispapost](https://docs.lastscanned.com/carriers/hispapost) | `hispapost` | | `/^CNES\d{11}$/` | [Track Hispapost](https://lastscanned.com/lookup/hispapost) | | [Hongkong Post](https://docs.lastscanned.com/carriers/hongkongpost) | `hongkongpost` | `S10 *HK` with a valid check digit (`/^[A-Z]{2}\d{9}HK$/`) | | [Track Hongkong Post](https://lastscanned.com/lookup/hongkongpost) | | [Hovership](https://docs.lastscanned.com/carriers/hovership) | `hovership` | | `/^HV[A-Z0-9]{8}$/` | [Track Hovership](https://lastscanned.com/lookup/hovership) | | [HR Parcel](https://docs.lastscanned.com/carriers/hrparcel) | `hrparcel` | | | [Track HR Parcel](https://lastscanned.com/lookup/hrparcel) | | [Hrvatska pošta](https://docs.lastscanned.com/carriers/hrvatskaposta) | `hrvatskaposta` | `S10 *HR` with a valid check digit (`/^[A-Z]{2}\d{9}HR$/`) | | [Track Hrvatska pošta](https://lastscanned.com/lookup/hrvatskaposta) | | [Huiyi Logistics](https://docs.lastscanned.com/carriers/hywl) | `hywl` | `/^TRK[0-9A-F]{12}$/` | | [Track Huiyi Logistics](https://lastscanned.com/lookup/hywl) | | [Ilyang Logis](https://docs.lastscanned.com/carriers/ilyanglogis) | `ilyanglogis` | | | [Track Ilyang Logis](https://lastscanned.com/lookup/ilyanglogis) | | [iMile](https://docs.lastscanned.com/carriers/imile) | `imile` | `/^IM0601\d{10}$/` | | [Track iMile](https://lastscanned.com/lookup/imile) | | [Indah Logistik](https://docs.lastscanned.com/carriers/indahlogistik) | `indahlogistik` | `/^[A-Z]{3}1CS(?:\d{8}\|(?:PL)?\d{12})$/` | | [Track Indah Logistik](https://lastscanned.com/lookup/indahlogistik) | | [Integral Pack](https://docs.lastscanned.com/carriers/integralpack) | `integralpack` | `/^IPE-\d{4}-[A-Z]-\d{8}$/` | | [Track Integral Pack](https://lastscanned.com/lookup/integralpack) | | [Internet Express](https://docs.lastscanned.com/carriers/internetexpress) | `internetexpress` | | | [Track Internet Express](https://lastscanned.com/lookup/internetexpress) | | [Inter Rapidísimo](https://docs.lastscanned.com/carriers/interrapidisimo) | `interrapidisimo` | | | [Track Inter Rapidísimo](https://lastscanned.com/lookup/interrapidisimo) | | [Israel Post](https://docs.lastscanned.com/carriers/israelpost) | `israelpost` | `S10 *IL` with a valid check digit (`/^[A-Z]{2}\d{9}IL$/`) | | [Track Israel Post](https://lastscanned.com/lookup/israelpost) | | [J&T Express Australia](https://docs.lastscanned.com/carriers/jandtau) | `jandtau` | `/^JTAU\d{12}$/` | | [Track J&T Express Australia](https://lastscanned.com/lookup/jandtau) | | [J&T Cargo](https://docs.lastscanned.com/carriers/jandtcargo) | `jandtcargo` | | | [Track J&T Cargo](https://lastscanned.com/lookup/jandtcargo) | | [J&T Express Germany](https://docs.lastscanned.com/carriers/jandtde) | `jandtde` | `/^JTDE\d{12}$/` | | [Track J&T Express Germany](https://lastscanned.com/lookup/jandtde) | | [Janio](https://docs.lastscanned.com/carriers/janio) | `janio` | `/^JN[A-Z]{2}\d{12}$/` | | [Track Janio](https://lastscanned.com/lookup/janio) | | [JCEX](https://docs.lastscanned.com/carriers/jcex) | `jcex` | `/^JCZ\d{10}DH$/` | | [Track JCEX](https://lastscanned.com/lookup/jcex) | | [JD Logistics](https://docs.lastscanned.com/carriers/jdlogistics) | `jdlogistics` | `/^(?:VG\d{11}\|JD(?:[A-Z]\d{12}\|[A-Z]{2}\d{11}))$/` | | [Track JD Logistics](https://lastscanned.com/lookup/jdlogistics) | | [Jersey Post](https://docs.lastscanned.com/carriers/jerseypost) | `jerseypost` | `S10 *JE` with a valid check digit (`/^[A-Z]{2}\d{9}JE$/`) | | [Track Jersey Post](https://lastscanned.com/lookup/jerseypost) | | [Jetline Couriers](https://docs.lastscanned.com/carriers/jetlinecouriers) | `jetlinecouriers` | | | [Track Jetline Couriers](https://lastscanned.com/lookup/jetlinecouriers) | | [Jet Logistic](https://docs.lastscanned.com/carriers/jetlogistic) | `jetlogistic` | | | [Track Jet Logistic](https://lastscanned.com/lookup/jetlogistic) | | [JNE](https://docs.lastscanned.com/carriers/jne) | `jne` | `/^JT\d{11}$/` | | [Track JNE](https://lastscanned.com/lookup/jne) | | [JS Express](https://docs.lastscanned.com/carriers/jsexpress) | `jsexpress` | `/^JSE[A-Z]{2}\d{10}YQ$/` | | [Track JS Express](https://lastscanned.com/lookup/jsexpress) | | [Jumppoint](https://docs.lastscanned.com/carriers/jumppoint) | `jumppoint` | `/^JP\d{12}$/` | | [Track Jumppoint](https://lastscanned.com/lookup/jumppoint) | | [Kazpost](https://docs.lastscanned.com/carriers/kazpost) | `kazpost` | `S10 *KZ` with a valid check digit (`/^[A-Z]{2}\d{9}KZ$/`) | | [Track Kazpost](https://lastscanned.com/lookup/kazpost) | | [KEX Express Hong Kong](https://docs.lastscanned.com/carriers/kexexpresshk) | `kexexpresshk` | `/^KEHKAZ\d{8}$/` | `/^L\d{9}$/` | [Track KEX Express Hong Kong](https://lastscanned.com/lookup/kexexpresshk) | | [Kun Express](https://docs.lastscanned.com/carriers/kunexpress) | `kunexpress` | `/^KUN\d{10}$/` | | [Track Kun Express](https://lastscanned.com/lookup/kunexpress) | | [Kunyoung Express](https://docs.lastscanned.com/carriers/kunyoung) | `kunyoung` | | | [Track Kunyoung Express](https://lastscanned.com/lookup/kunyoung) | | [Kyungdong Express](https://docs.lastscanned.com/carriers/kyoungdong) | `kyoungdong` | | | [Track Kyungdong Express](https://lastscanned.com/lookup/kyoungdong) | | [Kyrgyz Post](https://docs.lastscanned.com/carriers/kyrgyzpost) | `kyrgyzpost` | `S10 *KG` with a valid check digit (`/^[A-Z]{2}\d{9}KG$/`) | | [Track Kyrgyz Post](https://lastscanned.com/lookup/kyrgyzpost) | | [Laar Courier](https://docs.lastscanned.com/carriers/laarcourier) | `laarcourier` | | | [Track Laar Courier](https://lastscanned.com/lookup/laarcourier) | | [LaBaih](https://docs.lastscanned.com/carriers/labaih) | `labaih` | | | [Track LaBaih](https://lastscanned.com/lookup/labaih) | | [La Poste Burkina Faso](https://docs.lastscanned.com/carriers/laposteburkinafaso) | `laposteburkinafaso` | `S10 *BF` with a valid check digit (`/^[A-Z]{2}\d{9}BF$/`) | | [Track La Poste Burkina Faso](https://lastscanned.com/lookup/laposteburkinafaso) | | [La Poste du Sénégal](https://docs.lastscanned.com/carriers/lapostesenegal) | `lapostesenegal` | `S10 *SN` with a valid check digit (`/^[A-Z]{2}\d{9}SN$/`) | | [Track La Poste du Sénégal](https://lastscanned.com/lookup/lapostesenegal) | | [Last One Mile Co-op](https://docs.lastscanned.com/carriers/lastonemilecoop) | `lastonemilecoop` | | | [Track Last One Mile Co-op](https://lastscanned.com/lookup/lastonemilecoop) | | [Leopards Courier](https://docs.lastscanned.com/carriers/leopardscourier) | `leopardscourier` | | | [Track Leopards Courier](https://lastscanned.com/lookup/leopardscourier) | | [Liccardi Express Courier](https://docs.lastscanned.com/carriers/liccardi) | `liccardi` | | | [Track Liccardi Express Courier](https://lastscanned.com/lookup/liccardi) | | [Lietuvos paštas](https://docs.lastscanned.com/carriers/lietuvospastas) | `lietuvospastas` | `/^(CC\|CH\|HC)\d{9}LT$/` | | [Track Lietuvos paštas](https://lastscanned.com/lookup/lietuvospastas) | | [Lightning Express](https://docs.lastscanned.com/carriers/lightningexpress) | `lightningexpress` | `/^[A-Z]{3}\d{3}20\d{2}[01]\d[0-3]\d\d{4}$/` | | [Track Lightning Express](https://lastscanned.com/lookup/lightningexpress) | | [Line Clear Express](https://docs.lastscanned.com/carriers/lineclear) | `lineclear` | | | [Track Line Clear Express](https://lastscanned.com/lookup/lineclear) | | [LinHan International](https://docs.lastscanned.com/carriers/linhan) | `linhan` | `/^LHGJ\d{8}CD$/` | | [Track LinHan International](https://lastscanned.com/lookup/linhan) | | [Lion Parcel](https://docs.lastscanned.com/carriers/lionparcel) | `lionparcel` | `/^\d{2}LP\d{10,13}$/` | | [Track Lion Parcel](https://lastscanned.com/lookup/lionparcel) | | [Logistiq](https://docs.lastscanned.com/carriers/logistiq) | `logistiq` | `/^ALAEAEF\d{9}$/` | `/^AL[A-Z]{5,6}\d{9}$/` | [Track Logistiq](https://lastscanned.com/lookup/logistiq) | | [L-POST](https://docs.lastscanned.com/carriers/lpost) | `lpost` | `/^ABC\d{8}$/` | | [Track L-POST](https://lastscanned.com/lookup/lpost) | | [Madhur Courier](https://docs.lastscanned.com/carriers/madhurcourier) | `madhurcourier` | | `/^P\d{9}$/` | [Track Madhur Courier](https://lastscanned.com/lookup/madhurcourier) | | [MailAmericas](https://docs.lastscanned.com/carriers/mailamericas) | `mailamericas` | `/^ML[A-Z]{2}\d{9}(?:R\|EX)$/` or `/^MMXQP\d{9}[ENR]$/` | | [Track MailAmericas](https://lastscanned.com/lookup/mailamericas) | | [MaltaPost](https://docs.lastscanned.com/carriers/maltapost) | `maltapost` | `S10 *MT` with a valid check digit (`/^[A-Z]{2}\d{9}MT$/`) | | [Track MaltaPost](https://lastscanned.com/lookup/maltapost) | | [Maritime-Ontario](https://docs.lastscanned.com/carriers/maritimeontario) | `maritimeontario` | | `/^F\d{7}$/` | [Track Maritime-Ontario](https://lastscanned.com/lookup/maritimeontario) | | [Mauritius Post](https://docs.lastscanned.com/carriers/mauritiuspost) | `mauritiuspost` | `S10 *MU` with a valid check digit (`/^[A-Z]{2}\d{9}MU$/`) | | [Track Mauritius Post](https://lastscanned.com/lookup/mauritiuspost) | | [Micro Express](https://docs.lastscanned.com/carriers/microexpress) | `microexpress` | `/^ME\d{13}[A-Z0-9]{3}$/` | | [Track Micro Express](https://lastscanned.com/lookup/microexpress) | | [Midland Transport](https://docs.lastscanned.com/carriers/midlandtransport) | `midlandtransport` | | `/^\d{16}$/` | [Track Midland Transport](https://lastscanned.com/lookup/midlandtransport) | | [M-ONE](https://docs.lastscanned.com/carriers/mone) | `mone` | | `/^PL\d{9}RS$/` | [Track M-ONE](https://lastscanned.com/lookup/mone) | | [Muller & Phipps](https://docs.lastscanned.com/carriers/mulphilog) | `mulphilog` | | | [Track Muller & Phipps](https://lastscanned.com/lookup/mulphilog) | | [Mylerz](https://docs.lastscanned.com/carriers/mylerz) | `mylerz` | | `/^63\d{12}$/` | [Track Mylerz](https://lastscanned.com/lookup/mylerz) | | [Next Level](https://docs.lastscanned.com/carriers/nextleveldelivery) | `nextleveldelivery` | | | [Track Next Level](https://lastscanned.com/lookup/nextleveldelivery) | | [Nim Express](https://docs.lastscanned.com/carriers/nimexpress) | `nimexpress` | | | [Track Nim Express](https://lastscanned.com/lookup/nimexpress) | | [nox](https://docs.lastscanned.com/carriers/nox) | `nox` | `/^SWR\d{21}$/` | | [Track nox](https://lastscanned.com/lookup/nox) | | [OCS ANA](https://docs.lastscanned.com/carriers/ocsana) | `ocsana` | | | [Track OCS ANA](https://lastscanned.com/lookup/ocsana) | | [Olva Courier](https://docs.lastscanned.com/carriers/olvacourier) | `olvacourier` | `/^ALI-OLVA\d{8}$/` | `/^(?:\d{2}-\d{6,8}\|\d{6,8}-\d{2})$/` | [Track Olva Courier](https://lastscanned.com/lookup/olvacourier) | | [One World Express](https://docs.lastscanned.com/carriers/oneworldexpress) | `oneworldexpress` | `/^OWE\d{12}$/` | | [Track One World Express](https://lastscanned.com/lookup/oneworldexpress) | | [ORLEN Paczka](https://docs.lastscanned.com/carriers/orlenpaczka) | `orlenpaczka` | | `/^210\d{10}$/` | [Track ORLEN Paczka](https://lastscanned.com/lookup/orlenpaczka) | | [Paack](https://docs.lastscanned.com/carriers/paack) | `paack` | `/^PK\d{18}$/` | | [Track Paack](https://lastscanned.com/lookup/paack) | | [Packlink](https://docs.lastscanned.com/carriers/packlink) | `packlink` | `/^[A-Z]{2}20\d{2}(?:COM\|PRO)\d{10}$/` | | [Track Packlink](https://lastscanned.com/lookup/packlink) | | [Pack-Man](https://docs.lastscanned.com/carriers/packman) | `packman` | | | [Track Pack-Man](https://lastscanned.com/lookup/packman) | | [PCP Express](https://docs.lastscanned.com/carriers/pcpexpress) | `pcpexpress` | | | [Track PCP Express](https://lastscanned.com/lookup/pcpexpress) | | [PDN Express](https://docs.lastscanned.com/carriers/pdnexpress) | `pdnexpress` | `/^PDN\d{10}$/` | | [Track PDN Express](https://lastscanned.com/lookup/pdnexpress) | | [PDQ Cargo Trader](https://docs.lastscanned.com/carriers/pdqchile) | `pdqchile` | | | [Track PDQ Cargo Trader](https://lastscanned.com/lookup/pdqchile) | | [PFC Express](https://docs.lastscanned.com/carriers/pfcexpress) | `pfcexpress` | | `/^R\d{5,6}2\d(?:0[1-9]\|1[0-2])(?:0[1-9]\|[12]\d\|3[01])\d{1,4}$/` | [Track PFC Express](https://lastscanned.com/lookup/pfcexpress) | | [Pilot Freight Services](https://docs.lastscanned.com/carriers/pilotfreight) | `pilotfreight` | | | [Track Pilot Freight Services](https://lastscanned.com/lookup/pilotfreight) | | [PITT OHIO](https://docs.lastscanned.com/carriers/pittohio) | `pittohio` | | `/^\d{10}$/` with the mod-7 check digit | [Track PITT OHIO](https://lastscanned.com/lookup/pittohio) | | [Pošta na Severna Makedonija](https://docs.lastscanned.com/carriers/postamk) | `postamk` | `S10 *MK` with a valid check digit (`/^[A-Z]{2}\d{9}MK$/`) | | [Track Pošta na Severna Makedonija](https://lastscanned.com/lookup/postamk) | | [POST Luxembourg](https://docs.lastscanned.com/carriers/postluxembourg) | `postluxembourg` | `S10 *LU` with a valid check digit (`/^[A-Z]{2}\d{9}LU$/`) | | [Track POST Luxembourg](https://lastscanned.com/lookup/postluxembourg) | | [PPL](https://docs.lastscanned.com/carriers/ppl) | `ppl` | | | [Track PPL](https://lastscanned.com/lookup/ppl) | | [Precision Deliveries](https://docs.lastscanned.com/carriers/precisiondeliveries) | `precisiondeliveries` | `/^ASL\d{10}$/` | | [Track Precision Deliveries](https://lastscanned.com/lookup/precisiondeliveries) | | [ProShips](https://docs.lastscanned.com/carriers/proships) | `proships` | | `/^ML\d{9}MH$/` | [Track ProShips](https://lastscanned.com/lookup/proships) | | [Pullman Cargo](https://docs.lastscanned.com/carriers/pullmancargo) | `pullmancargo` | | | [Track Pullman Cargo](https://lastscanned.com/lookup/pullmancargo) | | [Quiqup](https://docs.lastscanned.com/carriers/quiqup) | `quiqup` | | | [Track Quiqup](https://lastscanned.com/lookup/quiqup) | | [Raben](https://docs.lastscanned.com/carriers/raben) | `raben` | | `/^276(?:574\|634)\d{9}$/` | [Track Raben](https://lastscanned.com/lookup/raben) | | [RAM Hand-to-Hand Couriers](https://docs.lastscanned.com/carriers/ramh2h) | `ramh2h` | `/^RAM\d{8}$/` | | [Track RAM Hand-to-Hand Couriers](https://lastscanned.com/lookup/ramh2h) | | [Relais Colis](https://docs.lastscanned.com/carriers/relaiscolis) | `relaiscolis` | `/^CC\d{10,14}$/` | | [Track Relais Colis](https://lastscanned.com/lookup/relaiscolis) | | [R+L Carriers](https://docs.lastscanned.com/carriers/rlcarriers) | `rlcarriers` | | | [Track R+L Carriers](https://lastscanned.com/lookup/rlcarriers) | | [Roadrunner](https://docs.lastscanned.com/carriers/roadrunner) | `roadrunner` | | | [Track Roadrunner](https://lastscanned.com/lookup/roadrunner) | | [RPX Indonesia](https://docs.lastscanned.com/carriers/rpxindonesia) | `rpxindonesia` | | | [Track RPX Indonesia](https://lastscanned.com/lookup/rpxindonesia) | | [Saia](https://docs.lastscanned.com/carriers/saia) | `saia` | | | [Track Saia](https://lastscanned.com/lookup/saia) | | [Sailpost](https://docs.lastscanned.com/carriers/sailpost) | `sailpost` | | | [Track Sailpost](https://lastscanned.com/lookup/sailpost) | | [SAP Express](https://docs.lastscanned.com/carriers/sapxexpress) | `sapxexpress` | | | [Track SAP Express](https://lastscanned.com/lookup/sapxexpress) | | [SAT](https://docs.lastscanned.com/carriers/satukraine) | `satukraine` | | | [Track SAT](https://lastscanned.com/lookup/satukraine) | | [SEKO Logistics](https://docs.lastscanned.com/carriers/seko) | `seko` | | | [Track SEKO Logistics](https://lastscanned.com/lookup/seko) | | [Shree Anjani Courier](https://docs.lastscanned.com/carriers/shreeanjani) | `shreeanjani` | | | [Track Shree Anjani Courier](https://lastscanned.com/lookup/shreeanjani) | | [Skroutz Last Mile](https://docs.lastscanned.com/carriers/skroutzlastmile) | `skroutzlastmile` | | | [Track Skroutz Last Mile](https://lastscanned.com/lookup/skroutzlastmile) | | [SkyKing](https://docs.lastscanned.com/carriers/skyking) | `skyking` | | | [Track SkyKing](https://lastscanned.com/lookup/skyking) | | [Slovenská pošta](https://docs.lastscanned.com/carriers/slovenskaposta) | `slovenskaposta` | `S10 *SK` with a valid check digit (`/^[A-Z]{2}\d{9}SK$/`) | | [Track Slovenská pošta](https://lastscanned.com/lookup/slovenskaposta) | | [Southeastern Freight Lines](https://docs.lastscanned.com/carriers/southeasternfreightlines) | `southeasternfreightlines` | | | [Track Southeastern Freight Lines](https://lastscanned.com/lookup/southeasternfreightlines) | | [Gokulam Speed & Safe](https://docs.lastscanned.com/carriers/speedandsafe) | `speedandsafe` | | | [Track Gokulam Speed & Safe](https://lastscanned.com/lookup/speedandsafe) | | [Speedex](https://docs.lastscanned.com/carriers/speedex) | `speedex` | | | [Track Speedex](https://lastscanned.com/lookup/speedex) | | [SPX Express Brazil](https://docs.lastscanned.com/carriers/spxbr) | `spxbr` | | `/^BR\d{12}[0-9A-Z]$/` | [Track SPX Express Brazil](https://lastscanned.com/lookup/spxbr) | | [Sundarban Courier](https://docs.lastscanned.com/carriers/sundarbancourier) | `sundarbancourier` | | | [Track Sundarban Courier](https://lastscanned.com/lookup/sundarbancourier) | | [Tanzania Posts](https://docs.lastscanned.com/carriers/tanzaniaposts) | `tanzaniaposts` | `S10 *TZ` with a valid check digit (`/^[A-Z]{2}\d{9}TZ$/`) | | [Track Tanzania Posts](https://lastscanned.com/lookup/tanzaniaposts) | | [Taxydema](https://docs.lastscanned.com/carriers/taxydema) | `taxydema` | | | [Track Taxydema](https://lastscanned.com/lookup/taxydema) | | [TCI Express](https://docs.lastscanned.com/carriers/tciexpress) | `tciexpress` | | | [Track TCI Express](https://lastscanned.com/lookup/tciexpress) | | [TCS](https://docs.lastscanned.com/carriers/tcspakistan) | `tcspakistan` | | | [Track TCS](https://lastscanned.com/lookup/tcspakistan) | | [TDN](https://docs.lastscanned.com/carriers/tdn) | `tdn` | | | [Track TDN](https://lastscanned.com/lookup/tdn) | | [Tealca](https://docs.lastscanned.com/carriers/tealca) | `tealca` | | | [Track Tealca](https://lastscanned.com/lookup/tealca) | | [Team Express](https://docs.lastscanned.com/carriers/teamexpressae) | `teamexpressae` | | | [Track Team Express](https://lastscanned.com/lookup/teamexpressae) | | [Team Worldwide](https://docs.lastscanned.com/carriers/teamworldwide) | `teamworldwide` | | | [Track Team Worldwide](https://lastscanned.com/lookup/teamworldwide) | | [Teleship](https://docs.lastscanned.com/carriers/teleship) | `teleship` | `/^TSGB[A-Z]{2}[A-Z0-9]{15}$/` | | [Track Teleship](https://lastscanned.com/lookup/teleship) | | [TFM Express](https://docs.lastscanned.com/carriers/tfmexpress) | `tfmexpress` | | | [Track TFM Express](https://lastscanned.com/lookup/tfmexpress) | | [Tgroup](https://docs.lastscanned.com/carriers/tgroup) | `tgroup` | `/^3010TGR\d{14}$/` | | [Track Tgroup](https://lastscanned.com/lookup/tgroup) | | [Shree Tirupati Courier](https://docs.lastscanned.com/carriers/tirupaticourier) | `tirupaticourier` | | | [Track Shree Tirupati Courier](https://lastscanned.com/lookup/tirupaticourier) | | [TNT Italy](https://docs.lastscanned.com/carriers/tntit) | `tntit` | | | [Track TNT Italy](https://lastscanned.com/lookup/tntit) | | [Torrestir](https://docs.lastscanned.com/carriers/torrestir) | `torrestir` | `/^M001\d{4}[0-9A-Z]\d{11}$/` | | [Track Torrestir](https://lastscanned.com/lookup/torrestir) | | [Trackon](https://docs.lastscanned.com/carriers/trackon) | `trackon` | | | [Track Trackon](https://lastscanned.com/lookup/trackon) | | [Transcorp](https://docs.lastscanned.com/carriers/transcorp) | `transcorp` | | | [Track Transcorp](https://lastscanned.com/lookup/transcorp) | | [TST-CF Express](https://docs.lastscanned.com/carriers/tstcfexpress) | `tstcfexpress` | | | [Track TST-CF Express](https://lastscanned.com/lookup/tstcfexpress) | | [TufesaPack](https://docs.lastscanned.com/carriers/tufesa) | `tufesa` | | | [Track TufesaPack](https://lastscanned.com/lookup/tufesa) | | [United Delivery Service](https://docs.lastscanned.com/carriers/uniteddeliveryservice) | `uniteddeliveryservice` | `/^APUDS\d{8}$/` | | [Track United Delivery Service](https://lastscanned.com/lookup/uniteddeliveryservice) | | [Upaya](https://docs.lastscanned.com/carriers/upaya) | `upaya` | `/^[A-Z]{6}\d{4}-\d{7}$/` | | [Track Upaya](https://lastscanned.com/lookup/upaya) | | [Urbano](https://docs.lastscanned.com/carriers/urbano) | `urbano` | | | [Track Urbano](https://lastscanned.com/lookup/urbano) | | [Uzbekistan Post](https://docs.lastscanned.com/carriers/uzbekistanpost) | `uzbekistanpost` | `S10 *UZ` with a valid check digit (`/^[A-Z]{2}\d{9}UZ$/`) | | [Track Uzbekistan Post](https://lastscanned.com/lookup/uzbekistanpost) | | [Veloces](https://docs.lastscanned.com/carriers/veloces) | `veloces` | | `/^V\d{10}$/` | [Track Veloces](https://lastscanned.com/lookup/veloces) | | [Via Cargo](https://docs.lastscanned.com/carriers/viacargo) | `viacargo` | | | [Track Via Cargo](https://lastscanned.com/lookup/viacargo) | | [Vimenpaq](https://docs.lastscanned.com/carriers/vimenpaq) | `vimenpaq` | | | [Track Vimenpaq](https://lastscanned.com/lookup/vimenpaq) | | [VRL Logistics](https://docs.lastscanned.com/carriers/vrllogistics) | `vrllogistics` | | | [Track VRL Logistics](https://lastscanned.com/lookup/vrllogistics) | | [Whistl](https://docs.lastscanned.com/carriers/whistl) | `whistl` | | `/^TYP[A-Z]{3}\d{9}$/` | [Track Whistl](https://lastscanned.com/lookup/whistl) | | [XDE Logistics](https://docs.lastscanned.com/carriers/xdelogistics) | `xdelogistics` | `/^XSO\d{12}$/` | | [Track XDE Logistics](https://lastscanned.com/lookup/xdelogistics) | | [XLCourier](https://docs.lastscanned.com/carriers/xlcourier) | `xlcourier` | `/^XLC\d{10,12}$/` | | [Track XLCourier](https://lastscanned.com/lookup/xlcourier) | | [XPO](https://docs.lastscanned.com/carriers/xpoltl) | `xpoltl` | | `/^\d{9}$/` | [Track XPO](https://lastscanned.com/lookup/xpoltl) | | [YCS Logistics](https://docs.lastscanned.com/carriers/ycslogistics) | `ycslogistics` | | | [Track YCS Logistics](https://lastscanned.com/lookup/ycslogistics) | | [Yunda Express](https://docs.lastscanned.com/carriers/yunda) | `yunda` | | | [Track Yunda Express](https://lastscanned.com/lookup/yunda) | | [Dohrn Transfer](https://docs.lastscanned.com/carriers/dohrn) | `dohrn` | | | [Track Dohrn Transfer](https://lastscanned.com/lookup/dohrn) | | [Horoz Lojistik](https://docs.lastscanned.com/carriers/horoz) | `horoz` | | | [Track Horoz Lojistik](https://lastscanned.com/lookup/horoz) | | [dao](https://docs.lastscanned.com/carriers/dao) | `dao` | `/^000(?:5712696\|5715127)\d{10}$/` | | [Track dao](https://lastscanned.com/lookup/dao) | | [Morning Global](https://docs.lastscanned.com/carriers/morningglobal) | `morningglobal` | | `/^BR\d{9}MG$/` | [Track Morning Global](https://lastscanned.com/lookup/morningglobal) | | [Jordan Post](https://docs.lastscanned.com/carriers/jordanpost) | `jordanpost` | `S10 *JO` with a valid check digit (`/^[A-Z]{2}\d{9}JO$/`) | | [Track Jordan Post](https://lastscanned.com/lookup/jordanpost) | | [China Post](https://docs.lastscanned.com/carriers/chinapost) | `chinapost` | custom (see the carrier page) | | [Track China Post](https://lastscanned.com/lookup/chinapost) | | [Gati](https://docs.lastscanned.com/carriers/gati) | `gati` | | | [Track Gati](https://lastscanned.com/lookup/gati) | | [Zajil Express](https://docs.lastscanned.com/carriers/zajil) | `zajil` | | | [Track Zajil Express](https://lastscanned.com/lookup/zajil) | | [SwiftX Express](https://docs.lastscanned.com/carriers/swiftx) | `swiftx` | `SWX` + 18 digits | | [Track SwiftX Express](https://lastscanned.com/lookup/swiftx) | | [Maersk](https://docs.lastscanned.com/carriers/maersk) | `maersk` | Container `/^(MSKU\|MRKU\|MRSU\|MNBU\|SUDU)\d{7}$/` with the ISO 6346 check digit | | [Track Maersk](https://lastscanned.com/lookup/maersk) | | [MSC](https://docs.lastscanned.com/carriers/msc) | `msc` | Container `/^(MSCU\|MEDU\|MSDU\|MSMU\|MSNU\|MSBU)\d{7}$/` with the ISO 6346 check digit | | [Track MSC](https://lastscanned.com/lookup/msc) | | [COSCO Shipping](https://docs.lastscanned.com/carriers/cosco) | `cosco` | Container `/^(CSNU\|CBHU\|CCLU\|CSLU\|FCIU)\d{7}$/` with the ISO 6346 check digit | | [Track COSCO Shipping](https://lastscanned.com/lookup/cosco) | | [Evergreen](https://docs.lastscanned.com/carriers/evergreen) | `evergreen` | Container `/^(EGHU\|EGSU\|EISU\|EITU)\d{7}$/` with the ISO 6346 check digit | | [Track Evergreen](https://lastscanned.com/lookup/evergreen) | | [ONE (Ocean Network Express)](https://docs.lastscanned.com/carriers/one) | `one` | Container `/^(ONEU\|KKFU)\d{7}$/` with the ISO 6346 check digit | | [Track ONE](https://lastscanned.com/lookup/one) | | [Yang Ming](https://docs.lastscanned.com/carriers/yangming) | `yangming` | Container `/^YMMU\d{7}$/` with the ISO 6346 check digit | | [Track Yang Ming](https://lastscanned.com/lookup/yangming) | | [OCA](https://docs.lastscanned.com/carriers/oca) | `oca` | | `/^\d{19}$/` | [Track OCA](https://lastscanned.com/lookup/oca) | | [OCASA](https://docs.lastscanned.com/carriers/ocasa) | `ocasa` | | (none: needs `?carrier=ocasa`) | [Track OCASA](https://lastscanned.com/lookup/ocasa) | | [Coordinadora](https://docs.lastscanned.com/carriers/coordinadora) | `coordinadora` | | (none: needs `?carrier=coordinadora`) | [Track Coordinadora](https://lastscanned.com/lookup/coordinadora) | | [HCT Logistics](https://docs.lastscanned.com/carriers/hct) | `hct` | | (none: needs `?carrier=hct`) | [Track HCT Logistics](https://lastscanned.com/lookup/hct) | | [Starken](https://docs.lastscanned.com/carriers/starken) | `starken` | | (none: needs `?carrier=starken`) | [Track Starken](https://lastscanned.com/lookup/starken) | | [Hunter Express](https://docs.lastscanned.com/carriers/hunterexpress) | `hunterexpress` | | (none: needs `?carrier=hunterexpress`) | [Track Hunter Express](https://lastscanned.com/lookup/hunterexpress) | | [Aras Kargo](https://docs.lastscanned.com/carriers/aras) | `aras` | | (none: needs `?carrier=aras`) | [Track Aras Kargo](https://lastscanned.com/lookup/aras) | | [SMSA Express](https://docs.lastscanned.com/carriers/smsa) | `smsa` | | (none: needs `?carrier=smsa`) | [Track SMSA Express](https://lastscanned.com/lookup/smsa) | | [Naqel Express](https://docs.lastscanned.com/carriers/naqel) | `naqel` | | (none: needs `?carrier=naqel`) | [Track Naqel Express](https://lastscanned.com/lookup/naqel) | | [AUS Express](https://docs.lastscanned.com/carriers/asusexp) | `asusexp` | | (none: needs `?carrier=asusexp`) | [Track AUS Express](https://lastscanned.com/lookup/asusexp) | | [BDTPost](https://docs.lastscanned.com/carriers/bdtpost) | `bdtpost` | | (none: needs `?carrier=bdtpost`) | [Track BDTPost](https://lastscanned.com/lookup/bdtpost) | | [Boyi Hongda](https://docs.lastscanned.com/carriers/byhd) | `byhd` | | (none: needs `?carrier=byhd`) | [Track Boyi Hongda](https://lastscanned.com/lookup/byhd) | | [BYT Logistics](https://docs.lastscanned.com/carriers/byt) | `byt` | | (none: needs `?carrier=byt`) | [Track BYT Logistics](https://lastscanned.com/lookup/byt) | | [CD International](https://docs.lastscanned.com/carriers/chengda) | `chengda` | | (none: needs `?carrier=chengda`) | [Track CD International](https://lastscanned.com/lookup/chengda) | | [CHH Logistics](https://docs.lastscanned.com/carriers/chunhong) | `chunhong` | | (none: needs `?carrier=chunhong`) | [Track CHH Logistics](https://lastscanned.com/lookup/chunhong) | | [Chuangyu Logistics](https://docs.lastscanned.com/carriers/cyexpress) | `cyexpress` | | (none: needs `?carrier=cyexpress`) | [Track Chuangyu Logistics](https://lastscanned.com/lookup/cyexpress) | | [DHFEX](https://docs.lastscanned.com/carriers/dhfex) | `dhfex` | | (none: needs `?carrier=dhfex`) | [Track DHFEX](https://lastscanned.com/lookup/dhfex) | | [EDL Express](https://docs.lastscanned.com/carriers/edlexpress) | `edlexpress` | | (none: needs `?carrier=edlexpress`) | [Track EDL Express](https://lastscanned.com/lookup/edlexpress) | | [ED POST](https://docs.lastscanned.com/carriers/edpost) | `edpost` | | (none: needs `?carrier=edpost`) | [Track ED POST](https://lastscanned.com/lookup/edpost) | | [ETSCP](https://docs.lastscanned.com/carriers/etscp) | `etscp` | | (none: needs `?carrier=etscp`) | [Track ETSCP](https://lastscanned.com/lookup/etscp) | | [Fuhai Wulian](https://docs.lastscanned.com/carriers/fuhai618) | `fuhai618` | | (none: needs `?carrier=fuhai618`) | [Track Fuhai Wulian](https://lastscanned.com/lookup/fuhai618) | | [FJEX](https://docs.lastscanned.com/carriers/fujexp) | `fujexp` | | (none: needs `?carrier=fujexp`) | [Track FJEX](https://lastscanned.com/lookup/fujexp) | | [JSH Galaxy Express](https://docs.lastscanned.com/carriers/galaxyex) | `galaxyex` | | (none: needs `?carrier=galaxyex`) | [Track JSH Galaxy Express](https://lastscanned.com/lookup/galaxyex) | | [ASGYL](https://docs.lastscanned.com/carriers/gdasgyl) | `gdasgyl` | | (none: needs `?carrier=gdasgyl`) | [Track ASGYL](https://lastscanned.com/lookup/gdasgyl) | | [Tianhai Supply Chain](https://docs.lastscanned.com/carriers/gzbtygj) | `gzbtygj` | | (none: needs `?carrier=gzbtygj`) | [Track Tianhai Supply Chain](https://lastscanned.com/lookup/gzbtygj) | | [YouMeiYuTong](https://docs.lastscanned.com/carriers/gzymyt) | `gzymyt` | | (none: needs `?carrier=gzymyt`) | [Track YouMeiYuTong](https://lastscanned.com/lookup/gzymyt) | | [HLSZ56](https://docs.lastscanned.com/carriers/hlsz56) | `hlsz56` | | (none: needs `?carrier=hlsz56`) | [Track HLSZ56](https://lastscanned.com/lookup/hlsz56) | | [HOYANG Express](https://docs.lastscanned.com/carriers/hoyang) | `hoyang` | | (none: needs `?carrier=hoyang`) | [Track HOYANG Express](https://lastscanned.com/lookup/hoyang) | | [Heping Logistics](https://docs.lastscanned.com/carriers/hpgjwl) | `hpgjwl` | | (none: needs `?carrier=hpgjwl`) | [Track Heping Logistics](https://lastscanned.com/lookup/hpgjwl) | | [HSD Express](https://docs.lastscanned.com/carriers/hsdex) | `hsdex` | | (none: needs `?carrier=hsdex`) | [Track HSD Express](https://lastscanned.com/lookup/hsdex) | | [JTEX](https://docs.lastscanned.com/carriers/hzjtex) | `hzjtex` | | (none: needs `?carrier=hzjtex`) | [Track JTEX](https://lastscanned.com/lookup/hzjtex) | | [PD Express](https://docs.lastscanned.com/carriers/hzpdex) | `hzpdex` | | (none: needs `?carrier=hzpdex`) | [Track PD Express](https://lastscanned.com/lookup/hzpdex) | | [Jiuhao International](https://docs.lastscanned.com/carriers/jhgj) | `jhgj` | | (none: needs `?carrier=jhgj`) | [Track Jiuhao International](https://lastscanned.com/lookup/jhgj) | | [JDT Logistics](https://docs.lastscanned.com/carriers/jiudt) | `jiudt` | | (none: needs `?carrier=jiudt`) | [Track JDT Logistics](https://lastscanned.com/lookup/jiudt) | | [LeiYi Logistics](https://docs.lastscanned.com/carriers/leiyi) | `leiyi` | | (none: needs `?carrier=leiyi`) | [Track LeiYi Logistics](https://lastscanned.com/lookup/leiyi) | | [Lingdong International](https://docs.lastscanned.com/carriers/lingdong) | `lingdong` | | (none: needs `?carrier=lingdong`) | [Track Lingdong International](https://lastscanned.com/lookup/lingdong) | | [Mayi Yinfu](https://docs.lastscanned.com/carriers/mayiyinfu) | `mayiyinfu` | | (none: needs `?carrier=mayiyinfu`) | [Track Mayi Yinfu](https://lastscanned.com/lookup/mayiyinfu) | | [Miuson Express](https://docs.lastscanned.com/carriers/miuson) | `miuson` | | (none: needs `?carrier=miuson`) | [Track Miuson Express](https://lastscanned.com/lookup/miuson) | | [Pingda International](https://docs.lastscanned.com/carriers/pingda56) | `pingda56` | | (none: needs `?carrier=pingda56`) | [Track Pingda International](https://lastscanned.com/lookup/pingda56) | | [PY Express](https://docs.lastscanned.com/carriers/pyexpress) | `pyexpress` | | (none: needs `?carrier=pyexpress`) | [Track PY Express](https://lastscanned.com/lookup/pyexpress) | | [QFL Express](https://docs.lastscanned.com/carriers/qfl) | `qfl` | | (none: needs `?carrier=qfl`) | [Track QFL Express](https://lastscanned.com/lookup/qfl) | | [QYEXP](https://docs.lastscanned.com/carriers/qyexp) | `qyexp` | | (none: needs `?carrier=qyexp`) | [Track QYEXP](https://lastscanned.com/lookup/qyexp) | | [Qyun Express](https://docs.lastscanned.com/carriers/qyun) | `qyun` | | (none: needs `?carrier=qyun`) | [Track Qyun Express](https://lastscanned.com/lookup/qyun) | | [Shang Fang International](https://docs.lastscanned.com/carriers/shangfang) | `shangfang` | | (none: needs `?carrier=shangfang`) | [Track Shang Fang International](https://lastscanned.com/lookup/shangfang) | | [SHSGEXP](https://docs.lastscanned.com/carriers/shsgexp) | `shsgexp` | | (none: needs `?carrier=shsgexp`) | [Track SHSGEXP](https://lastscanned.com/lookup/shsgexp) | | [StarGlobal](https://docs.lastscanned.com/carriers/starglobal) | `starglobal` | | (none: needs `?carrier=starglobal`) | [Track StarGlobal](https://lastscanned.com/lookup/starglobal) | | [TDE Logistics](https://docs.lastscanned.com/carriers/sztdgyl) | `sztdgyl` | | (none: needs `?carrier=sztdgyl`) | [Track TDE Logistics](https://lastscanned.com/lookup/sztdgyl) | | [Tianhui Hengyuan](https://docs.lastscanned.com/carriers/thhy) | `thhy` | | (none: needs `?carrier=thhy`) | [Track Tianhui Hengyuan](https://lastscanned.com/lookup/thhy) | | [Usky Express](https://docs.lastscanned.com/carriers/usky) | `usky` | | (none: needs `?carrier=usky`) | [Track Usky Express](https://lastscanned.com/lookup/usky) | | [WM Cloud](https://docs.lastscanned.com/carriers/wmycc) | `wmycc` | | (none: needs `?carrier=wmycc`) | [Track WM Cloud](https://lastscanned.com/lookup/wmycc) | | [XS Express](https://docs.lastscanned.com/carriers/xsexp) | `xsexp` | | (none: needs `?carrier=xsexp`) | [Track XS Express](https://lastscanned.com/lookup/xsexp) | | [YJI Logistics](https://docs.lastscanned.com/carriers/yanjin) | `yanjin` | | (none: needs `?carrier=yanjin`) | [Track YJI Logistics](https://lastscanned.com/lookup/yanjin) | | [Yilong Logistics](https://docs.lastscanned.com/carriers/yilong) | `yilong` | | (none: needs `?carrier=yilong`) | [Track Yilong Logistics](https://lastscanned.com/lookup/yilong) | | [Yincag Logistics](https://docs.lastscanned.com/carriers/yincag) | `yincag` | | (none: needs `?carrier=yincag`) | [Track Yincag Logistics](https://lastscanned.com/lookup/yincag) | When two carriers share a format, the earlier row wins. 12- and 20-digit numbers go to [FedEx](https://docs.lastscanned.com/carriers/fedex), except 20-digit `0034043…` ([DHL](https://docs.lastscanned.com/carriers/dhl) Paket); other DHL Paket numbers need `?carrier=dhl`. For the exact regular expressions, check-digit algorithms (`ups1Z`, `s10`, `dhlExpress`, `gs1`), and two-pass collision rules, see [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats). ## Numbers that need `?carrier=` - **[GLS US](https://docs.lastscanned.com/carriers/glsus)** 8–11 digit GSO numbers and shipper references (`?carrier=glsus`; **never auto-detected** because 9-digit numbers have no check digit and collide with other carriers) - **[Purolator](https://docs.lastscanned.com/carriers/purolator)** 12-digit PINs (`?carrier=purolator`, since 12-digit numbers default to [FedEx](https://docs.lastscanned.com/carriers/fedex)) - **[OSM Worldwide](https://docs.lastscanned.com/carriers/osm)** `92…` (or `420` + ZIP + `92…`) USPS IMpb barcodes before USPS acceptance (`?carrier=osm` surfaces pre-USPS middle-mile sort scans while USPS says *"USPS Currently Awaiting Package"*) - **[Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes)** `92…` (or `420` + ZIP + `92…`) USPS IMpb labels bought through Pitney Bowes before USPS acceptance (`?carrier=pitneybowes` surfaces pre-USPS Pitney Bowes hub scans while USPS says *"USPS Currently Awaiting Package"*) - **[Asendia](https://docs.lastscanned.com/carriers/asendia)** USPS domestic consolidation labels, `AS…US` numbers, and destination postal numbers (`?carrier=asendia`) - **[Canada Post](https://docs.lastscanned.com/carriers/canadapost)** 12-digit PINs (`?carrier=canadapost`) - **[TForce Final Mile](https://docs.lastscanned.com/carriers/tforce)** shipper references (`BBYC…`, etc.) outside `TF…` and order piece formats (`?carrier=tforce`) - [OnTrac](https://docs.lastscanned.com/carriers/ontrac) reference numbers (`?carrier=ontrac`) - [UniUni](https://docs.lastscanned.com/carriers/uniuni) `GV…` and `JY…` partner numbers (`?carrier=uniuni`) - [GOFO](https://docs.lastscanned.com/carriers/gofo) shipper numbers (`CR…`, `YT…`) (`?carrier=gofo`) - Shippers' own numbers on [Veho](https://docs.lastscanned.com/carriers/veho) (`?carrier=veho`) - [CDL](https://docs.lastscanned.com/carriers/cdl) shipper references other than `CDL…` and order numbers (`?carrier=cdl`) - [AxleHire (Jitsu)](https://docs.lastscanned.com/carriers/axlehire) codes outside the looser formats above (`?carrier=axlehire`) - [Cirro](https://docs.lastscanned.com/carriers/cirro) numbers starting `GFUS` (Cirro delivers through GOFO, so these are detected as GOFO unless you pass `?carrier=cirro`) - Other carriers' numbers on AliExpress parcels tracked through [Cainiao](https://docs.lastscanned.com/carriers/cainiao) (`?carrier=cainiao`) or destination partner numbers on [UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi) (`?carrier=ubi`) ## Carrier notes - **[Amazon](https://docs.lastscanned.com/carriers/amazon)**: Amazon Shipping and Multi-Channel Fulfillment parcels only. Ordinary amazon.com orders are private to the buyer's account and return `not_found`. - **[Spee-Dee](https://docs.lastscanned.com/carriers/speedee)**: allows 10 lookups a minute, so part of a large batch can come back `rate_limited`. Retry those numbers after a minute. - **[Yanwen](https://docs.lastscanned.com/carriers/yanwen), [4PX](https://docs.lastscanned.com/carriers/4px), [Cainiao](https://docs.lastscanned.com/carriers/cainiao), [YunExpress](https://docs.lastscanned.com/carriers/yunexpress), [CNE Express](https://docs.lastscanned.com/carriers/cne), [SunYou](https://docs.lastscanned.com/carriers/sunyou), [UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi), [Asendia](https://docs.lastscanned.com/carriers/asendia)**: cross-border carriers. `message` names the destination carrier and its number once the parcel is handed over (e.g. `"Handed to USPS as ..."` or `"Handed to Australia Post as ..."`). - **No estimated delivery**: [Spee-Dee](https://docs.lastscanned.com/carriers/speedee), [CDL](https://docs.lastscanned.com/carriers/cdl), [4PX](https://docs.lastscanned.com/carriers/4px), [Cainiao](https://docs.lastscanned.com/carriers/cainiao), [CNE Express](https://docs.lastscanned.com/carriers/cne), [SunYou](https://docs.lastscanned.com/carriers/sunyou), [UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi), [Sendle](https://docs.lastscanned.com/carriers/sendle), [Asendia](https://docs.lastscanned.com/carriers/asendia). # Chargeback & Dispute Proof-of-Delivery Tracking API (Stripe, Shopify, PayPal & Escrow) URL: https://docs.lastscanned.com/chargeback-dispute-proof-of-delivery-tracking-api When a cardholder files an **"Item Not Received" (INR)** chargeback (Visa Reason Code `13.1`, Mastercard `4855`, American Express `C08`) or a PayPal / Shopify Payments dispute, card networks give merchants a strict window to submit **compelling delivery evidence**. A screenshot of an internal ERP status or an unverified tracking link rarely wins—issuing banks look for a **complete, chronological carrier audit trail** showing: 1. **Carrier name and tracking number** (`carrier`, `trackingNumber`, `service`). 2. **Terminal delivery confirmation** (`status: "delivered"`, `deliveredAt` UTC timestamp, `deliveredAtLocal` wall-clock time, and `signedBy` when available). 3. **Destination city/state/country alignment** (`destination`) matching the cardholder's shipping address. 4. **Full chronological checkpoint history** (`events[]`) from origin acceptance through local sortation, `out_for_delivery`, and terminal `delivered` scan. **[lastscanned](https://lastscanned.com)** gives dispute-automation platforms, Shopify brands, 3PLs, and B2B escrow systems a deterministic, normalized JSON audit trail across **[549 carriers](https://docs.lastscanned.com/carriers)**—via synchronous `GET /v1/track/:number`, batch `GET /v1/track?numbers=...`, or **[Watches & Webhooks](https://docs.lastscanned.com/webhooks)** (managed in the **[Web UI Dashboard](https://app.lastscanned.com/watches)** or via `POST /v1/watches`). For one-off manual disputes, you can also generate formatted evidence packets in your browser with the free **[Chargeback & Delivery Dispute Evidence Packet Generator](https://lastscanned.com/tools/chargeback-delivery-proof-generator)**. --- ## Why Dispute Automation Fails Without `lastscanned` | Dispute Evidence Challenge | What Happens With Standard Carrier Portals / Legacy Aggregators | How `lastscanned` Solves It | |---|---|---| | **Carrier purges tracking history before the 120-day chargeback window** | Cardholders can file INR disputes up to 120 days after purchase, when many regional and postal carriers have already recycled or hidden web tracking pages. | Create a **Watch** at fulfillment (`POST /v1/watches` or in [`app.lastscanned.com/watches`](https://app.lastscanned.com/watches)). When the package transitions to `delivered`, your webhook receives and archives the complete immutable `result` payload immediately. | | **Cross-border parcels show "Delivered to local courier" instead of buyer's city** | Querying `Yanwen` (`UL494089685YP`), `4PX` (`4PX3002639757438CN`), `Cainiao` (`LP00836938654367`), or `YunExpress` (`YT2621200705470145`) alone often stops at customs handover, losing the dispute. | `lastscanned` extracts the domestic last-mile carrier and barcode in `message` (`"Handed to UniUni as UUS5BM1269395824723"`), letting you attach **both** the international leg and the local doorstep delivery scan (`UniUni`, `SpeedX`, `GOFO`, `OnTrac`, `USPS`). | | **Regional couriers (`UniUni`, `SpeedX`, `Veho`, `GOFO`, `OnTrac`) lack Stripe auto-populate** | Stripe and Shopify Payments only auto-populate basic tracking for major legacy carriers, leaving regional deliveries blank in automated responses. | Fetch the normalized `TrackingResult` from `GET /v1/track/:number` and format the complete `events[]` log directly into Stripe's `shipping_documentation` / `uncategorized_text` fields. | --- ## 1. Building a Stripe `dispute.created` Automated Evidence Handler When Stripe sends a `charge.dispute.created` webhook with `reason === "product_not_received"`, your backend can query `GET https://api.lastscanned.com/v1/track/{trackingNumber}` synchronously, resolve any cross-border last-mile handoff, and attach the complete carrier checkpoint log to the Stripe dispute in seconds: ```ts import Stripe from "stripe"; const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!); export async function attachTrackingEvidenceToStripeDispute( disputeId: string, trackingNumber: string, shippingAddress: string, customerName: string, ) { // 1. Fetch live normalized tracking history from lastscanned const res = await fetch( `https://api.lastscanned.com/v1/track/${encodeURIComponent(trackingNumber)}`, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` } }, ); if (!res.ok) throw new Error(`Tracking lookup failed: ${res.status}`); const pkg = await res.json(); // 2. If cross-border parcel handed off to a domestic last-mile courier, fetch the doorstep leg too let lastMilePkg = null; const handoffMatch = pkg.message?.match(/Handed to .+ as ([A-Z0-9]{8,34})/i); if (handoffMatch) { const lmRes = await fetch( `https://api.lastscanned.com/v1/track/${encodeURIComponent(handoffMatch[1])}`, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` } }, ); if (lmRes.ok) lastMilePkg = await lmRes.json(); } const activePkg = lastMilePkg ?? pkg; const timelineLines = activePkg.events.map( (e: { timestamp: string | null; localTime: string | null; status: string; location: string | null; description: string }) => `${e.timestamp ?? e.localTime ?? "N/A"} | [${e.status.toUpperCase()}] ${e.location ?? "Carrier Network"} — ${e.description}`, ); const evidenceSummary = [ `CARRIER PROOF OF DELIVERY AUDIT LOG`, `Primary Tracking Number: ${pkg.trackingNumber} (${pkg.carrier.toUpperCase()})`, lastMilePkg ? `Final-Mile Tracking Number: ${lastMilePkg.trackingNumber} (${lastMilePkg.carrier.toUpperCase()})` : null, `Terminal Status: ${activePkg.status.toUpperCase()} (${activePkg.statusDescription ?? ""})`, `Delivered Timestamp (UTC): ${activePkg.deliveredAt ?? "See scan log"}`, `Delivered Timestamp (Local): ${activePkg.deliveredAtLocal ?? "See scan log"}`, activePkg.signedBy ? `Signed By: ${activePkg.signedBy}` : null, `Chronological Carrier Scans (${activePkg.events.length} checkpoints):`, ...timelineLines, ] .filter(Boolean) .join("\n"); // 3. Submit structured fields + chronological checkpoint log to Stripe Dispute API await stripe.disputes.update(disputeId, { evidence: { customer_name: customerName, shipping_address: shippingAddress, shipping_carrier: activePkg.carrier.toUpperCase(), shipping_tracking_number: activePkg.trackingNumber, shipping_date: activePkg.events.at(-1)?.localTime?.slice(0, 10) ?? undefined, uncategorized_text: evidenceSummary, }, submit: false, // Set true to auto-submit when activePkg.status === "delivered" }); } ``` --- ## 2. Archiving Delivery Proof Automatically with Watches (`app.lastscanned.com/watches` & `POST /v1/watches`) Because carriers periodically purge tracking records after 45–90 days—while cardholders have up to **120 days** to initiate a chargeback—the safest practice is to archive the terminal `delivered` payload the day the package arrives: 1. **Via the Web UI Dashboard ([`app.lastscanned.com/watches`](https://app.lastscanned.com/watches))**: Paste up to 100 tracking numbers at a time in the browser, monitor **Active** vs. **Ended** (`Delivered`) shipments, and configure your webhook endpoint on **[Webhooks (`app.lastscanned.com/webhooks`)](https://app.lastscanned.com/webhooks)**. 2. **Via `POST /v1/watches`**: Register each tracking number when an order ships. When the carrier records the final delivery scan, `lastscanned` sends a signed `tracking.updated` webhook with `result.status === "delivered"`, `result.deliveredAt`, `result.signedBy`, and the complete `result.events` array so you can store an immutable copy alongside the order record in your database. --- ## Related Guides & Interactive Tools - **[Interactive Chargeback & Delivery Dispute Evidence Packet Generator](https://lastscanned.com/tools/chargeback-delivery-proof-generator)** - **[Watches and Webhooks (`app.lastscanned.com/watches` & `POST /v1/watches`)](https://docs.lastscanned.com/webhooks)** - **[Cross-Border & Last-Mile Handoff Tracking Guide (`Yanwen`, `4PX`, `Cainiao`, `YunExpress`)](https://docs.lastscanned.com/cross-border-last-mile-handoff-tracking-yanwen-4px-cainiao)** - **[Shopify, 3PL & Custom ERP Package Tracking & Webhooks Guide](https://docs.lastscanned.com/shopify-3pl-wismo-tracking-and-webhooks)** # Comparing lastscanned vs. direct carrier calls, AfterShip, EasyPost, Ship24 & 17TRACK URL: https://docs.lastscanned.com/comparison When building package tracking into a SaaS product, customer support workflow, order-status portal, or AI agent, engineering teams typically evaluate two options: 1. **Calling carrier websites or official carrier APIs directly** from their own backend (Cloudflare Workers, Vercel Functions, AWS Lambda, Fly.io). 2. **Buying a multi-carrier tracking aggregator** (AfterShip, EasyPost, Ship24, or 17TRACK). This page breaks down the concrete technical obstacles of calling dozens of carriers directly from serverless functions, followed by a head-to-head architecture and pricing comparison against legacy tracking aggregators. --- ## 1. Why calling carrier endpoints directly from serverless functions fails (`403`/`428` WAFs & portal gates) If you try to `fetch()` carrier tracking endpoints directly from a serverless or edge runtime (Cloudflare Workers, Vercel Functions, AWS Lambda, Fly.io, or a Node.js container on a cloud provider), requests fail immediately across both undocumented web endpoints and official carrier developer portals: | Carrier | What happens when your serverless function calls the carrier directly | How `GET /v1/track/{number}` solves it | |---|---|---| | **[UPS](https://docs.lastscanned.com/carriers/ups)** (`1Z…`) | **Undocumented web API (`webapis.ups.com/track/api/Track/GetStatus`)**: Protected by Akamai Bot Manager (`403 Forbidden` on datacenter IPs and Node/Undici TLS fingerprints) and requires a paired `GetCSRFToken` handshake (`X-XSRF-TOKEN-ST` header + session cookies).
**Official UPS Developer Portal**: Requires OAuth 2.0 client credentials tied to a 6-character UPS shipper account number. | One stateless `GET` request with `Authorization: Bearer lsk_live_...` returns normalized UTC + local timestamps, `signedBy`, `service`, and scan events—no UPS account required. | | **[FedEx](https://docs.lastscanned.com/carriers/fedex)** (12/15/20/22 digits) | **Undocumented web API & `api.fedex.com/track/v2/shipments`**: Akamai Bot Manager sensor checks reject cloud/datacenter requests with `403`, while the official FedEx Developer Portal requires OAuth 2.0 token refresh loops, project validation tests, and production key approval. | Auto-detects 12-, 15-, 20-, and `96…` 22-digit FedEx barcodes in Pass 1 and returns the full scan history in one synchronous JSON response. | | **[USPS](https://docs.lastscanned.com/carriers/usps)** (`92…`–`95…`, `420…`, `…US`) | **Public tracker (`tools.usps.com`)**: Akamai Bot Manager blocks serverless datacenter IPs with `403` or blank challenge pages.
**Official USPS v3 API**: Requires OAuth 2.0 + Customer Onboarding Portal (COPRA) enrollment (Mailer ID / CRID), and still returns `"Pre-Shipment: Picked Up by Shipping Partner, USPS Awaiting Item"` (`"USPS Currently Awaiting Package"`) for 3–7 days on `92…` consolidator labels. | Tracks all `92…`–`95…` and `…US` S10 numbers with zero USPS enrollment—and lets you pass [`?carrier=osm`](https://docs.lastscanned.com/carriers/osm) or [`?carrier=pitneybowes`](https://docs.lastscanned.com/carriers/pitneybowes) on `92…` consolidator barcodes to retrieve live middle-mile sort scans before USPS acceptance. | | **[DHL](https://docs.lastscanned.com/carriers/dhl)** (10-digit Express, `GM…`, `JD…`, `0034043…`) | **Fragmented portals & rate limits**: DHL splits tracking across `express`, `ecommerce`, and `parcel-de` divisions, requires a DHL Developer Portal API key (`DHL-API-Key`) with strict default daily quotas, and returns deeply nested division-specific schemas. | Validates 10-digit Mod-7 (`dhlExpress`) and S10 `…DE` check digits, routes across Express, eCommerce, and Paket automatically, and normalizes every scan into one schema. | | **[OnTrac / LaserShip](https://docs.lastscanned.com/carriers/ontrac)** (`C…`/`D…`, `1LS…`, `LX…`) | **Datacenter IP blocks (`t.lasership.com/OrderEvents`)**: Blocks automated datacenter requests and requires separate legacy LaserShip vs. OnTrac format handling. | Auto-detects both OnTrac (`C`/`D` + 14 digits) and LaserShip (`1LS…`, `LX…`) formats and returns normalized UTC and local scan timestamps. | | **[Veho](https://docs.lastscanned.com/carriers/veho)** (`VH…`) | **Firebase App Check gate (`graph.shipveho.com/graphql`)**: Rejects requests with `401`/`403` unless accompanied by a live `x-firebase-appcheck` token minted via reCAPTCHA Enterprise (`6Lf5dJ4pAAAAAM5213981b76-48e0-a6a8-575b0e5d1`). Official Veho Packages API (`api.shipveho.com`) restricts tracking details unless your merchant API key created the order. | Tracks any `VH…` parcel (and shipper references via `?carrier=veho`) with one API key—no Veho shipper contract or App Check token required. | | **[Canada Post](https://docs.lastscanned.com/carriers/canadapost), [Purolator](https://docs.lastscanned.com/carriers/purolator) & [Intelcom / Dragonfly](https://docs.lastscanned.com/carriers/intelcom)** | **WAF challenges & shipper-only portals**: Purolator sits behind AWS WAF challenges and SOAP/REST contract keys; Canada Post requires Developer Program credentials; Intelcom / Dragonfly (`INTLCM…`) has no self-serve public developer portal. | Validates 16-digit GS1 Mod-10 (`gs1`) and S10 `…CA` numbers, supports Purolator `3L+9D` and `?carrier=purolator` 12-digit PINs, and auto-detects `INTLCM…` Dragonfly parcels across Canada and Australia. | | **US & AU Regional Couriers** ([UniUni](https://docs.lastscanned.com/carriers/uniuni), [SpeedX](https://docs.lastscanned.com/carriers/speedx), [GOFO](https://docs.lastscanned.com/carriers/gofo), [Better Trucks](https://docs.lastscanned.com/carriers/bettertrucks), [AxleHire / Jitsu](https://docs.lastscanned.com/carriers/axlehire), [CDL](https://docs.lastscanned.com/carriers/cdl), [Spee-Dee](https://docs.lastscanned.com/carriers/speedee), [Cirro](https://docs.lastscanned.com/carriers/cirro), [TForce](https://docs.lastscanned.com/carriers/tforce), [GLS US](https://docs.lastscanned.com/carriers/glsus), [Sendle](https://docs.lastscanned.com/carriers/sendle)) | **Proprietary payloads & proof-of-work gates**: SpeedX encodes tracking payloads in base64 proto-JSON; Sendle's 2026 platform requires solving a cryptographic SHA-256 proof-of-work challenge (`salt:nonce` zero-bit check) on every lookup; TForce only renders year-less HTML tables; UniUni and GOFO offer no public recipient API keys. | Decodes every payload, solves Sendle's proof-of-work challenge, resolves regional timezones and check digits, and returns a single `TrackingResult` JSON shape. | | **Cross-Border Consolidators** ([Yanwen](https://docs.lastscanned.com/carriers/yanwen), [4PX](https://docs.lastscanned.com/carriers/4px), [Cainiao](https://docs.lastscanned.com/carriers/cainiao), [YunExpress](https://docs.lastscanned.com/carriers/yunexpress), [CNE Express](https://docs.lastscanned.com/carriers/cne), [SunYou](https://docs.lastscanned.com/carriers/sunyou), [UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi), [Asendia](https://docs.lastscanned.com/carriers/asendia)) | **Signature headers, IP bans & missing handoff numbers**: CNE requires custom MD5 request signatures and blocks shared IPs (`ReturnValue: -5555`); SunYou wraps responses in JSONP with mislabeled `+08:00` destination offsets; UBI mixes duplicate partner scans; merchant APIs require shipper accounts that created the waybill. | Auto-detects all 8 cross-border formats, cleans up timezone offsets, and extracts the **destination carrier and final-mile tracking number** into `message` (e.g. `"Handed to USPS as 9261..."` or `"Handed to Australia Post as 33X..."`). | ### Side-by-side code comparison: Direct carrier integrations vs. `lastscanned` Instead of maintaining dozens of regex matchers, 4 check-digit validators, per-carrier OAuth token caches, CSRF handshakes, and a response parser per carrier in your serverless function—only to hit `403 Forbidden` from a cloud IP—your backend makes a single `fetch()` call: ```ts // One synchronous GET call from any Cloudflare Worker, Vercel Function, or AWS Lambda const res = await fetch( `https://api.lastscanned.com/v1/track/${encodeURIComponent(trackingNumber)}`, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}`, }, }, ); const pkg = await res.json(); // pkg.carrier -> "ups" | "usps" | "fedex" | "speedx" | "uniuni" | ... (every supported carrier) // pkg.status -> "label_created" | "in_transit" | "out_for_delivery" | "delivered" | "exception" | "returned" | "unknown" // pkg.estimatedDelivery -> "2026-10-28" (or null) // pkg.message -> "Handed to UniUni as UUS5BM1269395824723" (on cross-border handoffs) // pkg.events -> Chronological scan array with UTC `timestamp` and local `localTime` ``` --- ## 2. Head-to-head comparison: `lastscanned` vs. AfterShip, EasyPost, Ship24 & 17TRACK Most multi-carrier tracking APIs were designed around **asynchronous webhook queues** for enterprise post-purchase email suites (`POST` a tracking number to register a tracker, store a tracker ID in your database, and wait for an async webhook to fire). `lastscanned` is built for **synchronous, stateless `GET` lookups** and **AI agent tool calls (MCP + HTTP 402 Stripe MPP)** with predictable unique-number pricing. | Capability / Metric | `lastscanned` | AfterShip | EasyPost | Ship24 | 17TRACK | |---|---|---|---|---|---| | **Primary request model** | **Synchronous `GET /v1/track/{number}`** (live JSON in one HTTP call; zero registration) | Async `POST` tracker registration + webhook queue | `POST` tracker creation tied to carrier/label accounts | Async `POST /trackers` + webhook (sync `POST /tracking/search` on the `$99/mo` Per-Call plan, can block about a minute) | Async `POST` register number first + webhook / subsequent poll | | **Database / webhook state required** | **None (stateless)** | Must store tracker IDs & run webhook endpoints | Must store `trk_...` IDs & webhook handlers | Must register trackers (on standard plan) | Must register numbers against prepaid quota | | **Entry API tier** | **$0/mo Free** (5 numbers/day + **1 keyless lookup/day per IP**) | **$59/mo Premium** (API access excluded on Essentials) | Pay-as-you-go (`$0.01–$0.03`/tracker) or `$20/mo` BYOCA | **$0 Free** (10 shipments/mo, then `403 quota_limit_reached`), then **$39/mo** (Per-Shipment) or **$99/mo** (Per-Call) | 200 one-time free, then prepaid quota (price not verified) | | **Cost for 1,000 unique packages / month** | **$4.99 / month** (Pro) | **$59.00 / month** (Premium) | **$20.00 / month** (`$0.02`/tracker) | **$39.00 / month** (or `$99/mo` per-call) | Prepaid quota (current price not verified) | | **Overage rate above 1,000 packages** | **$0.015** per extra unique tracking number | **$0.12** per shipment on Premium ($0.08 on Essentials, which has no API) | **$0.01–$0.03** per tracker | **$0.045 / $0.030 / $0.025** per shipment ($39 / $99 / $349 plans); some couriers use multiple credits | Prepaid annual tier upgrade required | | **Cost of re-polling the same package 20x in a month** | **$0 (unlimited re-polls included on Pro)** | Included after async registration | Included on registered tracker | Included on per-shipment tier; **20x charges on per-call tier** | Included after registration | | **Failed / carrier-error lookup billing** | **Always $0** (only `200` or `404` count) | Quota consumed on registration | Charged on tracker creation | Credit spent on `POST /trackers`, even if `pending` / `parcel_not_found` | Quota consumed on registration | | **Carrier credentials required** | **Zero** across every supported carrier | Zero (for standard public carriers) | Often requires BYO carrier credentials for full data | Zero | Zero | | **US, CA & AU regional couriers (`uniuni`, `speedx`, `gofo`, `veho`, `intelcom`, `bettertrucks`, `cdl`, `axlehire`, `sendle`)** | **All 13 built-in** | Partial (enterprise post-purchase focus) | Thin on China/Temu/Shein US regional last-mile | Partial aggregator coverage | Strong on China export, mixed on US regional | | **`92…` `"USPS Currently Awaiting Package"` middle-mile consolidator scans** | **Built-in via `?carrier=osm` & `?carrier=pitneybowes`** | Requires separate courier slug / tracker registration | Returns USPS pre-shipment status until USPS scan | Depends on courier auto-detection | Depends on courier auto-detection | | **Cross-border last-mile handoff number extraction** | **Top-level `message` (`"Handed to as "`) across all 8 cross-border carriers** | Nested in courier-specific fields | Limited cross-border consolidator support | Available in aggregator payload | Available after async registration | | **Native remote MCP server** | **`https://mcp.lastscanned.com/mcp`** (Streamable HTTP, 1 keyless lookup/day, `lsk_pack_` MPP credit keys, OAuth for Claude and ChatGPT connectors) | None native | None native | `https://api.ship24.com/mcp`: `401` without a paid `apik_…` key; no keyless lookups | Community stdio wrappers only | | **Webhook authentication** | **Per-payload HMAC-SHA256** (`Lastscanned-Signature`), plus drop-in `"format": "17track"` | HMAC signature | HMAC signature | One static `Authorization: Bearer` secret per account (no per-message signature or replay protection) | SHA-256 `sign` header | | **Keyless AI agent micropayments (`HTTP 402`)** | **Built-in Stripe MPP** (`$0.50` / 25-number card pack or `$0.02` USDC on Tempo or Solana) | None | None | None | None | --- ## 3. Deep dive on the four architectural differences ### A. Synchronous `GET` vs. asynchronous `POST` + webhook registration In interactive workflows—such as **"Where Is My Order?" (WISMO) AI support agents**, live chat widgets, helpdesk macros, and on-demand order-lookup pages—a customer asks about a package *right now*. With legacy webhook platforms (AfterShip, 17TRACK, Ship24's standard plan), looking up an unregistered tracking number requires a multi-step dance: 1. `POST` the tracking number to create a tracker in their database. 2. Receive an initial `PENDING` status with an empty `events: []` array while their background queue schedules a job. 3. Wait seconds or minutes for an inbound webhook before your application can answer the customer's question. With `lastscanned`, there is no tracker registration step and no webhook receiver to host. Call `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (or pass up to 100 numbers to `GET /v1/track?numbers=...`) and receive the live normalized status and full scan timeline in the same HTTP response. ### B. Unique-number monthly billing (`$4.99/mo` Pro) vs. per-shipment or per-call fees Tracking APIs typically force an unpleasant billing trade-off: - **Per-shipment enterprise plans** (AfterShip at `$59/mo`, Ship24 at `$39/mo`) charge steep monthly minimums bundled with branded tracking pages, email marketing flows, and returns portals you may not need. - **Per-call APIs** charge every single time you poll a tracking number—so polling an active shipment 15 times over 5 days costs 15 API credits. `lastscanned` combines synchronous `GET` simplicity with **unique-number monthly billing**: - **Free tier (`$0/mo`)**: 5 unique tracking numbers per day (plus **1 unauthenticated keyless lookup per day per IP** so anyone can test `GET /v1/track/:number` immediately). - **Pro tier (`$4.99/mo`)**: Includes **1,000 unique tracking numbers per monthly billing period**, then **$0.015** per additional unique tracking number. Eligible Pro accounts can also opt in, per shipment, to email at their verified account address (10 new shipments per billing period, up to 5 exception emails per shipment). That email is separate from webhooks, follows the watch schedule, and is not a live or guaranteed message. It does not add a tracking charge. Free accounts and prepaid packs do not get it. See [Plans](https://docs.lastscanned.com/plans#shipment-email). - **Unlimited re-polls**: Once your account looks up a tracking number during a billing period, every subsequent `GET /v1/track/:number` or MCP `track_package` call for that same tracking number is **free for the rest of the billing period**. - **Failure protection**: Only lookups where the carrier returns a tracking result (`200`) or confirms `404 not_found` count toward your daily allowance, Pro unique-number count, or MPP credit pack. Upstream timeouts or `502 carrier_error` responses never cost a cent. ### C. Native remote MCP server & keyless `HTTP 402` Stripe MPP for AI agents `lastscanned` is designed from the ground up for both human developers and autonomous AI agents: - **Zero-install remote MCP server (`https://mcp.lastscanned.com/mcp`)**: Connect Claude Code, Cursor, Windsurf, or custom agents over Streamable HTTP in one command—no local wrapper scripts required: ```bash claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp \ --header "Authorization: Bearer lsk_live_YOUR_API_KEY" ``` Claude and ChatGPT connectors (including ChatGPT Developer Mode) sign in with OAuth instead, so no key is ever put in the URL. - **Keyless pay-per-request via Stripe Machine Payments Protocol (`HTTP 402`)**: When an autonomous agent calls `GET /v1/track/{trackingNumber}` without an API key after using the IP's 1 free daily lookup (or calls the batch endpoint), `lastscanned` returns an `HTTP 402 Payment Required` response with a standard `WWW-Authenticate: Payment` challenge ([mpp.dev](https://mpp.dev), discovery spec at [`https://api.lastscanned.com/openapi.json`](https://api.lastscanned.com/openapi.json)): - **Card rail (`stripe/charge`)**: Pay **$0.50** via a Stripe Shared Payment Token for a **25-tracking-number credit pack**. Unused credits are returned in the `x-lastscanned-key` response header (`lsk_pack_<32hex>`) and `credits.key` JSON field so the agent can reuse them as a standard `Bearer lsk_pack_...` token on future requests or MCP calls. - **Stablecoin rail (`tempo/charge` or `solana/charge`)**: Pay **$0.02** per tracking number in USDC on Tempo or Solana. On Solana you pay the network fee in SOL. A rate quote costs the same $0.02. ### D. Solving the `"USPS Currently Awaiting Package"` black hole & cross-border handoffs across every carrier Two of the largest sources of `"Where Is My Order?"` support tickets happen in the handoff gap between carriers: 1. **Domestic `92…` USPS consolidator parcels ([OSM Worldwide](https://docs.lastscanned.com/carriers/osm) & [Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes))**: Millions of US e-commerce parcels ship via OSM Worldwide or Pitney Bowes bearing a 22-digit `92…` (or 30-digit `420` + ZIP + `92…`) USPS IMpb barcode. While the consolidator moves the parcel across its regional hubs for 3–7 days, querying USPS only returns `"Pre-Shipment: Picked Up by Shipping Partner, USPS Awaiting Item"` (`"USPS Currently Awaiting Package"`). With `lastscanned`, passing **`?carrier=osm`** or **`?carrier=pitneybowes`** on that exact same `92…` number queries the consolidator directly and returns every intermediate hub arrival/departure scan plus the consolidator's `estimatedDelivery` date. 2. **Cross-border last-mile handoff extraction ([Yanwen](https://docs.lastscanned.com/carriers/yanwen), [4PX](https://docs.lastscanned.com/carriers/4px), [Cainiao](https://docs.lastscanned.com/carriers/cainiao), [YunExpress](https://docs.lastscanned.com/carriers/yunexpress), [CNE Express](https://docs.lastscanned.com/carriers/cne), [SunYou](https://docs.lastscanned.com/carriers/sunyou), [UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi), [Asendia](https://docs.lastscanned.com/carriers/asendia))**: When an international parcel clears customs and is handed to a local courier ([USPS](https://docs.lastscanned.com/carriers/usps), [UniUni](https://docs.lastscanned.com/carriers/uniuni), [SpeedX](https://docs.lastscanned.com/carriers/speedx), [GOFO](https://docs.lastscanned.com/carriers/gofo), [OnTrac](https://docs.lastscanned.com/carriers/ontrac), [Canada Post](https://docs.lastscanned.com/carriers/canadapost), [Intelcom / Dragonfly](https://docs.lastscanned.com/carriers/intelcom), Australia Post, or Royal Mail), `lastscanned` extracts both the destination carrier and the secondary tracking number into the top-level `message` field (for example, `"Handed to UniUni as UUS5BM1269395824723"`), allowing your app or AI agent to chain a second lookup on the local doorstep barcode automatically. --- ## Related guides & references - **[Supported carriers (all of them)](https://docs.lastscanned.com/carriers)**: Per-carrier API & MCP guides, format tables, and live lookup links. - **[Tracking number formats & auto-detection](https://docs.lastscanned.com/formats)**: Exact `matches` and `mayMatch` regular expressions, check-digit algorithms (`ups1Z`, `s10`, `dhlExpress`, `gs1`), and collision rules. - **[WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo)**: Status lifecycle handling, cross-border handoff resolution, and copy-paste TypeScript / MCP patterns. - **[MCP server (`https://mcp.lastscanned.com/mcp`)](https://docs.lastscanned.com/mcp)**: Streamable HTTP setup for Claude Code, Cursor, Windsurf, and ChatGPT. - **[Plans, quotas & Stripe MPP (`HTTP 402`)](https://docs.lastscanned.com/plans)**: Detailed breakdown of Free, Pro (`$4.99/mo`), and machine-payable requests. - **[Live web package lookup (`lastscanned.com/lookup`)](https://lastscanned.com/lookup)**: Test any tracking number across every supported carrier in your browser. # Container Tracking API & MCP: Maersk, MSC, COSCO & More URL: https://docs.lastscanned.com/container-tracking-api Track containers from Maersk (including Hamburg Süd), MSC, COSCO, Evergreen, ONE and Yang Ming through the same [tracking API](https://docs.lastscanned.com/tracking) and [MCP tools](https://docs.lastscanned.com/mcp) as parcels, in the same normalized JSON. Carrier inference works where the number identifies the line; leased prefixes such as `TGHU` and `TCNU` require explicit carrier selection. [Container watches](https://docs.lastscanned.com/webhooks) recheck every 6 hours (hourly once a container is out for delivery). No booking, bill of lading or shipping line account is needed: the container number is enough. --- ## Supported Shipping Lines Every example below is a real container looked up in November 2026. | Line | Slug (`?carrier=`) | Owner codes detected | Example containers | What you get | |---|---|---|---|---| | **[Maersk](https://docs.lastscanned.com/carriers/maersk)** (with Hamburg Süd) | `maersk` | `MSKU` `MRKU` `MRSU` `MNBU` `SUDU` | `MSKU7812341` · `MNBU0123457` | Every move with vessel and voyage, local times, ETA | | **[MSC](https://docs.lastscanned.com/carriers/msc)** | `msc` | `MSCU` `MEDU` `MSDU` `MSMU` `MSNU` `MSBU` | `MEDU1234562` · `MSCU6789016` | Every move incl. transshipments, bill of lading, ETA | | **[COSCO Shipping](https://docs.lastscanned.com/carriers/cosco)** | `cosco` | `CSNU` `CBHU` `CCLU` `CSLU` `FCIU` | `CSNU8123465` · `CSNU7123455` | Latest move only (COSCO's public limit) | | **[Evergreen](https://docs.lastscanned.com/carriers/evergreen)** | `evergreen` | `EGHU` `EGSU` `EISU` `EITU` | `EGHU9123457` · `EGSU9123450` | Every move on the bill of lading, with vessel and voyage | | **[ONE](https://docs.lastscanned.com/carriers/one)** (Ocean Network Express) | `one` | `ONEU` `KKFU` | `ONEU1234566` · `ONEU0123450` | Every move with exact UTC times, vessel and voyage, ETA | | **[Yang Ming](https://docs.lastscanned.com/carriers/yangming)** | `yangming` | `YMMU` | `YMMU6123458` · `YMMU7123452` | Every move incl. rail legs, with vessel and voyage | --- ## 1. Container Numbers and Auto-Detection A container number (ISO 6346) is the owner's 3-letter code plus `U`, six digits and a check digit: `MSKU 781234 1`. lastscanned checks the check digit and sends the number to the line that owns the code, so `GET /v1/track/MSKU7812341` goes to Maersk with no `?carrier=`. **Leased containers need `?carrier=`.** About half the world's boxes belong to leasing companies (Textainer `TGHU`, Triton `TCNU` and `TRHU`, CAI `CAIU`, SeaCo `SEGU` and others) and sail with any line. Their owner code says nothing about the line, so name it: ```bash curl -s "https://api.lastscanned.com/v1/track/TGHU9123451?carrier=msc" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` Without `?carrier=`, a leased container answers `400 unknown_carrier` with a message saying to name the line. It is not billed. --- ## 2. Statuses for a Container's Trip Containers use the same seven statuses as parcels, mapped onto a container's trip: | Status | Container move | |---|---| | `label_created` | Empty container released to the shipper | | `in_transit` | Received full at the origin terminal, loaded, sailing, transshipped, discharged | | `out_for_delivery` | Full container leaving the destination terminal for the consignee | | `delivered` | Empty container returned: the trip is over | The shipping lines don't report when the consignee unloads the goods, so `delivered` means the empty box is back. Watch for `out_for_delivery` if you need to know when the cargo left the port. --- ## 3. Times, ETAs and Bills of Lading - **Times**: most lines give local port time without a zone (MSC and Evergreen give a date only), so `localTime` is set and `timestamp` is `null`. Never read a container's `localTime` as UTC. ONE is the exception: it gives both, so both are exact. - **ETA**: Maersk's, MSC's and ONE's estimated arrival is `estimatedDelivery` (ONE's also as `estimatedDeliveryAt` in UTC). Planned moves are never mixed into `events`. - **Bill of lading or booking**: MSC and Evergreen name the bill the container sails under in `message`; ONE names the booking. --- ## 4. Watches and Webhooks for Containers A container trip runs for weeks, so polling is wasteful. Set your webhook once, then create a [watch](https://docs.lastscanned.com/webhooks) per container. lastscanned re-checks it every 6 hours (hourly once it is out for delivery) and posts to your webhook when its status, newest move or ETA changes: ```bash curl -s -X PUT "https://api.lastscanned.com/v1/webhook" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" \ -H "content-type: application/json" \ -d '{"url": "https://example.com/hooks/containers"}' curl -s -X POST "https://api.lastscanned.com/v1/watches" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" \ -H "content-type: application/json" \ -d '{"trackingNumber": "MEDU1234562", "metadata": {"po": "PO-1042"}}' ``` A watch ends by itself when the empty container is returned, or after 90 days. On Pro, a container counts once per billing period however often it is re-checked. --- ## 5. Limits Worth Knowing - **COSCO** shows a container's latest move only, without the bill of lading. COSCO's firewall also blocks bursts, so a batch of COSCO containers is looked up one at a time. - **Maersk and MSC** are read through a browser session (their sites refuse plain server requests), so a lookup takes several seconds. One session serves a whole batch. - **Other lines** (CMA CGM, Hapag-Lloyd, HMM, ZIM) are not supported yet. ## Related Resources - **Formats and check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **Freight by road**: [LTL freight & heavy parcel tracking](https://docs.lastscanned.com/ltl-freight-and-heavy-parcel-tracking-api) - **Agents**: [MCP server](https://docs.lastscanned.com/mcp) # Cross-Border & Domestic Consolidator Last-Mile Handoff Tracking Guide (Yanwen, 4PX, Cainiao, YunExpress, OSM, Pitney Bowes) URL: https://docs.lastscanned.com/cross-border-last-mile-handoff-tracking-yanwen-4px-cainiao Cross-border e-commerce shipments and domestic workshare consolidator parcels rarely travel on a single carrier network from origin warehouse to the customer's front door. Instead, a parcel moves through two distinct stages: 1. **Linehaul & Consolidator Stage**: Export sortation, air freight, customs clearance, or regional zone-skipping handled by **[Yanwen](https://docs.lastscanned.com/carriers/yanwen)**, **[4PX Express](https://docs.lastscanned.com/carriers/4px)**, **[Cainiao](https://docs.lastscanned.com/carriers/cainiao)**, **[YunExpress](https://docs.lastscanned.com/carriers/yunexpress)**, **[CNE Express](https://docs.lastscanned.com/carriers/cne)**, **[SunYou](https://docs.lastscanned.com/carriers/sunyou)**, **[UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi)**, **[ECMS Express](https://docs.lastscanned.com/carriers/ecms)**, **[OSM Worldwide](https://docs.lastscanned.com/carriers/osm)**, or **[Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes)**. 2. **Destination Last-Mile Delivery Stage**: Doorstep delivery executed by a regional or national courier—**[UniUni](https://docs.lastscanned.com/carriers/uniuni)**, **[SpeedX](https://docs.lastscanned.com/carriers/speedx)**, **[GOFO Express](https://docs.lastscanned.com/carriers/gofo)**, **[OnTrac](https://docs.lastscanned.com/carriers/ontrac)**, **[Veho](https://docs.lastscanned.com/carriers/veho)**, **[USPS](https://docs.lastscanned.com/carriers/usps)**, **[FedEx](https://docs.lastscanned.com/carriers/fedex)**, **[Canada Post](https://docs.lastscanned.com/carriers/canadapost)**, or **[Intelcom / Dragonfly](https://docs.lastscanned.com/carriers/intelcom)**—often under a **newly issued secondary tracking number**. **[lastscanned](https://lastscanned.com)** automatically detects every major consolidator format across **[549 carriers](https://docs.lastscanned.com/carriers)**, repairs cross-timezone sorting bugs, and surfaces the **destination carrier and secondary tracking number** directly in the top-level `message` field—both on synchronous `GET /v1/track/:number` lookups and in **[Watches & Webhooks](https://docs.lastscanned.com/webhooks)** (via the **[Web UI Dashboard](https://app.lastscanned.com/watches)** or `POST /v1/watches`). --- ## Verified Consolidator & Last-Mile Handoff Matrix Every example tracking number below comes from real recorded carrier fixtures supported by `GET https://api.lastscanned.com/v1/track/{trackingNumber}`: | Origin Consolidator | Slug (`?carrier=`) | Verified Example Waybill | Common Destination Last-Mile Couriers | How `lastscanned` Resolves the Handoff | |---|---|---|---|---| | **[Yanwen](https://docs.lastscanned.com/carriers/yanwen)** | `yanwen` | `UL494089685YP` · `YWSTL010022557186` | `USPS`, `UniUni`, `SpeedX`, `OnTrac`, `Canada Post`, `Intelcom`, `Royal Mail` | Extracts exchange barcode and destination carrier into `message` (e.g., `"Handed to UniUni as UUS5BM1269395824723"`). | | **[4PX Express](https://docs.lastscanned.com/carriers/4px)** | `4px` | `4PX3002639757438CN` | `USPS`, `UniUni`, `SpeedX`, `GOFO`, `Royal Mail`, `Australia Post` | Repairs 4PX's `UTC+8` wall-clock epoch bug and surfaces `channelContact` + `serverCode` in `message`. | | **[Cainiao](https://docs.lastscanned.com/carriers/cainiao)** | `cainiao` | `LP00836938654367` · `AP00830954074290` | `USPS`, `UniUni`, `SpeedX`, `GOFO`, `OnTrac`, `Correos`, `Colissimo` | Resolves `LP…` / `AP…` / `CNUSUP…` waybills and extracts the local delivery tracking number into `message`. | | **[YunExpress](https://docs.lastscanned.com/carriers/yunexpress)** | `yunexpress` | `YT2621200705470145` · `YT2625900708886066` | `USPS`, `UniUni`, `SpeedX`, `GOFO`, `OnTrac`, `Veho`, `DHL`, `DPD` | Extracts the destination last-mile carrier and secondary barcode from ` YT…` 18-character waybills. | | **[CNE Express](https://docs.lastscanned.com/carriers/cne)** | `cne` | `3A5V735000008` · `3A5V913107080` | `USPS`, `UniUni`, `SpeedX`, `Royal Mail`, `Hermes/Evri` | Handles CNE signature generation and extracts the destination tracking number into `message`. | | **[SunYou](https://docs.lastscanned.com/carriers/sunyou)** | `sunyou` | `SYGB024500000` | `USPS`, `Royal Mail`, `Canada Post`, `UniUni` | Unwraps SunYou JSONP responses, fixes mislabeled `+08:00` destination offsets, and surfaces the handoff barcode. | | **[UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi)** | `ubi` | `AU0000005887447` | `Australia Post`, `NZ Post`, `Canada Post`, `USPS`, `Evri` | Deduplicates partner scans and extracts the local postal/courier tracking number. | | **[ECMS Express](https://docs.lastscanned.com/carriers/ecms)** | `ecms` | `ECTSO00000801568` · `ECTSO00049071335` | `USPS`, `FedEx`, `UniUni`, `Sagawa`, `Yamato` | Normalizes cross-border air freight and customs clearance milestones with last-mile handoff references. | | **[SFC (SendFromChina)](https://docs.lastscanned.com/carriers/sfc)** | `sfc` | `SFCAA0121278784YQ` | `USPS`, `UniUni`, `Royal Mail`, `Hermes/Evri`, `Canada Post` | Tracks `SFC…` export waybills and surfaces the destination postal/courier handoff barcode. | | **[Chukou1 (出口易)](https://docs.lastscanned.com/carriers/chukou1)** | `chukou1` | `SUF2403231LW1003974` | `USPS`, `FedEx`, `UPS`, `Royal Mail`, `DHL Paket` | Normalizes Chukou1 overseas warehouse and linehaul scans with last-mile tracking extraction. | | **[JCEX (佳成国际)](https://docs.lastscanned.com/carriers/jcex)** | `jcex` | `JCZ0318108989DH` · `JCZ1006008960DH` | `USPS`, `UPS`, `FedEx`, `DPD`, `GLS` | Tracks `JCZ…` cross-border air parcels through customs and domestic courier delivery. | | **[DHL eCommerce](https://docs.lastscanned.com/carriers/dhlecommerce)** | `dhlecommerce` | `272085497D` · `9261290316844317469885` | `USPS` (`92…` / `93…` IMpb final mile) | Tracks DHL eCommerce middle-mile sortation and links directly to the USPS final-mile delivery barcode. | | **[Asendia](https://docs.lastscanned.com/carriers/asendia)** | `asendia` | `AHOY15H55PMT` · `00091399050136308562` | `USPS`, `La Poste`, `Swiss Post`, `Royal Mail`, `Canada Post` | Resolves Asendia USA/Europe cross-border consolidation and final postal delivery scans. | | **[OSM Worldwide](https://docs.lastscanned.com/carriers/osm)** | `osm` | `9261290318412001879814` | `USPS` (same `92…` IMpb barcode) | Pass `?carrier=osm` on `92…` USPS numbers stuck in `"USPS Currently Awaiting Package"` to retrieve live middle-mile sort scans. | | **[Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes)** | `pitneybowes` | `UPAAG000000089627496` · `9261290980949654107812` | `USPS` (same `92…` IMpb barcode) | Auto-detects `UPA…` parcels or queries `92…` USPS consolidator parcels via `?carrier=pitneybowes` during the middle-mile transit gap. | --- ## 1. Two-Hop Cross-Border Lookup Pattern (`GET /v1/track`) When a customer enters an origin consolidator number like `YT2621200705470145` (`YunExpress`) or `UL494089685YP` (`Yanwen`), a single helper function can retrieve the origin leg and—if the parcel has already been assigned a domestic barcode (`UUS5BM1269395824723`, `SPXCLT138701431240`, `GFUS01074503026309`, `1LS729108273411`, or `9261290980949654107812`)—fetch the live doorstep delivery timeline automatically: ```ts export async function resolveCrossBorderShipment(trackingNumber: string, apiKey: string) { // Step 1: Query the origin tracking number const originRes = await fetch( `https://api.lastscanned.com/v1/track/${encodeURIComponent(trackingNumber)}`, { headers: { Authorization: `Bearer ${apiKey}` } }, ); const origin = await originRes.json(); // Step 2: Check `origin.message` for a last-mile handoff barcode // Example: "Handed to UniUni as UUS5BM1269395824723" const match = origin.message?.match(/Handed to (.+?) as ([A-Z0-9]{8,34})/i); if (match) { const [, destinationCarrierName, destinationTrackingNumber] = match; const destRes = await fetch( `https://api.lastscanned.com/v1/track/${encodeURIComponent(destinationTrackingNumber)}`, { headers: { Authorization: `Bearer ${apiKey}` } }, ); if (destRes.ok) { const destination = await destRes.json(); return { origin, destinationCarrierName, destination }; } } return { origin, destinationCarrierName: null, destination: null }; } ``` --- ## 2. Solving the Domestic `92…` `"USPS Currently Awaiting Package"` Blind Spot Millions of US domestic parcels ship via **OSM Worldwide** or **Pitney Bowes** using a 22-digit `92…` (or 30-digit `420` + ZIP + `92…`) USPS Intelligent Mail package barcode. While the parcel travels across OSM or Pitney Bowes sortation hubs in Illinois, Pennsylvania, Texas, or California for 3 to 7 days, USPS's own system only shows: > `"Pre-Shipment: Picked Up by Shipping Partner, USPS Awaiting Item"` With `lastscanned`, when `GET /v1/track/9261290318412001879814` returns `status: "label_created"`, you can query the exact same barcode with **`?carrier=osm`** or **`?carrier=pitneybowes`**: ```bash # Query OSM Worldwide's middle-mile hub scans on a 92... USPS barcode curl -s "https://api.lastscanned.com/v1/track/9261290318412001879814?carrier=osm" \ -H "Authorization: Bearer $LASTSCANNED_KEY" # Or test interactively in your browser: # https://lastscanned.com/tools/usps-awaiting-item-checker ``` --- ## 3. Watching Cross-Border & Consolidator Shipments in the Web UI Dashboard or API Instead of manually checking when a `Yanwen`, `4PX`, `Cainiao`, or `YunExpress` parcel clears customs or transfers to `UniUni` or `SpeedX`: - **In the Web UI Dashboard ([`app.lastscanned.com/watches`](https://app.lastscanned.com/watches))**: Paste up to 100 cross-border or regional tracking numbers in your browser, tag them with an order or batch label, and view live status updates and full timelines with zero code. - **Via Webhooks ([`app.lastscanned.com/webhooks`](https://app.lastscanned.com/webhooks) or `POST /v1/watches`)**: Configure your webhook endpoint in either native `lastscanned` JSON or drop-in **17TRACK v2 format (`"format": "17track"`)**. Whenever a handoff barcode is assigned or the package moves, `lastscanned` pushes a signed `tracking.updated` event automatically. --- ## Related Guides & Tools - **[All 245+ Cross-Border & Last-Mile Handoff Routes (`lastscanned.com/handoff`)](https://lastscanned.com/handoff)** - **[USPS "Awaiting Item" Consolidator Checker Tool](https://lastscanned.com/tools/usps-awaiting-item-checker)** - **[Regional & Cross-Border Carrier Tracking API Guide](https://docs.lastscanned.com/regional-carrier-tracking-api-uniuni-speedx-veho-gofo-ontrac)** - **[Watches and Webhooks (`app.lastscanned.com/watches` & `POST /v1/watches`)](https://docs.lastscanned.com/webhooks)** - **[Chargeback & Dispute Proof-of-Delivery Tracking API](https://docs.lastscanned.com/chargeback-dispute-proof-of-delivery-tracking-api)** # Errors URL: https://docs.lastscanned.com/errors Every error has the same shape: ```json { "error": { "code": "not_found", "message": "UPS returned no track details for that number" } } ``` Branch on `code`; `message` is for people and can change. | HTTP | `code` | When | Retry? | |---|---|---|---| | 400 | `bad_request` | No numbers, more than 100, or more than 35 for one carrier | No | | 400 | `unknown_carrier` | No carrier's format matches the number (or its check digit is wrong), or an unsupported `carrier` | Fix the number or pass `carrier` | | 401 | `unauthorized` | Missing, wrong or revoked key, or a disabled account | No | | 402 | `payment_required` | No key, and no free lookup left (or a request for several numbers) | Pay with MPP; see [Pay per request](https://docs.lastscanned.com/authentication#pay-per-request). For a person, `lookup_url` opens the lookup on lastscanned.com | | 402 | `credits_used` | A credit key doesn't have enough credits left for the request | Pay again without the key | | 404 | `not_found` | The carrier has no record of the number, or no such key or route | Later; new labels can take a while to appear | | 429 | `free_lookup_used` | No key, and this IP's free lookup for today is used (when pay per request is off) | Sign up for a key, or after 00:00 UTC | | 429 | `rate_limited` | Daily limit reached, or the carrier is throttling (Spee-Dee) | After 00:00 UTC, or in a minute for Spee-Dee | | 500 | `internal_error` | Unexpected failure | Yes | | 500 | `not_configured` | The service is misconfigured | Yes | | 502 | `carrier_error` | The carrier failed the lookup | Yes | | 503 | `carrier_unavailable` | The carrier can't be asked right now: its firewall refuses us, its site is down or not answering, or it failed its last several lookups | Later, in a few minutes | On `GET /v1/track?numbers=`, per-number errors (`not_found`, `unknown_carrier`, `carrier_error`, `carrier_unavailable`, `rate_limited`) are returned inside `results` with a `200`; only a malformed request, a bad key or the daily limit fails the whole call. Over MCP, a failed tool call returns this same object as a result with `isError: true`. # Tracking number formats & auto-detection URL: https://docs.lastscanned.com/formats When you call `GET /v1/track/:number` without `?carrier=`, `lastscanned` identifies the carrier from the tracking number's prefix, length, and check digit before making any network request. Because detection runs deterministically ahead of the lookup, a mistyped UPS `1Z`, 16-digit Canada Post PIN, or UPU S10 international number fails fast with `400 unknown_carrier` instead of wasting a lookup or polling the wrong carrier. Shipping container numbers (ISO 6346) are detected the same way, by owner code and check digit, for the six ocean lines we cover. A leased container (owner codes such as `TGHU` and `TCNU`) can sail with any line, so pass `?carrier=` with the line. See [Container tracking](https://docs.lastscanned.com/container-tracking-api). ## How two-pass detection works `detect(trackingNumber)` upper-cases and trims the input, then evaluates every carrier in fixed precedence order across two passes: 1. **Pass 1 — Strict `matches(n)`**: Checks unambiguous prefixes, exact lengths, and check digits (`ups1Z`, `s10`, `dhlExpress`, `gs1`). The first carrier whose `matches(n)` returns `true` wins. 2. **Pass 2 — Looser `mayMatch(n)`**: Only runs if no carrier matched in Pass 1. Catches secondary or partner formats: - [UniUni](https://docs.lastscanned.com/carriers/uniuni) (`UR…`, `U9999…`, `U000…`) - [GOFO](https://docs.lastscanned.com/carriers/gofo) (`GF` + 13 digits) - [CDL Last Mile](https://docs.lastscanned.com/carriers/cdl) (hyphenated order numbers `^\d{9}-\d$`) - [AxleHire (Jitsu)](https://docs.lastscanned.com/carriers/axlehire) (`SCD` + 16 chars, or 12/16-char mixed alphanumeric codes) - [Purolator](https://docs.lastscanned.com/carriers/purolator) (3 letters + 9 digits `^[A-Z]{3}\d{9}$`) - [TForce Final Mile](https://docs.lastscanned.com/carriers/tforce) (depot order pieces `^[A-Z]{2}\d{7}-\d{1,2}$`) - [OSM Worldwide](https://docs.lastscanned.com/carriers/osm) (22-char hub format `^A\d{10}[A-Z]{3}\d{8}$`) **One carrier per number.** Detection sends the number to the single winning carrier and never falls back to another carrier on `404 not_found`. To override detection—or to look up a carrier that has no auto-detected format like [GLS US](https://docs.lastscanned.com/carriers/glsus) (`?carrier=glsus`) or pre-USPS consolidator scans on `92…` labels (`?carrier=osm`, `?carrier=pitneybowes`)—pass `?carrier=`. ```ts // Evaluating carriers in exact precedence order: // ups → usps → dhl → fedex → amazon → ontrac → uniuni → gofo → veho → // speedee → cdl → bettertrucks → axlehire → cirro → yanwen → 4px → cainiao → yunexpress → // speedx → intelcom → canadapost → purolator → tforce → glsus → osm → pitneybowes → cne → sunyou → ubi → sendle → asendia export function detect(trackingNumber: string): Carrier | undefined { const n = trackingNumber.trim().toUpperCase(); const all = Object.values(carriers); return all.find((c) => c.matches(n)) ?? all.find((c) => c.mayMatch?.(n)); } ``` --- ## Complete regex & prefix reference (every carrier) The table below shows the exact regular expressions and check-digit functions used in production (`n` is already trimmed and upper-cased). | Order | Carrier | `id` | Pass 1: Strict `matches(n)` | Pass 2: Fallback `mayMatch(n)` | Check digit | |---|---|---|---|---|---| | 1 | [4-72](https://docs.lastscanned.com/carriers/472) | `472` | `S10 *CO` with a valid check digit (`/^[A-Z]{2}\d{9}CO$/`) | — | `s10(n)` | | 2 | [UPS](https://docs.lastscanned.com/carriers/ups) | `ups` | `/^1Z[0-9A-Z]{16}$/` | — | `ups1Z(n)` (Mod-10) | | 3 | [USPS](https://docs.lastscanned.com/carriers/usps) | `usps` | `/^(420\d{5})?9[2345]\d{18,24}$/` or `/^[A-Z]{2}\d{9}US$/` | — | `s10(n)` on `…US` | | 4 | [DHL](https://docs.lastscanned.com/carriers/dhl) | `dhl` | `/^\d{10}$/`, `/^(JJ?D\d{10,20}\|GM\d{16,20}\|0034043\d{13})$/`, or `/^[A-Z]{2}\d{9}DE$/` | — | `dhlExpress(n)` on 10-digit; `s10(n)` on `…DE` | | 5 | [dao](https://docs.lastscanned.com/carriers/dao) | `dao` | `/^000(?:5712696\|5715127)\d{10}$/` | — | — | | 6 | [FedEx](https://docs.lastscanned.com/carriers/fedex) | `fedex` | `/^(\d{12}\|\d{15}\|\d{20}\|96\d{20})$/` | — | — | | 7 | [Amazon](https://docs.lastscanned.com/carriers/amazon) | `amazon` | `/^TB[ACM]\d{12}$/` | — | — | | 8 | [OnTrac / LaserShip](https://docs.lastscanned.com/carriers/ontrac) | `ontrac` | `/^([CD]\d{14}\|1LS[A-Z0-9]{12,15}(-\d)?\|L[AEHINX]\d{8})$/` | — | — | | 9 | [UniUni](https://docs.lastscanned.com/carriers/uniuni) | `uniuni` | `/^UUS[0-9A-Z]{13,16}$/` | `/^(UR\d{12,20}\|U9999\d{6,20}\|U000\d{6,20})$/` | — | | 10 | [GOFO Express](https://docs.lastscanned.com/carriers/gofo) | `gofo` | `/^GFUS\d{14}$/` | `/^GF\d{13}$/` | — | | 11 | [Veho](https://docs.lastscanned.com/carriers/veho) | `veho` | `/^VH[0-9A-Z]{12}$/` | — | — | | 12 | [Spee-Dee](https://docs.lastscanned.com/carriers/speedee) | `speedee` | `/^SP(\d{16}\|\d{18})$/` | — | — | | 13 | [CDL Last Mile](https://docs.lastscanned.com/carriers/cdl) | `cdl` | `/^CDL\d{11}$/` | `/^\d{9}-\d$/` | — | | 14 | [Better Trucks](https://docs.lastscanned.com/carriers/bettertrucks) | `bettertrucks` | `/^(BTS_[0-9A-Z]{8,14}\|BTP[0-9A-Z]{12})$/` | — | — | | 15 | [AxleHire (Jitsu)](https://docs.lastscanned.com/carriers/axlehire) | `axlehire` | — | `/^SCD[0-9A-Z]{16}$/` or 12/16-char mixed alphanumeric (`!letters-then-digits`) | — | | 16 | [Cirro](https://docs.lastscanned.com/carriers/cirro) | `cirro` | `/^(CR\d{12}\|CIFR\d{13})$/` | — | — | | 17 | [Yanwen](https://docs.lastscanned.com/carriers/yanwen) | `yanwen` | `/^[A-Z]{2}\d{9}YP$/` or `/^YW[A-Z]{3}\d{12}$/` | — | `s10(n)` on `…YP` | | 18 | [4PX](https://docs.lastscanned.com/carriers/4px) | `4px` | `/^4PX\d{13}CN$/` | — | — | | 19 | [Cainiao](https://docs.lastscanned.com/carriers/cainiao) | `cainiao` | `/^(LP\d{14,17}\|AP\d{14})$/` | — | — | | 20 | [YunExpress](https://docs.lastscanned.com/carriers/yunexpress) | `yunexpress` | `/^YT\d{16}$/` | — | — | | 21 | [SpeedX](https://docs.lastscanned.com/carriers/speedx) | `speedx` | `/^SPX([0-9A-Z]{15}\|[0-9A-Z]{21})$/` | — | — | | 22 | [Intelcom (Dragonfly)](https://docs.lastscanned.com/carriers/intelcom) | `intelcom` | `/^INTLCM[A-Z]\d{9}$/` | — | — | | 23 | [Canada Post](https://docs.lastscanned.com/carriers/canadapost) | `canadapost` | `/^\d{16}$/` or `/^[A-Z]{2}\d{9}CA$/` | — | `gs1(n)` on 16-digit; `s10(n)` on `…CA` | | 24 | [Kuehne+Nagel](https://docs.lastscanned.com/carriers/kuehnenagel) | `kuehnenagel` | — | `/^RWM\d{9}$\|^\d{2}A\d{9}$/` | — | | 25 | [MailPlus](https://docs.lastscanned.com/carriers/mailplus) | `mailplus` | `/^MPXL\d{6}$/` | `/^MPX\d{9}$/` | — | | 26 | [Purolator](https://docs.lastscanned.com/carriers/purolator) | `purolator` | — (12-digit PINs require `?carrier=purolator`) | `/^[A-Z]{3}\d{9}$/` | — | | 27 | [TForce Final Mile](https://docs.lastscanned.com/carriers/tforce) | `tforce` | `/^TF\d{18}$/` | `/^[A-Z]{2}\d{7}-\d{1,2}$/` | — | | 28 | [GLS US](https://docs.lastscanned.com/carriers/glsus) | `glsus` | — (**never auto-detected**; requires `?carrier=glsus`) | — | — | | 29 | [OSM Worldwide](https://docs.lastscanned.com/carriers/osm) | `osm` | `/^OSM[0-9A-Z]{14}$/` | `/^A\d{10}[A-Z]{3}\d{8}$/` (`92…` USPS barcodes require `?carrier=osm`) | — | | 30 | [Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes) | `pitneybowes` | `/^UPAA[A-Z]\d{15}$/` | — (`92…` USPS barcodes require `?carrier=pitneybowes`) | — | | 31 | [CNE Express](https://docs.lastscanned.com/carriers/cne) | `cne` | `/^3A5V\d{9}$/` | — | — | | 32 | [SunYou](https://docs.lastscanned.com/carriers/sunyou) | `sunyou` | `/^SY[A-Z]{2}\d{9}$/` | — | — | | 33 | [UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi) | `ubi` | `/^AU\d{13}$/` | — | — | | 34 | [Sendle](https://docs.lastscanned.com/carriers/sendle) | `sendle` | `/^(QSS\d{9}\|QS\d{6})$/` | — | — | | 35 | [Asendia](https://docs.lastscanned.com/carriers/asendia) | `asendia` | `/^AHOY[0-9A-Z]{8}$/` | — (USPS, `AS…US` & destination numbers require `?carrier=asendia`) | — | | 36 | [Japan Post](https://docs.lastscanned.com/carriers/japanpost) | `japanpost` | `XX123456785JP`-style ✓ | — | `s10(n)` | | 37 | [Singapore Post](https://docs.lastscanned.com/carriers/singpost) | `singpost` | `XX123456785SG`-style ✓ | — | `s10(n)` | | 38 | [Korea Post](https://docs.lastscanned.com/carriers/koreapost) | `koreapost` | `XX123456785KR`-style ✓ | — | `s10(n)` | | 39 | [NZ Post](https://docs.lastscanned.com/carriers/nzpost) | `nzpost` | `XX123456785NZ`-style ✓ | — | `s10(n)` | | 40 | [DPD UK](https://docs.lastscanned.com/carriers/dpduk) | `dpduk` | — | `15` + 12 digits | — | | 41 | [APC Postal Logistics](https://docs.lastscanned.com/carriers/apc) | `apc` | — | (none: needs `?carrier=apc`) | — | | 42 | [Landmark Global](https://docs.lastscanned.com/carriers/landmark) | `landmark` | `LTN` + 8–14 digits | — | — | | 43 | [Canpar Express](https://docs.lastscanned.com/carriers/canpar) | `canpar` | `D` + 15 digits | — | — | | 44 | [Loomis Express](https://docs.lastscanned.com/carriers/loomis) | `loomis` | — | (none: needs `?carrier=loomis`) | — | | 45 | [GLS Canada](https://docs.lastscanned.com/carriers/glscanada) | `glscanada` | — | (none: needs `?carrier=glscanada`) | — | | 46 | [Nationex](https://docs.lastscanned.com/carriers/nationex) | `nationex` | — | (none: needs `?carrier=nationex`) | — | | 47 | [bpost](https://docs.lastscanned.com/carriers/bpost) | `bpost` | `XX123456785BE`-style ✓ | — | `s10(n)` | | 48 | [PostNord](https://docs.lastscanned.com/carriers/postnord) | `postnord` | `XX123456785SE`/`…DK`-style ✓ | — | `s10(n)` | | 49 | [Österreichische Post](https://docs.lastscanned.com/carriers/austrianpost) | `austrianpost` | `XX123456785AT`-style ✓ | — | `s10(n)` | | 50 | [Poczta Polska](https://docs.lastscanned.com/carriers/polishpost) | `polishpost` | `XX123456785PL`-style ✓ | — | `s10(n)` | | 51 | [Amerijet](https://docs.lastscanned.com/carriers/amerijet) | `amerijet` | `/^810\d{8}$/` with the mod-7 check digit | — | — | | 52 | [GLS Group Europe](https://docs.lastscanned.com/carriers/gls) | `gls` | — | 11 digits | — | | 53 | [InPost](https://docs.lastscanned.com/carriers/inpost) | `inpost` | `5` or `6` + 23 digits | — | — | | 54 | [Packeta](https://docs.lastscanned.com/carriers/packeta) | `packeta` | `Z` + 9 or 10 digits | — | — | | 55 | [Hermes Germany](https://docs.lastscanned.com/carriers/hermesde) | `hermesde` | — | (none: needs `?carrier=hermesde`) | — | | 56 | [YDH](https://docs.lastscanned.com/carriers/ydh) | `ydh` | `YDH` + 10 digits + 2 letters | — | — | | 57 | [Equick China](https://docs.lastscanned.com/carriers/equick) | `equick` | `EQK` + 2 letters + 10 digits + 2 letters | — | — | | 58 | [TopYou](https://docs.lastscanned.com/carriers/topyou) | `topyou` | — | (none: needs `?carrier=topyou`) | — | | 59 | [La Poste / Colissimo](https://docs.lastscanned.com/carriers/laposte) | `laposte` | Colissimo digit + letter + 11 digits ✓ (GS1); `XX123456785FR`-style ✓ | — | `s10(n)` | | 60 | [PostNL](https://docs.lastscanned.com/carriers/postnl) | `postnl` | `3S` + 4 letters + 7–9 digits; `XX123456785NL`-style ✓ | — | `s10(n)` | | 61 | [Correos](https://docs.lastscanned.com/carriers/correos) | `correos` | `XX123456785ES`-style ✓ | `PQ` + 20–22 letters/digits | `s10(n)` | | 62 | [Poste Italiane](https://docs.lastscanned.com/carriers/posteitaliane) | `posteitaliane` | `XX123456785IT`-style ✓ | — | `s10(n)` | | 63 | [CJ Logistics](https://docs.lastscanned.com/carriers/cjlogistics) | `cjlogistics` | — | (none: needs `?carrier=cjlogistics`) | — | | 64 | [Yamato Transport](https://docs.lastscanned.com/carriers/yamato) | `yamato` | — | (12 digits is FedEx's: needs `?carrier=yamato`) | — | | 65 | [Delhivery](https://docs.lastscanned.com/carriers/delhivery) | `delhivery` | — | (none: needs `?carrier=delhivery`) | — | | 66 | [Blue Dart](https://docs.lastscanned.com/carriers/bluedart) | `bluedart` | — | (none: needs `?carrier=bluedart`) | — | | 67 | [Evri](https://docs.lastscanned.com/carriers/evri) | `evri` | — | — (`?carrier=evri`) | — | | 68 | [An Post](https://docs.lastscanned.com/carriers/anpost) | `anpost` | `/^[A-Z]{2}\d{9}IE$/` | — | `s10(n)` | | 69 | [Swiss Post](https://docs.lastscanned.com/carriers/swisspost) | `swisspost` | `/^[A-Z]{2}\d{9}CH$/` or `/^99\d{16}$/` | — | `s10(n)` | | 70 | [BRT (Bartolini)](https://docs.lastscanned.com/carriers/brt) | `brt` | — | — (`?carrier=brt`) | — | | 71 | [Aramex Australia / NZ](https://docs.lastscanned.com/carriers/aramexau) | `aramexau` | — | — (`?carrier=aramexau`) | — | | 72 | [CouriersPlease](https://docs.lastscanned.com/carriers/couriersplease) | `couriersplease` | `/^CP[A-Z]{5}\d{7}$/` | — | — | | 73 | [Team Global Express](https://docs.lastscanned.com/carriers/teamglobalexpress) | `teamglobalexpress` | — | — (`?carrier=teamglobalexpress`) | — | | 74 | [Ninja Van](https://docs.lastscanned.com/carriers/ninjavan) | `ninjavan` | — | `/^(NV\|NL)(SG\|MY\|ID\|PH\|VN\|TH\|MM)[A-Z0-9]{6,16}$/` | — | | 75 | [Flash Express](https://docs.lastscanned.com/carriers/flashexpress) | `flashexpress` | — | `/^TH\d{2}[A-Z0-9]{8,12}[A-Z]$/` | — | | 76 | [ICS Courier](https://docs.lastscanned.com/carriers/icscourier) | `icscourier` | `/^[A-Z]{2}\d[A-Z0-9]{11}[A-Z]\d[A-Z]\d[A-Z]\d$/` | — | — | | 77 | [Chit Chats](https://docs.lastscanned.com/carriers/chitchats) | `chitchats` | — | — (`?carrier=chitchats`) | — | | 78 | [Passport](https://docs.lastscanned.com/carriers/passport) | `passport` | `/^PG\d{10,11}[A-Z]{2}$/` | — | — | | 79 | [ePost Global](https://docs.lastscanned.com/carriers/epostglobal) | `epostglobal` | `/^EPG\d{15}$/` | — | — | | 80 | [JYExpress](https://docs.lastscanned.com/carriers/jyexpress) | `jyexpress` | — | — (`?carrier=jyexpress`) | — | | 81 | [Sagawa Express](https://docs.lastscanned.com/carriers/sagawa) | `sagawa` | — | — (`?carrier=sagawa`) | — | | 82 | [Aramex](https://docs.lastscanned.com/carriers/aramex) | `aramex` | — | — (`?carrier=aramex`) | — | | 83 | [T-cat (Taiwan Pelican Express)](https://docs.lastscanned.com/carriers/tcat) | `tcat` | — | — (`?carrier=tcat`) | — | | 84 | [Hanjin](https://docs.lastscanned.com/carriers/hanjin) | `hanjin` | — | — (`?carrier=hanjin`) | — | | 85 | [Lotte Global Logistics](https://docs.lastscanned.com/carriers/lotte) | `lotte` | — | — (`?carrier=lotte`) | — | | 86 | [Logen](https://docs.lastscanned.com/carriers/logen) | `logen` | — | — (`?carrier=logen`) | — | | 87 | [Shadowfax](https://docs.lastscanned.com/carriers/shadowfax) | `shadowfax` | — | — (`?carrier=shadowfax`) | — | | 88 | [SFC (Sendfromchina)](https://docs.lastscanned.com/carriers/sfc) | `sfc` | — | — (`?carrier=sfc`) | — | | 89 | [Anjun Logistics](https://docs.lastscanned.com/carriers/anjun) | `anjun` | — | — (`?carrier=anjun`) | — | | 90 | [Winit](https://docs.lastscanned.com/carriers/winit) | `winit` | — | — (`?carrier=winit`) | — | | 91 | [NZ Couriers](https://docs.lastscanned.com/carriers/nzcouriers) | `nzcouriers` | — | — (`?carrier=nzcouriers`) | — | | 92 | [Post Haste](https://docs.lastscanned.com/carriers/posthaste) | `posthaste` | — | — (`?carrier=posthaste`) | — | | 93 | [Castle Parcels](https://docs.lastscanned.com/carriers/castleparcels) | `castleparcels` | — | — (`?carrier=castleparcels`) | — | | 94 | [Gaopost](https://docs.lastscanned.com/carriers/gaopost) | `gaopost` | — | — (`?carrier=gaopost`) | — | | 95 | [YF Express](https://docs.lastscanned.com/carriers/yfexpress) | `yfexpress` | — | — (`?carrier=yfexpress`) | — | | 96 | [GDWSE](https://docs.lastscanned.com/carriers/gdwse) | `gdwse` | — | — (`?carrier=gdwse`) | — | | 97 | [Chronopost](https://docs.lastscanned.com/carriers/chronopost) | `chronopost` | — | — (`?carrier=chronopost`) | — | | 98 | [Bring / Posten Norge](https://docs.lastscanned.com/carriers/bring) | `bring` | `XX123456785NO`-style ✓ | `370` + 15 digits | `s10(n)` | | 99 | [Matkahuolto](https://docs.lastscanned.com/carriers/matkahuolto) | `matkahuolto` | `/^MH\d{9}FI$/` | `/^MA\d{19}$/` | — | | 100 | [Posti Finland](https://docs.lastscanned.com/carriers/posti) | `posti` | `XX123456785FI`-style ✓ | `JJFI` + 14 digits | `s10(n)` | | 101 | [Česká pošta](https://docs.lastscanned.com/carriers/ceskaposta) | `ceskaposta` | `XX123456785CZ`-style ✓ | — | `s10(n)` | | 102 | [CTT Portugal](https://docs.lastscanned.com/carriers/ctt) | `ctt` | `XX123456785PT`-style ✓ | — | `s10(n)` | | 103 | [SEUR](https://docs.lastscanned.com/carriers/seur) | `seur` | — | — (`?carrier=seur`) | — | | 104 | [Nova Poshta](https://docs.lastscanned.com/carriers/novaposhta) | `novaposhta` | — | `20` or `59` + 12 digits | — | | 105 | [Sameday](https://docs.lastscanned.com/carriers/sameday) | `sameday` | — | — (`?carrier=sameday`) | — | | 106 | [FAN Courier](https://docs.lastscanned.com/carriers/fancourier) | `fancourier` | — | — (`?carrier=fancourier`) | — | | 107 | [Econt](https://docs.lastscanned.com/carriers/econt) | `econt` | — | — (`?carrier=econt`) | — | | 108 | [Meest](https://docs.lastscanned.com/carriers/meest) | `meest` | — | `CV` + 9 digits + `UA` | — | | 109 | [Yurtiçi Kargo](https://docs.lastscanned.com/carriers/yurtici) | `yurtici` | — | — (`?carrier=yurtici`) | — | | 110 | [NOEST Express](https://docs.lastscanned.com/carriers/noest) | `noest` | — | `/^[A-Z0-9]{3}-[A-Z0-9]{3}-\d{6,9}$/` | — | | 111 | [Paquetexpress](https://docs.lastscanned.com/carriers/paquetexpress) | `paquetexpress` | — | 3 letters + 2 digits + 1–3 letters + 6–9 digits | — | | 112 | [Andreani](https://docs.lastscanned.com/carriers/andreani) | `andreani` | — | — (`?carrier=andreani`) | — | | 113 | [The Courier Guy](https://docs.lastscanned.com/carriers/thecourierguy) | `thecourierguy` | — | — (`?carrier=thecourierguy`) | — | | 114 | [PostNet](https://docs.lastscanned.com/carriers/postnet) | `postnet` | — | — (`?carrier=postnet`) | — | | 115 | [99minutos](https://docs.lastscanned.com/carriers/minutos99) | `minutos99` | — | — (`?carrier=minutos99`) | — | | 116 | [Mainfreight](https://docs.lastscanned.com/carriers/mainfreight) | `mainfreight` | — | — (`?carrier=mainfreight`) | — | | 117 | [YTO Express](https://docs.lastscanned.com/carriers/yto) | `yto` | `YT` + 13 digits, or `YTD`/`YTG`/`YTH`/`YTZ` + 12 digits | — | — | | 118 | [SPL Saudi Post](https://docs.lastscanned.com/carriers/spl) | `spl` | `XX123456785SA`-style ✓ | — | `s10(n)` | | 119 | [KEX Express Thailand](https://docs.lastscanned.com/carriers/kex) | `kex` | — | — (`?carrier=kex`) | — | | 120 | [Pos Malaysia](https://docs.lastscanned.com/carriers/posmalaysia) | `posmalaysia` | `XX123456785MY`-style ✓ | — | `s10(n)` | | 121 | [GDEX](https://docs.lastscanned.com/carriers/gdex) | `gdex` | — | — (`?carrier=gdex`) | — | | 122 | [City-Link Express](https://docs.lastscanned.com/carriers/citylink) | `citylink` | — | — (`?carrier=citylink`) | — | | 123 | [LBC Express](https://docs.lastscanned.com/carriers/lbc) | `lbc` | — | — (`?carrier=lbc`) | — | | 124 | [DHL eCommerce](https://docs.lastscanned.com/carriers/dhlecommerce) | `dhlecommerce` | — | — (`?carrier=dhlecommerce`) | — | | 125 | [DHL Parcel NL](https://docs.lastscanned.com/carriers/dhlparcelnl) | `dhlparcelnl` | `JVGL` + 20 digits | — | — | | 126 | [DHL Parcel Iberia](https://docs.lastscanned.com/carriers/dhlparceles) | `dhlparceles` | — | — (`?carrier=dhlparceles`) | — | | 127 | [DHL Parcel PL](https://docs.lastscanned.com/carriers/dhlparcelpl) | `dhlparcelpl` | — | — (`?carrier=dhlparcelpl`) | — | | 128 | [DHL eCommerce UK](https://docs.lastscanned.com/carriers/dhlecommerceuk) | `dhlecommerceuk` | — | — (`?carrier=dhlecommerceuk`) | — | | 129 | [DHL Freight](https://docs.lastscanned.com/carriers/dhlfreight) | `dhlfreight` | — | — (`?carrier=dhlfreight`) | — | | 130 | [DHLink](https://docs.lastscanned.com/carriers/dhlink) | `dhlink` | — | — (`?carrier=dhlink`) | — | | 131 | [XQ Express](https://docs.lastscanned.com/carriers/xqexpress) | `xqexpress` | — | — (`?carrier=xqexpress`) | — | | 132 | [Ali Business Logistics](https://docs.lastscanned.com/carriers/alibusiness) | `alibusiness` | — | — (`?carrier=alibusiness`) | — | | 133 | [Omniva](https://docs.lastscanned.com/carriers/omniva) | `omniva` | `S10 *EE` with a valid check digit (`/^[A-Z]{2}\d{9}EE$/`) | — | `s10(n)` | | 134 | [Ukrposhta](https://docs.lastscanned.com/carriers/ukrposhta) | `ukrposhta` | `S10 *UA` with a valid check digit (`/^[A-Z]{2}\d{9}UA$/`) | `/^05\d{11}$/` | `s10(n)` | | 135 | [Speedy](https://docs.lastscanned.com/carriers/speedy) | `speedy` | — | — (`?carrier=speedy`) | — | | 136 | [DPD Romania](https://docs.lastscanned.com/carriers/dpdro) | `dpdro` | — | — (`?carrier=dpdro`) | — | | 137 | [DPD Poland](https://docs.lastscanned.com/carriers/dpdpl) | `dpdpl` | — | `/^\d{13}[A-Z]$/` | — | | 138 | [DPD](https://docs.lastscanned.com/carriers/dpd) | `dpd` | — | `/^0\d{13}$/` | — | | 139 | [DPD Portugal](https://docs.lastscanned.com/carriers/dpdpt) | `dpdpt` | — | — (`?carrier=dpdpt`) | — | | 140 | [Thailand Post](https://docs.lastscanned.com/carriers/thailandpost) | `thailandpost` | `S10 *TH` with a valid check digit (`/^[A-Z]{2}\d{9}TH$/`) | — | `s10(n)` | | 141 | [Chunghwa Post](https://docs.lastscanned.com/carriers/chunghwapost) | `chunghwapost` | `S10 *TW` with a valid check digit (`/^[A-Z]{2}\d{9}TW$/`) | — | `s10(n)` | | 142 | [EMS](https://docs.lastscanned.com/carriers/ems) | `ems` | `/^E[A-Z]\d{9}CN$/` | — | `s10(n)` | | 143 | [ELTA](https://docs.lastscanned.com/carriers/elta) | `elta` | UPU S10 numbers ending in `GR` (check digit validated) | — | `s10(n)` | | 144 | [Estafeta](https://docs.lastscanned.com/carriers/estafeta) | `estafeta` | `/^\d{12}[A-Z]\d{9}$/` (the 22-character guide) | — | — | | 145 | [Total Express](https://docs.lastscanned.com/carriers/totalexpress) | `totalexpress` | `/^[A-Z]{4}\d{9}TX$/` | — | — | | 146 | [Sagawa Global](https://docs.lastscanned.com/carriers/sagawaglobal) | `sagawaglobal` | `/^IDA\d{12}$/` | — | — | | 147 | [MRW](https://docs.lastscanned.com/carriers/mrw) | `mrw` | `/^\d{5}[A-Z]\d{6}$/` | — | — | | 148 | [Nacex](https://docs.lastscanned.com/carriers/nacex) | `nacex` | `/^\d{4}\/\d{8}$/` (agency/waybill) | — | — | | 149 | [HuaHan](https://docs.lastscanned.com/carriers/huahan) | `huahan` | `/^HHW[A-Z]{2}\d{10}[A-Z]{2}$/` | — | — | | 150 | [Chukou1](https://docs.lastscanned.com/carriers/chukou1) | `chukou1` | — | `/^[A-Z]{3}\d{6,7}LW\d{6,8}$/` | — | | 151 | [ZTO International](https://docs.lastscanned.com/carriers/ztointl) | `ztointl` | — | `/^77122\d{9}$/` | — | | 152 | [STO Express](https://docs.lastscanned.com/carriers/sto) | `sto` | — | — (`?carrier=sto`) | — | | 153 | [OCA](https://docs.lastscanned.com/carriers/oca) | `oca` | — | `/^\d{19}$/` | — | | 154 | [OCASA](https://docs.lastscanned.com/carriers/ocasa) | `ocasa` | — | — (`?carrier=ocasa`) | — | | 155 | [Coordinadora](https://docs.lastscanned.com/carriers/coordinadora) | `coordinadora` | — | — (`?carrier=coordinadora`) | — | | 156 | [HCT Logistics](https://docs.lastscanned.com/carriers/hct) | `hct` | — | — (`?carrier=hct`) | — | | 157 | [Starken](https://docs.lastscanned.com/carriers/starken) | `starken` | — | — (`?carrier=starken`) | — | | 158 | [Hunter Express](https://docs.lastscanned.com/carriers/hunterexpress) | `hunterexpress` | — | — (`?carrier=hunterexpress`) | — | | 159 | [Aras Kargo](https://docs.lastscanned.com/carriers/aras) | `aras` | — | — (`?carrier=aras`) | — | | 160 | [SMSA Express](https://docs.lastscanned.com/carriers/smsa) | `smsa` | — | — (`?carrier=smsa`) | — | | 161 | [Naqel Express](https://docs.lastscanned.com/carriers/naqel) | `naqel` | — | — (`?carrier=naqel`) | — | | 162 | [AUS Express](https://docs.lastscanned.com/carriers/asusexp) | `asusexp` | — | — (`?carrier=asusexp`) | — | | 163 | [BDTPost](https://docs.lastscanned.com/carriers/bdtpost) | `bdtpost` | — | — (`?carrier=bdtpost`) | — | | 164 | [Boyi Hongda](https://docs.lastscanned.com/carriers/byhd) | `byhd` | — | — (`?carrier=byhd`) | — | | 165 | [BYT Logistics](https://docs.lastscanned.com/carriers/byt) | `byt` | — | — (`?carrier=byt`) | — | | 166 | [CD International](https://docs.lastscanned.com/carriers/chengda) | `chengda` | — | — (`?carrier=chengda`) | — | | 167 | [CHH Logistics](https://docs.lastscanned.com/carriers/chunhong) | `chunhong` | — | — (`?carrier=chunhong`) | — | | 168 | [Chuangyu Logistics](https://docs.lastscanned.com/carriers/cyexpress) | `cyexpress` | — | — (`?carrier=cyexpress`) | — | | 169 | [DHFEX](https://docs.lastscanned.com/carriers/dhfex) | `dhfex` | — | — (`?carrier=dhfex`) | — | | 170 | [EDL Express](https://docs.lastscanned.com/carriers/edlexpress) | `edlexpress` | — | — (`?carrier=edlexpress`) | — | | 171 | [ED POST](https://docs.lastscanned.com/carriers/edpost) | `edpost` | — | — (`?carrier=edpost`) | — | | 172 | [ETSCP](https://docs.lastscanned.com/carriers/etscp) | `etscp` | — | — (`?carrier=etscp`) | — | | 173 | [Fuhai Wulian](https://docs.lastscanned.com/carriers/fuhai618) | `fuhai618` | — | — (`?carrier=fuhai618`) | — | | 174 | [FJEX](https://docs.lastscanned.com/carriers/fujexp) | `fujexp` | — | — (`?carrier=fujexp`) | — | | 175 | [JSH Galaxy Express](https://docs.lastscanned.com/carriers/galaxyex) | `galaxyex` | — | — (`?carrier=galaxyex`) | — | | 176 | [ASGYL](https://docs.lastscanned.com/carriers/gdasgyl) | `gdasgyl` | — | — (`?carrier=gdasgyl`) | — | | 177 | [Tianhai Supply Chain](https://docs.lastscanned.com/carriers/gzbtygj) | `gzbtygj` | — | — (`?carrier=gzbtygj`) | — | | 178 | [YouMeiYuTong](https://docs.lastscanned.com/carriers/gzymyt) | `gzymyt` | — | — (`?carrier=gzymyt`) | — | | 179 | [HLSZ56](https://docs.lastscanned.com/carriers/hlsz56) | `hlsz56` | — | — (`?carrier=hlsz56`) | — | | 180 | [HOYANG Express](https://docs.lastscanned.com/carriers/hoyang) | `hoyang` | — | — (`?carrier=hoyang`) | — | | 181 | [Heping Logistics](https://docs.lastscanned.com/carriers/hpgjwl) | `hpgjwl` | — | — (`?carrier=hpgjwl`) | — | | 182 | [HSD Express](https://docs.lastscanned.com/carriers/hsdex) | `hsdex` | — | — (`?carrier=hsdex`) | — | | 183 | [JTEX](https://docs.lastscanned.com/carriers/hzjtex) | `hzjtex` | — | — (`?carrier=hzjtex`) | — | | 184 | [PD Express](https://docs.lastscanned.com/carriers/hzpdex) | `hzpdex` | — | — (`?carrier=hzpdex`) | — | | 185 | [Jiuhao International](https://docs.lastscanned.com/carriers/jhgj) | `jhgj` | — | — (`?carrier=jhgj`) | — | | 186 | [JDT Logistics](https://docs.lastscanned.com/carriers/jiudt) | `jiudt` | — | — (`?carrier=jiudt`) | — | | 187 | [LeiYi Logistics](https://docs.lastscanned.com/carriers/leiyi) | `leiyi` | — | — (`?carrier=leiyi`) | — | | 188 | [Lingdong International](https://docs.lastscanned.com/carriers/lingdong) | `lingdong` | — | — (`?carrier=lingdong`) | — | | 189 | [Mayi Yinfu](https://docs.lastscanned.com/carriers/mayiyinfu) | `mayiyinfu` | — | — (`?carrier=mayiyinfu`) | — | | 190 | [Miuson Express](https://docs.lastscanned.com/carriers/miuson) | `miuson` | — | — (`?carrier=miuson`) | — | | 191 | [Pingda International](https://docs.lastscanned.com/carriers/pingda56) | `pingda56` | — | — (`?carrier=pingda56`) | — | | 192 | [PY Express](https://docs.lastscanned.com/carriers/pyexpress) | `pyexpress` | — | — (`?carrier=pyexpress`) | — | | 193 | [QFL Express](https://docs.lastscanned.com/carriers/qfl) | `qfl` | — | — (`?carrier=qfl`) | — | | 194 | [QYEXP](https://docs.lastscanned.com/carriers/qyexp) | `qyexp` | — | — (`?carrier=qyexp`) | — | | 195 | [Qyun Express](https://docs.lastscanned.com/carriers/qyun) | `qyun` | — | — (`?carrier=qyun`) | — | | 196 | [Shang Fang International](https://docs.lastscanned.com/carriers/shangfang) | `shangfang` | — | — (`?carrier=shangfang`) | — | | 197 | [SHSGEXP](https://docs.lastscanned.com/carriers/shsgexp) | `shsgexp` | — | — (`?carrier=shsgexp`) | — | | 198 | [StarGlobal](https://docs.lastscanned.com/carriers/starglobal) | `starglobal` | — | — (`?carrier=starglobal`) | — | | 199 | [TDE Logistics](https://docs.lastscanned.com/carriers/sztdgyl) | `sztdgyl` | — | — (`?carrier=sztdgyl`) | — | | 200 | [Tianhui Hengyuan](https://docs.lastscanned.com/carriers/thhy) | `thhy` | — | — (`?carrier=thhy`) | — | | 201 | [Usky Express](https://docs.lastscanned.com/carriers/usky) | `usky` | — | — (`?carrier=usky`) | — | | 202 | [WM Cloud](https://docs.lastscanned.com/carriers/wmycc) | `wmycc` | — | — (`?carrier=wmycc`) | — | | 203 | [XS Express](https://docs.lastscanned.com/carriers/xsexp) | `xsexp` | — | — (`?carrier=xsexp`) | — | | 204 | [YJI Logistics](https://docs.lastscanned.com/carriers/yanjin) | `yanjin` | — | — (`?carrier=yanjin`) | — | | 205 | [Yilong Logistics](https://docs.lastscanned.com/carriers/yilong) | `yilong` | — | — (`?carrier=yilong`) | — | | 206 | [Yincag Logistics](https://docs.lastscanned.com/carriers/yincag) | `yincag` | — | — (`?carrier=yincag`) | — | | 207 | [ESHUN (ZES Express)](https://docs.lastscanned.com/carriers/eshun) | `eshun` | `/^ZES[A-Z]{2}\d{10}YQ$/` | — | — | | 208 | [ACS Courier](https://docs.lastscanned.com/carriers/acscourier) | `acscourier` | — | — (`?carrier=acscourier`) | — | | 209 | [Airpak Express](https://docs.lastscanned.com/carriers/airpakexpress) | `airpakexpress` | — | — (`?carrier=airpakexpress`) | — | | 210 | [Allegro One](https://docs.lastscanned.com/carriers/allegroone) | `allegroone` | `/^ALE\d{12}$/` | `/^A[0D][0-9A-Z]{8}$/` and `/^AD[0-9A-Z]{15}$/` | — | | 211 | [Anteraja](https://docs.lastscanned.com/carriers/anteraja) | `anteraja` | — | — (`?carrier=anteraja`) | — | | 212 | [AyMakan](https://docs.lastscanned.com/carriers/aymakan) | `aymakan` | `/^AY\d{9,11}$/` | — | — | | 213 | [Cargus](https://docs.lastscanned.com/carriers/cargus) | `cargus` | — | — (`?carrier=cargus`) | — | | 214 | [CDEK](https://docs.lastscanned.com/carriers/cdek) | `cdek` | — | — (`?carrier=cdek`) | — | | 215 | [Correos Express](https://docs.lastscanned.com/carriers/correosexpress) | `correosexpress` | — | — (`?carrier=correosexpress`) | — | | 216 | [CTT Express](https://docs.lastscanned.com/carriers/cttexpress) | `cttexpress` | — | `/^00\d{20}$/` | — | | 217 | [DAI Post](https://docs.lastscanned.com/carriers/daipost) | `daipost` | — | — (`?carrier=daipost`) | — | | 218 | [ECMS Express](https://docs.lastscanned.com/carriers/ecms) | `ecms` | `/^EC[A-Z]{3}\d{11}$/` | — | — | | 219 | [Ecoscooting](https://docs.lastscanned.com/carriers/ecoscooting) | `ecoscooting` | — | — (`?carrier=ecoscooting`) | — | | 220 | [Geis](https://docs.lastscanned.com/carriers/geis) | `geis` | — | — (`?carrier=geis`) | — | | 221 | [Jeebly](https://docs.lastscanned.com/carriers/jeebly) | `jeebly` | `/^JB\d{6,7}$/ and /^JBP\d{6}$/` | — | — | | 222 | [DHL eCommerce Türkiye](https://docs.lastscanned.com/carriers/mngkargo) | `mngkargo` | — | — (`?carrier=mngkargo`) | — | | 223 | [Northline](https://docs.lastscanned.com/carriers/northline) | `northline` | — | `/^\d[A-Z]{3}\d{5,8}$/` (customer-prefixed consignment notes) | — | | 224 | [Nova Global](https://docs.lastscanned.com/carriers/novaglobal) | `novaglobal` | `/^WB\d{16}NPG$/` | — | — | | 225 | [OMGO](https://docs.lastscanned.com/carriers/omgo) | `omgo` | `/^OMGO\d{13}$/` | — | — | | 226 | [Pakistan Post](https://docs.lastscanned.com/carriers/pakistanpost) | `pakistanpost` | Valid UPU S10 number ending `PK` (check digit verified), or `/^(RGL\ | — | `s10(n)` | | 227 | [Paperfly](https://docs.lastscanned.com/carriers/paperfly) | `paperfly` | `/^PFL-BD-CB-\d{10}$/` | `/^\d{6}-\d{6}-[A-Z]\d-[A-Z]\d$/` | — | | 228 | [Pathao Courier](https://docs.lastscanned.com/carriers/pathao) | `pathao` | `/^D[A-Z]\d{6}[A-Z0-9]{6}$/` | — | — | | 229 | [PHLPost](https://docs.lastscanned.com/carriers/phlpost) | `phlpost` | Valid UPU S10 number ending `PH` (check digit verified) | — | `s10(n)` | | 230 | [Planzer](https://docs.lastscanned.com/carriers/planzer) | `planzer` | `/^\d{5}\.\d{10}$/` | — | — | | 231 | [Pos Indonesia](https://docs.lastscanned.com/carriers/posindonesia) | `posindonesia` | — | `/^P\d{2}(0[1-9] | — | | 232 | [Posta Shqiptare](https://docs.lastscanned.com/carriers/postashqiptare) | `postashqiptare` | Valid UPU S10 number ending `AL` (check digit verified) | — | `s10(n)` | | 233 | [Pošta Slovenije](https://docs.lastscanned.com/carriers/postaslovenije) | `postaslovenije` | Valid UPU S10 number ending `SI` (check digit verified) | — | `s10(n)` | | 234 | [PostEx](https://docs.lastscanned.com/carriers/postex) | `postex` | — | — (`?carrier=postex`) | — | | 235 | [Pósturinn](https://docs.lastscanned.com/carriers/posturinn) | `posturinn` | UPU S10 `..IS`, valid check digit | — | `s10(n)` | | 236 | [Pro Carrier](https://docs.lastscanned.com/carriers/procarrier) | `procarrier` | `/^UBG\d{9}$/` | — | — | | 237 | [PTS Worldwide Express](https://docs.lastscanned.com/carriers/ptsexpress) | `ptsexpress` | — | — (`?carrier=ptsexpress`) | — | | 238 | [Quantium Solutions](https://docs.lastscanned.com/carriers/quantium) | `quantium` | — | — (`?carrier=quantium`) | — | | 239 | [Qwintry](https://docs.lastscanned.com/carriers/qwintry) | `qwintry` | `/^QR\d{8}$/` | — | — | | 240 | [Redur](https://docs.lastscanned.com/carriers/redur) | `redur` | — | — (`?carrier=redur`) | — | | 241 | [RedX](https://docs.lastscanned.com/carriers/redx) | `redx` | — | — (`?carrier=redx`) | — | | 242 | [South African Post Office](https://docs.lastscanned.com/carriers/sapo) | `sapo` | Valid UPU S10 number ending `ZA` (check digit verified) | — | `s10(n)` | | 243 | [Seino Transportation](https://docs.lastscanned.com/carriers/seino) | `seino` | — | — (`?carrier=seino`) | — | | 244 | [Sendex](https://docs.lastscanned.com/carriers/sendex) | `sendex` | — | — (`?carrier=sendex`) | — | | 245 | [Sending](https://docs.lastscanned.com/carriers/sending) | `sending` | — | — (`?carrier=sending`) | — | | 246 | [Serpost](https://docs.lastscanned.com/carriers/serpost) | `serpost` | UPU S10 `..PE`, valid check digit | — | `s10(n)` | | 247 | [Servientrega](https://docs.lastscanned.com/carriers/servientrega) | `servientrega` | — | — (`?carrier=servientrega`) | — | | 248 | [Shipa](https://docs.lastscanned.com/carriers/shipa) | `shipa` | `/^SD\d{9}$/` | — | — | | 249 | [ShipEntegra](https://docs.lastscanned.com/carriers/shipentegra) | `shipentegra` | `/^1SE\d{9}$/` | — | — | | 250 | [Shree Maruti Courier](https://docs.lastscanned.com/carriers/shreemaruti) | `shreemaruti` | — | — (`?carrier=shreemaruti`) | — | | 251 | [SkyNet Worldwide Express](https://docs.lastscanned.com/carriers/skynetworldwide) | `skynetworldwide` | — | — (`?carrier=skynetworldwide`) | — | | 252 | [SkyPostal](https://docs.lastscanned.com/carriers/skypostal) | `skypostal` | `/^SKAMZUS\d{10}$/` | `/^SP\d{11}BR$/` | — | | 253 | [Speedaf](https://docs.lastscanned.com/carriers/speedaf) | `speedaf` | `/^(AE | — | — | | 254 | [SpeedPAK](https://docs.lastscanned.com/carriers/speedpak) | `speedpak` | `/^E[ES][A-Z0-9]{26}$/` | — | — | | 255 | [PostNL (Spring GDS)](https://docs.lastscanned.com/carriers/springgds) | `springgds` | — | — (`?carrier=springgds`) | — | | 256 | [Slovak Parcel Service](https://docs.lastscanned.com/carriers/sps) | `sps` | `/^703\d{11}(\d{2})?$/` (SPS's 703 prefix; the 11-digit shipment number alone is shared with other carriers) | — | — | | 257 | [SPX Express Indonesia](https://docs.lastscanned.com/carriers/spxid) | `spxid` | `/^SPXID\d{11}[0-9A-Z]$/` | `/^ID\d{12}[0-9A-Z]?$/` | — | | 258 | [SPX Express Malaysia](https://docs.lastscanned.com/carriers/spxmy) | `spxmy` | `/^SPXMY\d{11}[0-9A-Z]$/` | `/^MY\d{12}[0-9A-Z]$/` | — | | 259 | [SPX Express Philippines](https://docs.lastscanned.com/carriers/spxph) | `spxph` | `/^SPXPH\d{10,16}[A-Z]?$/`, `/^SPEPH\d{11}[0-9A-Z]$/` | `/^PH\d{12,14}[A-Z]?$/` | — | | 260 | [SPX Express Thailand](https://docs.lastscanned.com/carriers/spxth) | `spxth` | `/^SPXTH\d{11}[0-9A-Z]$/` | `/^TH\d{12}[0-9A-Z]?$/` | — | | 261 | [SPX Express Vietnam](https://docs.lastscanned.com/carriers/spxvn) | `spxvn` | `/^SPXVN\d{11}[0-9A-Z]$/` | `/^VN\d{12}[0-9A-Z]$/` | — | | 262 | [Stallion Express](https://docs.lastscanned.com/carriers/stallionexpress) | `stallionexpress` | — | `/^(SE)?2\d(0[1-9] | — | | 263 | [Starex](https://docs.lastscanned.com/carriers/starex) | `starex` | `/^STR[A-Z]{2}\d{12}$/` | — | — | | 264 | [ST Courier](https://docs.lastscanned.com/carriers/stcourier) | `stcourier` | — | — (`?carrier=stcourier`) | — | | 265 | [Straightship](https://docs.lastscanned.com/carriers/straightship) | `straightship` | `/^STR(TD\d{9} | — | — | | 266 | [Swiss Post Cargo](https://docs.lastscanned.com/carriers/swisspostcargo) | `swisspostcargo` | — | — (`?carrier=swisspostcargo`) | — | | 267 | [TIPSA](https://docs.lastscanned.com/carriers/tipsa) | `tipsa` | — | `/^\d{22}$/ (not starting `96`)` | — | | 268 | [TMM Express](https://docs.lastscanned.com/carriers/tmmexpress) | `tmmexpress` | — | — (`?carrier=tmmexpress`) | — | | 269 | [TNT](https://docs.lastscanned.com/carriers/tnt) | `tnt` | — | — (`?carrier=tnt`) | — | | 270 | [TOPTRANS](https://docs.lastscanned.com/carriers/toptrans) | `toptrans` | — | — (`?carrier=toptrans`) | — | | 271 | [TracX Logis](https://docs.lastscanned.com/carriers/tracxlogis) | `tracxlogis` | `/^QSP\d{9}$/` | — | — | | 272 | [TWS Express Courier](https://docs.lastscanned.com/carriers/twsexpress) | `twsexpress` | — | `/^28\d{4}[A-Z]\d{6}$/` | — | | 273 | [Urvaam](https://docs.lastscanned.com/carriers/urvaam) | `urvaam` | — | — (`?carrier=urvaam`) | — | | 274 | [Valmo](https://docs.lastscanned.com/carriers/valmo) | `valmo` | `/^VL\d{13}$/` | — | — | | 275 | [Vasp Expresso](https://docs.lastscanned.com/carriers/vaspexpresso) | `vaspexpresso` | — | — (`?carrier=vaspexpresso`) | — | | 276 | [Venipak](https://docs.lastscanned.com/carriers/venipak) | `venipak` | Parcel numbers: `/^V\d{5}E\d{7}$/` | — | — | | 277 | [Vinted Go](https://docs.lastscanned.com/carriers/vintedgo) | `vintedgo` | — | `/^1[78]\d{14}$/` | — | | 278 | [Vozovoz](https://docs.lastscanned.com/carriers/vozovoz) | `vozovoz` | — | — (`?carrier=vozovoz`) | — | | 279 | [Zeleris](https://docs.lastscanned.com/carriers/zeleris) | `zeleris` | `/^[0-9A-F]{8}\d{9}[A-Z]$/` | — | — | | 280 | [ZR Express](https://docs.lastscanned.com/carriers/zrexpress) | `zrexpress` | `/^\d{1,2}-[A-Z0-9]{10}-ZR$/` | — | — | | 281 | [17FEIA](https://docs.lastscanned.com/carriers/17feia) | `17feia` | `/^FEI[A-Z]{2}\d{10}YQ$/` | — | — | | 282 | [2GO Express](https://docs.lastscanned.com/carriers/2go) | `2go` | — | `/^[A-Z]\d{7}[A-Z]$/` | — | | 283 | [4Sides](https://docs.lastscanned.com/carriers/4sides) | `4sides` | `/^F[SE]\d{9}RU$/` | — | — | | 284 | [5Post](https://docs.lastscanned.com/carriers/5post) | `5post` | — | — (`?carrier=5post`) | — | | 285 | [A1 POST](https://docs.lastscanned.com/carriers/a1post) | `a1post` | — | — (`?carrier=a1post`) | — | | 286 | [ABF Freight](https://docs.lastscanned.com/carriers/abffreight) | `abffreight` | — | — (`?carrier=abffreight`) | — | | 287 | [A. Duie Pyle](https://docs.lastscanned.com/carriers/aduiepyle) | `aduiepyle` | — | — (`?carrier=aduiepyle`) | — | | 288 | [AEX Paraguay](https://docs.lastscanned.com/carriers/aexparaguay) | `aexparaguay` | — | `/^A\d{9}$/` | — | | 289 | [AIT Worldwide](https://docs.lastscanned.com/carriers/aitworldwide) | `aitworldwide` | — | `/^S\d{8}$/` | — | | 290 | [AJEX](https://docs.lastscanned.com/carriers/ajex) | `ajex` | `/^AJ[AS]\d{12}$/` | — | — | | 291 | [AM Home Delivery](https://docs.lastscanned.com/carriers/amhomedelivery) | `amhomedelivery` | — | `/^AM\d{9}$/` | — | | 292 | [Grupo ampm](https://docs.lastscanned.com/carriers/ampm) | `ampm` | — | `/^(CNA\d{12}\|IDTS\d{14})$/` | — | | 293 | [AnserX](https://docs.lastscanned.com/carriers/anserx) | `anserx` | `/^BTYCN\d{10}YQ$/` | — | — | | 294 | [APC Overnight](https://docs.lastscanned.com/carriers/apcovernight) | `apcovernight` | — | `/^20[12]\d(0[1-9]\|1[0-2])(0[1-9]\|[12]\d\|3[01])\d{14}$/` | — | | 295 | [Apple Express](https://docs.lastscanned.com/carriers/appleexpress) | `appleexpress` | `/^(APPL\d{13}\|CACAINIAO\d{11})$/` | — | — | | 296 | [Aramex New Zealand](https://docs.lastscanned.com/carriers/aramexnz) | `aramexnz` | — | — (`?carrier=aramexnz`) | — | | 297 | [A Tu Hora Express](https://docs.lastscanned.com/carriers/atuhoraexpress) | `atuhoraexpress` | `/^0{6}\d{10}001\d{5}$/` | — | — | | 298 | [Bangladesh Post](https://docs.lastscanned.com/carriers/bangladeshpost) | `bangladeshpost` | — | `S10 *BD` with a valid check digit (`/^[A-Z]{2}\d{9}BD$/`) | — | | 299 | [BEX Express](https://docs.lastscanned.com/carriers/bexexpress) | `bexexpress` | — | — (`?carrier=bexexpress`) | — | | 300 | [BJS Home Delivery](https://docs.lastscanned.com/carriers/bjshomedelivery) | `bjshomedelivery` | — | `/^B\d{7}-\d{4}$/` | — | | 301 | [BlueEX](https://docs.lastscanned.com/carriers/blueex) | `blueex` | — | `/^CP\d{12}$/` | — | | 302 | [Blue Express](https://docs.lastscanned.com/carriers/blueexpress) | `blueexpress` | — | — (`?carrier=blueexpress`) | — | | 303 | [Bombino Express](https://docs.lastscanned.com/carriers/bombino) | `bombino` | — | — (`?carrier=bombino`) | — | | 304 | [Bookurier](https://docs.lastscanned.com/carriers/bookurier) | `bookurier` | `/^BOK\d{7}$/` | — | — | | 305 | [MRL Global](https://docs.lastscanned.com/carriers/mrlglobal) | `mrlglobal` | — | `/^C[A-Z]{3}\d{6}$/` | — | | 306 | [Border Express](https://docs.lastscanned.com/carriers/borderexpress) | `borderexpress` | — | `/^[A-Z]{4}\d{5,8}$/` (not a valid ISO 6346 container number) | — | | 307 | [Bosta](https://docs.lastscanned.com/carriers/bosta) | `bosta` | — | — (`?carrier=bosta`) | — | | 308 | [BOX NOW](https://docs.lastscanned.com/carriers/boxnow) | `boxnow` | — | — (`?carrier=boxnow`) | — | | 309 | [Bringer Parcel Xpress](https://docs.lastscanned.com/carriers/bringerparcel) | `bringerparcel` | `/^BPS[A-Z0-9]{12,13}$/` | — | — | | 310 | [Bulgarian Posts](https://docs.lastscanned.com/carriers/bulgarianposts) | `bulgarianposts` | `/^PS[0-9A-Z]{11}$/` | — | — | | 311 | [Burd Delivery](https://docs.lastscanned.com/carriers/burddelivery) | `burddelivery` | `/^0574500\d{11}$/` | — | — | | 312 | [C3X](https://docs.lastscanned.com/carriers/c3x) | `c3x` | — | — (`?carrier=c3x`) | — | | 313 | [Cacesa](https://docs.lastscanned.com/carriers/cacesa) | `cacesa` | `/^CNPRT\d{20}$/` | — | — | | 314 | [Castores](https://docs.lastscanned.com/carriers/castores) | `castores` | — | — (`?carrier=castores`) | — | | 315 | [CCFS](https://docs.lastscanned.com/carriers/ccfs) | `ccfs` | — | — (`?carrier=ccfs`) | — | | 316 | [Central Transport](https://docs.lastscanned.com/carriers/centraltransport) | `centraltransport` | — | — (`?carrier=centraltransport`) | — | | 317 | [CEVA Logistics](https://docs.lastscanned.com/carriers/cevalogistics) | `cevalogistics` | — | — (`?carrier=cevalogistics`) | — | | 318 | [Chazki](https://docs.lastscanned.com/carriers/chazki) | `chazki` | — | — (`?carrier=chazki`) | — | | 319 | [Chilexpress](https://docs.lastscanned.com/carriers/chilexpress) | `chilexpress` | — | — (`?carrier=chilexpress`) | — | | 320 | [Chronodiali](https://docs.lastscanned.com/carriers/chronodiali) | `chronodiali` | `/^(?:CHPU\d{19}\|CD\d{10})$/` | — | — | | 321 | [Ciblex](https://docs.lastscanned.com/carriers/ciblex) | `ciblex` | — | — (`?carrier=ciblex`) | — | | 322 | [City Express](https://docs.lastscanned.com/carriers/cityexpressrs) | `cityexpressrs` | `/^68800[125]\d{8}$/` | — | — | | 323 | [CityMail](https://docs.lastscanned.com/carriers/citymail) | `citymail` | `/^BCM[A-Z]{1,2}\d{8,9}$/` | — | — | | 324 | [CJ Packet](https://docs.lastscanned.com/carriers/cjpacket) | `cjpacket` | `/^CJP[A-Z]{2,3}\d{10}YQ$/` | — | — | | 325 | [Closer Logistics](https://docs.lastscanned.com/carriers/closerlogistics) | `closerlogistics` | — | — (`?carrier=closerlogistics`) | — | | 326 | [Colisweb](https://docs.lastscanned.com/carriers/colisweb) | `colisweb` | — | — (`?carrier=colisweb`) | — | | 327 | [Connect Couriers](https://docs.lastscanned.com/carriers/connectcouriers) | `connectcouriers` | — | — (`?carrier=connectcouriers`) | — | | 328 | [Copa Airlines Courier](https://docs.lastscanned.com/carriers/copacourier) | `copacourier` | — | `/^H\d{7}$/` | — | | 329 | [Correo Argentino](https://docs.lastscanned.com/carriers/correoargentino) | `correoargentino` | `S10 *AR` with a valid check digit (`/^[A-Z]{2}\d{9}AR$/`) | — | `s10(n)` | | 330 | [Correos de México](https://docs.lastscanned.com/carriers/correosmexico) | `correosmexico` | `S10 *MX` with a valid check digit (`/^[A-Z]{2}\d{9}MX$/`) | — | `s10(n)` | | 331 | [Correos de El Salvador](https://docs.lastscanned.com/carriers/correossalvador) | `correossalvador` | `S10 *SV` with a valid check digit (`/^[A-Z]{2}\d{9}SV$/`) | — | `s10(n)` | | 332 | [Correo Uruguayo](https://docs.lastscanned.com/carriers/correouruguayo) | `correouruguayo` | `S10 *UY` with a valid check digit (`/^[A-Z]{2}\d{9}UY$/`) | — | `s10(n)` | | 333 | [Courier Center](https://docs.lastscanned.com/carriers/couriercenter) | `couriercenter` | — | — (`?carrier=couriercenter`) | — | | 334 | [CSE](https://docs.lastscanned.com/carriers/cserussia) | `cserussia` | — | — (`?carrier=cserussia`) | — | | 335 | [Cyprus Post](https://docs.lastscanned.com/carriers/cypruspost) | `cypruspost` | `S10 *CY` with a valid check digit (`/^[A-Z]{2}\d{9}CY$/`) | — | `s10(n)` | | 336 | [Danske Fragtmænd](https://docs.lastscanned.com/carriers/danskefragtmaend) | `danskefragtmaend` | `/^\d{20}[A-Z]{2}\d{6}$/` | `/^[A-Z]{2}\d{6}$/` | — | | 337 | [Daylight Transport](https://docs.lastscanned.com/carriers/daylighttransport) | `daylighttransport` | — | — (`?carrier=daylighttransport`) | — | | 338 | [Day & Ross](https://docs.lastscanned.com/carriers/dayross) | `dayross` | — | `/^A\d{8}$/` | — | | 339 | [Dayton Freight](https://docs.lastscanned.com/carriers/daytonfreight) | `daytonfreight` | — | — (`?carrier=daytonfreight`) | — | | 340 | [Delovye Linii](https://docs.lastscanned.com/carriers/dellin) | `dellin` | — | — (`?carrier=dellin`) | — | | 341 | [GAASH Worldwide](https://docs.lastscanned.com/carriers/gaash) | `gaash` | `/^GAIH\d{8}$/` | `/^(?:GWD\d{9}\|PH\d{10})$/` | — | | 342 | [D Express](https://docs.lastscanned.com/carriers/dexpress) | `dexpress` | — | `/^[A-Z]{2}\d{10}$/` | — | | 343 | [Direx](https://docs.lastscanned.com/carriers/direx) | `direx` | — | — (`?carrier=direx`) | — | | 344 | [DobroPost](https://docs.lastscanned.com/carriers/dobropost) | `dobropost` | `/^DBRPST\d{10}$/` | — | — | | 345 | [Domain Logistics](https://docs.lastscanned.com/carriers/domainlogistics) | `domainlogistics` | — | — (`?carrier=domainlogistics`) | — | | 346 | [Domex](https://docs.lastscanned.com/carriers/domex) | `domex` | — | — (`?carrier=domex`) | — | | 347 | [DPD South Africa](https://docs.lastscanned.com/carriers/dpdza) | `dpdza` | — | — (`?carrier=dpdza`) | — | | 348 | [DPEX Worldwide](https://docs.lastscanned.com/carriers/dpex) | `dpex` | — | — (`?carrier=dpex`) | — | | 349 | [Dragon Star Curier](https://docs.lastscanned.com/carriers/dragonstarcurier) | `dragonstarcurier` | — | — (`?carrier=dragonstarcurier`) | — | | 350 | [Drop2Shop](https://docs.lastscanned.com/carriers/drop2shop) | `drop2shop` | `/^GLB\d{13}$/` | — | — | | 351 | [Dropp](https://docs.lastscanned.com/carriers/dropp) | `dropp` | — | — (`?carrier=dropp`) | — | | 352 | [DSV](https://docs.lastscanned.com/carriers/dsv) | `dsv` | — | — (`?carrier=dsv`) | — | | 353 | [Early Bird](https://docs.lastscanned.com/carriers/earlybird) | `earlybird` | — | — (`?carrier=earlybird`) | — | | 354 | [Easy Mail](https://docs.lastscanned.com/carriers/easymail) | `easymail` | — | — (`?carrier=easymail`) | — | | 355 | [Egypt Post](https://docs.lastscanned.com/carriers/egyptpost) | `egyptpost` | `S10 *EG` with a valid check digit (`/^[A-Z]{2}\d{9}EG$/`) or `/^[A-Z]{3}\d{8}EG$/` | — | `s10(n)` | | 356 | [Ekart](https://docs.lastscanned.com/carriers/ekart) | `ekart` | `/^(?:AMI\|BAL\|BGS\|BSI\|DEL\|FLO\|FMP\|GLA\|LUA\|MY[ENS]\|SDL\|SHO\|SPO\|SRT\|TEL)[CPR]\d{10}$/` | — | — | | 357 | [eMile](https://docs.lastscanned.com/carriers/emile) | `emile` | `/^EM\d{12}CA$/` or `/^EM\d{16}CA$/` | — | — | | 358 | [EMS Vietnam](https://docs.lastscanned.com/carriers/emsvietnam) | `emsvietnam` | `S10 *VN` with a valid check digit (`/^[A-Z]{2}\d{9}VN$/`) or `/^E[A-Z]\d{9}VN$/` | — | `s10(n)` | | 359 | [Envia Colombia](https://docs.lastscanned.com/carriers/enviacolombia) | `enviacolombia` | — | — (`?carrier=enviacolombia`) | — | | 360 | [Envialia](https://docs.lastscanned.com/carriers/envialia) | `envialia` | — | — (`?carrier=envialia`) | — | | 361 | [Estes Express](https://docs.lastscanned.com/carriers/estes) | `estes` | — | — (`?carrier=estes`) | — | | 362 | [EuroExpress](https://docs.lastscanned.com/carriers/euroexpressba) | `euroexpressba` | — | — (`?carrier=euroexpressba`) | — | | 363 | [Evdemo Lojistik](https://docs.lastscanned.com/carriers/evdemo) | `evdemo` | — | — (`?carrier=evdemo`) | — | | 364 | [Evropat](https://docs.lastscanned.com/carriers/evropat) | `evropat` | — | — (`?carrier=evropat`) | — | | 365 | [EWE](https://docs.lastscanned.com/carriers/ewe) | `ewe` | `/^EMC\d{11}$/` or `/^AMZ\d{10}$/` | — | — | | 366 | [Exelot](https://docs.lastscanned.com/carriers/exelot) | `exelot` | `/^XLT\d{9}$/` | — | — | | 367 | [Exline](https://docs.lastscanned.com/carriers/exline) | `exline` | — | — (`?carrier=exline`) | — | | 368 | [Exmate](https://docs.lastscanned.com/carriers/exmate) | `exmate` | `/^EXK\d{8}J$/` | — | — | | 369 | [Express One](https://docs.lastscanned.com/carriers/expressone) | `expressone` | — | — (`?carrier=expressone`) | — | | 370 | [Fargo](https://docs.lastscanned.com/carriers/fargouz) | `fargouz` | `/^TEZ\d{6,10}$/` | — | — | | 371 | [Fastfrate](https://docs.lastscanned.com/carriers/fastfrate) | `fastfrate` | — | — (`?carrier=fastfrate`) | — | | 372 | [FedEx Freight](https://docs.lastscanned.com/carriers/fedexfreight) | `fedexfreight` | — | — (`?carrier=fedexfreight`) | — | | 373 | [FedEx Poland](https://docs.lastscanned.com/carriers/fedexpl) | `fedexpl` | — | — (`?carrier=fedexpl`) | — | | 374 | [Fermopoint](https://docs.lastscanned.com/carriers/fermopoint) | `fermopoint` | — | — (`?carrier=fermopoint`) | — | | 375 | [First Line](https://docs.lastscanned.com/carriers/firstline) | `firstline` | `/^1ST\d{11}$/` | — | — | | 376 | [Flash Express Philippines](https://docs.lastscanned.com/carriers/flashexpressph) | `flashexpressph` | — | `/^P\d{4}[0-9A-Z]{6,7}[A-Z]$/` | — | | 377 | [FleetExpress](https://docs.lastscanned.com/carriers/fleetex) | `fleetex` | — | `/^(?:SR\|DS)\d{12}$/` | — | | 378 | [FleetOptics](https://docs.lastscanned.com/carriers/fleetoptics) | `fleetoptics` | `/^F(?:OAESH\d{7}\|ONSP\d{11}\|DAV\d{16}\|DYNS[0-9A-Z]{11}\|CLR\d{12}\|SLS\d{15}\|EPO\d{15})$/` | — | — | | 379 | [Flip Post](https://docs.lastscanned.com/carriers/flippost) | `flippost` | `/^\d{2}-\d{3}-\d{3}$/` | — | — | | 380 | [Followmont](https://docs.lastscanned.com/carriers/followmont) | `followmont` | — | — (`?carrier=followmont`) | — | | 381 | [Forward Air](https://docs.lastscanned.com/carriers/forwardair) | `forwardair` | — | — (`?carrier=forwardair`) | — | | 382 | [Forza Delivery](https://docs.lastscanned.com/carriers/forzadelivery) | `forzadelivery` | `/^FD\d{6,9}$/` | — | — | | 383 | [Foxpost](https://docs.lastscanned.com/carriers/foxpost) | `foxpost` | `/^CLFOX\d{15}$/` | — | — | | 384 | [Franch Express](https://docs.lastscanned.com/carriers/franchexpress) | `franchexpress` | — | — (`?carrier=franchexpress`) | — | | 385 | [Geniki Taxydromiki](https://docs.lastscanned.com/carriers/genikitaxydromiki) | `genikitaxydromiki` | — | — (`?carrier=genikitaxydromiki`) | — | | 386 | [GlobalPost](https://docs.lastscanned.com/carriers/globalpost) | `globalpost` | `/^GP[A-Z]{4}\d{10}(US\|GB)$/` | — | — | | 387 | [GLS France](https://docs.lastscanned.com/carriers/glsfr) | `glsfr` | — | `/^00(?=[A-Z0-9]{6}$)(?=.*[A-Z])(?=.*\d)[A-Z0-9]{6}$/` | — | | 388 | [GLS Italy](https://docs.lastscanned.com/carriers/glsit) | `glsit` | — | `/^[A-Z]{2}\d{9}$/` | — | | 389 | [GMS Worldwide Express](https://docs.lastscanned.com/carriers/gmsworldwide) | `gmsworldwide` | — | — (`?carrier=gmsworldwide`) | — | | 390 | [GO4](https://docs.lastscanned.com/carriers/go4) | `go4` | — | — (`?carrier=go4`) | — | | 391 | [GoBolt](https://docs.lastscanned.com/carriers/gobolt) | `gobolt` | — | — (`?carrier=gobolt`) | — | | 392 | [GO! Express](https://docs.lastscanned.com/carriers/goexpress) | `goexpress` | — | — (`?carrier=goexpress`) | — | | 393 | [GOFO France](https://docs.lastscanned.com/carriers/gofofr) | `gofofr` | `/^(GFFR\d{13,14}\|CIFR\d{14})$/` | `/^PK-?\d{19}-?\d$/` | — | | 394 | [GOFO Italy](https://docs.lastscanned.com/carriers/gofoit) | `gofoit` | — | — (`?carrier=gofoit`) | — | | 395 | [GOFO Netherlands](https://docs.lastscanned.com/carriers/gofonl) | `gofonl` | — | — (`?carrier=gofonl`) | — | | 396 | [GoGo Xpress](https://docs.lastscanned.com/carriers/gogoxpress) | `gogoxpress` | — | — (`?carrier=gogoxpress`) | — | | 397 | [Grand Slam Express](https://docs.lastscanned.com/carriers/grandslamexpress) | `grandslamexpress` | — | — (`?carrier=grandslamexpress`) | — | | 398 | [GS Postbox](https://docs.lastscanned.com/carriers/gspostbox) | `gspostbox` | — | — (`?carrier=gspostbox`) | — | | 399 | [GTA AirSkip](https://docs.lastscanned.com/carriers/gtaairskip) | `gtaairskip` | `/^GR[GS]\d{5}[0-9A-Z]{11}$/` | — | — | | 400 | [GoTo Logistics](https://docs.lastscanned.com/carriers/gtlgoto) | `gtlgoto` | `/^(TKGTL[0-9A-Z]{11}\|GTL\d{10})$/` | — | — | | 401 | [Happy-Post](https://docs.lastscanned.com/carriers/happypost) | `happypost` | — | — (`?carrier=happypost`) | — | | 402 | [HayPost](https://docs.lastscanned.com/carriers/haypost) | `haypost` | `S10 *AM` with a valid check digit (`/^[A-Z]{2}\d{9}AM$/`) | — | `s10(n)` | | 403 | [Helthjem](https://docs.lastscanned.com/carriers/helthjem) | `helthjem` | `/^(00)?37072476\d{10}$/` | — | — | | 404 | [HepsiJET](https://docs.lastscanned.com/carriers/hepsijet) | `hepsijet` | — | — (`?carrier=hepsijet`) | — | | 405 | [Hermes Austria](https://docs.lastscanned.com/carriers/hermesat) | `hermesat` | — | — (`?carrier=hermesat`) | — | | 406 | [Hispapost](https://docs.lastscanned.com/carriers/hispapost) | `hispapost` | — | `/^CNES\d{11}$/` | — | | 407 | [Hongkong Post](https://docs.lastscanned.com/carriers/hongkongpost) | `hongkongpost` | `S10 *HK` with a valid check digit (`/^[A-Z]{2}\d{9}HK$/`) | — | `s10(n)` | | 408 | [Hovership](https://docs.lastscanned.com/carriers/hovership) | `hovership` | — | `/^HV[A-Z0-9]{8}$/` | — | | 409 | [HR Parcel](https://docs.lastscanned.com/carriers/hrparcel) | `hrparcel` | — | — (`?carrier=hrparcel`) | — | | 410 | [Hrvatska pošta](https://docs.lastscanned.com/carriers/hrvatskaposta) | `hrvatskaposta` | `S10 *HR` with a valid check digit (`/^[A-Z]{2}\d{9}HR$/`) | — | `s10(n)` | | 411 | [Huiyi Logistics](https://docs.lastscanned.com/carriers/hywl) | `hywl` | `/^TRK[0-9A-F]{12}$/` | — | — | | 412 | [Ilyang Logis](https://docs.lastscanned.com/carriers/ilyanglogis) | `ilyanglogis` | — | — (`?carrier=ilyanglogis`) | — | | 413 | [iMile](https://docs.lastscanned.com/carriers/imile) | `imile` | `/^IM0601\d{10}$/` | — | — | | 414 | [Indah Logistik](https://docs.lastscanned.com/carriers/indahlogistik) | `indahlogistik` | `/^[A-Z]{3}1CS(?:\d{8}\|(?:PL)?\d{12})$/` | — | — | | 415 | [Integral Pack](https://docs.lastscanned.com/carriers/integralpack) | `integralpack` | `/^IPE-\d{4}-[A-Z]-\d{8}$/` | — | — | | 416 | [Internet Express](https://docs.lastscanned.com/carriers/internetexpress) | `internetexpress` | — | — (`?carrier=internetexpress`) | — | | 417 | [Inter Rapidísimo](https://docs.lastscanned.com/carriers/interrapidisimo) | `interrapidisimo` | — | — (`?carrier=interrapidisimo`) | — | | 418 | [Israel Post](https://docs.lastscanned.com/carriers/israelpost) | `israelpost` | `S10 *IL` with a valid check digit (`/^[A-Z]{2}\d{9}IL$/`) | — | `s10(n)` | | 419 | [J&T Express Australia](https://docs.lastscanned.com/carriers/jandtau) | `jandtau` | `/^JTAU\d{12}$/` | — | — | | 420 | [J&T Cargo](https://docs.lastscanned.com/carriers/jandtcargo) | `jandtcargo` | — | — (`?carrier=jandtcargo`) | — | | 421 | [J&T Express Germany](https://docs.lastscanned.com/carriers/jandtde) | `jandtde` | `/^JTDE\d{12}$/` | — | — | | 422 | [Janio](https://docs.lastscanned.com/carriers/janio) | `janio` | `/^JN[A-Z]{2}\d{12}$/` | — | — | | 423 | [JCEX](https://docs.lastscanned.com/carriers/jcex) | `jcex` | `/^JCZ\d{10}DH$/` | — | — | | 424 | [JD Logistics](https://docs.lastscanned.com/carriers/jdlogistics) | `jdlogistics` | `/^(?:VG\d{11}\|JD(?:[A-Z]\d{12}\|[A-Z]{2}\d{11}))$/` | — | — | | 425 | [Jersey Post](https://docs.lastscanned.com/carriers/jerseypost) | `jerseypost` | `S10 *JE` with a valid check digit (`/^[A-Z]{2}\d{9}JE$/`) | — | `s10(n)` | | 426 | [Jetline Couriers](https://docs.lastscanned.com/carriers/jetlinecouriers) | `jetlinecouriers` | — | — (`?carrier=jetlinecouriers`) | — | | 427 | [Jet Logistic](https://docs.lastscanned.com/carriers/jetlogistic) | `jetlogistic` | — | — (`?carrier=jetlogistic`) | — | | 428 | [JNE](https://docs.lastscanned.com/carriers/jne) | `jne` | `/^JT\d{11}$/` | — | — | | 429 | [JS Express](https://docs.lastscanned.com/carriers/jsexpress) | `jsexpress` | `/^JSE[A-Z]{2}\d{10}YQ$/` | — | — | | 430 | [Jumppoint](https://docs.lastscanned.com/carriers/jumppoint) | `jumppoint` | `/^JP\d{12}$/` | — | — | | 431 | [Kazpost](https://docs.lastscanned.com/carriers/kazpost) | `kazpost` | `S10 *KZ` with a valid check digit (`/^[A-Z]{2}\d{9}KZ$/`) | — | `s10(n)` | | 432 | [KEX Express Hong Kong](https://docs.lastscanned.com/carriers/kexexpresshk) | `kexexpresshk` | `/^KEHKAZ\d{8}$/` | `/^L\d{9}$/` | — | | 433 | [Kun Express](https://docs.lastscanned.com/carriers/kunexpress) | `kunexpress` | `/^KUN\d{10}$/` | — | — | | 434 | [Kunyoung Express](https://docs.lastscanned.com/carriers/kunyoung) | `kunyoung` | — | — (`?carrier=kunyoung`) | — | | 435 | [Kyungdong Express](https://docs.lastscanned.com/carriers/kyoungdong) | `kyoungdong` | — | — (`?carrier=kyoungdong`) | — | | 436 | [Kyrgyz Post](https://docs.lastscanned.com/carriers/kyrgyzpost) | `kyrgyzpost` | `S10 *KG` with a valid check digit (`/^[A-Z]{2}\d{9}KG$/`) | — | `s10(n)` | | 437 | [Laar Courier](https://docs.lastscanned.com/carriers/laarcourier) | `laarcourier` | — | — (`?carrier=laarcourier`) | — | | 438 | [LaBaih](https://docs.lastscanned.com/carriers/labaih) | `labaih` | — | — (`?carrier=labaih`) | — | | 439 | [La Poste Burkina Faso](https://docs.lastscanned.com/carriers/laposteburkinafaso) | `laposteburkinafaso` | `S10 *BF` with a valid check digit (`/^[A-Z]{2}\d{9}BF$/`) | — | `s10(n)` | | 440 | [La Poste du Sénégal](https://docs.lastscanned.com/carriers/lapostesenegal) | `lapostesenegal` | `S10 *SN` with a valid check digit (`/^[A-Z]{2}\d{9}SN$/`) | — | `s10(n)` | | 441 | [Last One Mile Co-op](https://docs.lastscanned.com/carriers/lastonemilecoop) | `lastonemilecoop` | — | — (`?carrier=lastonemilecoop`) | — | | 442 | [Leopards Courier](https://docs.lastscanned.com/carriers/leopardscourier) | `leopardscourier` | — | — (`?carrier=leopardscourier`) | — | | 443 | [Liccardi Express Courier](https://docs.lastscanned.com/carriers/liccardi) | `liccardi` | — | — (`?carrier=liccardi`) | — | | 444 | [Lietuvos paštas](https://docs.lastscanned.com/carriers/lietuvospastas) | `lietuvospastas` | `/^(CC\|CH\|HC)\d{9}LT$/` | — | — | | 445 | [Lightning Express](https://docs.lastscanned.com/carriers/lightningexpress) | `lightningexpress` | `/^[A-Z]{3}\d{3}20\d{2}[01]\d[0-3]\d\d{4}$/` | — | — | | 446 | [Line Clear Express](https://docs.lastscanned.com/carriers/lineclear) | `lineclear` | — | — (`?carrier=lineclear`) | — | | 447 | [LinHan International](https://docs.lastscanned.com/carriers/linhan) | `linhan` | `/^LHGJ\d{8}CD$/` | — | — | | 448 | [Lion Parcel](https://docs.lastscanned.com/carriers/lionparcel) | `lionparcel` | `/^\d{2}LP\d{10,13}$/` | — | — | | 449 | [Logistiq](https://docs.lastscanned.com/carriers/logistiq) | `logistiq` | `/^ALAEAEF\d{9}$/` | `/^AL[A-Z]{5,6}\d{9}$/` | — | | 450 | [L-POST](https://docs.lastscanned.com/carriers/lpost) | `lpost` | `/^ABC\d{8}$/` | — | — | | 451 | [Madhur Courier](https://docs.lastscanned.com/carriers/madhurcourier) | `madhurcourier` | — | `/^P\d{9}$/` | — | | 452 | [MailAmericas](https://docs.lastscanned.com/carriers/mailamericas) | `mailamericas` | `/^ML[A-Z]{2}\d{9}(?:R\|EX)$/` or `/^MMXQP\d{9}[ENR]$/` | — | — | | 453 | [MaltaPost](https://docs.lastscanned.com/carriers/maltapost) | `maltapost` | `S10 *MT` with a valid check digit (`/^[A-Z]{2}\d{9}MT$/`) | — | `s10(n)` | | 454 | [Maritime-Ontario](https://docs.lastscanned.com/carriers/maritimeontario) | `maritimeontario` | — | `/^F\d{7}$/` | — | | 455 | [Mauritius Post](https://docs.lastscanned.com/carriers/mauritiuspost) | `mauritiuspost` | `S10 *MU` with a valid check digit (`/^[A-Z]{2}\d{9}MU$/`) | — | `s10(n)` | | 456 | [Micro Express](https://docs.lastscanned.com/carriers/microexpress) | `microexpress` | `/^ME\d{13}[A-Z0-9]{3}$/` | — | — | | 457 | [Midland Transport](https://docs.lastscanned.com/carriers/midlandtransport) | `midlandtransport` | — | `/^\d{16}$/` | — | | 458 | [M-ONE](https://docs.lastscanned.com/carriers/mone) | `mone` | — | `/^PL\d{9}RS$/` | — | | 459 | [Muller & Phipps](https://docs.lastscanned.com/carriers/mulphilog) | `mulphilog` | — | — (`?carrier=mulphilog`) | — | | 460 | [Mylerz](https://docs.lastscanned.com/carriers/mylerz) | `mylerz` | — | `/^63\d{12}$/` | — | | 461 | [Next Level](https://docs.lastscanned.com/carriers/nextleveldelivery) | `nextleveldelivery` | — | — (`?carrier=nextleveldelivery`) | — | | 462 | [Nim Express](https://docs.lastscanned.com/carriers/nimexpress) | `nimexpress` | — | — (`?carrier=nimexpress`) | — | | 463 | [nox](https://docs.lastscanned.com/carriers/nox) | `nox` | `/^SWR\d{21}$/` | — | — | | 464 | [OCS ANA](https://docs.lastscanned.com/carriers/ocsana) | `ocsana` | — | — (`?carrier=ocsana`) | — | | 465 | [Olva Courier](https://docs.lastscanned.com/carriers/olvacourier) | `olvacourier` | `/^ALI-OLVA\d{8}$/` | `/^(?:\d{2}-\d{6,8}\|\d{6,8}-\d{2})$/` | — | | 466 | [One World Express](https://docs.lastscanned.com/carriers/oneworldexpress) | `oneworldexpress` | `/^OWE\d{12}$/` | — | — | | 467 | [ORLEN Paczka](https://docs.lastscanned.com/carriers/orlenpaczka) | `orlenpaczka` | — | `/^210\d{10}$/` | — | | 468 | [Paack](https://docs.lastscanned.com/carriers/paack) | `paack` | `/^PK\d{18}$/` | — | — | | 469 | [Packlink](https://docs.lastscanned.com/carriers/packlink) | `packlink` | `/^[A-Z]{2}20\d{2}(?:COM\|PRO)\d{10}$/` | — | — | | 470 | [Pack-Man](https://docs.lastscanned.com/carriers/packman) | `packman` | — | — (`?carrier=packman`) | — | | 471 | [PCP Express](https://docs.lastscanned.com/carriers/pcpexpress) | `pcpexpress` | — | — (`?carrier=pcpexpress`) | — | | 472 | [PDN Express](https://docs.lastscanned.com/carriers/pdnexpress) | `pdnexpress` | `/^PDN\d{10}$/` | — | — | | 473 | [PDQ Cargo Trader](https://docs.lastscanned.com/carriers/pdqchile) | `pdqchile` | — | — (`?carrier=pdqchile`) | — | | 474 | [PFC Express](https://docs.lastscanned.com/carriers/pfcexpress) | `pfcexpress` | — | `/^R\d{5,6}2\d(?:0[1-9]\|1[0-2])(?:0[1-9]\|[12]\d\|3[01])\d{1,4}$/` | — | | 475 | [Pilot Freight Services](https://docs.lastscanned.com/carriers/pilotfreight) | `pilotfreight` | — | — (`?carrier=pilotfreight`) | — | | 476 | [PITT OHIO](https://docs.lastscanned.com/carriers/pittohio) | `pittohio` | — | `/^\d{10}$/` with the mod-7 check digit | — | | 477 | [Pošta na Severna Makedonija](https://docs.lastscanned.com/carriers/postamk) | `postamk` | `S10 *MK` with a valid check digit (`/^[A-Z]{2}\d{9}MK$/`) | — | `s10(n)` | | 478 | [POST Luxembourg](https://docs.lastscanned.com/carriers/postluxembourg) | `postluxembourg` | `S10 *LU` with a valid check digit (`/^[A-Z]{2}\d{9}LU$/`) | — | `s10(n)` | | 479 | [PPL](https://docs.lastscanned.com/carriers/ppl) | `ppl` | — | — (`?carrier=ppl`) | — | | 480 | [Precision Deliveries](https://docs.lastscanned.com/carriers/precisiondeliveries) | `precisiondeliveries` | `/^ASL\d{10}$/` | — | — | | 481 | [ProShips](https://docs.lastscanned.com/carriers/proships) | `proships` | — | `/^ML\d{9}MH$/` | — | | 482 | [Pullman Cargo](https://docs.lastscanned.com/carriers/pullmancargo) | `pullmancargo` | — | — (`?carrier=pullmancargo`) | — | | 483 | [Quiqup](https://docs.lastscanned.com/carriers/quiqup) | `quiqup` | — | — (`?carrier=quiqup`) | — | | 484 | [Raben](https://docs.lastscanned.com/carriers/raben) | `raben` | — | `/^276(?:574\|634)\d{9}$/` | — | | 485 | [RAM Hand-to-Hand Couriers](https://docs.lastscanned.com/carriers/ramh2h) | `ramh2h` | `/^RAM\d{8}$/` | — | — | | 486 | [Relais Colis](https://docs.lastscanned.com/carriers/relaiscolis) | `relaiscolis` | `/^CC\d{10,14}$/` | — | — | | 487 | [R+L Carriers](https://docs.lastscanned.com/carriers/rlcarriers) | `rlcarriers` | — | — (`?carrier=rlcarriers`) | — | | 488 | [Roadrunner](https://docs.lastscanned.com/carriers/roadrunner) | `roadrunner` | — | — (`?carrier=roadrunner`) | — | | 489 | [RPX Indonesia](https://docs.lastscanned.com/carriers/rpxindonesia) | `rpxindonesia` | — | — (`?carrier=rpxindonesia`) | — | | 490 | [Saia](https://docs.lastscanned.com/carriers/saia) | `saia` | — | — (`?carrier=saia`) | — | | 491 | [Sailpost](https://docs.lastscanned.com/carriers/sailpost) | `sailpost` | — | — (`?carrier=sailpost`) | — | | 492 | [SAP Express](https://docs.lastscanned.com/carriers/sapxexpress) | `sapxexpress` | — | — (`?carrier=sapxexpress`) | — | | 493 | [SAT](https://docs.lastscanned.com/carriers/satukraine) | `satukraine` | — | — (`?carrier=satukraine`) | — | | 494 | [SEKO Logistics](https://docs.lastscanned.com/carriers/seko) | `seko` | — | — (`?carrier=seko`) | — | | 495 | [Shree Anjani Courier](https://docs.lastscanned.com/carriers/shreeanjani) | `shreeanjani` | — | — (`?carrier=shreeanjani`) | — | | 496 | [Skroutz Last Mile](https://docs.lastscanned.com/carriers/skroutzlastmile) | `skroutzlastmile` | — | — (`?carrier=skroutzlastmile`) | — | | 497 | [SkyKing](https://docs.lastscanned.com/carriers/skyking) | `skyking` | — | — (`?carrier=skyking`) | — | | 498 | [Slovenská pošta](https://docs.lastscanned.com/carriers/slovenskaposta) | `slovenskaposta` | `S10 *SK` with a valid check digit (`/^[A-Z]{2}\d{9}SK$/`) | — | `s10(n)` | | 499 | [Southeastern Freight Lines](https://docs.lastscanned.com/carriers/southeasternfreightlines) | `southeasternfreightlines` | — | — (`?carrier=southeasternfreightlines`) | — | | 500 | [Gokulam Speed & Safe](https://docs.lastscanned.com/carriers/speedandsafe) | `speedandsafe` | — | — (`?carrier=speedandsafe`) | — | | 501 | [Speedex](https://docs.lastscanned.com/carriers/speedex) | `speedex` | — | — (`?carrier=speedex`) | — | | 502 | [SPX Express Brazil](https://docs.lastscanned.com/carriers/spxbr) | `spxbr` | — | `/^BR\d{12}[0-9A-Z]$/` | — | | 503 | [Sundarban Courier](https://docs.lastscanned.com/carriers/sundarbancourier) | `sundarbancourier` | — | — (`?carrier=sundarbancourier`) | — | | 504 | [Tanzania Posts](https://docs.lastscanned.com/carriers/tanzaniaposts) | `tanzaniaposts` | `S10 *TZ` with a valid check digit (`/^[A-Z]{2}\d{9}TZ$/`) | — | `s10(n)` | | 505 | [Taxydema](https://docs.lastscanned.com/carriers/taxydema) | `taxydema` | — | — (`?carrier=taxydema`) | — | | 506 | [TCI Express](https://docs.lastscanned.com/carriers/tciexpress) | `tciexpress` | — | — (`?carrier=tciexpress`) | — | | 507 | [TCS](https://docs.lastscanned.com/carriers/tcspakistan) | `tcspakistan` | — | — (`?carrier=tcspakistan`) | — | | 508 | [TDN](https://docs.lastscanned.com/carriers/tdn) | `tdn` | — | — (`?carrier=tdn`) | — | | 509 | [Tealca](https://docs.lastscanned.com/carriers/tealca) | `tealca` | — | — (`?carrier=tealca`) | — | | 510 | [Team Express](https://docs.lastscanned.com/carriers/teamexpressae) | `teamexpressae` | — | — (`?carrier=teamexpressae`) | — | | 511 | [Team Worldwide](https://docs.lastscanned.com/carriers/teamworldwide) | `teamworldwide` | — | — (`?carrier=teamworldwide`) | — | | 512 | [Teleship](https://docs.lastscanned.com/carriers/teleship) | `teleship` | `/^TSGB[A-Z]{2}[A-Z0-9]{15}$/` | — | — | | 513 | [TFM Express](https://docs.lastscanned.com/carriers/tfmexpress) | `tfmexpress` | — | — (`?carrier=tfmexpress`) | — | | 514 | [Tgroup](https://docs.lastscanned.com/carriers/tgroup) | `tgroup` | `/^3010TGR\d{14}$/` | — | — | | 515 | [Shree Tirupati Courier](https://docs.lastscanned.com/carriers/tirupaticourier) | `tirupaticourier` | — | — (`?carrier=tirupaticourier`) | — | | 516 | [TNT Italy](https://docs.lastscanned.com/carriers/tntit) | `tntit` | — | — (`?carrier=tntit`) | — | | 517 | [Torrestir](https://docs.lastscanned.com/carriers/torrestir) | `torrestir` | `/^M001\d{4}[0-9A-Z]\d{11}$/` | — | — | | 518 | [Trackon](https://docs.lastscanned.com/carriers/trackon) | `trackon` | — | — (`?carrier=trackon`) | — | | 519 | [Transcorp](https://docs.lastscanned.com/carriers/transcorp) | `transcorp` | — | — (`?carrier=transcorp`) | — | | 520 | [TST-CF Express](https://docs.lastscanned.com/carriers/tstcfexpress) | `tstcfexpress` | — | — (`?carrier=tstcfexpress`) | — | | 521 | [TufesaPack](https://docs.lastscanned.com/carriers/tufesa) | `tufesa` | — | — (`?carrier=tufesa`) | — | | 522 | [United Delivery Service](https://docs.lastscanned.com/carriers/uniteddeliveryservice) | `uniteddeliveryservice` | `/^APUDS\d{8}$/` | — | — | | 523 | [Upaya](https://docs.lastscanned.com/carriers/upaya) | `upaya` | `/^[A-Z]{6}\d{4}-\d{7}$/` | — | — | | 524 | [Urbano](https://docs.lastscanned.com/carriers/urbano) | `urbano` | — | — (`?carrier=urbano`) | — | | 525 | [Uzbekistan Post](https://docs.lastscanned.com/carriers/uzbekistanpost) | `uzbekistanpost` | `S10 *UZ` with a valid check digit (`/^[A-Z]{2}\d{9}UZ$/`) | — | `s10(n)` | | 526 | [Veloces](https://docs.lastscanned.com/carriers/veloces) | `veloces` | — | `/^V\d{10}$/` | — | | 527 | [Via Cargo](https://docs.lastscanned.com/carriers/viacargo) | `viacargo` | — | — (`?carrier=viacargo`) | — | | 528 | [Vimenpaq](https://docs.lastscanned.com/carriers/vimenpaq) | `vimenpaq` | — | — (`?carrier=vimenpaq`) | — | | 529 | [VRL Logistics](https://docs.lastscanned.com/carriers/vrllogistics) | `vrllogistics` | — | — (`?carrier=vrllogistics`) | — | | 530 | [Whistl](https://docs.lastscanned.com/carriers/whistl) | `whistl` | — | `/^TYP[A-Z]{3}\d{9}$/` | — | | 531 | [XDE Logistics](https://docs.lastscanned.com/carriers/xdelogistics) | `xdelogistics` | `/^XSO\d{12}$/` | — | — | | 532 | [XLCourier](https://docs.lastscanned.com/carriers/xlcourier) | `xlcourier` | `/^XLC\d{10,12}$/` | — | — | | 533 | [XPO](https://docs.lastscanned.com/carriers/xpoltl) | `xpoltl` | — | `/^\d{9}$/` | — | | 534 | [YCS Logistics](https://docs.lastscanned.com/carriers/ycslogistics) | `ycslogistics` | — | — (`?carrier=ycslogistics`) | — | | 535 | [Yunda Express](https://docs.lastscanned.com/carriers/yunda) | `yunda` | — | — (`?carrier=yunda`) | — | | 536 | [Dohrn Transfer](https://docs.lastscanned.com/carriers/dohrn) | `dohrn` | — | — (`?carrier=dohrn`) | — | | 537 | [Horoz Lojistik](https://docs.lastscanned.com/carriers/horoz) | `horoz` | — | — (`?carrier=horoz`) | — | | 538 | [Morning Global](https://docs.lastscanned.com/carriers/morningglobal) | `morningglobal` | — | `/^BR\d{9}MG$/` | — | | 539 | [Jordan Post](https://docs.lastscanned.com/carriers/jordanpost) | `jordanpost` | `S10 *JO` with a valid check digit (`/^[A-Z]{2}\d{9}JO$/`) | — | `s10(n)` | | 540 | [China Post](https://docs.lastscanned.com/carriers/chinapost) | `chinapost` | custom (see the carrier page) | — | — | | 541 | [Gati](https://docs.lastscanned.com/carriers/gati) | `gati` | — | — (`?carrier=gati`) | — | | 542 | [Zajil Express](https://docs.lastscanned.com/carriers/zajil) | `zajil` | — | — (`?carrier=zajil`) | — | | 543 | [SwiftX Express](https://docs.lastscanned.com/carriers/swiftx) | `swiftx` | `/^SWX\d{18}$/` | — | — | | 544 | [Maersk](https://docs.lastscanned.com/carriers/maersk) | `maersk` | `/^(MSKU\|MRKU\|MRSU\|MNBU\|SUDU)\d{7}$/` | — | `iso6346(n)` (ISO 6346 container check digit) | | 545 | [MSC](https://docs.lastscanned.com/carriers/msc) | `msc` | `/^(MSCU\|MEDU\|MSDU\|MSMU\|MSNU\|MSBU)\d{7}$/` | — | `iso6346(n)` (ISO 6346 container check digit) | | 546 | [COSCO Shipping](https://docs.lastscanned.com/carriers/cosco) | `cosco` | `/^(CSNU\|CBHU\|CCLU\|CSLU\|FCIU)\d{7}$/` | — | `iso6346(n)` (ISO 6346 container check digit) | | 547 | [Evergreen](https://docs.lastscanned.com/carriers/evergreen) | `evergreen` | `/^(EGHU\|EGSU\|EISU\|EITU)\d{7}$/` | — | `iso6346(n)` (ISO 6346 container check digit) | | 548 | [ONE (Ocean Network Express)](https://docs.lastscanned.com/carriers/one) | `one` | `/^(ONEU\|KKFU)\d{7}$/` | — | `iso6346(n)` (ISO 6346 container check digit) | | 549 | [Yang Ming](https://docs.lastscanned.com/carriers/yangming) | `yangming` | `/^YMMU\d{7}$/` | — | `iso6346(n)` (ISO 6346 container check digit) | --- ## Check-digit algorithms Four check-digit validators rule out mistyped numbers and non-tracking numbers (such as 10-digit phone numbers that would otherwise look like a 10-digit DHL Express waybill, or 16-digit credit card numbers that would otherwise look like a Canada Post PIN): ```ts /** UPS 1Z: letters count as (char code - 63) mod 10, odd indices doubled, mod 10. */ export function ups1Z(n: string): boolean { const body = n.slice(2, -1).toUpperCase(); let sum = 0; for (let i = 0; i < body.length; i++) { const ch = body[i]; const v = ch >= "0" && ch <= "9" ? Number(ch) : (ch.charCodeAt(0) - 63) % 10; sum += i % 2 ? v * 2 : v; } return (10 - (sum % 10)) % 10 === Number(n.slice(-1)); } /** UPU S10 (EA123456785US, RR123456785DE, UV123456785YP, EE123456785CA): weights 8,6,4,2,3,5,9,7 over 8 serial digits, mod 11. */ export function s10(n: string): boolean { const d = n.slice(2, 11); const w = [8, 6, 4, 2, 3, 5, 9, 7]; const c = 11 - (w.reduce((s, x, i) => s + x * Number(d[i]), 0) % 11); return (c === 10 ? 0 : c === 11 ? 5 : c) === Number(d[8]); } /** DHL Express 10-digit waybill: first 9 digits mod 7 equal the 10th digit. */ export function dhlExpress(n: string): boolean { return Number(n.slice(0, 9)) % 7 === Number(n[9]); } /** GS1 mod 10 (Canada Post 16-digit PINs, SSCC, GTIN): weights 3,1 from the right, check digit excluded. */ export function gs1(n: string): boolean { const body = n.slice(0, -1); let sum = 0; for (let i = 0; i < body.length; i++) sum += Number(body[body.length - 1 - i]) * (i % 2 ? 1 : 3); return (10 - (sum % 10)) % 10 === Number(n.slice(-1)); } ``` --- ## Format collisions & precedence rules Several carriers issue overlapping numeric lengths or hand parcels to partner networks. Here is how `lastscanned` resolves them: ### 1. 12-digit and 20-digit numbers: FedEx vs Purolator, Canada Post & DHL Paket - **12-digit numbers** (`/^\d{12}$/`) route to [FedEx](https://docs.lastscanned.com/carriers/fedex) in Pass 1. If you are tracking a 12-digit [Purolator](https://docs.lastscanned.com/carriers/purolator) or [Canada Post](https://docs.lastscanned.com/carriers/canadapost) PIN, pass `?carrier=purolator` or `?carrier=canadapost`. (12-character alphanumeric Purolator PINs like `PQR482019376` auto-detect in Pass 2 via `/^[A-Z]{3}\d{9}$/`, while [Sendle](https://docs.lastscanned.com/carriers/sendle) `QSS\d{9}` numbers win earlier in Pass 1.) - **20-digit numbers starting `0034043`** (DHL's GS1 prefix, `/^0034043\d{13}$/`) route to [DHL](https://docs.lastscanned.com/carriers/dhl); all other 20-digit numbers route to [FedEx](https://docs.lastscanned.com/carriers/fedex). ### 2. 22-digit numbers (`92…`–`95…` vs `96…`) & the `"USPS Currently Awaiting Package"` consolidator override - **20–26 digit numbers starting `92`, `93`, `94`, or `95`** (optionally prefixed with `420` + 5-digit destination ZIP, `/^(420\d{5})?9[2345]\d{18,24}$/`) route to [USPS](https://docs.lastscanned.com/carriers/usps) in Pass 1, while **22-digit numbers starting `96`** (`/^96\d{20}$/`) route to [FedEx](https://docs.lastscanned.com/carriers/fedex). - **Consolidator middle-mile scans (`?carrier=osm` and `?carrier=pitneybowes`)**: Parcels shipped via [OSM Worldwide](https://docs.lastscanned.com/carriers/osm) or [Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes) typically carry a `92…` (or `420` + ZIP + `92…`) USPS IMpb barcode. While the parcel is moving through OSM's or Pitney Bowes's middle-mile sort network (3–7 days), USPS only displays *"Pre-Shipment: Shipping Label Created, USPS Awaiting Item"* (`"USPS Currently Awaiting Package"`). Pass **`?carrier=osm`** or **`?carrier=pitneybowes`** on that same `92…` or `420…92…` number to retrieve the consolidator's live regional sort facility scans before USPS acceptance. ### 3. Why GLS US (`?carrier=glsus`) is never auto-detected [GLS US](https://docs.lastscanned.com/carriers/glsus) (formerly Golden State Overnight / GSO) uses 8–11 digit uncheck-digited numbers (typically 9 digits like `512345678`) and arbitrary shipper references (`CA0W2208048`, 20-digit references) that collide with other carriers and get reused across shipments. `glsus` sets `matches: () => false` and has no `mayMatch`, so you must always pass **`?carrier=glsus`** (or `carrier: "glsus"` in MCP). ### 4. Alphanumeric 12- and 16-character codes: AxleHire (Jitsu) vs prefixed carriers [AxleHire (Jitsu)](https://docs.lastscanned.com/carriers/axlehire) issues 12- and 16-character alphanumeric codes (e.g. `4AUMF4FWVRB5`, `BQH4FN5QAQYV3SDQ`) as well as `SCD` + 16-character shipper numbers. To prevent AxleHire from swallowing prefixed carrier numbers like `VH` + 12 (`veho`), `BTP` + 12 (`bettertrucks`), `CR` + 12 (`cirro`), `QSS` + 9 (`sendle`), or `AHOY` + 8 (`asendia`): - AxleHire only runs in **Pass 2 (`mayMatch`)**, after all Pass 1 prefix carriers have been checked. - AxleHire explicitly rejects pure letters-then-digits strings (`!/^[A-Z]+\d+$/i.test(n)`), requiring letters and digits to be interleaved (which also leaves 3-letters-then-9-digits cleanly to [Purolator](https://docs.lastscanned.com/carriers/purolator)). ### 5. Partner & white-label numbers (`?carrier=` overrides) Pass `?carrier=` when tracking any of the following partner or shipper-assigned formats: - **[GLS US](https://docs.lastscanned.com/carriers/glsus)**: All GLS US / GSO numbers (`?carrier=glsus`). - **[Purolator](https://docs.lastscanned.com/carriers/purolator)**: 12-digit all-numeric PINs (`?carrier=purolator`). - **[OSM Worldwide](https://docs.lastscanned.com/carriers/osm) & [Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes)**: `92…` / `420+ZIP+92…` USPS IMpb barcodes when querying middle-mile sort scans (`?carrier=osm` or `?carrier=pitneybowes`). - **[Asendia](https://docs.lastscanned.com/carriers/asendia)**: `AS…US` numbers, USPS domestic induction labels, and destination postal numbers (`?carrier=asendia`). - **[UniUni](https://docs.lastscanned.com/carriers/uniuni)**: Partner numbers starting `GV…` or `JY…` (`?carrier=uniuni`). - **[GOFO Express](https://docs.lastscanned.com/carriers/gofo)**: Shipper numbers starting `CR…` or `YT…` (`?carrier=gofo`). - **[Cirro](https://docs.lastscanned.com/carriers/cirro)**: Parcels delivered by GOFO under a `GFUS…` barcode auto-detect as `gofo`; pass `?carrier=cirro` to query Cirro directly, or for `SKP…` shipper numbers. - **[OnTrac](https://docs.lastscanned.com/carriers/ontrac), [Veho](https://docs.lastscanned.com/carriers/veho), [CDL](https://docs.lastscanned.com/carriers/cdl), [TForce Final Mile](https://docs.lastscanned.com/carriers/tforce)**: Shipper-assigned reference numbers outside the standard barcode formats above. --- ## Cross-border handoffs (`yanwen`, `4px`, `cainiao`, `yunexpress`, `cne`, `sunyou`, `ubi`, `asendia`) Cross-border parcels originating in China via **[Yanwen](https://docs.lastscanned.com/carriers/yanwen)** (`…YP`, `YW…`), **[4PX](https://docs.lastscanned.com/carriers/4px)** (`4PX…CN`), **[Cainiao](https://docs.lastscanned.com/carriers/cainiao)** (`LP…`, `AP…`), **[YunExpress](https://docs.lastscanned.com/carriers/yunexpress)** (`YT` + 16 digits), **[CNE Express](https://docs.lastscanned.com/carriers/cne)** (`3A5V` + 9 digits), **[SunYou](https://docs.lastscanned.com/carriers/sunyou)** (`SY` + 2 letters + 9 digits), or **[UBI Smart Parcel](https://docs.lastscanned.com/carriers/ubi)** (`AU` + 13 digits)—as well as US outbound parcels via **[Asendia](https://docs.lastscanned.com/carriers/asendia)** (`AHOY` + 8 chars)—are handed over to a destination carrier (such as **[USPS](https://docs.lastscanned.com/carriers/usps)**, **[UniUni](https://docs.lastscanned.com/carriers/uniuni)**, **[GOFO](https://docs.lastscanned.com/carriers/gofo)**, **[SpeedX](https://docs.lastscanned.com/carriers/speedx)**, **[OnTrac](https://docs.lastscanned.com/carriers/ontrac)**, **[Canada Post](https://docs.lastscanned.com/carriers/canadapost)**, **[Intelcom / Dragonfly](https://docs.lastscanned.com/carriers/intelcom)**, **Australia Post**, or **Royal Mail**) after clearing customs. When you query the origin cross-border number, `lastscanned` returns the full scan timeline and populates the top-level `message` field with the destination carrier and secondary tracking number as soon as the handoff occurs: ```json { "carrier": "yunexpress", "trackingNumber": "YT2628500703004876", "status": "in_transit", "statusDescription": "Arrived at destination airport", "message": "Handed to UniUni as UUS5BM1269395824723", "events": [ ... ] } ``` You can also query the domestic last-mile tracking number (`UUS5BM1269395824723`, `SPX…`, `INTLCM…`, `7012345678901230`, `GFUS…`, or `420…92…`) directly with `GET /v1/track/:number` to inspect the local delivery scans. --- ## Skip maintaining regexes and fighting carrier 403s in your own app When you query UPS, FedEx, USPS, DHL, OnTrac, Veho, Canada Post, Purolator, or Sendle directly from a serverless or edge backend (Cloudflare Workers, Vercel, AWS Lambda, Next.js), datacenter requests run straight into Akamai Bot Manager `403`/`428` blocks, Cloudflare Turnstile challenges, Veho Firebase App Check token gates, Sendle SHA-256 proof-of-work challenges, or enterprise OAuth / shipper contract portals. Instead of maintaining carrier regex tables, check-digit validators, per-carrier OAuth credentials, and a separate response parser per carrier in your own codebase, send the raw tracking number to `GET /v1/track/:number` in one `fetch()`: ```ts const res = await fetch(`https://api.lastscanned.com/v1/track/${encodeURIComponent(number)}`, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_KEY}` }, }); const data = await res.json(); // data.carrier is normalized ("ups" | "usps" | "fedex" | ...), and data.status is one of 7 standard states. ``` # Consolidator & Cross-Border Handoffs URL: https://docs.lastscanned.com/handoffs Over 40% of e-commerce parcels—and nearly 100% of economy cross-border orders—change physical hands between an **origin consolidator** and a **final-mile carrier**. When you query only the final-mile carrier, your tracking UI shows *"Shipping Label Created, USPS Currently Awaiting Package"* or *"We're expecting your parcel"* for 3 to 10 days while the parcel is actively moving through middle-mile sort hubs. `lastscanned` lets you query both the consolidator and the final-mile carrier synchronously via `GET /v1/track/{number}?carrier={slug}`. ## Domestic USPS Consolidator Handoffs (`926129…` / `927489…` / `93…`) USPS Electronic Verification System (eVS) and IMpb barcodes beginning with `92` (`92001…`, `926129…`, `927489…`) or `93` are shared barcodes. Because `usps` is checked first in auto-detection order, pass `?carrier=` to query the middle-mile consolidator directly during transit: | Handoff Route | Consolidator Override | Final-Mile Query | Interactive Guide | | --- | --- | --- | --- | | **OSM Worldwide → USPS** | `?carrier=osm` | `?carrier=usps` | [`/handoff/osm-to-usps`](https://lastscanned.com/handoff/osm-to-usps) | | **Pitney Bowes → USPS** | `?carrier=pitneybowes` | `?carrier=usps` | [`/handoff/pitneybowes-to-usps`](https://lastscanned.com/handoff/pitneybowes-to-usps) | | **DHL eCommerce → USPS** | `?carrier=dhlecommerce` (`GM…` / `926129…` / `93…`) | `?carrier=usps` | [`/handoff/dhlecommerce-to-usps`](https://lastscanned.com/handoff/dhlecommerce-to-usps) | | **UPS Mail Innovations → USPS** | `?carrier=ups` (`MI…` / `927489…`) | `?carrier=usps` | No guide yet | | **FedEx Ground Economy → USPS** | `?carrier=fedex` (`926129…` / `6129…`) | `?carrier=usps` | No guide yet | | **ACI Logistix → USPS** | `?carrier=aci` | `?carrier=usps` | No guide yet | | **APC Postal Logistics → USPS** | `?carrier=apc` | `?carrier=usps` | [`/handoff/apc-to-usps`](https://lastscanned.com/handoff/apc-to-usps) | | **ePost Global → USPS** | `?carrier=epostglobal` | `?carrier=usps` | [`/handoff/epostglobal-to-usps`](https://lastscanned.com/handoff/epostglobal-to-usps) | ```bash # 1. Query OSM Worldwide for live middle-mile sort scans (Glendale Heights, York, Atlanta, Las Vegas) curl "https://api.lastscanned.com/v1/track/92612903029511573030094531?carrier=osm" \ -H "Authorization: Bearer lsk_live_..." # 2. Query USPS for DDU arrival, Out for Delivery, and final mailbox delivery curl "https://api.lastscanned.com/v1/track/92612903029511573030094531?carrier=usps" \ -H "Authorization: Bearer lsk_live_..." ``` ## Cross-Border Linehaul to Regional & Postal Final Mile Cross-border logistics platforms consolidate parcels at origin, fly them across commercial air linehaul, clear customs (CBP Type 86, EU IOSS, UK HMRC, Canada CBSA), and tender them to regional or national couriers: | Origin Consolidator | Final-Mile Carrier(s) | Interactive Handoff Guide | | --- | --- | --- | | **Cainiao (`LP…` / `CNUS…` / `GFUS…`)** | USPS, UniUni, SpeedX, GOFO, PiggyShip | [`/handoff/cainiao-to-usps`](https://lastscanned.com/handoff/cainiao-to-usps) · [`/handoff/cainiao-to-uniuni`](https://lastscanned.com/handoff/cainiao-to-uniuni) · [`/handoff/cainiao-to-speedx`](https://lastscanned.com/handoff/cainiao-to-speedx) · [`/handoff/cainiao-to-gofo`](https://lastscanned.com/handoff/cainiao-to-gofo) | | **Cainiao (`LP…` / `CNFR…`)** | La Poste / Colissimo (`laposte`), bpost (`bpost`) | [`/handoff/cainiao-to-colissimo`](https://lastscanned.com/handoff/cainiao-to-colissimo) · [`/handoff/cainiao-to-bpost`](https://lastscanned.com/handoff/cainiao-to-bpost) | | **YunExpress (`YT…`)** | USPS, UniUni, SpeedX, GOFO, OnTrac, Evri (`evri`) | [`/handoff/yunexpress-to-usps`](https://lastscanned.com/handoff/yunexpress-to-usps) · [`/handoff/yunexpress-to-uniuni`](https://lastscanned.com/handoff/yunexpress-to-uniuni) · [`/handoff/yunexpress-to-speedx`](https://lastscanned.com/handoff/yunexpress-to-speedx) · [`/handoff/yunexpress-to-evri`](https://lastscanned.com/handoff/yunexpress-to-evri) | | **Yanwen (`UJ…YP` / `VR…YP`)** | USPS, UniUni, SpeedX, PostNL (`postnl`) | [`/handoff/yanwen-to-usps`](https://lastscanned.com/handoff/yanwen-to-usps) · [`/handoff/yanwen-to-postnl`](https://lastscanned.com/handoff/yanwen-to-postnl) | | **4PX (`4PX…`)** | USPS, SpeedX, UniUni, Royal Mail | [`/handoff/4px-to-usps`](https://lastscanned.com/handoff/4px-to-usps) · [`/handoff/4px-to-uniuni`](https://lastscanned.com/handoff/4px-to-uniuni) | | **CNE Express (`3A5V…`)** | USPS, SpeedX (`SPX…`) | [`/handoff/cne-to-usps`](https://lastscanned.com/handoff/cne-to-usps) | | **Landmark Global (`LTN…N1`)** | Canada Post (`canadapost`), Dragonfly (`intelcom`), bpost (`bpost`), Evri (`evri`) | [`/handoff/landmark-to-canadapost`](https://lastscanned.com/handoff/landmark-to-canadapost) · [`/handoff/landmark-to-bpost`](https://lastscanned.com/handoff/landmark-to-bpost) | | **Passport Shipping (`PSP…`)** | Canada Post (`canadapost`), Intelcom/Dragonfly (`intelcom`) | [`/handoff/passport-to-canadapost`](https://lastscanned.com/handoff/passport-to-canadapost) | | **Chit Chats (`CC…` / `94…`)** | Canada Post (`canadapost`), USPS (`usps`), Dragonfly | [`/handoff/chitchats-to-canadapost`](https://lastscanned.com/handoff/chitchats-to-canadapost) | | **Equick China (`EQK…`)** | Royal Mail, Evri (`evri`), DPD UK (`dpduk`) | [`/handoff/equick-to-royalmail`](https://lastscanned.com/handoff/equick-to-royalmail) | | **YDH Express (`YDH…` / `6A…`)** | La Poste Colissimo (`laposte`), Chronopost (`chronopost`) | [`/handoff/ydh-to-colissimo`](https://lastscanned.com/handoff/ydh-to-colissimo) | | **TopYou (`TY…` / `ZY…`)** | USPS (`usps`), UniUni (`uniuni`), SpeedX (`speedx`) | [`/handoff/topyou-to-usps`](https://lastscanned.com/handoff/topyou-to-usps) | | **DHLink / DHgate (`92…` / S10)** | USPS (`usps`), Yanwen (`yanwen`), 4PX (`4px`) | [`/handoff/dhlink-to-usps`](https://lastscanned.com/handoff/dhlink-to-usps) | | **SFC (SendFromChina) (`SFCAA…`)** | USPS, UniUni, SpeedX | [`/handoff/sfc-to-usps`](https://lastscanned.com/handoff/sfc-to-usps) | | **Anjun Logistics (`AJ…`)** | Correios, LatAm & US final mile | [`/handoff/anjun-to-correios`](https://lastscanned.com/handoff/anjun-to-correios) | | **Winit (`WO…` / `ID…`)** | USPS, Royal Mail, DHL | [`/handoff/winit-to-usps`](https://lastscanned.com/handoff/winit-to-usps) | | **Meest (`CV…US` / `MGR…`)** | Nova Poshta (`novaposhta`), Meest Express | [`/handoff/meest-to-novaposhta`](https://lastscanned.com/handoff/meest-to-novaposhta) | | **Chronopost (`XY…FR`)** | DPD UK (`dpduk`), DPD (`dpd`), SEUR (`seur`) | [`/handoff/chronopost-to-dpd`](https://lastscanned.com/handoff/chronopost-to-dpd) | | **Bring / Posten Norge (`3707…`)** | PostNord (`postnord`), Posti (`posti`) | [`/handoff/bring-to-postnord`](https://lastscanned.com/handoff/bring-to-postnord) | | **Yurtiçi Kargo (12-digit)** | DHL (`dhl`), European express partners | [`/handoff/yurtici-to-dhl`](https://lastscanned.com/handoff/yurtici-to-dhl) | | **STO / YTO / ZTO / Yunda (Tongda Hub)** | USPS (`usps`), Cainiao, Regional Couriers | [`/handoff/sto-to-usps`](https://lastscanned.com/handoff/sto-to-usps) · [`/handoff/yto-to-usps`](https://lastscanned.com/handoff/yto-to-usps) · [`/handoff/zto-to-usps`](https://lastscanned.com/handoff/zto-to-usps) · [`/handoff/yunda-to-usps`](https://lastscanned.com/handoff/yunda-to-usps) | | **SunYou / Huahan / ESHUN** | USPS (`usps`), Postal Last-Mile | [`/handoff/sunyou-to-usps`](https://lastscanned.com/handoff/sunyou-to-usps) · [`/handoff/huahan-to-usps`](https://lastscanned.com/handoff/huahan-to-usps) · [`/handoff/eshun-to-usps`](https://lastscanned.com/handoff/eshun-to-usps) | | **Wanb Express / Flyt Express (`WB…` / `H00…`)** | Royal Mail (`royalmail`), Evri (`evri`) | [`/handoff/wanbexpress-to-royalmail`](https://lastscanned.com/handoff/wanbexpress-to-royalmail) · [`/handoff/flyt-to-royalmail`](https://lastscanned.com/handoff/flyt-to-royalmail) | | **Chukou1 / Wise Express** | USPS Ground Advantage (`usps`) | [`/handoff/chukou1-to-usps`](https://lastscanned.com/handoff/chukou1-to-usps) · [`/handoff/wise-to-usps`](https://lastscanned.com/handoff/wise-to-usps) | | **Cainiao / Ruston Eastern Europe** | Nova Poshta (`novaposhta`), Meest (`meest`), Ukrposhta (`ukrposhta`) | [`/handoff/ruston-to-novaposhta`](https://lastscanned.com/handoff/ruston-to-novaposhta) | | **Orange Connex SpeedPAK (`ESUS…` / `ESGB…`)** | USPS (`usps`), Royal Mail (`royalmail`), Evri (`evri`) | [`/handoff/speedpak-to-usps`](https://lastscanned.com/handoff/speedpak-to-usps) · [`/handoff/speedpak-to-royalmail`](https://lastscanned.com/handoff/speedpak-to-royalmail) | | **CNE / 4PX / Cainiao UK & EU Direct Line** | Evri (`evri`), La Poste Colissimo (`laposte`), DHL Paket (`dhl`) | [`/handoff/cne-to-evri`](https://lastscanned.com/handoff/cne-to-evri) · [`/handoff/cne-to-colissimo`](https://lastscanned.com/handoff/cne-to-colissimo) · [`/handoff/4px-to-evri`](https://lastscanned.com/handoff/4px-to-evri) · [`/handoff/cainiao-to-evri`](https://lastscanned.com/handoff/cainiao-to-evri) · [`/handoff/yunexpress-to-dhl-de`](https://lastscanned.com/handoff/yunexpress-to-dhl-de) | | **Spring GDS / Stallion Express / UBI / ECMS** | USPS (`usps`), Royal Mail (`royalmail`), Canada Post (`canadapost`) | [`/handoff/spring-gds-to-usps`](https://lastscanned.com/handoff/spring-gds-to-usps) · [`/handoff/spring-gds-to-royalmail`](https://lastscanned.com/handoff/spring-gds-to-royalmail) · [`/handoff/stallion-to-usps`](https://lastscanned.com/handoff/stallion-to-usps) · [`/handoff/stallion-to-canadapost`](https://lastscanned.com/handoff/stallion-to-canadapost) · [`/handoff/ecms-to-usps`](https://lastscanned.com/handoff/ecms-to-usps) · [`/handoff/ubx-to-royalmail`](https://lastscanned.com/handoff/ubx-to-royalmail) | | **EcoScooting / Shopee SPX Express** | Correos (`correos`), Correos Express (`correosexpress`), Ninja Van (`ninjavan`) | [`/handoff/ecoscooting-to-correos`](https://lastscanned.com/handoff/ecoscooting-to-correos) · [`/handoff/spx-to-ninjavan`](https://lastscanned.com/handoff/spx-to-ninjavan) | Browse all 245 handoff routes and test live barcodes at [`https://lastscanned.com/handoff`](https://lastscanned.com/handoff). | [Winit → La Poste / Colissimo](https://lastscanned.com/handoff/winit-to-colissimo) | `winit` → `laposte` | `ID18049201CN` → `6A19384729104` | EU customs clearance & Colissimo hub injection (Roissy / Cergy) | | [Winit → PostNL](https://lastscanned.com/handoff/winit-to-postnl) | `winit` → `postnl` | `ID18049202CN` → `3SWIN8492018492` | Schiphol / Liège linehaul clearance & PostNL sorting injection | | [Winit → bpost](https://lastscanned.com/handoff/winit-to-bpost) | `winit` → `bpost` | `ID18049203CN` → `323294820194820194820194` | Liège Airport (LGG) customs release & bpost Brussels sorting | | [Winit → Correos](https://lastscanned.com/handoff/winit-to-correos) | `winit` → `correos` | `ID18049204CN` → `PQ4F830492819200128001P` | Madrid Barajas customs clearance & Correos CTA tender | | [Winit → Poste Italiane](https://lastscanned.com/handoff/winit-to-posteitaliane) | `winit` → `posteitaliane` | `ID18049205CN` → `5P39482019482` | Milan Malpensa / Bologna hub injection to Poste Italiane Crono | | [SFC (SendFromChina) → bpost](https://lastscanned.com/handoff/sfc-to-bpost) | `sfc` → `bpost` | `SFC8AA0394820192` → `323284920184920184920184` | Liège IOSS clearance & bpost domestic barcode assignment | | [SFC (SendFromChina) → Royal Mail](https://lastscanned.com/handoff/sfc-to-royalmail) | `sfc` → `royalmail` | `SFC8AA0394820193` → `WG849201849GB` | Heathrow linehaul offload & Royal Mail Tracked 48 hub scan | | [SFC (SendFromChina) → Canada Post](https://lastscanned.com/handoff/sfc-to-canadapost) | `sfc` → `canadapost` | `SFC8AA0394820194` → `7321948201948201` | CBSA Vancouver / Mississauga release & Canada Post induction | | [SFC (SendFromChina) → Australia Post](https://lastscanned.com/handoff/sfc-to-auspost) | `sfc` → `auspost` | `SFC8AA0394820195` → `33XHG84920184901000930902` | Sydney / Melbourne gateway clearance & Australia Post eParcel induction | | [SFC (SendFromChina) → DHL Paket (Germany)](https://lastscanned.com/handoff/sfc-to-dhl-de) | `sfc` → `dhl` | `SFC8AA0394820196` → `00340434291849201849` | Frankfurt / Liège customs clearance & DHL Paketzentrum scan | | [SFC (SendFromChina) → La Poste / Colissimo](https://lastscanned.com/handoff/sfc-to-colissimo) | `sfc` → `laposte` | `SFC8AA0394820197` → `6A20491829401` | Roissy CDG clearance & Colissimo domestic parcel induction | | [SFC (SendFromChina) → PostNL](https://lastscanned.com/handoff/sfc-to-postnl) | `sfc` → `postnl` | `SFC8AA0394820198` → `3SSFC9482019482` | Amsterdam Schiphol linehaul offload & PostNL parcel sorting | | [Anjun Express → Correios (Brazil)](https://lastscanned.com/handoff/anjun-to-correios-br) | `anjun` → `correios` | `AJ482910492CN` → `NM849201849BR` | Curitiba / São Paulo Remessa Conforme clearance & Correios Packet Standard tender | | [Anjun Express → USPS](https://lastscanned.com/handoff/anjun-to-usps) | `anjun` → `usps` | `AJ482910493CN` → `9261290312839401928374` | JFK / LAX CBP Type 86 release & USPS Ground Advantage induction | | [Wanb Express → La Poste / Colissimo](https://lastscanned.com/handoff/wanbexpress-to-colissimo) | `wanbexpress` → `laposte` | `WNB8492018492YQ` → `6A30491829405` | Liège / Roissy IOSS customs clearance & Colissimo hub induction | # Quickstart URL: https://docs.lastscanned.com ## 1. Get an API key Sign in at [app.lastscanned.com](https://app.lastscanned.com) and create a key under **API keys**. It looks like `lsk_live_…` and is shown once. ```bash export LASTSCANNED_KEY=lsk_live_… ``` ## 2. Track a number ```bash tab="curl" curl https://api.lastscanned.com/v1/track/1Z54V8630394427740 \ -H "Authorization: Bearer $LASTSCANNED_KEY" ``` ```js tab="JavaScript" const res = await fetch("https://api.lastscanned.com/v1/track/1Z54V8630394427740", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_KEY}` }, }); const tracking = await res.json(); ``` ```python tab="Python" import os, requests res = requests.get( "https://api.lastscanned.com/v1/track/1Z54V8630394427740", headers={"Authorization": f"Bearer {os.environ['LASTSCANNED_KEY']}"}, ) tracking = res.json() ``` The carrier is detected from the number. No carrier field is needed. Shipping container numbers work the same way: see [Container tracking](https://docs.lastscanned.com/container-tracking-api). ## 3. Read the response ```json { "carrier": "ups", "trackingNumber": "1Z54V8630394427740", "status": "delivered", "statusDescription": "Delivered", "service": "UPS Ground", "deliveredAt": "2026-08-07T21:17:14Z", "deliveredAtLocal": "2026-08-07T16:17:00", "signedBy": null, "destination": { "city": "AUSTIN", "state": "TX", "country": "US" }, "estimatedDelivery": "2026-08-07", "estimatedDeliveryAt": null, "events": [ { "timestamp": "2026-08-07T21:17:14Z", "localTime": "2026-08-07T16:17:00", "status": "delivered", "description": "DELIVERED", "location": "AUSTIN, TX, US", "code": "FS" }, { "timestamp": "2026-08-07T13:02:41Z", "localTime": "2026-08-07T08:02:00", "status": "out_for_delivery", "description": "Out For Delivery Today", "location": "AUSTIN, TX, US", "code": "OT" } ] } ``` Every carrier returns this shape. `status` is one of `label_created`, `in_transit`, `out_for_delivery`, `delivered`, `exception`, `returned`, `unknown`. `events` are newest first. Field details are in [Tracking](https://docs.lastscanned.com/tracking). ## Next - Several numbers in one call: [Tracking](https://docs.lastscanned.com/tracking#several-numbers) - Watch numbers and get webhook updates (in the [Dashboard](https://app.lastscanned.com/watches) or via API): [Watches and webhooks](https://docs.lastscanned.com/webhooks). Eligible Pro accounts can also opt in to [shipment email](https://docs.lastscanned.com/webhooks#shipment-email) at their verified account address. That email is separate from webhooks. - Give an AI agent package tracking: [MCP](https://docs.lastscanned.com/mcp) # International Postal & Regional Parcel Tracking API: Canada, UK, Europe, Japan, Korea, SEA, Australia & India URL: https://docs.lastscanned.com/international-postal-and-regional-parcel-tracking-api-canada-uk-eu-apac Global e-commerce brands, cross-border marketplaces, and international 3PLs need reliable package tracking beyond US domestic carriers. Whether you are shipping domestic parcels inside **Canada**, **the UK**, **the European Union**, **Japan**, **South Korea**, **Southeast Asia**, **Australia/New Zealand**, or **India**, **[lastscanned](https://lastscanned.com)** normalizes **549 carriers worldwide** into one deterministic JSON schema. Every carrier below works out of the box with synchronous `GET https://api.lastscanned.com/v1/track/{number}`, batch `GET /v1/track?numbers=...`, no-code **[Web UI Dashboard Watches (`app.lastscanned.com/watches`)](https://app.lastscanned.com/watches)**, push **[Webhooks (`POST /v1/watches`)](https://docs.lastscanned.com/webhooks)**, and our **[Remote MCP Server (`https://mcp.lastscanned.com/mcp`)](https://docs.lastscanned.com/mcp)**. --- ## 1. Canada Postal, Regional & Cross-Border Carriers Canadian e-commerce relies heavily on alternative last-mile couriers (`Intelcom / Dragonfly`, `Straightship`, `FleetOptics`, `Nationex`) alongside national networks (`Canada Post`, `Purolator`, `Canpar`, `Loomis`, `GLS Canada`) and cross-border consolidators (`Chit Chats`, `Stallion Express`): | Carrier | Slug (`?carrier=`) | Verified Example Tracking Number | Coverage & Handoff Notes | Live Lookup | |---|---|---|---|---| | **[Canada Post](https://docs.lastscanned.com/carriers/canadapost)** | `canadapost` | `4007854296017911` · `2010505799436494` | 16-digit domestic pins and 13-character S10 international barcodes (`…CA`). | [Track Canada Post](https://lastscanned.com/lookup/canadapost) | | **[Purolator](https://docs.lastscanned.com/carriers/purolator)** | `purolator` | `335681489381` · `520769802262` | 12-digit express and ground PINs across all Canadian provinces. | [Track Purolator](https://lastscanned.com/lookup/purolator) | | **[Intelcom / Dragonfly](https://docs.lastscanned.com/carriers/intelcom)** | `intelcom` | `INTLCMI719662704` | `INTLCM…` last-mile e-commerce delivery across Canada (and Dragonfly in Australia/NL). | [Track Intelcom](https://lastscanned.com/lookup/intelcom) | | **[Canpar Express](https://docs.lastscanned.com/carriers/canpar)** | `canpar` | `D426932100090013` | `D` + 15-digit Canadian commercial and residential ground barcodes. | [Track Canpar](https://lastscanned.com/lookup/canpar) | | **[Loomis Express](https://docs.lastscanned.com/carriers/loomis)** | `loomis` | `NET78458182` | TransForce domestic Canadian express and ground waybills. | [Track Loomis](https://lastscanned.com/lookup/loomis) | | **[GLS Canada (Dicom)](https://docs.lastscanned.com/carriers/glscanada)** | `glscanada` | `W482910473` | Quebec, Ontario, and pan-Canadian parcel and freight tracking. | [Track GLS Canada](https://lastscanned.com/lookup/glscanada) | | **[Nationex](https://docs.lastscanned.com/carriers/nationex)** | `nationex` | `518908681` | High-density Eastern & Central Canada D2C parcel delivery (`?carrier=nationex`). | [Track Nationex](https://lastscanned.com/lookup/nationex) | | **[Chit Chats](https://docs.lastscanned.com/carriers/chitchats)** | `chitchats` | `P4T2E74S5N` · `Q2V8S8T67B` | Canadian cross-border & domestic consolidator (`USPS`, `Canada Post`, `Intelcom`, `Asendia` handoffs). | [Track Chit Chats](https://lastscanned.com/lookup/chitchats) | | **[Stallion Express](https://docs.lastscanned.com/carriers/stallionexpress)** | `stallionexpress` | `220602XMJ8` · `240915P11U` | Canadian cross-border & domestic e-commerce consolidator (`USPS`, `APC`, `PostNL`, `FleetOptics`, `UniUni`). | [Track Stallion Express](https://lastscanned.com/lookup/stallionexpress) | | **[Straightship](https://docs.lastscanned.com/carriers/straightship)** | `straightship` | `STRTD876741840` · `STRTD917564850` | `STRT…` last-mile Canadian e-commerce courier for cross-border marketplaces. | [Track Straightship](https://lastscanned.com/lookup/straightship) | | **[FleetOptics](https://docs.lastscanned.com/carriers/fleetoptics)** | `fleetoptics` | `FCLR000000169086` | `FCLR…` regional Canadian D2C final-mile parcel delivery. | [Track FleetOptics](https://lastscanned.com/lookup/fleetoptics) | --- ## 2. United Kingdom & European Parcel Networks Track UK and EU national posts, locker networks, and pan-European road parcel couriers through a single normalized API: | Carrier | Slug (`?carrier=`) | Verified Example Tracking Number | Country / Network Coverage | Live Lookup | |---|---|---|---|---| | **[Evri (Hermes UK)](https://docs.lastscanned.com/carriers/evri)** | `evri` | `H0742A0312973872` · `H0067A0010539535` | UK domestic home delivery & ParcelShop network (`H…` 16-char barcodes). | [Track Evri](https://lastscanned.com/lookup/evri) | | **[DPD UK](https://docs.lastscanned.com/carriers/dpduk)** | `dpduk` | `15500203196851` · `15504366056765` | UK 14-digit next-day and predict-window parcel tracking (`?carrier=dpduk`). | [Track DPD UK](https://lastscanned.com/lookup/dpduk) | | **[DHL eCommerce UK](https://docs.lastscanned.com/carriers/dhlecommerceuk)** | `dhlecommerceuk` | `60120261600869` | UK domestic and cross-border e-commerce parcel network. | [Track DHL eCommerce UK](https://lastscanned.com/lookup/dhlecommerceuk) | | **[InPost](https://docs.lastscanned.com/carriers/inpost)** | `inpost` | `634318272630387021276773` | 24-digit automated parcel locker (APM) & courier delivery across Poland, UK, France, Italy & Spain. | [Track InPost](https://lastscanned.com/lookup/inpost) | | **[La Poste / Colissimo](https://docs.lastscanned.com/carriers/laposte)** | `laposte` | `5N30053962734` | French national postal network, Colissimo domestic, and Delivengo international. | [Track La Poste](https://lastscanned.com/lookup/laposte) | | **[Chronopost](https://docs.lastscanned.com/carriers/chronopost)** | `chronopost` | `PZ282567966EE` | French and European express parcel and pickup-point delivery. | [Track Chronopost](https://lastscanned.com/lookup/chronopost) | | **[PostNL](https://docs.lastscanned.com/carriers/postnl)** | `postnl` | `3STBDG061270842` | `3S…` Benelux domestic parcels and Spring/PostNL international mail. | [Track PostNL](https://lastscanned.com/lookup/postnl) | | **[bpost (Belgium Post)](https://docs.lastscanned.com/carriers/bpost)** | `bpost` | `323299903171288510995037` | `3232…` Belgian domestic and Landmark/bpost international parcels. | [Track bpost](https://lastscanned.com/lookup/bpost) | | **[Correos (Spain)](https://docs.lastscanned.com/carriers/correos)** | `correos` | `PQ7FVR0710542890128002P` | Spanish national postal and Paq Estándar / Paq Premium e-commerce network. | [Track Correos](https://lastscanned.com/lookup/correos) | | **[Poste Italiane / SDA](https://docs.lastscanned.com/carriers/posteitaliane)** | `posteitaliane` | `2IMA0051035900` | Italian national postal and Crono / SDA express courier network. | [Track Poste Italiane](https://lastscanned.com/lookup/posteitaliane) | | **[BRT (Bartolini)](https://docs.lastscanned.com/carriers/brt)** | `brt` | `009010235887` · `062270125163` | 12-digit Italian express parcel and pallet courier (`?carrier=brt`). | [Track BRT](https://lastscanned.com/lookup/brt) | | **[GLS Europe](https://docs.lastscanned.com/carriers/gls)** | `gls` | `10272483975` | Pan-European road parcel network across Germany, Italy, Spain, France, and Central Europe. | [Track GLS](https://lastscanned.com/lookup/gls) | | **[Hermes Germany](https://docs.lastscanned.com/carriers/hermesde)** | `hermesde` | `H1028030626845901017` | German domestic home & PaketShop delivery. | [Track Hermes DE](https://lastscanned.com/lookup/hermesde) | | **[PostNord](https://docs.lastscanned.com/carriers/postnord)** | `postnord` | `00573132901903503247` | Nordic postal & parcel network covering Sweden, Denmark, Norway, and Finland. | [Track PostNord](https://lastscanned.com/lookup/postnord) | | **[Packeta (Zásilkovna)](https://docs.lastscanned.com/carriers/packeta)** | `packeta` | `Z2202657636` | `Z` + 10-digit Central & Eastern European pickup point and home delivery network. | [Track Packeta](https://lastscanned.com/lookup/packeta) | | **[Omniva](https://docs.lastscanned.com/carriers/omniva)** | `omniva` | `CF104760588EE` · `LL002789060EE` | Baltic states (Estonia, Latvia, Lithuania) parcel lockers and international transit hub. | [Track Omniva](https://lastscanned.com/lookup/omniva) | | **[Nova Poshta](https://docs.lastscanned.com/carriers/novaposhta)** | `novaposhta` | `59001766134310` | 14-digit Ukraine & European Nova Post express branch and locker network. | [Track Nova Poshta](https://lastscanned.com/lookup/novaposhta) | | **[Swiss Post](https://docs.lastscanned.com/carriers/swisspost)** | `swisspost` | `996013273002019507` | 18-digit Swiss domestic and Asendia/Swiss Post international barcodes. | [Track Swiss Post](https://lastscanned.com/lookup/swisspost) | | **[Austrian Post (Österreichische Post)](https://docs.lastscanned.com/carriers/austrianpost)** | `austrianpost` | `1040906599808880244007` | 22-digit Austrian domestic and CEE parcel network. | [Track Austrian Post](https://lastscanned.com/lookup/austrianpost) | --- ## 3. Japan, South Korea, Southeast Asia, Australia/NZ & India Track major Asian, Australian, and Indian parcel networks with full Unicode/local-language description support and normalized English status codes (`origin`, `in_transit`, `out_for_delivery`, `delivered`, `exception`): | Carrier | Slug (`?carrier=`) | Verified Example Tracking Number | Region & Network Notes | Live Lookup | |---|---|---|---|---| | **[Japan Post (日本郵便)](https://docs.lastscanned.com/carriers/japanpost)** | `japanpost` | `152515917783` | Yu-Pack, Yu-Packet, Letter Pack (11–12 digits) and EMS/International S10 (`…JP`). | [Track Japan Post](https://lastscanned.com/lookup/japanpost) | | **[Yamato Transport (ヤマト運輸 / Kuroneko)](https://docs.lastscanned.com/carriers/yamato)** | `yamato` | `491015012796` | 12-digit TA-Q-BIN (`宅急便`) and Nekopos (`ネコポス`) across Japan. | [Track Yamato](https://lastscanned.com/lookup/yamato) | | **[Sagawa Express (佐川急便)](https://docs.lastscanned.com/carriers/sagawa)** | `sagawa` | `501775509605` · `365729365455` | 12-digit Hikyaku Express (`飛脚宅配便`) commercial & D2C parcels across Japan. | [Track Sagawa](https://lastscanned.com/lookup/sagawa) | | **[Korea Post (우체국택배)](https://docs.lastscanned.com/carriers/koreapost)** | `koreapost` | `6097542557191` | 13-digit Korean domestic registered parcels and EMS (`…KR`). | [Track Korea Post](https://lastscanned.com/lookup/koreapost) | | **[CJ Logistics (CJ대한통운)](https://docs.lastscanned.com/carriers/cjlogistics)** | `cjlogistics` | `365140731024` | South Korea's largest domestic e-commerce and K-beauty parcel network. | [Track CJ Logistics](https://lastscanned.com/lookup/cjlogistics) | | **[Hanjin Express (한진택배)](https://docs.lastscanned.com/carriers/hanjin)** | `hanjin` | `5087654320` | 10- and 12-digit South Korean domestic parcel delivery (`?carrier=hanjin`). | [Track Hanjin](https://lastscanned.com/lookup/hanjin) | | **[Lotte Global Logistics (롯데택배)](https://docs.lastscanned.com/carriers/lotte)** | `lotte` | `243321238742` | 12-digit South Korean domestic courier network (`?carrier=lotte`). | [Track Lotte](https://lastscanned.com/lookup/lotte) | | **[SingPost (Singapore Post)](https://docs.lastscanned.com/carriers/singpost)** | `singpost` | `CZ003411963SG` | Singapore Speedpost domestic and `…SG` international registered mail. | [Track SingPost](https://lastscanned.com/lookup/singpost) | | **[Ninja Van](https://docs.lastscanned.com/carriers/ninjavan)** | `ninjavan` | `SEDMY1481550430953689088` | Southeast Asia e-commerce delivery across Singapore, Malaysia, Indonesia, Philippines, Vietnam & Thailand. | [Track Ninja Van](https://lastscanned.com/lookup/ninjavan) | | **[Flash Express](https://docs.lastscanned.com/carriers/flashexpress)** | `flashexpress` | `TH37079591XP1A` | `TH…` / `PH…` / `MY…` high-volume SEA parcel delivery. | [Track Flash Express](https://lastscanned.com/lookup/flashexpress) | | **[SPX Express (Shopee)](https://docs.lastscanned.com/carriers/spxid)** | `spxid`, `spxmy`, `spxph`, `spxth`, `spxvn`, `spxsg` | `SPXID069495685978` · `SPXMY05985179327A` · `PH2542959127193` · `TH253387116642V` · `SPXVN051474089339` | Dedicated country slugs for Shopee Xpress across Indonesia, Malaysia, Philippines, Thailand, Vietnam & Singapore. | [Track SPX ID](https://lastscanned.com/lookup/spxid) | | **[Aramex Australia / NZ (Fastway)](https://docs.lastscanned.com/carriers/aramexau)** | `aramexau` | `MP0068255613` | Australian & New Zealand regional franchise courier network. | [Track Aramex AU](https://lastscanned.com/lookup/aramexau) | | **[CouriersPlease](https://docs.lastscanned.com/carriers/couriersplease)** | `couriersplease` | `CPCQAOS0039362` | `CP…` Australian metro and regional e-commerce parcel network. | [Track CouriersPlease](https://lastscanned.com/lookup/couriersplease) | | **[Team Global Express (Toll)](https://docs.lastscanned.com/carriers/teamglobalexpress)** | `teamglobalexpress` | `218517752283` | Australian road, air, and intermodal parcel & freight network. | [Track Team Global Express](https://lastscanned.com/lookup/teamglobalexpress) | | **[Sendle](https://docs.lastscanned.com/carriers/sendle)** | `sendle` | `QSS000284255` | Australian, US, and Canadian small-business e-commerce parcel network. | [Track Sendle](https://lastscanned.com/lookup/sendle) | | **[NZ Post (New Zealand Post)](https://docs.lastscanned.com/carriers/nzpost)** | `nzpost` | `LX072774186NZ` | CourierPost and New Zealand domestic/international parcels. | [Track NZ Post](https://lastscanned.com/lookup/nzpost) | | **[Delhivery](https://docs.lastscanned.com/carriers/delhivery)** | `delhivery` | `1490821922526` | India's largest e-commerce parcel and express PTL network (`?carrier=delhivery`). | [Track Delhivery](https://lastscanned.com/lookup/delhivery) | | **[Blue Dart](https://docs.lastscanned.com/carriers/bluedart)** | `bluedart` | `36206727712` | 11-digit Indian air and ground express waybills (`?carrier=bluedart`). | [Track Blue Dart](https://lastscanned.com/lookup/bluedart) | | **[Ekart Logistics](https://docs.lastscanned.com/carriers/ekart)** | `ekart` | `MYSR1174742606` · `BSIC1064576117` | 4-letter + 10-digit pan-India e-commerce fulfillment and delivery network. | [Track Ekart](https://lastscanned.com/lookup/ekart) | --- ## Multi-Region Batch Lookup Example Query Canadian, UK, European, Japanese, and Southeast Asian shipments in a single HTTP request: ```bash curl -s "https://api.lastscanned.com/v1/track?numbers=4007854296017911,INTLCMI719662704,H0742A0312973872,501775509605,SPXID069495685978,MYSR1174742606" \ -H "Authorization: Bearer $LASTSCANNED_KEY" ``` Or paste up to 100 international tracking numbers directly into the **[Web UI Dashboard Watches (`app.lastscanned.com/watches`)](https://app.lastscanned.com/watches)** for automated background polling and **[Webhook push notifications (`app.lastscanned.com/webhooks`)](https://app.lastscanned.com/webhooks)**. --- ## Related Guides - **[Cross-Border Consolidator & Last-Mile Handoff Tracking Guide (Yanwen, 4PX, Cainiao, YunExpress)](https://docs.lastscanned.com/cross-border-last-mile-handoff-tracking-yanwen-4px-cainiao)** - **[Regional Carrier Tracking API Guide (UniUni, SpeedX, Veho, GOFO, OnTrac)](https://docs.lastscanned.com/regional-carrier-tracking-api-uniuni-speedx-veho-gofo-ontrac)** - **[Bulk Package Tracking, CSV Export & Batch API Guide](https://docs.lastscanned.com/bulk-package-tracking-csv-and-batch-api)** - **[All 549 Supported Carriers Directory](https://docs.lastscanned.com/carriers)** # LTL Freight & Heavy Parcel Tracking API (Estes, Saia, XPO, R+L, ABF, TForce, Central Transport, FedEx Freight & More) URL: https://docs.lastscanned.com/ltl-freight-and-heavy-parcel-tracking-api Wholesale distributors, industrial suppliers, commercial furniture brands, and B2B ERP/TMS teams rarely ship on parcel networks alone. Once a shipment exceeds UPS or FedEx's **150 lb / 108" length / 165" length+girth** parcel limits (where UPS levies a **$1,875 Over Maximum Limits penalty**—see our **[2026 Carrier Surcharges & Rate Guide](https://docs.lastscanned.com/shipping-rates-and-surcharges-2026)**), orders move on **Less-Than-Truckload (LTL)** and global freight networks. Traditionally, tracking LTL PRO numbers across regional and national freight lines meant either logging into 15 separate carrier web portals or paying five-figure annual enterprise contracts for legacy TMS visibility platforms (project44, FourKites). **[lastscanned](https://lastscanned.com)** unifies **18+ LTL, pallet, and freight carriers** alongside **520+ parcel and postal carriers** in a single normalized JSON schema—accessible via synchronous `GET /v1/track/:proNumber`, batch `GET /v1/track?numbers=...`, the no-code **[Web UI Dashboard (`app.lastscanned.com/watches`)](https://app.lastscanned.com/watches)**, push **[Webhooks (`POST /v1/watches`)](https://docs.lastscanned.com/webhooks)**, and our **[Remote MCP Server (`https://mcp.lastscanned.com/mcp`)](https://docs.lastscanned.com/mcp)**. --- ## Supported LTL & Freight Carriers Matrix Every PRO number and freight bill below comes from real recorded carrier fixtures supported by `GET https://api.lastscanned.com/v1/track/{trackingNumber}`: | Carrier | Slug (`?carrier=`) | PRO / Waybill Format | Verified Example PRO / Tracking Number | Live Web Lookup | |---|---|---|---|---| | **[Estes Express Lines](https://docs.lastscanned.com/carriers/estes)** | `estes` | 10-digit PRO number (`?carrier=estes` recommended on generic 10-digit PROs) | `0550000000` · `0570000000` | [Track Estes](https://lastscanned.com/lookup/estes) | | **[Saia LTL Freight](https://docs.lastscanned.com/carriers/saia)** | `saia` | 11-digit PRO number | `77136436530` · `10912208530` | [Track Saia](https://lastscanned.com/lookup/saia) | | **[XPO LTL](https://docs.lastscanned.com/carriers/xpoltl)** | `xpoltl` | 9-digit PRO number (`?carrier=xpoltl`) | `817817302` · `311181345` | [Track XPO LTL](https://lastscanned.com/lookup/xpoltl) | | **[R+L Carriers](https://docs.lastscanned.com/carriers/rlcarriers)** | `rlcarriers` | 9-digit PRO or `2 letters + digits` (`AM363452-4`) | `410603085` · `AM363452-4` | [Track R+L](https://lastscanned.com/lookup/rlcarriers) | | **[ABF Freight (ArcBest)](https://docs.lastscanned.com/carriers/abffreight)** | `abffreight` | 9-digit PRO number (`?carrier=abffreight`) | `075989007` · `243630400` | [Track ABF](https://lastscanned.com/lookup/abffreight) | | **[TForce Freight](https://docs.lastscanned.com/carriers/tforce)** | `tforce` | `TF` + 9 digits or 9-digit PRO (`?carrier=tforce`) | `TF400357711` | [Track TForce](https://lastscanned.com/lookup/tforce) | | **[FedEx Freight](https://docs.lastscanned.com/carriers/fedexfreight)** | `fedexfreight` | 10-digit PRO number (`?carrier=fedexfreight`) | `0585862594` | [Track FedEx Freight](https://lastscanned.com/lookup/fedexfreight) | | **[Central Transport](https://docs.lastscanned.com/carriers/centraltransport)** | `centraltransport` | 9–11 digit PRO number (`?carrier=centraltransport`) | `301628376` · `15024547208` | [Track Central Transport](https://lastscanned.com/lookup/centraltransport) | | **[Dayton Freight](https://docs.lastscanned.com/carriers/daytonfreight)** | `daytonfreight` | 8-digit PRO number (`?carrier=daytonfreight`) | `31981912` · `33187281` | [Track Dayton Freight](https://lastscanned.com/lookup/daytonfreight) | | **[Pitt Ohio](https://docs.lastscanned.com/carriers/pittohio)** | `pittohio` | 10-digit PRO number (`?carrier=pittohio`) | `5055500004` · `5056500002` | [Track Pitt Ohio](https://lastscanned.com/lookup/pittohio) | | **[Southeastern Freight Lines (SEFL)](https://docs.lastscanned.com/carriers/southeasternfreightlines)** | `southeasternfreightlines` | 9-digit PRO number (`?carrier=southeasternfreightlines`) | `396824668` | [Track SEFL](https://lastscanned.com/lookup/southeasternfreightlines) | | **[Roadrunner Freight](https://docs.lastscanned.com/carriers/roadrunner)** | `roadrunner` | 9-digit PRO number (`?carrier=roadrunner`) | `449894385` · `457573699` | [Track Roadrunner](https://lastscanned.com/lookup/roadrunner) | | **[Forward Air](https://docs.lastscanned.com/carriers/forwardair)** | `forwardair` | 8-digit PRO / airwaybill (`?carrier=forwardair`) | `82092249` · `82094963` | [Track Forward Air](https://lastscanned.com/lookup/forwardair) | | **[Day & Ross](https://docs.lastscanned.com/carriers/dayross)** | `dayross` | `1 letter + 8 digits` (`A09555311`) | `A09555311` · `A09555312` | [Track Day & Ross](https://lastscanned.com/lookup/dayross) | | **[CEVA Logistics](https://docs.lastscanned.com/carriers/cevalogistics)** | `cevalogistics` | Alphanumeric house bill (`OV…`, `WZ…`) | `OV91069550` · `WZ1855623` | [Track CEVA](https://lastscanned.com/lookup/cevalogistics) | | **[DSV](https://docs.lastscanned.com/carriers/dsv)** | `dsv` | Alphanumeric shipment ID (`HKG1132478`) | `HKG1132478` | [Track DSV](https://lastscanned.com/lookup/dsv) | | **[Kuehne+Nagel](https://docs.lastscanned.com/carriers/kuehnenagel)** | `kuehnenagel` | Alphanumeric waybill (`RWM009228162`) | `RWM009228162` · `RWM009229981` | [Track Kuehne+Nagel](https://lastscanned.com/lookup/kuehnenagel) | | **[Mainfreight](https://docs.lastscanned.com/carriers/mainfreight)** | `mainfreight` | Alphanumeric consignment (`S03645401`) | `S03645401` | [Track Mainfreight](https://lastscanned.com/lookup/mainfreight) | --- ## 1. Important Best Practice for LTL PRO Numbers: Always Pass `?carrier=` Unlike parcel carriers that embed check digits and prefixes (`1Z…` for UPS, `92…` for USPS), many LTL freight lines issue **plain 8-, 9-, 10-, or 11-digit numeric PRO numbers** that overlap across carriers (and with 10-digit DHL Express or 12-digit FedEx numbers). When querying a numeric LTL PRO number, pass the explicit **`?carrier=`** parameter so `lastscanned` routes directly to that freight line without ambiguity: ```bash # Central Transport 9-digit PRO lookup curl -s "https://api.lastscanned.com/v1/track/301628376?carrier=centraltransport" \ -H "Authorization: Bearer $LASTSCANNED_KEY" # Saia 11-digit PRO lookup curl -s "https://api.lastscanned.com/v1/track/77136436530?carrier=saia" \ -H "Authorization: Bearer $LASTSCANNED_KEY" # XPO LTL 9-digit PRO lookup curl -s "https://api.lastscanned.com/v1/track/817817302?carrier=xpoltl" \ -H "Authorization: Bearer $LASTSCANNED_KEY" # Estes 10-digit PRO lookup curl -s "https://api.lastscanned.com/v1/track/0550000000?carrier=estes" \ -H "Authorization: Bearer $LASTSCANNED_KEY" ``` --- ## 2. Monitoring Open Pallet & LTL Shipments in the Web UI Dashboard (`app.lastscanned.com/watches`) Logistics coordinators and receiving docks don't need to write code to track inbound and outbound freight bills across multiple LTL carriers: 1. Open **[Watches (`app.lastscanned.com/watches`)](https://app.lastscanned.com/watches)** in the Web UI Dashboard. 2. Paste up to **100 PRO numbers**, select the LTL carrier (`Central Transport`, `TForce Freight`, `Estes`, `Saia`, `XPO LTL`, `ABF Freight`, `R+L Carriers`, `FedEx Freight`, `Southeastern Freight Lines`, etc.), and add a custom **label** (such as `"PO #4821 — Chicago Dock"`). 3. Each PRO number is looked up immediately and checked automatically on a schedule (`every 15 min` when `out_for_delivery`, `every 30 min` on `exception`, `every 1 hr` in transit). 4. Configure **[Webhooks (`app.lastscanned.com/webhooks`)](https://app.lastscanned.com/webhooks)** (or `POST /v1/watches` via API) to push signed status updates into your ERP, NetSuite, Acumatica, or Slack channel whenever a pallet arrives at a destination terminal, requires a delivery appointment, or is signed for at the dock. --- ## Related Guides & Tools - **[Watches and Webhooks (`app.lastscanned.com/watches` & `POST /v1/watches`)](https://docs.lastscanned.com/webhooks)** - **[2026 Carrier Surcharges & Rate Guide (AHS & $1,875 Over-Max Limits)](https://docs.lastscanned.com/shipping-rates-and-surcharges-2026)** - **[Shopify, 3PL & Custom ERP Package Tracking & Webhooks Guide](https://docs.lastscanned.com/shopify-3pl-wismo-tracking-and-webhooks)** - **[Bulk Tracking CSV & SLA Auditor](https://lastscanned.com/tools/bulk-tracking-auditor)** # MCP for AI agents URL: https://docs.lastscanned.com/mcp `https://mcp.lastscanned.com/mcp` is an MCP server (Streamable HTTP) over the same API. It signs in with your API key, or with OAuth (sign in to lastscanned and allow the app, as Claude and ChatGPT connectors do), and lookups count toward the same usage and limits as REST calls either way. It also connects with no key at all: `track_package` then gets the same one free lookup a day as the REST API, `get_rates` gets 5 free quotes a day, and `list_carriers` always works. An MPP credit key (`lsk_pack_…`, from [paying per request](https://docs.lastscanned.com/authentication#pay-per-request)) works anywhere an API key does and spends its credits. ## Set up ```bash tab="Claude Code" claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp \ --header "Authorization: Bearer lsk_live_…" ``` ```text tab="Claude" Settings → Connectors → Add custom connector Server URL: https://mcp.lastscanned.com/mcp Then: Connect, sign in to lastscanned and choose Allow ``` ```text tab="ChatGPT" Settings → Apps & Connectors → Advanced settings → Developer mode, then Create Server URL: https://mcp.lastscanned.com/mcp Authentication: OAuth Then: Sign in to lastscanned and choose Allow ``` ```json tab="Cursor" // ~/.cursor/mcp.json { "mcpServers": { "lastscanned": { "url": "https://mcp.lastscanned.com/mcp", "headers": { "Authorization": "Bearer lsk_live_…" } } } } ``` ```json tab="VS Code" // .vscode/mcp.json { "servers": { "lastscanned": { "type": "http", "url": "https://mcp.lastscanned.com/mcp", "headers": { "Authorization": "Bearer lsk_live_…" } } } } ``` Other clients (Windsurf and the rest): an HTTP server at `https://mcp.lastscanned.com/mcp` with the header `Authorization: Bearer lsk_live_…`. Claude and ChatGPT connectors sign in with OAuth instead of a key: add `https://mcp.lastscanned.com/mcp` as a custom connector, then sign in to lastscanned and choose Allow. The app is allowed to look up tracking numbers (the `track` scope) on that account, with its plan's limits. To disconnect, remove the connector in the app. A key always goes in the `Authorization` header, never in the URL. When you make a key in the [dashboard](https://app.lastscanned.com/keys), it shows each of these with your key filled in. ## Tools | Tool | Arguments | Returns | |---|---|---| | `track_package` | `tracking_number`, `carrier?` | Status, estimated delivery and scan history: a [tracking result](https://docs.lastscanned.com/tracking#the-response). | | `track_packages` | `tracking_numbers` (up to 100, 35 per carrier), `carrier?` | `{ results }`, one entry per number with `result` or `error`. | | `get_rates` | `from`, `to`, `weight`, `weight_unit?`, `residential?`, `length?`, `width?`, `height?`, `dimension_unit?`, `carriers?` | `{ quotes, cheapest, fastest, errors }`: USPS, UPS and FedEx prices, cheapest first, with delivery days and a breakdown. See [rates](#rate-quotes). | | `list_carriers` | | Carrier ids for `carrier`. | Shipping container numbers go in `tracking_number` too. The carrier is detected where the number identifies the line; for a leased container (owner codes such as `TGHU` and `TCNU`), pass the line as `carrier`, for example `msc`. See [Container tracking](https://docs.lastscanned.com/container-tracking-api). ## Rate quotes `get_rates` quotes one parcel between two US ZIP codes (5 digits, or ZIP+4). `from_country` and `to_country` default to `US`. Other countries are accepted, but no source quotes them yet, so the tool returns `no_quotes`. - **Quotes only.** Nothing is bought and no label is made. Each quote names its `source` and `rateType`: `retail` (the carrier's counter price), `list`, or `reseller` (a postage reseller's price, such as Stamps.com). - **Partial answers.** A source that can't quote is listed in `errors` while the rest still come back. The call fails only when no source could quote, and then nothing is spent. - **Cost.** A quote costs the same as one tracking number. Without sign-in, each client gets 5 free quotes a day, separate from the free tracking lookup. ## Behavior - Stateless: each POST is one JSON-RPC message answered with plain JSON. No sessions, no SSE. - A failed lookup comes back as a tool result with `isError: true` and the same `{ "error": { "code", "message" } }` as the REST API, so the model can read it. - Credentials: an invalid, revoked or expired key or token is HTTP 401 with `WWW-Authenticate: Bearer resource_metadata="https://mcp.lastscanned.com/.well-known/oauth-protected-resource"`, and so is a keyless tool call once the day's free lookup is used, so an OAuth client knows to sign in. A token without the `track` scope gets a 403. The JSON-RPC error's `data.code` says which (`unauthorized` or `free_lookup_used`). - When an account's daily limit is used up, the tool result is an error with code `rate_limited`. Without sign-in, `track_packages` tracks only the first number; the rest come back with code `auth_required`, and the result's `_meta["mcp/www_authenticate"]` carries the sign-in challenge. - A successful result can carry a `notice` (the lookup without sign-in or the day's last lookup was just used, or a credit key is running low) and, with a credit key, `credits_remaining`. - Each tool lists the sign-in it accepts in `securitySchemes` (`noauth`, and `oauth2` with the `track` scope for the lookups), has `readOnlyHint`, `destructiveHint` and `openWorldHint` annotations, and an `outputSchema` for its `structuredContent`. - `GET https://mcp.lastscanned.com` and `/.well-known/mcp.json` describe the server (name, tools, endpoint) for MCP registries. - Also served at `https://api.lastscanned.com/mcp`. # Migrating from 17TRACK API to lastscanned URL: https://docs.lastscanned.com/migrate-from-17track If your engineering or operations team is migrating off **17TRACK Tracking API v2.2 / v2.4** due to the **January 7, 2026 free-tier termination**, the **April 1, 2026 USPS Mailer ID (`mid`) enforcement**, or the **10× quota multiplier on `getRealTimeTrackInfo`**, you can switch to `lastscanned` in under 15 minutes—and keep your existing 17TRACK webhook receiver unchanged. ## Why Teams Are Leaving 17TRACK in 2026 1. **Free Tier Terminated (Jan 7, 2026)**: 17TRACK ended its recurring 100/month free API quota, replacing it with a one-time 200-number trial that never renews. `lastscanned` provides a permanent **Free tier (5 unique tracking numbers/day, $0/mo, plus 1 keyless lookup/day per IP)**, **$4.99/mo Pro (1,000 unique numbers/month + $0.015/extra, unlimited free re-polls & free scheduled watch checks)**, and **keyless HTTP 402 Stripe MPP ($0.50 for 25 numbers or $0.02/number in USDC on Tempo or Solana)**. 2. **Async `register` Queue & `-18019902` ("Tracking number is not registered yet")**: Calling 17TRACK's `gettrackinfo` on an unregistered barcode fails with `-18019902`. You must first `POST /register` and wait for an async webhook crawl. `lastscanned` returns live carrier events **synchronously on the very first `GET /v1/track/{number}` or `POST /v1/watches` call**. 3. **10× Quota Penalty & Blocked Carriers on `getRealTimeTrackInfo`**: 17TRACK's synchronous `getRealTimeTrackInfo` endpoint deducts **10 tracking quotas per call** and explicitly **blocks USPS (`21051`), DHL eCommerce US (`7047`), Royal Mail (`11031`), and Australia Post (`1151`)**. On `lastscanned`, every synchronous call—including USPS, DHL, Royal Mail, and Australia Post—costs **1 quota per unique tracking number per billing period** (and re-polling or watching the same number on Pro is **free**). 4. **April 1, 2026 USPS Mailer ID (`mid`) Gate & `-18010020` Extra Parameter Errors**: Across 150 carriers, 17TRACK rejects lookups with `-18010020` (*"Submitted additional parameters are incorrect"*) unless you pass `destination_country`, `postal_code`, `phone`, or—since April 1, 2026 for USPS (`21051`)—the shipper's **6-digit USPS Mailer ID (`mid`)**. `lastscanned` requires **only the tracking number**. ## Side-by-Side API Migration ### Before: 17TRACK (2-Step Async or 10-Quota Real-Time + Extra Parameters) ```bash # Step 1: Register and pay 1 quota (or pay 10 quotas on /getRealTimeTrackInfo, which blocks USPS 21051) curl -X POST https://api.17track.net/track/v2.2/register \ -H "17token: YOUR_17TRACK_TOKEN" \ -H "Content-Type: application/json" \ -d '[{"number": "9261290980949654107812", "carrier": 21051, "param": "901482"}]' # Step 2: Poll /gettrackinfo later (returns -18019902 until async crawl finishes) ``` ### After: `lastscanned` (1 Synchronous `GET`, 1 Quota, Zero Extra Params) ```bash curl "https://api.lastscanned.com/v1/track/9261290980949654107812" \ -H "Authorization: Bearer lsk_live_YOUR_API_KEY" ``` ## Status Enum Mapping (`17TRACK latest_status.status` → `lastscanned status`) | 17TRACK `latest_status.status` | `lastscanned` `status` | Notes | | --- | --- | --- | | `InfoReceived` | `label_created` | Label created; carrier awaiting physical parcel | | `InTransit` | `in_transit` | Active transit, sort facility scan, or customs clearance | | `OutForDelivery` | `out_for_delivery` | On vehicle for delivery today | | `Delivered` | `delivered` | Terminal delivery scan | | `AvailableForPickup` / `DeliveryFailure` / `Exception` | `exception` | Action required, held for pickup, customs hold, or delay | | `Exception_Returned` | `returned` | Returned to sender | | `NotFound` | `unknown` | No tracking data returned by carrier | ## Keeping Your 17TRACK Webhook Receiver (Web UI Dashboard or API) If you rely on 17TRACK's push notifications, you don't have to rewrite your webhook receiver. You can configure your webhook URL, select **17TRACK v2 format (`"format": "17track"`)**, test deliveries, and paste up to 100 tracking numbers at a time directly in the **Web UI Dashboard** ([Webhooks](https://app.lastscanned.com/webhooks) and [Watches](https://app.lastscanned.com/watches)) or via the REST API: ```bash curl -X PUT https://api.lastscanned.com/v1/webhook \ -H "Authorization: Bearer lsk_live_YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/17track-hook", "format": "17track"}' # Replaces POST /register; returns the current tracking result in the same response curl -X POST https://api.lastscanned.com/v1/watches \ -H "Authorization: Bearer lsk_live_YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"trackingNumber": "9261290980949654107812", "metadata": {"tag": "order-1001"}}' ``` Updates arrive as `TRACKING_UPDATED` and `TRACKING_STOPPED` with the same `data.number`, `data.carrier` (17TRACK's numeric code), `data.tag` and `data.track_info` layout, signed with 17TRACK's `sign` header. The only change on your side is the key you check `sign` with: use the `secret` from the response above (or copy it from [app.lastscanned.com/webhooks](https://app.lastscanned.com/webhooks)). See [Watches and webhooks](https://docs.lastscanned.com/webhooks#17track-format). ## Replacing 17TRACK's `externalcall.js` (`window.YQV5`) Frontend Widget If your storefront or help center embeds 17TRACK's legacy `//www.17track.net/externalcall.js` (`window.YQV5.trackSingle`), swap the script URL to `https://lastscanned.com/embed.js`. Our built-in `window.YQV5` compatibility shim renders an ad-free `lastscanned` lookup widget inside your existing `#YQContainer` element automatically. Configure yours in the [Tracking Widget Generator](https://lastscanned.com/tools/tracking-widget-generator). # Pirate Ship vs. Shippo vs. EasyPost vs. Shopify Shipping vs. ShipStation (2026) URL: https://docs.lastscanned.com/pirate-ship-vs-shippo-vs-easypost-vs-shopify-shipping When e-commerce brands, 3PLs, and fulfillment engineering teams purchase shipping labels, they rarely pay published retail tariffs. Instead, they access pre-negotiated master carrier accounts through postage resellers and shipping APIs—or bring their own negotiated carrier contracts (BYOA). However, two platforms advertising *"up to 88% off USPS and UPS"* can produce **25% to 50% different landed invoice costs** on the exact same box due to plan-gated rate tiers, missing USPS Ground Advantage Cubic support, credit-card wallet top-up fees, per-label API overages, and differing discounts on UPS/FedEx Residential ($6.50) and Delivery Area Surcharges ($6.55–$8.85). --- ## 1. 2026 Postage Reseller & Shipping API Comparison Matrix | Platform / Reseller | 2026 Monthly Subscription Fee | Per-Label / API Fee | USPS Rate Tier & Cubic Access | UPS / FedEx / DHL Master Discount Tier | Regional Carrier Access (OnTrac, Veho, UniUni, SpeedX) | Key Pricing & Operational Considerations (2026) | |---|---|---|---|---|---|---| | **Pirate Ship** (`pirateship.com`) | **$0 / month** | **$0.00 / label** | **USPS Connect eCommerce / Commercial Plus** + **Automatic Ground Advantage & Priority Cubic** (up to 1.0 cu ft) | **UPS Daily / Ground Saver** (up to 82% off list; Residential & DAS surcharges discounted on UPS master account). **No FedEx or DHL.** | **None** ([USPS](https://docs.lastscanned.com/carriers/usps) & [UPS](https://docs.lastscanned.com/carriers/ups) only) | No native Amazon/Walmart order sync; no multi-carrier REST API for custom ERPs; routine USPS rate-change email alerts discontinued in Oct 2026. | | **Shippo** (`goshippo.com`) | **Starter:** $0/mo (up to 30 labels)
**Pro:** From **$17/mo** annual ($19/mo monthly) for 1–200 labels, scaling by volume | **$0.00** on Shippo master accounts
**$0.05 / label** on BYOA (custom carrier accounts) on Starter | Full USPS Commercial & **Cubic** pricing | Shippo Master Accounts for **USPS, UPS, [FedEx](https://docs.lastscanned.com/carriers/fedex), [DHL Express](https://docs.lastscanned.com/carriers/dhl)** (up to 84% off list) | Supports select regional carriers via BYOA, but no built-in instant wallet rates for [UniUni](https://docs.lastscanned.com/carriers/uniuni) or [SpeedX](https://docs.lastscanned.com/carriers/speedx) | Separate tracking webhook calls and BYOA surcharges ($0.05/label on Starter); Pro plan volume tiers step up past 1,000 labels/mo. | | **EasyPost** (`easypost.com`) | **Free Access (Wallet):** $0/mo
**BYOCA (Bring Your Own Carrier):** **$20/mo** | **First 3,000 labels/mo FREE**, then **$0.08 / label** after 3,000 | USPS Commercial & Cubic via EasyPost Wallet | Pre-negotiated Wallet rates for **USPS, UPS, FedEx, DHL** | **100+ carrier integrations** via BYOCA (including [OnTrac](https://docs.lastscanned.com/carriers/ontrac), [Veho](https://docs.lastscanned.com/carriers/veho), [Canada Post](https://docs.lastscanned.com/carriers/canadapost), [Purolator](https://docs.lastscanned.com/carriers/purolator)) | **3.75% credit card wallet top-up fee** (waived via ACH); **$0.08/label** above 3,000 labels/mo ($800/mo per 10,000 labels); standalone Tracking API billed at **$0.01–$0.03/shipment**. | | **Shopify Shipping** (`shopify.com/shipping`) | **$0 software fee** (bundled into Shopify plan) | **$0.00 / label** | **Plan-Gated Tiers:** Basic ($39/mo) receives lower discounts than Grow ($105/mo) and Advanced ($399/mo). **No native USPS Cubic support.** | USPS, UPS, DHL Express, FedEx (discount depth depends on Shopify subscription tier) | **None** natively (requires third-party carrier-calculated rate app on Advanced/Plus) | A merchant on Shopify Basic often pays **35%–50% more per label** than Pirate Ship or Shippo on dense 1–5 lb parcels because USPS Cubic is unavailable and rate tiers are plan-gated. | | **Stamps.com / Endicia** (Auctane) | **Basic:** **$14.99/mo** (capped at 10 labels/mo)
**Professional:** **$29.99/mo**
**Multi-Location:** **$49.99/mo** | **$0.00 / label** on Pro (Basic caps at 10 labels/mo) | USPS Commercial & Cubic (Endicia) | USPS, UPS, FedEx, DHL Express, [GlobalPost](https://docs.lastscanned.com/carriers/globalpost) | Limited on standard plans | Basic plan ($14.99/mo) caps volume at 10 labels/month before requiring an upgrade to $29.99/mo for the same USPS Commercial rates available free on Pirate Ship. | | **ShipStation** (Auctane) | **Starter:** $14.99/mo (50 labels) to $39.99/mo (500)
**Standard:** From **$49.99/mo**
**Premium:** From **$99.99/mo** | Included in tier allowance (overage fees apply above tier) | USPS Commercial Plus & Cubic via ShipStation Carrier Services | 50+ carriers (USPS, UPS, FedEx, DHL, [Amazon Logistics](https://docs.lastscanned.com/carriers/amazon)) | **OnTrac**, **Amazon Shipping**, [GLS US](https://docs.lastscanned.com/carriers/glsus), [SEKO](https://docs.lastscanned.com/carriers/seko), [Sendle](https://docs.lastscanned.com/carriers/sendle) | Higher monthly fixed SaaS cost plus add-on fees for BYOA / ERP rate-shopping automation rules on upper tiers. | | **Pitney Bowes** (`ShipAccel` / `PitneyShip`) | **$17.99–$49.99+/mo** (SaaS) or API Enterprise minimum | Per-label API transaction fee on developer tiers | USPS Commercial Plus, Cubic, and **[Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes) Standard Delivery** (zone-skipping consolidator) | USPS, UPS, FedEx | Own sortation network (Pitney Bowes Parcel Services) | Longer transit times on zone-skipping consolidator service; requires middle-mile consolidator tracking before USPS final-mile induction. | --- ## 2. Four Hidden Rate Card Traps to Audit in 2026 ### 2.1 The Shopify Basic vs. USPS Ground Advantage Cubic Gap On parcels weighing between **1 lb and 10 lbs** that measure under **1.0 cubic foot** (for example, an `11" × 9" × 6"` box = `0.34 cu ft` weighing 4 lbs), **USPS Ground Advantage Cubic** prices the shipment strictly by volume tier (`0.4 Cubic Tier`) and zone rather than scale weight. - Because **Shopify Shipping does not offer USPS Cubic**, a Shopify Basic merchant is billed the standard 4 lb weight-based rate, which is frequently **$2.50 to $6.00 higher per parcel** in Zones 5–8 than the automatic Cubic rate on Pirate Ship, Shippo, or EasyPost. - Unlike UPS and FedEx, USPS Ground Advantage Cubic also charges **$0.00 Residential Delivery Surcharge**, **$0.00 Delivery Area Surcharge (DAS / Extended DAS)**, and **$0.00 Fuel Surcharge** in October 2026. ### 2.2 Master Account Surcharge Discounts vs. 3PL Markups Merchants moving from self-fulfillment (Pirate Ship / ShipStation) to a third-party fulfillment center (3PL) often discover their UPS Ground invoice per package is higher at the 3PL despite the 3PL shipping thousands of parcels per day: 1. **Master account accessorial waivers:** Pirate Ship, Shippo, and ShipStation aggregate volume onto master UPS Daily and Ground Saver contracts that include **50%+ reductions on Residential ($6.50) and DAS ($6.55) surcharges**. 2. **DIM divisor spread:** Many 3PLs pay the carrier using a negotiated **166 or 194 DIM divisor** (or route via regional carriers like [Veho](https://docs.lastscanned.com/carriers/veho), [UniUni](https://docs.lastscanned.com/carriers/uniuni), [SpeedX](https://docs.lastscanned.com/carriers/speedx), or [GOFO](https://docs.lastscanned.com/carriers/gofo)), while billing the merchant on a **139 DIM divisor** plus a 15%–25% markup on unredacted accessorials. ### 2.3 Automated Package Verification (APV) Adjustments & the 10,368 Cubic-Inch Trigger Both UPS and FedEx laser-scan parcels in sortation hubs and push post-shipment **Automated Package Verification (APV)** billing adjustments back through Shopify Shipping, Pirate Ship, Shippo, and EasyPost: - **Fractional-inch rounding:** Any fraction of an inch (`16.1"`) rounds **up** to the next whole inch (`17"`) before multiplying `L × W × H` and dividing by `139`. - **2026 Cubic-Volume Additional Handling:** Effective January 2026, any parcel exceeding **10,368 cubic inches** (`6.0 cubic feet`, such as a `24" × 24" × 19"` box) automatically triggers the **$30.00–$40.75 Additional Handling Surcharge** (plus the ~$8.25–$10.80 Q4 demand surcharge and ~29.5% fuel surcharge), even if no single dimension exceeds 48 inches. ### 2.4 Decoupling Label Generation from Multi-Carrier Tracking Most growing merchants end up generating labels across **multiple sources simultaneously**: - **Pirate Ship or Shippo** for domestic USPS Ground Advantage Cubic and UPS Ground Saver - **Regional last-mile couriers** ([Veho](https://docs.lastscanned.com/carriers/veho), [UniUni](https://docs.lastscanned.com/carriers/uniuni), [SpeedX](https://docs.lastscanned.com/carriers/speedx), [OnTrac](https://docs.lastscanned.com/carriers/ontrac), [GOFO](https://docs.lastscanned.com/carriers/gofo)) via direct contract or 3PL injection for sub-$6 metro delivery - **Cross-border & domestic consolidators** ([YunExpress](https://docs.lastscanned.com/carriers/yunexpress), [4PX](https://docs.lastscanned.com/carriers/4px), [Yanwen](https://docs.lastscanned.com/carriers/yanwen), [OSM Worldwide](https://docs.lastscanned.com/carriers/osm), [Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes), [DHL eCommerce](https://docs.lastscanned.com/carriers/dhlecommerce)) for lightweight parcels Instead of paying EasyPost ($0.01–$0.03 per tracking number) or Ship24 / ParcelPanel / TrackingMore ($55–$59/month minimums) to track shipments created outside a single label platform, engineering teams use `lastscanned` to normalize **all 549 carriers** through one synchronous REST API (`GET /v1/track/{number}`), [webhooks](https://docs.lastscanned.com/webhooks) (including a drop-in [17TRACK v2 webhook payload compatibility mode](https://docs.lastscanned.com/migrate-from-17track)), and [remote MCP server](https://docs.lastscanned.com/mcp). ## Related Resources - **2026 Surcharge Matrix:** [2026 Carrier Shipping Rates, DIM Divisors & Accessorial Surcharges](https://docs.lastscanned.com/shipping-rates-and-surcharges-2026) - **Interactive Rate Calculator:** [Calculate true landed parcel costs at lastscanned.com/rates](https://lastscanned.com/rates) - **Tracking API Architecture Comparison:** [lastscanned vs. AfterShip, EasyPost, Ship24 & 17TRACK](https://docs.lastscanned.com/comparison) - **Consolidator Handoffs:** [How to track OSM, Pitney Bowes & cross-border handoffs before USPS scan](https://docs.lastscanned.com/handoffs) # Plans and limits URL: https://docs.lastscanned.com/plans | | Free | Pro | |---|---|---| | Price | $0 | $4.99 a month | | Tracking numbers | 5 a day | 1,000 per billing period, then $0.015 each | | Daily limit | 5, resets 00:00 UTC | None | | Shipment email | No | Opt in per shipment on Watches. Your verified account address only. 10 new shipments per billing period. Up to 5 exception emails per shipment. | Without a key, `GET /v1/track/:number` also works once a day per IP address. Prepaid packs do not include shipment email. ## Shipment email Eligible Pro accounts can opt in on each watched shipment and get email at their verified account address when it is out for delivery, delivered, or has a shipment exception. Free accounts do not get shipment email, and neither do accounts that are not billed as Pro. Prepaid packs do not include it. You opt in per shipment on Watches after you sign in. We email only the verified address on your account, never a customer or any other recipient. Open [Watches](https://app.lastscanned.com/login?next=/watches). You can newly monitor 10 shipments by email per account each billing period. That cap is 10 shipments, not 10 emails and not a limit on how many watches you can have. Out for delivery and delivered each email once per shipment. A shipment exception can email up to 5 times for that shipment, once per distinct exception, which is not a limit of 5 emails in total. Events already on the shipment when you opt in are not emailed. There is no email overage. Turning email on does not add a tracking charge, and hitting the cap only stops new shipment email. Tracking, watches, and webhooks continue. An enrollment keeps running into the next billing period without using another of the 10. A missing tracking record or a failed lookup is not a shipment exception and does not send one of these emails. Email uses the same watch schedule as your other checks. It is not a live push from the carrier, not real-time, and not a guarantee that the message arrives. If a send times out or the outcome is uncertain, that alert is not resent and can be missed. An address that bounces or is reported as spam is not emailed again. Shipment email is separate from webhooks. Webhooks still POST watch changes to your URL. Stopping shipment email leaves the watch and any webhook running. Pro still includes 1,000 unique tracking numbers per billing period, then $0.015 each, with no daily limit. ## Enterprise Tracking 50,000+ packages a month? We offer volume discounts, higher concurrency, priority carrier integrations, and invoice billing. Email [support@lastscanned.com](mailto:support@lastscanned.com?subject=lastscanned%20Enterprise). ## Pay per request (MPP, no account) Keyless requests (once the free daily lookup is used, and always for batch `GET /v1/track?numbers=`) answer `402 Payment Required` with an [MPP](https://mpp.dev) challenge. Pay and retry: - **$0.50 by card** (`stripe/charge`) for a 25-number credit pack, returned as an `lsk_pack_…` bearer token for later requests. - **2 cents per tracking number** in USDC on Tempo (`tempo/charge`) or Solana (`solana/charge`). On Solana you pay the network fee in SOL. A rate quote costs the same 2 cents. See [Pay per request](https://docs.lastscanned.com/authentication#pay-per-request). ## Accounts Every account starts on Free. Upgrade, change the card or cancel under **Billing** in the [dashboard](https://app.lastscanned.com/billing). ## What counts A tracking number counts when you look it up: `/v1/track`, or the MCP tools `track_package` and `track_packages`. - **Free**: every number in every request counts, including repeats and cached answers. - **Pro**: a number counts once per billing period, however often you look it up, and only if the carrier answered (a result or `not_found`). Lookups that fail on our side (`carrier_error`, timeouts) are free. `GET /v1/account` returns `dailyLimit` and `usedToday`. `GET /v1/usage?days=30` returns per-day `lookups` and `live` (sent to the carrier rather than cache). ## At the limit A request that would go past the daily limit is refused whole with `429`: ```json { "error": { "code": "rate_limited", "message": "Daily Free tier limit of 5 tracking numbers reached (resets at 00:00 UTC). Upgrade to Pro at https://app.lastscanned.com for $4.99/mo (1,000 unique numbers a month included, no daily limit, re-checking a number is free) or pay per request without a key over MPP." } } ``` A batch of 10 numbers with 3 left today is refused; nothing in it is looked up. Refused requests don't count. `rate_limited` also comes back for single numbers when Spee-Dee is throttling us; retry those in a minute. # Rate shopping URL: https://docs.lastscanned.com/rates `/v1/rates` asks every source we quote from for its price to ship one parcel between two postal codes, and returns the quotes side by side, cheapest first, with delivery days and the surcharges itemized. Nothing is bought: a quote is information only. Every quote says where its price came from (`source`) and what kind of price it is (`rateType`): | `rateType` | Meaning | |---|---| | `retail` | The carrier's own counter or website price. | | `list` | The carrier's published list rate. | | `reseller` | A postage reseller's own price, usually below retail. You get it by shipping through that reseller. | Today's source is **Stamps.com** (`source: "stamps"`): USPS, UPS and FedEx at Stamps.com's prices, for **US domestic** shipments. More sources, including carriers' own retail rates, are being added. Stamps.com's FedEx rates are sometimes missing; when a source leaves out a carrier it covers, `errors` says so. People can use it at **[lastscanned.com/rates](https://lastscanned.com/rates)**; agents call the same thing over the API or MCP. --- ## Request ```bash curl "https://api.lastscanned.com/v1/rates?from=94107&to=10001&weight=2.5&residential=true" \ -H "Authorization: Bearer lsk_live_..." ``` Or `POST /v1/rates` with the same fields as JSON: ```bash curl -X POST https://api.lastscanned.com/v1/rates \ -H "Authorization: Bearer lsk_live_..." \ -H "Content-Type: application/json" \ -d '{"from": "94107", "to": "10001", "weight": 2.5, "length": 12, "width": 10, "height": 6, "residential": true}' ``` | Field | Required | Notes | |---|---|---| | `from` | yes | Origin postal code. In the US, a 5-digit ZIP (ZIP+4 is cut to 5). | | `to` | yes | Destination postal code. | | `fromCountry`, `toCountry` | no | Two-letter country codes. Default `US`. | | `weight` | yes | Above 0, at most 150 lb. | | `weightUnit` | no | `lb` (default), `oz`, `kg` or `g`. | | `length`, `width`, `height` | no | All three or none; each at most 108 in. Carriers price large, light boxes by size. | | `dimensionUnit` | no | `in` (default) or `cm`. | | `residential` | no | `true` when delivering to a home. Default `false`. | | `carriers` | no | Only these carrier ids (comma-separated, or an array in JSON). Omit for every carrier we can quote. | In JSON, `from` and `to` may also be objects: `{"postalCode": "SW1A 1AA", "country": "GB", "residential": true}`. ## Response | Field | Meaning | |---|---| | `quotes[]` | One per carrier service, cheapest first. | | `quotes[].carrier` | Our carrier id, the same one `GET /v1/track` uses. | | `quotes[].service`, `serviceCode` | The service's name and the source's code for it. When a price needs carrier packaging, `:` is appended to the code. | | `quotes[].amount`, `currency` | The quoted total, surcharges included. | | `quotes[].breakdown[]` | `{description, amount}`: the parts of the total as the source itemizes them (base price, fuel, residential, demand surcharges). | | `quotes[].rateType`, `source` | What kind of price it is (above), and where it came from. | | `quotes[].packaging` | Carrier packaging the price requires, such as `small_flat_rate_box` or `fedex_one_rate`; `null` for your own box. | | `quotes[].restricted` | What the service may carry when it is limited (Media Mail: books and media only), else `null`. | | `quotes[].deliveryDays`, `estimatedDelivery` | Business days and date (`YYYY-MM-DD`) the carrier quotes, or `null`. | | `quotes[].guaranteed` | Whether the carrier guarantees the date. | | `cheapest`, `fastest` | `source:carrier:serviceCode` of the lowest price and of the fewest quoted days, for your own box: restricted services and prices that need carrier packaging are never picked. | | `errors[]` | `{source, carriers, code, message}` for each source that couldn't quote (`carrier_error`, `timeout`, `not_covered` for a route it doesn't serve), each carrier a source left out (`no_rates`), and carriers no source covers (`source: null`). One failing never fails the rest. | | `quotedAt` | When the quotes were made. A shipment is re-quoted at most every 6 hours. | When **no** carrier could quote, the answer is `502 no_quotes` with the same `errors`, and nothing is spent. Quotes in different currencies are never ranked against each other: they are grouped by currency, then sorted by price. ## Cost A quote request costs the same as tracking one number: - **No key:** 5 free quotes a day per IP (not from cloud or hosting networks). - **API key:** one lookup of the account's day. - **MPP:** one credit, the same credits tracking spends ($0.02 in USDC on Tempo, `tempo/charge`, or Solana, `solana/charge`; on Solana you pay the network fee in SOL). ## MCP The `get_rates` tool takes the same fields in snake_case (`from`, `to`, `weight`, `weight_unit`, `from_country`, `to_country`, `residential`, `length`, `width`, `height`, `dimension_unit`, `carriers`) and returns the same JSON. It is listed only while a rate source is on. # Regional & Cross-Border Carrier Tracking API (UniUni, SpeedX, Veho, GOFO, OnTrac, Yanwen, 4PX, Cainiao, YunExpress) URL: https://docs.lastscanned.com/regional-carrier-tracking-api-uniuni-speedx-veho-gofo-ontrac High-volume e-commerce brands, 3PLs, and cross-border marketplaces increasingly route residential parcels away from UPS and FedEx to avoid **$6.45–$6.50 Residential Delivery fees**, **$6.55–$8.85 Delivery Area Surcharges (DAS)**, and **29.25%–30.00% fuel surcharges**. Instead, parcels move through **regional last-mile couriers** (`UniUni`, `SpeedX`, `Veho`, `GOFO Express`, `OnTrac`, `Better Trucks`, `Jitsu` / `AxleHire`, `Intelcom` / `Dragonfly`) and **cross-border consolidators** (`Yanwen`, `4PX`, `Cainiao`, `YunExpress`). While regional and cross-border networks cut per-parcel shipping costs by **40%–70%** (see our **[2026 Carrier Surcharges & Rate Guide](https://docs.lastscanned.com/shipping-rates-and-surcharges-2026)**), they create a major engineering headache for order-status pages and **"Where Is My Order?" (WISMO)** AI support bots: 1. **No self-serve recipient tracking APIs:** Most regional couriers restrict their developer portals to contracted enterprise shippers that generated the label, or protect their web tracking endpoints behind Firebase App Check (`Veho`), base64 proto-JSON encodings (`SpeedX`), or cloud IP blocks (`OnTrac`). 2. **Cross-border barcode swaps (handoffs):** A package ships from Shenzhen or Dongguan with a `Yanwen` (`UL494089685YP`), `4PX` (`4PX3002639757438CN`), `Cainiao` (`LP00836938654367`), or `YunExpress` (`YT2621200705470145`) waybill, clears US/CA/UK customs, and is handed to `UniUni`, `SpeedX`, `GOFO`, `OnTrac`, `USPS`, or `Intelcom` under a **completely different local tracking number**. `lastscanned` solves both problems across **[549 carriers](https://docs.lastscanned.com/carriers)** through a single synchronous REST API (`GET /v1/track/:number`), batch endpoint (`GET /v1/track?numbers=...`), push **[Watches & Webhooks](https://docs.lastscanned.com/webhooks)** (`POST /v1/watches`), and native **[Remote MCP Server](https://mcp.lastscanned.com/mcp)**. --- ## Quick Reference: Regional & Cross-Border Carrier Slugs, Prefixes & Real Examples Every tracking number below is a verified format supported out of the box by `GET https://api.lastscanned.com/v1/track/{trackingNumber}` with automatic carrier detection: | Carrier | Slug (`?carrier=`) | Common Prefix / Barcode Format | Verified Example Tracking Number | Key `lastscanned` Normalization Feature | |---|---|---|---|---| | **[UniUni](https://docs.lastscanned.com/carriers/uniuni)** | `uniuni` | `UUS…`, `UU…`, `UR…`, `JY…` (16–22 chars) | `UUS5BM1269395824723` · `UR07270000003615622` | Normalizes gateway hub scans, out-for-delivery driver events, and photo-delivery proof statuses across US & Canada. | | **[SpeedX](https://docs.lastscanned.com/carriers/speedx)** | `speedx` | `SPX` + 3 hub letters + 12 digits (18 chars) | `SPXCLT138701431240` | Decodes SpeedX's base64 proto-JSON payload and maps facility hub codes (`JFK`, `LAX`, `ORD`, `CLT`) to clean locations. | | **[Veho](https://docs.lastscanned.com/carriers/veho)** | `veho` | `VH` + 12–16 alphanumeric chars | `VH2PN7CHYPNMPR` | Tracks `VH…` parcels without requiring a Veho shipper contract or Firebase App Check browser token. | | **[GOFO Express](https://docs.lastscanned.com/carriers/gofo)** | `gofo` | `GFUS` + 14 digits (`GFUS…`, `GFFR…`, `GFIT…`) | `GFUS01074503026309` | Tracks US and European GOFO last-mile deliveries with normalized UTC + local timestamps. | | **[OnTrac / LaserShip](https://docs.lastscanned.com/carriers/ontrac)** | `ontrac` | `1LS…`, `LX…`, `C` or `D` + 14 digits | `1LS729108273411` · `1LSCXLNA060523159` | Unifies legacy LaserShip (`1LS…`) and West Coast OnTrac (`C…`/`D…`) barcodes under one `ontrac` slug. | | **[Better Trucks](https://docs.lastscanned.com/carriers/bettertrucks)** | `bettertrucks` | `BT` + 13–16 alphanumeric chars | `BTPA00190F5N15U` | Normalizes Midwest/Southern regional sortation and final-mile residential delivery events. | | **[Jitsu (AxleHire)](https://docs.lastscanned.com/carriers/axlehire)** | `axlehire` | `SCD…`, `AXL…`, `JIT…` | `SCD0000F00410922107` | Tracks urban same-day/next-day route events and delivery completion states. | | **[Intelcom / Dragonfly](https://docs.lastscanned.com/carriers/intelcom)** | `intelcom` | `INTLCM` + alphanumeric suffix | `INTLCMI719662704` | Auto-detects Canadian (`Intelcom`) and Australian (`Dragonfly`) e-commerce parcels with zero shipper credentials. | | **[Yanwen](https://docs.lastscanned.com/carriers/yanwen)** | `yanwen` | `UL…YP`, `UV…YP`, `UR…YP`, `YW…` | `UL494089685YP` · `YWSTL010022557186` | Extracts the destination last-mile carrier and exchange tracking number directly into `message`. | | **[4PX Express](https://docs.lastscanned.com/carriers/4px)** | `4px` | `4PX` + 13 digits + `CN` (18 chars) | `4PX3002639757438CN` | Repairs 4PX's `UTC+8` wall-clock sorting bug and extracts the domestic handoff barcode into `message`. | | **[Cainiao](https://docs.lastscanned.com/carriers/cainiao)** | `cainiao` | `LP` or `AP` + 14 digits, `CNUSUP…` | `LP00836938654367` · `AP00830954074290` | Resolves Global Cainiao standard/super-economy waybills and surfaces the destination last-mile tracking number. | | **[YunExpress](https://docs.lastscanned.com/carriers/yunexpress)** | `yunexpress` | `YT` + 16 digits (18 chars) | `YT2621200705470145` · `YT2625900708886066` | Extracts the final-mile carrier (`USPS`, `UniUni`, `SpeedX`, `GOFO`, `OnTrac`, `Royal Mail`) and secondary barcode. | --- ## 1. Synchronous Single-`GET` & Batch Tracking (`GET /v1/track`) Unlike legacy aggregators that require registering a webhook tracker first, `lastscanned` returns the live normalized status (`label_created`, `in_transit`, `out_for_delivery`, `delivered`, `exception`, `returned`, `unknown`) and full scan array in a single `GET` call: ```bash # Single regional parcel lookup (auto-detects UniUni from UUS prefix) curl -s https://api.lastscanned.com/v1/track/UUS5BM1269395824723 \ -H "Authorization: Bearer $LASTSCANNED_KEY" # Batch lookup across mixed regional & cross-border carriers (up to 100 numbers per call) curl -s "https://api.lastscanned.com/v1/track?numbers=UUS5BM1269395824723,SPXCLT138701431240,VH2PN7CHYPNMPR,GFUS01074503026309,1LS729108273411,YT2621200705470145" \ -H "Authorization: Bearer $LASTSCANNED_KEY" ``` --- ## 2. Chaining Cross-Border Handoffs Automatically (`Yanwen` / `4PX` / `YunExpress` $\rightarrow$ `UniUni` / `SpeedX` / `USPS`) When a parcel ships from China via `Yanwen`, `4PX`, `Cainiao`, or `YunExpress`, the customer usually only receives the origin waybill (`YT2621200705470145` or `UL494089685YP`). Once the parcel clears customs and transfers to `UniUni`, `SpeedX`, `GOFO`, `OnTrac`, or `USPS`, the origin consolidator's timeline often lags behind the local driver's scans. `lastscanned` automatically extracts the domestic last-mile carrier and secondary tracking number into the top-level `message` field (for example, `"Handed to UniUni as UUS5BM1269395824723"` or `"Handed to USPS as 9261290980949654107812"`). Your backend or WISMO agent can chain a follow-up lookup in three lines of code: ```ts async function trackWithHandoff(trackingNumber: string, apiKey: string) { const res = await fetch(`https://api.lastscanned.com/v1/track/${encodeURIComponent(trackingNumber)}`, { headers: { Authorization: `Bearer ${apiKey}` }, }); const primary = await res.json(); // Check if the cross-border consolidator reported a domestic last-mile barcode const handoffMatch = primary.message?.match(/Handed to .+ as ([A-Z0-9]{8,34})/i); if (handoffMatch && primary.status !== "delivered") { const lastMileNumber = handoffMatch[1]; const lastMileRes = await fetch(`https://api.lastscanned.com/v1/track/${encodeURIComponent(lastMileNumber)}`, { headers: { Authorization: `Bearer ${apiKey}` }, }); const lastMile = await lastMileRes.json(); return { primary, lastMile }; } return { primary, lastMile: null }; } ``` See **[Cross-Border & Last-Mile Handoff Resolution](https://docs.lastscanned.com/handoffs)** for all supported handoff pairs. --- ## 3. Push Watches & Webhooks for Regional Couriers (Web UI Dashboard & `POST /v1/watches`) You can add and monitor regional courier watches without writing code on the **[Watches Dashboard (`app.lastscanned.com/watches`)](https://app.lastscanned.com/watches)**—paste up to 100 tracking numbers with an optional carrier and label, filter **All / Active / Ended** watches, inspect full scan timelines, and configure your webhook URL, payload format (native or `"format": "17track"`), and 30-day delivery retries on **[Webhooks (`app.lastscanned.com/webhooks`)](https://app.lastscanned.com/webhooks)**. If you want proactive Slack, email, or SMS notifications when a `UniUni`, `SpeedX`, `Veho`, or `GOFO` parcel goes `out_for_delivery`, hits a gate-code `exception`, or is `delivered`, create a **Watch** via `POST /v1/watches`: ```bash curl -X POST https://api.lastscanned.com/v1/watches \ -H "Authorization: Bearer $LASTSCANNED_KEY" \ -H "Content-Type: application/json" \ -d '{ "trackingNumbers": [ "UUS5BM1269395824723", "SPXCLT138701431240", "VH2PN7CHYPNMPR", "GFUS01074503026309" ], "metadata": { "store": "us-dtc", "channel": "shopify" } }' ``` - **Immediate initial result:** `POST /v1/watches` returns the current `result` for each tracking number immediately in the HTTP response—no waiting for a background queue. - **Adaptive polling at zero extra cost:** Watching a number counts as 1 unique tracking number on your plan. All subsequent background checks (`every 15 minutes` when `out_for_delivery`, `every 30 minutes` on `exception`, `every 1 hour` when `in_transit`, `every 2 hours` on `label_created`) are completely free. - **Native or 17TRACK v2 webhook format:** Receive signed `tracking.updated` events in `lastscanned`'s JSON schema or set `"format": "17track"` on `PUT /v1/webhook` for drop-in compatibility with existing 17TRACK webhook handlers. See **[Watches and Webhooks](https://docs.lastscanned.com/webhooks)**. --- ## 4. Connecting AI Support Agents via MCP (`https://mcp.lastscanned.com/mcp`) Give Claude Code, Cursor, or your production WISMO customer-support agent direct access to all 549 regional, postal, and commercial carriers over Streamable HTTP: ```bash claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp \ --header "Authorization: Bearer lsk_live_YOUR_API_KEY" ``` Your agent immediately gains `track_package`, `track_packages` (up to 100 numbers per call), and `list_carriers`, or can pay per lookup without an account via **HTTP 402 Stripe MPP** (`$0.50` for a 25-number card pack or `$0.02/number` in USDC on Tempo or Solana). --- ## Related Guides & Tools - **[Watches and Webhooks (`/v1/watches`)](https://docs.lastscanned.com/webhooks)** - **[AfterShip vs. EasyPost vs. 17TRACK vs. lastscanned (2026)](https://docs.lastscanned.com/aftership-vs-easypost-vs-17track-vs-lastscanned)** - **[2026 Carrier Surcharges & Rate Guide](https://docs.lastscanned.com/shipping-rates-and-surcharges-2026)** - **[WISMO AI Agent Prompt & Tool-Schema Builder](https://lastscanned.com/tools/wismo-ai-agent-builder)** - **[Bulk Tracking CSV & SLA Auditor](https://lastscanned.com/tools/bulk-tracking-auditor)** # 2026 Carrier Shipping Rates, DIM Divisors & Accessorial Surcharges URL: https://docs.lastscanned.com/shipping-rates-and-surcharges-2026 Carriers and third-party logistics providers (3PLs) frequently quote headline base rates—such as 75% to 88% off published Ground list prices—while generating 35% to 55% of actual invoice revenue from stacked accessorial surcharges, dimensional weight (DIM) divisors, fractional-inch rounding rules, and weekly fuel indices that compound on top of both the base rate and selected accessorials. This guide documents the October 2026 tariff schedules across major national carriers, postal workshare consolidators, and regional last-mile couriers, alongside an interactive calculator at [lastscanned.com/rates](https://lastscanned.com/rates). --- ## 1. Master 2026 Surcharge & Accessorial Matrix | Cost Component / Surcharge Trigger | UPS (2026 Tariff) | FedEx (2026 Tariff) | USPS (Oct 2026 Schedule) | DHL eCommerce / Express | OnTrac (2026 Tariff) | Veho / UniUni / SpeedX / GOFO | |---|---|---|---|---|---|---| | **Published Retail Base Rate Floor (Zone 2, 1 lb)** | ~$11.99–$13.45 (Ground List) | ~$11.99–$13.45 (Ground / Home Delivery) | **$8.40** (Ground Advantage Retail ≤8 oz) · **$10.05** (1 lb Z1) · **$11.50** (Priority Retail) | ~$8.50+ (SmartMail Parcel) · $32+ (Express Intl) | ~$10.90–$12.50 (Published Ground List) | Contract / volume quote (~$3.40–$5.50 all-in for sub-1 lb dense metro) | | **Commercial / Reseller Base Floor (Zone 2, ≤1 lb)** | ~$5.40–$6.85 (UPS Ground Saver / Reseller Daily) | ~$5.60–$7.10 (FedEx Ground Economy / Reseller) | **$7.33** (Ground Advantage Commercial) · **$4.15–$5.25** (Connect eCommerce / Reseller Sub-1 lb) | ~$4.10–$5.80 (DHL eCommerce Parcel Expedited Max via 3PL) | ~$4.80–$6.50 (Negotiated Contract Base) | **~$3.25–$4.85** ([UniUni](https://docs.lastscanned.com/carriers/uniuni) / [SpeedX](https://docs.lastscanned.com/carriers/speedx) / [GOFO](https://docs.lastscanned.com/carriers/gofo) sub-1 lb) · **~$4.75–$6.20** ([Veho](https://docs.lastscanned.com/carriers/veho) next-day metro) | | **Residential Delivery Surcharge** | **$6.50** (Ground) · **$7.00** (Air) | **$6.45** (Ground / Home Delivery) · **$6.95** (Express) | **$0.00 (None)** | **$0.00** on postal final-mile · **$6.25** (DHL Express) | **$6.60** | **$0.00 (Included)** in standard residential e-commerce rate card | | **Delivery Area Surcharge (DAS)** | **$6.55** (Resi) · **$4.50** (Comm) | **$6.60** (Resi) · **$4.45** (Comm) | **$0.00 (None)** | **$0.00** (USPS final mile) · **$5.90+** (Express) | **$6.60** | Zone/ZIP gated: outside metro footprint is rejected at label creation or routed via partner | | **Extended DAS (Rural ZIPs)** | **$8.85** (Resi) · **$5.70** (Comm) | **$8.80** (Resi) · **$5.55** (Comm) | **$0.00 (None)** | N/A (USPS final mile) | **$8.80** | Outside native regional footprint (requires [USPS](https://docs.lastscanned.com/carriers/usps) fallback) | | **Remote Area Surcharge (US 48 / HI / AK)** | **$16.50** (US 48) · **$16.50** (HI) · **$46.25** (AK) | **$16.75** (US 48) · **$16.25** (HI) · **$46.00** (AK) | **$0.00 (None)** (Standard Zone 8/9 rate applies) | **$28.00+** (DHL Express Remote Area) | **$16.50+** (Contiguous US remote ZIPs) | Contiguous metro ZIPs only | | **Fuel Surcharge (Oct 2026 Weekly Index)** | **29.50%–30.00%** (Revised schedule effective Nov 2, 2026 reaches 30.0% at $6.25–$6.34/gal diesel) | **29.00%–29.50%** (29.25% Ground index) | **$0.00 in Oct 2026** (USPS weekly fuel index announced for Jan 2027) | **26.50%–31.00%** (Express jet fuel & eCommerce ground index) | **24.00%–28.50%** (Weekly US diesel index) | **SpeedX:** Weekly diesel index · **UniUni / Veho:** Baked into tier or 8%–14% contract cap | | **Dimensional (DIM) Weight Divisor** | **139** (Daily Rates) / **166** (Retail) — applies to **all** packages; fractional inches round UP at `0.01"` | **139** (Standard) — applies to **all** packages; fractional inches round UP | **166** — **ONLY applies above 1.0 cubic foot (1,728 cu in)** | **166** (Domestic eCommerce) / **139** (Express Intl) | **139** (Standard contract; 166–194 negotiated) | **166–250** (Veho & UniUni often grant 166–220 divisor or exempt parcels under 0.5–1.0 cu ft) | | **Additional Handling Surcharge (AHS)** | **Weight (>50 lb):** $46.50–$58.75 · **Dim (>48" or >10,368 cu in):** $30.00–$40.50 · **Packaging:** $26.75–$33.75 | **Weight (>50 lb):** $46.00–$58.75 · **Dim (>48" or >10,368 cu in):** $29.50–$40.75 · **Packaging:** $26.50–$33.75 | **Nonstandard Length:** >22" ($4.00), >30" ($15.00) · **Volume (>2 cu ft):** $18.00 | **$25.00–$45.00** (Non-machinable / irregular) | **$32.00–$42.00** (by zone) | Hard weight/dim rejection (UniUni/GOFO focus on <20–30 lb small parcel; Veho up to 50 lb) | | **2026 Cubic-Volume AHS Rule** | **>10,368 cu in** triggers AHS automatically; **>17,280 cu in** triggers Large Package ($219.50–$331.00) | **>10,368 cu in** triggers AHS automatically; **>17,280 cu in** triggers Oversize ($255.00–$330.00) | **Ground Advantage Cubic** rewards dense boxes up to **1.0 cu ft** (10 tiers from 0.1 to 1.0 cu ft) | N/A | **Large Package:** $265.00–$325.00 | N/A | | **Over Maximum Limits Penalty** | **$1,875.00** (Up +41.5% from $1,325 in 2025) | **$1,875.00** | Returned to sender (>70 lbs or >130" length + girth) | Returned / Freight re-bill | **$1,875.00** | Refused at induction | | **Address Correction Fee** | **$25.25** per package | **$25.50** per package | **$0.00** (Included forwarding / return on Ground Advantage & Priority) | **$18.00–$24.00** | **$25.00** per package | **$0.00–$5.00** (In-app recipient photo/PIN update before delivery) | | **Q4 2026 Peak / Demand Surcharge Window** | **Sept 27, 2026 – Jan 16, 2027** (+$0.40–$0.75 Resi, +$82.50–$107.00 Large Pkg, +$8.25–$10.80 AHS) | **Sept 28, 2026 – Jan 17, 2027** (+$0.40–$0.75 Resi, +$82.50–$108.00 Oversize, +$8.25–$10.80 AHS) | **Oct 4 / Oct 25, 2026 – Jan 17, 2027** (+$0.30–$1.50 Comm Ground Advantage; +$0.40–$3.25 Priority) | **Oct 1, 2026 – Jan 15, 2027** | **Sept 28, 2026 – Jan 17, 2027** | **$0.00–$0.50** per parcel peak capacity fee | --- ## 2. Worked Example: How a "$7.10 Teaser Rate" Becomes $35.42 on the Invoice Consider a standard e-commerce order shipped in October 2026: - **Box exterior dimensions:** `16.2" × 12.2" × 10.2"` - **Actual scale weight:** `4 lbs` - **Destination:** Residential address in a suburban/semi-rural Extended DAS ZIP code (Zone 5) | Calculation Step | UPS / FedEx Direct ("50% Off Base" Contract) | Pirate Ship / Shippo (USPS Ground Advantage Cubic) | Regional Courier (Veho / UniUni / SpeedX Metro) | |---|---|---|---| | **1. Fractional-Inch Rounding & DIM Weight** | `16.2 × 12.2 × 10.2` rounds UP to `17" × 13" × 11" = 2,431 cu in`. Divided by **139** = **18 lbs Billable Weight** (4.5× the 4 lb scale weight). | `2,431 cu in = 1.40 cu ft` (>1.0 cu ft threshold). Divided by **166** = **15 lbs Billable Weight** (or if packed in a `14" × 12" × 10" = 0.97 cu ft` box, qualifies for **1.0 Cubic Tier** with zero DIM penalty). | Divisor **166–200** = **12–15 lbs Billable Weight** (or flat weight-tier pricing under 5 lbs if under 1.0 cu ft). | | **2. Base Rate (Zone 5)** | Advertised 4 lb rate was $7.10, but **18 lb DIM rate** jumps to **$11.40** after 50% contract discount. | **1.0 Cubic Tier Zone 5:** **$9.88** (or 15 lb Ground Advantage Commercial: **$14.65**). | **$6.90–$8.50** all-in Zone 5 / regional injection. | | **3. Residential Surcharge (2026)** | **+$6.50** ([UPS](https://docs.lastscanned.com/carriers/ups)) / **+$6.45** ([FedEx](https://docs.lastscanned.com/carriers/fedex)) | **$0.00** | **$0.00** | | **4. Extended DAS Surcharge (2026)** | **+$8.85** (UPS) / **+$8.80** (FedEx) | **$0.00** | **$0.00** (in covered metro ZIPs) | | **5. Q4 2026 Peak Demand Surcharge** | **+$0.60** | **+$0.75** (Holiday adjustment) | **$0.00–$0.35** | | **6. Oct 2026 Fuel Surcharge (~29.5%)** | Applied to (Base + Resi + Extended DAS + Peak) = `29.5% × $27.35` = **+$8.07** | **$0.00** | Included or **+$0.85** | | **True Landed Cost** | **$35.42** (398% higher than the $7.10 teaser quote) | **$10.63** (at 1.0 cu ft) / **$15.40** (at 1.4 cu ft) | **$7.75–$9.70** | --- ## 3. Why Multi-Carrier Rate Shopping Requires Unified Tracking Merchants and 3PLs that route each parcel to the lowest landed-cost carrier—combining **USPS Ground Advantage Cubic** for rural/DAS residential zones, **UPS Ground Saver** for mid-weight commercial zones, postal workshare consolidators ([OSM Worldwide](https://docs.lastscanned.com/carriers/osm), [Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes), [DHL eCommerce](https://docs.lastscanned.com/carriers/dhlecommerce)), and regional last-mile couriers ([Veho](https://docs.lastscanned.com/carriers/veho), [UniUni](https://docs.lastscanned.com/carriers/uniuni), [SpeedX](https://docs.lastscanned.com/carriers/speedx), [OnTrac](https://docs.lastscanned.com/carriers/ontrac), [GOFO](https://docs.lastscanned.com/carriers/gofo), [Better Trucks](https://docs.lastscanned.com/carriers/bettertrucks)) for dense metro ZIPs—cut landed parcel spend by **40% to 70%**. However, splitting volume across 6 to 12 carriers fragments post-purchase visibility: 1. **Consolidator handoff blind spots:** Postal consolidators print final-mile `92…` USPS Intelligent Mail package barcodes at origin, leaving tools that only query USPS stuck on `"Pre-Shipment, USPS Awaiting Item"` for 3 to 7 days while the parcel moves through middle-mile sortation hubs. See [Cross-Border & Consolidator Handoffs](https://docs.lastscanned.com/handoffs). 2. **Regional courier authentication walls:** Regional carriers such as Veho, UniUni, SpeedX, GOFO, and OnTrac use distinct barcode prefixes (`VH…`, `UU…`, `SPX…`, `GFUS…`, `C…`/`D…`), different timezone conventions, and custom web/API gates. 3. **Invoice & SLA auditing:** Auditing carrier delivery-time guarantees and verifying when an Additional Handling or DAS adjustment occurred requires normalized UTC and local scan timestamps across every carrier. `lastscanned` normalizes **549 live carriers** behind a single synchronous `GET https://api.lastscanned.com/v1/track/{number}` endpoint, [webhooks](https://docs.lastscanned.com/webhooks), and [remote MCP server](https://docs.lastscanned.com/mcp) (`https://mcp.lastscanned.com/mcp`). ## Related Resources - **Interactive calculator:** [2026 Shipping Rate & Surcharge Calculator](https://lastscanned.com/rates) - **Reseller comparison:** [Pirate Ship vs. Shippo vs. EasyPost vs. Shopify Shipping](https://docs.lastscanned.com/pirate-ship-vs-shippo-vs-easypost-vs-shopify-shipping) - **Consolidator handoffs:** [Tracking OSM, Pitney Bowes, DHL eCommerce & cross-border handoffs](https://docs.lastscanned.com/handoffs) - **Supported carriers:** [Full 549-carrier directory](https://docs.lastscanned.com/carriers) # Shopify, 3PL & Custom ERP Package Tracking & Webhooks Guide (2026) URL: https://docs.lastscanned.com/shopify-3pl-wismo-tracking-and-webhooks Shopify merchants, third-party logistics providers (3PLs), and custom ERP teams typically lose thousands of dollars per year—and hundreds of milliseconds of storefront load time—to legacy post-purchase tracking apps like **AfterShip**, **17TRACK**, and **ParcelPanel**. Those apps inject multi-script tracking widgets into your storefront theme, lock REST API and webhook access behind **$59–$199/month tiers**, and still fail to resolve **domestic `92…` USPS consolidator gaps** (`OSM Worldwide`, `Pitney Bowes`) or **China cross-border last-mile handoffs** (`Yanwen`, `4PX`, `Cainiao`, `YunExpress` $\rightarrow$ `UniUni`, `SpeedX`, `GOFO`, `OnTrac`). With **[lastscanned](https://lastscanned.com)**, you can power your Shopify order-status page, 3PL warehouse management system (WMS), Klaviyo/Postscript flows, and Gorgias/Zendesk WISMO tickets using a single synchronous REST API and push **[Watches & Webhooks](https://docs.lastscanned.com/webhooks)** across **[549 carriers](https://docs.lastscanned.com/carriers)** for **$4.99/month** (`1,000` unique tracking numbers included, `$0.015` per additional number, unlimited re-polls and scheduled watch checks). --- ## Architecture Comparison: Storefront Tracking Apps vs. `lastscanned` | Dimension | Legacy Storefront Apps (AfterShip / 17TRACK / ParcelPanel) | `lastscanned` REST API + Watches + `` | |---|---|---| | **Storefront JavaScript impact** | Heavy third-party scripts, iframes, and promotional upsell banners | Zero third-party trackers; optional `` is a single lightweight Web Component (`/embed.js`) | | **Order fulfillment trigger** | Requires async tracker registration; initial API response has `events: []` | **`POST /v1/watches`** returns the live normalized `TrackingResult` immediately *and* schedules automatic webhook updates | | **Webhook payload format** | Proprietary per vendor | Native `lastscanned` JSON (`tracking.updated`, `watch.ended`) **or drop-in 17TRACK v2 format** (`"format": "17track"`) | | **`92…` `"USPS Currently Awaiting Package"`** | Stuck in pre-shipment for 3–7 days until USPS local scan | Pass `?carrier=osm` or `?carrier=pitneybowes` on `92…` numbers to surface live middle-mile sort scans | | **Cross-border last-mile barcode swap** | Customer sees stagnant origin waybill after customs clearance | Automatically extracts destination carrier & local barcode into `message` (e.g., `"Handed to UniUni as UUS5BM1269395824723"`) | | **Monthly cost at 1,000 orders/mo** | **$59 – $119/month** | **$4.99/month** ([Pro](https://docs.lastscanned.com/plans)) or **$0.02/lookup** via keyless [HTTP 402 Stripe MPP](https://docs.lastscanned.com/authentication#pay-per-request) | --- ## 1. Managing Watches & Webhooks in the Web UI Dashboard (No Code Required) Before writing any code—or for operations teams managing exception shipments by hand—you can run your entire watch and webhook workflow directly in the **[Web UI Dashboard](https://app.lastscanned.com)**: - **[Dashboard Watches (`app.lastscanned.com/watches`)](https://app.lastscanned.com/watches)**: Paste up to **100 tracking numbers at once** (with an optional carrier override and custom label stored in `metadata.label`). Each number is looked up immediately, metered under your signed-in account, and displayed in a filterable list (**All**, **Active**, **Ended**) showing its current status, latest scan, and next scheduled check time. Click any watch to inspect its full scan timeline or stop watching with one click. - **[Dashboard Webhooks (`app.lastscanned.com/webhooks`)](https://app.lastscanned.com/webhooks)**: Set or rotate your webhook endpoint URL and signing secret (`whsec_...`), switch between **native `lastscanned` JSON** and **drop-in 17TRACK v2 format (`"format": "17track"`)**, send a live `webhook.test` ping, and inspect or retry any webhook delivery from the past 30 days. --- ## 2. Triggering a Watch via API When Shopify Creates a Fulfillment (`orders/fulfilled`) When your Shopify store or 3PL WMS fulfills an order (`orders/fulfilled` or `fulfillments/create` webhook), register the tracking number with `POST https://api.lastscanned.com/v1/watches` and attach the Shopify order ID and customer email in `metadata`: ```ts // Handler for Shopify's `fulfillments/create` webhook export async function onShopifyFulfillmentCreate(shopifyFulfillment: { order_id: number; tracking_number: string; tracking_company?: string; email?: string; }) { const res = await fetch("https://api.lastscanned.com/v1/watches", { method: "POST", headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ trackingNumber: shopifyFulfillment.tracking_number, metadata: { shopifyOrderId: String(shopifyFulfillment.order_id), customerEmail: shopifyFulfillment.email ?? "", }, }), }); const watch = await res.json(); // watch.id -> "wat_109060ade9f9a48732117f7a" // watch.result -> immediate live TrackingResult (carrier, status, estimatedDelivery, events) return watch; } ``` Because `POST /v1/watches` performs an immediate live lookup and returns `watch.result` in the HTTP response, your database has the normalized carrier slug (`ups`, `usps`, `fedex`, `uniuni`, `speedx`, `veho`, `gofo`, `ontrac`, `yanwen`, `4px`, `cainiao`), `status`, and `estimatedDelivery` on the very first call. --- ## 3. Receiving Signed Status Webhooks (`tracking.updated` & `watch.ended`) Configure your webhook receiver once via `PUT /v1/webhook` (or on the [Webhooks dashboard](https://app.lastscanned.com/webhooks)): ```bash curl -X PUT https://api.lastscanned.com/v1/webhook \ -H "Authorization: Bearer $LASTSCANNED_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://api.yourbrand.com/webhooks/lastscanned"}' ``` `lastscanned` automatically re-checks active watches on an adaptive schedule—**every 15 minutes** when `out_for_delivery`, **every 30 minutes** on `exception`, **every 1 hour** when `in_transit`, and **every 2 hours** on `label_created`—at **zero additional cost**. Whenever the status, newest scan, or `estimatedDelivery` changes, your endpoint receives a signed `POST`: ```ts import crypto from "node:crypto"; export async function handleLastscannedWebhook(rawBody: string, signatureHeader: string) { const { t, v1 } = Object.fromEntries(signatureHeader.split(",").map((p) => p.split("="))); const expected = crypto .createHmac("sha256", process.env.LASTSCANNED_WEBHOOK_SECRET!) .update(`${t}.${rawBody}`) .digest("hex"); if (!crypto.timingSafeEqual(Buffer.from(v1, "hex"), Buffer.from(expected, "hex"))) { throw new Error("Invalid Lastscanned-Signature"); } const event = JSON.parse(rawBody); if (event.type === "tracking.updated") { const { watch, previousStatus, result } = event.data; // Example: trigger Klaviyo / Postscript SMS when status transitions to `out_for_delivery` or `exception` if (previousStatus !== result.status && result.status === "out_for_delivery") { await notifyCustomerOutForDelivery(watch.metadata.shopifyOrderId, result); } } } ``` Migrating from an existing **17TRACK** integration? Pass `"format": "17track"` to `PUT /v1/webhook` and `lastscanned` will send `TRACKING_UPDATED` / `TRACKING_STOPPED` payloads with 17TRACK's `sign` header so your existing Shopify/ERP webhook handler works with zero code changes. See **[Migrating from 17TRACK](https://docs.lastscanned.com/migrate-from-17track)**. --- ## 4. Resolving Cross-Border Handoffs & `92…` USPS Consolidator Parcels For brands shipping from overseas factories (`Yanwen`, `4PX`, `Cainiao`, `YunExpress`) or using domestic consolidators (`OSM Worldwide`, `Pitney Bowes`): 1. **Automatic Last-Mile Handoff Extraction:** When `Yanwen` (`UL494089685YP`), `4PX` (`4PX3002639757438CN`), `Cainiao` (`LP00836938654367`), or `YunExpress` (`YT2621200705470145`) hands a parcel to `UniUni` (`UUS5BM1269395824723`), `SpeedX` (`SPXCLT138701431240`), `GOFO` (`GFUS01074503026309`), or `USPS`, `result.message` surfaces `"Handed to UniUni as UUS5BM1269395824723"`. You can immediately create a second watch on the local courier barcode so the buyer sees real-time out-for-delivery driver scans. 2. **Eliminating `"USPS Currently Awaiting Package"` Tickets:** When a `926129…` or `927489…` barcode returns `"Pre-Shipment: Picked Up by Shipping Partner, USPS Awaiting Item"` on USPS, query `GET /v1/track/9274899998486353272191?carrier=osm` or `GET /v1/track/9261290980949654107812?carrier=pitneybowes` to show the buyer the exact middle-mile sort facility and departure timestamp. --- ## 5. Embedding a Clean, Zero-Bloat Order Lookup Widget If you want a self-serve tracking lookup page on your Shopify storefront or help center without loading third-party ad scripts, use the [Tracking Widget Generator](https://lastscanned.com/tools/tracking-widget-generator) to drop `` onto any page: ```html ``` --- ## Related Guides & Tools - **[Watches and Webhooks (`/v1/watches` & `/v1/webhook`)](https://docs.lastscanned.com/webhooks)** - **[WISMO Helpdesk Integrations (Gorgias, Zendesk, Shopify)](https://docs.lastscanned.com/wismo-integrations)** - **[Regional & Cross-Border Carrier Tracking API Guide](https://docs.lastscanned.com/regional-carrier-tracking-api-uniuni-speedx-veho-gofo-ontrac)** - **[AfterShip vs. EasyPost vs. 17TRACK vs. lastscanned (2026)](https://docs.lastscanned.com/aftership-vs-easypost-vs-17track-vs-lastscanned)** - **[2026 Carrier Surcharges & Rate Guide](https://docs.lastscanned.com/shipping-rates-and-surcharges-2026)** # Tracking URL: https://docs.lastscanned.com/tracking ## One number ```bash tab="curl" curl https://api.lastscanned.com/v1/track/1Z54V8630394427740 \ -H "Authorization: Bearer $LASTSCANNED_KEY" ``` ```js tab="JavaScript" const res = await fetch("https://api.lastscanned.com/v1/track/1Z54V8630394427740", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_KEY}` }, }); if (!res.ok) throw new Error((await res.json()).error.message); const tracking = await res.json(); ``` ```python tab="Python" import os, requests res = requests.get( "https://api.lastscanned.com/v1/track/1Z54V8630394427740", headers={"Authorization": f"Bearer {os.environ['LASTSCANNED_KEY']}"}, ) res.raise_for_status() tracking = res.json() ``` Returns a [tracking result](#the-response), or an [error](https://docs.lastscanned.com/errors): `404 not_found` when the carrier has no record, `400 unknown_carrier` when no carrier's format matches. ## Several numbers `GET /v1/track?numbers=a,b,c` takes up to 100 numbers, at most 35 for any one carrier. Numbers from different carriers can be mixed; duplicates are removed. ```bash tab="curl" curl "https://api.lastscanned.com/v1/track?numbers=1Z54V8630394427740,541270563758" \ -H "Authorization: Bearer $LASTSCANNED_KEY" ``` ```js tab="JavaScript" const numbers = ["1Z54V8630394427740", "541270563758"]; const res = await fetch(`https://api.lastscanned.com/v1/track?numbers=${numbers.join(",")}`, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_KEY}` }, }); const { results } = await res.json(); ``` ```python tab="Python" import os, requests res = requests.get( "https://api.lastscanned.com/v1/track", params={"numbers": ",".join(["1Z54V8630394427740", "541270563758"])}, headers={"Authorization": f"Bearer {os.environ['LASTSCANNED_KEY']}"}, ) results = res.json()["results"] ``` ```json { "results": [ { "trackingNumber": "1Z54V8630394427740", "result": { "carrier": "ups", "status": "in_transit", "events": [] } }, { "trackingNumber": "541270563758", "error": { "code": "not_found", "message": "FedEx returned no track details for that number" } } ] } ``` - One entry per number, in the order sent, each with `result` (same shape as a single lookup) or `error`. One bad number never fails the others. - The call returns `200` unless it is malformed (`400`), unauthorized (`401`) or over the daily limit (`429`). - The response comes back when every number has an answer. Each carrier's numbers are looked up together. - `x-cache-hits` is how many numbers came from cache. ## Carrier detection The carrier is worked out from the number's format, and its check digit where the format has one, so a typo is turned away with `unknown_carrier` instead of being looked up. Formats are listed in [Carriers](https://docs.lastscanned.com/carriers). **One carrier per number.** Detection picks exactly one carrier and never falls back to another. If that carrier has no record, the answer is `not_found`. Pass `carrier` to choose the carrier yourself and skip detection: ```bash curl "https://api.lastscanned.com/v1/track/541270563758?carrier=fedex" \ -H "Authorization: Bearer $LASTSCANNED_KEY" ``` Use it when: - the number is too generic to detect (OnTrac references, some UniUni and GOFO partner numbers, shippers' own numbers on Veho, CDL shipper references, most AxleHire codes); - two carriers share a format and detection picked the wrong one (20-digit DHL Paket numbers not starting `0034043` go to FedEx; Cirro's `GFUS…` numbers go to GOFO); - it is a leased shipping container (owner codes such as `TGHU` and `TCNU`), which can sail with any line: pass the line, for example `carrier=msc`. See [Container tracking](https://docs.lastscanned.com/container-tracking-api). On the batch route, `carrier` applies to every number. Carrier ids come from [`GET /v1/carriers`](https://docs.lastscanned.com/carriers#carrier-ids). ## The response | Field | | |---|---| | `carrier` | Carrier id, e.g. `ups`. | | `trackingNumber` | Upper-cased, trimmed. | | `status` | `label_created`, `in_transit`, `out_for_delivery`, `delivered`, `exception`, `returned` or `unknown`. | | `statusDescription` | The carrier's wording of the status. | | `service` | e.g. `UPS Ground`. Can be `null`. | | `deliveredAt` | Delivery time in UTC, or `null`. | | `deliveredAtLocal` | Delivery time as the carrier printed it, no zone. | | `signedBy` | Can be `null`. | | `destination` | `{ city, state, country }`, any of them `null`; or `null`. | | `estimatedDelivery` | Expected delivery as local time with no zone, often a date only. `null` or absent if the carrier gives none. | | `estimatedDeliveryAt` | The same moment in UTC, only when the carrier states its zone (FedEx, DHL). | | `message` | The carrier's latest-update sentence, e.g. why a delivery is late. Cross-border carriers name the handoff carrier and its number here (`Handed to USPS as 4207…`). | | `events` | Scans, newest first. | Each event has `status`, `description`, `location` (or `null`), `code` (the carrier's event code; `null` for USPS) and two times: - `timestamp`: UTC, ISO 8601 with `Z`. Use this one. It is `null` when the carrier gave no time of day or no zone to convert from. - `localTime`: the time as the carrier printed it, no zone (`2026-08-07T16:17:00`). A date alone means no time of day was given. Always `null` for Amazon. Where `timestamp` comes from: - **UPS, Amazon**: UTC from the carrier. - **FedEx, OnTrac, UniUni, GOFO, Veho**: the carrier gives a zone with each scan, so the conversion is exact. A UniUni "order received" scan has no zone and no `timestamp`. - **DHL**: Express usually gives an offset. eCommerce and Parcel often don't, and `timestamp` is then `null`. - **USPS**: prints no zone. `timestamp` assumes the zone of the location the page was loaded from; USPS doesn't state it. - **Cirro, YunExpress**: only the newest scan has a `timestamp`. # Carrier API Errors & Scan Status Reference URL: https://docs.lastscanned.com/troubleshooting Calling carrier tracking endpoints directly from serverless runtimes (Cloudflare Workers, Vercel Functions, AWS Lambda) or legacy webhook aggregators often fails due to WAF blocks, multi-step OAuth handshakes, or asynchronous registration queues. Use our interactive [Carrier API Error Decoder](https://lastscanned.com/tools/carrier-api-error-decoder) or the reference below to replace brittle carrier integrations with a single `GET https://api.lastscanned.com/v1/track/{number}` request. ## Common Carrier API Errors & Fixes | Carrier / Provider | Error Code / Symptom | Why It Happens | `lastscanned` Resolution | | --- | --- | --- | --- | | **UPS** | `HTTP 403 Forbidden` / `428 Precondition Required` / `250003 Invalid Access License` | UPS deprecated XML Access Keys (`250003`) and gates its REST Track API behind Akamai Bot Manager, blocking cloud datacenter ASNs. | Call `GET /v1/track/1Z...` — zero UPS shipper account credentials or OAuth token caches required. | | **USPS** | Web Tools TrackV2 XML retired / v3 OAuth `401` & `429` / `92…` blind spots | USPS retired legacy Web Tools XML and requires Business Customer Gateway OAuth 2.0, while omitting OSM/Pitney Bowes middle-mile scans. | Call `GET /v1/track/9400...` (and pass `?carrier=osm` or `?carrier=pitneybowes` on `92…` consolidator labels). | | **FedEx** | `HTTP 422 Unprocessable Entity` / `NOT.AUTHORIZED.ERROR` | Short-lived OAuth bearer token churn in stateless edge workers and production key validation gates. | Call `GET /v1/track/{number}` with your static `lsk_live_...` key; 12/15/20/22-digit FedEx numbers auto-detect. | | **Veho / UniUni / SpeedX / GOFO / OnTrac** | `HTTP 401` / `403` Firebase App Check / No public self-serve API | Regional e-commerce couriers gate tracking behind browser-minted Firebase App Check tokens or enterprise contracts. | All regional couriers (`veho`, `uniuni`, `speedx`, `gofo`, `ontrac`, `bettertrucks`, `intelcom`) work out of the box via `GET /v1/track/{number}`. | | **17TRACK** | `-18019902` ("Not registered yet") / `-18010020` ("Additional parameters incorrect") | 17TRACK requires async `POST /register` before querying, charges 10 quotas/call for `getRealTimeTrackInfo`, and requires extra params (`mid`, `postal_code`) on 150 carriers. | Synchronous on the first `GET` for **1 quota**, with zero extra parameters required. See [Migrating from 17TRACK](https://docs.lastscanned.com/migrate-from-17track). | ## Top 255 Cryptic Carrier Scan Statuses (`statusDescription` → `status`) Every carrier uses different raw phrasing for middle-mile consolidator handoffs, customs clearance, and delivery exceptions. `lastscanned` preserves the verbatim carrier text in `statusDescription` and `events[].description` while mapping it to our 7-value normalized `status` enum (`pre_shipment`, `in_transit`, `out_for_delivery`, `delivered`, `exception`, `expired`, `unknown`): - **USPS & Consolidators**: [`Picked Up by Shipping Partner, USPS Awaiting Item`](https://lastscanned.com/status/picked-up-by-shipping-partner-usps-awaiting-item) · [`Shipping Label Created, USPS Currently Awaiting Package`](https://lastscanned.com/status/shipping-label-created-usps-awaiting-item) · [`Arrived Shipping Partner Facility, USPS Awaiting Item`](https://lastscanned.com/status/arrived-at-shipping-partner-facility-usps-awaiting-item) · [`Departed Shipping Partner Facility, USPS Awaiting Item`](https://lastscanned.com/status/departed-shipping-partner-facility-usps-awaiting-item) · `Accepted at USPS Destination Facility` · [`In Transit to Next Facility, Arriving Late`](https://lastscanned.com/status/in-transit-to-next-facility-arriving-late) · `Held at Post Office, At Customer Request` · `Available for Pickup` · `No Access to Delivery Location` · `Receptacle Blocked` · `Alert: Awaiting Delivery Scan` - **Regional Last-Mile (UniUni, SpeedX, GOFO, Veho, OnTrac)**: [`Gateway transit in`](https://lastscanned.com/status/uniuni-gateway-transit-in) · [`Gateway transit out`](https://lastscanned.com/status/uniuni-gateway-transit-out) · [`Parcel is out for delivery`](https://lastscanned.com/status/uniuni-out-for-delivery) · [`Arrived at SpeedX Facility`](https://lastscanned.com/status/speedx-arrived-at-facility) · `Processing at Designated Facility` · `Match to Manifesto` · `Unable to Locate` - **Cross-Border (Cainiao, YunExpress, Yanwen, 4PX, CNE)**: [`Import customs clearance complete`](https://lastscanned.com/status/cne-express-import-customs-clearance-completed) · `Handed over to local carrier` · [`Arrived at linehaul office`](https://lastscanned.com/status/cainiao-leaving-from-departure-country) · [`Leaving from departure country/region`](https://lastscanned.com/status/cainiao-leaving-from-departure-country) - **National & Canadian (UPS, FedEx, Purolator, Intelcom/Dragonfly)**: `Delivered to PUDO` · `Shipment Exception — Weather Delay` · `On the way to your Dragonfly depot` - **European, UK & Nordic (InPost, Evri, DPD UK, Colissimo, PostNL, DHL Paket, PostNord)**: [`InPost Ready for collection (Paczkomat)`](https://lastscanned.com/status/inpost-ready-for-collection-parcel-locker) · [`Evri Parcel at ParcelShop`](https://lastscanned.com/status/evri-we-have-your-parcel-at-the-parcelshop) · [`DPD UK At our depot`](https://lastscanned.com/status/dpd-uk-at-our-depot) · [`Colissimo En cours d'acheminement`](https://lastscanned.com/status/la-poste-colissimo-votre-colis-est-en-cours-d-acheminement) · [`PostNL Parcel at sorting center`](https://lastscanned.com/status/postnl-parcel-is-at-sorting-center) · [`DHL Processed in export parcel center`](https://lastscanned.com/status/dhl-paket-processed-at-export-parcel-center) · [`PostNord Under transportation`](https://lastscanned.com/status/postnord-the-shipment-item-is-under-transportation) - **APAC, India & Global Cross-Border (Delhivery, Blue Dart, Yamato, Ninja Van, SFC, Winit, Meest, Hualei)**: [`Hualei 等待签收 (Waiting for sign-off = in_transit)`](https://lastscanned.com/status/hualei-waiting-for-sign-off) · [`Yamato 調査中 / 持戻`](https://lastscanned.com/status/yamato-transport-investigation-underway) · [`Ninja Van Processed at warehouse`](https://lastscanned.com/status/ninja-van-parcel-is-being-processed-at-warehouse) · [`Delhivery Received at Origin Center`](https://lastscanned.com/status/delhivery-shipment-received-at-origin-center) · [`Blue Dart Out For Delivery`](https://lastscanned.com/status/bluedart-shipment-out-for-delivery) · [`SFC Dispatched from sorting center`](https://lastscanned.com/status/sfc-sendfromchina-dispatched-from-sorting-center) · [`Winit Outbound from warehouse`](https://lastscanned.com/status/winit-outbound-from-warehouse) · [`Meest International sorting center`](https://lastscanned.com/status/meest-arrived-at-international-sorting-center) · [`Passport Cleared customs`](https://lastscanned.com/status/passport-shipping-cleared-customs) · [`Chit Chats Handed over to partner carrier`](https://lastscanned.com/status/chitchats-handed-over-to-partner-carrier) - **Chinese Express & Global Postal Gateways (STO, YTO, ZTO, Yunda, SF Express, Japan Post, Korea Post, SingPost, bpost, Correios, AusPost, Royal Mail, GLS, Sagawa)**: [`STO 快件已发车`](https://lastscanned.com/status/sto-express-sent-to-next-station) · [`YTO 快件已从转运中心发出`](https://lastscanned.com/status/yto-express-dispatched-from-sorting-center) · [`ZTO 快件已到达中转部`](https://lastscanned.com/status/zto-express-arrived-at-hub) · [`Yunda 快件正发往下一站`](https://lastscanned.com/status/yunda-express-in-transit-to-next-facility) · [`SF Express 快件在集散中心进行中转`](https://lastscanned.com/status/sf-express-shipment-in-transit-at-sorting-center) · [`Wanb Arrived at destination airport`](https://lastscanned.com/status/wanbexpress-arrived-at-destination-airport) · [`Japan Post Dispatch from outward office of exchange`](https://lastscanned.com/status/japan-post-dispatch-from-outward-office-of-exchange) · [`Korea Post Departure from outward office of exchange`](https://lastscanned.com/status/korea-post-departure-from-outward-office-of-exchange) · [`SingPost Despatched to overseas`](https://lastscanned.com/status/singpost-despatched-to-overseas) · [`bpost Arrived in country of destination`](https://lastscanned.com/status/bpost-your-parcel-has-arrived-in-the-country-of-destination) · [`Correios Objeto encaminhado para fiscalização aduaneira`](https://lastscanned.com/status/correios-objeto-encaminhado-para-fiscalizacao-aduaneira) · [`AusPost Transferred to await international departure`](https://lastscanned.com/status/auspost-transferred-to-await-international-departure) · [`Royal Mail Item Leaving the UK`](https://lastscanned.com/status/royal-mail-item-leaving-the-uk) · [`GLS Left the parcel center`](https://lastscanned.com/status/gls-the-parcel-has-left-the-parcel-center) · [`Sagawa 配達中 (Out for delivery)`](https://lastscanned.com/status/sagawa-express-out-for-delivery) - **SpeedPAK, SPX Express, European & Global Posts (Poste Italiane, Correos Express, CTT, CDEK, Pos Indonesia, PHLPost, Thailand Post, Chunghwa Post, Ukrposhta, Omniva)**: [`SpeedPAK Departed regional distribution center`](https://lastscanned.com/status/speedpak-departed-from-regional-distribution-center) · [`SPX Express Arrived at sorting facility`](https://lastscanned.com/status/spx-express-parcel-has-arrived-at-sorting-facility) · [`CNE Arrived at destination airport`](https://lastscanned.com/status/cne-express-arrived-at-destination-airport) · [`YunExpress Arrived at sort facility in destination country`](https://lastscanned.com/status/yunexpress-arrived-at-sort-facility-in-destination-country) · [`Evri At our local depot and on its way`](https://lastscanned.com/status/evri-your-parcel-is-at-our-local-depot-and-on-its-way) · [`Poste Italiane In lavorazione presso il Centro Operativo Postale`](https://lastscanned.com/status/poste-italiane-in-lavorazione-presso-il-centro-operativo-postale) · [`Correos Express En reparto`](https://lastscanned.com/status/correos-express-en-reparto) · [`CTT Em distribuição`](https://lastscanned.com/status/ctt-express-em-distribuicao) · [`CDEK Прибыл в сортировочный центр`](https://lastscanned.com/status/cdek-arrived-at-sorting-center) · [`Pos Indonesia Manifested`](https://lastscanned.com/status/pos-indonesia-manifested-at-origin-branch) · [`PHLPost Enroute to delivery office`](https://lastscanned.com/status/phlpost-enroute-to-delivery-office) · [`Thailand Post อยู่ระหว่างการขนส่ง`](https://lastscanned.com/status/thailand-post-in-transit-at-sorting-center) · [`Chunghwa Post Arrival at outward office of exchange`](https://lastscanned.com/status/chunghwa-post-arrival-at-outward-office-of-exchange) · [`Ukrposhta Processed at KYIV PI-1 / PI-2`](https://lastscanned.com/status/ukrposhta-processed-at-international-exchange-office) · [`Omniva Parcel arrived at parcel machine`](https://lastscanned.com/status/omniva-parcel-arrived-at-parcel-machine) Explore all 75 interactive scan status guides at [`https://lastscanned.com/status`](https://lastscanned.com/status). | [Yamato Transport (Kuroneko): `持ち戻り(ご不在) / Absence (Attempted Delivery)`](https://lastscanned.com/status/yamato-absence-attempted-delivery) | `exception` | 24 hours (redelivery upon request) | Request redelivery via Kuroneko Yamato web/LINE or Absentee Delivery Notice (不在連絡票) | | [Sagawa Express: `配達中 / Out for Delivery`](https://lastscanned.com/status/sagawa-out-for-delivery) | `out_for_delivery` | Same day by 21:00 JST | Await courier arrival at the designated time window | | [Japan Post: `保管 / Retention at Post Office`](https://lastscanned.com/status/japan-post-retention) | `exception` | Held for 7 calendar days | Submit redelivery request or collect with ID at the holding post office | | [CJ Logistics (대한통운): `배달출발 / Out for Delivery`](https://lastscanned.com/status/cj-logistics-in-delivery) | `out_for_delivery` | 2–6 hours | Courier is on the active delivery route; parcel will be delivered to door or designated safe place | | [Logen (로젠택배): `배달출발 / Out for Delivery`](https://lastscanned.com/status/logen-out-for-delivery) | `out_for_delivery` | Same day within 2–6 hours | No action required; Logen driver is completing local neighborhood delivery | | [Lotte Global Logistics (롯데택배): `배달출발 / Out for Delivery`](https://lastscanned.com/status/lotte-global-logistics-out-for-delivery) | `out_for_delivery` | Same day within 2–6 hours | No action required; Lotte courier is on route | | [Hanjin Express (한진택배): `배달출발 / Out for Delivery`](https://lastscanned.com/status/hanjin-express-out-for-delivery) | `out_for_delivery` | Same day within 2–6 hours | No action required; Hanjin courier is on route | | [Chunghwa Post (中華郵政): `投遞中 / Out for Delivery`](https://lastscanned.com/status/chunghwa-post-out-for-delivery) | `out_for_delivery` | Same business day | Ensure recipient or building concierge is available if signature/stamp is required | | [T-Cat (黑貓宅急便): `配送中 / Out for Delivery`](https://lastscanned.com/status/t-cat-out-for-delivery) | `out_for_delivery` | Same day within selected time slot | Keep phone reachable for T-Cat driver arrival call | | [HCT Logistics (新竹物流): `配送中 / Out for Delivery`](https://lastscanned.com/status/hct-logistics-out-for-delivery) | `out_for_delivery` | Same business day | Keep phone reachable for HCT driver delivery | | [Hongkong Post: `Arrived at delivery office / Out for delivery`](https://lastscanned.com/status/hongkong-post-out-for-delivery) | `out_for_delivery` | Same business day | Await postman delivery or iPostal Station SMS pickup code | | [SingPost: `Out for Delivery`](https://lastscanned.com/status/singpost-out-for-delivery) | `out_for_delivery` | Same business day by 22:00 SGT | Parcel will be delivered to letterbox, doorstep, or POPStation | | [Australia Post: `Awaiting collection at Post Office / Parcel Locker`](https://lastscanned.com/status/auspost-awaiting-collection) | `exception` | Held for 10 business days (Post Office) or 48 hours (Parcel Locker) | Bring photo ID or MyPost QR code to collect before return-to-sender | | [StarTrack: `On board for delivery`](https://lastscanned.com/status/star-track-on-board-for-delivery) | `out_for_delivery` | Same business day by 17:00–18:00 local | Ensure dock or residential recipient is available if Authority to Leave (ATL) is not enabled | | [NZ Post: `With courier for delivery`](https://lastscanned.com/status/nz-post-with-courier-for-delivery) | `out_for_delivery` | Same business day | Courier is on the local delivery run; check NZ Post authority to leave settings if away | # Watches and webhooks URL: https://docs.lastscanned.com/webhooks A watch follows a tracking number for you. Whether you paste numbers in the **[Watches Dashboard](https://app.lastscanned.com/watches)** or call `POST /v1/watches`, each number is looked up straight away and returns its current tracking result immediately—the same as `GET /v1/track`—so there is no waiting for a background crawl. After that we re-check it on an adaptive schedule and `POST` to your webhook whenever the status, the newest scan, or the estimated delivery changes. You don't need a watch to track a number. `GET /v1/track` stays the simplest way to answer *"where is it"* on demand. Watches are for when you'd rather be told—or when your operations team wants a live dashboard of active shipments. --- ## Managing Watches & Webhooks in the Web UI Dashboard (No Code Required) You can run your entire watch and webhook workflow directly in the browser at **[app.lastscanned.com](https://app.lastscanned.com)** without writing a line of code: - **[Watches (`app.lastscanned.com/watches`)](https://app.lastscanned.com/watches)**: - **Paste up to 100 tracking numbers at once**, with an optional **carrier** selector and a custom **label** (saved in `metadata.label`, such as an order number or customer name). - **Filter by All, Active, or Ended**: See each shipment's carrier badge, current normalized status, latest scan location and timestamp, and countdown to the next scheduled check (for example, `in 12 min`). - **Full scan timeline & one-click stop**: Click any watched number to expand its full chronological scan history, raw JSON payload, or click **Stop watching**. - **[Webhooks (`app.lastscanned.com/webhooks`)](https://app.lastscanned.com/webhooks)**: - **Endpoint URL & Payload Format Toggle**: Set your receiver URL and choose between **`lastscanned`** (`tracking.updated` & `watch.ended` events) or **`17TRACK`** (drop-in 17TRACK v2 `TRACKING_UPDATED` / `TRACKING_STOPPED` payload and `sign` header). - **Signing Secret & Test Pings**: Reveal, copy, or rotate your `whsec_…` signing secret and send a live `webhook.test` event to verify your endpoint responds `2xx`. - **30-Day Delivery Log & One-Click Resend**: Inspect every webhook delivery from the past 30 days (**Delivered**, **Retrying**, or **Failed**), HTTP status code, attempt count, and click **Resend** on any event. --- ## 1. Set your webhook via API ```bash curl -X PUT https://api.lastscanned.com/v1/webhook \ -H "Authorization: Bearer $LASTSCANNED_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/hooks/tracking"}' ``` The response has your signing `secret` (`whsec_…`). It stays the same when you change the URL; send `"rotateSecret": true` for a new one. `POST /v1/webhook/test` sends a `webhook.test` event and tells you what your endpoint answered. The dashboard's [Webhooks](https://app.lastscanned.com/webhooks) page does all of this too, and lists every delivery. ## 2. Watch numbers via API ```bash curl -X POST https://api.lastscanned.com/v1/watches \ -H "Authorization: Bearer $LASTSCANNED_KEY" \ -H "Content-Type: application/json" \ -d '{"trackingNumber": "541270563758", "metadata": {"order": "A1"}}' ``` You can also paste up to 100 numbers at once on the dashboard's [Watches](https://app.lastscanned.com/watches) page, which lists every watch with its latest scan and next check time. Send `"trackingNumbers": [...]` for up to 100 at once via API. `carrier` is optional, as with `/v1/track`. `metadata` is any JSON object under 2 KB, and comes back in every event for that watch. The response is the watch, with its first `result`: ```json { "id": "wat_109060ade9f9a48732117f7a", "trackingNumber": "541270563758", "carrier": "fedex", "status": "delivered", "active": false, "metadata": { "order": "A1" }, "endReason": "delivered", "result": { "carrier": "fedex", "status": "delivered", "...": "same shape as /v1/track" } } ``` Watching a number counts as one tracked number, like a lookup. The re-checks after that are free. An account can have 5,000 active watches. | Route | | | --- | --- | | `GET /v1/watches` | Active watches, newest first. `?active=false` for ended ones; `?limit=` (max 200), `?cursor=` from `nextCursor`. | | `GET /v1/watches/:id` | One watch with its last `result` or `error`. | | `DELETE /v1/watches/:id` | Stop watching. | ### How often we check | Status | Next check | | --- | --- | | `out_for_delivery` | 15 minutes | | `exception` | 30 minutes | | `in_transit` | 1 hour | | `label_created` | 2 hours | Container watches (`maersk`, `msc`, `cosco`, `evergreen`, `one`, `yangming`) are re-checked every 6 hours instead: hourly once the container is out for delivery, every 2 hours on an exception. The parcel schedule above doesn't apply to them. See [Container tracking](https://docs.lastscanned.com/container-tracking-api). Webhooks are sent when a scheduled check finds a change. They are not a live push from the carrier. A watch ends by itself when the package is delivered or returned, after 14 days with no carrier record, or after 90 days. ## Shipment email Shipment email is separate from the webhook above. Eligible Pro accounts can opt in on each watched shipment and get email at their verified account address when it is out for delivery, delivered, or has a shipment exception. Free accounts do not get shipment email, and neither do accounts that are not billed as Pro. Prepaid packs do not include it. You opt in per shipment on Watches after you sign in. We email only the verified address on your account, never a customer or any other recipient. Open [Watches](https://app.lastscanned.com/login?next=/watches). An API key cannot choose a recipient. You can newly monitor 10 shipments by email per account each billing period. That cap is 10 shipments, not 10 emails and not a limit on how many watches you can have. Out for delivery and delivered each email once per shipment. A shipment exception can email up to 5 times for that shipment, once per distinct exception, which is not a limit of 5 emails in total. Events already on the shipment when you opt in are not emailed. There is no email overage. Turning email on does not add a tracking charge, and hitting the cap only stops new shipment email. Tracking, watches, and webhooks continue. An enrollment keeps running into the next billing period without using another of the 10. A missing tracking record or a failed lookup is not a shipment exception and does not send one of these emails. Email uses the same watch schedule as your other checks. It is not a live push from the carrier, not real-time, and not a guarantee that the message arrives. If a send times out or the outcome is uncertain, that alert is not resent and can be missed. An address that bounces or is reported as spam is not emailed again. Shipment email is separate from webhooks. Webhooks still POST watch changes to your URL. Stopping shipment email leaves the watch and any webhook running. Pro still includes 1,000 unique tracking numbers per billing period, then $0.015 each, with no daily limit. See [Plans](https://docs.lastscanned.com/plans#shipment-email). ## Events ```json { "id": "evt_63e401d5f73a4c31ef8fa8d9", "type": "tracking.updated", "createdAt": "2026-10-27T18:20:36Z", "data": { "watch": { "id": "wat_109060ade9f9a48732117f7a", "trackingNumber": "541270563758", "carrier": "fedex", "metadata": { "order": "A1" } }, "previousStatus": "in_transit", "result": { "carrier": "fedex", "status": "delivered", "...": "same shape as /v1/track" } } } ``` - `tracking.updated`: something changed. The first successful check always sends one. - `watch.ended`: the watch stopped without a final status; `data.reason` is `not_found` or `expired`. Delivered and returned packages end with their last `tracking.updated`. ## Delivery and retries Any `2xx` within 10 seconds counts as delivered. Anything else is retried after 1, 5, 30, 120, 360 and 720 minutes, then marked failed. You can send any delivery again from the [Webhooks dashboard](https://app.lastscanned.com/webhooks) or with `POST /v1/webhook/deliveries/:id/retry`, and `GET /v1/webhook/deliveries` lists the last 30 days. A retry can arrive after a newer event, and in rare cases one event arrives twice. Deduplicate on the event id (also in the `Lastscanned-Event-Id` header) and order by `createdAt`. ## Signatures Every request carries `Lastscanned-Signature: t=,v1=`. `v1` is HMAC-SHA256 of `"."`, keyed with your secret. Check it against the raw body, before parsing, and reject old `t` values. ```js tab="Node" import crypto from "node:crypto"; function verify(rawBody, header, secret, toleranceSec = 300) { const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("="))); const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex"); const fresh = Math.abs(Date.now() / 1000 - Number(t)) < toleranceSec; return fresh && crypto.timingSafeEqual(Buffer.from(v1, "hex"), Buffer.from(expected, "hex")); } ``` ```python tab="Python" import hashlib, hmac, time def verify(raw_body: bytes, header: str, secret: str, tolerance: int = 300) -> bool: parts = dict(p.split("=", 1) for p in header.split(",")) expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + raw_body, hashlib.sha256).hexdigest() return abs(time.time() - int(parts["t"])) < tolerance and hmac.compare_digest(parts["v1"], expected) ``` ## 17TRACK format Select **17TRACK** on the [Webhooks dashboard](https://app.lastscanned.com/webhooks) or set `"format": "17track"` via API and the same events go out as 17TRACK's v2 webhook, so a receiver written for 17TRACK works unchanged: ```bash curl -X PUT https://api.lastscanned.com/v1/webhook \ -H "Authorization: Bearer $LASTSCANNED_KEY" \ -H "Content-Type: application/json" \ -d '{"format": "17track"}' ``` ```json { "event": "TRACKING_UPDATED", "data": { "number": "541270563758", "carrier": 100003, "param": null, "tag": "shop-1", "track_info": { "latest_status": { "status": "Delivered", "sub_status": "Delivered_Other", "sub_status_descr": "Delivered" }, "latest_event": { "time_iso": "2026-10-26T10:09:00-04:00", "time_utc": "2026-10-26T14:09:00Z", "description": "Delivered", "location": "OCALA, FL", "stage": "Delivered", "...": "" }, "time_metrics": { "...": "" }, "milestone": [ "..." ], "tracking": { "providers": [ { "provider": { "key": 100003, "name": "FedEx" }, "events": [ "..." ] } ] } } } } ``` - `tracking.updated` becomes `TRACKING_UPDATED`, and `watch.ended` becomes `TRACKING_STOPPED`. - `carrier` and `provider.key` are 17TRACK's numeric carrier codes. 347 of our carriers have one; the rest send `0`. - `tag` is your watch's `metadata.tag`, when that is a string. - Statuses map as `label_created` → `InfoReceived`, `in_transit` → `InTransit`, `out_for_delivery` → `OutForDelivery`, `delivered` → `Delivered`, `exception` → `Exception`, `returned` → `Exception` / `Exception_Returned`. - Requests carry 17TRACK's `sign` header, hex SHA-256 of `"/"`, as well as `Lastscanned-Signature`. Point your existing check at your lastscanned secret instead of your 17TRACK key. Coming from 17TRACK's `register` call? `POST /v1/watches` takes its place, and returns the tracking result in the same response instead of a queued registration. See [Migrating from 17TRACK](https://docs.lastscanned.com/migrate-from-17track). # Shopify, Gorgias, Zendesk & AI WISMO Integrations URL: https://docs.lastscanned.com/wismo-integrations Because `lastscanned` returns live carrier tracking **synchronously on a single `GET /v1/track/{number}` request**, you can wire it directly into storefront tracking pages, helpdesk HTTP actions, and AI WISMO (*"Where Is My Order?"*) agents without building a webhook database. ## 1. Shopify Storefront & Help Center Embed (`/pages/track-order`) Create a new page in **Shopify Admin → Online Store → Pages** (for example `/pages/track-order`), switch the editor to **Show HTML (`<>`)**, and paste: ```html ``` ### Replacing 17TRACK's `externalcall.js` (`window.YQV5`) in Shopify If your theme currently loads `//www.17track.net/externalcall.js` and calls `YQV5.trackSingle`, change only the script `src` to `https://lastscanned.com/embed.js`. Our built-in `window.YQV5` shim mounts the clean `lastscanned` lookup widget inside your existing `#YQContainer` div with zero ad banners. You can customize height and default carrier in the [Tracking Widget Generator](https://lastscanned.com/tools/tracking-widget-generator). ## 2. Gorgias & Zendesk HTTP Action (Live Ticket Enrichment) When a shopper opens a *"Where is my package?"* ticket, configure an HTTP Action in **Gorgias (Settings → HTTP Integration)** or **Zendesk (Admin Center → Webhooks / Actions)**: - **Method**: `GET` - **URL**: `https://api.lastscanned.com/v1/track/{{ticket.customer.integrations.shopify.orders[0].fulfillments[0].tracking_number}}` - **Headers**: - `Authorization`: `Bearer lsk_live_YOUR_API_KEY` - `Accept`: `application/json` Because `lastscanned` responds with a normalized 7-value `status` (`pre_shipment`, `in_transit`, `out_for_delivery`, `delivered`, `exception`, `expired`, `unknown`), verbatim `statusDescription`, and extracted `message` (such as a secondary USPS or UniUni handoff barcode), your macro or AI agent can immediately answer the customer with the latest scan city and timestamp. ## 3. Vercel AI SDK (`tool()`) for Autonomous WISMO Agents Give your Next.js or Node.js support agent a synchronous package-tracking tool in 15 lines of TypeScript: ```ts import { tool } from "ai"; import { z } from "zod"; export const trackPackageTool = tool({ description: "Track a package across 549 global, regional, and cross-border carriers (USPS, UPS, FedEx, DHL, OnTrac, Veho, UniUni, SpeedX, GOFO, OSM, Pitney Bowes, Cainiao, YunExpress, Yanwen).", parameters: z.object({ trackingNumber: z.string().describe("The package tracking number"), carrier: z .string() .optional() .describe("Optional carrier slug override (e.g. osm or pitneybowes for 92... USPS consolidator barcodes)"), }), execute: async ({ trackingNumber, carrier }) => { const url = new URL(`https://api.lastscanned.com/v1/track/${encodeURIComponent(trackingNumber)}`); if (carrier) url.searchParams.set("carrier", carrier); const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); return res.json(); }, }); ``` Or skip custom tool definitions altogether and point any MCP-compatible agent runtime at our hosted remote Streamable HTTP MCP server: [`https://mcp.lastscanned.com/mcp`](https://lastscanned.com/tools/mcp-config-generator). ## 4. Handling `926129…` / `927489…` Consolidator Blind Spots Automatically If your fulfillment warehouse or 3PL ships via **OSM Worldwide**, **Pitney Bowes**, **DHL eCommerce**, or **UPS Mail Innovations** using shared `92…` USPS barcodes, query both legs in a single batch call so your customer never stares at *"Shipping Label Created, USPS Currently Awaiting Package"* for 5 days: ```ts // Query USPS and OSM Worldwide in parallel when USPS returns pre_shipment on a 92... barcode const uspsRes = await fetch(`https://api.lastscanned.com/v1/track/${num}`, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }).then((r) => r.json()); if (uspsRes.status === "pre_shipment" && /^9[23]\d{18,24}$/.test(num)) { const osmRes = await fetch(`https://api.lastscanned.com/v1/track/${num}?carrier=osm`, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }).then((r) => r.json()); if (osmRes.events?.length > 0) return osmRes; } ``` # WISMO AI agents & synchronous tracking URL: https://docs.lastscanned.com/wismo Customer support workflows—especially **"Where Is My Order?" (WISMO)** AI agents, helpdesk bots, and order-status pages—are triggered when a shopper asks about a package right now. `lastscanned` is designed for **synchronous, single-request tracking**: pass a tracking number to `GET /v1/track/{trackingNumber}` (or call the `track_package` MCP tool) and get the normalized status, estimated delivery, cross-border handoff number, and full scan history in one response across all [supported carriers](https://docs.lastscanned.com/carriers). ## 1. Synchronous `GET` vs. webhook pre-registration Most legacy tracking aggregators are built around asynchronous webhook pipelines: 1. You `POST` a tracking number to register a tracker on their platform. 2. Their queue schedules an asynchronous background job. 3. You wait seconds or minutes for an inbound webhook before your app has any scan events to show the customer. That model breaks down in interactive AI agents, customer support chat, and on-demand order lookup routes where a customer pastes a tracking number or asks *"Where is my order #10492?"* and expects an immediate answer. | Requirement | Legacy webhook trackers (`POST` + webhook) | `lastscanned` (`GET /v1/track/{number}`) | |---|---|---| | First-time lookup latency | Queued (`PENDING` until async webhook fires) | Immediate live response in the same HTTP call | | State required in your database | Must store tracker IDs, webhook secrets & state | Stateless—pass the raw tracking number on demand | | Carrier credential setup | Often requires your own shipper OAuth keys | Zero carrier credentials required across every supported carrier | | Billing on repeated status checks | Per-shipment registration or per-call fees | **Pro ($4.99/mo)**: 1,000 unique numbers included; unlimited re-polls all month | | AI agent protocol support | Custom wrapper required | Built-in remote MCP server (`https://mcp.lastscanned.com/mcp`) | ## 2. Normalized status lifecycle (`status` enum) Every carrier uses different internal event codes and phrasing. `lastscanned` normalizes both the top-level parcel state (`status`) and each individual scan event (`events[].status`) into a deterministic 7-value enum so your WISMO agent or support router can branch cleanly: | `status` value | Lifecycle stage | Typical customer meaning | Recommended WISMO agent action | |---|---|---|---| | `label_created` | Pre-transit (`pre_transit`) | The shipper generated a label, but the carrier has not scanned the physical parcel yet. | Reassure the customer that the order is packed and awaiting carrier pickup; if it's a `92…` USPS consolidator label, check `?carrier=osm` or `?carrier=pitneybowes` for middle-mile sort scans. | | `in_transit` | In transit | The parcel is moving through origin, linehaul, customs, or regional sort facilities. | Share the latest scan location (`events[0].location`), timestamp (`events[0].localTime`), and `estimatedDelivery` date. | | `out_for_delivery` | Out for delivery | The parcel is on the local delivery vehicle for final-mile drop-off today. | Let the customer know delivery is expected today and highlight any delivery window in `estimatedDelivery` / `estimatedDeliveryAt`. | | `delivered` | Delivered | The parcel was delivered (`deliveredAt`, `deliveredAtLocal`, and `signedBy` when available). | Confirm delivery time and city/state (`destination`). If the customer says it is missing, check cross-border handoffs (`message`) or wait 24 hours before opening a claim. | | `exception` | Exception / delay | Address issue, customs hold, weather delay, business closed, or failed delivery attempt. | Surface `statusDescription` and `events[0].description` immediately; escalate to human support or prompt the customer to confirm their delivery address. | | `returned` | Returned to sender | The parcel is being routed back or has been returned to the sender. | Trigger a reshipment or refund workflow and notify support with the return scan timestamp. | | `unknown` | Unknown / expired | The carrier returned a response whose status text did not map to a standard stage, or the tracking number has expired from active status. | Fall back to displaying `statusDescription` and the latest entry in `events` verbatim. | > **What if a brand-new label isn't in the carrier's system yet?** When a merchant prints a label that the carrier has not indexed yet, the API returns HTTP `404` with `error.code: "not_found"`. In a WISMO bot, treat `not_found` on orders created within the last 24–48 hours as pre-transit ("Your shipping label was just created and is waiting for the carrier's first scan"). ## 3. Resolving cross-border handoffs & the `"USPS Currently Awaiting Package"` consolidator black hole ### A. Cross-border last-mile handoffs (`message`) One of the most common WISMO failure modes happens on cross-border e-commerce shipments ([`yanwen`](https://docs.lastscanned.com/carriers/yanwen), [`cainiao`](https://docs.lastscanned.com/carriers/cainiao), [`yunexpress`](https://docs.lastscanned.com/carriers/yunexpress), [`4px`](https://docs.lastscanned.com/carriers/4px), [`cne`](https://docs.lastscanned.com/carriers/cne), [`sunyou`](https://docs.lastscanned.com/carriers/sunyou), [`ubi`](https://docs.lastscanned.com/carriers/ubi), [`asendia`](https://docs.lastscanned.com/carriers/asendia)). A shopper receives a tracking number like `YT2412345678901234`, `3A5V700123456`, or `AHOY7K2M9Q4T`, sees "Arrived at destination airport" or "Handed over to local courier," and asks support which company is actually delivering to their door. When a cross-border carrier hands a parcel to a domestic last-mile carrier (such as **[USPS](https://docs.lastscanned.com/carriers/usps)**, **[UniUni](https://docs.lastscanned.com/carriers/uniuni)**, **[GOFO](https://docs.lastscanned.com/carriers/gofo)**, **[SpeedX](https://docs.lastscanned.com/carriers/speedx)**, **[OnTrac](https://docs.lastscanned.com/carriers/ontrac)**, **[Cirro](https://docs.lastscanned.com/carriers/cirro)**, **[Canada Post](https://docs.lastscanned.com/carriers/canadapost)**, **[Intelcom / Dragonfly](https://docs.lastscanned.com/carriers/intelcom)**, **Australia Post**, or **Royal Mail**), `lastscanned` automatically extracts the handoff information and populates the top-level `message` field: ```json { "carrier": "yunexpress", "trackingNumber": "YT2412345678901234", "status": "in_transit", "statusDescription": "In transit", "service": "YunExpress Standard", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "estimatedDelivery": null, "estimatedDeliveryAt": null, "message": "Handed to UniUni as UUSC000019638703", "events": [ { "timestamp": "2026-10-25T18:40:00Z", "localTime": "2026-10-25T14:40:00", "status": "in_transit", "description": "Arrived at local facility", "location": "LOS ANGELES, CA, US", "code": null } ] } ``` 1. **Always inspect `message`** on `yanwen`, `4px`, `cainiao`, `yunexpress`, `cne`, `sunyou`, `ubi`, and `asendia` responses. 2. **Surface the doorstep carrier and secondary tracking number** directly to the customer (for example, *"Your package cleared customs via YunExpress and was handed to UniUni for local delivery under tracking number `UUSC000019638703`"*). 3. **Optionally chain a second lookup**: if the customer wants the granular local doorstep scans, call `GET /v1/track/UUSC000019638703` (or `track_package`) with the secondary tracking number extracted from `message`. ### B. Solving `"USPS Currently Awaiting Package"` on `92…` consolidator labels (`?carrier=osm` / `?carrier=pitneybowes`) The second major WISMO spike comes from domestic parcels shipped through postal consolidators like **[OSM Worldwide](https://docs.lastscanned.com/carriers/osm)** and **[Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes)**. These parcels carry a standard 22-digit `92…` USPS IMpb barcode (or 30-digit `420` + ZIP + `92…`), so querying USPS directly returns `status: "label_created"` with *"Picked Up by Shipping Partner, USPS Awaiting Item"* (`"USPS Currently Awaiting Package"`) for 3–7 days while the consolidator trucks the parcel across the country. In your WISMO agent: - If a `92…` [USPS](https://docs.lastscanned.com/carriers/usps) lookup returns `status: "label_created"` and the scan text mentions `"OSM WORLDWIDE"`, `"PITNEY BOWES"`, or `"Shipping Partner"`, immediately query the exact same `92…` number with **`?carrier=osm`** or **`?carrier=pitneybowes`** (or pass `carrier: "osm"` / `"pitneybowes"` in MCP). - You will get back the live middle-mile sort center arrivals/departures (e.g. `Glendale Heights, IL`, `Atlanta, GA`, `Monroe Twp, NJ`) and the consolidator's `estimatedDelivery` date so your AI agent can give the shopper a real transit update instead of repeating *"USPS is still waiting for your package."* ## 4. Copy-paste integration patterns ### Option A: Remote MCP server (zero code) If your AI agent or support platform supports the Model Context Protocol (Streamable HTTP), point it directly at `https://mcp.lastscanned.com/mcp`. Your agent immediately gains `track_package`, `track_packages` (up to 100 numbers per call), and `list_carriers`. ```json tab="Standard MCP (Bearer Header)" { "mcpServers": { "lastscanned": { "url": "https://mcp.lastscanned.com/mcp", "headers": { "Authorization": "Bearer lsk_live_YOUR_API_KEY" } } } } ``` ```text tab="Claude / ChatGPT connectors (OAuth)" Server URL: https://mcp.lastscanned.com/mcp Authentication: OAuth (sign in to lastscanned and choose Allow) ``` ```bash tab="Claude Code CLI" claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp \ --header "Authorization: Bearer lsk_live_YOUR_API_KEY" ``` ### Option B: TypeScript / Next.js Route Handler & AI SDK tool For custom support bots, Shopify/order portals, or serverless API routes, call `GET https://api.lastscanned.com/v1/track/{trackingNumber}` directly from your server: ```ts export interface TrackingEvent { timestamp: string | null; localTime: string | null; status: | "label_created" | "in_transit" | "out_for_delivery" | "delivered" | "exception" | "returned" | "unknown"; description: string; location: string | null; code: string | null; } export interface TrackingResponse { carrier: string; trackingNumber: string; status: TrackingEvent["status"]; statusDescription: string; service: string | null; deliveredAt: string | null; deliveredAtLocal: string | null; signedBy: string | null; destination: { city: string | null; state: string | null; country: string | null; } | null; estimatedDelivery: string | null; estimatedDeliveryAt: string | null; message?: string; events: TrackingEvent[]; } export async function getOrderTracking( trackingNumber: string, carrier?: string, ): Promise { const url = new URL( `https://api.lastscanned.com/v1/track/${encodeURIComponent(trackingNumber.trim())}`, ); if (carrier) url.searchParams.set("carrier", carrier); const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}`, }, // Fresh status on customer inquiry cache: "no-store", }); if (!res.ok) { const err = await res.json().catch(() => null); throw new Error(err?.error?.message ?? `Tracking lookup failed (${res.status})`); } return res.json() as Promise; } ``` Because the **Pro plan ($4.99/month)** bills per **unique tracking number per billing period** (with 1,000 unique numbers included and $0.015 per extra unique number), your WISMO bot can call `getOrderTracking()` every time a customer refreshes their order page or asks for an update without paying per poll. # 17FEIA Tracking API & MCP URL: https://docs.lastscanned.com/carriers/17feia Query live **17FEIA** (`17feia`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `17feia` | | **Brand aliases** | 17FEIA, Feia, 17feia.com | | **Category** | Cross-border e-commerce parcels (China to Europe) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=FEISZ1709287291YQ,FEISZ1709287291YQ` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^FEI[A-Z]{2}\d{10}YQ$/` | none | `FEISZ1709287291YQ` | | **Pass 2 (`mayMatch`)** | none | none | none | `FEI + 2 letters + 10 digits + YQ` numbers belong to 17FEIA alone, so `?carrier=17feia` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/FEISZ1709287291YQ?carrier=17feia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "17feia", "trackingNumber": "FEISZ1709287291YQ", "status": "delivered", "statusDescription": "Delivered.", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-23T11:43:00", "signedBy": null, "destination": null, "message": "Handed to DPD-DE as FEISZ1709287291YQ", "events": [ { "timestamp": null, "localTime": "2026-10-23T11:43:00", "status": "delivered", "description": "Delivered.", "location": "Etten-Leur (NL), NL", "code": "SIGNING_SUCCESS" }, { "timestamp": null, "localTime": "2026-10-23T09:08:00", "status": "out_for_delivery", "description": "Out for delivery.", "location": "Etten-Leur (NL)", "code": "IN_TRANSIT" }, { "timestamp": "2026-09-21T13:16:14Z", "localTime": "2026-09-21T21:16:14", "status": "label_created", "description": "Item information received.", "location": "ShenZhen, CN", "code": null } ] } ``` ## Notes - **Handoff**: `message` names the last-mile carrier and its number (for example `"Handed to DPD-DE as FEISZ1709287291YQ"`). Pass that number to `GET /v1/track/{number}` (with `?carrier=` when it is not auto-detected) for the carrier's own scans. - **Time zone**: 17FEIA writes step times as wall-clock. Only steps logged in China (`+08:00`) carry a UTC `timestamp`; other steps have `localTime` only, because the page's offset for them is the destination line's, not the step's. - **Forecasts**: "Estimated departure date" rows are forecasts, not scans, and are left out. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # 2GO Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/2go Query live **2GO Express** (`2go`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `2go` | | **Brand aliases** | 2GO, 2GO Express, 2go.com.ph | | **Category** | Philippines express and freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=C1867094M,C1867094M` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^[A-Z]\d{7}[A-Z]$/` | none | `C1867094M` | 2GO Express numbers are only a loose fallback; pass `?carrier=2go` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/C1867094M?carrier=2go" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "2go", "trackingNumber": "C1867094M", "status": "delivered", "statusDescription": "Parcel has been delivered", "service": null, "deliveredAt": "2026-10-06T11:22:11Z", "deliveredAtLocal": "2026-10-06T19:22:11", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-06T11:22:11Z", "localTime": "2026-10-06T19:22:11", "status": "delivered", "description": "Parcel has been delivered", "location": null, "code": null }, { "timestamp": "2026-10-06T11:18:30Z", "localTime": "2026-10-06T19:18:30", "status": "out_for_delivery", "description": "Parcel is out for delivery", "location": null, "code": null }, { "timestamp": "2026-09-11T14:30:43Z", "localTime": "2026-09-11T22:30:43", "status": "in_transit", "description": "Parcel has arrived at MANILA HUB", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: scan times are Philippine time (`Asia/Manila`, UTC+8); `timestamp` is converted from that. - **Detection**: the shape is common, so it is only a loose fallback (`mayMatch`); pass `?carrier=2go`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # 4-72 Tracking API & MCP URL: https://docs.lastscanned.com/carriers/472 Query live **4-72** (`472`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `472` | | **Brand aliases** | 4-72, 472, Servicios Postales Nacionales, SPN, Colombia Post | | **Category** | Colombian national post (Servicios Postales Nacionales) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RP208806075SG,RP208806075SG` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10 ending `CO` | valid S10 check digit | `RP208806075SG` | | **Pass 2 (`mayMatch`)** | none | none | none | Valid S10 codes ending `CO` belong to 4-72 alone, so `?carrier=472` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RP208806075SG?carrier=472" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "472", "trackingNumber": "RP208806075SG", "status": "delivered", "statusDescription": "Digitalizado", "service": null, "deliveredAt": "2026-05-16T23:25:51Z", "deliveredAtLocal": "2026-05-16T18:25:51", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-17T03:38:54Z", "localTime": "2026-05-16T22:38:54", "status": "in_transit", "description": "Digitalizado", "location": "CD.BARRANQUILLA", "code": null }, { "timestamp": "2026-05-16T23:25:51Z", "localTime": "2026-05-16T18:25:51", "status": "delivered", "description": "Entregado", "location": "CD.BARRANQUILLA", "code": null }, { "timestamp": "2026-05-10T04:25:00Z", "localTime": "2026-05-09T23:25:00", "status": "in_transit", "description": "Admitido", "location": "UAC.CENTRO", "code": null } ] } ``` ## Notes - **Foreign codes**: 4-72 also tracks the S10 codes of posts that send mail to Colombia (for example `...SG`). Those are claimed by other carriers or none, so pass `?carrier=472`. - **Time zone**: Colombian time (UTC-5, no daylight saving); `timestamp` is converted from it. - **After delivery**: the site keeps logging return routing (`TRANSITO(DEV)`) on delivered items; scans after the day of the delivery are dropped, and the delivered scan decides the status. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # 4PX Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/4px Query live **4PX Worldwide Express** (`4px`, 递四方) cross-border package status, scan history, and **domestic last-mile handoff numbers** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 18-character `4PX…CN` tracking numbers, repairs 4PX's cross-timezone chronological sorting bug, and returns a normalized `TrackingResult` JSON payload. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `4px` | | **Brand & service aliases** | 4PX Express, 4PX Worldwide Express (递四方), `4PX…CN` | | **Category** | China cross-border e-commerce logistics consolidator | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=4PX...CN,4PX...CN` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for 4PX Express - **Fixes 4PX's broken cross-timezone scan ordering**: 4PX's upstream API computes its `tkDate` epoch by interpreting every scan's local wall-clock time (`tkDateStr`) as Beijing time (`UTC+8`)—ignoring the scan's actual `tkTimezone` (`UTC-05:00`). Because US local wall-clock times are 12–13 hours behind Shenzhen, 4PX sorts Chinese export scans *above* US last-mile scans that occurred hours later in real UTC time. `lastscanned` ignores the broken `tkDate` epoch, computes true UTC from `tkDateStr` + `tkTimezone`, and re-sorts the timeline in true chronological order. - **Surfaces last-mile carrier & exchange number in `message`**: When 4PX hands a parcel to USPS, UniUni, or another domestic carrier, `lastscanned` extracts both `channelContact` (the carrier name) and `serverCode` (the domestic tracking number) into `message`. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) 4PX is evaluated **sixteenth (#16)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^4PX\d{13}CN$/i` (`4PX` + 13 digits + `CN` = 18 chars) | — | `4PX3002491827361CN`, `4PX3002790888841CN` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=4px` optional vs required? - **Optional (auto-detected)**: All 18-character `4PX` + 13 digits + `CN` tracking numbers auto-detect in Pass 1. - **Required (`?carrier=4px`)**: When querying 4PX's system using the domestic last-mile barcode (e.g. a USPS `92…` or Royal Mail S10 number that was inducted by 4PX) or a custom merchant order number. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/4PX3002790888841CN?carrier=4px" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/4PX3002790888841CN?carrier=4px", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.message, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "4PX3002491827361CN" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "4px", "trackingNumber": "4PX3002790888841CN", "status": "delivered", "statusDescription": "Delivered, In/At Mailbox", "service": null, "deliveredAt": "2026-10-24T19:22:00Z", "deliveredAtLocal": "2026-10-24T14:22:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "estimatedDelivery": null, "message": "Handed to USPS as 9261290312839104827163", "events": [ { "timestamp": "2026-10-24T19:22:00Z", "localTime": "2026-10-24T14:22:00", "status": "delivered", "description": "Delivered, In/At Mailbox", "location": "DALLAS, TX 75201", "code": "FPX_L_ok" }, { "timestamp": "2026-10-24T11:15:00Z", "localTime": "2026-10-24T06:15:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "DALLAS, TX 75201", "code": "FPX_I_RC" }, { "timestamp": "2026-10-20T16:40:00Z", "localTime": "2026-10-21T00:40:00", "status": "in_transit", "description": "Depart from facility to service provider.", "location": "Shenzhen, China", "code": "FPX_C_BTC" }, { "timestamp": "2026-10-18T03:12:00Z", "localTime": "2026-10-18T11:12:00", "status": "label_created", "description": "Shipment information received", "location": null, "code": "FPX_O_CR" } ] } ``` > **Raw status & scan codes**: `events[].code` preserves 4PX's `tkCode` (`"FPX_O_CR"` → `label_created`, `"FPX_C_..."` / `"FPX_M_..."` → `in_transit`, `"FPX_I_RC"` → `out_for_delivery` when out for delivery, `"FPX_L_ok"` → `delivered`, `"FPX_L_RPI"` → `returned`). ## Chaining Last-Mile Handoffs (`message`) When 4PX assigns a secondary domestic tracking number (`serverCode`) different from the `4PX…CN` number, `lastscanned` populates `message` with: - `"Handed to USPS as 9261290312839104827163"` (when `channelContact` identifies the last-mile carrier), or - `"Handed to the destination carrier as "` You can pass that secondary tracking number directly into a follow-up `GET /v1/track/{serverCode}` call to retrieve native last-mile scans from [USPS](https://docs.lastscanned.com/carriers/usps), [UniUni](https://docs.lastscanned.com/carriers/uniuni), [GOFO](https://docs.lastscanned.com/carriers/gofo), or [OnTrac](https://docs.lastscanned.com/carriers/ontrac). ## Related Resources - **Live browser lookup tool**: [Track a 4PX Express package live on lastscanned.com/lookup/4px](https://lastscanned.com/lookup/4px) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # 4Sides Tracking API & MCP URL: https://docs.lastscanned.com/carriers/4sides Query live **4Sides** (`4sides`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `4sides` | | **Brand aliases** | 4Sides, 4sides.ru, Четыре стороны | | **Category** | Russian fulfilment and parcel delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=FS027259187RU,FS027259187RU` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^F[SE]\d{9}RU$/` | none | `FS027259187RU` | | **Pass 2 (`mayMatch`)** | none | none | none | `F + S or E + 9 digits + RU` numbers belong to 4Sides alone, so `?carrier=4sides` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/FS027259187RU?carrier=4sides" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "4sides", "trackingNumber": "FS027259187RU", "status": "delivered", "statusDescription": "Попытка доставки (Доставлено, получил: Иванов)", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-28", "signedBy": "Иванов", "destination": { "city": "Миасс", "state": "Челябинская область", "country": "Россия" }, "events": [ { "timestamp": null, "localTime": "2026-02-28", "status": "delivered", "description": "Попытка доставки (Доставлено, получил: Иванов)", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-17", "status": "in_transit", "description": "Приём (В СЦ, в городе: Челябинск (Челябинская область))", "location": "Челябинск (Челябинская область)", "code": null }, { "timestamp": null, "localTime": "2026-02-15", "status": "label_created", "description": "Сбор (В СЦ)", "location": null, "code": null } ] } ``` ## Notes - **Dates only**: scans have a date but no time of day, so `timestamp` is `null` and `localTime` is the date (`2026-02-28`). - **Order**: scans on the same day keep their order from the carrier, newest first. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # 5Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/5post Query live **5Post** (`5post`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `5post` | | **Brand aliases** | 5Post, 5post.ru, X5 5Post, Пятёрочка | | **Category** | Russian pickup-point parcel network (X5 Group) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=99990009139643,99990009139643` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | 5Post is not auto-detected from the number alone: pass `?carrier=5post`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/99990009139643?carrier=5post" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "5post", "trackingNumber": "99990009139643", "status": "delivered", "statusDescription": "Получен", "service": null, "deliveredAt": "2026-08-10T09:39:16Z", "deliveredAtLocal": "2026-08-10T12:39:16", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-08-10T09:39:16Z", "localTime": "2026-08-10T12:39:16", "status": "delivered", "description": "Получен", "location": null, "code": "DONE" }, { "timestamp": "2026-08-09T21:32:17Z", "localTime": "2026-08-10T00:32:17", "status": "exception", "description": "Доставлен в пункт выдачи", "location": null, "code": "DELIVERED" }, { "timestamp": "2026-07-18T15:35:11Z", "localTime": "2026-07-18T18:35:11", "status": "in_transit", "description": "Обрабатывается на складе РЦ Богородск ХАБ", "location": "РЦ Богородск ХАБ", "code": "WAREHOUSE_PROCESSING" }, { "timestamp": "2026-07-13T12:57:44Z", "localTime": "2026-07-13T15:57:44", "status": "label_created", "description": "Ожидается передача заказа в 5post", "location": null, "code": "INFORMATION_RECEIVED" } ] } ``` ## Notes - **Not auto-detected**: a 5Post number is the order number the shop gave the parcel, with no shape of its own. Pass `?carrier=5post`. - **Pickup point**: "delivered to the pickup point" (`DELIVERED`) is a wait for collection, so its event is `exception`; the parcel is `delivered` when the customer collects it (`DONE`). - **Time zone**: times carry Moscow offsets (`+03:00`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # A1 POST Tracking API & MCP URL: https://docs.lastscanned.com/carriers/a1post Query live **A1 POST** (`a1post`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `a1post` | | **Brand aliases** | A1 POST, A1Post, a1post.bg | | **Category** | Bulgarian cross-border parcels (A1 Trade) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=9214490221582714146891,9214490221582714146891` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | A1 POST is not auto-detected from the number alone: pass `?carrier=a1post`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/9214490221582714146891?carrier=a1post" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "a1post", "trackingNumber": "9214490221582714146891", "status": "in_transit", "statusDescription": "The shipment has been processed, A1 POST", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-07-06T07:41:00Z", "localTime": "2026-07-06T10:41:00", "status": "in_transit", "description": "The shipment has been processed, A1 POST", "location": null, "code": null }, { "timestamp": "2026-07-04T17:40:00Z", "localTime": "2026-07-04T20:40:00", "status": "in_transit", "description": "Shipment information uploaded to A1 POST", "location": null, "code": null } ] } ``` ## Notes - **Not auto-detected**: A1 POST numbers are often the partner carrier's own (for example a USPS number), so pass `?carrier=a1post`. - **Handoff**: when the partner's tracking link carries a different number, `message` names the partner and that number. - **Time zone**: Bulgarian time (`Europe/Sofia`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ABF Freight Tracking API & MCP URL: https://docs.lastscanned.com/carriers/abffreight Query live **ABF Freight** (`abffreight`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `abffreight` | | **Brand aliases** | ABF Freight, ABF, ArcBest, arcb.com | | **Category** | US LTL freight (ArcBest) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=075989007,075989007` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ABF Freight is not auto-detected from the number alone: pass `?carrier=abffreight`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/075989007?carrier=abffreight" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "abffreight", "trackingNumber": "075989007", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-08T15:45:00Z", "deliveredAtLocal": "2026-10-08T09:45:00", "signedBy": "J. Smith", "destination": { "city": "EL PASO", "state": "TX", "country": "US" }, "events": [ { "timestamp": "2026-10-08T15:45:00Z", "localTime": "2026-10-08T09:45:00", "status": "delivered", "description": "Delivered", "location": "EL PASO, TX", "code": null }, { "timestamp": "2026-10-02T19:05:46Z", "localTime": "2026-10-02T14:05:46", "status": "in_transit", "description": "Picked Up", "location": "HOUSTON, TX", "code": null } ] } ``` ## Notes - **Detection**: PRO numbers are 9 digits like other carriers' references, so pass `?carrier=abffreight`. - **Milestones**: the page returns milestone times (picked up, in/out at each end, delivered), not a scan list, so the events are those milestones. - **Time zone**: the API stamps Central time; each end's service-center offset from Central is applied, so `localTime` is the clock at that terminal. - **Signature**: `signedBy` is the name in "Received by ...". ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ACS Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/acscourier Query live **ACS Courier** (`acscourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `acscourier` | | **Brand aliases** | ACS, ACS Courier Greece, ACS Cyprus | | **Category** | Domestic and international parcels (Greece, Cyprus) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: ACS numbers are 10 digits, a shape that DHL Express and others share, so pass `?carrier=acscourier`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/9814268030?carrier=acscourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "acscourier", "trackingNumber": "9814268030", "status": "delivered", "statusDescription": "Delivery to consignee", "service": null, "deliveredAt": "2026-10-13T16:50:59Z", "deliveredAtLocal": "2026-10-13T19:50:59", "signedBy": "AB******CD", "destination": null, "events": [ { "timestamp": "2026-10-13T16:50:59Z", "localTime": "2026-10-13T19:50:59", "status": "delivered", "description": "Delivery to consignee", "location": "KOS", "code": "ΚΩ-1" }, { "timestamp": "2026-10-13T06:09:08Z", "localTime": "2026-10-13T09:09:08", "status": "out_for_delivery", "description": "On delivery", "location": "KOS", "code": "ΚΩ-1" }, { "timestamp": "2026-10-10T18:09:32Z", "localTime": "2026-10-10T21:09:32", "status": "in_transit", "description": "Arrival to", "location": "KOS", "code": "ΚΩ-1" }, { "timestamp": "2026-10-08T16:22:23Z", "localTime": "2026-10-08T19:22:23", "status": "in_transit", "description": "Arrival-departure from HUB", "location": "HUB ATHINON", "code": "Α1-2" }, { "timestamp": "2026-10-08T09:42:26Z", "localTime": "2026-10-08T12:42:26", "status": "label_created", "description": "Print ACSConnect/WebTools label", "location": "ELEFSINA", "code": "ΑΥ-1" } ] } ``` ## Notes - **Source**: the JSON that the ACS tracking page (`cyp.acscourier.net`) calls. It needs the page's public token, which `lastscanned` reads from the home page first. No account is needed. - **Time zone**: Greece and Cyprus both run on EET/EEST, so scan clocks are converted from `Europe/Athens`. - **Status**: `isDelivered` and `isReturned` from ACS decide the parcel status; "On delivery" scans map to `out_for_delivery`. - **`signedBy`**: ACS prints the receiver masked (`AB******CD`); it is passed through as is. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # A. Duie Pyle Tracking API & MCP URL: https://docs.lastscanned.com/carriers/aduiepyle Query live **A. Duie Pyle** (`aduiepyle`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `aduiepyle` | | **Brand aliases** | A. Duie Pyle, Duie Pyle, ADP, aduiepyle.com | | **Category** | US northeast LTL freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=711370361,711370361` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | A. Duie Pyle is not auto-detected from the number alone: pass `?carrier=aduiepyle`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/711370361?carrier=aduiepyle" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "aduiepyle", "trackingNumber": "711370361", "status": "delivered", "statusDescription": "DELIVERED", "service": null, "deliveredAt": "2026-04-15T17:23:00Z", "deliveredAtLocal": "2026-04-15T13:23:00", "signedBy": null, "destination": { "city": "BELTSVILLE", "state": "MD", "country": "US" }, "events": [ { "timestamp": "2026-04-15T17:23:00Z", "localTime": "2026-04-15T13:23:00", "status": "delivered", "description": "DELIVERED", "location": "BELTSVILLE, MD", "code": null }, { "timestamp": "2026-04-15T11:44:00Z", "localTime": "2026-04-15T07:44:00", "status": "out_for_delivery", "description": "OUT FOR DELIVERY", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-04-13", "status": "in_transit", "description": "PICKED UP", "location": "CELINA, OH", "code": null } ] } ``` ## Notes - **Detection**: PRO numbers are 8-9 digits like other freight carriers' references, so pass `?carrier=aduiepyle`. - **Dates only**: a scan at midnight (the pickup) is a date with no time of day. - **Appointment window**: the "delivery appointment window" row is a schedule, not a scan, and is left out. - **Interline**: a PRO handed to another carrier is reported in `message`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # AEX Paraguay Tracking API & MCP URL: https://docs.lastscanned.com/carriers/aexparaguay Query live **AEX Paraguay** (`aexparaguay`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `aexparaguay` | | **Brand aliases** | AEX, AEX Paraguay, Asuncion Express, aex.com.py | | **Category** | Paraguay express courier (Asuncion Express) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=A001500000,A001500000` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^A\d{9}$/` | none | `A001500000` | AEX Paraguay numbers are only a loose fallback; pass `?carrier=aexparaguay` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/A001500000?carrier=aexparaguay" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "aexparaguay", "trackingNumber": "A001500000", "status": "delivered", "statusDescription": "Entrega Realizada", "service": null, "deliveredAt": "2026-04-12T00:06:00Z", "deliveredAtLocal": "2026-04-11T20:06:00", "signedBy": "Maria Gomez", "destination": null, "events": [ { "timestamp": "2026-04-12T00:06:00Z", "localTime": "2026-04-11T20:06:00", "status": "delivered", "description": "Entrega Realizada", "location": null, "code": "Entregada" }, { "timestamp": "2026-04-11T09:56:00Z", "localTime": "2026-04-11T05:56:00", "status": "out_for_delivery", "description": "Asignado a repartidor para entrega", "location": null, "code": "Asignado a repartidor para entrega" }, { "timestamp": "2026-04-10T16:03:13Z", "localTime": "2026-04-10T12:03:13", "status": "label_created", "description": "El remitente generó la etiqueta de envío y el paquete está pendiente de retiro por AEX", "location": null, "code": "Guía generada" } ] } ``` ## Notes - **Detection**: the `A` + 9 digits shape is only a loose fallback (`mayMatch`); pass `?carrier=aexparaguay`. - **Time zone**: Paraguayan time (`America/Asuncion`); `timestamp` is converted from it. - **Signature**: `signedBy` is the name in "Recibido por". ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Airpak Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/airpakexpress Query live **Airpak Express** (`airpakexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `airpakexpress` | | **Brand aliases** | Airpak, Airpak Express SG, Airpak Express Malaysia | | **Category** | Express and freight (Singapore, Malaysia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: Airpak numbers are 11 or 12 digits, a shape other carriers share, so pass `?carrier=airpakexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/200129496556?carrier=airpakexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "airpakexpress", "trackingNumber": "200129496556", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-20T08:00:00Z", "deliveredAtLocal": "2026-03-20T16:00:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-20T08:00:00Z", "localTime": "2026-03-20T16:00:00", "status": "delivered", "description": "Delivered", "location": "Kota Kinabalu, Malaysia", "code": null }, { "timestamp": "2026-03-20T01:35:00Z", "localTime": "2026-03-20T09:35:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "Kota Kinabalu, Malaysia", "code": null }, { "timestamp": "2026-03-19T07:25:00Z", "localTime": "2026-03-19T15:25:00", "status": "in_transit", "description": "Arrived Hub", "location": "Kota Kinabalu, Malaysia", "code": null }, { "timestamp": "2026-03-17T15:59:00Z", "localTime": "2026-03-17T23:59:00", "status": "in_transit", "description": "Uplift", "location": "Kuala Lumpur, Malaysia", "code": null }, { "timestamp": "2026-03-17T09:40:00Z", "localTime": "2026-03-17T17:40:00", "status": "in_transit", "description": "Arrived Hub", "location": "Kuala Lumpur, Malaysia", "code": null } ] } ``` ## Notes - **Source**: the server-rendered GETOnline tracking page (`tracking.airpak-express.com`). Each scan is read from the event blocks the page prints. No account is needed. - **Time zone**: Singapore and Malaysia are both UTC+8, so scan clocks are converted from `Asia/Singapore`. - **Not found**: the page answers `No tracking found for this number.` with no scans, which becomes `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # AIT Worldwide Tracking API & MCP URL: https://docs.lastscanned.com/carriers/aitworldwide Query live **AIT Worldwide** (`aitworldwide`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `aitworldwide` | | **Brand aliases** | AIT Worldwide, AIT Worldwide Logistics, FasTrak, aitworldwide.com | | **Category** | International freight forwarding (FasTrak) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=S02500000,S02500000` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^S\d{8}$/` | none | `S02500000` | AIT Worldwide numbers are only a loose fallback; pass `?carrier=aitworldwide` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/S03000000?carrier=aitworldwide" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "aitworldwide", "trackingNumber": "S03000000", "status": "delivered", "statusDescription": "DELIVERY COMPLETED", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-09T00:00:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-09T00:00:00", "status": "delivered", "description": "DELIVERY COMPLETED", "location": null, "code": "DCF" }, { "timestamp": null, "localTime": "2026-10-07T09:56:00", "status": "out_for_delivery", "description": "DEPARTED DESTINATION PORT", "location": null, "code": "Z14" }, { "timestamp": null, "localTime": "2026-09-30T07:11:00", "status": "in_transit", "description": "BOOKING ACCEPTED", "location": null, "code": "PCA" } ] } ``` ## Notes - **Detection**: the `S` + 8 digits shape is only a loose fallback (`mayMatch`); pass `?carrier=aitworldwide`. - **Time zone**: FasTrak gives no zone for its scans, so `timestamp` is `null` and `localTime` is the printed time. - **Status**: AIT's status groups `DEL` (delivered) and `OFD` (out for delivery) set the event status; other events are read from their wording. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # AJEX Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ajex Query live **AJEX** (`ajex`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ajex` | | **Brand aliases** | AJEX, Aj-ex, aj-ex.com | | **Category** | Saudi Arabia, UAE and Bahrain express and e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=AJA100000201697,AJA100000201697` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^AJ[AS]\d{12}$/` | none | `AJA100000201697` | | **Pass 2 (`mayMatch`)** | none | none | none | `AJA…`/`AJS…` numbers belong to AJEX alone, so `?carrier=ajex` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/AJA100000201697?carrier=ajex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ajex", "trackingNumber": "AJA100000201697", "status": "delivered", "statusDescription": "Shipment delivered", "service": "Domestic e-Commerce Express", "deliveredAt": "2026-03-12T14:21:08Z", "deliveredAtLocal": "2026-03-12T17:21:08", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-12T14:21:08Z", "localTime": "2026-03-12T17:21:08", "status": "delivered", "description": "Shipment delivered", "location": "Riyadh", "code": "80" }, { "timestamp": "2026-03-12T08:02:40Z", "localTime": "2026-03-12T11:02:40", "status": "out_for_delivery", "description": "Shipment assigned to driver", "location": "Riyadh", "code": "204" }, { "timestamp": "2026-03-11T19:44:12Z", "localTime": "2026-03-11T22:44:12", "status": "in_transit", "description": "Shipment arrived at Riyadh Hub", "location": "Riyadh", "code": "50" }, { "timestamp": "2026-03-10T09:15:00Z", "localTime": "2026-03-10T12:15:00", "status": "in_transit", "description": "Shipment picked up", "location": "Jeddah", "code": "54" }, { "timestamp": "2026-03-09T13:30:00Z", "localTime": "2026-03-09T16:30:00", "status": "label_created", "description": "Shipment pickup scheduled", "location": "Jeddah", "code": "100" } ] } ``` ## Notes - **Route**: the customer-portal API behind aj-ex.com's tracking box. `lastscanned` logs in with the page's visitor token (an AES-CBC encryption of a constant, with the key published in the site's own script), sends the waybill encrypted the same way, and decrypts the answer. No account. - **Time zone**: event times are epoch instants, so `timestamp` is exact. `localTime` is that instant in the shipment's country (Saudi Arabia and Bahrain UTC+3, UAE UTC+4). - **Status**: AJEX's status codes (100 pickup scheduled, 54 picked up, 50/618 hub scans, 204 assigned to driver, 70 undelivered, 80 delivered) are mapped; the "Undelivered (reason)" scans become `exception`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Ali Business Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/alibusiness Query live **Ali Business Logistics** (`alibusiness`) package status and scan history in a single synchronous `GET` request or MCP tool call. Ali Business Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=alibusiness`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `alibusiness` | | **Brand aliases** | Ali Business Logistics, | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=alibusiness` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=alibusiness` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Ali Business Logistics tracking numbers have no shape of their own, so always pass `?carrier=alibusiness`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Ali Business Logistics in one request. - **Platform**: Ali Business Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Allegro One Tracking API & MCP URL: https://docs.lastscanned.com/carriers/allegroone Query live **Allegro One** (`allegroone`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `allegroone` | | **Brand aliases** | Allegro One Kurier, Allegro One Box, Allegro Delivery | | **Category** | Domestic parcels (Poland) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^ALE\d{12}$/` | none | `A004U2GH32` | | **Pass 2 (`mayMatch`)** | `/^A[0D][0-9A-Z]{8}$/` and `/^AD[0-9A-Z]{15}$/` | none | `A001AB2CD3` | `matches` takes `ALE` plus 12 digits. `mayMatch` takes `A0` or `AD` followed by 8 letters or digits, or `AD` followed by 15. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/A001AB2CD3?carrier=allegroone" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "allegroone", "trackingNumber": "A001AB2CD3", "status": "delivered", "statusDescription": "Parcel has been delivered", "service": null, "deliveredAt": "2026-06-29T15:21:41Z", "deliveredAtLocal": "2026-06-29T17:21:41", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-06-29T15:21:41Z", "localTime": "2026-06-29T17:21:41", "status": "delivered", "description": "Parcel has been delivered", "location": null, "code": null }, { "timestamp": "2026-06-29T11:52:57Z", "localTime": "2026-06-29T13:52:57", "status": "exception", "description": "Parcel is awaiting pick-up", "location": null, "code": null }, { "timestamp": "2026-06-29T05:26:15Z", "localTime": "2026-06-29T07:26:15", "status": "out_for_delivery", "description": "Parcel has been released for delivery", "location": null, "code": null }, { "timestamp": "2026-06-18T22:15:40Z", "localTime": "2026-06-19T00:15:40", "status": "in_transit", "description": "Dispatched from sorting center", "location": null, "code": null }, { "timestamp": "2026-06-18T09:06:52Z", "localTime": "2026-06-18T11:06:52", "status": "label_created", "description": "Parcel has been prepared by the sender", "location": null, "code": null } ] } ``` ## Notes - **Source**: the JSON behind allegro.pl's own tracking page (`edge.allegro.pl/ad/tracking`). No account is needed. - **Time zone**: Allegro sends UTC times. `timestamp` is that time and `localTime` is the same instant on the `Europe/Warsaw` clock, because Allegro One delivers within Poland. - **Not found**: an unknown number returns an empty `status` list, which becomes `not_found`. - **Scans carry no place**: `location` is `null` on every event. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Amazon Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/amazon Query live **Amazon Logistics** (`amazon`) package status and scan history for **Amazon Shipping** and **Amazon Multi-Channel Fulfillment (MCF)** parcels (`TBA…`, `TBC…`, `TBM…`) in a single synchronous `GET` request or MCP tool call. `lastscanned` returns a normalized `TrackingResult` JSON payload—without requiring an Amazon Selling Partner API (SP-API) developer role, AWS IAM signing, or Login with Amazon (LWA) OAuth tokens. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `amazon` | | **Brand & service aliases** | Amazon Logistics, Amazon Shipping (SWA), Amazon Multi-Channel Fulfillment (MCF), `TBA` / `TBC` / `TBM` | | **Category** | National e-commerce & merchant fulfillment carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=TBA...,TBA...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Amazon Shipping & MCF - **Skip Amazon SP-API & Amazon Shipping API onboarding**: Integrating directly with Amazon's Shipping v2 API requires an approved Amazon Developer profile, LWA OAuth 2.0 client credentials, and merchant-specific authorization grants. With `lastscanned`, any developer or AI agent can track public `TBA`/`TBC`/`TBM` shipments immediately via `GET /v1/track/TBA335250058574?carrier=amazon`. - **Unpack double-encoded JSON & event codes**: Amazon's public tracker returns nested stringified JSON (`progressTracker` and `eventHistory`) with raw camelCase event codes (`CreationConfirmed`, `PickupDone`, `OutForDelivery`). `lastscanned` parses, deduplicates, and normalizes them into standard statuses and human-readable descriptions. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Amazon is evaluated **fifth (#5)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^TB[ACM]\d{12}$/i` (`TBA` for US, `TBC` for Canada, or `TBM` for Mexico + 12 digits = 15 characters) | — | `TBA319482710492`, `TBC102938475610`, `TBM908172635412` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=amazon` optional vs required? - **Optional (auto-detected)**: All 15-character `TBA`, `TBC`, and `TBM` tracking numbers auto-detect in Pass 1. No other carrier uses a `TB` prefix. - **Important scope note — Amazon Shipping & MCF vs retail `amazon.com` orders**: Only parcels shipped via **Amazon Shipping** (Ship With Amazon) or **Amazon Multi-Channel Fulfillment (MCF)**—i.e., orders fulfilled for third-party merchants—have public tracking records. Ordinary retail `amazon.com` marketplace orders are private to the buyer's Amazon account and return `404 not_found` (`"Amazon has no public record of that number (amazon.com orders are tracked only in the buyer's account)"`). Shipments older than 45 days also return `404 not_found`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/TBA335250058574?carrier=amazon" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/TBA335250058574?carrier=amazon", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.service, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "TBA319482710492" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "amazon", "trackingNumber": "TBA335250058574", "status": "delivered", "statusDescription": "Delivered", "service": "Amazon Shipping", "deliveredAt": "2026-10-24T18:06:14Z", "deliveredAtLocal": null, "signedBy": "Front porch", "destination": { "city": "SEATTLE", "state": "WA", "country": "US" }, "estimatedDelivery": null, "events": [ { "timestamp": "2026-10-24T18:06:14Z", "localTime": null, "status": "delivered", "description": "Delivered", "location": "SEATTLE, WA, US", "code": "Delivered" }, { "timestamp": "2026-10-24T14:22:05Z", "localTime": null, "status": "out_for_delivery", "description": "Out for delivery", "location": "SEATTLE, WA, US", "code": "OutForDelivery" }, { "timestamp": "2026-10-24T09:11:40Z", "localTime": null, "status": "in_transit", "description": "Arrived at Amazon facility", "location": "SUMNER, WA, US", "code": "Received" }, { "timestamp": "2026-10-22T21:15:00Z", "localTime": null, "status": "label_created", "description": "Shipping label created", "location": null, "code": "CreationConfirmed" } ] } ``` > **Raw status & scan codes**: Each event in `events[]` preserves Amazon's raw `eventCode` in `code` (`"CreationConfirmed"`, `"PickupDone"`, `"Received"`, `"Departed"`, `"InTransit"`, `"OutForDelivery"`, `"Delivered"`, `"DeliveryAttempted"`, `"Returned"`) and translates it into a clean human-readable `description` (appending any `subReasonCode` details). ## Carrier-Specific Status & Integration Notes - **UTC-only timestamps (`localTime: null`)**: Amazon reports scan timestamps strictly in UTC (which `track.amazon.com` converts to the viewer's browser timezone client-side). Therefore, `timestamp` and `deliveredAt` are always exact UTC ISO 8601 strings (`"2026-10-24T18:06:14Z"`), while `localTime` and `deliveredAtLocal` are `null`. - **Service differentiation (`Amazon Shipping` vs `Amazon Multi-Channel Fulfillment`)**: `service` automatically distinguishes between `"Amazon Shipping"` and `"Amazon Multi-Channel Fulfillment"` based on the shipment's `trackerSource`. ## Related Resources - **Live browser lookup tool**: [Track an Amazon package live on lastscanned.com/lookup/amazon](https://lastscanned.com/lookup/amazon) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Amerijet Tracking API & MCP URL: https://docs.lastscanned.com/carriers/amerijet Query live **Amerijet** (`amerijet`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `amerijet` | | **Brand aliases** | Amerijet, Amerijet International, 810 AWB | | **Category** | Air cargo (Miami, Caribbean and Latin America) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=81042330212,81042330212` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^810\d{8}$/` | the last digit is the first seven digits of the serial mod 7 (IATA) | `81042330212` | | **Pass 2 (`mayMatch`)** | none | none | none | `810…` air waybills with a valid mod-7 check digit belong to Amerijet. The `81042330212` form with a dash is accepted. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/81042330212?carrier=amerijet" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "amerijet", "trackingNumber": "81042330212", "status": "delivered", "statusDescription": "Delivered at SDQ", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-05T16:10:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-05T16:10:00", "status": "delivered", "description": "Delivered at SDQ", "location": "SDQ", "code": "Delivered" }, { "timestamp": null, "localTime": "2026-03-05T07:51:00", "status": "in_transit", "description": "Arrived in SDQ", "location": "SDQ", "code": "Arrived" }, { "timestamp": null, "localTime": "2026-03-04T19:56:00", "status": "in_transit", "description": "Departed from MIA", "location": "MIA", "code": "Departed" }, { "timestamp": null, "localTime": "2026-03-04T09:48:00", "status": "in_transit", "description": "Arrived in MIA", "location": "MIA", "code": "Arrived" }, { "timestamp": null, "localTime": "2026-03-02T17:14:00", "status": "in_transit", "description": "Departed from JFK", "location": "JFK", "code": "Departed" }, { "timestamp": null, "localTime": "2026-03-01T10:23:00", "status": "in_transit", "description": "Accepted at JFK", "location": "JFK", "code": "Accepted" }, { "timestamp": null, "localTime": "2026-02-27T17:41:00", "status": "label_created", "description": "Booked", "location": "JFK", "code": "Booked" } ] } ``` ## Notes - **Route**: the JSON that amerijet.com's tracking box calls (`getTrackingInfo?awbNo=`). No account. - **Time zone**: events carry the station's wall-clock time with no zone, so only `localTime` is set. - **Events**: each row is a cargo event at a station (`Booked`, `Accepted`, `Departed`, `Arrived`, `Delivered`); the row's origin field repeats the shipment origin, so the station is used as the location. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # AM Home Delivery Tracking API & MCP URL: https://docs.lastscanned.com/carriers/amhomedelivery Query live **AM Home Delivery** (`amhomedelivery`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `amhomedelivery` | | **Brand aliases** | AM Home Delivery, AM Trucking, amtrucking.com | | **Category** | US white-glove and big-and-bulky home delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=41230987,41230987` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^AM\d{9}$/` | none | `41337661` | Plain 8-digit BOL numbers are shared with other carriers and are not auto-detected: pass `?carrier=amhomedelivery`. The `AM`-prefixed form is only a loose fallback. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/41230987?carrier=amhomedelivery" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "amhomedelivery", "trackingNumber": "41230987", "status": "delivered", "statusDescription": "COMPLETED", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-19T14:05:00", "signedBy": null, "destination": { "city": "Chicago", "state": "Illinois", "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-02-19T14:05:00", "status": "delivered", "description": "COMPLETED", "location": "Chicago, Illinois 60601", "code": null }, { "timestamp": null, "localTime": "2026-02-19T08:12:00", "status": "in_transit", "description": "Scheduled", "location": "Elk Grove Village, Illinois 60007", "code": null }, { "timestamp": null, "localTime": "2026-02-16T18:35:00", "status": "in_transit", "description": "Received in Delivery Terminal", "location": "Elk Grove Village, Illinois 60007", "code": null }, { "timestamp": null, "localTime": "2026-02-10T11:54:00", "status": "in_transit", "description": "In-Transit to Delivery Terminal", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-05T12:44:00", "status": "in_transit", "description": "Received in Consolidation Center", "location": "Linden, New Jersey 07036", "code": null } ] } ``` ## Notes - **Route**: `www.amtrucking.com/track-number.php?cnumber=` redirects to a NetSuite suitelet page; its "Tracking Details" table is read. No account. - **Time zone**: the table gives the depot's wall-clock time with no zone, so only `localTime` is set and `timestamp` is `null`. - **Status**: `COMPLETED` is the last-mile delivery scan and maps to `delivered`; `Scheduled` is an in-transit step. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Grupo ampm Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ampm Query live **Grupo ampm** (`ampm`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ampm` | | **Brand aliases** | Grupo ampm, ampm, AMPM Mexico, grupoampm.com | | **Category** | Mexican parcel delivery and Cainiao last mile | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CNA000002663047,CNA000002663047` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^(CNA\d{12}|IDTS\d{14})$/` | none | `CNA000002663047` | ampm numbers are 10-30 letters and digits in no fixed pattern. The `CNA…` and `IDTS…` forms are only a loose fallback; otherwise pass `?carrier=ampm`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CNA000002663047?carrier=ampm" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ampm", "trackingNumber": "CNA000002663047", "status": "delivered", "statusDescription": "ENTREGADO", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-04-09T13:22:10", "signedBy": null, "destination": { "city": "Guadalajara", "state": "Jalisco", "country": "MX" }, "estimatedDelivery": "2026-04-10T23:59:00", "events": [ { "timestamp": null, "localTime": "2026-04-09T13:22:10", "status": "delivered", "description": "ENTREGADO", "location": "HUB MEXICO", "code": "EN" }, { "timestamp": null, "localTime": "2026-04-09T08:40:31", "status": "out_for_delivery", "description": "CON MENSAJERO DE ENTREGA", "location": "HUB MEXICO", "code": "CM" }, { "timestamp": null, "localTime": "2026-04-08T17:05:12", "status": "in_transit", "description": "PROCESADO EN INSTALACIONES", "location": "HUB MEXICO", "code": "PI" }, { "timestamp": null, "localTime": "2026-04-07T16:42:43", "status": "in_transit", "description": "ENTRADA A CENTRO OPERATIVO", "location": "HUB MEXICO", "code": "AE" } ] } ``` ## Notes - **Route**: the `grupoampm.com/rastreador/` page is server-rendered; its MOVIMIENTOS table (date, code, movement, office) is read. No account. - **Time zone**: the page gives no zone, so only `localTime` is set. - **Status**: the carrier's codes are not obvious (`EN` reads `DEVUELTO`, returned), so the Spanish wording drives the status: `ENTREGADO` delivered, `CON MENSAJERO` out for delivery, `DEVUELTO`/`DEVOLUCION`/`RETORNO` returned, `DESTRUIDO` exception. - **ETA**: `estimatedDelivery` is the page's "Fecha Compromiso de Entrega" while the parcel is undelivered. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Andreani Tracking API & MCP URL: https://docs.lastscanned.com/carriers/andreani Query live **Andreani** (`andreani`) package status and scan history in a single synchronous `GET` request or MCP tool call. Andreani numbers are not auto-detected: Andreani's 15-digit numbers share a shape with FedEx, so they are never auto-detected. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `andreani` | | **Brand & service aliases** | Andreani, Andreani envíos (`andreani.com`) | | **Category** | Argentine parcel and logistics carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=andreani` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=360002623161340,...&carrier=andreani` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Andreani - **Same data as the Andreani tracking page**: stage-by-stage events ("Pendiente de ingreso", "En camino", "En distribución", "Entregado") without an Andreani account. - **Argentine local times with a UTC timestamp**: Argentina has a single zone, so every scan gets both `localTime` and `timestamp`. ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=andreani`)** | Andreani shipment numbers (15 digits starting with `36`) | — | `360002623161340` | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/360002623161340?carrier=andreani" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/360002623161340?carrier=andreani", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "360002623161340", "carrier": "andreani" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "andreani", "trackingNumber": "360002623161340", "status": "out_for_delivery", "statusDescription": "Tu envío salió a distribución", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-25T12:10:00Z", "localTime": "2026-10-25T09:10:00", "status": "out_for_delivery", "description": "Tu envío salió a distribución", "location": null, "code": "1" }, { "timestamp": "2026-10-24T20:30:00Z", "localTime": "2026-10-24T17:30:00", "status": "in_transit", "description": "Tu envío llegó a la sucursal de destino", "location": null, "code": "1" }, { "timestamp": "2026-10-22T14:00:00Z", "localTime": "2026-10-22T11:00:00", "status": "label_created", "description": "Andreani recibió la información de tu envío", "location": null, "code": "0" } ] } ``` ## Notes - **Status** comes from the current stage Andreani reports (`procesoActual`); it falls back to the newest event's wording. - **No match** is a `404 not_found`: Andreani answers an unknown number with an empty body. ## Related Resources - **Live browser lookup tool**: [Track a Andreani package live on lastscanned.com/lookup/andreani](https://lastscanned.com/lookup/andreani) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Anjun Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/anjun Query live **Anjun Logistics** (`anjun`) package status and scan history in a single synchronous `GET` request or MCP tool call. Anjun is a Shenzhen cross-border logistics company; the lookup takes the number printed on its label. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `anjun` | | **Brand aliases** | Anjun, Anjun Logistics, Shenzhen Anjun, 安骏物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=anjun` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=anjun` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Anjun numbers have no shape that other carriers do not also use, so always pass `?carrier=anjun`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/AJ260917112216701?carrier=anjun" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "anjun", "trackingNumber": "AJ260917112216701", "status": "in_transit", "statusDescription": "Departed from transit hub", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "DE" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-22T08:15:00", "status": "in_transit", "description": "Departed from transit hub", "location": "Frankfurt", "code": "transport" }, { "timestamp": null, "localTime": "2026-10-18T19:02:00", "status": "label_created", "description": "Order information received", "location": "Shenzhen", "code": "forecast" } ] } ``` ## Notes - **Time zone**: scan times come with no zone, so `localTime` is the carrier's clock time and `timestamp` is `null`. - **Codes**: `code` is Anjun's stage code (`forecast`, `transport`, `customs_buckle`, `arrive_to_collect`, `delivered`, and so on). Customs holds, failed deliveries, pickup-point arrivals and returns map to `exception` or `returned`. - **Access**: the carrier's tracking service asks for a time-based token that its own page computes; `lastscanned` builds the same token, so no account is needed. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # An Post (Ireland) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/anpost Query live **An Post** (`anpost`, Ireland's national post) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending `IE` (for example `CD009466316IE`) in Pass 1. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `anpost` | | **Brand & service aliases** | An Post, Irish Post, An Post Parcels, An Post Track & Trace | | **Category** | Regional national post (Ireland) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (auto-detected for S10 numbers ending `IE`) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CD009466316IE,CD009466316IE` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=anpost`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10 `/^[A-Z]{2}\d{9}IE$/` | S10 mod-11 | `CD009466316IE` | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=anpost`)** | Other numbers An Post tracks (for example parcels it receives from foreign posts under another barcode) | — | — | - **Optional (auto-detected)**: S10 numbers ending `IE` with a valid check digit. - **Required (`?carrier=anpost`)**: any An Post number that is not an `IE` S10 number. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/CD009466316IE?carrier=anpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "CD009466316IE" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "anpost", "trackingNumber": "CD009466316IE", "status": "in_transit", "statusDescription": "Item sorted at Dublin Mail Centre", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-10-25T22:41:00.000Z", "localTime": "2026-10-25T23:41:00", "status": "in_transit", "description": "Item sorted at Dublin Mail Centre", "location": "Dublin Mail Centre", "code": "15" } ] } ``` ## Notes - **Scan times**: An Post prints Irish local time with no offset. `lastscanned` applies `Europe/Dublin`, so `timestamp` (UTC) and `localTime` are both set. - **Delivery attempts**: A failed delivery (for example a "Sorry we missed you" card) is reported as `exception`, with the reason appended to the description. - **Unknown numbers**: A number An Post has no record of returns `not_found`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # AnserX Tracking API & MCP URL: https://docs.lastscanned.com/carriers/anserx Query live **AnserX** (`anserx`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `anserx` | | **Brand aliases** | AnserX, Anser X, BTY, oms.anserx.com | | **Category** | China cross-border e-commerce logistics (to Mexico and elsewhere) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=BTYCN0092384464YQ,BTYCN0092384464YQ` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^BTYCN\d{10}YQ$/` | none | `BTYCN0092384464YQ` | | **Pass 2 (`mayMatch`)** | none | none | none | `BTYCN…YQ` numbers belong to AnserX alone, so `?carrier=anserx` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/BTYCN0092384464YQ?carrier=anserx" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "anserx", "trackingNumber": "BTYCN0092384464YQ", "status": "delivered", "statusDescription": "Parcel has been delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-01T13:32:36", "signedBy": null, "destination": { "city": null, "state": null, "country": "MX" }, "events": [ { "timestamp": null, "localTime": "2026-03-01T13:32:36", "status": "delivered", "description": "Parcel has been delivered", "location": "Guadalajara, 45650", "code": "BTY_LASTMILE_DELIVERED" }, { "timestamp": null, "localTime": "2026-02-27T17:57:33", "status": "out_for_delivery", "description": "Parcel currently being delivered", "location": "Guadalajara, 45650", "code": "BTY_LASTMILE_DELIVERING" }, { "timestamp": null, "localTime": "2026-02-24T16:51:01", "status": "in_transit", "description": "The courier has received this parcel for delivery and will set a delivery time shortly", "location": "MX", "code": "BTY_LASTMILE_TRANSIT" }, { "timestamp": null, "localTime": "2026-02-13T12:20:10", "status": "in_transit", "description": "Arrived at destination port", "location": "MX", "code": "BTY_LINE_ARRIVED" }, { "timestamp": null, "localTime": "2026-02-08T09:24:20", "status": "in_transit", "description": "Hand over to airline", "location": "CN", "code": "BTY_LINE_HANDOVER" }, { "timestamp": null, "localTime": "2026-02-04T19:05:19", "status": "label_created", "description": "Shipment information received", "location": "CN", "code": "BTY_ORDER_CREATED" } ] } ``` ## Notes - **Route**: the JSON behind `oms.anserx.com/tracking`; plain GET, no account. - **Time zone**: China-side scans and last-mile scans use different clocks and the feed gives no zone, so only `localTime` is set. - **Status**: from the carrier's codes (`BTY_ORDER_CREATED`, `BTY_WAREHOUSE_*`, `BTY_LINE_*`, `BTY_EXCC_*`, `BTY_LASTMILE_TRANSIT/DELIVERING/DELIVERED`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Anteraja Tracking API & MCP URL: https://docs.lastscanned.com/carriers/anteraja Query live **Anteraja** (`anteraja`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `anteraja` | | **Brand aliases** | AnterAja, Anter Aja, Anteraja Indonesia | | **Category** | Domestic parcels (Indonesia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: Anteraja numbers are 14 digits, a shape that is not exclusive, so pass `?carrier=anteraja`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/11004398718482?carrier=anteraja" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "anteraja", "trackingNumber": "11004398718482", "status": "delivered", "statusDescription": "Delivery sukses oleh KURIR dan paket telah diterima oleh penerima.", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-02T14:55:11", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-02T14:55:11", "status": "delivered", "description": "Delivery sukses oleh KURIR dan paket telah diterima oleh penerima.", "location": null, "code": "250" }, { "timestamp": null, "localTime": "2026-10-02T14:30:54", "status": "out_for_delivery", "description": "KURIR sudah ditugaskan dan paket akan segera diantar ke penerima.", "location": null, "code": "240" }, { "timestamp": null, "localTime": "2026-10-02T14:17:04", "status": "in_transit", "description": "Paket sedang diproses di Hub Jakarta Barat", "location": null, "code": "300" }, { "timestamp": null, "localTime": "2026-09-21T17:44:49", "status": "in_transit", "description": "Paket sudah di-pickup oleh KURIR.", "location": null, "code": "200" }, { "timestamp": null, "localTime": "2026-09-20T16:55:55", "status": "label_created", "description": "Pickup sudah di-request oleh shipper.", "location": null, "code": "100" } ] } ``` ## Notes - **Source**: the call Anteraja's mobile app makes (`POST api.anteraja.id/order/tracking`). No account is needed. - **Status codes**: `tracking_code` 100 and 150 are `label_created`, 200 and the hub codes 300, 332 and 334 are `in_transit`, 240 is `out_for_delivery`, 250 is `delivered`, and 500 (held at a hub) is `exception`. - **Wording**: the scan text is Indonesian; the English field Anteraja offers is empty in practice. - **Time zone**: Indonesia spans three zones and the scan does not say which applies, so only `localTime` is given and `timestamp` is `null`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # APC Postal Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/apc Query live **APC Postal Logistics** (`apc`) package status, scan history, and the **final-mile carrier's tracking number** in a single synchronous `GET` request or MCP tool call. APC numbers have no shape of their own, so pass `?carrier=apc`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `apc` | | **Brand aliases** | APC Postal Logistics, APC-PLI, Hermes by BorderGuru | | **Category** | US international mail & parcel consolidator | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=apc` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=apc` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | | **Explicit (`?carrier=apc`)** | the number printed on the APC label | none | the label's tracking number | APC labels carry the number of whichever postal service or courier is used, so `?carrier=apc` is always required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SPRCA00001928099?carrier=apc" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "apc", "trackingNumber": "SPRCA00001928099", "status": "in_transit", "statusDescription": "Arrived at destination country", "service": "Priority", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "CA" }, "message": "Handed to Canada Post as SPRCA00001928099", "events": [ { "timestamp": "2026-10-25T18:22:00Z", "localTime": "2026-10-25T14:22:00", "status": "in_transit", "description": "Arrived at destination country", "location": "Toronto, ON, CA", "code": "AR" } ] } ``` ## Notes - **Delivered**: the scan that APC's own page marks as the delivery step sets `delivered`; other scans are classified from their wording. - **Unknown numbers**: APC's page answers a missing number and a failed upstream with the same error, so both are reported as `not_found`. - **Handoff**: `message` carries the final-mile carrier and number when APC gives one; pass it to `GET /v1/track/{number}` for that carrier's scans. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # APC Overnight Tracking API & MCP URL: https://docs.lastscanned.com/carriers/apcovernight Query live **APC Overnight** (`apcovernight`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `apcovernight` | | **Brand aliases** | APC Overnight, APC, APC Choice, apc-overnight.com | | **Category** | UK next-day parcel network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2022012001915490000159,2022012001915490000159` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^20[12]\d(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{14}$/` | none | `2022012001915490000159` | The 22-digit waybill (booking date `20YYMMDD` plus a 14-digit consignment) is shared with other carriers, so it is only a loose fallback: pass `?carrier=apcovernight`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2022012001915490000159?carrier=apcovernight" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "apcovernight", "trackingNumber": "2022012001915490000159", "status": "delivered", "statusDescription": "Delivered", "service": "NC16 (Next Business Day Non-Conveyable Parcel)", "deliveredAt": "2026-03-09T10:34:00Z", "deliveredAtLocal": "2026-03-09T10:34:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-09T10:34:00Z", "localTime": "2026-03-09T10:34:00", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": "2026-03-09T09:07:00Z", "localTime": "2026-03-09T09:07:00", "status": "out_for_delivery", "description": "Out for delivery", "location": null, "code": null }, { "timestamp": "2026-03-06T07:24:00Z", "localTime": "2026-03-06T07:24:00", "status": "in_transit", "description": "At delivery depot", "location": null, "code": null }, { "timestamp": "2026-03-06T00:31:00Z", "localTime": "2026-03-06T00:31:00", "status": "in_transit", "description": "At Hub", "location": null, "code": null }, { "timestamp": "2026-03-05T17:58:00Z", "localTime": "2026-03-05T17:58:00", "status": "in_transit", "description": "At sending depot", "location": null, "code": null } ] } ``` ## Notes - **Route**: the server-rendered APC Choice "Pinpoint" page (`track-parcel?id=`); the parcel journey and delivery summary rows are read. No account; the postcode only unlocks proof of delivery. - **Several items**: a consignment can have several parcels. An event identical across items is shown once; an item's own events carry "(item N)". - **Status**: `Carded` (calling card left) and `Held At Depot` are `exception`; `Delivery Rearranged By Customer` is in transit. - **Time zone**: times are UK clock time (`Europe/London`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Apple Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/appleexpress Query live **Apple Express** (`appleexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `appleexpress` | | **Brand aliases** | Apple Express, AppleExpress, appleexpress.com | | **Category** | Canadian courier (Cainiao last mile in Canada) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=92274200,92274200` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(APPL\d{13}|CACAINIAO\d{11})$/` | none | `92274200` | | **Pass 2 (`mayMatch`)** | none | none | none | `APPL…` and `CACAINIAO…` references belong to Apple Express alone. Its 8-9 digit order numbers are shared with other carriers: pass `?carrier=appleexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/92274200?carrier=appleexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "appleexpress", "trackingNumber": "92274200", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-05-20T19:59:20Z", "deliveredAtLocal": "2026-05-20T12:59:20", "signedBy": null, "destination": { "city": "Surrey", "state": "BC", "country": "CA" }, "events": [ { "timestamp": "2026-05-20T19:59:20Z", "localTime": "2026-05-20T12:59:20", "status": "delivered", "description": "Delivered", "location": "Surrey, BC", "code": "5" }, { "timestamp": "2026-05-20T16:50:41Z", "localTime": "2026-05-20T09:50:41", "status": "out_for_delivery", "description": "Out for Delivery", "location": "Surrey, BC", "code": "4" }, { "timestamp": "2026-05-19T22:52:46Z", "localTime": "2026-05-19T15:52:46", "status": "in_transit", "description": "Parcel Received, Out for Delivery Soon", "location": "Richmond, BC", "code": "2" }, { "timestamp": "2026-05-18T01:07:09Z", "localTime": "2026-05-17T21:07:09", "status": "in_transit", "description": "Package Processed", "location": "Toronto, ON", "code": "2" }, { "timestamp": null, "localTime": "2026-05-17T19:31:24", "status": "label_created", "description": "Waiting for Parcel", "location": null, "code": "1" } ] } ``` ## Notes - **Route**: the JSON the Apple Express tracking page calls, by order number or by the shipper's reference. No account. - **Time zone**: scan times are depot wall-clock time; the province in the scan's "City, PROV" location gives the zone. Scans with no location keep `localTime` only. - **Status**: the package status comes from the order's `currentStatus`; the "Delivery Notification Sent" row is a notice after delivery, not a delivery scan. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Aramex Tracking API & MCP URL: https://docs.lastscanned.com/carriers/aramex Query live **Aramex** (`aramex`) package status and scan history in a single synchronous `GET` request or MCP tool call. Aramex numbers are 10 or 11 digits, shapes that GLS Europe and DHL Express also use, so pass `?carrier=aramex`. Aramex Australia/NZ (`aramexau`) is a separate carrier. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `aramex` | | **Brand aliases** | Aramex, Aramex International, Aramex Shop & Ship | | **Category** | International express and e-commerce | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=aramex` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=34795277683,9876543210&carrier=aramex` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Aramex's 11-digit numbers carry a mod-7 check digit (the first ten digits mod 7 equal the last digit) and its Express and Shop & Ship numbers have 10 digits, but GLS Europe (11 digits) and DHL Express (10 digits) use the same shapes. Always pass `?carrier=aramex`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/34795277683?carrier=aramex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "aramex", "trackingNumber": "34795277683", "status": "delivered", "statusDescription": "The shipment has been delivered", "service": "E-commerce Parcel Express", "deliveredAt": null, "deliveredAtLocal": "2026-10-15T20:28:00", "signedBy": null, "destination": { "city": "Sharjah", "state": null, "country": "United Arab Emirates" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-15T20:28:00", "status": "delivered", "description": "The shipment has been delivered", "location": "Umm Ramool, United Arab Emirates", "code": null }, { "timestamp": null, "localTime": "2026-10-14T16:17:00", "status": "label_created", "description": "Shipper generated a new shipment label, but the shipment has not been handed over to Aramex, yet. Shipment will be updated once collected from shipper and received in Aramex offices", "location": "Dubai, United Arab Emirates", "code": null } ] } ``` ## Notes - **Time zone**: scan times are the local clock of the place named, with no zone, so only `localTime` is set and `timestamp` is `null`. - **Handoff**: when a scan reads "Shipment forwarded by UPS under tracking number ...", `message` names that carrier and number (for example `"Handed to UPS as 34795277683"`). Pass the number to `GET /v1/track/{number}` for its own scans. - **Network-wide scans**: scans labelled "Aramex Update" or "Network Update" have no place, so `location` is `null`. - **Destination**: `country` is the full English name, as Aramex prints it. - **Not found**: an unknown number returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Aramex Australia / NZ Tracking API & MCP URL: https://docs.lastscanned.com/carriers/aramexau Query live **Aramex Australia and New Zealand** (`aramexau`, the former Fastway Couriers network) parcel status and scan history in a single synchronous `GET` request or MCP tool call. This is a separate system from Aramex's global tracking, so it only knows Aramex AU/NZ labels. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `aramexau` | | **Brand & service aliases** | Aramex Australia, Aramex NZ, Fastway Couriers, Fastway, Parcel Connect | | **Category** | Australia / New Zealand domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=aramexau` where noted below) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MP0068255613,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=aramexau`)** | Aramex AU/NZ (Fastway) label numbers | — | `MP0068255613` | Label numbers do not have a shape that is unique to Aramex AU/NZ, so they are not auto-detected: pass `?carrier=aramexau`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/MP0068255613?carrier=aramexau" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/MP0068255613?carrier=aramexau", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "MP0068255613", "carrier": "aramexau" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "aramexau", "trackingNumber": "MP0068255613", "status": "delivered", "statusDescription": "Delivered: Signature obtained", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-25T13:20:00", "signedBy": "J Smith", "destination": null, "estimatedDelivery": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-25T13:20:00", "status": "delivered", "description": "Delivered: Signature obtained", "location": "Brisbane", "code": "YES" }, { "timestamp": null, "localTime": "2026-10-25T07:05:00", "status": "out_for_delivery", "description": "On board for delivery", "location": "Brisbane", "code": "ONB" } ] } ``` ## Status Notes - **Status codes**: Aramex AU/NZ scans carry Fastway status codes (`YES`, `ONB`, `RTS`, `CCL`, ...). `lastscanned` maps the same code groups the Aramex tracking page uses; unlisted codes fall back to the scan wording. - **Times**: scan times are depot-local with no zone, and Australia and New Zealand span several, so only `localTime` is set. - **Both countries**: `aramex.com.au` and `aramex.co.nz` share one tracking API, so one carrier id covers both. ## Related Resources - **Live browser lookup tool**: [Track a Aramex Australia / NZ package live on lastscanned.com/lookup/aramexau](https://lastscanned.com/lookup/aramexau) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Aramex New Zealand Tracking API & MCP URL: https://docs.lastscanned.com/carriers/aramexnz Query live **Aramex New Zealand** (`aramexnz`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `aramexnz` | | **Brand aliases** | Aramex New Zealand, Aramex NZ, Fastway NZ, aramex.co.nz | | **Category** | New Zealand courier (the former Fastway / Post Haste NZ network) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=JQ0004224658,JQ0004224658` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Aramex New Zealand numbers share their shape with other carriers, so they are not auto-detected: pass `?carrier=aramexnz`. It is a separate database from Aramex Australia (`aramexau`): an NZ label is unknown there. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JQ0004224658?carrier=aramexnz" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "aramexnz", "trackingNumber": "JQ0004224658", "status": "delivered", "statusDescription": "Delivered: Your parcel has been successfully delivered to your address as per the specified delivery instructions.", "service": null, "deliveredAt": "2026-03-17T04:16:59Z", "deliveredAtLocal": "2026-03-17T17:16:59", "signedBy": "J SMITH", "destination": null, "events": [ { "timestamp": "2026-03-17T04:16:59Z", "localTime": "2026-03-17T17:16:59", "status": "delivered", "description": "Delivered: Your parcel has been successfully delivered to your address as per the specified delivery instructions.", "location": "Christchurch", "code": "R36" }, { "timestamp": "2026-03-16T17:01:04Z", "localTime": "2026-03-17T06:01:04", "status": "out_for_delivery", "description": "Onboard for delivery: Your parcel is onboard with your local courier and en route to your delivery address.", "location": "Christchurch", "code": "ONB" }, { "timestamp": "2026-03-13T22:56:33Z", "localTime": "2026-03-14T11:56:33", "status": "in_transit", "description": "Picked up from sender: Our courier has picked up your parcel from the sender.", "location": "Auckland", "code": "PPP" } ] } ``` ## Notes - **Route**: the JSON that `aramex.co.nz/tools/track` calls (`GetTrackingData?LabelNo=`). No account. Separate from `aramexau`, which reads `aramex.com.au`. - **Time zone**: scan times are New Zealand clock time (`Pacific/Auckland`). - **Handoff**: a parcel Aramex hands to NZ Post for a rural delivery carries NZ Post's label; `message` names it (for example `"Handed to NZ Post as JQ0004224658"`). - **Status**: Fastway status codes (`R36`/`YES` delivered, `ONB` onboard, `CCL` calling card left and similar) are mapped. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Aras Kargo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/aras Query live **Aras Kargo (Turkey)** (`aras`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `aras` | | **Brand aliases** | Aras Kargo, Aras Cargo, Aras Turkey | | **Category** | Regional parcels (Turkey) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | `6507539551190` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | Tracking number (13 digits) | `^\d{13}$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=aras`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/6507539551190?carrier=aras" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "aras", "trackingNumber": "6507539551190", "status": "delivered", "statusDescription": "Teslim Edildi", "service": "Normal", "deliveredAt": "2026-10-12T17:09:00Z", "deliveredAtLocal": "2026-10-12T20:09:00", "signedBy": "A**** B****", "destination": null, "estimatedDelivery": "2026-10-08", "events": [ { "timestamp": "2026-10-12T17:09:00Z", "localTime": "2026-10-12T20:09:00", "status": "delivered", "description": "Teslim Edildi", "location": "Altınova", "code": null }, { "timestamp": null, "localTime": "2026-10-10", "status": "exception", "description": "Tatil Dolayısıyla Teslimat Yapılamadı", "location": null, "code": null }, { "timestamp": "2026-10-08T13:18:59Z", "localTime": "2026-10-08T16:18:59", "status": "in_transit", "description": "Aktarmada Torba Doldurma", "location": "Antalya Transfer, Antalya", "code": null } ] } ``` ## Notes - **Time zone**: Turkish time (`Europe/Istanbul`, UTC+3). - **Failed deliveries**: each failed attempt becomes an `exception` event with its date and reason. - A 13-digit number is not unique to Aras, so pass `?carrier=aras`. Names in the page are masked by the carrier. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Asendia USA (Pirate Ship Simple Export Rate) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/asendia Query live **Asendia USA** (`asendia`, including **Pirate Ship Simple Export Rate** `AHOY…` labels and `e-PAQ` international parcels) package status, scan history, and **destination postal carrier handoff numbers** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 12-character `AHOY…` tracking numbers in Pass 1 and tracks USPS outbound consolidation labels, `AS…US` numbers, and destination carrier numbers when you pass `?carrier=asendia`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `asendia` | | **Brand & service aliases** | Asendia, Asendia USA, Pirate Ship Simple Export Rate (`AHOY…`), Asendia e-PAQ Select / e-PAQ Plus / e-PAQ Elite (`a1.asendiausa.com`) | | **Category** | US outbound international e-commerce mail & parcel consolidator | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (auto-detected for `AHOY…`; add `?carrier=asendia` for USPS / `AS…US` / destination numbers) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=AHOY...,AHOY...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Asendia USA & Pirate Ship Export - **Automatic destination postal carrier & secondary tracking number extraction**: When US merchants ship internationally using Pirate Ship Simple Export Rate (`AHOY…`) or Asendia e-PAQ, the parcel moves through an Asendia USA consolidation hub (`Folcroft, PA`, `Elk Grove Village, IL`, `Bell, CA`) and is handed over to a foreign postal operator or courier (**Canada Post**, **Royal Mail**, **Australia Post**, **La Poste / Colissimo**, **DHL / Deutsche Post**, **PostNord**, **Swiss Post**, **Correos**, **Evri**, **An Post**, **Poste Italiane**). `lastscanned` extracts both the destination carrier name and the final-mile barcode (`trackingNumberVendor`) into top-level `message` (for example, `"Handed to Canada Post as 00091399050136308562"` or `"Handed to Royal Mail as 00091399050136308562"`). - **No Asendia A1 API keys required**: Query `AHOY…` labels or Asendia `AS…US` numbers with a single `GET` call instead of configuring Asendia One (`A1`) Basic Auth and API keys. ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=asendia`) Asendia's place in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — Pirate Ship `AHOY`** | `/^AHOY[0-9A-Z]{8}$/i` (`AHOY` + 8 letters and digits = 12 chars) | — | `00091399050136308562`, `AHOY1A2B3C4D` | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=asendia`) — `AS…US` / USPS / Destination numbers** | Asendia `AS…US` numbers, the domestic `92…`/`94…` USPS consolidation label, or the destination carrier's tracking number | — | `00091399050136308562`, `9400111899223197428490` | ### When is `?carrier=asendia` optional vs required? - **Optional (auto-detected)**: All 12-character `AHOY` + 8 alphanumeric Pirate Ship Simple Export Rate tracking numbers auto-detect in Pass 1. - **Required (`?carrier=asendia`)**: Asendia's `AS…US` numbers, the domestic `92…`/`94…` USPS label used for the US-to-Asendia-hub leg (which otherwise routes to [USPS](https://docs.lastscanned.com/carriers/usps) in Pass 1), or the destination postal number when you want Asendia's consolidated view. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash # Pirate Ship Simple Export Rate AHOY... number (auto-detected) curl -s "https://api.lastscanned.com/v1/track/00091399050136308562?carrier=asendia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" # Asendia AS...US or USPS consolidation label (pass ?carrier=asendia) curl -s "https://api.lastscanned.com/v1/track/00091399050136308562?carrier=asendia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/00091399050136308562?carrier=asendia", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.message, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "00091399050136308562" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "asendia", "trackingNumber": "00091399050136308562", "status": "in_transit", "statusDescription": "Arrived at destination country airport", "service": "e-PAQ Select", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "CA" }, "message": "Handed to Canada Post as 00091399050136308562", "events": [ { "timestamp": null, "localTime": "2026-10-25T14:22:00", "status": "in_transit", "description": "Arrived at destination country airport", "location": "TORONTO, ON, CA", "code": "A14" }, { "timestamp": null, "localTime": "2026-10-24T09:15:30", "status": "in_transit", "description": "Processed by Asendia Facility", "location": "Folcroft, PA, US", "code": "A05" }, { "timestamp": null, "localTime": "2026-10-22T11:04:12", "status": "label_created", "description": "Shipment information received", "location": "Folcroft, PA, US", "code": "A01" } ] } ``` ## Chaining Last-Mile Handoffs (`message`) & Status Notes - **Chaining into Canada Post, DHL, or USPS**: When `message` reports `"Handed to Canada Post as 00091399050136308562"` or `"Handed to DHL as ..."`, you can pass that secondary tracking number directly to `GET /v1/track/00091399050136308562` to retrieve the destination carrier's native local delivery scans and UTC timestamps. - **Smart `"Delivered to partner"` guard**: Asendia logs intermediate scans containing the word `"Delivered"` when handing a bag over to an airline or final-mile postal partner (e.g. `"Delivered to destination carrier"`). `lastscanned` excludes carrier/partner/agent handoff wording from triggering `delivered` so the parcel remains `in_transit` until actual recipient delivery. ## Related Resources - **Live browser lookup tool**: [Track an Asendia USA package live on lastscanned.com/lookup/asendia](https://lastscanned.com/lookup/asendia) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # AUS Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/asusexp Query live **AUS Express** (`asusexp`) package status and scan history in a single synchronous `GET` request or MCP tool call. AUS Express numbers share their shape with other carriers' numbers, so pass `?carrier=asusexp`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `asusexp` | | **Brand aliases** | AUS Express, 澳速国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=asusexp` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=asusexp` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | AUS Express tracking numbers have no shape of their own, so always pass `?carrier=asusexp`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to AUS Express in one request. - **Platform**: AUS Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # A Tu Hora Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/atuhoraexpress Query live **A Tu Hora Express** (`atuhoraexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `atuhoraexpress` | | **Brand aliases** | A Tu Hora Express, ATH Express, atuhoraexpress.com | | **Category** | Spanish same-day and e-commerce courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=000000001285693400141020,000000001285693400141020` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^0{6}\d{10}001\d{5}$/` | none | `000000001285693400141020` | | **Pass 2 (`mayMatch`)** | none | none | none | `24 digits: 000000 + 10-digit waybill + 001 + postcode` numbers belong to A Tu Hora Express alone, so `?carrier=atuhoraexpress` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/000000001285693400141020?carrier=atuhoraexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "atuhoraexpress", "trackingNumber": "000000001285693400141020", "status": "delivered", "statusDescription": "Realizado con éxito", "service": null, "deliveredAt": "2026-07-13T19:40:20Z", "deliveredAtLocal": "2026-07-13T21:40:20", "signedBy": null, "destination": { "city": "Sevilla", "state": null, "country": "ES" }, "events": [ { "timestamp": "2026-07-13T19:40:20Z", "localTime": "2026-07-13T21:40:20", "status": "delivered", "description": "Realizado con éxito", "location": null, "code": "4" }, { "timestamp": "2026-07-13T08:40:49Z", "localTime": "2026-07-13T10:40:49", "status": "out_for_delivery", "description": "En reparto", "location": null, "code": "2" }, { "timestamp": "2026-06-05T00:37:54Z", "localTime": "2026-06-05T02:37:54", "status": "label_created", "description": "Documentado", "location": null, "code": "0" } ] } ``` ## Notes - **Number**: the last five digits are the delivery postcode, which the carrier needs with the number. - **Time zone**: scan times are Spanish time (`Europe/Madrid`); `timestamp` is converted from it. Repeated identical scans are shown once. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Österreichische Post (Austrian Post) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/austrianpost Query live **Österreichische Post (Austrian Post)** (`austrianpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. S10 numbers ending `AT` auto-detect in Pass 1. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `austrianpost` | | **Category** | National post (Austria) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1040906599808880244007,1040906599808880244007` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}AT$/` with a valid S10 check digit | S10 mod 11 | `1040906599808880244007` | | **Pass 2 (`mayMatch`)** | *None* | — | — | Austrian domestic parcel numbers need `?carrier=austrianpost`. Event text is the carrier's German wording; Austrian scans are read as Europe/Vienna. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1040906599808880244007?carrier=austrianpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "austrianpost", "trackingNumber": "1040906599808880244007", "status": "in_transit", "statusDescription": "Sendung im Paketzentrum bearbeitet", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-24T08:15:00Z", "localTime": "2026-10-24T10:15:00", "status": "in_transit", "description": "Sendung im Paketzentrum bearbeitet", "location": "Hagenbrunn", "code": null } ] } ``` ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # AxleHire (Jitsu) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/axlehire Query live **AxleHire / Jitsu** (`axlehire`) package status and scan history in a single synchronous `GET` request or MCP tool call. AxleHire rebranded to **Jitsu** (`gojitsu.com`), and `lastscanned` supports both its 12/16-character mixed alphanumeric tracking tokens and 19-character `SCD…` barcodes in Pass 2 (`mayMatch`), returning a normalized `TrackingResult` JSON payload—without requiring a Jitsu enterprise shipper contract. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `axlehire` | | **Brand & service aliases** | AxleHire, Jitsu, GoJitsu, Jitsu Same-Day / Next-Day | | **Category** | US metro same-day & next-day last-mile parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SCD0000F00410922107,SCD...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for AxleHire / Jitsu - **No Jitsu enterprise API keys or webhook setup**: Official Jitsu API access is provisioned only to direct enterprise shippers. `lastscanned` lets any application, post-purchase portal, or WISMO AI agent query Jitsu tracking tokens synchronously via `GET /v1/track/SCD0000F00410922107?carrier=axlehire`. - **Smart normalization of Jitsu's internal route signals**: Jitsu's raw `shipment_events` stream emits `GEOCODED` mid-transit when a delivery route is re-planned (which naively resets a package's status back to `label_created`), uses `PICKUP_SUCCEEDED` when a driver loads the parcel onto a delivery vehicle (actually `out_for_delivery`), and emits `RETURN_SUCCEEDED` when an undelivered parcel returns to the local Jitsu depot for redelivery (still `in_transit`, not returned to sender). `lastscanned` handles all three edge cases accurately. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Because Jitsu's 12- and 16-character tracking tokens have **no fixed prefix** (e.g. `SCD0000F00410922107`, `BQH4FN5QAQYV3SDQ`), AxleHire / Jitsu deliberately returns `false` in Pass 1 (`matches`) and runs exclusively in **Pass 2 (`mayMatch`)** so every prefixed carrier (`VH…`, `CR…`, `AP…`, `LP…`, `BTP…`) claims its numbers first: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None (`false`)* — deferred to Pass 2 to prevent prefix collisions | — | — | | **Pass 2 (`mayMatch`) — `SCD` barcode** | `/^SCD[0-9A-Z]{16}$/i` (`SCD` + 16 alphanumeric characters = 19 chars) | — | `SCD0000F00410922107` | | **Pass 2 (`mayMatch`) — 12/16-char token** | `/^([0-9A-Z]{12}\|[0-9A-Z]{16})$/i` with at least one letter, one digit, and **not** all-letters-then-all-digits (`!/^[A-Z]+\d+$/i`) | — | `SCD0000F00410922107`, `BQH4FN5QAQYV3SDQ` | ### Why `!/^[A-Z]+\d+$/i` is enforced & when to pass `?carrier=axlehire` - **Zero collision with `VH`, `CR`, `LP`, `AP`**: Standard prefixed barcodes like `CR010740141269` (Cirro, 14 chars) or `AP00830954074290` (Cainiao, 16 chars) are all-letters followed by all-digits and are matched in Pass 1. Jitsu's 12/16-character tokens interleave letters and digits (`SCD0000F00410922107`). - **When `?carrier=axlehire` is required**: Only if a Jitsu token happens to consist strictly of leading letters followed by trailing digits (rare), or if you are querying a non-standard shipper reference number. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/SCD0000F00410922107?carrier=axlehire" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/SCD0000F00410922107?carrier=axlehire", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.estimatedDeliveryAt, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "SCD0000F00410922107" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "axlehire", "trackingNumber": "SCD0000F00410922107", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-24T21:08:33Z", "deliveredAtLocal": "2026-10-24T14:08:33", "signedBy": "RECEPTION", "destination": { "city": "SAN FRANCISCO", "state": "CA", "country": "US" }, "estimatedDelivery": "2026-10-24T20:00:00", "estimatedDeliveryAt": "2026-10-25T03:00:00Z", "message": "Left inside front lobby by mailboxes", "events": [ { "timestamp": "2026-10-24T21:08:33Z", "localTime": "2026-10-24T14:08:33", "status": "delivered", "description": "Delivered", "location": "San Francisco, CA", "code": "DROPOFF_SUCCEEDED" }, { "timestamp": "2026-10-24T16:45:10Z", "localTime": "2026-10-24T09:45:10", "status": "out_for_delivery", "description": "Out for delivery", "location": "San Leandro, CA", "code": "PICKUP_SUCCEEDED" }, { "timestamp": "2026-10-24T10:12:04Z", "localTime": "2026-10-24T03:12:04", "status": "in_transit", "description": "Received at sortation center", "location": "San Leandro, CA", "code": "RECEIVED_OK" }, { "timestamp": "2026-10-23T22:00:00Z", "localTime": "2026-10-23T15:00:00", "status": "label_created", "description": "Shipment info received", "location": "San Francisco, CA", "code": "GEOCODED" } ] } ``` > **Raw status & signal codes**: `events[].code` preserves Jitsu's signal identifier (`CREATED`, `GEOCODED`, `RECEIVED_OK`, `BOOKED`, `PICKUP_EN_ROUTE`, `PICKUP_SUCCEEDED`, `DROPOFF_EN_ROUTE`, `DROPOFF_SUCCEEDED`, `DROPOFF_FAILED`, `RETURN_SUCCEEDED`, `MISDELIVERED`), while `message` surfaces driver delivery notes (`dropoff_note`) or exception remarks. ## Carrier-Specific Status & Integration Notes - **Exact UTC + local timestamps & ETAs**: Jitsu provides UTC timestamps alongside the recipient's IANA `timezone` (e.g. `America/Los_Angeles`) and a `dropoff_latest_ts` delivery window deadline, populating `timestamp`, `localTime`, `estimatedDelivery` (local), and `estimatedDeliveryAt` (UTC). - **Mid-transit `GEOCODED` guard**: If a shipment already has physical scan milestones (`in_transit` or `out_for_delivery`) and Jitsu emits a route re-plan `GEOCODED` event at the top of the list, `lastscanned` keeps the top-level `status` at the true physical state instead of reverting to `label_created`. ## Related Resources - **Live browser lookup tool**: [Track an AxleHire / Jitsu package live on lastscanned.com/lookup/axlehire](https://lastscanned.com/lookup/axlehire) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # AyMakan Tracking API & MCP URL: https://docs.lastscanned.com/carriers/aymakan Query live **AyMakan** (`aymakan`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `aymakan` | | **Brand aliases** | Aymakan, Ay Makan, AyMakan Logistics | | **Category** | Domestic parcels (Saudi Arabia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^AY\d{9,11}$/` | none | `AY12041229866` | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` takes `AY` plus 9 to 11 digits. `mayMatch` is empty. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/AY12041229866?carrier=aymakan" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "aymakan", "trackingNumber": "AY12041229866", "status": "delivered", "statusDescription": "Shipment is delivered to customer - Received by Sample Receiver", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-05", "signedBy": "Sample Receiver", "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-05", "status": "delivered", "description": "Shipment is delivered to customer - Received by Sample Receiver", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-05", "status": "out_for_delivery", "description": "Shipment is out for its final destination.", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-05", "status": "in_transit", "description": "Received at Riyadh Warehouse", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-05", "status": "in_transit", "description": "Shipment is received at hub", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-01", "status": "label_created", "description": "Shipment is created at collection point", "location": null, "code": null } ] } ``` ## Notes - **Source**: the server-rendered tracking page `aymakan.com/tracking/{number}`. No account is needed. - **Dates only**: AyMakan prints a weekday and day (`Sat, Apr 05`) with no year and no time. The year is the latest one in which that date falls on that weekday. `timestamp` is `null` and `localTime` is a date. - **`signedBy`**: read from the `Received by …` part of the delivered scan. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Bangladesh Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bangladeshpost Query live **Bangladesh Post** (`bangladeshpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bangladeshpost` | | **Brand aliases** | Bangladesh Post, Bangladesh Post Office, BD Post, bdpost.gov.bd | | **Category** | Bangladesh national post (domestic mail) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=DL636643547BD,DL636643547BD` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `S10 ending BD` | none | `DL636643547BD` | UPU S10 numbers ending `BD` with a valid check digit are only a loose fallback (they can also be international items this domestic tracker does not hold): pass `?carrier=bangladeshpost`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/DL636643547BD?carrier=bangladeshpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "bangladeshpost", "trackingNumber": "DL636643547BD", "status": "delivered", "statusDescription": "Final Posting Delivered to Receipient", "service": "Letter Registry", "deliveredAt": "2026-02-11T09:56:55Z", "deliveredAtLocal": "2026-02-11T15:56:55", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-11T09:56:55Z", "localTime": "2026-02-11T15:56:55", "status": "delivered", "description": "Final Posting Delivered to Receipient", "location": "Dhaka Sadar", "code": "Delivered_To_Receipent" }, { "timestamp": "2026-02-10T11:08:55Z", "localTime": "2026-02-10T17:08:55", "status": "in_transit", "description": "Receive item", "location": "Dhaka Sadar", "code": "Receive_Item" }, { "timestamp": "2026-02-07T15:22:37Z", "localTime": "2026-02-07T21:22:37", "status": "in_transit", "description": "Item Booked", "location": "Tejgaon", "code": "Item_Booked" } ] } ``` ## Notes - **Route**: the "DMS Item Tracking" page's own JSON (`mail_tracking_new/get_data.php`), called with the CSRF token that the page carries. No account. - **Time zone**: Dhaka time (`Asia/Dhaka`, UTC+6). - **Scope**: domestic items. The international tracker (`ipsbd.bdpost.gov.bd`) was not seen returning scans and is not used. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # BDTPost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bdtpost Query live **BDTPost** (`bdtpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. BDTPost numbers share their shape with other carriers' numbers, so pass `?carrier=bdtpost`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bdtpost` | | **Brand aliases** | BDTPost, 八达通国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=bdtpost` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=bdtpost` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | BDTPost tracking numbers have no shape of their own, so always pass `?carrier=bdtpost`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to BDTPost in one request. - **Platform**: BDTPost runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Better Trucks Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bettertrucks Query live **Better Trucks** (`bettertrucks`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `BTS_…` and `BTP…` tracking numbers and returns a normalized `TrackingResult` JSON payload—without requiring a Better Trucks merchant API key or webhook listener. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bettertrucks` | | **Brand & service aliases** | Better Trucks, `BTS_`, `BTP` | | **Category** | US Midwest, South & East regional last-mile parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=BTS_...,BTP...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Better Trucks - **No shipper account or webhook pre-registration**: Better Trucks' shipper API requires merchant onboarding and webhook configuration. `lastscanned` lets you query any `BTS_…` or `BTP…` parcel synchronously via `GET /v1/track/BTPA00190F5N15U?carrier=bettertrucks`. - **Filters out noisy internal dispatch rows**: Better Trucks' raw `tracking_history` includes internal dispatch events like `TRANSACTION_CREATED` and `ONFLEET_FAILED`, and returns HTTP `200` with `status: "UNKNOWN"` on invalid tracking numbers. `lastscanned` filters internal system rows and returns a clean `404 not_found` when a tracking number does not exist. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Better Trucks is evaluated **twelfth (#12)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — `BTS_` prefix** | `/^BTS_[0-9A-Z]{8,14}$/i` (`BTS_` + 8–14 alphanumeric characters) | — | `BTS_0261SMTF8S`, `BTS_0018P2LD557` | | **Pass 1 (`matches`) — `BTP` prefix** | `/^BTP[0-9A-Z]{12}$/i` (`BTP` + 12 alphanumeric characters = 15 chars) | — | `BTPA00190F5N15U` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=bettertrucks` optional vs required? - **Optional (auto-detected)**: All `BTS_…` and `BTP…` tracking numbers auto-detect in Pass 1 (ahead of AxleHire's 12/16-char alphanumeric rule in Pass 2). No other carrier uses either prefix. - **Required (`?carrier=bettertrucks`)**: Custom merchant reference numbers inducted into Better Trucks without a `BTS_` or `BTP` prefix. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/BTPA00190F5N15U?carrier=bettertrucks" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/BTPA00190F5N15U?carrier=bettertrucks", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.statusDescription, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "BTS_0261SMTF8S" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "bettertrucks", "trackingNumber": "BTPA00190F5N15U", "status": "delivered", "statusDescription": "Package delivered", "service": null, "deliveredAt": "2026-10-24T17:11:13Z", "deliveredAtLocal": "2026-10-24T12:11:13", "signedBy": "Front Door", "destination": { "city": "DOWNERS GROVE", "state": "IL", "country": "US" }, "estimatedDelivery": null, "estimatedDeliveryAt": null, "message": null, "events": [ { "timestamp": "2026-10-24T17:11:13Z", "localTime": "2026-10-24T12:11:13", "status": "delivered", "description": "Package delivered", "location": "Downers Grove, IL", "code": "DELIVERED" }, { "timestamp": "2026-10-24T13:20:45Z", "localTime": "2026-10-24T08:20:45", "status": "out_for_delivery", "description": "Package is out for delivery", "location": "Woodridge, IL", "code": "OUT_FOR_DELIVERY" }, { "timestamp": "2026-10-24T08:05:19Z", "localTime": "2026-10-24T03:05:19", "status": "in_transit", "description": "Package scanned at hub", "location": "Woodridge, IL", "code": "SCANNED_AT_HUB" }, { "timestamp": "2026-10-23T19:44:02Z", "localTime": "2026-10-23T19:44:02", "status": "label_created", "description": "Shipment created", "location": null, "code": "SHIPMENT_CREATED" } ] } ``` > **Raw status & scan codes**: `events[].code` preserves Better Trucks' status code (`SHIPMENT_CREATED`, `INJECTED`, `SCANNED_AT_HUB`, `OUT_FOR_DELIVERY`, `LOADED_ON_DELIVERY_VEHICLE`, `DELIVERED`, `DELIVERY_FAILURE`, `AWAITING_ADDRESS_CONFIRMATION`, `RTS_RETURNED_TO_STATION`, `RETURNED`). If a delivery attempt fails, `event_details.FailureReason` is surfaced in top-level `message`. ## Carrier-Specific Status & Integration Notes - **Exact UTC (`timestamp`) and scan-local (`localTime`) clocks**: Each scan includes `object_created` in UTC alongside a `LOCAL_TIME` entry in `relative_time` with a `GMT±HH:MM` offset, so both `timestamp` and `localTime` are populated. - **VGO pickup locker support**: Better Trucks' VGO pickup events (`VGO_PARCEL_PICKED_UP_BY_RECIPIENT`) normalize to `delivered`. ## Related Resources - **Live browser lookup tool**: [Track a Better Trucks package live on lastscanned.com/lookup/bettertrucks](https://lastscanned.com/lookup/bettertrucks) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # BEX Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bexexpress Query live **BEX Express** (`bexexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bexexpress` | | **Brand aliases** | BEX Express, BEX, Bex Express Serbia, bexexpress.rs | | **Category** | Serbian courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=258523787,258523787` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | BEX Express numbers share their shape with other carriers, so they are not auto-detected: pass `?carrier=bexexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/258523787?carrier=bexexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "bexexpress", "trackingNumber": "258523787", "status": "delivered", "statusDescription": "Dostavljeno", "service": null, "deliveredAt": "2026-09-02T08:20:49Z", "deliveredAtLocal": "2026-09-02T10:20:49", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-09-02T08:20:49Z", "localTime": "2026-09-02T10:20:49", "status": "delivered", "description": "Dostavljeno", "location": "Beograd", "code": "21" }, { "timestamp": "2026-08-25T10:14:58Z", "localTime": "2026-08-25T12:14:58", "status": "in_transit", "description": "Preuzeto", "location": "Makiš", "code": "11" }, { "timestamp": "2026-08-25T07:57:40Z", "localTime": "2026-08-25T09:57:40", "status": "label_created", "description": "Evidentirano", "location": "Makiš", "code": "1" } ] } ``` ## Notes - **Route**: the JSON that bexexpress.rs's tracking page calls; the request header it sends is a constant in the page's own script. No account. - **Time zone**: each scan carries a `GMT+1`/`GMT+2` offset, used for `timestamp`. - **Status**: the page's codes are mapped: 1 registered, 11 picked up, 21 delivered, 25/30 returned. The COD payout row (31) is kept as a scan; the parcel stays `delivered`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # BJS Home Delivery Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bjshomedelivery Query live **BJS Home Delivery** (`bjshomedelivery`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bjshomedelivery` | | **Brand aliases** | BJS Home Delivery, BJS, bjshomedelivery.com | | **Category** | UK big-and-bulky and two-person home delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=B0111626-5604,B0111626-5604` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^B\d{7}-\d{4}$/` | none | `B0111626-5604` | `B0111626-5604` references are only a loose fallback: pass `?carrier=bjshomedelivery`. The dash is added when left out. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/B0111626-5604?carrier=bjshomedelivery" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "bjshomedelivery", "trackingNumber": "B0111626-5604", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-06-23", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-06-23", "status": "delivered", "description": "Delivered", "location": null, "code": null } ] } ``` ## Notes - **Route**: the `mini_track` JSON that `track.bjshomedelivery.com` calls; the key it sends is a constant in the site's own script. No account. - **One status**: the carrier returns one status line and a date (no time), so there is a single event with `localTime` as a date and `timestamp` `null`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Blue Dart (DHL Group, India) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bluedart Query live **Blue Dart** (`bluedart`, the DHL Group's Indian express carrier) waybill status and scan history in a single synchronous `GET` request or MCP tool call, read from Blue Dart's public TrackDart page. Pass `?carrier=bluedart` for its 11-digit waybills. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bluedart` | | **Brand & service aliases** | Blue Dart, BlueDart, Blue Dart Express, Blue Dart Aviation, DHL Blue Dart | | **Category** | India domestic & international express | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=bluedart` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=36206727712,36206727712&carrier=bluedart` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=bluedart`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | `/^\d{11}$/` | — | `36206727712` | | **Explicit (`?carrier=bluedart`)** | Any Blue Dart waybill | — | `36206727712` | ### When is `?carrier=bluedart` optional vs required? - **Optional**: an 11-digit number that no other carrier claims is tried against Blue Dart in Pass 2. - **Recommended**: pass `?carrier=bluedart` anyway, because plain digit runs are not Blue Dart's alone. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/36206727712?carrier=bluedart" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```ts const res = await fetch("https://api.lastscanned.com/v1/track/36206727712?carrier=bluedart", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` MCP `track_package` tool call: ```json { "tool": "track_package", "arguments": { "tracking_number": "36206727712", "carrier": "bluedart" } } ``` Normalized `TrackingResult` response: ```json { "carrier": "bluedart", "trackingNumber": "36206727712", "status": "delivered", "statusDescription": "SHIPMENT DELIVERED", "service": "Domestic Priority", "deliveredAt": "2026-10-21T09:02:00Z", "deliveredAtLocal": "2026-10-21T14:32:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-21T09:02:00Z", "localTime": "2026-10-21T14:32:00", "status": "delivered", "description": "SHIPMENT DELIVERED", "location": "MUMBAI", "code": null }, { "timestamp": "2026-10-21T03:40:00Z", "localTime": "2026-10-21T09:10:00", "status": "in_transit", "description": "SHIPMENT OUTSCAN", "location": "MUMBAI", "code": null } ] } ``` ## Notes - **Source**: Blue Dart's own `trackdartresultthirdparty` page, server-rendered HTML, no account, key or captcha. A number Blue Dart has no record of ("Records Not Found") returns `not_found`; Blue Dart also shows that for shipments not yet handed over to it. - **Times**: dates print as `21-Oct-2026` and times as `14:32` in India Standard Time. India is one zone, so each event carries `timestamp` in UTC computed from `Asia/Kolkata`. ## Related Resources - **Live browser lookup tool**: [Track a Blue Dart package live on lastscanned.com/lookup/bluedart](https://lastscanned.com/lookup/bluedart) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # BlueEX Tracking API & MCP URL: https://docs.lastscanned.com/carriers/blueex Query live **BlueEX** (`blueex`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `blueex` | | **Brand aliases** | BlueEX, Blue-EX, Blue EX, blue-ex.com | | **Category** | Pakistani courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=5036410022,5036410022` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^CP\d{12}$/` | none | `5036410022` | BlueEX's 10-digit consignment numbers (starting 4, 5 or 6) are shared with other carriers: pass `?carrier=blueex`. The `CP…` form is only a loose fallback. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/5036410022?carrier=blueex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "blueex", "trackingNumber": "5036410022", "status": "delivered", "statusDescription": "Delivered to Customer", "service": null, "deliveredAt": "2026-01-23T09:25:00Z", "deliveredAtLocal": "2026-01-23T14:25:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-01-23T09:25:00Z", "localTime": "2026-01-23T14:25:00", "status": "delivered", "description": "Delivered to Customer", "location": null, "code": null }, { "timestamp": "2026-01-17T00:59:00Z", "localTime": "2026-01-17T05:59:00", "status": "out_for_delivery", "description": "Out For Delivery", "location": null, "code": null }, { "timestamp": "2026-01-12T10:57:00Z", "localTime": "2026-01-12T15:57:00", "status": "in_transit", "description": "Shipment has reached blueEX Lahore Operations - Lahore", "location": "Lahore", "code": null }, { "timestamp": "2026-01-04T10:04:00Z", "localTime": "2026-01-04T15:04:00", "status": "label_created", "description": "Order information received, pending at Shipper's end.", "location": null, "code": null } ] } ``` ## Notes - **Route**: the `trackall.php` fragment that `blue-ex.com`'s tracking box loads, read as HTML. No account. - **Time zone**: Pakistan time (`Asia/Karachi`, UTC+5, no DST). - **Location**: taken from "Shipment reached … - City" scans; other scans carry none. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Blue Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/blueexpress Query live **Blue Express** (`blueexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `blueexpress` | | **Brand aliases** | Blue Express, BlueExpress, Blue Express Chile, blue.cl | | **Category** | Chilean courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2209565643,2209565643` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Blue Express numbers share their shape with other carriers, so they are not auto-detected: pass `?carrier=blueexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2209565643?carrier=blueexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "blueexpress", "trackingNumber": "2209565643", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-18T15:09:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-02-18T15:09:00", "status": "delivered", "description": "Entregado", "location": "Concepcion", "code": "DL" }, { "timestamp": null, "localTime": "2026-02-18T10:29:10", "status": "out_for_delivery", "description": "En reparto", "location": "Concepcion", "code": "LD" }, { "timestamp": null, "localTime": "2026-02-17T08:12:09", "status": "in_transit", "description": "Paquete en centro de distribución", "location": "Concepcion", "code": "DA" }, { "timestamp": null, "localTime": "2026-02-16T19:21:36", "status": "in_transit", "description": "Centro de distribución de Blue Express", "location": "Santiago", "code": "PUH" }, { "timestamp": null, "localTime": "2026-02-09T15:02:28", "status": "in_transit", "description": "Retirado", "location": "Punto Blue Express Example Store Iquique", "code": "ASO" }, { "timestamp": null, "localTime": "2026-02-06T09:38:15", "status": "label_created", "description": "Aviso de envío recibido", "location": "Punta Arenas", "code": "GE" } ] } ``` ## Notes - **Route**: the `api/tracking/microestado` JSON that `blue.cl`'s tracking page calls. No account. - **Events**: only the scans the page shows (those with a title); internal scans are left out. - **Time zone**: Chile has several zones and DST rules and the scan names none, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Bombino Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bombino Query live **Bombino Express** (`bombino`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bombino` | | **Brand aliases** | Bombino Express, Bombino, bombinoexp.com | | **Category** | India-based international courier (India to US, UK, UAE) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=925897117,925897117` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Bombino Express numbers share their shape with other carriers, so they are not auto-detected: pass `?carrier=bombino`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/925897117?carrier=bombino" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "bombino", "trackingNumber": "925897117", "status": "returned", "statusDescription": "SHIPMENT RTO DUE TO AS PER SHIPPER INSTRUCTION", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Homestead", "state": null, "country": "United States" }, "events": [ { "timestamp": null, "localTime": "2026-01-18T16:20:42", "status": "returned", "description": "SHIPMENT RTO DUE TO AS PER SHIPPER INSTRUCTION", "location": "DELHI", "code": "rto" }, { "timestamp": null, "localTime": "2026-01-09T17:40:53", "status": "in_transit", "description": "SHIPMENT UNHOLD -", "location": "MUMBAI", "code": "shipment_unhold" }, { "timestamp": null, "localTime": "2026-01-05T12:38:34", "status": "exception", "description": "Shipment Hold Due to Inscan Credit Limit exceeded", "location": "DELHI", "code": "shipment_hold" }, { "timestamp": null, "localTime": "2026-01-05T12:38:32", "status": "in_transit", "description": "SHIPMENT ARRIVED", "location": "DELHI", "code": "in_scan" }, { "timestamp": null, "localTime": "2025-12-27T18:20:50", "status": "label_created", "description": "SHIPMENT INFORMATION RECEIVED", "location": "BANGALORE", "code": "entry" } ] } ``` ## Notes - **Route**: the JSON that `bombinoexp.com`'s tracking page calls (`/api/track/{awb}`). No account. - **Time zone**: the scans carry no zone and the hubs span countries, so only `localTime` is set. - **Handoff**: when the parcel goes on under another carrier, `message` carries its number; every parcel seen so far had none. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Bookurier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bookurier Query live **Bookurier** (`bookurier`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bookurier` | | **Brand aliases** | Bookurier, t.bookurier.ro | | **Category** | Romanian book and parcel courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=BOK2023192,BOK2023192` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^BOK\d{7}$/` | none | `BOK2023192` | | **Pass 2 (`mayMatch`)** | none | none | none | `BOK…` numbers belong to Bookurier alone, so `?carrier=bookurier` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/BOK2023192?carrier=bookurier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "bookurier", "trackingNumber": "BOK2023192", "status": "label_created", "statusDescription": "Comandă plasată", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Bucuresti", "state": "Bucuresti", "country": "RO" }, "events": [ { "timestamp": "2026-01-13T21:55:03Z", "localTime": "2026-01-13T23:55:03", "status": "label_created", "description": "Comandă plasată", "location": null, "code": "order_placed" } ] } ``` ## Notes - **Route**: `t.bookurier.ro` guards its API with a session. `lastscanned` loads the page for the cookie and its one-use token, then calls `/track/api`. Two plain requests per number; no account. - **Time zone**: Romanian time (`Europe/Bucharest`). - **Status**: from the carrier's status codes (`order_placed` is `label_created`), the delivered/returned flags and the Romanian wording. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Border Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/borderexpress Query live **Border Express** (`borderexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `borderexpress` | | **Brand aliases** | Border Express, BEX Australia, borderexpress.com.au | | **Category** | Australian road freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=24328355,24328355` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^[A-Z]{4}\d{5,8}$/` | none | `ABCD12345` | 8-digit consignment numbers are shared with other carriers: pass `?carrier=borderexpress`. A 4-letter prefix plus 5-8 digits is only a loose fallback. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/24328355?carrier=borderexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "borderexpress", "trackingNumber": "24328355", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-12T03:10:30Z", "deliveredAtLocal": "2026-03-12T14:10:30", "signedBy": "J SMITH", "destination": { "city": "St Kilda", "state": "VIC", "country": "AU" }, "events": [ { "timestamp": "2026-03-12T03:10:30Z", "localTime": "2026-03-12T14:10:30", "status": "delivered", "description": "Delivered", "location": "St Kilda, VIC", "code": "DEL" }, { "timestamp": "2026-03-11T22:07:18Z", "localTime": "2026-03-12T09:07:18", "status": "out_for_delivery", "description": "On Board For Delivery", "location": "Melbourne Airport, VIC", "code": "OBD" }, { "timestamp": "2026-03-10T06:32:13Z", "localTime": "2026-03-10T17:32:13", "status": "in_transit", "description": "In Transit", "location": "Melbourne Airport, VIC", "code": "TRN" }, { "timestamp": "2026-03-09T00:35:18Z", "localTime": "2026-03-09T11:35:18", "status": "label_created", "description": "Shipment Data Received", "location": "Wangaratta, VIC", "code": "SDR" } ] } ``` ## Notes - **Route**: the Quick Track API on `bexonlineapi.borderexpress.com.au`: a verification id is fetched, then the consignment is queried with it. Two plain requests; no account. - **Time zone**: scans carry ISO times with offsets, so `timestamp` is exact. - **Status**: the package status comes from `currentStatus`; an In Transit scan dated after delivery does not change a delivered consignment. - **Barcodes**: the tracker does not take a unit barcode (`ABCDBX` + 14 digits); use the consignment number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Bosta Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bosta Query live **Bosta** (`bosta`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bosta` | | **Brand aliases** | Bosta, bosta.co | | **Category** | Egyptian and Saudi courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=47680643,47680643` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Bosta numbers share their shape with other carriers, so they are not auto-detected: pass `?carrier=bosta`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/47680643?carrier=bosta" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "bosta", "trackingNumber": "47680643", "status": "delivered", "statusDescription": "Order is delivered", "service": null, "deliveredAt": "2026-03-04T13:07:10Z", "deliveredAtLocal": "2026-03-04T15:07:10", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-04T13:07:10Z", "localTime": "2026-03-04T15:07:10", "status": "delivered", "description": "Order is delivered", "location": null, "code": "45" }, { "timestamp": "2026-03-04T08:57:30Z", "localTime": "2026-03-04T10:57:30", "status": "out_for_delivery", "description": "Order is out for delivery: Will be Deliverd from 10 AM to 6 PM According to the Courier Route", "location": null, "code": "41" }, { "timestamp": "2026-03-04T07:11:10Z", "localTime": "2026-03-04T09:11:10", "status": "in_transit", "description": "Order is received at Bosta warehouses and being processed.", "location": null, "code": "24" }, { "timestamp": "2026-03-03T22:40:16Z", "localTime": "2026-03-04T00:40:16", "status": "in_transit", "description": "Order is being transferred to Bosta's Hubs.", "location": null, "code": "30" }, { "timestamp": "2026-03-01T20:26:18Z", "localTime": "2026-03-01T22:26:18", "status": "label_created", "description": "Your order is created, Bosta will pick it up once your shipper is ready", "location": null, "code": "10" } ] } ``` ## Notes - **Route**: the JSON that Bosta's tracking page calls. No account. Numbers under 8 digits are answered `not_found` without asking the carrier (shared privacy guard). - **Time zone**: event times are UTC instants. `localTime` is that instant in the delivery country's zone (Egypt `Africa/Cairo`, Saudi Arabia `Asia/Riyadh`). - **Status**: from Bosta's state codes (10 created, 24 at warehouse, 30 hub transfer, 41 out for delivery, 45 delivered, 46 returned, 47 exception). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # BOX NOW Tracking API & MCP URL: https://docs.lastscanned.com/carriers/boxnow Query live **BOX NOW** (`boxnow`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `boxnow` | | **Brand aliases** | BOX NOW, Box Now, BoxNow, boxnow.gr | | **Category** | Parcel lockers in Greece, Cyprus, Bulgaria, Croatia and Slovenia | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=0352470864,0352470864` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | BOX NOW numbers share their shape with other carriers, so they are not auto-detected: pass `?carrier=boxnow`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/0352470864?carrier=boxnow" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "boxnow", "trackingNumber": "0352470864", "status": "delivered", "statusDescription": "Parcel has been delivered", "service": null, "deliveredAt": "2026-03-13T17:48:12Z", "deliveredAtLocal": "2026-03-13T19:48:12", "signedBy": null, "destination": { "city": "Galatsi", "state": null, "country": "GR" }, "events": [ { "timestamp": "2026-03-13T17:48:12Z", "localTime": "2026-03-13T19:48:12", "status": "delivered", "description": "Parcel has been delivered", "location": null, "code": "delivered" }, { "timestamp": "2026-03-13T16:17:58Z", "localTime": "2026-03-13T18:17:58", "status": "exception", "description": "Parcel is at the pickup locker, ready for collection", "location": "BOX NOW Example Locker", "code": "final-destination" }, { "timestamp": "2026-03-12T13:33:55Z", "localTime": "2026-03-12T15:33:55", "status": "in_transit", "description": "Parcel at the depot", "location": "ATHENS DEPOT", "code": "in-depot" }, { "timestamp": "2026-03-09T11:58:30Z", "localTime": "2026-03-09T13:58:30", "status": "in_transit", "description": "Parcel accepted at the drop-off locker or store", "location": "BOX NOW STORE Example (Patra)", "code": "accepted-to-locker" }, { "timestamp": "2026-03-09T07:49:48Z", "localTime": "2026-03-09T09:49:48", "status": "label_created", "description": "Parcel registered in the system", "location": null, "code": "new" } ] } ``` ## Notes - **Route**: the parcel-tracking API (`parcels:track`) behind BOX NOW's tracking pages. A plain `POST`; no account. - **Time zone**: event times are UTC instants; for a domestic parcel `localTime` is that instant in the destination country's zone. - **Status**: "arrived at the pickup locker" (`final-destination`) is waiting for the recipient, so it is an `exception` step; `delivered` follows when the parcel is collected. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # bpost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bpost Query live **bpost** (`bpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. S10 numbers ending `BE` auto-detect in Pass 1. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bpost` | | **Category** | National post (Belgium) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=323299903171288510995037,323299903171288510995037` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}BE$/` with a valid S10 check digit | S10 mod 11 | `323299903171288510995037` | | **Pass 2 (`mayMatch`)** | *None* | — | — | Belgian parcel barcodes that are not S10 need `?carrier=bpost`. Event text is bpost's English wording; scans are read as Europe/Brussels. A number bpost has no events for returns `not_found`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/323299903171288510995037?carrier=bpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "bpost", "trackingNumber": "323299903171288510995037", "status": "in_transit", "statusDescription": "Processing by bpost", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-24T08:15:00Z", "localTime": "2026-10-24T10:15:00", "status": "in_transit", "description": "Processing by bpost", "location": "Brussels", "code": null } ] } ``` ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Bring / Posten Norge Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bring Query live **Bring / Posten Norge** (`bring`) shipment status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending `NO` and returns a normalized `TrackingResult` JSON payload, without a Mybring API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bring` | | **Brand & service aliases** | Bring, Posten Norge, Posten, Bring Norway, Bring Sweden, Bring Denmark | | **Category** | Norwegian national post and Nordic parcel network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CJ949951125NO,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Bring - **No Mybring key**: Bring's documented tracking API (`tracking.bring.com/api/v2/tracking.json`) answers `401` without a Mybring account. `lastscanned` reads the data the public tracking site (`tracking.bring.com`) shows, so no registration is needed. - **Package-level view**: the lookup picks the package matching your number out of a multi-parcel consignment and reports that package's scans. - **Scan codes kept**: `events[].code` holds Bring's `lmEventCode`; Bring's own event statuses (`DELIVERED`, `TRANSPORT_TO_RECIPIENT`, `READY_FOR_PICKUP`, `ATTEMPTED_DELIVERY`, `DEVIATION`, `RETURN`, ...) map to the 7 standard statuses. ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=bring`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}NO$/` with a valid UPU S10 check digit | S10 mod 11 | `CJ949951125NO` | | **Pass 2 (`mayMatch`)** | `/^370\d{15}$/` (Bring's 18-digit parcel number) | — | `CJ949951125NO` | | **Explicit (`?carrier=bring`)** | Any other number Bring tracks | — | — | ### When is `?carrier=bring` optional vs required? - **Optional (auto-detected)**: S10 numbers ending `NO` with a valid check digit (Pass 1) and 18-digit numbers starting `370` when no other carrier claims them (Pass 2). - **Required**: any other Bring or Posten number. S10 numbers ending `SE` or `DK` belong to [PostNord](https://docs.lastscanned.com/carriers/postnord). ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/CJ949951125NO?carrier=bring" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/CJ949951125NO?carrier=bring", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "CJ949951125NO" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "bring", "trackingNumber": "CJ949951125NO", "status": "delivered", "statusDescription": "Delivered", "service": "Norgespakke", "deliveredAt": "2026-10-22T11:42:00Z", "deliveredAtLocal": "2026-10-22T13:42:00", "signedBy": null, "destination": { "city": "Oslo", "state": null, "country": "NO" }, "events": [ { "timestamp": "2026-10-22T11:42:00Z", "localTime": "2026-10-22T13:42:00", "status": "delivered", "description": "Delivered", "location": "OSLO 0150", "code": "H" }, { "timestamp": "2026-10-22T05:55:00Z", "localTime": "2026-10-22T07:55:00", "status": "out_for_delivery", "description": "Loaded for delivery", "location": "OSLO 0150", "code": "I" }, { "timestamp": "2026-10-21T19:20:00Z", "localTime": "2026-10-21T21:20:00", "status": "in_transit", "description": "Arrived at terminal", "location": "OSLO 0580", "code": "X" } ] } ``` > **Times**: Bring sends ISO times; when the time carries an offset, `timestamp` is the exact UTC moment, otherwise only `localTime` is set. > **No record**: a number Bring does not know returns `not_found`. ## Related Resources - **Live browser lookup tool**: [Track a Bring package live on lastscanned.com/lookup/bring](https://lastscanned.com/lookup/bring) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Bringer Parcel Xpress Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bringerparcel Query live **Bringer Parcel Xpress** (`bringerparcel`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bringerparcel` | | **Brand aliases** | Bringer Parcel Xpress, Bringer Parcel, BPX, bringerparcel.com | | **Category** | US parcel delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=BPSY6DDXTUESVPMX,BPSY6DDXTUESVPMX` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^BPS[A-Z0-9]{12,13}$/` | none | `BPSY6DDXTUESVPMX` | | **Pass 2 (`mayMatch`)** | none | none | none | `BPS…` codes belong to Bringer Parcel Xpress alone, so `?carrier=bringerparcel` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/BPSY6DDXTUESVPMX?carrier=bringerparcel" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "bringerparcel", "trackingNumber": "BPSY6DDXTUESVPMX", "status": "label_created", "statusDescription": "Label Created", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-07T08:12:05Z", "localTime": null, "status": "label_created", "description": "Label Created", "location": null, "code": "BPS-0001" }, { "timestamp": "2026-03-07T08:12:01Z", "localTime": null, "status": "label_created", "description": "Label generated", "location": null, "code": null } ] } ``` ## Notes - **Route**: the public tracking JSON (`parcels/track-public`) behind bringerparcel.com's tracking page. No account. - **Time zone**: scan times are UTC instants and the feed names no local zone, so `localTime` is `null`. - **Status**: only label-stage parcels were seen; other statuses are mapped from the carrier's status and event description. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # BRT (Bartolini) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/brt Query live **BRT** (`brt`, formerly Bartolini, Italy's DPD Group express network) package status and scan history in a single synchronous `GET` request or MCP tool call. BRT's 12-digit shipment numbers and 15-digit parcel barcodes share their shape with other carriers, so pass `?carrier=brt`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `brt` | | **Brand & service aliases** | BRT, Bartolini, BRT Corriere Espresso, BRT-fermopoint | | **Category** | Regional (Italy) express parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=brt` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=009010235887,009010123457&carrier=brt` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Examples | |---|---|---| | **Pass 1 (`matches`)** | *None* | — | | **Pass 2 (`mayMatch`)** | *None* | — | | **Explicit (`?carrier=brt`)** | 12 digits (branch 3 + series 2 + serial 7), or 15 digits (the same plus a 3-digit parcel number) | `009010235887`, `009010235887` | Both lengths are also FedEx shapes, so `?carrier=brt` is always required. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/009010235887?carrier=brt" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "009010235887", "carrier": "brt" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "brt", "trackingNumber": "009010235887", "status": "delivered", "statusDescription": "DELIVERED", "service": null, "deliveredAt": "2026-10-23T10:18:00Z", "deliveredAtLocal": "2026-10-23T12:18:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-23T10:18:00Z", "localTime": "2026-10-23T12:18:00", "status": "delivered", "description": "DELIVERED", "location": "Rovereto", "code": null }, { "timestamp": "2026-10-22T20:00:00Z", "localTime": "2026-10-22T22:00:00", "status": "in_transit", "description": "DEPARTED", "location": "Brindisi", "code": null }, { "timestamp": "2026-10-20T10:28:00Z", "localTime": "2026-10-20T12:28:00", "status": "label_created", "description": "SHIPPING INFO SENT TO BRT", "location": "Brindisi", "code": null } ] } ``` ## Status Notes - Event wording is BRT's own English text. `TO BE DELIVERED` (on the vehicle) maps to `out_for_delivery`; `ARRIVED AT BRT-fermopoint` and `To collect at the parcel shop` map to `exception` (action needed by the recipient) and `COLLECTED AT BRT-fermopoint` to `delivered`. - Attempted-delivery, absent, refused, unknown-consignee, deferred and force-majeure scans map to `exception`; `RETURNED TO SENDER` maps to `returned`. - Scan times are Italian local time, so `timestamp` is converted from `Europe/Rome`. Sender and recipient names are not returned. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Bulgarian Posts Tracking API & MCP URL: https://docs.lastscanned.com/carriers/bulgarianposts Query live **Bulgarian Posts** (`bulgarianposts`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `bulgarianposts` | | **Brand aliases** | Bulgarian Posts, Bulgarian Post, Български пощи, bgpost.bg | | **Category** | Bulgarian national post | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RI342985370BG,RI342985370BG` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^PS[0-9A-Z]{11}$/ or UPU S10 ending BG` | S10 check digit on the `BG` form | `RI342985370BG, RI342985370BG` | | **Pass 2 (`mayMatch`)** | none | none | none | Domestic `PS…` numbers and `BG` S10 items with a valid check digit belong to Bulgarian Posts. A foreign S10 item that reaches Bulgaria (for example `…CA`) is tracked with `?carrier=bulgarianposts`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RI342985370BG?carrier=bulgarianposts" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "bulgarianposts", "trackingNumber": "RI342985370BG", "status": "in_transit", "statusDescription": "Receive item at office of exchange (Otb)", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-12T23:00:00Z", "localTime": "2026-02-13T01:00:00", "status": "in_transit", "description": "Receive item at office of exchange (Otb)", "location": "BULGARIA, SOFIA LC/AO", "code": null }, { "timestamp": "2026-02-12T11:04:00Z", "localTime": "2026-02-12T13:04:00", "status": "in_transit", "description": "Receive item from customer (Otb)", "location": "PS 1220", "code": null } ] } ``` ## Notes - **Route**: the JSON that bgpost.bg's tracking page calls (`api/trace/parcel/{number}`). No account. - **Time zone**: scan times carry no zone. For offices in Bulgaria they are Sofia time (`Europe/Sofia`); for foreign offices only `localTime` is set. - **Wording**: international events are in English (UPU wording); domestic ones are in Bulgarian (`Доставена` delivered, `За получаване в ПС` waiting at the post office). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Burd Delivery Tracking API & MCP URL: https://docs.lastscanned.com/carriers/burddelivery Query live **Burd Delivery** (`burddelivery`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `burddelivery` | | **Brand aliases** | Burd Delivery, Burd, burd.dk | | **Category** | Danish web-shop home delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=057450012594228154,057450012594228154` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^0574500\d{11}$/` | GS1 mod 10 (SSCC) | `057450012594228154` | | **Pass 2 (`mayMatch`)** | none | none | none | Burd's 18-digit SSCC (GS1 prefix `0574500…`) with a valid check digit belongs to Burd. A label prints it as `(00)057450012594228154`; the `(00)` is dropped. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/057450012594228154?carrier=burddelivery" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "burddelivery", "trackingNumber": "057450012594228154", "status": "delivered", "statusDescription": "Parcel delivered", "service": null, "deliveredAt": "2026-03-14T16:39:15Z", "deliveredAtLocal": "2026-03-14T17:39:15", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-14T16:39:15Z", "localTime": "2026-03-14T17:39:15", "status": "delivered", "description": "Parcel delivered", "location": null, "code": "delivered" }, { "timestamp": "2026-03-14T11:56:47Z", "localTime": "2026-03-14T12:56:47", "status": "in_transit", "description": "Parcel received by Burd", "location": null, "code": "received" }, { "timestamp": "2026-03-14T05:24:01Z", "localTime": "2026-03-14T06:24:01", "status": "label_created", "description": "Waiting for the web shop to hand over the parcel", "location": null, "code": "registered" } ] } ``` ## Notes - **Route**: the order-status API behind Burd's tracking page. No account. It answers `429` to parallel requests, so batches run one number at a time. - **Time zone**: event times are UTC instants; Burd delivers in Denmark only, so `localTime` is Copenhagen time. - **Wording**: the feed has status types only, so the descriptions are ours (`registered`, `received`, `delivered`); other types are named from the type. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Boyi Hongda Tracking API & MCP URL: https://docs.lastscanned.com/carriers/byhd Query live **Boyi Hongda** (`byhd`) package status and scan history in a single synchronous `GET` request or MCP tool call. Boyi Hongda numbers share their shape with other carriers' numbers, so pass `?carrier=byhd`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `byhd` | | **Brand aliases** | Boyi Hongda, 博益弘达 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=byhd` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=byhd` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Boyi Hongda tracking numbers have no shape of their own, so always pass `?carrier=byhd`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Boyi Hongda in one request. - **Platform**: Boyi Hongda runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # BYT Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/byt Query live **BYT Logistics** (`byt`) package status and scan history in a single synchronous `GET` request or MCP tool call. BYT Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=byt`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `byt` | | **Brand aliases** | BYT Logistics, 百运通物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=byt` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=byt` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | BYT Logistics tracking numbers have no shape of their own, so always pass `?carrier=byt`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to BYT Logistics in one request. - **Platform**: BYT Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # C3X Tracking API & MCP URL: https://docs.lastscanned.com/carriers/c3x Query live **C3X** (`c3x`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `c3x` | | **Brand aliases** | C3X, C3X UAE, c3x.ae | | **Category** | UAE courier and freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2150252125,2150252125` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (10-digit numbers are shared with other carriers; pass `?carrier=c3x`) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - Air waybill (10 digits): `^\d{10}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2150252125?carrier=c3x" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "c3x", "trackingNumber": "2150252125", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-04T09:11:00Z", "deliveredAtLocal": "2026-03-04T13:11:00", "signedBy": "R. KHAN", "destination": { "city": "Abu Dhabi", "state": null, "country": "AE" }, "events": [ { "timestamp": "2026-03-04T09:11:00Z", "localTime": "2026-03-04T13:11:00", "status": "delivered", "description": "Delivered", "location": "Dubai", "code": "POD" }, { "timestamp": "2026-03-03T23:01:00Z", "localTime": "2026-03-04T03:01:00", "status": "out_for_delivery", "description": "With Delivery Courier", "location": "Dubai", "code": "WC" }, { "timestamp": "2026-03-02T17:19:00Z", "localTime": "2026-03-02T21:19:00", "status": "label_created", "description": "Shipment Information Received", "location": "Dubai", "code": "INF" } ] } ``` ## Notes - **Time zone**: scans are printed in UAE time, so `timestamp` is `localTime` converted from UTC+4. - **Proof of delivery**: `signedBy` is the name C3X records on the `POD` scan. - **Format**: 10-digit numbers are not unique to C3X, so pass `?carrier=c3x`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Cacesa Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cacesa Query live **Cacesa** (`cacesa`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cacesa` | | **Brand aliases** | Cacesa, Cacesa Logistica, CNPRT | | **Category** | Spanish parcel and e-commerce logistics | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CNPRT19580011234003703621,CNPRT19580011234003703621` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^CNPRT\d{20}$/` | none | `CNPRT19580011234003703621` | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - CNPRT + 20 digits: `^CNPRT\d{20}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CNPRT19580011234003703621?carrier=cacesa" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "cacesa", "trackingNumber": "CNPRT19580011234003703621", "status": "in_transit", "statusDescription": "Parcel is going out from Cacesa facilities - More delivery information check with transport company.", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-10T14:47:08Z", "localTime": "2026-02-10T15:47:08", "status": "in_transit", "description": "Parcel is going out from Cacesa facilities - More delivery information check with transport company.", "location": null, "code": "ico_almacen" }, { "timestamp": "2026-02-10T14:42:09Z", "localTime": "2026-02-10T15:42:09", "status": "in_transit", "description": "Customs cleared-Green channel", "location": null, "code": "ico_okaduana" }, { "timestamp": "2026-02-06T10:13:16Z", "localTime": "2026-02-06T11:13:16", "status": "label_created", "description": "Electronic notification of shipment received", "location": null, "code": "ico_notification" } ] } ``` ## Notes - **Hand-off**: the last scan tells you to check the transport company for delivery; Cacesa does not return the onward carrier's number. - **Time zone**: Cacesa prints Madrid time; `timestamp` converts from `Europe/Madrid`. - **`code`** is the icon name Cacesa uses for the milestone. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Cainiao Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cainiao Query live **Cainiao Smart Logistics** (`cainiao`, 菜鸟网络 / AliExpress Standard Shipping) cross-border package status, consolidated shipment mappings, and **domestic last-mile tracking numbers** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `LP…` and `AP…` tracking numbers and returns a normalized `TrackingResult` JSON payload. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cainiao` | | **Brand & service aliases** | Cainiao Smart Logistics (菜鸟), Global Cainiao, AliExpress Standard Shipping, AliExpress Selection Standard (`LP…`, `AP…`) | | **Category** | Global cross-border e-commerce logistics network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=LP...,AP...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Cainiao - **Fixes Cainiao's Beijing-time epoch bug**: Like 4PX, Cainiao's `detailList[].time` epoch interprets the local `timeStr` as `UTC+8` regardless of the scan's actual `timeZone` (`GMT-7`, `GMT+2`, etc.). `lastscanned` computes true UTC `timestamp` values directly from `timeStr` + `timeZone` so destination-country scans have accurate UTC timestamps. - **Unpacks last-mile handoffs & consolidated AliExpress parcels**: Cainiao frequently consolidates multiple AliExpress orders into a combined bag (`mailNo`) or hands the parcel to a local last-mile carrier (`realMailNo` / `copyRealMailNo`). `lastscanned` surfaces the exchange number directly in `message`. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Cainiao is evaluated **seventeenth (#17)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — `LP` prefix** | `/^LP\d{14,17}$/i` (`LP` + 14–17 digits = 16–19 chars) | — | `LP00718293048172`, `AP00830954074290` | | **Pass 1 (`matches`) — `AP` prefix** | `/^AP\d{14}$/i` (`AP` + 14 digits = 16 chars) | — | `AP00830954074290` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=cainiao` optional vs required? - **Optional (auto-detected)**: All `LP` + 14–17 digit and `AP` + 14 digit Cainiao waybills auto-detect in Pass 1 (before AxleHire's 16-character alphanumeric rule in Pass 2). - **Required (`?carrier=cainiao`)**: AliExpress Standard Shipping parcels assigned a `CNUSUP…` barcode, a UPU S10 number ending in `SG` / `NL` / `CN`, or a domestic last-mile barcode (`GFUS…`, `926129…`) when you specifically want Cainiao's cross-border scan history alongside the domestic handoff. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/AP00830954074290?carrier=cainiao" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/AP00830954074290?carrier=cainiao", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.message, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "AP00830954074290" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "cainiao", "trackingNumber": "AP00830954074290", "status": "delivered", "statusDescription": "Package delivered", "service": null, "deliveredAt": "2026-10-24T20:15:00Z", "deliveredAtLocal": "2026-10-24T13:15:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "United States" }, "estimatedDelivery": null, "message": "Handed to the destination carrier as UUS5BM1269395824723", "events": [ { "timestamp": "2026-10-24T20:15:00Z", "localTime": "2026-10-24T13:15:00", "status": "delivered", "description": "Package delivered", "location": null, "code": "DELIVERED" }, { "timestamp": "2026-10-24T14:30:00Z", "localTime": "2026-10-24T07:30:00", "status": "out_for_delivery", "description": "Out for delivery", "location": null, "code": "DELIVERING" }, { "timestamp": "2026-10-21T09:10:00Z", "localTime": "2026-10-21T17:10:00", "status": "in_transit", "description": "Leaving from departure country/region", "location": "Hangzhou, China", "code": "LH_DEPART" }, { "timestamp": "2026-10-19T04:05:00Z", "localTime": "2026-10-19T12:05:00", "status": "in_transit", "description": "Received by logistics company", "location": "Shenzhen, China", "code": "SC_INBOUND_SUCCESS" } ] } ``` > **Raw status & action codes**: `events[].code` preserves Cainiao's `actionCode` (`ORDER_CREATED` / `WAIT4PICKUP` → `label_created`, `SC_INBOUND_SUCCESS` / `LH_DEPART` / `CC_IM_SUCCESS` → `in_transit`, `DELIVERING` / `WAIT4SIGN` → `out_for_delivery`, `DELIVERED` / `SIGN_SUCCESS` → `delivered`, `RETURNED_SIGN` → `returned`). ## Chaining Last-Mile Handoffs & Consolidated Orders (`message`) Cainiao's top-level `message` surfaces two critical cross-border links when present: 1. **Last-mile carrier exchange number**: `"Handed to the destination carrier as "` (e.g. a [USPS](https://docs.lastscanned.com/carriers/usps) `926129…`, [UniUni](https://docs.lastscanned.com/carriers/uniuni) `UUS…`, [GOFO](https://docs.lastscanned.com/carriers/gofo) `GFUS…`, or [OnTrac](https://docs.lastscanned.com/carriers/ontrac) `1LS…` number). Pass that number to `GET /v1/track/{realMailNo}` for detailed doorstep scans and city/state destination data. 2. **Consolidated shipment master number**: `"Shipped together as "` when multiple AliExpress items are combined into a single upgraded parcel at Cainiao's consolidation warehouse. ## Related Resources - **Live browser lookup tool**: [Track a Cainiao package live on lastscanned.com/lookup/cainiao](https://lastscanned.com/lookup/cainiao) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Canada Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/canadapost Query live **Canada Post / Postes Canada** (`canadapost`) domestic and international package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` validates 16-digit domestic PINs (`gs1` Mod-10 check digit) and 13-character UPU S10 international items ending in `CA` (`s10` Mod-11 check digit), returning a normalized `TrackingResult` JSON payload—without requiring a Canada Post Developer Program key or commercial customer number. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `canadapost` | | **Brand & service aliases** | Canada Post, Postes Canada, CPC, Xpresspost, Expedited Parcel, Regular Parcel, Priority | | **Category** | Canadian national postal service | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=7012...,EE12...CA` (up to 25 Canada Post numbers per batch; up to 100 total numbers) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Canada Post instead of direct requests - **Avoid CloudFront `403` / `406` blocks & XML SOAP/REST credential setup**: Direct requests to `canadapost-postescanada.ca` from serverless functions often fail with CloudFront `403 "Please log in"` or `406 Not Acceptable` errors, while Canada Post's official Developer Program API requires commercial account registration and XML/Basic Auth credentials. `lastscanned` returns clean JSON in one `fetch()`. - **Pre-validates GS1 Mod-10 & UPU S10 check digits**: `lastscanned` validates the check digit on 16-digit PINs and `…CA` international numbers before making a network call, catching mistyped tracking numbers immediately. - **Smart handling of `"Photo available"` & `"ReadyPickup"` states**: Canada Post frequently inserts a `"Photo available"` informational event above the actual delivery scan, or marks parcels waiting at a post office as `ReadyPickup`. `lastscanned` preserves the true `delivered` description and maps `ReadyPickup` (notice card left / held for pickup) to `exception` so your WISMO bot can alert the recipient. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Canada Post is evaluated **twenty-first (#21)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — 16-digit Domestic PIN** | `/^\d{16}$/` (16 digits) | **Yes — `gs1(n)` (GS1 Mod-10)** | `4007854296017911`, `4007854296017911` | | **Pass 1 (`matches`) — International UPU S10** | `/^[A-Z]{2}\d{9}CA$/i` (2 letters + 9 digits + `CA` = 13 chars) | **Yes — `s10(n)` (UPU Mod-11)** | `4007854296017911`, `LM987654323CA` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### GS1 Mod-10 check-digit algorithm (`gs1`) Every 16-digit Canada Post domestic PIN uses the standard GS1 Mod-10 check digit (weights `3, 1` alternating from the right, excluding the final check digit): ```ts /** GS1 mod 10 (Canada Post 16-digit PINs, SSCC, GTIN): weights 3,1 from the right, check digit excluded. */ export function gs1(n: string): boolean { const body = n.slice(0, -1); let sum = 0; for (let i = 0; i < body.length; i++) sum += Number(body[body.length - 1 - i]) * (i % 2 ? 1 : 3); return (10 - (sum % 10)) % 10 === Number(n.slice(-1)); } ``` ### When is `?carrier=canadapost` required? - **Optional (auto-detected)**: All 16-digit GS1 PINs and 13-character `4007854296017911` S10 international numbers auto-detect in Pass 1. - **Required (`?carrier=canadapost`)**: Legacy 12-digit or 11-digit Canada Post PINs (since 12-digit numbers route to [FedEx](https://docs.lastscanned.com/carriers/fedex) in Pass 1), or inbound international S10 parcels originating outside Canada (e.g. `LA…US`, `RR…GB`, `LY…CN`) once inducted into Canada Post. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/4007854296017911?carrier=canadapost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/4007854296017911?carrier=canadapost", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.service, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "4007854296017911" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "canadapost", "trackingNumber": "4007854296017911", "status": "delivered", "statusDescription": "Delivered to recipient's front door", "service": "Expedited Parcels", "deliveredAt": "2026-10-24T17:18:38Z", "deliveredAtLocal": "2026-10-24T13:18:38", "signedBy": null, "destination": { "city": "GUELPH", "state": "ON", "country": "CA" }, "estimatedDelivery": null, "message": null, "events": [ { "timestamp": "2026-10-24T17:18:38Z", "localTime": "2026-10-24T13:18:38", "status": "delivered", "description": "Delivered to recipient's front door", "location": "GUELPH, ON", "code": "1498" }, { "timestamp": "2026-10-24T12:41:10Z", "localTime": "2026-10-24T08:41:10", "status": "out_for_delivery", "description": "Item out for delivery", "location": "GUELPH, ON", "code": "0174" }, { "timestamp": "2026-10-24T08:12:05Z", "localTime": "2026-10-24T04:12:05", "status": "in_transit", "description": "Item processed", "location": "MISSISSAUGA, ON", "code": "0100" }, { "timestamp": null, "localTime": "2026-10-22", "status": "label_created", "description": "Electronic information submitted by shipper", "location": null, "code": "3000" } ] } ``` > **Raw status & event codes**: `events[].code` preserves Canada Post's 4-digit event code (`"3000"`–`"3002"` electronic notice submitted by shipper, `"0100"`/`"0170"` item processed, `"0174"` out for delivery, `"1400"`–`"1498"` delivered). When a parcel is being returned under a new return PIN (`returnPin`), `message` surfaces `"Being returned under "`. ## Carrier-Specific Status & Integration Notes - **Per-scan timezone offsets**: Every physical Canada Post scan includes its `date`, `time`, and `zoneOffset` (e.g. `"-04:00"`, `"-06:00"`), populating both UTC `timestamp` and local `localTime`. Electronic pre-shipment notices (`3000`–`3002`) carry a date without a clock time (`localTime: "2026-10-22"`, `timestamp: null`). - **Batch size**: `GET /v1/track?numbers=...` and `track_packages` support up to 25 Canada Post numbers per batch call. ## Related Resources - **Live browser lookup tool**: [Track a Canada Post package live on lastscanned.com/lookup/canadapost](https://lastscanned.com/lookup/canadapost) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Canpar Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/canpar Query live **Canpar Express** (`canpar`, a TFI company) package status, signature and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` reads the same public service the tracker on canpar.com uses, so no account or API key is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `canpar` | | **Brand aliases** | Canpar, Canpar Express, Canpar Courier | | **Category** | Canadian domestic and Canada-US courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=canpar` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=canpar` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^D\d{15}$/` (D plus 15 digits) | none | `D576002440000001718010` | | **Pass 2 (`mayMatch`)** | *None* | none | none | | **Explicit (`?carrier=canpar`)** | 16-digit barcodes, `P` pickup tags, `W` delivery notices | none | `D576002440000001718010` | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/D576002440000001718010?carrier=canpar" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/D576002440000001718010?carrier=canpar", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "D576002440000001718010", "carrier": "canpar" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "canpar", "trackingNumber": "D576002440000001718010", "status": "out_for_delivery", "statusDescription": "Out for delivery", "service": "Ground", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Calgary", "state": "AB", "country": "CA" }, "estimatedDelivery": "2026-10-27", "events": [ { "timestamp": "2026-10-27T13:05:12Z", "localTime": "2026-10-27T07:05:12", "status": "out_for_delivery", "description": "Out for delivery", "location": "Calgary, AB", "code": "OFD" }, { "timestamp": "2026-10-26T22:41:03Z", "localTime": "2026-10-26T18:41:03", "status": "in_transit", "description": "Arrived at terminal", "location": "Toronto, ON", "code": "ARR" } ] } ``` ## Notes - **Time zones**: scan times are local to the terminal with no zone, so `timestamp` is derived from the province of the scan's address (Canadian provinces and territories). A scan with no address keeps only `localTime`. - **Unknown numbers**: Canpar answers a number it has no record of with an empty result, which comes back as `404 not_found`. - **Other shapes**: pickup tags (`P...`), delivery notices (`W...`) and 16-digit barcodes are not auto-detected; pass `?carrier=canpar`. - **Sister brands**: [Loomis Express](https://docs.lastscanned.com/carriers/loomis) is also part of TFI but runs its own tracker. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Cargus Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cargus Query live **Cargus** (`cargus`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cargus` | | **Brand aliases** | Cargus Romania, Urgent Cargus | | **Category** | Domestic and international parcels (Romania) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: Cargus barcodes are 8 to 20 letters or digits, which many carriers share, so pass `?carrier=cargus`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1145101305?carrier=cargus" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "cargus", "trackingNumber": "1145101305", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-04-28T09:33:16Z", "deliveredAtLocal": "2026-04-28T12:33:16", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-04-28T09:33:16Z", "localTime": "2026-04-28T12:33:16", "status": "delivered", "description": "Delivered", "location": "MIERCUREA CIUC, Harghita", "code": null }, { "timestamp": "2026-04-28T05:35:40Z", "localTime": "2026-04-28T08:35:40", "status": "out_for_delivery", "description": "With courier", "location": "MIERCUREA CIUC, Harghita", "code": null }, { "timestamp": "2026-04-28T05:27:41Z", "localTime": "2026-04-28T08:27:41", "status": "in_transit", "description": "Received in warehouse Miercurea Ciuc [Depozit]", "location": "MIERCUREA CIUC, Harghita", "code": null }, { "timestamp": "2026-04-25T18:29:48Z", "localTime": "2026-04-25T21:29:48", "status": "in_transit", "description": "Consolidation scan", "location": "BRASOV, Brasov", "code": null } ] } ``` ## Notes - **Source**: the JSON (`cmacwabackend.azurewebsites.net/api/Awbs/ShortTrace`) that the Cargus tracking web app calls, with the three fixed headers the app sends to every visitor. No account is needed. - **Time zone**: scan clocks are Romanian local time, converted from `Europe/Bucharest`. - **Not found**: an unknown barcode returns HTTP 204 with no body, which becomes `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Castle Parcels Tracking API & MCP URL: https://docs.lastscanned.com/carriers/castleparcels Query live **Castle Parcels** (`castleparcels`) package status and scan history in a single synchronous `GET` request or MCP tool call. Castle Parcels is part of the Freightways group in New Zealand. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `castleparcels` | | **Brand aliases** | Castle Parcels, Castle Courier, Freightways | | **Category** | Regional courier (New Zealand) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=castleparcels` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=castleparcels` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Castle Parcels tickets, charge labels and consignment numbers share shapes with other carriers and with the other Freightways brands, so there is no auto-detection: always pass `?carrier=castleparcels`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/XL00325000?carrier=castleparcels" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "castleparcels", "trackingNumber": "XL00325000", "status": "in_transit", "statusDescription": "We've picked up your parcel", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-10-21T01:00:17Z", "localTime": "2026-10-21T14:00:17", "status": "in_transit", "description": "Picked Up", "location": "Whanganui, Whanganui District", "code": "P" }, { "timestamp": "2026-10-20T22:30:00Z", "localTime": "2026-10-21T11:30:00", "status": "label_created", "description": "Label Created", "location": "Penrose, Auckland", "code": "P" } ] } ``` ## Notes - **Time zone**: the carrier sends scan times in UTC; `timestamp` keeps them and `localTime` is the same moment on the New Zealand clock (`Pacific/Auckland`). - **Networks**: NZ Couriers, Post Haste and Castle Parcels are Freightways brands that answer from one tracking service. Each network only knows its own consignments, so use the carrier slug of the brand that sent the parcel. - **Number shapes**: a courier ticket or pack is a product code and a number (`AB XL00325000`, the space or hyphen is kept). Anything else is searched as typed, without leading zeros. Customer-printed labels that need the sender's account number as well are not supported. - **Errors**: a number the network does not know is `not_found`. A short query (under 6 characters) is also `not_found`, and a query that matches several consignments is a `carrier_error` asking for a longer number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Transportes Castores Tracking API & MCP URL: https://docs.lastscanned.com/carriers/castores Query live **Transportes Castores** (`castores`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `castores` | | **Brand aliases** | Castores, Transportes Castores, Grupo Castores, Castores talon | | **Category** | Mexican LTL freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=11150184653,11150184653` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (11-digit talons are shared; pass `?carrier=castores`) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - Talon (guia), 11 digits: `^\d{11}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/11150184653?carrier=castores" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "castores", "trackingNumber": "11150184653", "status": "delivered", "statusDescription": "Entregado: ENTREGADO AL CLIENTE", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-05-20T09:40:50", "signedBy": null, "destination": { "city": "Cd. Del Carmen", "state": "CAMP", "country": "MX" }, "events": [ { "timestamp": null, "localTime": "2026-05-20T09:40:50", "status": "delivered", "description": "Entregado: ENTREGADO AL CLIENTE", "location": "Villahermosa", "code": null }, { "timestamp": null, "localTime": "2026-05-20T09:28:16", "status": "out_for_delivery", "description": "En Ruta de Entrega: EN TRAYECTO", "location": "Villahermosa", "code": null }, { "timestamp": null, "localTime": "2026-05-12T18:06:58", "status": "in_transit", "description": "Recolectado: EN TRAYECTO", "location": "Leon San Miguel", "code": null }, { "timestamp": null, "localTime": "2026-05-12T16:35:36", "status": "label_created", "description": "Documentado: EN BODEGA ORIGEN", "location": "Leon San Miguel", "code": null } ] } ``` ## Notes - **Time zone**: Mexico spans several zones and the page prints none, so only `localTime` is set and `timestamp` is `null`. - **Wording**: scans are in Spanish, as `Stage: remark` (for example `Entregado: ENTREGADO AL CLIENTE`). - **Source**: the server-rendered `castores.com.mx/rastrear.html` page; no login. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # CCFS Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ccfs Query live **CCFS** (`ccfs`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ccfs` | | **Brand aliases** | CCFS, CrossCountry Freight Solutions, Cross Country Freight Solutions, CCFS PRO | | **Category** | US less-than-truckload freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=873562089096,873562089096` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (12-digit PROs overlap other carriers; pass `?carrier=ccfs`) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - PRO number (12 digits): `^\d{12}$` - Bill number (letter + 7 digits): `^[A-Z]\d{7}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/873562089096?carrier=ccfs" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ccfs", "trackingNumber": "873562089096", "status": "delivered", "statusDescription": "Delivery completed", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-06-11T15:04:04", "signedBy": "J. SMITH", "destination": { "city": "Boise", "state": "ID", "country": "US" }, "estimatedDelivery": "2026-06-11", "events": [ { "timestamp": null, "localTime": "2026-06-11T15:04:04", "status": "delivered", "description": "Delivery completed", "location": "Boise, ID", "code": null }, { "timestamp": null, "localTime": "2026-06-11T08:02:51", "status": "in_transit", "description": "Departed from consignee", "location": "Nampa, ID", "code": null }, { "timestamp": null, "localTime": "2026-06-08T21:49:41", "status": "in_transit", "description": "Linehaul departure", "location": "Salt Lake City, UT", "code": null }, { "timestamp": null, "localTime": "2026-06-08T06:24:13", "status": "in_transit", "description": "Out for pickup", "location": "Salt Lake City, UT", "code": null } ] } ``` ## Notes - **Exact match only**: CCFS's lookup can return several consignments for a loose number; only the one whose PRO or bill number equals the number you passed is used. - **Time zone**: terminals span US zones and no zone is printed, so only `localTime` is set. - **`estimatedDelivery`** is CCFS's expected delivery date. - **Format**: PRO numbers overlap other carriers, so pass `?carrier=ccfs`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # CDEK Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cdek Query live **CDEK** (`cdek`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cdek` | | **Brand aliases** | CDEK Express, СДЭК, SDEK | | **Category** | Domestic and cross-border parcels (Russia, CIS) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: CDEK numbers are 10 or 11 digits, a shape that is not exclusive, so pass `?carrier=cdek`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/10125499355?carrier=cdek" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "cdek", "trackingNumber": "10125499355", "status": "delivered", "statusDescription": "Вручён", "service": null, "deliveredAt": "2026-08-11T07:04:00Z", "deliveredAtLocal": "2026-08-11T11:04:00", "signedBy": null, "destination": { "city": "Баку", "state": null, "country": "AZ" }, "events": [ { "timestamp": "2026-08-11T07:04:00Z", "localTime": "2026-08-11T11:04:00", "status": "delivered", "description": "Вручён", "location": null, "code": "DELIVERED" }, { "timestamp": "2026-06-12T15:52:34Z", "localTime": "2026-06-12T11:52:34", "status": "in_transit", "description": "Отправлено в г. Нью-Йорк", "location": "Нью-Касл", "code": "SENT_TO_NEXT_CITY" }, { "timestamp": "2026-06-07T15:23:05Z", "localTime": "2026-06-07T11:23:05", "status": "in_transit", "description": "Принят на доставку", "location": "Нью-Касл", "code": "ACCEPTED_FOR_DELIVERY" }, { "timestamp": "2026-06-07T15:22:57Z", "localTime": "2026-06-07T11:22:57", "status": "label_created", "description": "Создан", "location": null, "code": "CREATED" } ] } ``` ## Notes - **Source**: the JSON behind the my.cdek.ru order page (`/api/lkfl/v3/tracing/trackInfoBeta/{number}`). No account is needed. - **Stages and scans**: CDEK reports order stages (`CREATED`, `IN_PROGRESS`, `DELIVERED`, `NOT_DELIVERED`). The `IN_PROGRESS` stage is replaced by the per-city scans listed under it. - **Time zone**: CDEK sends UTC. `localTime` uses the city's own offset for city scans, the sender office's for the creation stage and the receiver office's for the closing stages. - **Wording**: stage and scan names are CDEK's own Russian text, with the stage code in `code`. - **Not found**: HTTP 404 with `tracing.cant_determine_order` becomes `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # CDL Last Mile Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cdl Query live **CDL Last Mile Solutions** (`cdl`) package status and scan history across the US Northeast and Mid-Atlantic in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `CDL…` label numbers in Pass 1 and hyphenated `943506776-0` order numbers in Pass 2, returning a normalized `TrackingResult` JSON payload—without requiring a CDL shipper account. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cdl` | | **Brand & service aliases** | CDL Last Mile Solutions, CDL Delivers | | **Category** | US Northeast & Mid-Atlantic regional last-mile carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CDL...,CDL...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for CDL Last Mile - **No shipper portal credentials**: CDL's merchant tracking feeds require an active shipper relationship. `lastscanned` lets any application or WISMO agent query CDL shipments synchronously via `GET /v1/track/943506776-0?carrier=cdl`. - **Fixes out-of-order delivery scans & duplicate photo rows**: CDL stamps `"Delivery complete"` truncated to the whole minute (which can sort chronologically before the `"Package Scanned at Delivery"` doorstep scan taken seconds later in the same minute) and emits duplicate event rows when a driver uploads two proof-of-delivery photos. `lastscanned` sorts `"Delivery complete"` to the top of its minute and deduplicates identical photo rows automatically. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) CDL Last Mile is evaluated **eleventh (#11)** in `lastscanned`'s two-pass detector and supports both Pass 1 (`matches`) and Pass 2 (`mayMatch`): | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — CDL label** | `/^CDL\d{11}$/i` (`CDL` + 11 digits = 14 chars) | — | `CDL02855120513` | | **Pass 2 (`mayMatch`) — CDL order number** | `/^\d{9}-\d$/` (9 digits + hyphen + 1 digit = 11 chars) | — | `943506776-0` | ### When is `?carrier=cdl` optional vs required? - **Optional (auto-detected)**: All `CDL` + 11-digit labels (Pass 1) and `943506776-0`-style hyphenated order numbers (Pass 2). - **Required (`?carrier=cdl`)**: Custom shipper references (such as `CDDL07909376`, plain numeric order IDs, or internal `13509.031725` tracking IDs). ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/943506776-0?carrier=cdl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/943506776-0?carrier=cdl", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.statusDescription, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "CDL02855120513" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "cdl", "trackingNumber": "943506776-0", "status": "delivered", "statusDescription": "Delivery complete", "service": null, "deliveredAt": "2026-10-24T18:14:00Z", "deliveredAtLocal": "2026-10-24T14:14:00", "signedBy": null, "destination": { "city": "BROOKLYN", "state": "NY", "country": "US" }, "estimatedDelivery": null, "events": [ { "timestamp": "2026-10-24T18:14:00Z", "localTime": "2026-10-24T14:14:00", "status": "delivered", "description": "Delivery complete", "location": "BROOKLYN, NY", "code": null }, { "timestamp": "2026-10-24T18:14:27Z", "localTime": "2026-10-24T14:14:27", "status": "out_for_delivery", "description": "Package Scanned at Delivery", "location": "BROOKLYN, NY", "code": null }, { "timestamp": "2026-10-24T12:05:11Z", "localTime": "2026-10-24T08:05:11", "status": "out_for_delivery", "description": "Package Out For Delivery", "location": "CARLSTADT, NJ", "code": null }, { "timestamp": "2026-10-24T08:32:44Z", "localTime": "2026-10-24T04:32:44", "status": "in_transit", "description": "Package Scanned at Local Delivery Center", "location": "CARLSTADT, NJ", "code": null }, { "timestamp": "2026-10-23T19:20:00Z", "localTime": "2026-10-23T15:20:00", "status": "label_created", "description": "Label has been created", "location": "CARLSTADT, NJ", "code": null } ] } ``` > **Raw status & exception flags**: CDL scans do not use separate event codes (`events[].code` is `null`), but include an `isException` boolean flag (e.g. on `"DELAYED- Wrong Address"` or `"Awaiting Package From Shipper"`). `lastscanned` maps `"Awaiting Package"` and `"Label has been created"` to `label_created`, `"Package Out For Delivery"` and `"Package Scanned at Delivery"` to `out_for_delivery`, `"Delivery complete"` to `delivered`, and flagged delay scans to `exception`. ## Carrier-Specific Status & Integration Notes - **Eastern Time UTC conversion**: CDL operates across Eastern Time states (`CT`, `DC`, `DE`, `GA`, `MA`, `MD`, `ME`, `NC`, `NH`, `NJ`, `NY`, `OH`, `PA`, `RI`, `SC`, `VA`, `VT`, `WV`), so scans in those states convert to exact UTC in `timestamp` using `America/New_York`. - **No `estimatedDelivery` field**: CDL does not publish an estimated delivery timestamp on public tracking records, so `estimatedDelivery` is always `null`. ## Related Resources - **Live browser lookup tool**: [Track a CDL Last Mile package live on lastscanned.com/lookup/cdl](https://lastscanned.com/lookup/cdl) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Central Transport Tracking API & MCP URL: https://docs.lastscanned.com/carriers/centraltransport Query live **Central Transport** (`centraltransport`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `centraltransport` | | **Brand aliases** | Central Transport, Central Transport International, CTII, centraltransport.com | | **Category** | US less-than-truckload freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=301628376,301628376` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (9 to 11 digit PROs overlap other carriers; pass `?carrier=centraltransport`) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - PRO number (9 to 11 digits): `^\d{9,11}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/301628376?carrier=centraltransport" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "centraltransport", "trackingNumber": "301628376", "status": "delivered", "statusDescription": "Delivered.", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-04-08T11:09:00", "signedBy": null, "destination": { "city": "Bellingham", "state": "WA", "country": "US" }, "estimatedDelivery": "2026-04-08", "events": [ { "timestamp": null, "localTime": "2026-04-08T11:09:00", "status": "delivered", "description": "Delivered.", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-04-08T08:52:29", "status": "out_for_delivery", "description": "Out For Delivery", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-04-02T12:45:57", "status": "in_transit", "description": "Picked Up", "location": "FRESNO, CA", "code": null } ] } ``` ## Notes - **Two calls**: the PRO is traced first (which yields Central Transport's internal key), then the scan history is fetched with it. The summary's latest status is added when the history does not already hold it. - **Time zone**: terminals span US zones, so only `localTime` is set. - **Dashes**: `150-2454720-8` and `15024547208` are the same number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Česká pošta (Czech Post) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ceskaposta Query live **Česká pošta** (`ceskaposta`) consignment status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending `CZ` and returns a normalized `TrackingResult` JSON payload. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ceskaposta` | | **Brand & service aliases** | Česká pošta, Ceska posta, Czech Post, Česká pošta s.p., postaonline.cz | | **Category** | Czech national post | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RR340999915CZ,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Česká pošta - **No WAF to fight**: `ceskaposta.cz` rejects most scripted requests. `lastscanned` calls the ParcelHistory service that the `postaonline.cz` tracking page uses, which answers a plain request. - **English wording**: scan texts are requested in English and mapped to the 7 standard statuses (`being delivered` to `out_for_delivery`, `deposited - addressee not at home` to `exception`, `returned to the sender` to `returned`). - **Scan ids kept**: `events[].code` holds Česká pošta's state id (`21` taken into transport, `51` prepared for delivery, `53` being delivered, `82` deposited, `9V` returned). ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=ceskaposta`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}CZ$/` with a valid UPU S10 check digit | S10 mod 11 | `RR340999915CZ` | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=ceskaposta`)** | Other numbers Česká pošta tracks | — | — | ### When is `?carrier=ceskaposta` optional vs required? - **Optional (auto-detected)**: S10 numbers ending `CZ` with a valid check digit. - **Required**: any other Česká pošta number. Domestic parcel numbers of the `DR…` kind are answered with a "not shown" notice by this service and come back as `not_found`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/RR340999915CZ?carrier=ceskaposta" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/RR340999915CZ?carrier=ceskaposta", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "RR340999915CZ" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "ceskaposta", "trackingNumber": "RR340999915CZ", "status": "out_for_delivery", "statusDescription": "The consignment is being delivered.", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-26", "status": "out_for_delivery", "description": "The consignment is being delivered.", "location": "Praha 011, 11000", "code": "53" }, { "timestamp": null, "localTime": "2026-10-26", "status": "in_transit", "description": "The consignment is being prepared for delivery.", "location": "Praha 011, 11000", "code": "51" }, { "timestamp": null, "localTime": "2026-10-24", "status": "in_transit", "description": "The consignment was sent for transportation.", "location": "Brno 2, 60200", "code": "21" }, { "timestamp": null, "localTime": "2026-10-23", "status": "label_created", "description": "Receipt of data about consignment.", "location": null, "code": "-M" } ] } ``` > **Dates only**: Česká pošta gives each scan a date without a time of day, so `timestamp` is always `null` and `localTime` is a date (`"2026-10-26"`). Scans on the same day keep Česká pošta's order. > **No record**: a number with no record returns `not_found`. ## Related Resources - **Live browser lookup tool**: [Track a Česká pošta package live on lastscanned.com/lookup/ceskaposta](https://lastscanned.com/lookup/ceskaposta) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # CEVA Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cevalogistics Query live **CEVA Logistics** (`cevalogistics`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cevalogistics` | | **Brand aliases** | CEVA, CEVA Logistics, myCEVA, CEVA Trak | | **Category** | Contract logistics and freight (house bills) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=OV91069550,OV91069550` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (alphanumeric house bills overlap other carriers; pass `?carrier=cevalogistics`) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - House bill (letters + digits): `^(?=[A-Z]*\d)[A-Z0-9]{5,40}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/OV91069550?carrier=cevalogistics" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "cevalogistics", "trackingNumber": "OV91069550", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-07-12T03:10:00", "signedBy": null, "destination": { "city": "San Ramon", "state": null, "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-07-12T10:00:01", "status": "in_transit", "description": "Delivery Window Confirmed with Customer", "location": "San Ramon, US", "code": "APPSET" }, { "timestamp": null, "localTime": "2026-07-12T03:10:00", "status": "delivered", "description": "Delivered", "location": "San Ramon, US", "code": "POD" }, { "timestamp": null, "localTime": "2026-07-09T15:18:50", "status": "out_for_delivery", "description": "Check Out for Delivery", "location": "San Ramon, US", "code": "CHKOFD" }, { "timestamp": null, "localTime": "2026-07-06T04:07:30", "status": "label_created", "description": "Booking Created", "location": "Ontario, US", "code": "HAWBCR" } ] } ``` ## Notes - **Delivered status**: CEVA can post a delivery-window update dated after the delivery scan, so the shipment is `delivered` when CEVA's own latest milestone is `Delivered`, whatever the newest event is. - **Time zone**: CEVA prints each office's wall clock with a meaningless `+0000`, so only `localTime` is set. - **Lookup**: numbers are looked up as house bills. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Chazki Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chazki Query live **Chazki** (`chazki`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chazki` | | **Brand aliases** | Chazki, Chazki Peru, Chazki Argentina, Chazki Mexico | | **Category** | Last-mile delivery in Peru, Argentina, Chile, Colombia and Mexico | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=202300036735,202300036735` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (track codes overlap other carriers; pass `?carrier=chazki`) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - Track code (6 to 40 letters and digits): `^(?=[A-Z]*\d)[A-Z0-9]{6,40}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/202300036735?carrier=chazki" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "chazki", "trackingNumber": "202300036735", "status": "delivered", "statusDescription": "Entregado", "service": "NEXT DAY", "deliveredAt": null, "deliveredAtLocal": "2026-03-09T10:44:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-09T10:44:00", "status": "delivered", "description": "Entregado", "location": null, "code": "166" }, { "timestamp": null, "localTime": "2026-03-09T09:07:00", "status": "out_for_delivery", "description": "En tránsito a entregar el pedido", "location": null, "code": "162" }, { "timestamp": null, "localTime": "2026-03-09T05:17:00", "status": "in_transit", "description": "En programación", "location": null, "code": "155" }, { "timestamp": null, "localTime": "2026-03-09T05:17:00", "status": "label_created", "description": "Orden ingresada", "location": null, "code": "154" } ] } ``` ## Notes - **Two calls**: the track code is turned into an order id, then the order's status history is read. - **Steps**: only the statuses Chazki's own tracking page shows are returned (ordered, programmed, going to collect, going to deliver, delivered, failed, returned, cancelled); internal steps are skipped. - **Time zone**: the answer names no country or zone, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # CD International Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chengda Query live **CD International** (`chengda`) package status and scan history in a single synchronous `GET` request or MCP tool call. CD International numbers share their shape with other carriers' numbers, so pass `?carrier=chengda`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chengda` | | **Brand aliases** | CD International, 诚达国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=chengda` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=chengda` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | CD International tracking numbers have no shape of their own, so always pass `?carrier=chengda`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to CD International in one request. - **Platform**: CD International runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Chilexpress Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chilexpress Query live **Chilexpress** (`chilexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chilexpress` | | **Brand aliases** | Chilexpress, Chilexpress Chile, OT, orden de transporte | | **Category** | Chilean parcel and express courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=21401502990,21401502990` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (10 to 12 digit transport orders overlap other carriers; pass `?carrier=chilexpress`) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - Transport order (OT), 10 to 12 digits: `^\d{10,12}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/21401502990?carrier=chilexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "chilexpress", "trackingNumber": "21401502990", "status": "delivered", "statusDescription": "Envío entregado al destinatario", "service": "EXPRESS", "deliveredAt": null, "deliveredAtLocal": "2026-09-17T09:51:59", "signedBy": "Maria Gonzalez", "destination": { "city": "Las Condes", "state": null, "country": "CL" }, "estimatedDelivery": "2026-09-17", "events": [ { "timestamp": null, "localTime": "2026-09-17T09:51:59", "status": "delivered", "description": "Envío entregado al destinatario", "location": "Las Condes", "code": "9" }, { "timestamp": null, "localTime": "2026-09-17T08:14:00", "status": "out_for_delivery", "description": "Envío en despacho al destinatario", "location": "Las Condes", "code": "13" }, { "timestamp": null, "localTime": "2026-09-16T17:05:00", "status": "in_transit", "description": "Envío en PUDAHUEL", "location": "Pudahuel", "code": "5" }, { "timestamp": null, "localTime": "2026-09-15T12:30:00", "status": "in_transit", "description": "Envío recepcionado por Chilexpress", "location": "Providencia", "code": "4" } ] } ``` ## Notes - **Source**: the API behind Chilexpress's help-centre tracking page. The page's own script carries the subscription key and a client-credentials app id and secret, so an access token is requested the way the site does and reused until it nears expiry. - **Time zone**: Chilexpress prints local Chilean time without a zone, so only `localTime` is set. - **Held shipments**: custody, delay, refusal and branch-pickup scans are `exception`; the reason Chilexpress records is appended to the description. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # China Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chinapost Query live **China Post** (`chinapost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chinapost` | | **Brand aliases** | China Post, 中国邮政, ChinaPost, China Post e-packet, EMS China app | | **Category** | China Post international mail (S10 numbers ending CN) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=LZ430297212CN,LZ430297212CN` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `UPU S10 *CN` numbers that do not start with `E` (valid check digit); `E…CN` EMS numbers go to `ems` | none | `LZ430297212CN` | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - S10 international mail (not EMS): `^[A-DF-Z][A-Z]\d{9}CN$` - Domestic EMS (13 digits, pass ?carrier=chinapost): `^\d{13}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/LZ430297212CN?carrier=chinapost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "chinapost", "trackingNumber": "LZ430297212CN", "status": "delivered", "statusDescription": "【巴西】已妥投", "service": "e邮宝", "deliveredAt": null, "deliveredAtLocal": "2026-08-25T15:16:00", "signedBy": null, "destination": null, "message": "Showing the latest 3 of 23 scans", "events": [ { "timestamp": null, "localTime": "2026-08-25T15:16:00", "status": "delivered", "description": "【巴西】已妥投", "location": "巴西", "code": "463" }, { "timestamp": null, "localTime": "2026-08-25T09:54:00", "status": "out_for_delivery", "description": "【巴西】安排投递", "location": "巴西", "code": "462" }, { "timestamp": null, "localTime": "2026-08-24T13:24:00", "status": "in_transit", "description": "离开境外经转局", "location": null, "code": "489" } ] } ``` ## Notes - **Source**: the China EMS mobile app's API, with the app's request signature (an HMAC-SHA256 header). It is not the UPU tracker `ems` uses, so it also answers `LZ`, `RR`, `CX` and similar numbers. - **Latest scans only**: the API returns the three most recent scans of a longer history; `message` says how many exist. - **Wording**: scans are in Chinese. Times are Beijing time at home and each office's local time abroad, so only `localTime` is set. - **Domestic numbers**: 13-digit domestic numbers can be looked up with `?carrier=chinapost`; they are not auto-detected. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Chit Chats Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chitchats Query live **Chit Chats** (`chitchats`) package status, scan history, and the **handoff carrier's tracking number** in a single synchronous `GET` request or MCP tool call. Chit Chats ids are too generic to auto-detect, so pass `?carrier=chitchats`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chitchats` | | **Brand aliases** | Chit Chats, ChitChats, chitchats.com | | **Category** | Cross-border shipper (Canada to US and international) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=chitchats` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=A1B2C3D4E5,F6G7H8J9K0&carrier=chitchats` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | A Chit Chats id is 10 upper-case letters and digits (for example `A1B2C3D4E5`), a shape other carriers also use, so it is never auto-detected. Always pass `?carrier=chitchats`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/A1B2C3D4E5?carrier=chitchats" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "chitchats", "trackingNumber": "A1B2C3D4E5", "status": "delivered", "statusDescription": "Delivered, In/At Mailbox", "service": "Chit Chats U.S. Edge", "deliveredAt": "2026-03-15T23:56:28Z", "deliveredAtLocal": "2026-03-15T16:56:28", "signedBy": null, "destination": { "city": "Springfield", "state": "MA", "country": "US" }, "message": "Handed to USPS as A1B2C3D4E5", "events": [ { "timestamp": "2026-03-15T23:56:28Z", "localTime": "2026-03-15T16:56:28", "status": "delivered", "description": "Delivered, In/At Mailbox", "location": "SPRINGFIELD, MA", "code": null }, { "timestamp": "2026-03-15T14:10:00Z", "localTime": "2026-03-15T07:10:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "SPRINGFIELD, MA", "code": null } ] } ``` ## Notes - **Handoff**: `message` names the carrier Chit Chats passed the parcel to and its number (for example `"Handed to USPS as A1B2C3D4E5"`). Pass that number to `GET /v1/track/{number}` for the partner's own scans. - **Time zone**: Chit Chats event times carry a UTC offset, so `timestamp` and `localTime` are exact. - **Unknown ids**: an id Chit Chats does not know, or one that cannot be an id, returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Chronodiali Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chronodiali Query live **Chronodiali** (`chronodiali`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chronodiali` | | **Brand aliases** | Chronodiali, Chrono Diali, chronodiali.ma | | **Category** | Moroccan express courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CD2702223035,CD2702223035` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(?:CHPU\d{19}\|CD\d{10})$/` | none | `CD2702223035` | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - CD + 10 digits: `^CD\d{10}$` - CHPU + 19 digits: `^CHPU\d{19}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CD2702223035?carrier=chronodiali" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "chronodiali", "trackingNumber": "CD2702223035", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-08-01T13:51:24Z", "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Sale", "state": null, "country": "MA" }, "events": [ { "timestamp": "2026-08-01T13:51:24Z", "localTime": null, "status": "delivered", "description": "Delivered", "location": "Rabat", "code": "delivered" }, { "timestamp": "2026-08-01T10:56:28Z", "localTime": null, "status": "out_for_delivery", "description": "Out For Delivery", "location": "Rabat", "code": "accept" }, { "timestamp": "2026-07-27T09:45:48Z", "localTime": null, "status": "in_transit", "description": "Arrived In Country", "location": "Casablanca", "code": "arrived_in_country" }, { "timestamp": "2026-07-12T00:33:51Z", "localTime": null, "status": "label_created", "description": "Pickup Awaited", "location": "Casablanca", "code": "pickup_awaited" } ] } ``` ## Notes - **Source**: Chronodiali's tracking page calls a Shipsy consignment API with a published key. - **Time zone**: only the UTC time is given; `localTime` is `null` because Morocco's offset changes around Ramadan. - **Skipped rows**: internal rows (call logs, data updates, courier assignment) are left out; failed attempts add the reason (for example no answer) in French. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Chronopost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chronopost Query live **Chronopost** (`chronopost`) parcel status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` reads Chronopost's own tracking web service and returns a normalized `TrackingResult` JSON payload, with every scan's UTC time worked out from the offset Chronopost prints. Chronopost S10 numbers ending `FR` also auto-detect to [La Poste](https://docs.lastscanned.com/carriers/laposte); pass `?carrier=chronopost` to read Chronopost's own record. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chronopost` | | **Brand & service aliases** | Chronopost, Chronopost Express, Chrono 13, Chrono Relais, Chronopost France | | **Category** | French express parcel carrier (La Poste group) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=PZ282567966EE,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Chronopost - **No tracking-page bot wall**: `chronopost.fr` serves its tracking page behind a Cloudflare challenge. `lastscanned` calls the web service the page itself relies on, so a single `fetch()` returns JSON-shaped results instead. - **Exact UTC times**: Chronopost prints each scan with its offset (`+02:00` in summer, `+01:00` in winter). `lastscanned` keeps that offset, so `timestamp` is correct in both seasons. - **Scan codes kept**: `events[].code` holds Chronopost's own code (`D` delivered, `TA` in delivery, `BL` premises closed, `SK` waiting for information, `PE` collected by the carrier). ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=chronopost`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=chronopost`)** | Chronopost parcel numbers (for example 2 letters + 9 digits + `FR`) | — | `PZ282567966EE` | ### When is `?carrier=chronopost` required? - **Always for Chronopost-only lookups**: no number shape belongs to Chronopost alone. UPU S10 numbers ending `FR` (check digit valid) route to [La Poste](https://docs.lastscanned.com/carriers/laposte) in Pass 1, which also answers for Chronopost parcels. Add `?carrier=chronopost` to ask Chronopost's own service instead. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/PZ282567966EE?carrier=chronopost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/PZ282567966EE?carrier=chronopost", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "PZ282567966EE", "carrier": "chronopost" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "chronopost", "trackingNumber": "PZ282567966EE", "status": "out_for_delivery", "statusDescription": "Shipment in delivery to the consignee", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-26T09:15:37Z", "localTime": "2026-10-26T10:15:37", "status": "out_for_delivery", "description": "Shipment in delivery to the consignee", "location": "TOURS CHRONOPOST 37000", "code": "TA" }, { "timestamp": "2026-10-25T17:02:11Z", "localTime": "2026-10-25T18:02:11", "status": "in_transit", "description": "Sorted at delivery location", "location": "TOURS CHRONOPOST 37000", "code": "SD" }, { "timestamp": "2026-10-24T14:40:03Z", "localTime": "2026-10-24T16:40:03", "status": "in_transit", "description": "Parcel collected by Carrier", "location": "AVIGNON CHRONOPOST 84000", "code": "PE" } ] } ``` > **No record**: a number Chronopost has no scans for returns `not_found`. Scan locations are the Chronopost agency name and its postcode; Chronopost's service gives no package-level status, so `status` comes from the newest scan. ## Related Resources - **Live browser lookup tool**: [Track a Chronopost package live on lastscanned.com/lookup/chronopost](https://lastscanned.com/lookup/chronopost) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # CK1 / Chukou1 Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chukou1 Query live **CK1 / Chukou1** (`chukou1`) package status, scan history, and the **last-mile carrier's tracking number** in a single synchronous `GET` request or MCP tool call. Chukou1 order numbers are not exclusive to it, so pass `?carrier=chukou1` (a loose shape check is only a last-resort guess). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chukou1` | | **Brand aliases** | CK1, Chukou1, 出口易, EC-FirstClass | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=chukou1` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=chukou1` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^[A-Z]{3}\d{6,7}LW\d{6,8}$/` | none | `SUF2403231LW1003974` | Pass `?carrier=chukou1` for any other order-number shape. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SUF2403231LW1003974?carrier=chukou1" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "chukou1", "trackingNumber": "SUF2403231LW1003974", "status": "delivered", "statusDescription": "SPRINGFIELD, IL, 62701, Delivered, In/At Mailbox", "service": "USPS", "deliveredAt": null, "deliveredAtLocal": "2025-01-14T13:31:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "United States" }, "message": "Handed to USPS as 9400111899223344556677", "events": [ { "timestamp": null, "localTime": "2025-01-14T13:31:00", "status": "delivered", "description": "SPRINGFIELD, IL, 62701, Delivered, In/At Mailbox", "location": null, "code": null }, { "timestamp": null, "localTime": "2025-01-08T14:00:00", "status": "in_transit", "description": "United States, Turned over to last mile facility", "location": null, "code": null }, { "timestamp": null, "localTime": "2025-01-02T15:16:00", "status": "label_created", "description": "Shipment information received", "location": null, "code": null } ] } ``` ## Notes - **Handoff**: `message` names the last-mile carrier and its number (for example `"Handed to USPS as 9400111899223344556677"`). Pass that number to `GET /v1/track/{number}` for the carrier's own scans. - **Two legs, one list**: Chukou1's own first-leg scans and the last-mile carrier's scans are merged into one list, newest first. - **Time zone**: the page prints times with no zone (and the two legs are in different countries), so only `localTime` is set and `timestamp` is `null`. A made-up number returns `not_found`. - **How it is queried**: the same signed request the Chukou1 tracking page sends, using the signing secret in that page's own script; no captcha is involved. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Chunghwa Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chunghwapost Query live **Chunghwa Post** (`chunghwapost`) international mail in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending in `TW`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chunghwapost` | | **Brand aliases** | Chunghwa Post, Taiwan Post, 中華郵政 | | **Category** | National post (Taiwan), international mail | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EG026268050TW,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `S10 *TW` with a valid check digit (`/^[A-Z]{2}\d{9}TW$/`) | S10 | `EG026268050TW` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EG026268050TW?carrier=chunghwapost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "chunghwapost", "trackingNumber": "EG026268050TW", "status": "delivered", "statusDescription": "Final delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-09-22T15:00:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-09-22T15:00:00", "status": "delivered", "description": "Final delivery", "location": "JP0001", "code": "EMI" }, { "timestamp": "2026-09-13T04:12:00Z", "localTime": "2026-09-13T12:12:00", "status": "in_transit", "description": "Item presented to export Customs/Security", "location": "TWTPEA", "code": "EXA" } ] } ``` ## Notes - **Source**: the UPU's public Global Track & Trace (`globaltracktrace.ptc.post`), the JSON its own page uses. No key is needed. - **Coverage**: only scans that Chunghwa Post reports to the UPU appear. A number the UPU has nothing for returns `not_found`. Taiwan domestic numbers are not covered. - **Times**: scans at a Taiwan office (code starting `TW`) are converted to UTC from Taipei time. Other scans carry `localTime` only. - **Sample note**: the sample above is illustrative. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # CHH Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/chunhong Query live **CHH Logistics** (`chunhong`) package status and scan history in a single synchronous `GET` request or MCP tool call. CHH Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=chunhong`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `chunhong` | | **Brand aliases** | CHH Logistics, 春红物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=chunhong` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=chunhong` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | CHH Logistics tracking numbers have no shape of their own, so always pass `?carrier=chunhong`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to CHH Logistics in one request. - **Platform**: CHH Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Ciblex Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ciblex Query live **Ciblex** (`ciblex`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ciblex` | | **Brand aliases** | Ciblex, Ciblex France, ciblex.fr | | **Category** | French express parcel network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=560815852502035603344150,560815852502035603344150` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (long numeric numbers; pass `?carrier=ciblex`) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - Parcel number (long numeric): `^\d{20,26}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/560815852502035603344150?carrier=ciblex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ciblex", "trackingNumber": "560815852502035603344150", "status": "delivered", "statusDescription": "Colis Livré", "service": null, "deliveredAt": "2026-07-22T08:01:23Z", "deliveredAtLocal": "2026-07-22T10:01:23", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-07-22T08:01:23Z", "localTime": "2026-07-22T10:01:23", "status": "delivered", "description": "Colis Livré", "location": null, "code": null }, { "timestamp": "2026-07-22T03:55:02Z", "localTime": "2026-07-22T05:55:02", "status": "out_for_delivery", "description": "Mis en livraison", "location": "NANTES 44 (44 49P)", "code": null }, { "timestamp": "2026-07-09T06:17:00Z", "localTime": "2026-07-09T08:17:00", "status": "exception", "description": "COLIS NON REMIS", "location": null, "code": null } ] } ``` ## Notes - **Source**: the extranet tracking page, parsed from its HTML table. - **Time zone**: French local time; `timestamp` converts from `Europe/Paris`. - **Wording**: scans are in French. An unknown number returns the table with no rows, which is reported as not found. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Cirro E-Commerce Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cirro Query live **Cirro E-Commerce** (`cirro`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 14-character `CR…` and 17-character `CIFR…` tracking numbers and returns a normalized `TrackingResult` JSON payload—without requiring Cirro shipper credentials, HMAC-SHA256 request signing, or webhook infrastructure. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cirro` | | **Brand & service aliases** | CIRRO E-Commerce, CIRRO Parcel, GOFO Express (acquired CIRRO E-Commerce in 2026) | | **Category** | Cross-border & US e-commerce parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CR...,CIFR...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Cirro E-Commerce - **Skip Nebula HMAC-SHA256 signing & rate-limit CAPTCHAs**: Direct calls to Cirro's tracking endpoint require computing an HMAC-SHA256 `Nebula token:` signature over `Timestamp` + `NumberList` and trigger CAPTCHA error codes (`1003` / `1004`) when polled repeatedly from a single backend IP. Calling `GET https://api.lastscanned.com/v1/track/CR010740141269?carrier=cirro` works cleanly in one `fetch()`. - **Unified Cirro + GOFO network coverage**: Following [GOFO Express](https://docs.lastscanned.com/carriers/gofo)'s 2026 acquisition of Cirro E-Commerce, `CR…` and `CIFR…` parcels move seamlessly through GOFO's US last-mile hubs while preserving full origin-to-doorstep scan visibility. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Cirro is evaluated **fourteenth (#14)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — `CR` prefix** | `/^CR\d{12}$/i` (`CR` + 12 digits = 14 chars) | — | `CR010740141269`, `CR010928374650` | | **Pass 1 (`matches`) — `CIFR` prefix** | `/^CIFR\d{13}$/i` (`CIFR` + 13 digits = 17 chars) | — | `CIFR5358366457896` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### Disambiguating Cirro vs GOFO (`?carrier=cirro`) - **Auto-detected (`CR` + 12 digits and `CIFR` + 13 digits)**: No `?carrier=` parameter is needed. - **When `?carrier=cirro` is required**: Shipper order numbers starting with `SKP…` (`SKP919023354`) or `GFUS…` numbers that you specifically want to inspect via Cirro's endpoint instead of `gofo`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/CR010740141269?carrier=cirro" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/CR010740141269?carrier=cirro", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.statusDescription, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "CR010740141269" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "cirro", "trackingNumber": "CR010740141269", "status": "delivered", "statusDescription": "Your package has been delivered, Left at Front Door", "service": null, "deliveredAt": "2026-10-25T19:08:44Z", "deliveredAtLocal": "2026-10-25T15:08:44", "signedBy": "J. DOE", "destination": { "city": "PHILADELPHIA", "state": "PA", "country": "US" }, "estimatedDelivery": null, "events": [ { "timestamp": "2026-10-25T19:08:44Z", "localTime": "2026-10-25T15:08:44", "status": "delivered", "description": "Your package has been delivered, Left at Front Door", "location": "PHILADELPHIA, PA", "code": "Delivered" }, { "timestamp": null, "localTime": "2026-10-25T08:19:10", "status": "out_for_delivery", "description": "Your package is out for delivery", "location": "PHILADELPHIA, PA", "code": "Transit" }, { "timestamp": null, "localTime": "2026-10-24T22:41:05", "status": "in_transit", "description": "Arrived at Sorting Center", "location": "CARLSTADT, NJ", "code": "Transit" }, { "timestamp": null, "localTime": "2026-10-22T10:15:00", "status": "label_created", "description": "Shipment information received", "location": null, "code": "Processing" } ] } ``` > **Raw status & scan codes**: `events[].code` preserves Cirro's `StatusCode` (`"Processing"`, `"Transit"`, `"Delivered"`, `"Alert"`, `"FailedAttempt"`, `"Exception"`, `"Return"`, `"Returned"`), while `lastscanned` also inspects the event description to promote `"out for delivery"` scans inside the `"Transit"` category to `out_for_delivery`. ## Carrier-Specific Status & Integration Notes - **Latest scan UTC (`timestamp`) vs historical `localTime`**: Cirro provides an explicit `GMT±HH:MM` timezone (`GmtProcessTimezone`) only on the latest scan (`LastTrackEvent`), while historical rows in `DetailList` report local wall-clock time (`ProcessTime`) without a per-row offset. Therefore, `events[0].timestamp` (and `deliveredAt`) is populated in UTC, while earlier scans populate `localTime` with `timestamp: null`. - **Up to 20 numbers per upstream batch**: `lastscanned` automatically chunks larger Cirro batches so you can pass up to 35 Cirro numbers in a single `GET /v1/track?numbers=...` request. ## Related Resources - **Live browser lookup tool**: [Track a Cirro E-Commerce package live on lastscanned.com/lookup/cirro](https://lastscanned.com/lookup/cirro) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # City Express (Serbia) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cityexpressrs Query live **City Express (Serbia)** (`cityexpressrs`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cityexpressrs` | | **Brand aliases** | City Express, City Express Serbia, CityExpress RS, cityexpress.rs | | **Category** | Serbian courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=68800157085647,68800157085647` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^68800[125]\d{8}$/` (14 digits; the 16-digit form with a parcel suffix needs `?carrier=cityexpressrs`) | none | `68800157085647` | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - Centre prefix + 8 digits: `^68800[125]\d{8}$` - With parcel suffix (+2 digits): `^68800[125]\d{10}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/68800157085647?carrier=cityexpressrs" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "cityexpressrs", "trackingNumber": "68800157085647", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-02-12T13:29:00Z", "deliveredAtLocal": "2026-02-12T14:29:00", "signedBy": null, "destination": { "city": "Beograd-Palilula", "state": null, "country": "RS" }, "events": [ { "timestamp": "2026-02-12T13:29:00Z", "localTime": "2026-02-12T14:29:00", "status": "delivered", "description": "Delivered", "location": "Central HUB", "code": null }, { "timestamp": "2026-02-12T11:16:00Z", "localTime": "2026-02-12T12:16:00", "status": "exception", "description": "Deposit in Parcel Terminal", "location": "CE Beograd", "code": null }, { "timestamp": "2026-02-11T14:01:00Z", "localTime": "2026-02-11T15:01:00", "status": "label_created", "description": "Pickup in progress", "location": "Central HUB", "code": null } ] } ``` ## Notes - **Source**: the tracking form's HTMX fragment. It needs a session cookie and CSRF token from the form page, which are fetched first. - **Spaces**: `688 001 68800157085647` and `68800157085647` are the same number; a 2-digit parcel suffix is accepted. - **Time zone**: Serbian local time; `timestamp` converts from `Europe/Belgrade`. - **Detection**: the 16-digit form with a parcel suffix is also a Canada Post shape, so pass `?carrier=cityexpressrs` for it. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # City-Link Express Malaysia Tracking API & MCP URL: https://docs.lastscanned.com/carriers/citylink Query live **City-Link Express** (`citylink`) package status and scan history in a single synchronous `GET` request or MCP tool call. City-Link numbers are not auto-detected, so pass `?carrier=citylink`. `lastscanned` returns a normalized `TrackingResult` JSON payload, with no City-Link account or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `citylink` | | **Brand & service aliases** | City-Link Express, CityLink, City-Link Malaysia, `citylinkexpress.com` | | **Category** | Malaysian domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=citylink` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=010300012345,...&carrier=citylink` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | | **Explicit (`?carrier=citylink`)** | 12-digit consignment number | n/a | `010300012345` | The 12-digit shape is the same as FedEx's, so `?carrier=citylink` is required. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/010300012345?carrier=citylink" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/010300012345?carrier=citylink", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "010300012345", "carrier": "citylink" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "citylink", "trackingNumber": "010300012345", "status": "out_for_delivery", "statusDescription": "Out for delivery", "service": "Parcel", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-26T00:30:00Z", "localTime": "2026-10-26T08:30:00", "status": "out_for_delivery", "description": "Out for delivery", "location": "Johor Bahru", "code": null }, { "timestamp": "2026-10-24T20:30:00Z", "localTime": "2026-10-25T04:30:00", "status": "in_transit", "description": "Arrived at Hub", "location": "KL Hub", "code": null }, { "timestamp": "2026-10-24T02:15:00Z", "localTime": "2026-10-24T10:15:00", "status": "in_transit", "description": "Shipment Picked Up", "location": "Shah Alam", "code": null } ] } ``` ## Notes - Scan times are Malaysia time, returned with a UTC `timestamp` and the scan's `localTime`. - `service` is City-Link's shipment type (for example `Parcel`). - The proof of delivery needs an account, shipper or consignee phone number on City-Link's site, and is not returned. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # CityMail Tracking API & MCP URL: https://docs.lastscanned.com/carriers/citymail Query live **CityMail** (`citymail`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `citymail` | | **Brand aliases** | CityMail, CityMail Sweden, City Mail, citymail.se | | **Category** | Swedish parcel and mail network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=BCMU118177365,BCMU118177365` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^BCM[A-Z]{1,2}\d{8,9}$/` | none | `BCMU118177365` | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - BCM + 1 to 2 letters + 8 to 9 digits: `^BCM[A-Z]{1,2}\d{8,9}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/BCMU118177365?carrier=citymail" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "citymail", "trackingNumber": "BCMU118177365", "status": "returned", "statusDescription": "Paketet hämtades inte ut i tid och skickas tillbaka till avsändaren", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-07-21T11:00:00Z", "localTime": "2026-07-21T13:00:00", "status": "returned", "description": "Paketet hämtades inte ut i tid och skickas tillbaka till avsändaren", "location": null, "code": null }, { "timestamp": "2026-07-15T06:30:00Z", "localTime": "2026-07-15T08:30:00", "status": "exception", "description": "Paketet har levererats till ombud", "location": "ÖR LIVS", "code": null }, { "timestamp": "2026-07-06T05:59:00Z", "localTime": "2026-07-06T07:59:00", "status": "in_transit", "description": "Paketet är på väg till ombud", "location": "CityMail-kontor Sundbyberg", "code": null }, { "timestamp": "2026-06-30T15:34:00Z", "localTime": "2026-06-30T17:34:00", "status": "label_created", "description": "Vi har fått en beställning på en leverans och väntar på paketet", "location": null, "code": null } ] } ``` ## Notes - **Wording**: scans are in Swedish. - **Pickup points**: delivery to a pickup agent (ombud) is `exception` until collected; an unclaimed parcel sent back is `returned`. - **Time zone**: Swedish local time; `timestamp` converts from `Europe/Stockholm`. The sender's name shown on the page is not returned. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # CJ Logistics (CJ Korea Express / 대한통운) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cjlogistics Query live **CJ Logistics** (`cjlogistics`, CJ대한통운 domestic parcel) package status and scan history in a single synchronous `GET` request or MCP tool call. Scan times are Korean local time and come back with UTC timestamps. Pass `?carrier=cjlogistics`: CJ's 10- and 12-digit waybills share their shape with DHL Express and FedEx. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cjlogistics` | | **Brand & service aliases** | CJ Logistics, CJ대한통운, CJ Korea Express, 대한통운 택배 | | **Category** | South Korea domestic parcel | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=cjlogistics` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=365140731024,365140731024&carrier=cjlogistics` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=cjlogistics`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | `/^(\d{10}\|\d{12})$/` | — | `365140731024`, `365140731024` | | **Explicit (`?carrier=cjlogistics`)** | Any CJ waybill | — | `365140731024` | ### When is `?carrier=cjlogistics` optional vs required? - **Required**: CJ waybills are plain 10- or 12-digit runs, which [FedEx](https://docs.lastscanned.com/carriers/fedex) and [DHL](https://docs.lastscanned.com/carriers/dhl) also use, so auto-detection never picks CJ on its own. Always pass `?carrier=cjlogistics` for these numbers. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/365140731024?carrier=cjlogistics" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```ts const res = await fetch("https://api.lastscanned.com/v1/track/365140731024?carrier=cjlogistics", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` MCP `track_package` tool call: ```json { "tool": "track_package", "arguments": { "tracking_number": "365140731024", "carrier": "cjlogistics" } } ``` Normalized `TrackingResult` response: ```json { "carrier": "cjlogistics", "trackingNumber": "365140731024", "status": "delivered", "statusDescription": "배송완료 고객님의 상품이 배송완료 되었습니다.", "service": null, "deliveredAt": "2026-10-21T07:05:00Z", "deliveredAtLocal": "2026-10-21T16:05:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-21T07:05:00Z", "localTime": "2026-10-21T16:05:00", "status": "delivered", "description": "배송완료 고객님의 상품이 배송완료 되었습니다.", "location": "서울동작", "code": null }, { "timestamp": "2026-10-20T16:42:00Z", "localTime": "2026-10-21T01:42:00", "status": "in_transit", "description": "간선하차 접수하신 물품이 중계점에 도착하였습니다", "location": "곤지암Hub", "code": null } ] } ``` ## Notes - **Source**: the two JSON endpoints behind CJ's own tracker page (`trace.cjlogistics.com`), no account or key. A number CJ does not know returns `not_found`. - **Korean wording**: `description` is CJ's own Korean text (a step name followed by its sentence). `status` is mapped from the Korean step names such as 집화 (pickup), 간선상차/하차 (linehaul), 배송출발 (out for delivery) and 배송완료 (delivered). - **Times**: every scan is in South Korea, so each event carries `timestamp` in UTC computed from `Asia/Seoul`. ## Related Resources - **Live browser lookup tool**: [Track a CJ Logistics package live on lastscanned.com/lookup/cjlogistics](https://lastscanned.com/lookup/cjlogistics) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # CJ Packet Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cjpacket Query live **CJ Packet** (`cjpacket`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cjpacket` | | **Brand aliases** | CJ Packet, CJPacket, CJ Dropshipping, CJ Packet Ordinary, CJPBAD | | **Category** | CJ Dropshipping cross-border parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CJPBAD7080500174YQ,CJPBAD7080500174YQ` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^CJP[A-Z]{2,3}\d{10}YQ$/` | none | `CJPBAD7080500174YQ` | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - CJP + 2 to 3 letters + 10 digits + YQ: `^CJP[A-Z]{2,3}\d{10}YQ$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CJPBAD7080500174YQ?carrier=cjpacket" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "cjpacket", "trackingNumber": "CJPBAD7080500174YQ", "status": "delivered", "statusDescription": "Delivered, At the door/Yard", "service": "CJPacket LX Sensitive Pro", "deliveredAt": null, "deliveredAtLocal": "2026-08-23T04:51:26", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": "Handed to GOFO as CJPBAD7080500174YQ", "events": [ { "timestamp": null, "localTime": "2026-08-23T04:51:26", "status": "delivered", "description": "Delivered, At the door/Yard", "location": "GLEN BURNIE", "code": null }, { "timestamp": null, "localTime": "2026-08-22T15:39:57", "status": "out_for_delivery", "description": "Out for delivery", "location": "GLEN BURNIE", "code": null }, { "timestamp": null, "localTime": "2026-08-11T06:09:08", "status": "label_created", "description": "Label created. Warehouse is processing this order. Please wait in patience.", "location": null, "code": null } ] } ``` ## Notes - **Handoff**: `message` names the last-mile carrier when CJ Packet shows its number (GOFO numbers are recognised) and gives the number; pass it to `GET /v1/track/{number}` for that carrier's own scans. - **Time zone**: when CJ Packet gives an exact time (some scans) `timestamp` is set; otherwise only the destination's `localTime`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Closer Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/closerlogistics Query live **Closer Logistics** (`closerlogistics`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `closerlogistics` | | **Brand aliases** | Closer Logistics, Closer, closerlogistics.com | | **Category** | Spanish last-mile logistics | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=357215058963,357215058963` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (12-digit numbers overlap other carriers; pass `?carrier=closerlogistics`) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shapes this carrier uses: - Shipment number (12 digits): `^\d{12}$` ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/357215058963?carrier=closerlogistics" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "closerlogistics", "trackingNumber": "357215058963", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": "2026-04-06T18:19:33Z", "deliveredAtLocal": "2026-04-06T20:19:33", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-04-06T18:19:33Z", "localTime": "2026-04-06T20:19:33", "status": "delivered", "description": "Entregado", "location": null, "code": "delivered" }, { "timestamp": "2026-04-06T07:13:02Z", "localTime": "2026-04-06T09:13:02", "status": "out_for_delivery", "description": "En reparto", "location": null, "code": "out_for_delivery" }, { "timestamp": "2026-04-06T01:23:14Z", "localTime": "2026-04-06T03:23:14", "status": "in_transit", "description": "En el centro de distribución", "location": null, "code": "hub" }, { "timestamp": "2026-04-05T19:02:56Z", "localTime": "2026-04-05T21:02:56", "status": "label_created", "description": "Orden de pedido recibida", "location": null, "code": "documented" } ] } ``` ## Notes - **Privacy**: Closer's response also holds the recipient's name, phone and address; none of it is returned. - **Time zone**: Madrid time; `timestamp` converts from `Europe/Madrid`. - **Wording**: scans are in Spanish. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # CNE Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cne Query live **CNE Express** (`cne`, 递一国际物流) cross-border package status, scan history, and **destination last-mile handoff numbers** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 13-character `3A5V…` waybills in Pass 1 and returns a normalized `TrackingResult` JSON payload—without requiring a CNE merchant account or API signature secret. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cne` | | **Brand & service aliases** | CNE Express (递一国际物流), CNE Global, `cne.com`, `3A5V…` | | **Category** | Chinese cross-border e-commerce logistics carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=3A5V...,3A5V...` (up to 10 CNE numbers per batch; up to 100 total numbers) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for CNE Express instead of direct requests - **Avoid CNE WebAssembly MD5 request signing & `ReturnValue: -5555` IP blocks**: Direct requests from serverless functions (Cloudflare Workers, Vercel, AWS Lambda) to `wapi.cne.com` require computing custom MD5 request signatures (`signature` header and `md5` body digest) and get blocked for hours with `ReturnValue: -5555` after just 15–20 lookups from a shared datacenter IP. Calling `GET https://api.lastscanned.com/v1/track/3A5V913107080?carrier=cne` returns clean JSON in one `fetch()`. - **Automatic last-mile carrier & exchange number extraction**: Once a CNE parcel clears customs and is handed to a local carrier (such as [USPS](https://docs.lastscanned.com/carriers/usps), Royal Mail, [UniUni](https://docs.lastscanned.com/carriers/uniuni), Evri, or [DHL](https://docs.lastscanned.com/carriers/dhl)), `lastscanned` extracts both `lastMileSupplier.enName` and `Response_Info.transNbr` into top-level `message` (e.g. `"Handed to Royal Mail as 3A5V913107080"` or `"Handed to USPS as 9261290312839104827163"`). ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) CNE Express is evaluated **twenty-seventh (#27)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^3A5V\d{9}$/i` (`3A5V` + 9 digits = 13 chars) | — | `3A5V913107080`, `3A5V913107080` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=cne` optional vs required? - **Optional (auto-detected)**: All 13-character `3A5V` + 9-digit CNE waybill numbers auto-detect in Pass 1. - **Required (`?carrier=cne`)**: Destination carrier tracking numbers (`transNbr`) or merchant reference numbers that you want to query inside CNE's tracking system rather than the destination carrier. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/3A5V913107080?carrier=cne" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/3A5V913107080?carrier=cne", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.message, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "3A5V913107080" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "cne", "trackingNumber": "3A5V913107080", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-24T13:58:00Z", "deliveredAtLocal": "2026-10-24T14:58:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "GB" }, "message": "Handed to Royal Mail as WG849201736GB", "events": [ { "timestamp": null, "localTime": "2026-10-24T14:58:00", "status": "delivered", "description": "Delivered", "location": "London", "code": "3" }, { "timestamp": null, "localTime": "2026-10-22T09:30:00", "status": "in_transit", "description": "Custom clearance completed", "location": "London", "code": "1" }, { "timestamp": "2026-10-19T14:29:14Z", "localTime": "2026-10-19T22:29:14", "status": "in_transit", "description": "Departed from sorting center", "location": "Shanghai", "code": "1" }, { "timestamp": "2026-10-18T07:10:00Z", "localTime": "2026-10-18T15:10:00", "status": "label_created", "description": "Parcel Information Received", "location": null, "code": "0" } ] } ``` ## Chaining Last-Mile Handoffs (`message`) & Status Notes - **Handoff number in `message`**: When CNE assigns a destination carrier number (`transNbr`), `message` formats it as `"Handed to as "`. If the destination carrier is one of the 549 supported carriers (such as [USPS](https://docs.lastscanned.com/carriers/usps), [Canada Post](https://docs.lastscanned.com/carriers/canadapost), [UniUni](https://docs.lastscanned.com/carriers/uniuni), or [DHL](https://docs.lastscanned.com/carriers/dhl)), you can pass that secondary number straight to `GET /v1/track/3A5V913107080?carrier=cne`. - **Timestamps & status codes**: Origin scans in China (`CN.`) and top-level `deliveryDate` are converted from `Asia/Shanghai` (`UTC+8`) into UTC (`timestamp` / `deliveredAt`), while overseas scan rows retain their local facility wall clock in `localTime`. CNE numeric state codes (`0` not delivered, `1`/`2` shipping, `3` delivered, `4` timeout, `5` customs inspection, `6` invalid address, `7` lost, `8` returned, `9` exception, `10` destroyed) are preserved in `events[].code`. ## Related Resources - **Live browser lookup tool**: [Track a CNE Express package live on lastscanned.com/lookup/cne](https://lastscanned.com/lookup/cne) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Colisweb Tracking API & MCP URL: https://docs.lastscanned.com/carriers/colisweb Query live **Colisweb** (`colisweb`) package status and scan history in a single synchronous `GET` request or MCP tool call. French last-mile delivery for large parcels (Colisweb deliveries to the door). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `colisweb` | | **Brand aliases** | Colisweb, Colisweb France, Colisweb suivi livraison | | **Category** | Regional (French last-mile delivery for large parcels (Colisweb deliveries to the door)) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=10000123,10000123` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Colisweb numbers have no shape of their own, so pass `?carrier=colisweb`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/10000123?carrier=colisweb" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "colisweb", "trackingNumber": "10000123", "status": "delivered", "statusDescription": "Livraison effectuée", "service": null, "deliveredAt": "2026-04-08T07:59:28Z", "deliveredAtLocal": "2026-04-08T07:59:28", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-04-08T07:59:28Z", "localTime": "2026-04-08T07:59:28", "status": "delivered", "description": "Livraison effectuée", "location": null, "code": null }, { "timestamp": "2026-04-08T07:36:25Z", "localTime": "2026-04-08T07:36:25", "status": "in_transit", "description": "Colis pris en charge", "location": null, "code": null }, { "timestamp": "2026-04-04T13:26:52Z", "localTime": "2026-04-04T13:26:52", "status": "label_created", "description": "Livraison confirmée", "location": null, "code": null } ] } ``` ## Notes - **No scan list**: Colisweb publishes the delivery step and three dates, so the events are the confirmation, pick-up and delivery dates (UTC in the source, so `timestamp` is exact). A delivery marked `non_deliverable` becomes an `exception` event ("Incident de livraison") with no time. - Delivery numbers are 8 digits and shared with other shapes, so pass `?carrier=colisweb`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Connect Couriers Tracking API & MCP URL: https://docs.lastscanned.com/carriers/connectcouriers Query live **Connect Couriers** (`connectcouriers`) package status and scan history in a single synchronous `GET` request or MCP tool call. Malta parcel delivery. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `connectcouriers` | | **Brand aliases** | Connect Couriers, Connect Couriers Malta, connectcouriers.eu | | **Category** | Regional (Malta parcel delivery) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=24369093961,24369093961` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Connect Couriers numbers have no shape of their own, so pass `?carrier=connectcouriers`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/24369093961?carrier=connectcouriers" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "connectcouriers", "trackingNumber": "24369093961", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-02-07T12:45:00Z", "deliveredAtLocal": "2026-02-07T13:45:00", "signedBy": null, "destination": { "city": "Msida", "state": null, "country": "MT" }, "events": [ { "timestamp": "2026-02-07T12:45:00Z", "localTime": "2026-02-07T13:45:00", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": "2026-02-07T09:14:00Z", "localTime": "2026-02-07T10:14:00", "status": "exception", "description": "Attempted Delivery / Client not home", "location": null, "code": null }, { "timestamp": "2026-02-02T05:23:00Z", "localTime": "2026-02-02T06:23:00", "status": "in_transit", "description": "Arrived at Operations Facility - Malta", "location": null, "code": null } ] } ``` ## Notes - Scan times are Malta wall-clock, converted from `Europe/Malta`. - Numbers are generic digit strings, so pass `?carrier=connectcouriers`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Coordinadora Tracking API & MCP URL: https://docs.lastscanned.com/carriers/coordinadora Query live **Coordinadora** (`coordinadora`, Colombia) package status, milestones, incidents and destination in a single synchronous `GET` request or MCP tool call. Its 11-digit guide numbers share a shape with GLS, so pass `?carrier=coordinadora`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `coordinadora` | | **Brand aliases** | Coordinadora, Coordinadora Mercantil, Rastreo Coordinadora | | **Category** | Regional parcels (Colombia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=coordinadora` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=coordinadora` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/56810352142?carrier=coordinadora" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "coordinadora", "trackingNumber": "56810352142", "status": "delivered", "statusDescription": "ENTREGADA", "service": null, "deliveredAt": "2025-05-12T20:14:57Z", "deliveredAtLocal": "2025-05-12T15:14:57", "signedBy": null, "destination": { "city": "Itagui", "state": "ANT", "country": "CO" }, "events": [ { "timestamp": "2025-05-12T20:14:57Z", "localTime": "2025-05-12T15:14:57", "status": "delivered", "description": "ENTREGADA", "location": null, "code": "6" }, { "timestamp": "2025-05-11T12:08:43Z", "localTime": "2025-05-11T07:08:43", "status": "exception", "description": "Envío en validación por seguridad", "location": null, "code": "602" }, { "timestamp": null, "localTime": "2025-05-08", "status": "label_created", "description": "A RECIBIR POR COORDINADORA", "location": null, "code": "1" } ] } ``` ## Notes - **Milestones and incidents**: milestone codes are mapped (1 to receive, 2 to 4 in transit, 5 out for delivery, 6 delivered, 8 closed by incident). Incidents (`novedad`) are added as `exception` scans but never change the package status, which is the latest milestone's. - **Dates only**: some milestones have a date without a time; they get `localTime` as a date and `timestamp` `null`. - **Time zone**: Colombia time (UTC-5). - **Not found**: the API has no not-found reply. A record with no guide number and only an undated "A RECIBIR" milestone, or one that is just a catch-all of "sobrante" tickets, is reported as `not_found`. - **How it is queried**: the REST v2 API behind rastreo.coordinadora.com, which answers without a captcha token. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Copa Airlines Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/copacourier Query live **Copa Airlines Courier** (`copacourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. Latin America air courier (house air waybills). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `copacourier` | | **Brand aliases** | Copa Courier, Copa Airlines Courier, Copa Cargo courier, HAWB | | **Category** | Regional (Latin America air courier (house air waybills)) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=H0424119,H0424119` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^H\d{7}$/` | none | `H0424119` | This shape is loose and also used by other carriers, so it is tried only when nothing else claims the number; pass `?carrier=copacourier` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/H0424119?carrier=copacourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "copacourier", "trackingNumber": "H0424119", "status": "in_transit", "statusDescription": "EN PROCESO DE ADUANA", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "La Habana", "state": null, "country": null }, "events": [ { "timestamp": null, "localTime": "2026-03-17T17:56:00", "status": "in_transit", "description": "EN PROCESO DE ADUANA", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-17T17:47:00", "status": "in_transit", "description": "RECIBIDO EN DESTINO", "location": "HAV", "code": null }, { "timestamp": null, "localTime": "2026-03-12T09:38:00", "status": "label_created", "description": "ENVIO RECIBIDO EN ORIGEN", "location": "SJO", "code": null } ] } ``` ## Notes - The page prints Spanish month abbreviations ("12-oct.-2021 09:38"); they are read into a local time. Locations are airport codes (SJO, PTY, HAV). No zone is given, so there is no `timestamp`. - Two requests: the home page (antiforgery cookie and token), then the HAWB form POST. - The recipient name the page prints on delivery is not returned. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Correo Argentino Tracking API & MCP URL: https://docs.lastscanned.com/carriers/correoargentino Query live **Correo Argentino** (`correoargentino`) package status and scan history in a single synchronous `GET` request or MCP tool call. Argentina (international mail, S10 AR). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `correoargentino` | | **Brand aliases** | Correo Argentino, Correo Argentino international, Argentina Post | | **Category** | Regional (Argentina (international mail, S10 AR)) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SP904542386AR,SP904542386AR` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | S10 with check digit (`s10From("AR")`) | S10 check digit | `SP904542386AR` | | **Pass 2 (`mayMatch`)** | none | none | none | `SP904542386AR`-shaped numbers are claimed by Correo Argentino, so `?carrier=correoargentino` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SP904542386AR?carrier=correoargentino" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "correoargentino", "trackingNumber": "SP904542386AR", "status": "in_transit", "statusDescription": "EN PROCESO DE CLASIFICACIÓN", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-22T19:38:00Z", "localTime": "2026-10-22T16:38:00", "status": "in_transit", "description": "EN PROCESO DE CLASIFICACIÓN", "location": "RIO GRANDE", "code": null }, { "timestamp": "2026-10-22T09:15:00Z", "localTime": "2026-10-22T06:15:00", "status": "in_transit", "description": "LLEGADA AL CENTRO DE PROCESAMIENTO", "location": "RIO GRANDE", "code": null }, { "timestamp": "2026-09-02T22:05:00Z", "localTime": "2026-09-02T19:05:00", "status": "in_transit", "description": "LLEGADA DEL PAÍS", "location": "CTP CPI-BUENOS AIRES", "code": null } ] } ``` ## Notes - Times are Argentina time (UTC-3, no DST). Rows with an empty "Historia" column are internal markers and are skipped. - Only S10 codes ending in `AR` are looked up (`producto`, `id`, `pais` form fields). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Correos (Spain) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/correos Query live **Correos** (`correos`, Spain's national post) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending `ES`; Correos' own `PQ` parcel codes are tried when nothing else claims them. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `correos` | | **Brand & service aliases** | Correos, Correos España, Paq Premium, Paq Estándar | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=NUMBER1,NUMBER2` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — UPU S10** | 2 letters, 9 digits, `ES` | UPU S10 mod-11 | `LX309102212ES` | | **Pass 2 (`mayMatch`)** | `PQ` + 20 to 22 letters and digits | — | `LX309102212ES` | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/LX309102212ES?carrier=correos" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/LX309102212ES?carrier=correos", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "LX309102212ES" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "correos", "trackingNumber": "LX309102212ES", "status": "delivered", "statusDescription": "Envío entregado", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-20T11:42:10", "signedBy": null, "destination": null, "message": "El envío ha sido entregado.", "events": [ { "timestamp": null, "localTime": "2026-10-20T11:42:10", "status": "delivered", "description": "Envío entregado", "location": null, "code": null } ] } ``` ## Notes - Scan wording is Spanish, as Correos prints it. Times are Spanish local time, shown as `localTime` only because Spain spans two time zones. - A number Correos has no record of comes back as `not_found`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Correos Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/correosexpress Query live **Correos Express** (`correosexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `correosexpress` | | **Brand aliases** | Correos Express Paquetería, CEX | | **Category** | Express parcels (Spain) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: Correos Express numbers are 16 digits, a shape Canada Post and others also use, so pass `?carrier=correosexpress`. This is the parcel company, not the postal service (`correos`). ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/3230002125829719?carrier=correosexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "correosexpress", "trackingNumber": "3230002125829719", "status": "exception", "statusDescription": "En Gestión", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": "Linked shipment 3230002125829719: NO LOCALIZADO", "events": [ { "timestamp": "2026-08-19T09:37:00Z", "localTime": "2026-08-19T11:37:00", "status": "exception", "description": "En Gestión", "location": null, "code": "X130000R" }, { "timestamp": "2026-08-06T20:01:00Z", "localTime": "2026-08-06T22:01:00", "status": "delivered", "description": "Entregado", "location": null, "code": "X120000V" }, { "timestamp": "2026-08-04T05:41:32Z", "localTime": "2026-08-04T07:41:32", "status": "out_for_delivery", "description": "En reparto", "location": null, "code": "X080000V" }, { "timestamp": "2026-08-03T23:44:30Z", "localTime": "2026-08-04T01:44:30", "status": "in_transit", "description": "En destino", "location": null, "code": "X060000V" }, { "timestamp": "2026-08-01T15:39:41Z", "localTime": "2026-08-01T17:39:41", "status": "label_created", "description": "Informado", "location": null, "code": "X010000V" } ] } ``` ## Notes - **Source**: the JSON service `localizador.correos.es/canonico/eventos_envio_servicio/{number}` that the Correos Express tracking page uses. No account is needed. - **Status codes**: the event code is `X0000`, and `nn` decides the status (01 label created, 02 and 06 in transit, 08 out for delivery, 12 delivered, 13 under customer-service management, which is `exception`). Other codes fall back to the Spanish wording. - **Newest scan wins**: a parcel can be delivered and then reopened by customer service, as in the sample, in which case the status follows the newest scan. - **Linked shipment**: when Correos Express lists an associated shipment, `message` names it with its state. - **Time zone**: scan clocks are converted from `Europe/Madrid`. Scans on the Canary Islands are an hour out. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Correos de México Tracking API & MCP URL: https://docs.lastscanned.com/carriers/correosmexico Query live **Correos de México** (`correosmexico`) package status and scan history in a single synchronous `GET` request or MCP tool call. Mexico (S10 MX). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `correosmexico` | | **Brand aliases** | Correos de México, Correos de Mexico, Mexpost, Servicio Postal Mexicano, SEPOMEX | | **Category** | Regional (Mexico (S10 MX)) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RI542209425MX,RI542209425MX` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | S10 with check digit (`s10From("MX")`) | S10 check digit | `RI542209425MX` | | **Pass 2 (`mayMatch`)** | none | none | none | `RI542209425MX`-shaped numbers are claimed by Correos de México, so `?carrier=correosmexico` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RI542209425MX?carrier=correosmexico" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "correosmexico", "trackingNumber": "RI542209425MX", "status": "exception", "statusDescription": "Puesta en ventanilla", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-09T13:47:00", "status": "exception", "description": "Puesta en ventanilla", "location": "Administración Postal Iztapalapa, CDMX.", "code": null }, { "timestamp": null, "localTime": "2026-10-09T08:25:00", "status": "in_transit", "description": "Recepción en Oficina de Correos", "location": "Administración Postal Iztapalapa, CDMX.", "code": null }, { "timestamp": null, "localTime": "2026-09-24T15:42:00", "status": "in_transit", "description": "En tránsito hacia destino", "location": "Administración Postal Ermita, CDMX.", "code": null } ] } ``` ## Notes - Mexico spans zones (Tijuana observes DST), so only `localTime` is returned. - The page shows the current year's events ("Ejercicio"); older items may need a prior year and are not searched. - Ordinary mail has no tracking; the page then returns no events and the lookup is `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Correos de El Salvador Tracking API & MCP URL: https://docs.lastscanned.com/carriers/correossalvador Query live **Correos de El Salvador** (`correossalvador`) package status and scan history in a single synchronous `GET` request or MCP tool call. El Salvador (inbound and outbound S10 mail). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `correossalvador` | | **Brand aliases** | Correos de El Salvador, El Salvador Post, Correos SV | | **Category** | Regional (El Salvador (inbound and outbound S10 mail)) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RB968554210SG,RB968554210SG` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | S10 with check digit (`s10From("SV")`) | S10 check digit | `RB968554210SG` | | **Pass 2 (`mayMatch`)** | none | none | none | S10 numbers ending `SV` are claimed by Correos de El Salvador. For inbound items from other posts, such as `RB968554210SG`, pass `?carrier=correossalvador`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RB968554210SG?carrier=correossalvador" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "correossalvador", "trackingNumber": "RB968554210SG", "status": "delivered", "statusDescription": "Entregar envío (entrada)", "service": "Cartas (Lc/Ao)", "deliveredAt": "2026-02-01T23:59:00Z", "deliveredAtLocal": "2026-02-01T17:59:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-01T23:59:00Z", "localTime": "2026-02-01T17:59:00", "status": "delivered", "description": "Entregar envío (entrada)", "location": "San Salvador", "code": null }, { "timestamp": "2026-01-30T20:05:22Z", "localTime": "2026-01-30T14:05:22", "status": "in_transit", "description": "Transferir envío al agente de entrega (entrada)", "location": "Depto Distribucion Correspondencia Amss (Dcamss)", "code": null }, { "timestamp": "2026-01-06T01:58:17Z", "localTime": "2026-01-05T19:58:17", "status": "in_transit", "description": "Recibir envío en oficina de cambio (entrada)", "location": "San Salvador 5 Aereo", "code": null } ] } ``` ## Notes - The service accepts S10 codes from any post (an item from Singapore, say), not only `SV` ones. Auto-detection claims `SV` codes; for others pass `?carrier=correossalvador`. - Times are El Salvador time (UTC-6, no DST). Endpoint runs on port 8000. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Correo Uruguayo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/correouruguayo Query live **Correo Uruguayo** (`correouruguayo`) package status and scan history in a single synchronous `GET` request or MCP tool call. Uruguay (S10 UY, plus inbound mail). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `correouruguayo` | | **Brand aliases** | Correo Uruguayo, Uruguay Post, Correo Uruguayo S10 | | **Category** | Regional (Uruguay (S10 UY, plus inbound mail)) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RR580125558UY,RR580125558UY` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | S10 with check digit (`s10From("UY")`) | S10 check digit | `RR580125558UY` | | **Pass 2 (`mayMatch`)** | none | none | none | `RR580125558UY`-shaped numbers are claimed by Correo Uruguayo, so `?carrier=correouruguayo` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RR580125558UY?carrier=correouruguayo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "correouruguayo", "trackingNumber": "RR580125558UY", "status": "delivered", "statusDescription": "ENTREGADO A", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-04-11T10:22:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-04-11T10:22:00", "status": "delivered", "description": "ENTREGADO A", "location": "Bolivia (Plurinational State Of)", "code": null }, { "timestamp": null, "localTime": "2026-03-25T10:21:00", "status": "in_transit", "description": "LLEGADA A OFICINA DE DESTINO O DE TRANSITO", "location": "Bolivia (Plurinational State Of)", "code": null }, { "timestamp": null, "localTime": "2026-03-04T10:30:00", "status": "in_transit", "description": "INGRESO A CORREO URUGUAYO", "location": "Centro, Suc, Montevideo", "code": null } ] } ``` ## Notes - Event times have no zone and include events abroad, so only `localTime` is returned. - The tracker also answers for S10 codes of other posts that deliver in Uruguay; those need `?carrier=correouruguayo`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # COSCO Shipping Container Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cosco Query live **COSCO Shipping** (`cosco`) shipping container moves in a single synchronous `GET` request or MCP tool call. Pass the container number; no booking, bill of lading or COSCO Shipping account is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cosco` | | **Brand aliases** | COSCO, COSCO Shipping Lines, COSCO Container Lines, Florens, elines.coscoshipping.com | | **Category** | Ocean container shipping line | | **Single-container REST endpoint** | `GET https://api.lastscanned.com/v1/track/{containerNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CSNU8123465,CSNU7123455` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Container Number Format & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(CSNU\|CBHU\|CCLU\|CSLU\|FCIU)\d{7}$/` | ISO 6346 | `CSNU8123465` · `CSNU7123455` | | **Pass 2 (`mayMatch`)** | none | none | none | A container number is the owner's 4-letter code, 6 digits and an ISO 6346 check digit. COSCO Shipping's own owner codes detect to `cosco` automatically. A leased container (Textainer `TGHU`, Triton `TCNU`, CAI `CAIU`, SeaCo `SEGU` and others) can sail with any line, so pass `?carrier=cosco` for one booked with COSCO Shipping. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CSNU8123465" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` The response below is a real lookup from November 2026. ```json { "carrier": "cosco", "trackingNumber": "CSNU8123465", "status": "out_for_delivery", "statusDescription": "Gate-out from Final Hub", "service": "40HQ", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-27T01:29:00", "status": "out_for_delivery", "description": "Gate-out from Final Hub", "location": "Santos, Sao Paulo, Brazil", "code": "Gate-out from Final Hub" } ] } ``` ## Notes - **Latest move only**: without the bill of lading, COSCO's public tracking shows a container's current move and nothing before it, so a result has one event. - **Florens** (`FCIU`) is COSCO's container leasing arm; COSCO answers for its boxes, so they detect to `cosco`. - **Rate limits**: COSCO's firewall blocks an address that sends a burst of lookups for several minutes. Numbers in a batch go one at a time, and a block is answered `rate_limited`. - **Times**: local time without a zone, so `localTime` is set and `timestamp` is null. ## Related Resources - **All container lines**: [Ocean container tracking](https://docs.lastscanned.com/container-tracking-api) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Courier Center Tracking API & MCP URL: https://docs.lastscanned.com/carriers/couriercenter Query live **Courier Center** (`couriercenter`) package status and scan history in a single synchronous `GET` request or MCP tool call. Greece and Cyprus. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `couriercenter` | | **Brand aliases** | Courier Center, Courier Center Greece, courier.gr, CC | | **Category** | Regional (Greece and Cyprus) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=013736422931,013736422931` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Courier Center numbers have no shape of their own, so pass `?carrier=couriercenter`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/013736422931?carrier=couriercenter" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "couriercenter", "trackingNumber": "013736422931", "status": "delivered", "statusDescription": "Η αποστολή παραδόθηκε στον παραλήπτη", "service": "211 17:00 ΕΠΟΜΕΝΗ ΜΕΡΑ ΧΕΡΣΑΙΟ/ΝΗΣΙ", "deliveredAt": "2026-01-12T09:35:00Z", "deliveredAtLocal": "2026-01-12T11:35:00", "signedBy": null, "destination": { "city": "ΝΙΚΗΤΗ", "state": null, "country": null }, "events": [ { "timestamp": "2026-01-12T09:35:00Z", "localTime": "2026-01-12T11:35:00", "status": "delivered", "description": "Η αποστολή παραδόθηκε στον παραλήπτη", "location": "CC ΝΙΚΗΤΗ ΧΑΛΚΙΔΙΚΗΣ", "code": null }, { "timestamp": "2026-01-12T09:34:00Z", "localTime": "2026-01-12T11:34:00", "status": "out_for_delivery", "description": "Ανάθεση αποστολής για παράδοση σε διανομέα", "location": "CC ΝΙΚΗΤΗ ΧΑΛΚΙΔΙΚΗΣ", "code": null }, { "timestamp": "2026-01-09T15:06:00Z", "localTime": "2026-01-09T17:06:00", "status": "in_transit", "description": "Παραλαβή όλων των τεμαχίων της αποστολής στο κατάστημα παραλαβής: CC COSMOTE ΑΥΛΩΝΑ", "location": "CC COSMOTE ΑΥΛΩΝΑ", "code": null } ] } ``` ## Notes - Waybills are 12 digits, a shape shared with other carriers, so pass `?carrier=couriercenter`. - Descriptions are in Greek as the page prints them. Times are `Europe/Athens`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # CouriersPlease Tracking API & MCP URL: https://docs.lastscanned.com/carriers/couriersplease Query live **CouriersPlease** (`couriersplease`) consignment status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the 14-character `CP` consignment numbers and batches up to 10 numbers into one upstream request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `couriersplease` | | **Brand & service aliases** | CouriersPlease, Couriers Please, CP | | **Category** | Australian domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=couriersplease` where noted below) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CPABCDE0012345,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^CP[A-Z]{5}\d{7}$/` | — | `CPABCDE0012345` | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=couriersplease`)** | Any other CouriersPlease consignment or item (coupon) number | — | — | Consignment numbers are 14 characters: `CP`, five letters, seven digits. Item (coupon) numbers and other shapes work with `?carrier=couriersplease`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/CPABCDE0012345?carrier=couriersplease" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/CPABCDE0012345?carrier=couriersplease", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "CPABCDE0012345", "carrier": "couriersplease" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "couriersplease", "trackingNumber": "CPABCDE0012345", "status": "in_transit", "statusDescription": "Parcel is progressing through our network", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "estimatedDelivery": "2026-10-28", "message": null, "events": [ { "timestamp": "2026-10-26T04:10:00Z", "localTime": "2026-10-26T15:10:00", "status": "in_transit", "description": "Parcel is progressing through our network", "location": "NSW", "code": "status" }, { "timestamp": "2026-10-24T22:45:00Z", "localTime": "2026-10-25T09:45:00", "status": "in_transit", "description": "Picked up from sender", "location": "VIC", "code": "pickup" } ] } ``` ## Status Notes - **Access**: CouriersPlease's site only accepts calls that look like its own frontend, so `lastscanned` loads the tracking page first to get its CSRF token and cookie, then makes the lookup with the matching headers. - **Times**: scan times are local to the scan's state. The state code gives the zone, so `timestamp` is set when the state is known and only `localTime` otherwise. - **Delivery estimate**: `estimatedDelivery` is the page's Delivery ETA date when it has one. ## Related Resources - **Live browser lookup tool**: [Track a CouriersPlease package live on lastscanned.com/lookup/couriersplease](https://lastscanned.com/lookup/couriersplease) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # CSE Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cserussia Query live **CSE** (`cserussia`) package status and scan history in a single synchronous `GET` request or MCP tool call. Russia. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cserussia` | | **Brand aliases** | CSE, CSE Russia, КСЭ, Корпорация Срочной Доставки | | **Category** | Regional (Russia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=497-006659468,497-006659468` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | CSE numbers have no shape of their own, so pass `?carrier=cserussia`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/497-006659468?carrier=cserussia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "cserussia", "trackingNumber": "497-006659468", "status": "returned", "statusDescription": "Supplementary waybill issued. Return of cargo", "service": "Parcel", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2024-11-27T15:47:00", "status": "returned", "description": "Supplementary waybill issued. Return of cargo", "location": "Москва г", "code": null }, { "timestamp": null, "localTime": "2024-11-27T11:25:00", "status": "delivered", "description": "Delivery completed", "location": null, "code": null }, { "timestamp": null, "localTime": "2024-11-22T14:40:00", "status": "label_created", "description": "Shipment created", "location": "Санкт-Петербург г", "code": null } ] } ``` ## Notes - The hyphen in the waybill number is kept; both spellings are sent to CSE. Russia spans many zones, so only `localTime` is returned. - A waybill that CSE returned (an added waybill that returns the cargo) ends as `returned`. - Waybill numbers overlap other shapes, so pass `?carrier=cserussia`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # CTT (Correios de Portugal) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ctt Query live **CTT** (`ctt`) object status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending `PT` and returns a normalized `TrackingResult` JSON payload, without a CTT account. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ctt` | | **Brand & service aliases** | CTT, CTT Expresso, Correios de Portugal, CTT Portugal | | **Category** | Portuguese national post | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=LA136353435PT,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for CTT - **No CTT account**: the public "Seguir objeto" page signs in an anonymous session and calls CTT's screen service. `lastscanned` does the same from a single `fetch()`-style request. - **UTC times from CTT**: CTT's scan times are UTC (`...Z`), so every `timestamp` is exact. `localTime` shows the same clock reading. - **Delivery signer and destination**: when CTT names the person who took delivery, it is returned in `signedBy`; the recipient town and country fill `destination`. - **Scan codes kept**: `events[].code` holds CTT's event code (`EMO` information received, `EMA` accepted, `EMZ` out for delivery, `EMH` not delivered, `EMI` delivered). ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=ctt`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}PT$/` with a valid UPU S10 check digit | S10 mod 11 | `LA136353435PT` | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=ctt`)** | Other CTT object codes | — | — | ### When is `?carrier=ctt` optional vs required? - **Optional (auto-detected)**: S10 numbers ending `PT` with a valid check digit. - **Required**: any other CTT object code. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/LA136353435PT?carrier=ctt" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/LA136353435PT?carrier=ctt", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "LA136353435PT" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "ctt", "trackingNumber": "LA136353435PT", "status": "delivered", "statusDescription": "O envio foi entregue. O processo de envio terminou.", "service": null, "deliveredAt": "2026-10-22T10:35:07Z", "deliveredAtLocal": "2026-10-22T10:35:07", "signedBy": null, "destination": { "city": "Vila Nova De Gaia", "state": null, "country": "PT" }, "events": [ { "timestamp": "2026-10-22T10:35:07Z", "localTime": "2026-10-22T10:35:07", "status": "delivered", "description": "O envio foi entregue. O processo de envio terminou.", "location": "Centro operacional 4400 Vila Nova de Gaia", "code": "EMI" }, { "timestamp": "2026-10-22T08:55:44Z", "localTime": "2026-10-22T08:55:44", "status": "out_for_delivery", "description": "O envio saiu para entrega. Será entregue durante o dia.", "location": "Centro operacional 4400 Vila Nova de Gaia", "code": "EMZ" }, { "timestamp": "2026-10-21T17:31:11Z", "localTime": "2026-10-21T17:31:11", "status": "in_transit", "description": "O envio foi aceite. O processo de envio foi iniciado.", "location": "Loja CTT Lisboa", "code": "EMA" }, { "timestamp": "2026-10-21T17:31:08Z", "localTime": "2026-10-21T17:31:08", "status": "label_created", "description": "A informação sobre o envio foi recebida.", "location": null, "code": "EMO" } ] } ``` > **Language**: CTT's scan texts come back in Portuguese. **No record**: a number CTT has no record of returns `not_found`. ## Related Resources - **Live browser lookup tool**: [Track a CTT package live on lastscanned.com/lookup/ctt](https://lastscanned.com/lookup/ctt) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # CTT Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cttexpress Query live **CTT Express** (`cttexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cttexpress` | | **Brand aliases** | CTT Express Spain, Zeleris | | **Category** | Express parcels (Spain, Portugal) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^00\d{20}$/` | none | `0082800011298638008391` | `matches` is empty. `mayMatch` takes a 22-digit code starting `00`, which is how CTT Express shipping codes look. This is the parcel company, not CTT Correios (`ctt`). ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/0082800011298638008391?carrier=cttexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "cttexpress", "trackingNumber": "0082800011298638008391", "status": "exception", "statusDescription": "Recogida fallida: CLIENTE NO TIENE PREPARADA MERCANCÍA", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "ARENAL", "state": null, "country": null }, "events": [ { "timestamp": "2026-07-09T14:42:03Z", "localTime": "2026-07-09T14:42:03", "status": "exception", "description": "Recogida fallida: CLIENTE NO TIENE PREPARADA MERCANCÍA", "location": null, "code": "0600" }, { "timestamp": "2026-07-08T14:24:50Z", "localTime": "2026-07-08T14:24:50", "status": "label_created", "description": "Pendiente de recepción en CTT Express", "location": null, "code": "0000" } ] } ``` ## Notes - **Source**: the JSON (`wct.cttexpress.com/p_track_redis_v2.php`) that the CTT Express tracking app calls with its own origin. No account is needed. - **Time zone**: CTT Express reports UTC, so `localTime` is the UTC clock time and carries no local zone. - **Incidents**: when a scan carries an incident (`incident_type_name`), it is appended to the description. - **Not found**: an unknown code returns an empty body, which becomes `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Chuangyu Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cyexpress Query live **Chuangyu Logistics** (`cyexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Chuangyu Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=cyexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cyexpress` | | **Brand aliases** | Chuangyu Logistics, 创宇物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=cyexpress` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=cyexpress` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Chuangyu Logistics tracking numbers have no shape of their own, so always pass `?carrier=cyexpress`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Chuangyu Logistics in one request. - **Platform**: Chuangyu Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Cyprus Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/cypruspost Query live **Cyprus Post** (`cypruspost`) package status and scan history in a single synchronous `GET` request or MCP tool call. Cyprus (S10 CY). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `cypruspost` | | **Brand aliases** | Cyprus Post, CyprusPost, Cyprus postal service | | **Category** | Regional (Cyprus (S10 CY)) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RQ035037099CY,RQ035037099CY` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | S10 with check digit (`s10From("CY")`) | S10 check digit | `RQ035037099CY` | | **Pass 2 (`mayMatch`)** | none | none | none | `RQ035037099CY`-shaped numbers are claimed by Cyprus Post, so `?carrier=cypruspost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RQ035037099CY?carrier=cypruspost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "cypruspost", "trackingNumber": "RQ035037099CY", "status": "delivered", "statusDescription": "Deliver item (Inb)", "service": "Letter Post", "deliveredAt": "2026-10-09T06:39:00Z", "deliveredAtLocal": "2026-10-09T09:39:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-09T06:39:00Z", "localTime": "2026-10-09T09:39:00", "status": "delivered", "description": "Deliver item (Inb)", "location": "LEFKOSIA B.O.7 1911 - ENGOMI, Cyprus", "code": null }, { "timestamp": "2026-10-08T08:23:00Z", "localTime": "2026-10-08T11:23:00", "status": "exception", "description": "Receive item at collection point for pick-up (Inb)", "location": "LEFKOSIA B.O.7 1911 - ENGOMI, Cyprus", "code": null }, { "timestamp": "2026-10-05T11:23:00Z", "localTime": "2026-10-05T14:23:00", "status": "in_transit", "description": "Receive item from customer (Otb)", "location": "LARNAKA O/E AIR 6911, Cyprus", "code": null } ] } ``` ## Notes - Three requests: the results page (session cookie, CSRF token, honeypot fields), the form POST (a 302 to a signed URL), then the signed results page. - Each row is in its own country's local time; the zone is set for Cyprus and the United Kingdom, other countries keep `localTime` only. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DAI Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/daipost Query live **DAI Post** (`daipost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `daipost` | | **Brand aliases** | DAI Post Australia, DAIPost, Dai Global | | **Category** | Cross-border e-commerce parcels (Australia, New Zealand, Singapore) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: DAI Post numbers are 20 digits, which other carriers also use, so pass `?carrier=daipost`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/00393580940186672087?carrier=daipost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "daipost", "trackingNumber": "00393580940186672087", "status": "delivered", "statusDescription": "Delivered, left where you can find it.", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-15T11:33:57", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-15T11:33:57", "status": "delivered", "description": "Delivered, left where you can find it.", "location": "Newcastle, AU", "code": "FD02" }, { "timestamp": null, "localTime": "2026-10-15T06:19:28", "status": "out_for_delivery", "description": "It’s happening, your parcel will be delivered today. Get ready!", "location": "Newcastle, AU", "code": "FP05" }, { "timestamp": null, "localTime": "2026-10-13T13:04:00", "status": "in_transit", "description": "All clear! Your parcel’s passed customs and is ready for the next leg.", "location": "Padstow, Sydney, AU", "code": "DC01" }, { "timestamp": "2026-10-06T09:52:53Z", "localTime": "2026-10-06T17:52:53", "status": "in_transit", "description": "We’ve processed your parcel at our origin facility. Next, on the move to you!", "location": "Shenzhen, CN", "code": "OP03" } ] } ``` ## Notes - **Source**: the DAI Post tracking page (`daipost.com/track`) asked for its React Server Component stream, which carries the tracking data inline. No account is needed. - **Time zones**: each scan is a local clock in the scan's country. Scans in China, Hong Kong, Singapore, New Zealand, Japan, Taiwan and Macau are converted. Australian scans cross several zones, so they keep only `localTime` (`timestamp` is `null`). - **Friendly wording**: DAI Post's scan text is conversational; the status is read from it ("will be delivered today" is `out_for_delivery`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Danske Fragtmænd Tracking API & MCP URL: https://docs.lastscanned.com/carriers/danskefragtmaend Query live **Danske Fragtmænd** (`danskefragtmaend`) package status and scan history in a single synchronous `GET` request or MCP tool call. Denmark. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `danskefragtmaend` | | **Brand aliases** | Danske Fragtmænd, Danske Fragtmaend, Fragtmand, fragt.dk | | **Category** | Regional (Denmark) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=90702050809100001401FA948053,90702050809100001401FA948053` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^\d{20}[A-Z]{2}\d{6}$/` | none | `90702050809100001401FA948053` | | **Pass 2 (`mayMatch`)** | `/^[A-Z]{2}\d{6}$/` | none | none | `90702050809100001401FA948053`-shaped numbers are claimed by Danske Fragtmænd, so `?carrier=danskefragtmaend` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/90702050809100001401FA948053?carrier=danskefragtmaend" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "danskefragtmaend", "trackingNumber": "90702050809100001401FA948053", "status": "delivered", "statusDescription": "Consignment delivered to the recipient.", "service": "DayB", "deliveredAt": "2026-05-27T08:58:21Z", "deliveredAtLocal": "2026-05-27T10:58:21", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-27T08:58:21Z", "localTime": "2026-05-27T10:58:21", "status": "delivered", "description": "Consignment delivered to the recipient.", "location": null, "code": null }, { "timestamp": "2026-05-27T06:50:40Z", "localTime": "2026-05-27T08:50:40", "status": "out_for_delivery", "description": "The consignment has left Danske Fragtmænd Aalborg for delivery to the recipient.", "location": null, "code": null }, { "timestamp": "2026-05-26T12:10:08Z", "localTime": "2026-05-26T14:10:08", "status": "label_created", "description": "We have received information about your consignment from the sender.", "location": null, "code": null } ] } ``` ## Notes - A collicode is looked up through its last eight characters (the consignment number). Times are `Europe/Copenhagen`. - Event codes: `DAT` data received, `AFH` picked up, `ANK` handled at a terminal, `KTU`/`OMX` out for delivery, `LEV` delivered. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # dao Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dao Query live **dao** (`dao`) package status and scan history in a single synchronous `GET` request or MCP tool call. Denmark. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dao` | | **Brand aliases** | dao, DAO, dao.as, dao365 | | **Category** | Regional (Denmark) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=00057151271727440982,00057151271727440982` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^000(?:5712696|5715127)\d{10}$/` | none | `00057151271727440982` | | **Pass 2 (`mayMatch`)** | none | none | none | `00057151271727440982`-shaped numbers are claimed by dao, so `?carrier=dao` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/00057151271727440982?carrier=dao" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dao", "trackingNumber": "00057151271727440982", "status": "delivered", "statusDescription": "Parcel delivered", "service": null, "deliveredAt": "2023-03-01T04:28:13Z", "deliveredAtLocal": "2023-03-01T05:28:13", "signedBy": null, "destination": null, "events": [ { "timestamp": "2023-03-01T04:28:13Z", "localTime": "2023-03-01T05:28:13", "status": "delivered", "description": "Parcel delivered", "location": null, "code": "Home/11" }, { "timestamp": "2023-02-28T23:26:06Z", "localTime": "2023-03-01T00:26:06", "status": "in_transit", "description": "Parcel arrived at dao depot: Århus C", "location": "Århus C", "code": "Home/10" }, { "timestamp": "2023-02-28T17:50:05Z", "localTime": "2023-02-28T18:50:05", "status": "in_transit", "description": "Parcel arrived at dao depot: dao Erritsø", "location": "dao Erritsø", "code": "Home/10" }, { "timestamp": "2023-02-28T14:44:55Z", "localTime": "2023-02-28T15:44:55", "status": "label_created", "description": "Shipment created, awaiting registration", "location": null, "code": "Home/1" } ] } ``` ## Notes - Auto-detection claims the two dao SSCC prefixes; they are 20 digits like FedEx/GS1 SSCCs, so the carrier's position in the detection order matters. Other dao shapes (13-digit parcel numbers starting with 7, 9-digit e-label codes) need `?carrier=dao`. - The recipient block in dao's answer is masked and not used. Times are `Europe/Copenhagen`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Daylight Transport Tracking API & MCP URL: https://docs.lastscanned.com/carriers/daylighttransport Query live **Daylight Transport** (`daylighttransport`) package status and scan history in a single synchronous `GET` request or MCP tool call. US LTL freight. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `daylighttransport` | | **Brand aliases** | Daylight Transport, Daylight, MyDaylight, dylt | | **Category** | Regional (US LTL freight) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=48000111,48000111` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Daylight Transport numbers have no shape of their own, so pass `?carrier=daylighttransport`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/48000111?carrier=daylighttransport" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "daylighttransport", "trackingNumber": "48000111", "status": "delivered", "statusDescription": "Delivered", "service": "LTL", "deliveredAt": null, "deliveredAtLocal": "2026-01-26T10:00:00", "signedBy": null, "destination": { "city": "Boston", "state": "MA", "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-01-26T10:00:00", "status": "delivered", "description": "Delivered", "location": "BOS-CPCD-BOSTON", "code": null }, { "timestamp": null, "localTime": "2026-01-26T09:10:46", "status": "out_for_delivery", "description": "Out For Delivery", "location": "BOS-CPCD-BOSTON", "code": null }, { "timestamp": null, "localTime": "2026-01-18T10:59:25", "status": "label_created", "description": "Pickup Requested", "location": "90638 LA MIRADA CA", "code": null } ] } ``` ## Notes - Uses the shipment call (it answers 404 for an unknown probill) and the history call (`/shipments/history/public`). Times are terminal-local with no zone. - 8-digit probills overlap other shapes, so pass `?carrier=daylighttransport`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Day & Ross Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dayross Query live **Day & Ross** (`dayross`) package status and scan history in a single synchronous `GET` request or MCP tool call. Canada and US freight. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dayross` | | **Brand aliases** | Day & Ross, Day and Ross, Day&Ross, Day Ross, dayross.com | | **Category** | Regional (Canada and US freight) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=A09555311,A09555311` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^A\d{8}$/` | none | `A09555311` | This shape is loose and also used by other carriers, so it is tried only when nothing else claims the number; pass `?carrier=dayross` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/A09555311?carrier=dayross" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dayross", "trackingNumber": "A09555311", "status": "delivered", "statusDescription": "Delivered", "service": "UPS", "deliveredAt": null, "deliveredAtLocal": "2026-03-13T14:21:01", "signedBy": null, "destination": { "city": "TORS COVE", "state": "NL", "country": "CA" }, "message": "Handed to UPS as A09555311", "events": [ { "timestamp": null, "localTime": "2026-03-13T14:21:01", "status": "delivered", "description": "Delivered", "location": "TORS COVE, NL", "code": null }, { "timestamp": null, "localTime": "2026-03-13T14:21:00", "status": "in_transit", "description": "Driver departed destination", "location": "TORS COVE, NL", "code": null }, { "timestamp": null, "localTime": "2026-03-04T17:19:08", "status": "label_created", "description": "Order accepted", "location": null, "code": null } ] } ``` ## Notes - Two steps: an anonymous bearer token is read from the public tracking page, then the order is looked up by shipment number and its touch points fetched. GPS `POSITION` pings are skipped. - Day & Ross serves several zones and does not say which one the clock is, so only `localTime` is returned. When the shipment carries a UPS `1Z` number, `message` names the handoff. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Dayton Freight Tracking API & MCP URL: https://docs.lastscanned.com/carriers/daytonfreight Query live **Dayton Freight** (`daytonfreight`) package status and scan history in a single synchronous `GET` request or MCP tool call. US LTL freight. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `daytonfreight` | | **Brand aliases** | Dayton Freight, Dayton Freight Lines, DFL, daytonfreight.com | | **Category** | Regional (US LTL freight) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=31981912,31981912` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Dayton Freight numbers have no shape of their own, so pass `?carrier=daytonfreight`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/31981912?carrier=daytonfreight" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "daytonfreight", "trackingNumber": "31981912", "status": "delivered", "statusDescription": "delivered to destination", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-09-22T09:09:00", "signedBy": null, "destination": { "city": "Midland", "state": "TX", "country": "US" }, "message": "Handed to Southeastern Freight Lines Inc as 31981912", "events": [ { "timestamp": null, "localTime": "2026-09-22T09:09:00", "status": "delivered", "description": "delivered to destination", "location": "MIDLAND, TX", "code": null }, { "timestamp": null, "localTime": "2026-09-17T15:44:00", "status": "in_transit", "description": "Picked Up", "location": null, "code": null } ] } ``` ## Notes - The page gives the pickup and the latest status only, so there are at most two events. `signedBy` is the name on the delivery record. - When a partner carrier finishes the freight, `message` carries the partner's name and PRO number. PRO numbers overlap other shapes, so pass `?carrier=daytonfreight`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Delhivery Tracking API & MCP URL: https://docs.lastscanned.com/carriers/delhivery Query live **Delhivery** (`delhivery`) package status and scan history in a single synchronous `GET` request or MCP tool call, using the same public JSON that Delhivery's own tracking page calls. Pass `?carrier=delhivery` for its plain 13- and 14-digit waybills. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `delhivery` | | **Brand & service aliases** | Delhivery, Delhivery Express, Delhivery Courier, Delhivery AWB | | **Category** | India domestic parcel & e-commerce | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=delhivery` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=37033910491842,37033910491842&carrier=delhivery` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=delhivery`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | `/^\d{13,14}$/` | — | `37033910491842` | | **Explicit (`?carrier=delhivery`)** | Any Delhivery waybill (AWB) | — | `37033910491842` | ### When is `?carrier=delhivery` optional vs required? - **Optional**: a 13- or 14-digit number that no other carrier claims is tried against Delhivery in Pass 2. - **Recommended**: pass `?carrier=delhivery` anyway, because plain digit runs are not Delhivery's alone. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/37033910491842?carrier=delhivery" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```ts const res = await fetch("https://api.lastscanned.com/v1/track/37033910491842?carrier=delhivery", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` MCP `track_package` tool call: ```json { "tool": "track_package", "arguments": { "tracking_number": "37033910491842", "carrier": "delhivery" } } ``` Normalized `TrackingResult` response: ```json { "carrier": "delhivery", "trackingNumber": "37033910491842", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": null, "status": "delivered", "description": "Delivered", "location": "Delhi_Satbari_L (Delhi)", "code": null } ] } ``` ## Notes - **Source**: the `unified-tracking` JSON behind Delhivery's own tracking page, no account or key. A number Delhivery does not know ("invalid AWB or very old package") returns `not_found`. - **Times**: Delhivery prints India Standard Time with no offset. India is one zone, so each event carries `timestamp` in UTC computed from `Asia/Kolkata`. - **Old waybills**: Delhivery drops tracking for very old packages, which then read as `not_found`. ## Related Resources - **Live browser lookup tool**: [Track a Delhivery package live on lastscanned.com/lookup/delhivery](https://lastscanned.com/lookup/delhivery) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Delovye Linii Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dellin Query live **Delovye Linii** (`dellin`) package status and scan history in a single synchronous `GET` request or MCP tool call. Russia freight. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dellin` | | **Brand aliases** | Delovye Linii, Dellin, Деловые Линии, dellin.ru | | **Category** | Regional (Russia freight) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=24-03901040035,24-03901040035` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Delovye Linii numbers have no shape of their own, so pass `?carrier=dellin`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/24-03901040035?carrier=dellin" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dellin", "trackingNumber": "24-03901040035", "status": "delivered", "statusDescription": "доставлен на адрес получения", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-05-21", "signedBy": null, "destination": { "city": "Лаишево", "state": null, "country": "RU" }, "events": [ { "timestamp": null, "localTime": "2026-05-21", "status": "delivered", "description": "доставлен на адрес получения", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-05-17", "status": "in_transit", "description": "прибыл на терминал г. Казань", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-05-15", "status": "in_transit", "description": "отправлен с адреса клиента", "location": null, "code": null } ] } ``` ## Notes - Milestones carry a date but no time of day; forecast milestones (`is_calculated`) are skipped. The hyphen is restored (`24-03901040035`) whichever way the number is typed. - Waybills are 13 digits, a shape shared with other carriers, so pass `?carrier=dellin`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # D Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dexpress Query live **D Express** (`dexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Serbia. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dexpress` | | **Brand aliases** | D Express, DExpress, dexpress.rs, D Express Serbia | | **Category** | Regional (Serbia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=DE0032063021,DE0032063021` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^[A-Z]{2}\d{10}$/` | none | `DE0032063021` | This shape is loose and also used by other carriers, so it is tried only when nothing else claims the number; pass `?carrier=dexpress` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/DE0032063021?carrier=dexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dexpress", "trackingNumber": "DE0032063021", "status": "delivered", "statusDescription": "Pošiljka je isporučena primaocu", "service": null, "deliveredAt": "2026-04-09T13:01:00Z", "deliveredAtLocal": "2026-04-09T15:01:00", "signedBy": null, "destination": { "city": "Sombor", "state": null, "country": "RS" }, "events": [ { "timestamp": "2026-04-09T13:01:00Z", "localTime": "2026-04-09T15:01:00", "status": "delivered", "description": "Pošiljka je isporučena primaocu", "location": null, "code": null }, { "timestamp": "2026-04-08T10:24:38Z", "localTime": "2026-04-08T12:24:38", "status": "in_transit", "description": "Pošiljka je preuzeta od pošiljaoca", "location": null, "code": null }, { "timestamp": "2026-04-08T09:37:24Z", "localTime": "2026-04-08T11:37:24", "status": "label_created", "description": "Čeka na preuzimanje", "location": null, "code": null } ] } ``` ## Notes - Shipment codes are two capital letters and ten digits (for example `KO…`, `DE…`); the recipient name and address the page returns are masked and not used. - Times are `Europe/Belgrade`; the "U magacinu centra" / "Kod kurira centra" scans put the centre name in `location`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DHFEX Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dhfex Query live **DHFEX** (`dhfex`) package status and scan history in a single synchronous `GET` request or MCP tool call. DHFEX numbers share their shape with other carriers' numbers, so pass `?carrier=dhfex`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dhfex` | | **Brand aliases** | DHFEX, 鼎汇丰国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dhfex` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=dhfex` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | DHFEX tracking numbers have no shape of their own, so always pass `?carrier=dhfex`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to DHFEX in one request. - **Platform**: DHFEX runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DHL Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dhl Query live **DHL** (`dhl`) package status and scan history across **DHL Express**, **DHL eCommerce**, **DHL Paket DE**, and **Deutsche Post** in a single synchronous `GET` request or MCP tool call. `lastscanned` validates 10-digit Mod-7 DHL Express waybills, `JD`/`JJD` piece IDs, `GM` eCommerce numbers, `0034043…` Paket SSCCs, and UPU S10 `…DE` numbers—returning a normalized `TrackingResult` JSON payload with zero DHL Developer Portal keys. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dhl` | | **Brand & service aliases** | DHL Express, DHL eCommerce Solutions, DHL Paket (Parcel DE), Deutsche Post International | | **Category** | Global express, cross-border e-commerce & European parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for DHL instead of direct requests - **Avoid Akamai HTTP `428` / `403` cryptographic challenges**: Scripted calls from Cloudflare Workers, Vercel, or AWS Lambda to `www.dhl.com/utapi` are blocked with Akamai `428 Precondition Required` / `403` bot challenges, while the official `api-eu.dhl.com/track/shipments` Unified API enforces strict per-app daily rate limits and API key approval. Calling `GET https://api.lastscanned.com/v1/track/JJD149150000000340699?carrier=dhl` works in one `fetch()`. - **Four DHL divisions unified in one schema**: Whether a customer gives you a 10-digit DHL Express waybill, a `GM…` DHL eCommerce US number, a 20-digit `0034043…` German DHL Paket SSCC, or a Deutsche Post `RR…DE` parcel, `lastscanned` normalizes all four into the same `TrackingResult` shape. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) DHL is evaluated **third (#3)** in `lastscanned`'s two-pass detector (ahead of [FedEx](https://docs.lastscanned.com/carriers/fedex) so 20-digit `0034043…` DHL Paket SSCC barcodes are claimed before FedEx's 20-digit rule): | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — Express waybill** | `/^\d{10}$/` (10 digits) | **Yes — `dhlExpress(n)` (Mod-7)** | `5680684190` | | **Pass 1 (`matches`) — Express Piece ID** | `/^JJ?D\d{10,20}$/i` (`JD` or `JJD` + 10–20 digits) | — | `JJD149150000000340699`, `JD014600006281920311` | | **Pass 1 (`matches`) — DHL eCommerce** | `/^GM\d{16,20}$/i` (`GM` + 16–20 digits) | — | `GM2951173829104827` | | **Pass 1 (`matches`) — DHL Paket SSCC** | `/^0034043\d{13}$/` (20 digits starting `0034043`) | — | `00340434292135100186` | | **Pass 1 (`matches`) — Deutsche Post S10** | `/^[A-Z]{2}\d{9}DE$/i` (2 letters + 9 digits + `DE`) | **Yes — `s10(n)` (Mod-11)** | `CY283910485DE` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### `dhlExpress` Mod-7 check-digit algorithm Because 10-digit strings frequently collide with US phone numbers or order IDs, `lastscanned` checks that the first 9 digits modulo 7 equal the 10th digit: ```ts /** DHL Express 10-digit waybill: the first 9 digits mod 7 give the last. */ export function dhlExpress(n: string): boolean { return Number(n.slice(0, 9)) % 7 === Number(n[9]); } ``` ### Disambiguating DHL vs FedEx & USPS (`?carrier=dhl`) - **12- or 20-digit DHL Paket numbers outside `0034043…`**: Standard 12- or 20-digit German DHL Paket numbers that do not start with `0034043` match FedEx's numeric patterns in Pass 1. Pass `?carrier=dhl` to route them to DHL. - **DHL eCommerce US labels starting `420` + ZIP + `92/93…`**: These barcodes are inducted into USPS for final delivery and auto-detect as `usps`. Pass `?carrier=dhl` if you specifically want DHL eCommerce's scan view. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/JJD149150000000340699?carrier=dhl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/JJD149150000000340699?carrier=dhl", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.service, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "5680684190" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "dhl", "trackingNumber": "JJD149150000000340699", "status": "delivered", "statusDescription": "Delivered at neighbours", "service": null, "deliveredAt": "2026-09-19T12:13:19Z", "deliveredAtLocal": "2026-09-19T14:13:19", "signedBy": null, "destination": null, "estimatedDelivery": null, "estimatedDeliveryAt": null, "message": null, "events": [ { "timestamp": "2026-09-19T12:13:19Z", "localTime": "2026-09-19T14:13:19", "status": "delivered", "description": "Delivered at neighbours", "location": null, "code": "DELIVERED_AT_NEIGHBOURS" }, { "timestamp": "2026-09-19T12:08:06Z", "localTime": "2026-09-19T14:08:06", "status": "delivered", "description": "Delivered", "location": null, "code": "DELIVERED" }, { "timestamp": "2026-09-16T06:36:35Z", "localTime": "2026-09-16T08:36:35", "status": "label_created", "description": "Prenotification received", "location": null, "code": "PRENOTIFICATION_RECEIVED" } ] } ``` > **Raw status & scan codes**: `statusDescription` and `events[].description` combine DHL's `description` and `remark` fields (deduplicating repeated remarks on DHL Paket DE), while `events[].code` preserves DHL's native scan code (such as `"WC"` for With Courier / Out for Delivery, `"OK"` for Delivered, or `"AF"` for Arrived at Facility). ## Carrier-Specific Status & Integration Notes - **Timestamps across DHL Express vs eCommerce / Paket**: DHL Express includes an explicit UTC offset on every scan (`2026-10-16T14:27:00-05:00`), so both `timestamp` (UTC) and `localTime` are populated. DHL eCommerce and DHL Paket DE report local scan times without a timezone offset, so `localTime` is populated and `timestamp` is `null`. - **Next steps & exception guidance**: When a shipment requires customs duties or delivery rescheduling, DHL's `nextSteps` instruction is surfaced in the top-level `message` field. ## Related Resources - **Live browser lookup tool**: [Track a DHL package live on lastscanned.com/lookup/dhl](https://lastscanned.com/lookup/dhl) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # DHL eCommerce Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dhlecommerce Query live **DHL eCommerce** (`dhlecommerce`) package status and scan history in a single synchronous `GET` request or MCP tool call. `dhlecommerce` covers DHL eCommerce parcels in the Americas. The same lookup also takes the USPS number of a parcel DHL hands to USPS for delivery, and returns DHL's scans followed by the USPS scans. **Source**: Plain `POST https://api.dhlecs.com/webtrack/v4/tracking` (the JSON behind webtrack.dhlglobalmail.com), no key needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dhlecommerce` | | **Brand aliases** | DHL eCommerce, DHL Global Mail, DHL SM Parcel, DHL Parcel Ground, DHL Parcel Expedited | | **Category** | Regional (Americas) e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dhlecommerce` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=dhlecommerce` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | DHL eCommerce numbers are not unmistakable: the 10-character customer reference (`9261290316844317469885`) has no check digit, and the USPS tracking numbers it also accepts (`92…`, `93…`, 22 digits, or 30 digits with a `420`+ZIP prefix) auto-detect to [USPS](https://docs.lastscanned.com/docs/carriers/usps). Pass `?carrier=dhlecommerce` for the first kind. A `420`+ZIP prefix is removed before the lookup. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/9261290316844317469885?carrier=dhlecommerce" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dhlecommerce", "trackingNumber": "9261290316844317469885", "status": "delivered", "statusDescription": "Delivered: In/at mailbox", "service": "DHL Parcel Ground", "deliveredAt": "2026-08-03T14:10:00Z", "deliveredAtLocal": "2026-08-03T09:10:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": "Handed to USPS as 9261290316844317469885", "events": [ { "timestamp": "2026-08-03T14:10:00Z", "localTime": "2026-08-03T09:10:00", "status": "delivered", "description": "Delivered: In/at mailbox", "location": "Peoria, IL, US", "code": "600" }, { "timestamp": "2026-08-03T11:10:00Z", "localTime": "2026-08-03T06:10:00", "status": "out_for_delivery", "description": "Out for delivery", "location": "Peoria, IL, US", "code": "598" }, { "timestamp": "2026-08-01T15:52:17Z", "localTime": "2026-08-01T10:52:17", "status": "in_transit", "description": "Arrival destination DHL eCommerce facility", "location": "Melrose Park, IL, US", "code": "350" } ] } ``` ## Notes - **USPS scans**: when the parcel rides USPS for the last mile, the answer already includes the USPS events (`Processed through USPS sort facility`, `Out for delivery`, `Delivered`), so no second lookup is needed. `message` names the USPS number (`Handed to USPS as …`) when you looked up the DHL reference rather than that number. - **Time zone**: each scan carries a US zone (`ET`, `CT`, `MT`, `PT`) and `timestamp` is converted from it. Scans stamped `LT` (local time) have `localTime` only. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DHL eCommerce UK Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dhlecommerceuk Query live **DHL eCommerce UK** (`dhlecommerceuk`) package status and scan history in a single synchronous `GET` request or MCP tool call. `dhlecommerceuk` covers DHL eCommerce UK's domestic parcels, which retailers send under 14-digit consignment numbers. **Source**: Plain `GET https://track.dhlecommerce.co.uk/?con={number}` (server-rendered HTML), no key needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dhlecommerceuk` | | **Brand aliases** | DHL eCommerce UK, DHL Parcel UK, DHL UK, track.dhlecommerce.co.uk | | **Category** | Regional (UK) parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dhlecommerceuk` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=dhlecommerceuk` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | 14-digit consignment numbers (`60120261600869`) look like those of other carriers, so pass `?carrier=dhlecommerceuk`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/60120261600869?carrier=dhlecommerceuk" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dhlecommerceuk", "trackingNumber": "60120261600869", "status": "delivered", "statusDescription": "Your shipment is delivered", "service": null, "deliveredAt": "2026-10-02T17:19:00Z", "deliveredAtLocal": "2026-10-02T18:19:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-02T17:19:00Z", "localTime": "2026-10-02T18:19:00", "status": "delivered", "description": "Your shipment is delivered", "location": null, "code": null }, { "timestamp": "2026-10-02T11:50:00Z", "localTime": "2026-10-02T12:50:00", "status": "out_for_delivery", "description": "Your shipment is out for delivery", "location": null, "code": null }, { "timestamp": "2026-09-30T11:34:00Z", "localTime": "2026-09-30T12:34:00", "status": "in_transit", "description": "Your shipment has been collected", "location": null, "code": null } ] } ``` ## Notes - **Scans**: the page lists dated messages without a location, so `location` is `null`. The tracking number is removed from each message. - **Time zone**: times are UK local (`Europe/London`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DHL Freight Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dhlfreight Query live **DHL Freight** (`dhlfreight`) package status and scan history in a single synchronous `GET` request or MCP tool call. `dhlfreight` covers DHL Freight Europe's road freight consignments on ActiveTracing, such as pallets and groupage. **Source**: Plain `GET https://activetracing.dhl.com/DatPublic/datSelection.do?search=consignmentId&a={number}` (server-rendered HTML), no key needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dhlfreight` | | **Brand aliases** | DHL Freight, DHL ActiveTracing, DHL Road Freight, DHL Euroconnect | | **Category** | International freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dhlfreight` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=dhlfreight` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Consignment numbers are 11 digits and overlap other carriers' formats, so pass `?carrier=dhlfreight`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/00058678403?carrier=dhlfreight" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dhlfreight", "trackingNumber": "00058678403", "status": "in_transit", "statusDescription": "Out for Collection", "service": "DHL Road Freight Standard", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-06-02T06:29:00", "status": "in_transit", "description": "Out for Collection", "location": "DE-WEIßENHORN", "code": null }, { "timestamp": null, "localTime": "2026-06-02", "status": "label_created", "description": "Consignment created", "location": "DE-WEIßENHORN", "code": null } ] } ``` ## Notes - **Time zone**: terminals are across Europe and the page gives local clock times only, so `localTime` is set and `timestamp` is `null`. A scan with no time of day has a date-only `localTime`. - **Detail**: `service` is the freight product (for example `DHL Road Freight Standard`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DHLink Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dhlink Query live **DHLink** (`dhlink`) package status and scan history in a single synchronous `GET` request or MCP tool call. `dhlink` covers DHLink, a consolidator that ships e-commerce parcels from China to the US, UK and elsewhere. Its numbers start `FC` and it also tracks the postal numbers it carries. **Source**: Plain `POST https://www.dhlink.com/stage-api/trbiz/track/queryTrack`, no key needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dhlink` | | **Brand aliases** | DHLink, DHL ink, FC tracking, cross-border e-commerce China | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dhlink` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=dhlink` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `FC` + 13 digits is not claimed by auto-detection, so pass `?carrier=dhlink`. S10 postal numbers (`FC2404051641097`) belong to the postal operators. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/FC2404051641097?carrier=dhlink" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dhlink", "trackingNumber": "FC2404051641097", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2024-05-04T16:07:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "events": [ { "timestamp": null, "localTime": "2024-05-04T16:07:00", "status": "delivered", "description": "Delivered", "location": "WASHINGTON, DC 20024", "code": null }, { "timestamp": null, "localTime": "2024-05-04T06:18:00", "status": "out_for_delivery", "description": "WASHINGTON, DC, US 20024, Out for Delivery, Expected Delivery by 7:40pm", "location": "WASHINGTON, DC, US 20024", "code": null }, { "timestamp": null, "localTime": "2024-04-30T11:42:00", "status": "in_transit", "description": "MANASSAS, VA 20109, Arrived Shipping Partner Facility, USPS Awaiting Item", "location": "MANASSAS, VA 20109", "code": null } ] } ``` ## Notes - **Scans**: DHLink merges the origin post's, the destination carrier's and its own scans, often twice or in Chinese. Chinese-only lines and duplicates are dropped and the source with the most scans is kept, so `description` is the carrier's English wording, which sometimes repeats the place. - **Time zone**: scan times carry no zone, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DHL Parcel Spain & Portugal Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dhlparceles Query live **DHL Parcel Iberia** (`dhlparceles`) package status and scan history in a single synchronous `GET` request or MCP tool call. `dhlparceles` covers DHL Parcel Iberia's parcels, including pickup at a DHL ServicePoint. **Source**: Plain `GET https://clientesparcel.dhl.es/LiveTracking.GTW/api/shipment-detail?number={number}`, no key needed. An unknown number is an empty 204. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dhlparceles` | | **Brand aliases** | DHL Parcel Spain, DHL Parcel Portugal, DHL Parcel Iberia, DHL Paquete, ServicePoint | | **Category** | International parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dhlparceles` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=dhlparceles` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | The 10-digit DHL Parcel number (`5001191987` style) is not distinguishable from other 10-digit numbers, so pass `?carrier=dhlparceles`. It also answers references that ride the network, such as `CC…DE` pieces that [DHL](https://docs.lastscanned.com/docs/carriers/dhl) auto-detects. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/5001191987?carrier=dhlparceles" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dhlparceles", "trackingNumber": "5001191987", "status": "delivered", "statusDescription": "Parcel picked up by recipient", "service": "DHL PARCEL IBERIA", "deliveredAt": null, "deliveredAtLocal": "2026-08-18T16:46:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-08-18T16:46:00", "status": "delivered", "description": "Parcel picked up by recipient", "location": "Bizkaia", "code": "RS" }, { "timestamp": null, "localTime": "2026-08-18T15:58:00", "status": "exception", "description": "Delivered to DHL ServicePoint, ready for collection by the recipient", "location": "Bizkaia", "code": "IS" }, { "timestamp": null, "localTime": "2026-08-18T09:28:00", "status": "out_for_delivery", "description": "Out for delivery", "location": "Bizkaia", "code": "A" } ] } ``` ## Notes - **Time zone**: scan times are the depot's wall clock and the network spans Spain and Portugal, so only `localTime` is set. - **Wording**: scan descriptions are English (the request is sent with an English `Accept-Language`); `code` is DHL's event code (`RS` collected, `IS` ready for collection, `A` out for delivery, `NH` recipient absent). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DHL Parcel Netherlands Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dhlparcelnl Query live **DHL Parcel NL** (`dhlparcelnl`) package status and scan history in a single synchronous `GET` request or MCP tool call. `dhlparcelnl` covers DHL Parcel in the Netherlands and Benelux and DHL eCommerce Europe's `JVGL…` numbers. **Source**: Plain `GET https://api-gw.dhlparcel.nl/track-trace?key={number}`, no key needed. An unknown number is a 404. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dhlparcelnl` | | **Brand aliases** | DHL Parcel NL, DHL Parcel Benelux, DHL eCommerce Europe, DHL Parcel Connect, JVGL | | **Category** | International parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dhlparcelnl` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=dhlparcelnl` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^JVGL\d{20}$/` | none | `JVGL06289524001751165708` | | **Pass 2 (`mayMatch`)** | none | none | none | `JVGL…` numbers belong to this network alone, so `?carrier=` is optional for them. DHL Parcel's own `3S…` barcodes are also used by PostNL, so pass `?carrier=dhlparcelnl` for those. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JVGL06289524001751165708?carrier=dhlparcelnl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dhlparcelnl", "trackingNumber": "JVGL06289524001751165708", "status": "delivered", "statusDescription": "Collected at parcelstation", "service": null, "deliveredAt": "2026-08-21T14:17:19Z", "deliveredAtLocal": "2026-08-21T16:17:19", "signedBy": null, "destination": { "city": null, "state": null, "country": "NL" }, "events": [ { "timestamp": "2026-08-21T14:17:19Z", "localTime": "2026-08-21T16:17:19", "status": "delivered", "description": "Collected at parcelstation", "location": null, "code": "COLLECTED_AT_PARCELSTATION" }, { "timestamp": "2026-08-21T11:57:41Z", "localTime": "2026-08-21T13:57:41", "status": "exception", "description": "Delivered at parcelshop", "location": null, "code": "DELIVERED_AT_PARCELSHOP" }, { "timestamp": "2026-08-21T08:49:06Z", "localTime": "2026-08-21T10:49:06", "status": "out_for_delivery", "description": "Out for delivery", "location": null, "code": "OUT_FOR_DELIVERY" } ] } ``` ## Notes - **Statuses**: the carrier's category and status code set `status`. `description` is the status code in plain words, and `code` keeps the code. A parcel waiting at a parcelshop or locker for the receiver shows as `exception` (ready for collection) until it is collected. - **Time zone**: times are ISO with their own offset, so `timestamp` and `localTime` are exact. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DHL Parcel Poland Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dhlparcelpl Query live **DHL Parcel PL** (`dhlparcelpl`) package status and scan history in a single synchronous `GET` request or MCP tool call. `dhlparcelpl` covers DHL Parcel Poland (mojdhl.pl). The public service reports the parcel's current step and its posting date, not a full scan list, so the result has one or two events. **Source**: Plain `GET https://mojdhl.pl/api/dhl/public/auth/captcha/challenge`, then `POST https://mojdhl.pl/api/dhl/public/shipment/status` with the solved challenge. No key needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dhlparcelpl` | | **Brand aliases** | DHL Parcel Poland, DHL Polska, Moj DHL, DHL24 | | **Category** | International parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dhlparcelpl` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=dhlparcelpl` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Poland uses 11-digit shipment numbers (`JJD000030214008000129555645`) and `JJD…` piece numbers, both shared with other carriers, so pass `?carrier=dhlparcelpl`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JJD000030214008000129555645?carrier=dhlparcelpl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dhlparcelpl", "trackingNumber": "JJD000030214008000129555645", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-08-05T06:42:00Z", "deliveredAtLocal": "2026-08-05T08:42:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-08-05T06:42:00Z", "localTime": "2026-08-05T08:42:00", "status": "delivered", "description": "Delivered", "location": null, "code": "TT_DOR" }, { "timestamp": null, "localTime": "2026-07-03", "status": "in_transit", "description": "Shipment posted", "location": null, "code": null } ] } ``` ## Notes - **Proof of work**: the site guards its status call with an ALTCHA challenge. The lookup computes it with SHA-256 hashing (up to 100000 hashes, a fraction of a second to under a second of CPU) before asking, so a lookup takes about 1 to 2 seconds in all. - **Detail**: the carrier's current step (delivered, ready for collection at a point or locker, out for delivery, returned to sender, and so on) sets `status`; its date is the delivery or receipt time when there is one. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Direx Tracking API & MCP URL: https://docs.lastscanned.com/carriers/direx Query live **Direx** (`direx`) package status and scan history in a single synchronous `GET` request or MCP tool call. Bulgaria cross-border. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `direx` | | **Brand aliases** | Direx, Direx Bulgaria, direx.bg | | **Category** | Cross border (Bulgaria cross-border) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=9063457359,9063457359` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Direx numbers have no shape of their own, so pass `?carrier=direx`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/9063457359?carrier=direx" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "direx", "trackingNumber": "9063457359", "status": "delivered", "statusDescription": "Delivered", "service": "DX GLOBAL", "deliveredAt": null, "deliveredAtLocal": "2026-01-29T15:03:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": "Handed to USPS as 9063457359", "events": [ { "timestamp": null, "localTime": "2026-01-29T15:03:00", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-01-24T13:09:00", "status": "in_transit", "description": "In Destination Country", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-01-21T09:23:52", "status": "label_created", "description": "Created", "location": null, "code": null } ] } ``` ## Notes - Main statuses: `CRD` created, `APO` accepted, `DED` dispatched, `ADC` in destination country, `ITT` in transit, `DLD` delivered, `RWD`/`RAD` returned. Times have no zone. - `message` names the partner carrier and its number (`api_label.item`). 10-digit codes overlap other shapes, so pass `?carrier=direx`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DobroPost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dobropost Query live **DobroPost** (`dobropost`) package status and scan history in a single synchronous `GET` request or MCP tool call. China to Russia/Belarus cross-border. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dobropost` | | **Brand aliases** | DobroPost, Dobropost, Добропост | | **Category** | Cross border (China to Russia/Belarus cross-border) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=DBRPST3000001549,DBRPST3000001549` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^DBRPST\d{10}$/` | none | `DBRPST3000001549` | | **Pass 2 (`mayMatch`)** | none | none | none | `DBRPST3000001549`-shaped numbers are claimed by DobroPost, so `?carrier=dobropost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/DBRPST3000001549?carrier=dobropost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dobropost", "trackingNumber": "DBRPST3000001549", "status": "in_transit", "statusDescription": "Покинула таможню и передана на доставку по РФ", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "Russia" }, "events": [ { "timestamp": "2026-02-09T03:57:00Z", "localTime": "2026-02-09T06:57:00", "status": "in_transit", "description": "Покинула таможню и передана на доставку по РФ", "location": null, "code": null }, { "timestamp": "2026-02-09T03:49:00Z", "localTime": "2026-02-09T06:49:00", "status": "in_transit", "description": "Подготовлено к отгрузке в доставку последней мили", "location": null, "code": null }, { "timestamp": "2026-01-05T15:34:24Z", "localTime": "2026-01-05T18:34:24", "status": "label_created", "description": "На комплектации", "location": null, "code": null } ] } ``` ## Notes - Checkpoints carry ISO times with a `+03:00` offset, so `timestamp` is exact. The `code` is the English status name. Customs refusals and return approvals are `exception`. - `DBRPST` numbers belong to DobroPost alone, so `?carrier=dobropost` is optional. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Dohrn Transfer Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dohrn Query live **Dohrn Transfer** (`dohrn`) PRO status, terminal scan history and signer in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dohrn` | | **Brand aliases** | Dohrn Transfer Company, Dohrn Transfer, Dohrn PRO | | **Category** | US LTL freight (Midwest) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dohrn` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=25663914,...&carrier=dohrn` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | PRO numbers are 8 to 9 digits, a shape other LTL carriers use too, so pass `?carrier=dohrn`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/25663914?carrier=dohrn" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dohrn", "trackingNumber": "25663914", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2019-05-30T11:30:00", "signedBy": "JACOB BRUCE", "destination": { "city": "Vincennes", "state": "IN", "country": "US" }, "message": null, "events": [ { "timestamp": null, "localTime": "2019-05-30T11:30:00", "status": "delivered", "description": "Delivered", "location": "Vincennes, IN", "code": null }, { "timestamp": null, "localTime": "2019-05-30T09:05:00", "status": "out_for_delivery", "description": "Out For Delivery", "location": "Evansville, IN", "code": null } ] } ``` ## Notes - **Time zone**: Dohrn's terminals span US Central and Eastern time and the feed gives no zone, so events carry `localTime` only (`timestamp` is `null`). - **Status**: "Manifested" and "Trailer ..." scans are freight movement and map to `in_transit`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Domain Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/domainlogistics Query live **Domain Logistics** (`domainlogistics`) package status and scan history in a single synchronous `GET` request or MCP tool call. Canada delivery. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `domainlogistics` | | **Brand aliases** | Domain Logistics, Domain Logistics Canada, domainlogistics.ca | | **Category** | Regional (Canada delivery) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=017096746302,017096746302` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Domain Logistics numbers have no shape of their own, so pass `?carrier=domainlogistics`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/017096746302?carrier=domainlogistics" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "domainlogistics", "trackingNumber": "017096746302", "status": "delivered", "statusDescription": "Your order has been delivered!", "service": "Express Delivery", "deliveredAt": null, "deliveredAtLocal": "2026-09-06T21:43:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-09-06T21:43:00", "status": "delivered", "description": "Your order has been delivered!", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-09-06T16:00:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-09-06T14:51:00", "status": "in_transit", "description": "Your order has been shipped!", "location": null, "code": null } ] } ``` ## Notes - An unknown number is an HTTP 500 `{"Message":"An error has occurred."}` (no distinct not-found answer); it is treated as `not_found`. Times have no zone. - Numbers are 12 digits, a shape shared with other carriers, so pass `?carrier=domainlogistics`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Domex Tracking API & MCP URL: https://docs.lastscanned.com/carriers/domex Query live **Domex** (`domex`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `domex` | | **Brand aliases** | Domex, Domex Sri Lanka, domex.lk | | **Category** | Sri Lankan domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EC704286295,EC704286295` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Domex numbers have no shape that other carriers do not also use, so they are not auto-detected: pass `?carrier=domex`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EC704286295?carrier=domex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "domex", "trackingNumber": "EC704286295", "status": "delivered", "statusDescription": "Complete", "service": null, "deliveredAt": "2026-06-25T04:38:00Z", "deliveredAtLocal": "2026-06-25T10:08:00", "signedBy": null, "destination": { "city": "Galle", "state": null, "country": "LK" }, "events": [ { "timestamp": "2026-06-25T04:38:00Z", "localTime": "2026-06-25T10:08:00", "status": "delivered", "description": "Complete", "location": null, "code": "CIG" }, { "timestamp": "2026-06-20T06:24:53Z", "localTime": "2026-06-20T11:54:53", "status": "delivered", "description": "Delivered", "location": "Galle", "code": "D" }, { "timestamp": "2026-06-20T04:24:14Z", "localTime": "2026-06-20T09:54:14", "status": "out_for_delivery", "description": "Out For Delivery", "location": "Galle", "code": "ATD" }, { "timestamp": "2026-06-19T13:05:39Z", "localTime": "2026-06-19T18:35:39", "status": "label_created", "description": "Waiting To Pickup", "location": "Colombo", "code": "CI" } ] } ``` ## Notes - **Locations**: each scan reads "`` By ``"; the branch becomes `location`. Head-office finance steps carry no location. - **Time zone**: Domex prints Sri Lanka time. `localTime` is that clock time and `timestamp` is it converted from UTC+5:30. - **Status**: the carrier's own step codes decide `status` (`D` delivered, `ATD` out for delivery, `CI` label created). After `D`, the later POD and cash-collection steps stay `delivered`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DPD Germany Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dpd Query live **DPD** (`dpd`) parcel status and progress in a single synchronous `GET` request or MCP tool call. It reads DPD Germany's public tracking page, which shows a parcel's progress **without the recipient's postcode**. For DPD UK numbers use the [`dpduk`](https://docs.lastscanned.com/docs/carriers/dpduk) carrier. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dpd` | | **Brand aliases** | DPD, DPD Germany, DPD Paket, DPD Group, myDPD | | **Category** | Regional parcels (Germany and DPD Group continental) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dpd` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=dpd` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^0\d{13}$/` | none | `01505533685981` | Other carriers also issue 14-digit numbers, so DPD is only a fallback: pass `?carrier=dpd` when you know the parcel is DPD's. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/01505533685981?carrier=dpd" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dpd", "trackingNumber": "01505533685981", "status": "delivered", "statusDescription": "Collected from the Pickup parcelshop by the recipient", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-07", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-07", "status": "delivered", "description": "Collected from the Pickup parcelshop by the recipient", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-10-06", "status": "exception", "description": "Parcel dropped off at a Pickup parcelshop", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-10-01", "status": "in_transit", "description": "Parcel in transit", "location": null, "code": null } ] } ``` ## Notes - **What the guest view leaves out**: DPD shows the postcode-free view as up to five stages (data received by DPD, in transit, at the depot, out for delivery, delivered), each with a **day only**: no time of day, no depot or city, no scan list, no delivery time window or driver details, and no signature. Entering the recipient's postcode on DPD's page unlocks that fuller view, which this carrier does not use. Events therefore have `localTime` as a date (`2026-10-07`), `timestamp: null` and `location: null`. - **Year**: the page prints days as `07.10.` with no year. The year is taken from the page's headline status (which carries a full date) or, failing that, is the latest year that does not put the newest stage in the future. A parcel more than a year old may therefore show a wrong year on its earliest stages. - **Language**: DPD's page is German-only. The five standard stage labels are translated to English; any other wording is passed through in German. - **Pickup parcelshops**: a parcel waiting in a shop is reported as `exception` (it needs action) until it is collected. - **Returns**: when DPD shows "Retoure an Versender" the status is `returned`. - **Other DPD countries**: numbers from DPD Belgium, the Netherlands and other partner networks are not shown on this page. The result has `status: "unknown"`, no events, and a `message` naming the country's DPD site and its tracking link. - **Not found**: a number DPD's page does not know returns `404 not_found`. - **Source**: plain requests to `tracking.dpd.de`, which redirects to `my.dpd.de`. The myDPD app's `dpdgroup.com` guest API is not used because it sits behind a Cloudflare challenge. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DPD Poland Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dpdpl Query live **DPD Poland** (`dpdpl`) package status and scan history in a single synchronous `GET` request or MCP tool call, with no postcode. `lastscanned` tries DPD Poland for 13-digit-plus-letter numbers when nothing else claims them. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dpdpl` | | **Brand aliases** | DPD Poland, DPD Polska, DPD PL | | **Category** | Regional courier (Poland) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=13649547289291,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^\d{13}[A-Z]$/` | none | `13649547289291` | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/13649547289291?carrier=dpdpl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dpdpl", "trackingNumber": "13649547289291", "status": "delivered", "statusDescription": "Parcel delivered Recipient: J......K", "service": null, "deliveredAt": "2026-09-03T13:23:10Z", "deliveredAtLocal": "2026-09-03T15:23:10", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-09-03T13:23:10Z", "localTime": "2026-09-03T15:23:10", "status": "delivered", "description": "Parcel delivered Recipient: J......K", "location": "KRK", "code": null }, { "timestamp": "2026-09-03T06:12:24Z", "localTime": "2026-09-03T08:12:24", "status": "out_for_delivery", "description": "Parcel dispatched to be delivered", "location": "KRK", "code": null }, { "timestamp": "2026-09-02T04:15:46Z", "localTime": "2026-09-02T06:15:46", "status": "label_created", "description": "Registered parcel data, parcel not dispatched yet", "location": null, "code": null } ] } ``` ## Notes - **Source**: the fragment that `tracktrace.dpd.com.pl` loads for a parcel (`POST /EN/findPackage`). No postcode or captcha is involved. - **Times**: Polish local time (`Europe/Warsaw`) converted to UTC. - **Notices**: the page's "Mail notification" and "SMS notification" rows are messages to the recipient, not scans, and are left out. - **Returns**: a returned parcel's `message` gives the return parcel number. - **Other DPD**: DPD Germany, Benelux and the DPD group's `continental` numbers are not covered here; pass `?carrier=` for those carriers. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DPD Portugal Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dpdpt Query live **DPD Portugal** (`dpdpt`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dpdpt` | | **Brand aliases** | DPD Portugal, DPD PT, tracking.dpd.pt | | **Category** | Regional parcels (Portugal) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | 14-digit DPD references are shared with other DPD countries, so pass `?carrier=dpdpt`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/08448880307396?carrier=dpdpt" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dpdpt", "trackingNumber": "08448880307396", "status": "delivered", "statusDescription": "PROVA DE ENTREGA", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-14T15:52:00", "signedBy": "Maria Silva", "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-14T15:52:00", "status": "delivered", "description": "PROVA DE ENTREGA", "location": null, "code": "POD" }, { "timestamp": null, "localTime": "2026-10-13T09:32:00", "status": "out_for_delivery", "description": "EM DISTRIBUIÇÃO", "location": null, "code": "OFD" } ] } ``` ## Notes - **Language**: descriptions are DPD Portugal's Portuguese wording; `code` is DPD's scan code (`POD` proof of delivery, `OFD` out for delivery, `HUB`, `PEC`, `COL`, ...). - **Pickup points**: scans `001` and `002` (delivered to a pickup point) are `exception`: the parcel waits for the recipient. - **Time zone**: the page prints scan times with no zone, so `localTime` is that clock time and `timestamp` is `null`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DPD Romania Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dpdro Query live **DPD Romania** (`dpdro`) package status and scan history in a single synchronous `GET` request or MCP tool call. DPD Romania's parcel numbers are plain digits shared with other carriers, so pass `?carrier=dpdro`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dpdro` | | **Brand aliases** | DPD Romania, DPD Romania SkyLogistics, MyDPD | | **Category** | Regional courier (Romania) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=81353773180,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (plain digits) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/81353773180?carrier=dpdro" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dpdro", "trackingNumber": "81353773180", "status": "in_transit", "statusDescription": "Arrival Scan", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-12T08:00:00Z", "localTime": "2026-10-12T11:00:00", "status": "in_transit", "description": "Arrival Scan", "location": "Cluj-Napoca", "code": "1" } ] } ``` ## Notes - **Source**: the public REST JSON of the MyDPD portal (`mydpd.dpd.ro/rest/public/track`), the same software as [Speedy](https://docs.lastscanned.com/docs/carriers/speedy). The Cloudflare-protected `tracking.dpd.ro` page is not used. - **Sample note**: the sample above is illustrative; the response has the same fields as Speedy's. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DPD UK Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dpduk Query live **DPD UK** (`dpduk`) package status and scan history in a single synchronous `GET` request or MCP tool call. This is the UK network behind `track.dpd.co.uk`; for DPD in other European countries (`dpd.com`) use the DPD Group carrier instead. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dpduk` | | **Brand & service aliases** | DPD UK, DPD Local, DPD Pickup, Follow my parcel | | **Category** | UK domestic parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dpduk` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=15504366056765,15504366056765&carrier=dpduk` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | n/a | | **Pass 2 (`mayMatch`)** | `/^15\d{12}$/` (14-digit label barcode: `1550` plus the 10-digit parcel number) | none | `15504366056765` | | **Explicit (`?carrier=dpduk`)** | The 14-digit barcode or the bare 10-digit parcel number | none | `15504366056765` | DPD UK numbers have no check digit and share their shape with other carriers, so pass `?carrier=dpduk` whenever you know the parcel is DPD UK. DPD matches on the last 10 digits, so the 14-digit barcode and the 10-digit number find the same parcel. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/15504366056765?carrier=dpduk" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "15504366056765", "carrier": "dpduk" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "dpduk", "trackingNumber": "15504366056765", "status": "out_for_delivery", "statusDescription": "Your parcel is out for delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-10-26T07:42:00Z", "localTime": "2026-10-26T07:42:00", "status": "out_for_delivery", "description": "Your parcel is out for delivery", "location": "Leeds", "code": null }, { "timestamp": "2026-10-25T22:10:00Z", "localTime": "2026-10-25T23:10:00", "status": "in_transit", "description": "Your parcel has arrived at the local delivery depot", "location": "Leeds", "code": null } ] } ``` ## Status & Time Notes - **Pickup shops**: A parcel waiting at a DPD Pickup shop ("ready to be collected") is reported as `exception` until it is collected, and a refused parcel is `exception` too. - **Times**: DPD UK prints scan times as UK local time with no zone, including scans by its European partner networks, so `timestamp` is converted from `Europe/London` and `localTime` is the time as printed. - **Rate limit**: DPD allows about 50 requests a minute per IP and each lookup makes three, so large batches may return `rate_limited` for some numbers. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # DPD South Africa Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dpdza Query live **DPD South Africa** (`dpdza`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dpdza` | | **Brand aliases** | DPD South Africa, DPD Laser, DPD ZA | | **Category** | South African domestic and import courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=WC5120157,WC5120157` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | DPD South Africa numbers have no shape that other carriers do not also use, so they are not auto-detected: pass `?carrier=dpdza`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/WC5120157?carrier=dpdza" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dpdza", "trackingNumber": "WC5120157", "status": "delivered", "statusDescription": "Your parcel has been delivered to A. SMITH", "service": null, "deliveredAt": "2026-03-12T10:21:08Z", "deliveredAtLocal": "2026-03-12T12:21:08", "signedBy": "A. SMITH", "destination": { "city": "Goodwood", "state": null, "country": "ZA" }, "events": [ { "timestamp": "2026-03-12T10:21:08Z", "localTime": "2026-03-12T12:21:08", "status": "delivered", "description": "Your parcel has been delivered to A. SMITH", "location": null, "code": "8" }, { "timestamp": "2026-03-12T06:10:05Z", "localTime": "2026-03-12T08:10:05", "status": "out_for_delivery", "description": "Your parcel is out on delivery CAPE TOWN ZA", "location": "CAPE TOWN ZA", "code": "3" }, { "timestamp": "2026-03-11T17:53:38Z", "localTime": "2026-03-11T19:53:38", "status": "in_transit", "description": "We have taken receipt of your parcel at our depot CAPE TOWN ZA", "location": "CAPE TOWN ZA", "code": "1" } ] } ``` ## Notes - **Time zone**: DPD prints South Africa time (`Africa/Johannesburg`, UTC+2). `localTime` is that clock time and `timestamp` is it converted. - **Status**: the waybill's own status wins, so admin scans that follow a delivery (for example a proof-of-delivery image scan) do not turn a delivered parcel back to `in_transit`. - **Signatory**: `signedBy` is the name DPD records for the delivery. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DPEX Worldwide Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dpex Query live **DPEX Worldwide** (`dpex`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dpex` | | **Brand aliases** | DPEX, DPEX Worldwide, DPEX China | | **Category** | Asia-Pacific express and cross-border parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=555726783791,555726783791` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | DPEX Worldwide numbers have no shape that other carriers do not also use, so they are not auto-detected: pass `?carrier=dpex`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/555726783791?carrier=dpex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dpex", "trackingNumber": "555726783791", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-02-03T06:13:00Z", "deliveredAtLocal": "2026-02-03T13:13:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-03T06:13:00Z", "localTime": "2026-02-03T13:13:00", "status": "delivered", "description": "Delivered", "location": "Singapore", "code": "1" }, { "timestamp": "2026-02-02T02:20:00Z", "localTime": "2026-02-02T10:20:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "Singapore", "code": "15" }, { "timestamp": "2026-01-30T12:00:00Z", "localTime": "2026-01-30T20:00:00", "status": "in_transit", "description": "Released from Customs", "location": "Singapore", "code": "37" }, { "timestamp": "2026-01-29T00:10:00Z", "localTime": "2026-01-29T08:10:00", "status": "in_transit", "description": "In Transit to Destination", "location": "Ho Chi Minh", "code": "3" } ] } ``` ## Notes - **Times**: each scan carries both the local wall time and the UTC time, so `timestamp` and `localTime` are exact for every country. - **Attempts**: failed delivery attempts ("Attempted Delivery - Consignee Not Available") are `exception` scans; the parcel's status follows the newest scan. - **Route**: the page `erp.dpex.com.cn/trace-and-track/index` embeds the scans as a JS array; an unknown number embeds a "No track found" marker. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Dragon Star Curier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dragonstarcurier Query live **Dragon Star Curier** (`dragonstarcurier`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dragonstarcurier` | | **Brand aliases** | Dragon Star Curier, DSC, Dragon Star Courier | | **Category** | Romanian domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=79828449,79828449` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Dragon Star Curier numbers have no shape that other carriers do not also use, so they are not auto-detected: pass `?carrier=dragonstarcurier`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/79828449?carrier=dragonstarcurier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dragonstarcurier", "trackingNumber": "79828449", "status": "returned", "statusDescription": "Exceptie in Asteptare", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2025-03-15T09:27:00Z", "localTime": "2025-03-15T11:27:00", "status": "exception", "description": "Exceptie in Asteptare", "location": "OTOPENI", "code": "EIA" }, { "timestamp": "2025-03-14T21:21:00Z", "localTime": "2025-03-14T23:21:00", "status": "in_transit", "description": "Intrare Centru", "location": "BRASOV", "code": null }, { "timestamp": "2025-03-13T11:26:00Z", "localTime": "2025-03-13T13:26:00", "status": "in_transit", "description": "Preluata", "location": "SIBIU", "code": "PRL" } ] } ``` ## Notes - **Time zone**: scan times are Romania local time (`Europe/Bucharest`); `timestamp` is converted from it. - **Status**: the page's overall state ("Returnat", returned) decides `status` when present; each scan's Romanian wording is mapped to a status (`Exceptie` exception, `Livrat` delivered, `Intrare/Iesire Centru` in transit). - **Codes**: scans titled "EIA - Exceptie in Asteptare" or "PRL - Preluata" put the code in `code` and the wording in `description`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Drop2Shop Tracking API & MCP URL: https://docs.lastscanned.com/carriers/drop2shop Query live **Drop2Shop** (`drop2shop`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `drop2shop` | | **Brand aliases** | Drop2Shop, Drop 2 Shop, COLL-8 | | **Category** | Irish and UK parcel shop delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=GLB0110002778214,GLB0110002778214` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^GLB\d{13}$/` | none | `GLB0110002778214` | | **Pass 2 (`mayMatch`)** | none | none | none | These shapes belong to Drop2Shop alone, so `?carrier=drop2shop` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/GLB0110002778214?carrier=drop2shop" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "drop2shop", "trackingNumber": "GLB0110002778214", "status": "delivered", "statusDescription": "Your parcel has been delivered", "service": null, "deliveredAt": "2026-04-14T12:50:00Z", "deliveredAtLocal": "2026-04-14T13:50:00", "signedBy": null, "destination": null, "message": "Handed to DPD as 869000000", "events": [ { "timestamp": "2026-04-14T12:50:00Z", "localTime": "2026-04-14T13:50:00", "status": "delivered", "description": "Your parcel has been delivered", "location": null, "code": "D2MD001" }, { "timestamp": "2026-04-14T09:02:48Z", "localTime": "2026-04-14T10:02:48", "status": "out_for_delivery", "description": "Your parcel is on a van and due for delivery", "location": null, "code": "D2MS004" }, { "timestamp": "2026-04-05T11:35:21Z", "localTime": "2026-04-05T12:35:21", "status": "label_created", "description": "Package Created", "location": null, "code": "DAT" } ] } ``` ## Notes - **Handoff**: `message` names the last-mile carrier and its number (for example `"Handed to DPD as 869000000"`). Pass that number to `GET /v1/track/{number}` for DPD's own scans. - **Time zone**: package-creation (`DAT`) and customs (`CUSM…`) records are UTC; the Drop2Shop records are Irish/UK local time (`Europe/Dublin`, the same offsets as London). `timestamp` is exact for both. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Dropp Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dropp Query live **Dropp** (`dropp`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dropp` | | **Brand aliases** | Dropp, Dropp Iceland, dropp.is | | **Category** | Icelandic parcel delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=DR672CV19W93E,DR672CV19W93E` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Dropp numbers have no shape that other carriers do not also use, so they are not auto-detected: pass `?carrier=dropp`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/DR672CV19W93E?carrier=dropp" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dropp", "trackingNumber": "DR672CV19W93E", "status": "delivered", "statusDescription": "Parcel delivered", "service": "Order from Example Shop", "deliveredAt": "2026-09-14T18:06:00Z", "deliveredAtLocal": "2026-09-14T18:06:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-09-14T18:06:00Z", "localTime": "2026-09-14T18:06:00", "status": "delivered", "description": "Parcel delivered", "location": null, "code": "delivered" }, { "timestamp": "2026-09-14T09:56:00Z", "localTime": "2026-09-14T09:56:00", "status": "in_transit", "description": "Received at warehouse", "location": null, "code": "warehouse" }, { "timestamp": "2026-09-09T16:30:00Z", "localTime": "2026-09-09T16:30:00", "status": "label_created", "description": "Parcel expected", "location": null, "code": "added" } ] } ``` ## Notes - **Stages**: Dropp's answer is a record of stage times (expected, in the air, at warehouse, in transit, consignment, delivered), not a scan list; each stage that has a time becomes one event, with the stage name in `code`. - **Time zone**: Iceland is UTC+0 all year, so `timestamp` equals `localTime`. - **Service**: `service` names the web shop the parcel came from. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DSV Tracking API & MCP URL: https://docs.lastscanned.com/carriers/dsv Query live **DSV** (`dsv`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `dsv` | | **Brand aliases** | DSV, myDSV, DSV Road, DSV Air & Sea | | **Category** | Freight forwarding (air, sea, road) shipments | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=HKG1132478,HKG1132478` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | DSV numbers have no shape that other carriers do not also use, so they are not auto-detected: pass `?carrier=dsv`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/HKG1132478?carrier=dsv" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "dsv", "trackingNumber": "HKG1132478", "status": "delivered", "statusDescription": "Handover responsibilty of cargo", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-05-30T16:09:00", "signedBy": null, "destination": { "city": "CAMPINAS", "state": null, "country": "BR" }, "events": [ { "timestamp": null, "localTime": "2026-05-30T16:09:00", "status": "delivered", "description": "Handover responsibilty of cargo", "location": null, "code": "Z70" }, { "timestamp": null, "localTime": "2026-05-29T19:09:00", "status": "in_transit", "description": "Actual arrival", "location": "Viracopos Apt / Campinas, BR", "code": "ARV" }, { "timestamp": null, "localTime": "2026-05-27T13:32:00", "status": "in_transit", "description": "Actual Departure", "location": "Hong Kong, HK", "code": "DEP" }, { "timestamp": null, "localTime": "2026-05-25T00:00:00", "status": "label_created", "description": "Booking", "location": null, "code": "BOOKING" } ] } ``` ## Notes - **Milestones**: booking, cargo received, departure, arrival and handover are events. Planned milestones (ETA, ETD, requested/estimated pickup) are forecasts and are left out. - **Time zone**: myDSV gives each stop's wall time with no zone, so events carry `localTime` only (`timestamp` is null). - **Status**: a shipment myDSV marks `COMPLETED` is `delivered`. - **Lookup**: two requests, the public search for the shipment id, then its milestones. A reference that matches several shipments is matched on its exact value. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Early Bird Tracking API & MCP URL: https://docs.lastscanned.com/carriers/earlybird Query live **Early Bird** (`earlybird`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `earlybird` | | **Brand aliases** | Early Bird, EarlyBird, earlybird.se | | **Category** | Swedish night-time parcel delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=00373325385394147175,00373325385394147175` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Early Bird numbers have no shape that other carriers do not also use, so they are not auto-detected: pass `?carrier=earlybird`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/00373325385394147175?carrier=earlybird" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "earlybird", "trackingNumber": "00373325385394147175", "status": "delivered", "statusDescription": "The package has been delivered to your mailbox.", "service": null, "deliveredAt": "2026-10-19T22:47:17Z", "deliveredAtLocal": "2026-10-20T00:47:17", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-19T22:47:17Z", "localTime": "2026-10-20T00:47:17", "status": "delivered", "description": "The package has been delivered to your mailbox.", "location": null, "code": null }, { "timestamp": "2026-10-19T12:43:09Z", "localTime": "2026-10-19T14:43:09", "status": "in_transit", "description": "Your package has arrived at the terminal in Jönköping.", "location": "Jönköping", "code": null }, { "timestamp": "2026-10-10T21:35:58Z", "localTime": "2026-10-10T23:35:58", "status": "label_created", "description": "Your delivery is booked with Early Bird.", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: a time ending in `Z` is UTC and `localTime` is its Stockholm clock time; a time without `Z` is Stockholm wall time (`Europe/Stockholm`) and `timestamp` is converted from it. - **Wording**: events are free text (Swedish for older parcels, English for newer ones) with no codes. The terminal city is read into `location` where the text names it. - **Detection**: SSCC numbers are shared with other carriers, so pass `?carrier=earlybird`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Easy Mail Tracking API & MCP URL: https://docs.lastscanned.com/carriers/easymail Query live **Easy Mail** (`easymail`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `easymail` | | **Brand aliases** | Easy Mail, Easymail, easymail.gr | | **Category** | Greek domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=14077273507,14077273507` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Easy Mail numbers have no shape that other carriers do not also use, so they are not auto-detected: pass `?carrier=easymail`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/14077273507?carrier=easymail" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "easymail", "trackingNumber": "14077273507", "status": "delivered", "statusDescription": "Παραδόθηκε", "service": null, "deliveredAt": "2026-03-07T13:47:00Z", "deliveredAtLocal": "2026-03-07T15:47:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-07T13:47:00Z", "localTime": "2026-03-07T15:47:00", "status": "delivered", "description": "Παραδόθηκε", "location": "ΜΟΥΔΑΝΙΑ", "code": null }, { "timestamp": "2026-03-07T07:16:20Z", "localTime": "2026-03-07T09:16:20", "status": "out_for_delivery", "description": "Προς παράδοση", "location": "ΜΟΥΔΑΝΙΑ", "code": null }, { "timestamp": "2026-03-04T09:06:16Z", "localTime": "2026-03-04T11:06:16", "status": "label_created", "description": "Καταχώρηση αποστολής από τον αποστολέα", "location": "ΜΕΤΑΜΟΡΦΩΣΗ", "code": null } ] } ``` ## Notes - **Voucher**: eleven digits; the page prints it with a leading `0`, which is dropped before the lookup. - **Time zone**: scan times are Greek local time (`Europe/Athens`); `timestamp` is converted from it. - **Wording**: scans are Greek (`Παραδόθηκε` delivered, `Προς παράδοση` out for delivery, `Αιτία μη Παράδοσης` a failed attempt); `status` is mapped from them. - **Handoff**: when the partner-voucher column holds a number for a Speedex store, `message` names Speedex and that number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ECMS Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ecms Query live **ECMS Express** (`ecms`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `EC` + three letters + 11 digits numbers (`ECTSO…`, `ECZEN…`). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ecms` | | **Brand aliases** | ECMS Express, ECMS Global, ecmsglobal | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ECTSO...,ECZEN...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^EC[A-Z]{3}\d{11}$/` | none | `ECTSO00000801568` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ECTSO00000801568?carrier=ecms" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ecms", "trackingNumber": "ECTSO00000801568", "status": "delivered", "statusDescription": "Shipment delivered to customer", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-19T12:43:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": "Handed to UPS MI as ECTSO00000801568", "events": [ { "timestamp": null, "localTime": "2026-03-19T12:43:00", "status": "delivered", "description": "Shipment delivered to customer", "location": "LAX, CA, US", "code": "EVENT_301" }, { "timestamp": null, "localTime": "2026-03-12T10:05:00", "status": "in_transit", "description": "Flight departure", "location": "Tokyo", "code": "EVENT_313" } ] } ``` ## Notes - **Captcha**: ECMS asks for a one-digit arithmetic captcha (a 200x45 PNG) before it returns scans. The adapter reads the image itself and answers it, retrying on a fresh image when a glyph is not read with confidence. A batch shares one solved captcha. - **Time zone**: ECMS gives each scan's local clock time with no reliable zone, so `localTime` is set and `timestamp` and `deliveredAt` are `null`. - **Handoff**: `message` names the last-mile carrier ECMS passes the parcel to and the number it uses there, when ECMS shows one. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Econt Tracking API & MCP URL: https://docs.lastscanned.com/carriers/econt Query live **Econt** (`econt`) shipments in a single synchronous `GET` request or MCP tool call. `lastscanned` calls Econt's shipment-status service, which answers without credentials, and returns the tracking events. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `econt` | | **Category** | Bulgarian domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=econt` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1054827630048,...&carrier=econt` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP · Free tier (5 unique numbers/day) · Pro ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection Econt numbers have no check digit and share shapes with other carriers, so they are not auto-detected. Pass `?carrier=econt`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1054827630048?carrier=econt" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "econt", "trackingNumber": "1054827630048", "status": "in_transit", "statusDescription": "Arrived at hub", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-26T06:30:00.000Z", "localTime": null, "status": "in_transit", "description": "Arrived at hub", "location": "Sofia Hub, Sofia, BG", "code": "hub" } ] } ``` ## Notes - A batch goes in one request (up to 20 numbers). - Event times are epoch milliseconds from Econt, so events carry a UTC `timestamp` and no `localTime`. - Event types (`destinationType`) are mapped: `prepared` label created, `courier` out for delivery, `delivery` delivered, `return*` returned, `destination_office` waiting for collection. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Ecoscooting Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ecoscooting Query live **Ecoscooting** (`ecoscooting`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ecoscooting` | | **Brand aliases** | Eco Scooting, Ecoscooting Spain | | **Category** | Cross-border e-commerce parcels (Spain, Portugal) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: Ecoscooting numbers are 18 digits, a shape that is not exclusive, so pass `?carrier=ecoscooting`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/024000000109776633?carrier=ecoscooting" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ecoscooting", "trackingNumber": "024000000109776633", "status": "delivered", "statusDescription": "Your shipment has been delivered successfully", "service": null, "deliveredAt": "2026-09-23T18:42:08Z", "deliveredAtLocal": "2026-09-23T20:42:08", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-09-23T18:42:08Z", "localTime": "2026-09-23T20:42:08", "status": "delivered", "description": "Your shipment has been delivered successfully", "location": "Hellín", "code": "LM_SIGN_SUCCESS" }, { "timestamp": "2026-09-23T06:21:08Z", "localTime": "2026-09-23T08:21:08", "status": "out_for_delivery", "description": "Your shipment is out for delivery", "location": "ES", "code": "LM_DELIVERY_DEPART" }, { "timestamp": "2026-09-23T04:26:13Z", "localTime": "2026-09-23T06:26:13", "status": "in_transit", "description": "Your shipment has been accepted by delivery carrier", "location": "ES", "code": "SL_ACCEPT" }, { "timestamp": "2026-09-22T16:02:31Z", "localTime": "2026-09-22T18:02:31", "status": "in_transit", "description": "Your shipment has arrived at sorting center", "location": "San Fernando de Henares", "code": "SC_INBOUND" } ] } ``` ## Notes - **Source**: Cainiao's European link gateway (`de-link.cainiao.com/gateway/link.do`) with Ecoscooting's distributor id, the call its tracking page makes. No account is needed. - **Times**: each scan has an epoch time (`opTimestamp`, used for `timestamp`) and the scan's local clock with its UTC offset (used for `localTime`). - **Status**: the Cainiao `actionCode` decides it (`LM_SIGN_SUCCESS` delivered, `LM_DELIVERY_DEPART` out for delivery, `SC_*` and `SL_*` in transit). - **Not found**: `errorCode` `B00604` (out of scope) becomes `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # EDL Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/edlexpress Query live **EDL Express** (`edlexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. EDL Express numbers share their shape with other carriers' numbers, so pass `?carrier=edlexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `edlexpress` | | **Brand aliases** | EDL Express, 壹递诺国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=edlexpress` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=edlexpress` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | EDL Express tracking numbers have no shape of their own, so always pass `?carrier=edlexpress`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to EDL Express in one request. - **Platform**: EDL Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ED POST Tracking API & MCP URL: https://docs.lastscanned.com/carriers/edpost Query live **ED POST** (`edpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ED POST numbers share their shape with other carriers' numbers, so pass `?carrier=edpost`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `edpost` | | **Brand aliases** | ED POST, 易德国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=edpost` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=edpost` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ED POST tracking numbers have no shape of their own, so always pass `?carrier=edpost`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to ED POST in one request. - **Platform**: ED POST runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Egypt Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/egyptpost Query live **Egypt Post** (`egyptpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `egyptpost` | | **Brand aliases** | Egypt Post, ElBarid, egyptpost.gov.eg | | **Category** | Egyptian national post | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EXP32010401EG,EXP32010401EG` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10 `..EG` with check digit, or `/^[A-Z]{3}\d{8}EG$/` | UPU S10 | `EXP32010401EG` | | **Pass 2 (`mayMatch`)** | none | none | none | These shapes belong to Egypt Post alone, so `?carrier=egyptpost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EXP32010401EG?carrier=egyptpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "egyptpost", "trackingNumber": "EXP32010401EG", "status": "in_transit", "statusDescription": "Shipment Arrived at office", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-09T23:54:00Z", "localTime": "2026-02-10T01:54:00", "status": "in_transit", "description": "Shipment Arrived at office", "location": "Ramses Traffic Center, Cairo, Egypt", "code": null }, { "timestamp": "2026-02-06T10:32:00Z", "localTime": "2026-02-06T12:32:00", "status": "in_transit", "description": "Shipment is collected from sender", "location": "Alex TC Post Office, Alexandria, Egypt", "code": null } ] } ``` ## Notes - **Request**: egyptpost.gov.eg is behind Cloudflare, which refuses browser-looking user agents on this route; the request goes out with the Egypt Post app's own client user agent (`Dart/3.9 (dart:io)`). - **Time zone**: scans in Egypt carry Cairo time (`Africa/Cairo`) and an exact `timestamp`. Scans made by a destination post (for example UAE) keep `localTime` only. - **Steps**: the answer is a five-step progress strip; steps without a date are empty placeholders and are left out. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Ekart Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ekart Query live **Ekart** (`ekart`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ekart` | | **Brand aliases** | Ekart, Ekart Logistics, Flipkart Ekart | | **Category** | Indian e-commerce courier (Flipkart) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MYSP1497162173,MYSP1497162173` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(?:AMI|BAL|BGS|BSI|DEL|FLO|FMP|GLA|LUA|MY[ENS]|SDL|SHO|SPO|SRT|TEL)[CPR]\d{10}$/` | none | `MYSP1497162173` | | **Pass 2 (`mayMatch`)** | none | none | none | These shapes belong to Ekart alone, so `?carrier=ekart` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/MYSP1497162173?carrier=ekart" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ekart", "trackingNumber": "MYSP1497162173", "status": "out_for_delivery", "statusDescription": "Out For Delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "PUNE", "state": null, "country": "IN" }, "events": [ { "timestamp": "2026-05-26T04:23:49Z", "localTime": "2026-05-26T09:53:49", "status": "out_for_delivery", "description": "Out For Delivery", "location": "PUNE", "code": null }, { "timestamp": "2026-05-25T22:15:00Z", "localTime": "2026-05-26T03:45:00", "status": "in_transit", "description": "InscannedAtDH - ExampleHub_PNQ", "location": "PUNE", "code": "InscannedAtDH" }, { "timestamp": "2026-05-25T11:16:17Z", "localTime": "2026-05-25T16:46:17", "status": "label_created", "description": "Pickup Requested", "location": "DELHI", "code": null } ] } ``` ## Notes - **Request**: two plain requests. The tracking page sets a session cookie and carries a CSRF token; the tracking POST sends both. - **Time zone**: scan times are epoch milliseconds (UTC); `localTime` is India time (`Asia/Kolkata`, no DST). - **Status**: `Out For Delivery` is `out_for_delivery`; `undelivered_attempted`/`undelivered_unattempted` are `exception`; `Rto…` scans are `returned`. Hub plans (`Expected - …`) stay `in_transit`. - **Description**: scans read "`` - ``"; the event is also in `code`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ELTA Tracking API & MCP URL: https://docs.lastscanned.com/carriers/elta Query live **ELTA Hellenic Post (Greece)** (`elta`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `elta` | | **Brand aliases** | ELTA, Hellenic Post, ELTA Hellas, ELTA Courier | | **Category** | National post (Greece) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10 numbers ending in `GR` (check digit validated) | yes | `SE104410587GR` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | UPU S10 (Greece) | `^[A-Z]{2}\d{9}GR$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=elta`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SE104410587GR?carrier=elta" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "elta", "trackingNumber": "SE104410587GR", "status": "delivered", "statusDescription": "Item delivered", "service": null, "deliveredAt": "2026-07-28T11:13:00Z", "deliveredAtLocal": "2026-07-28T14:13:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-07-28T11:13:00Z", "localTime": "2026-07-28T14:13:00", "status": "delivered", "description": "Item delivered", "location": "ATHINAS 56 (SOLONOS) - ELTA", "code": null }, { "timestamp": "2026-07-27T10:14:00Z", "localTime": "2026-07-27T13:14:00", "status": "exception", "description": "Item at post office - Can be collected", "location": "ATHINAS 56 (SOLONOS) - ELTA", "code": null }, { "timestamp": "2026-07-27T05:33:00Z", "localTime": "2026-07-27T08:33:00", "status": "in_transit", "description": "Shipment in transit", "location": "KOLONAKI AGENCY", "code": null } ] } ``` ## Notes - **Foreign items**: the same lookup returns the Greek leg of foreign S10 items ELTA delivers (for example `..FR`); pass `?carrier=elta` for those, since their shape belongs to the origin post. - **ELTA Courier vouchers**: the endpoint is ELTA's shared tracking box; courier vouchers were not available to verify, so only S10 numbers are auto-detected. - **Time zone**: Greek local time, converted from `Europe/Athens`. 'Can be collected' scans are reported as `exception` (awaiting collection). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # eMile Tracking API & MCP URL: https://docs.lastscanned.com/carriers/emile Query live **eMile** (`emile`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `emile` | | **Brand aliases** | eMile, Emile, emileps.com | | **Category** | Canadian final-mile delivery for cross-border parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EM200006549049CA,EM200006549049CA` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^EM\d{12}CA$/` or `/^EM\d{16}CA$/` | none | `EM200006549049CA` | | **Pass 2 (`mayMatch`)** | none | none | none | These shapes belong to eMile alone, so `?carrier=emile` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EM200006549049CA?carrier=emile" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "emile", "trackingNumber": "EM200006549049CA", "status": "delivered", "statusDescription": "DELIVERED", "service": null, "deliveredAt": "2026-02-04T20:54:10Z", "deliveredAtLocal": "2026-02-04T15:54:10", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-04T20:54:10Z", "localTime": "2026-02-04T15:54:10", "status": "delivered", "description": "DELIVERED", "location": "Toronto, ON", "code": "40" }, { "timestamp": "2026-02-04T02:25:19Z", "localTime": "2026-02-03T21:25:19", "status": "out_for_delivery", "description": "OUT FOR DELIVERY", "location": "Toronto", "code": "31" }, { "timestamp": "2026-01-29T16:52:52Z", "localTime": "2026-01-29T16:52:52", "status": "label_created", "description": "Waybill Generated for EXAMPLE-ORDER", "location": null, "code": "10" } ] } ``` ## Notes - **Request**: a small XML POST; the answer is XML. Phone numbers and the delivery postal code in the answer are not passed on. - **Time zone**: each scan carries its own offset (`GMT-05:00`), so `timestamp` is exact. - **Status**: point codes `10` waybill generated, `20`/`21`/`22`/`30` in transit, `31` out for delivery, `40` delivered. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # EMS Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ems Query live **EMS (China EMS)** (`ems`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ems` | | **Brand aliases** | China EMS, EMS, UPU EMS, China Post EMS | | **Category** | International EMS express mail | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^E[A-Z]\d{9}CN$/` | UPU S10 (mod 11) | `EB865157741CN` | | **Pass 2 (`mayMatch`)** | none | none | none | EMS numbers from other posts (for example `EM…JP`) belong to those posts' adapters; pass `?carrier=ems` to send any EMS number to the UPU tracker. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EB865157741CN?carrier=ems" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ems", "trackingNumber": "EB865157741CN", "status": "in_transit", "statusDescription": "Departed from export office", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-09-13T01:37:00", "status": "in_transit", "description": "Departed from export office", "location": "Guangzhou Baiyun International Apt", "code": null }, { "timestamp": null, "localTime": "2026-09-12T10:48:00", "status": "in_transit", "description": "Posted", "location": "516008", "code": null } ] } ``` ## Notes - **Time zone**: the tracker prints each scan in the local time of the office that made it, with no zone. `localTime` is that clock time and `timestamp` is `null`. - **Location**: an office name or code as the EMS system prints it (often a postal code or an office abbreviation). - **Scope**: this is the UPU EMS cooperative tracker, not the China Post parcel tracker. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # EMS Vietnam Tracking API & MCP URL: https://docs.lastscanned.com/carriers/emsvietnam Query live **EMS Vietnam** (`emsvietnam`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `emsvietnam` | | **Brand aliases** | EMS Vietnam, Vietnam EMS, VNPost EMS, ems.com.vn | | **Category** | Vietnam Post EMS express mail | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EN059122171VN,EN059122171VN` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^E[A-Z]\d{9}VN$/` + UPU S10 check digit | UPU S10 | `EN059122171VN` | | **Pass 2 (`mayMatch`)** | none | none | none | These shapes belong to EMS Vietnam alone, so `?carrier=emsvietnam` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EN059122171VN?carrier=emsvietnam" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "emsvietnam", "trackingNumber": "EN059122171VN", "status": "delivered", "statusDescription": "Phát thành công (Delivered)", "service": null, "deliveredAt": "2026-01-03T09:49:50Z", "deliveredAtLocal": "2026-01-03T16:49:50", "signedBy": null, "destination": { "city": "Đà Nẵng", "state": null, "country": "VN" }, "events": [ { "timestamp": "2026-01-03T09:49:50Z", "localTime": "2026-01-03T16:49:50", "status": "delivered", "description": "Phát thành công (Delivered)", "location": "BCVH Example - Đà Nẵng", "code": "EMI" }, { "timestamp": "2026-01-03T09:47:05Z", "localTime": "2026-01-03T16:47:05", "status": "out_for_delivery", "description": "Đã giao bưu tá phát - Item out for physical delivery", "location": "BCVH Example - Đà Nẵng", "code": "EDG" }, { "timestamp": "2025-12-24T14:40:00Z", "localTime": "2025-12-24T21:40:00", "status": "in_transit", "description": "Chấp nhận gửi (Posting / Collection)", "location": "EMS Example - Hồ Chí Minh", "code": "EMA" } ] } ``` ## Notes - **Request**: the carrier's API wants the number with `EMS` appended; the adapter adds it. - **Time zone**: Vietnam time (UTC+7, no DST); `timestamp` is converted from it. - **Wording**: each scan reads "CODE - Vietnamese (English) (office code: office name)"; the event code goes to `code`, the wording to `description` and the office to `location`. The helpline, address and receiver's name are dropped. - **Status**: delivery (`EMI`), out for delivery (`EDG`), unsuccessful delivery and return wording map to statuses; cash-collection steps after a delivery stay `delivered`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Envia Colombia Tracking API & MCP URL: https://docs.lastscanned.com/carriers/enviacolombia Query live **Envia Colombia** (`enviacolombia`) package status and scan history in a single synchronous `GET` request or MCP tool call. Source: envia.co `EnviaV2_Api` tracking history and summary (the JSON the Envia tracking page calls). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `enviacolombia` | | **Brand aliases** | Envia, Envía, envia.co, Envia Colombia | | **Category** | Colombian parcels (Paquete Express) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | The shape (12 digits (guia)) is shared with other carriers, so it is not auto-detected: pass `?carrier=enviacolombia`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/034038751459?carrier=enviacolombia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "enviacolombia", "trackingNumber": "034038751459", "status": "delivered", "statusDescription": "Entregado: El envío fue entregado satisfactoriamente.", "service": "PAQUETE EXPRESS", "deliveredAt": "2026-03-12T21:21:00Z", "deliveredAtLocal": "2026-03-12T16:21:00", "signedBy": null, "destination": { "city": "Turbaco", "state": "Bolivar", "country": "CO" }, "message": null, "events": [ { "timestamp": "2026-03-12T21:21:00Z", "localTime": "2026-03-12T16:21:00", "status": "delivered", "description": "Entregado: El envío fue entregado satisfactoriamente.", "location": "TURBACO-BOLIVAR", "code": null }, { "timestamp": "2026-03-08T05:00:00Z", "localTime": "2026-03-08T00:00:00", "status": "label_created", "description": "Tu guía fue generada: Pronto recogeremos tu envío", "location": "MEDELLIN", "code": null } ] } ``` ## Notes - **Zone**: Envia prints Colombian local time without an offset; it is converted from `America/Bogota`. - **Not found**: a number the carrier does not know returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Envialia (Ontime) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/envialia Query live **Envialia (Ontime)** (`envialia`) package status and scan history in a single synchronous `GET` request or MCP tool call. Source: the Envialia mobile app's guest SOAP search (app.ontime.es, buscarEstadoEnvio2). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `envialia` | | **Brand aliases** | Envialia, Ontime, Ontime Logistica, Envialia Ontime | | **Category** | Spanish and Portuguese parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | The shape (16 digits (6-digit agency + 10-digit consignment)) is shared with other carriers, so it is not auto-detected: pass `?carrier=envialia`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/0046950177687999?carrier=envialia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "envialia", "trackingNumber": "0046950177687999", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-07-08", "signedBy": null, "destination": { "city": "Sevilla", "state": null, "country": "ES" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-07-08", "status": "delivered", "description": "Entregado", "location": "HISPALIS", "code": null }, { "timestamp": null, "localTime": "2026-07-06", "status": "in_transit", "description": "Envío expedido", "location": null, "code": null } ] } ``` ## Notes - **Summary only**: Envialia's guest search returns the current status and two dates (dispatch, delivery), not a scan list, so `events` holds those milestones. They have a date but no time of day, so `timestamp` is `null`. - **Not found**: a number the carrier does not know returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ePost Global Tracking API & MCP URL: https://docs.lastscanned.com/carriers/epostglobal Query live **ePost Global** (`epostglobal`) package status, scan history, and the **destination carrier's tracking number** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `EPG…` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `epostglobal` | | **Brand aliases** | ePost Global, EPG, ePostGlobal, epgtrack | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EPG011113700050012,EPG011113700050012` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^EPG\d{15}$/` | none | `EPG011113700050012` | | **Pass 2 (`mayMatch`)** | none | none | none | `EPG` numbers belong to ePost Global alone, so `?carrier=epostglobal` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EPG011113700050012?carrier=epostglobal" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "epostglobal", "trackingNumber": "EPG011113700050012", "status": "delivered", "statusDescription": "The parcel has been delivered.", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-07T09:49:23", "signedBy": null, "destination": null, "message": "Handed to GLSEU as EPG011113700050012", "events": [ { "timestamp": null, "localTime": "2026-10-07T09:49:23", "status": "delivered", "description": "The parcel has been delivered.", "location": "Vienna AT 100", "code": "99" }, { "timestamp": null, "localTime": "2026-09-30T04:07:13", "status": "in_transit", "description": "In transit to GLSEU tracking #: EPG011113700050012", "location": null, "code": "41" }, { "timestamp": null, "localTime": "2026-09-26T09:42:01", "status": "label_created", "description": "Data Received", "location": null, "code": "11" } ] } ``` ## Notes - **Handoff**: `message` names the destination carrier and its number, read from ePost Global's "In transit to `` tracking #" scan (for example `"Handed to GLSEU as EPG011113700050012"`). Pass that number to `GET /v1/track/{number}` for the partner's own scans. Some parcels have no such scan, and then `message` is `null`. - **Time zone**: the scans carry no zone, so `timestamp` is `null` and `localTime` is the printed time. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Equick China Tracking API & MCP URL: https://docs.lastscanned.com/carriers/equick Query live **Equick China** (`equick`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects numbers shaped `EQK` + 2 letters + 10 digits + 2 letters. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `equick` | | **Brand & service aliases** | Equick, Equick China, EQuick, NetEase Suda (网易速达), equick.cn | | **Category** | Chinese cross-border e-commerce forwarder | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Examples | |---|---|---| | **Pass 1 (`matches`)** | `/^EQK[A-Z]{2}\d{10}[A-Z]{2}$/` | `EQKPT8613050786YQ` | | **Pass 2 (`mayMatch`)** | *None* | n/a | Numbers that don't fit this shape work with `?carrier=equick`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/EQKPT8613050786YQ?carrier=equick" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "EQKPT8613050786YQ" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "equick", "trackingNumber": "EQKPT8613050786YQ", "status": "in_transit", "statusDescription": "Arrived at destination", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-20T09:12:00", "status": "in_transit", "description": "Arrived at destination", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-10-14T18:30:00", "status": "in_transit", "description": "Departed origin facility", "location": "Shanghai", "code": null } ] } ``` ## Notes - **Source**: the JSON API behind the `equick.cn` tracking page (`api.equick.cn/api/traceQuery`); several numbers go in one request. - **Economy air mail**: Equick says scans stop at departure from China for some services; later scans, if any, are on the partner carrier. - **Times**: scans carry no zone, so only `localTime` is set. - **Unknown numbers**: Equick returns an empty result, returned as a `404 not_found`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # ESHUN (ZES Express) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/eshun Query live **ESHUN / ZES Express** (`eshun`) package status, scan history, and the **last-mile order number** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `ZES…YQ` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `eshun` | | **Brand aliases** | ESHUN, ZES Express, 俄顺物流, 俄顺国际物流 | | **Category** | Cross-border (China to Russia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ZES...,ZES...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^ZES[A-Z]{2}\d{10}YQ$/` | none | `ZESBF2001394381YQ` | | **Pass 2 (`mayMatch`)** | none | none | none | `ZES` numbers belong to ESHUN alone, so `?carrier=eshun` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ZESBF2001394381YQ?carrier=eshun" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "eshun", "trackingNumber": "ZESBF2001394381YQ", "status": "delivered", "statusDescription": "结案", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-14T15:25:10", "signedBy": null, "destination": { "city": null, "state": null, "country": "RU" }, "message": "Handed to the destination carrier as ZESBF2001394381YQ", "events": [ { "timestamp": null, "localTime": "2026-03-14T15:25:10", "status": "delivered", "description": "结案", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-13T03:15:00", "status": "out_for_delivery", "description": "到达待取", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-12T23:11:54", "status": "in_transit", "description": "транзит", "location": null, "code": null } ] } ``` ## Notes - **Handoff**: `message` carries the Russian last-mile order number (the page's "渠道转单号"). The page does not name the delivery company. - **Language**: scan text is Chinese or Russian, as the carrier prints it. - **Source**: ESHUN's tracking runs on a rtb56 server reached by IP address. The lookup asks its JSON web service (one call for a whole batch), falls back to the tracker page (whose slider check the server accepts with a wide error margin), and last to a browser session on that page. - **Statuses**: ESHUN's own codes are mapped: `CC` delivered, `DQ` waiting for pickup, `NT`/`ND`/`NO`/`NC` in transit. `code` holds the scan's event code. - **Time zone**: scans made in China carry `+08:00` and get a `timestamp`; scans in Russia have no zone and keep only `localTime`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Estafeta Tracking API & MCP URL: https://docs.lastscanned.com/carriers/estafeta Query live **Estafeta (Mexico)** (`estafeta`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `estafeta` | | **Brand aliases** | Estafeta, Estafeta Mexico, Estafeta guia | | **Category** | Regional parcels (Mexico) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^\d{12}[A-Z]\d{9}$/` (the 22-character guide) | none | `1172614482` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | Guide (22 characters) | `^\d{12}[A-Z]\d{9}$` | | Tracking code (10 digits) | `^\d{10}$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=estafeta`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1172614482?carrier=estafeta" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "estafeta", "trackingNumber": "1172614482", "status": "delivered", "statusDescription": "Entregado", "service": "Terrestre", "deliveredAt": null, "deliveredAtLocal": "2026-08-30T14:23:00", "signedBy": "MARIA PEREZ", "destination": null, "events": [ { "timestamp": null, "localTime": "2026-08-30T14:23:00", "status": "delivered", "description": "Entregado", "location": "Culiacán", "code": null }, { "timestamp": null, "localTime": "2026-08-30T12:44:00", "status": "out_for_delivery", "description": "En proceso de entrega a domicilio", "location": "Culiacán", "code": null }, { "timestamp": null, "localTime": "2026-08-30T12:41:00", "status": "in_transit", "description": "En tránsito", "location": "Culiacán", "code": null } ] } ``` ## Notes - **Guide or tracking code**: both the 22-character guide and the 10-digit tracking code work. Only the guide shape auto-detects; a bare 10-digit code needs `?carrier=estafeta`. - **Label only**: a guide that exists but has not been handed to Estafeta returns status `label_created` with one undated event. - **Local time only**: Mexico spans several zones and the page prints none, so `timestamp` is `null`. Descriptions are in Spanish. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Estes Express Lines Tracking API & MCP URL: https://docs.lastscanned.com/carriers/estes Query live **Estes Express Lines** (`estes`) package status and scan history in a single synchronous `GET` request or MCP tool call. Source: myestes-api.estes-express.com `/shipmenttracking/history` (the service the MyEstes tracking page calls). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `estes` | | **Brand aliases** | Estes, Estes Express, Estes Express Lines, MyEstes | | **Category** | US and Canada LTL freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | The shape (10-digit PRO number) is shared with other carriers, so it is not auto-detected: pass `?carrier=estes`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/0550000000?carrier=estes" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "estes", "trackingNumber": "0550000000", "status": "in_transit", "statusDescription": "Pickup Location Serviced", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-07-29T18:10:02Z", "localTime": "2026-07-29T13:10:02", "status": "in_transit", "description": "Pickup Location Serviced", "location": null, "code": null } ] } ``` ## Notes - **Times**: each scan has a UTC offset, so `timestamp` and `localTime` are exact. - **Not found**: a number the carrier does not know returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ETSCP Tracking API & MCP URL: https://docs.lastscanned.com/carriers/etscp Query live **ETSCP** (`etscp`) package status and scan history in a single synchronous `GET` request or MCP tool call. ETSCP numbers share their shape with other carriers' numbers, so pass `?carrier=etscp`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `etscp` | | **Brand aliases** | ETSCP, 易通速递 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=etscp` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=etscp` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ETSCP tracking numbers have no shape of their own, so always pass `?carrier=etscp`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to ETSCP in one request. - **Platform**: ETSCP runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # EuroExpress (Bosnia and Herzegovina) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/euroexpressba Query live **EuroExpress (Bosnia and Herzegovina)** (`euroexpressba`) package status and scan history in a single synchronous `GET` request or MCP tool call. Source: app-api.euroexpress.ba `/package-metadata/track` (the JSON behind its tracking page). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `euroexpressba` | | **Brand aliases** | EuroExpress, Euro Express BA, Euroexpress Bosnia, euroexpress.ba | | **Category** | Bosnia and Herzegovina parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | The shape (9 digits) is shared with other carriers, so it is not auto-detected: pass `?carrier=euroexpressba`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/104000000?carrier=euroexpressba" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "euroexpressba", "trackingNumber": "104000000", "status": "delivered", "statusDescription": "DOSTAVA", "service": null, "deliveredAt": "2026-01-15T11:39:50Z", "deliveredAtLocal": "2026-01-15T12:39:50", "signedBy": null, "destination": { "city": "Sarajevo", "state": null, "country": "BA" }, "message": null, "events": [ { "timestamp": "2026-01-15T11:39:50Z", "localTime": "2026-01-15T12:39:50", "status": "delivered", "description": "DOSTAVA", "location": "TC-Sarajevo 2", "code": null }, { "timestamp": "2026-01-14T14:12:58Z", "localTime": "2026-01-14T15:12:58", "status": "in_transit", "description": "Preuzimanje pošiljke", "location": "TC-Bihać", "code": null } ] } ``` ## Notes - **Summary fallback**: when a delivered parcel has no scans, a single event is built from the status line and receipt date. - **Not found**: a number the carrier does not know returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Evdemo Lojistik Tracking API & MCP URL: https://docs.lastscanned.com/carriers/evdemo Query live **Evdemo Lojistik** (`evdemo`) package status and scan history in a single synchronous `GET` request or MCP tool call. Source: evdemolojistik.com `/takip` (server-rendered tracking page, HTML). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `evdemo` | | **Brand aliases** | Evdemo, Evdemo Lojistik, evdemolojistik.com | | **Category** | Turkish parcels and furniture delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | The shape (12 digits) is shared with other carriers, so it is not auto-detected: pass `?carrier=evdemo`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/112120122845?carrier=evdemo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "evdemo", "trackingNumber": "112120122845", "status": "delivered", "statusDescription": "Kargonuzu Teslim Ettik", "service": null, "deliveredAt": "2026-02-10T13:27:00Z", "deliveredAtLocal": "2026-02-10T16:27:00", "signedBy": null, "destination": { "city": "İstanbul", "state": null, "country": "TR" }, "message": null, "events": [ { "timestamp": "2026-02-10T13:27:00Z", "localTime": "2026-02-10T16:27:00", "status": "delivered", "description": "Kargonuzu Teslim Ettik", "location": null, "code": null }, { "timestamp": "2026-02-02T07:30:00Z", "localTime": "2026-02-02T10:30:00", "status": "label_created", "description": "Gönderi Talebiniz Oluşturuldu", "location": null, "code": null } ] } ``` ## Notes - **Zone**: scan times are Turkish local time, converted from `Europe/Istanbul`. - **Not found**: a number the carrier does not know returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Evergreen Container Tracking API & MCP URL: https://docs.lastscanned.com/carriers/evergreen Query live **Evergreen** (`evergreen`) shipping container moves in a single synchronous `GET` request or MCP tool call. Pass the container number; no booking, bill of lading or Evergreen account is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `evergreen` | | **Brand aliases** | Evergreen, Evergreen Line, Evergreen Marine, ShipmentLink, ct.shipmentlink.com | | **Category** | Ocean container shipping line | | **Single-container REST endpoint** | `GET https://api.lastscanned.com/v1/track/{containerNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EGHU9123457,EGSU9123450` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Container Number Format & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(EGHU\|EGSU\|EISU\|EITU)\d{7}$/` | ISO 6346 | `EGHU9123457` · `EGSU9123450` · `EITU1815911` | | **Pass 2 (`mayMatch`)** | none | none | none | A container number is the owner's 4-letter code, 6 digits and an ISO 6346 check digit. Evergreen's own owner codes detect to `evergreen` automatically. A leased container (Textainer `TGHU`, Triton `TCNU`, CAI `CAIU`, SeaCo `SEGU` and others) can sail with any line, so pass `?carrier=evergreen` for one booked with Evergreen. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EGHU9123457" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` The response below is a real lookup from November 2026, with its events cut to the newest four of 8. ```json { "carrier": "evergreen", "trackingNumber": "EGHU9123457", "status": "delivered", "statusDescription": "Empty container returned", "service": "40' (SH)", "deliveredAt": null, "deliveredAtLocal": "2026-09-17", "signedBy": null, "destination": null, "message": "Bill of lading 143600354343", "events": [ { "timestamp": null, "localTime": "2026-09-17", "status": "delivered", "description": "Empty container returned", "location": "Felixstowe, Suffolk, GB", "code": "Empty container returned" }, { "timestamp": null, "localTime": "2026-09-15", "status": "out_for_delivery", "description": "Pick-up by merchant haulage", "location": "Felixstowe, Suffolk, GB", "code": "Pick-up by merchant haulage" }, { "timestamp": null, "localTime": "2026-09-13", "status": "in_transit", "description": "Discharged (FCL), EVER ALP 1409-017W", "location": "Felixstowe, Suffolk, GB", "code": "Discharged (FCL)" }, { "timestamp": null, "localTime": "2026-07-22", "status": "in_transit", "description": "Transship container loaded on vessel, EVER ALP 1409-017W", "location": "Ningbo, China, CN", "code": "Transship container loaded on vessel" } ] } ``` ## Notes - **Source**: Evergreen's ShipmentLink cargo tracking. The container search gives the latest move and the bill of lading; the bill gives the container's full history, so a lookup is three requests. - **Events**: every move from empty pick-up to empty return, with the vessel and voyage. If the history can't be read, the latest move is returned on its own. - **Times**: dates without a time of day, so `localTime` is a date and `timestamp` is null. - **Bill of lading**: `message` names the bill the container sails under. - **No current trip**: a container Evergreen knows but that isn't on a bill of lading now is `not_found`. ## Related Resources - **All container lines**: [Ocean container tracking](https://docs.lastscanned.com/container-tracking-api) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Evri (UK) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/evri Query live **Evri** (`evri`, formerly Hermes UK) package status and scan history in a single synchronous `GET` request or MCP tool call. Evri's 16-character parcel barcodes are not unique to Evri, so pass `?carrier=evri` when you know the carrier. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `evri` | | **Brand aliases** | Evri, Hermes UK, Hermes | | **Category** | UK domestic parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=evri` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=H0742A0312973872,H0742A0312973872&carrier=evri` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | `/^H[0-9A-Z]{15}$/` containing at least one digit (16 characters) | — | `H0742A0312973872` | Other 16-character Evri barcodes that do not start with `H` need `?carrier=evri`. The shorter receipt references the Evri site also accepts are not supported. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/H0742A0312973872?carrier=evri" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "evri", "trackingNumber": "H0742A0312973872", "status": "out_for_delivery", "statusDescription": "Your parcel is with your local courier and will be delivered today", "deliveredAt": null, "events": [ { "timestamp": "2026-10-26T07:41:00Z", "localTime": "2026-10-26T08:41:00", "status": "out_for_delivery", "description": "Your parcel is with your local courier and will be delivered today", "location": null, "code": "4_COURIER" }, { "timestamp": "2026-10-25T18:10:00Z", "localTime": "2026-10-25T19:10:00", "status": "in_transit", "description": "Your parcel has arrived at our local depot", "location": null, "code": "3" } ] } ``` ## Status Notes - **Stage codes**: Evri's own stage codes drive `status`: `0`/`1` label created, `2`/`3` in transit, `4_COURIER` out for delivery, `5_COURIER`/`5_SHOP` delivered, `4_SHOP`/`4_LOCKER` (ready for collection) and `6_ACTION` (needs action) exception, `A` returned. - **Times**: Scans are UK local time (`Europe/London`) and are also given as UTC `timestamp`. - **Locations**: Evri's public tracking gives no place names, so `location` is `null`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Evropat Tracking API & MCP URL: https://docs.lastscanned.com/carriers/evropat Query live **Evropat** (`evropat`) package status and scan history in a single synchronous `GET` request or MCP tool call. Source: evropat.bg `/wp-json/evropat/v1/track` (POST, the JSON its tracking page posts to). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `evropat` | | **Brand aliases** | Evropat, Европат, evropat.bg | | **Category** | Bulgarian parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | The shape (8 to 14 digits (waybill)) is shared with other carriers, so it is not auto-detected: pass `?carrier=evropat`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/9103059081?carrier=evropat" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "evropat", "trackingNumber": "9103059081", "status": "delivered", "statusDescription": "Разнесена", "service": null, "deliveredAt": "2026-02-10T09:54:33Z", "deliveredAtLocal": "2026-02-10T11:54:33", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-02-10T09:54:33Z", "localTime": "2026-02-10T11:54:33", "status": "delivered", "description": "Разнесена", "location": null, "code": null }, { "timestamp": "2026-02-09T10:59:23Z", "localTime": "2026-02-09T12:59:23", "status": "label_created", "description": "Създадена", "location": null, "code": null } ] } ``` ## Notes - **Zone**: times are Bulgarian local time, converted from `Europe/Sofia`. - **Not found**: a number the carrier does not know returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # EWE Group (eMetro) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ewe Query live **EWE Group (eMetro)** (`ewe`) package status and scan history in a single synchronous `GET` request or MCP tool call. Source: www.epintl.com.au `/oms/api/tracking/emetro/` (the JSON ewe.com.au's tracking page calls). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ewe` | | **Brand aliases** | EWE, EWE Group, EWE Australia, eMetro, EP International | | **Category** | Australian parcels (EMC consignments, Amazon AMZ deliveries) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `^EMC\d{11}$` or `^AMZ\d{10}$` | none | `AMZ0001085019` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to EWE alone, so `?carrier=ewe` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/AMZ0001085019?carrier=ewe" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ewe", "trackingNumber": "AMZ0001085019", "status": "delivered", "statusDescription": "Fully Complete", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-13T01:01:00", "signedBy": null, "destination": { "city": "MELROSE PARK", "state": "NSW", "country": "AU" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-03-13T01:01:00", "status": "delivered", "description": "Fully Complete", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-08T12:02:00", "status": "in_transit", "description": "Package processed at warehouse", "location": "Sydney NSW Australia", "code": null } ] } ``` ## Notes - **Times**: EWE prints Australian local time without a zone or offset (the state differs per parcel), so only `localTime` is set and `timestamp` is `null`. - **Not found**: a number the carrier does not know returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Exelot Tracking API & MCP URL: https://docs.lastscanned.com/carriers/exelot Query live **Exelot** (`exelot`) package status and scan history in a single synchronous `GET` request or MCP tool call. Source: apiv2p.exelot.com `/api/v2/parcels/tracking/details/` (the API go.exelot.com's tracking page calls). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `exelot` | | **Brand aliases** | Exelot, XLT, Exelot Israel | | **Category** | Cross-border e-commerce parcels to Israel (from GB, US) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `^XLT\d{9}$` | none | `XLT995382680` | | **Pass 2 (`mayMatch`)** | none | none | none | Exelot's numbers are `matches`-claimed, so `?carrier=exelot` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/XLT995382680?carrier=exelot" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "exelot", "trackingNumber": "XLT995382680", "status": "delivered", "statusDescription": "Delivered", "service": "homeDelivery", "deliveredAt": "2026-09-14T09:30:34Z", "deliveredAtLocal": "2026-09-14T09:30:34", "signedBy": null, "destination": { "city": null, "state": null, "country": "IL" }, "message": null, "events": [ { "timestamp": "2026-09-14T09:30:34Z", "localTime": "2026-09-14T09:30:34", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": "2026-08-26T10:18:12Z", "localTime": "2026-08-26T10:18:12", "status": "label_created", "description": "Package details received", "location": "GB", "code": null } ] } ``` ## Notes - **Times**: Exelot sends ISO UTC times, so `timestamp` and `localTime` are the same instant. - **Not found**: a number the carrier does not know returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Exline (Kazakhstan) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/exline Query live **Exline (Kazakhstan)** (`exline`) package status and scan history in a single synchronous `GET` request or MCP tool call. Source: apiv1.exline.kz `/api/v1/track/detail` (POST, the API its tracking page calls). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `exline` | | **Brand aliases** | Exline, Exline KZ, Экслайн, exline.kz | | **Category** | Kazakhstan parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | The shape (10 digits) is shared with other carriers, so it is not auto-detected: pass `?carrier=exline`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/6585909118?carrier=exline" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "exline", "trackingNumber": "6585909118", "status": "delivered", "statusDescription": "Доставлен", "service": null, "deliveredAt": "2026-06-22T05:20:00Z", "deliveredAtLocal": "2026-06-22T10:20:00", "signedBy": null, "destination": { "city": "Алматы город", "state": null, "country": "KZ" }, "message": null, "events": [ { "timestamp": "2026-06-22T05:20:00Z", "localTime": "2026-06-22T10:20:00", "status": "delivered", "description": "Доставлен", "location": "Офис в Алматы, Алматы город", "code": null }, { "timestamp": "2026-06-17T09:56:54Z", "localTime": "2026-06-17T14:56:54", "status": "label_created", "description": "Новый", "location": "Офис в Алматы, Алматы город", "code": null } ] } ``` ## Notes - **Zone**: times are converted from `Asia/Almaty`. - **Not found**: a number the carrier does not know returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Exmate Tracking API & MCP URL: https://docs.lastscanned.com/carriers/exmate Query live **Exmate** (`exmate`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `exmate` | | **Brand aliases** | Exmate, EXMATE POD, pod.exmate.net | | **Category** | Cross-border parcels (Korea to Japan) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EXK05127188J,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^EXK\d{8}J$/` | none | `EXK05127188J` | | **Pass 2 (`mayMatch`)** | none | none | none | `exmate` numbers are claimed by this carrier alone, so `?carrier=exmate` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EXK05127188J?carrier=exmate" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "exmate", "trackingNumber": "EXK05127188J", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-01-16T01:45:00Z", "deliveredAtLocal": "2026-01-16T10:45:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "JP" }, "message": "Handed to SAGAWA as EXK05127188J", "events": [ { "timestamp": "2026-01-16T01:45:00Z", "localTime": "2026-01-16T10:45:00", "status": "delivered", "description": "Delivered", "location": "Japan", "code": "배송완료" }, { "timestamp": "2026-01-11T06:27:00Z", "localTime": "2026-01-11T15:27:00", "status": "in_transit", "description": "Customs Cleared", "location": "Japan", "code": "통관완료" }, { "timestamp": "2026-01-08T22:56:00Z", "localTime": "2026-01-09T07:56:00", "status": "label_created", "description": "Registered", "location": "Korea", "code": "등록" } ] } ``` ## Notes - **Handoff**: the page names the Japanese delivery carrier and its number (for example `"Handed to SAGAWA as EXK05127188J"`). Pass that number to `GET /v1/track/{number}` for the partner's own scans, once the parcel has cleared customs. - **Time zone**: Korea and Japan are both UTC+9, so scan times are converted from `Asia/Seoul`. - `code` is the Korean status label the page prints next to the English one. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Express One Tracking API & MCP URL: https://docs.lastscanned.com/carriers/expressone Query live **Express One** (`expressone`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=expressone` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `expressone` | | **Brand aliases** | Express One, Express One Hungary, ExpressOne, EXOHU | | **Category** | Hungarian parcels (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=158278800067834653601119,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is shared with other carriers, so there is no auto-detection: pass `?carrier=expressone`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/158278800067834653601119?carrier=expressone" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "expressone", "trackingNumber": "158278800067834653601119", "status": "delivered", "statusDescription": "Successful delivery", "service": null, "deliveredAt": "2026-03-12T12:35:00Z", "deliveredAtLocal": "2026-03-12T13:35:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "HU" }, "message": null, "events": [ { "timestamp": "2026-03-12T12:35:00Z", "localTime": "2026-03-12T13:35:00", "status": "delivered", "description": "Successful delivery", "location": null, "code": "D00" }, { "timestamp": "2026-03-11T13:58:06Z", "localTime": "2026-03-11T14:58:06", "status": "in_transit", "description": "Arrived at depot", "location": "Törökbálint, HU", "code": "DEP" }, { "timestamp": "2026-03-07T00:23:00Z", "localTime": "2026-03-07T01:23:00", "status": "label_created", "description": "Shipping details received, shipment not yet handed over to EXOHU", "location": null, "code": "PRE" } ] } ``` ## Notes - Numbers are 13 or 24 digits, a shape other carriers share, so pass `?carrier=expressone`. - **Time zone**: scan times are Hungarian local time (Europe/Budapest); the depot country in the scan text selects the zone for parcels that cross the border. - `code` is Express One's event code (`PRE`, `INB`, `DEP`, `D00`, ...). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # FAN Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fancourier Query live **FAN Courier** (`fancourier`) AWBs in a single synchronous `GET` request or MCP tool call. `lastscanned` reads the endpoint behind the AWB tracking page on fancourier.ro and returns the scan history. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fancourier` | | **Category** | Romanian domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=fancourier` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2345678901234,...&carrier=fancourier` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP · Free tier (5 unique numbers/day) · Pro ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection FAN Courier AWB numbers have no check digit and share shapes with other carriers, so they are not auto-detected. Pass `?carrier=fancourier`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/4049400010188?carrier=fancourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "fancourier", "trackingNumber": "4049400010188", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-23T10:41:00.000Z", "deliveredAtLocal": "2026-10-23T13:41:00", "signedBy": "I*** P*****", "destination": null, "events": [ { "timestamp": "2026-10-23T10:41:00.000Z", "localTime": "2026-10-23T13:41:00", "status": "delivered", "description": "Delivered", "location": null, "code": "S2" }, { "timestamp": "2026-10-23T05:02:00.000Z", "localTime": "2026-10-23T08:02:00", "status": "out_for_delivery", "description": "Out for delivery", "location": null, "code": "C1" } ] } ``` ## Notes - Event codes are FAN Courier's own: `S2` delivered, `S43` returned, `C1`/`S1` out for delivery, `C0` waiting for pickup, `S56` handed to a locker, `H*` in transit. - Times are Romanian local time and carry a UTC timestamp. - FAN Courier returns no location on scans. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Fargo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fargouz Query live **Fargo** (`fargouz`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fargouz` | | **Brand aliases** | Fargo, Fargo Uzbekistan, fargo.uz, Tezbor | | **Category** | Uzbek parcels and last-mile (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=TEZ886137,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^TEZ\d{6,10}$/` | none | `TEZ886137` | | **Pass 2 (`mayMatch`)** | none | none | none | `fargouz` numbers are claimed by this carrier alone, so `?carrier=fargouz` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/TEZ886137?carrier=fargouz" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "fargouz", "trackingNumber": "TEZ886137", "status": "delivered", "statusDescription": "Order completed", "service": null, "deliveredAt": "2026-02-02T10:18:21Z", "deliveredAtLocal": "2026-02-02T15:18:21", "signedBy": null, "destination": { "city": null, "state": null, "country": "UZ" }, "message": null, "events": [ { "timestamp": "2026-02-02T10:18:21Z", "localTime": "2026-02-02T15:18:21", "status": "delivered", "description": "Order completed", "location": null, "code": "completed" }, { "timestamp": "2026-02-02T09:16:08Z", "localTime": "2026-02-02T14:16:08", "status": "exception", "description": "Recipient does not respond", "location": null, "code": "recipient_mobile_no_response" }, { "timestamp": "2026-02-01T17:13:08Z", "localTime": "2026-02-01T22:13:08", "status": "label_created", "description": "Order is waiting to be assigned to a courier", "location": null, "code": "unassigned" } ] } ``` ## Notes - **Time zone**: the API sends UTC; Uzbekistan is UTC+5 all year, so `localTime` is the UTC time plus five hours. - `code` is Fargo's status code (`created`, `in_sorting_facility`, `dispatched`, `first_delivery_attempt`, `completed`, ...). Courier details in the response are not passed on. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Fastfrate Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fastfrate Query live **Fastfrate** (`fastfrate`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=fastfrate` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fastfrate` | | **Brand aliases** | Fastfrate, Fastfrate Group, Fastfrate probill | | **Category** | Canadian LTL freight (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1064652491,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is shared with other carriers, so there is no auto-detection: pass `?carrier=fastfrate`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1064652491?carrier=fastfrate" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "fastfrate", "trackingNumber": "1064652491", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-12T14:00:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-02-12T14:00:00", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-12T11:40:00", "status": "out_for_delivery", "description": "Loaded to Delivery Unit", "location": "Edmonton, AB", "code": null }, { "timestamp": null, "localTime": "2026-02-08T17:58:00", "status": "in_transit", "description": "Picked Up", "location": "Markham, ON", "code": null } ] } ``` ## Notes - Probill numbers are plain digits, a shape other LTL carriers share, so pass `?carrier=fastfrate`. - **Time zone**: Fastfrate sends local times with no zone, so only `localTime` is set and `timestamp` and `deliveredAt` are `null`. - Scans such as "Arrived at Consignee" follow "Delivered"; the parcel stays `delivered`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # FedEx Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fedex Query live **FedEx** (`fedex`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 12-, 15-, 20-, and 22-digit (`96…`) FedEx tracking numbers and returns a normalized `TrackingResult` JSON payload—without requiring a FedEx Developer Portal project, OAuth client secret, or webhook setup. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fedex` | | **Brand & service aliases** | Federal Express, FedEx Ground, FedEx Home Delivery, FedEx Express, FedEx Priority Overnight, FedEx Standard Overnight, FedEx 2Day, FedEx Ground Economy (SmartPost), FedEx International Priority | | **Category** | National & international parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for FedEx instead of direct requests - **Avoid Akamai Bot Manager `403` blocks on `api.fedex.com`**: Direct `POST` calls to `api.fedex.com/track/v2/shipments` from Cloudflare Workers, Vercel, or AWS Lambda fail with Akamai `403 Forbidden` responses unless accompanied by active sensor cookies. Calling `GET https://api.lastscanned.com/v1/track/541270563758?carrier=fedex` from your serverless backend works in a single `fetch()`. - **Zero FedEx Developer Portal OAuth setup**: Official FedEx Track API access requires creating an organization project, passing production key validation, and managing OAuth 2.0 bearer token rotation. `lastscanned` needs no FedEx credentials. - **Synchronous GET—no tracker registration**: Query any FedEx tracking number on demand with `GET /v1/track/541270563758?carrier=fedex` instead of registering trackers via `POST` and waiting for webhook callbacks. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) FedEx is evaluated **fourth (#4)** in `lastscanned`'s two-pass detector (immediately after [DHL](https://docs.lastscanned.com/carriers/dhl)): | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — 12-digit** | `/^\d{12}$/` (12 digits, Express / Ground) | — | `789456123012`, `281049382716` | | **Pass 1 (`matches`) — 15-digit** | `/^\d{15}$/` (15 digits, FedEx Ground) | — | `041283910482716` | | **Pass 1 (`matches`) — 20-digit** | `/^\d{20}$/` (20 digits, excluding `0034043…`) | — | `61299998827162534120` | | **Pass 1 (`matches`) — 22-digit `96…`** | `/^96\d{20}$/` (22 digits starting with `96`, Ground 96 / SmartPost) | — | `541270563758` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### Collision rules & when to pass `?carrier=fedex` - **20-digit numbers (DHL Paket SSCC vs FedEx)**: Because `dhl` runs at precedence #3 before `fedex` (#4), 20-digit numbers starting with `0034043` (DHL's GS1 prefix) route to `dhl`. All other 20-digit numbers automatically route to `fedex`. - **22-digit numbers (USPS vs FedEx)**: 22-digit numbers starting with `92`, `93`, `94`, or `95` route to `usps`, while 22-digit numbers starting with `96` route to `fedex`. If a FedEx Ground Economy (SmartPost) parcel uses a `926129…` barcode and you specifically want FedEx's view instead of USPS's, pass `?carrier=fedex`. - **Door Tag numbers (`DT` + 12 digits)**: If you are tracking a FedEx Door Tag (`541270563758`) or custom shipper reference, pass `?carrier=fedex`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/541270563758?carrier=fedex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/541270563758?carrier=fedex", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.service, pkg.estimatedDeliveryAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "789456123012" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "fedex", "trackingNumber": "541270563758", "status": "delivered", "statusDescription": "Delivered", "service": "FedEx Home Delivery", "deliveredAt": "2026-10-25T18:34:00Z", "deliveredAtLocal": "2026-10-25T14:34:00", "signedBy": "Signature not required", "destination": { "city": "COLUMBUS", "state": "OH", "country": "US" }, "estimatedDelivery": null, "estimatedDeliveryAt": null, "events": [ { "timestamp": "2026-10-25T18:34:00Z", "localTime": "2026-10-25T14:34:00", "status": "delivered", "description": "Delivered - Left at front door. Package delivered to recipient address", "location": "COLUMBUS, OH", "code": "DL" }, { "timestamp": "2026-10-25T11:48:00Z", "localTime": "2026-10-25T07:48:00", "status": "out_for_delivery", "description": "On FedEx vehicle for delivery", "location": "GROVE CITY, OH", "code": "OD" }, { "timestamp": "2026-10-25T08:15:00Z", "localTime": "2026-10-25T04:15:00", "status": "in_transit", "description": "At local FedEx facility", "location": "GROVE CITY, OH", "code": "AR" }, { "timestamp": "2026-10-23T19:02:00Z", "localTime": "2026-10-23T14:02:00", "status": "label_created", "description": "Shipment information sent to FedEx", "location": null, "code": "OC" } ] } ``` > **Raw status & scan codes**: `statusDescription` preserves FedEx's `keyStatus` (e.g. `"Delivered"`, `"On the way"`), while each scan in `events[]` combines `status` and `scanDetails` into `description` and exposes FedEx's 2-letter `statusCD` in `code` (`"OC"`, `"PU"`, `"IT"`, `"AR"`, `"DP"`, `"OD"`, `"DL"`, `"DE"`, `"RS"`). ## Carrier-Specific Status & Integration Notes - **Exact UTC + local timestamps & ETAs**: FedEx reports each scan's local date, time, and explicit GMT offset (`gmtOffset`, e.g. `"-04:00"`). `lastscanned` computes exact UTC ISO 8601 timestamps in `timestamp` and `deliveredAt`, keeps the local clock in `localTime` and `deliveredAtLocal`, and provides both `estimatedDelivery` (local) and `estimatedDeliveryAt` (UTC) whenever FedEx includes an offset on its delivery estimate. - **FedEx status code mapping**: FedEx `statusCD` values map directly to normalized statuses: `OC` → `label_created`; `PU`, `IT`, `AR`, `DP`, `AF`, `OF`, `FD`, `CC`, `HL` → `in_transit`; `OD` → `out_for_delivery`; `DL` → `delivered`; `DE`, `SE`, `CA` → `exception`; `RS` → `returned`. ## Related Resources - **Live browser lookup tool**: [Track a FedEx package live on lastscanned.com/lookup/fedex](https://lastscanned.com/lookup/fedex) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # FedEx Freight Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fedexfreight Query live **FedEx Freight** (`fedexfreight`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=fedexfreight` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fedexfreight` | | **Brand aliases** | FedEx Freight, FXF, FedEx Freight PRO, FedEx LTL | | **Category** | US LTL freight (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=0585862594,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is shared with other carriers, so there is no auto-detection: pass `?carrier=fedexfreight`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/0585862594?carrier=fedexfreight" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "fedexfreight", "trackingNumber": "0585862594", "status": "delivered", "statusDescription": "Delivered", "service": "FedEx Freight Economy", "deliveredAt": null, "deliveredAtLocal": "2026-03-10T15:21:55", "signedBy": null, "destination": { "city": "SPOKANE", "state": "WA", "country": "US" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-03-10T15:21:55", "status": "delivered", "description": "Delivered", "location": "SPOKANE, WA", "code": "DL" }, { "timestamp": null, "localTime": "2026-03-10T08:52:10", "status": "in_transit", "description": "At local facility", "location": "SPOKANE, WA", "code": "AF" }, { "timestamp": null, "localTime": "2026-03-06T09:19:37", "status": "exception", "description": "Shipment exception: Weather – Delay in transit", "location": "PORTLAND, OR", "code": "SE" } ] } ``` ## Notes - PRO numbers are 10 digits, a shape other LTL carriers share, so pass `?carrier=fedexfreight`. This is FedEx Freight (LTL), not FedEx Express/Ground, which `fedex` covers. - **Time zone**: each scan carries a UTC offset, but it reads `-05:00` for every scan whatever the state, so it is not trusted: only `localTime` is set and `timestamp` and `deliveredAt` are `null`. - `code` is the FedEx Freight scan code (`PU`, `DP`, `IT`, `AF`, `SE`, `OD`, `AR`, `DL`). The signer's name is not returned. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # FedEx Poland Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fedexpl Query live **FedEx Poland** (`fedexpl`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=fedexpl` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fedexpl` | | **Brand aliases** | FedEx Poland, FedEx Polska, TNT Poland, poland.fedex.com | | **Category** | Polish domestic parcels (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=6232288239023,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is shared with other carriers, so there is no auto-detection: pass `?carrier=fedexpl`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/6232288239023?carrier=fedexpl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "fedexpl", "trackingNumber": "6232288239023", "status": "delivered", "statusDescription": "Przesyłka doręczona do odbiorcy.", "service": null, "deliveredAt": "2026-03-19T09:27:42Z", "deliveredAtLocal": "2026-03-19T10:27:42", "signedBy": null, "destination": { "city": null, "state": null, "country": "PL" }, "message": null, "events": [ { "timestamp": "2026-03-19T09:27:42Z", "localTime": "2026-03-19T10:27:42", "status": "delivered", "description": "Przesyłka doręczona do odbiorcy.", "location": "WARSZAWA ŁOMIANKI", "code": "DS" }, { "timestamp": "2026-03-19T05:16:31Z", "localTime": "2026-03-19T06:16:31", "status": "out_for_delivery", "description": "Przesyłka wydana do doręczenia kurierowi FedEx. Planowane doręczenie w przedziale godzinowym 08:00-11:00.", "location": "WARSZAWA ŁOMIANKI", "code": "WK" }, { "timestamp": "2026-03-18T16:57:43Z", "localTime": "2026-03-18T17:57:43", "status": "in_transit", "description": "Przesyłka w oddziale FedEx.", "location": "HUB WYPEDY", "code": "SR.P" } ] } ``` ## Notes - This is the Polish domestic network on `poland.fedex.com`, a different backend from international FedEx (`fedex`). Event text is Polish; `status` is normalized. - 13-digit numbers are a shape other Polish schemes share, so pass `?carrier=fedexpl`. - **Time zone**: each scan time carries its own offset (`+0100`/`+0200`), which is converted. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Fermopoint Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fermopoint Query live **Fermopoint** (`fermopoint`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=fermopoint` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fermopoint` | | **Brand aliases** | Fermopoint, Fermoticket, Fermo Point | | **Category** | Italian pickup-point parcels (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=DFD02GG193029,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is shared with other carriers, so there is no auto-detection: pass `?carrier=fermopoint`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/DFD02GG193029?carrier=fermopoint" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "fermopoint", "trackingNumber": "DFD02GG193029", "status": "delivered", "statusDescription": "Pacco ritirato", "service": null, "deliveredAt": "2026-02-26T18:26:50Z", "deliveredAtLocal": "2026-02-26T19:26:50", "signedBy": null, "destination": { "city": null, "state": null, "country": "IT" }, "message": null, "events": [ { "timestamp": "2026-02-26T18:26:50Z", "localTime": "2026-02-26T19:26:50", "status": "delivered", "description": "Pacco ritirato", "location": null, "code": null }, { "timestamp": "2026-02-26T15:10:15Z", "localTime": "2026-02-26T16:10:15", "status": "exception", "description": "Arrivato al negozio", "location": null, "code": null }, { "timestamp": "2026-02-24T13:25:22Z", "localTime": "2026-02-24T14:25:22", "status": "label_created", "description": "Ritiro prenotato", "location": null, "code": null } ] } ``` ## Notes - Fermoticket codes (letter, four letters or digits, two letters, six digits) share their shape with other carriers' 13-character codes, so pass `?carrier=fermopoint`. - Event text is Italian. "Arrivato al negozio" (arrived at the shop, waiting for collection) is reported as `exception`, like other "ready for pickup" scans; "Pacco ritirato" (collected) is `delivered`. - **Time zone**: the page prints Italian local time; converted from `Europe/Rome`. The page shows only status changes, not locations. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # First Line Tracking API & MCP URL: https://docs.lastscanned.com/carriers/firstline Query live **First Line** (`firstline`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `firstline` | | **Brand aliases** | First Line, FirstLine, 1ST, firstline56 | | **Category** | Cross-border e-commerce parcels (China to US) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1ST06005039050,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^1ST\d{11}$/` | none | `1ST06005039050` | | **Pass 2 (`mayMatch`)** | none | none | none | `firstline` numbers are claimed by this carrier alone, so `?carrier=firstline` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1ST06005039050?carrier=firstline" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "firstline", "trackingNumber": "1ST06005039050", "status": "delivered", "statusDescription": "Delivered, Parcel Locker", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-17T15:30:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-03-17T15:30:00", "status": "delivered", "description": "Delivered, Parcel Locker", "location": "WINTER GARDEN FL 34787", "code": null }, { "timestamp": null, "localTime": "2026-03-15T21:04:00", "status": "in_transit", "description": "Arrived at USPS Regional Facility", "location": "ORLANDO FL DISTRIBUTION CENTER", "code": null }, { "timestamp": null, "localTime": "2026-03-10T08:16:37", "status": "in_transit", "description": "Depart from facility to service provider", "location": "SHENZHEN", "code": null } ] } ``` ## Notes - **Time zone**: the scans mix China and US local times with no zone, so only `localTime` is set and `timestamp` and `deliveredAt` are `null`. - The tracking page signs each query, so a lookup loads the page, then posts to the signed URL it finds. The backend sometimes answers "not found" for a real number; a miss is asked again up to three times before it is reported as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Flash Express (Thailand) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/flashexpress Query live **Flash Express Thailand** (`flashexpress`) parcel status and scan history in a single synchronous `GET` request or MCP tool call. Up to 20 numbers go into one upstream request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `flashexpress` | | **Brand & service aliases** | Flash Express, Flash Express Thailand, แฟลช เอ็กซ์เพรส | | **Category** | Thai domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=flashexpress` where noted below) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=TH37079591XP1A,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | `/^TH\d{2}[A-Z0-9]{8,12}[A-Z]$/` | — | `TH37079591XP1A` | | **Explicit (`?carrier=flashexpress`)** | Any other Flash Express Thailand number | — | — | Thai Flash Express numbers start with `TH` and end with a letter. The shape is loose, so it is only tried when no other carrier claims the number. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/TH37079591XP1A?carrier=flashexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/TH37079591XP1A?carrier=flashexpress", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "TH37079591XP1A", "carrier": "flashexpress" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "flashexpress", "trackingNumber": "TH37079591XP1A", "status": "out_for_delivery", "statusDescription": "Out for delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": "Bangkok", "country": "TH" }, "events": [ { "timestamp": "2026-10-26T02:20:00Z", "localTime": "2026-10-26T09:20:00", "status": "out_for_delivery", "description": "Out for delivery", "location": null, "code": "DELIVERY_TICKET_CREATION_SCAN" }, { "timestamp": "2026-10-25T14:05:00Z", "localTime": "2026-10-25T21:05:00", "status": "in_transit", "description": "Arrived at the delivery hub", "location": null, "code": "ARRIVAL_WAREHOUSE_SCAN" } ] } ``` ## Status Notes - **Thailand only**: this adapter uses the Thai site's tracking API. Flash Express Malaysia and the Philippines are not covered because their sites block automated requests. - **Times**: scan times are Thailand time (`Asia/Bangkok`), so both `timestamp` and `localTime` are set. - **Signer**: the recipient's name and proof-of-delivery photo are shown by Flash Express only to logged-in users, so `signedBy` is filled only when the API returns it. ## Related Resources - **Live browser lookup tool**: [Track a Flash Express (Thailand) package live on lastscanned.com/lookup/flashexpress](https://lastscanned.com/lookup/flashexpress) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Flash Express Philippines Tracking API & MCP URL: https://docs.lastscanned.com/carriers/flashexpressph Query live **Flash Express Philippines** (`flashexpressph`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=flashexpressph` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `flashexpressph` | | **Brand aliases** | Flash Express Philippines, Flash Express PH, Flash PH, flashexpress.ph | | **Category** | Philippine parcels (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=P1401MRNQJCAP,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^P\d{4}[0-9A-Z]{6,7}[A-Z]$/` | none | `P1401MRNQJCAP` | `flashexpressph` numbers are tried only when no other carrier claims the number; pass `?carrier=flashexpressph` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/P1401MRNQJCAP?carrier=flashexpressph" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "flashexpressph", "trackingNumber": "P1401MRNQJCAP", "status": "delivered", "statusDescription": "Your parcel has been delivered. Thank you for using Flash Express service.", "service": "Standard", "deliveredAt": "2026-02-28T09:54:35Z", "deliveredAtLocal": "2026-02-28T17:54:35", "signedBy": null, "destination": { "city": "Leganes", "state": "Iloilo", "country": "PH" }, "message": null, "events": [ { "timestamp": "2026-02-28T09:54:35Z", "localTime": "2026-02-28T17:54:35", "status": "delivered", "description": "Your parcel has been delivered. Thank you for using Flash Express service.", "location": "Zarraga, Iloilo", "code": "DELIVERY_CONFIRM" }, { "timestamp": "2026-02-28T00:32:52Z", "localTime": "2026-02-28T08:32:52", "status": "out_for_delivery", "description": "Your parcel is being delivered by Flash Express.", "location": "Zarraga, Iloilo", "code": "DELIVERY_TICKET_CREATION_SCAN" }, { "timestamp": "2026-02-24T10:43:29Z", "localTime": "2026-02-24T18:43:29", "status": "in_transit", "description": "Your parcel has been picked up by the courier.", "location": "Marikina City, Metro Manila", "code": "RECEIVED" } ] } ``` ## Notes - Batches go through one request (`track_parcel_batch`). - **Time zone**: Philippine time is UTC+8 all year; the API sends epoch seconds, so both times are exact. - Courier names, phone numbers and the signer's name in the scan text are removed. A returned parcel ends in `returned` ("Return parcel received by sender"). - The `mayMatch` shape is tried only when no other carrier claims the number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # FleetExpress Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fleetex Query live **FleetExpress** (`fleetex`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=fleetex` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fleetex` | | **Brand aliases** | FleetExpress, Fleet Express, Fleetex, fleetexpress.ca | | **Category** | Canadian courier (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SR621079457793,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^(?:SR|DS)\d{12}$/` | none | `SR621079457793` | `fleetex` numbers are tried only when no other carrier claims the number; pass `?carrier=fleetex` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SR621079457793?carrier=fleetex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "fleetex", "trackingNumber": "SR621079457793", "status": "label_created", "statusDescription": "Your Parcel Request Has Been Received Successfully.", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "CA" }, "message": null, "events": [ { "timestamp": "2026-03-15T22:00:08Z", "localTime": "2026-03-15T18:00:08", "status": "label_created", "description": "Your Parcel Request Has Been Received Successfully.", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: each event time carries its own offset, which is converted. - The shipper's account name in the response is not passed on. The `mayMatch` shape is tried only when no other carrier claims the number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # FleetOptics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fleetoptics Query live **FleetOptics** (`fleetoptics`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fleetoptics` | | **Brand aliases** | FleetOptics, Fleet Optics, FleetOptics Inc | | **Category** | Canadian final-mile delivery (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=FCLR000000169086,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^F(?:OAESH\d{7}|ONSP\d{11}|DAV\d{16}|DYNS[0-9A-Z]{11}|CLR\d{12}|SLS\d{15}|EPO\d{15})$/` | none | `FCLR000000169086` | | **Pass 2 (`mayMatch`)** | none | none | none | `fleetoptics` numbers are claimed by this carrier alone, so `?carrier=fleetoptics` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/FCLR000000169086?carrier=fleetoptics" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "fleetoptics", "trackingNumber": "FCLR000000169086", "status": "delivered", "statusDescription": "Delivered - Left in Mailroom", "service": null, "deliveredAt": "2026-03-19T19:44:00Z", "deliveredAtLocal": "2026-03-19T15:44:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-03-19T19:44:00Z", "localTime": "2026-03-19T15:44:00", "status": "delivered", "description": "Delivered - Left in Mailroom", "location": "EAST YORK, ON", "code": null }, { "timestamp": "2026-03-19T05:35:00Z", "localTime": "2026-03-19T01:35:00", "status": "in_transit", "description": "Scanned at Delivery Terminal", "location": "TORONTO, ON", "code": null }, { "timestamp": "2026-03-16T19:00:00Z", "localTime": "2026-03-16T15:00:00", "status": "label_created", "description": "Received Order Details", "location": null, "code": null } ] } ``` ## Notes - The prefixes (`FOAESH`, `FONSP`, `FDAV`, `FDYNS`, `FCLR`, `FSLS`, `FEPO`) are FleetOptics' client series. - **Time zone**: the page prints times as "15:44 ET" and dates without a year; the zone abbreviation is converted (ET to Toronto, CT, MT, PT, AT likewise) and the year is worked out from the newest scan being in the past. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Flip Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/flippost Query live **Flip Post** (`flippost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `flippost` | | **Brand aliases** | Flip Post, FlipPost, flippost.com | | **Category** | Russian courier waybills (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=77-000-032,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^\d{2}-\d{3}-\d{3}$/` (dashes kept) | none | `77-000-032` | | **Pass 2 (`mayMatch`)** | none | none | none | `flippost` numbers are claimed by this carrier alone, so `?carrier=flippost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/77-000-032?carrier=flippost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "flippost", "trackingNumber": "77-000-032", "status": "delivered", "statusDescription": "Доставлено", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-31T10:20:00", "signedBy": null, "destination": { "city": "Воронеж", "state": null, "country": "RU" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-03-31T10:20:00", "status": "delivered", "description": "Доставлено", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-30T09:57:00", "status": "out_for_delivery", "description": "Выдано курьеру на доставку", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-29T00:00:00", "status": "label_created", "description": "Планируемая дата отправки Москва - Воронеж", "location": null, "code": null } ] } ``` ## Notes - The dashes are part of the waybill and are kept (`77-000-032` style). Scan text is Russian; `status` is normalized. - **Time zone**: the network spans several Russian zones and the scans carry none, so only `localTime` is set and `timestamp` and `deliveredAt` are `null`. - The receiver's name that follows "Доставлено:" is not passed on. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Followmont Tracking API & MCP URL: https://docs.lastscanned.com/carriers/followmont Query live **Followmont** (`followmont`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=followmont` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `followmont` | | **Brand aliases** | Followmont, Followmont Transport, followmont.com.au | | **Category** | Australian freight (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=P004159319,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is shared with other carriers, so there is no auto-detection: pass `?carrier=followmont`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/P004159319?carrier=followmont" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "followmont", "trackingNumber": "P004159319", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-02T08:20:45", "signedBy": null, "destination": { "city": "Dalby", "state": null, "country": "AU" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-03-02T08:20:45", "status": "delivered", "description": "Delivered", "location": "Dalby", "code": "Delivery" }, { "timestamp": null, "localTime": "2026-03-02T07:54:14", "status": "out_for_delivery", "description": "Out for delivery", "location": null, "code": "OnDelivery" }, { "timestamp": null, "localTime": "2026-03-01T11:10:25", "status": "in_transit", "description": "Picked up", "location": "Larapinta", "code": "Pickup" } ] } ``` ## Notes - Consignment numbers are 7-8 digits or 1-3 letters followed by digits, shapes other freight carriers share, so pass `?carrier=followmont`. - The trace lists each scan once per item barcode; scans with the same minute, status and place are merged. - **Time zone**: depots span several states and the scans carry no zone, so only `localTime` is set and `timestamp` and `deliveredAt` are `null`. Sender and receiver names, addresses and handling notes are not returned. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Forward Air Tracking API & MCP URL: https://docs.lastscanned.com/carriers/forwardair Query live **Forward Air** (`forwardair`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=forwardair` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `forwardair` | | **Brand aliases** | Forward Air, ForwardAir, Forward Air airbill | | **Category** | US expedited LTL freight (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=10000003,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is shared with other carriers, so there is no auto-detection: pass `?carrier=forwardair`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/10000003?carrier=forwardair" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "forwardair", "trackingNumber": "10000003", "status": "delivered", "statusDescription": "Invoiced", "service": null, "deliveredAt": "2026-02-12T15:30:00Z", "deliveredAtLocal": "2026-02-12T10:30:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-02-18T18:50:00Z", "localTime": "2026-02-18T13:50:00", "status": "in_transit", "description": "Invoiced", "location": "GCY", "code": "INVC" }, { "timestamp": "2026-02-12T15:30:00Z", "localTime": "2026-02-12T10:30:00", "status": "delivered", "description": "Delivered", "location": "TPA", "code": "DLV" }, { "timestamp": "2026-02-09T21:40:00Z", "localTime": "2026-02-09T16:40:00", "status": "in_transit", "description": "Tendered", "location": "ATZ", "code": "TND" } ] } ``` ## Notes - Airbill numbers are 8 digits, a shape other carriers share, so pass `?carrier=forwardair`. - `location` is the airport or terminal code. The newest scan is usually "Invoiced", which follows the delivery, so a delivered shipment stays `delivered`. - **Time zone**: each scan names its zone (ET, CT, MT, PT), which is converted. Signer, customer numbers and weights are not returned. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Forza Delivery Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/forzadelivery Query live **Forza Delivery Express** (`forzadelivery`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `forzadelivery` | | **Brand aliases** | Forza Delivery Express, Forza Delivery, Forza Guatemala, forzadelivery.com | | **Category** | Guatemalan parcels (regional) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=FD20000000,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^FD\d{6,9}$/` | none | `FD20000000` | | **Pass 2 (`mayMatch`)** | none | none | none | `forzadelivery` numbers are claimed by this carrier alone, so `?carrier=forzadelivery` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/FD20000000?carrier=forzadelivery" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "forzadelivery", "trackingNumber": "FD20000000", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": "2026-02-28T20:18:31Z", "deliveredAtLocal": "2026-02-28T14:18:31", "signedBy": null, "destination": { "city": null, "state": null, "country": "GT" }, "message": null, "events": [ { "timestamp": "2026-02-28T20:18:31Z", "localTime": "2026-02-28T14:18:31", "status": "delivered", "description": "Entregado", "location": null, "code": "5" }, { "timestamp": "2026-02-28T13:22:33Z", "localTime": "2026-02-28T07:22:33", "status": "out_for_delivery", "description": "En ruta", "location": null, "code": "4" }, { "timestamp": "2026-02-27T23:42:08Z", "localTime": "2026-02-27T17:42:08", "status": "label_created", "description": "Solicitado", "location": null, "code": "1" } ] } ``` ## Notes - Event text is Spanish; `status` is normalized. `code` is Forza's milestone stage id. - **Time zone**: the milestones are stamped with a trailing `Z`, but they are Guatemala local time (America/Guatemala, UTC-6, no DST), so they are read as such. - The free-text milestone description (which names the receiver and their ID) is not returned; the title and the failed-attempt reason are. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Foxpost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/foxpost Query live **Foxpost** (`foxpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `foxpost` | | **Brand aliases** | Foxpost, FOXPOST, Foxpost Hungary, A-BOX, Z-BOX | | **Category** | Hungarian parcel lockers and pickup points | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CLFOX173757691390113,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^CLFOX\d{15}$/` | none | `CLFOX173757691390113` | | **Pass 2 (`mayMatch`)** | none | none | none | `CLFOX` numbers belong to Foxpost alone, so `?carrier=foxpost` is optional. The shorter Foxpost codes (`Z` + 10 digits, or 10 digits starting `66`) are shared shapes: pass `?carrier=foxpost`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CLFOX173757691390113?carrier=foxpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "foxpost", "trackingNumber": "CLFOX173757691390113", "status": "delivered", "statusDescription": "Átvéve: Csomagod (vissza)kézbesítve lett, a címzett/feladó átvette.", "service": null, "deliveredAt": "2026-03-12T15:01:00Z", "deliveredAtLocal": "2026-03-12T16:01:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-12T15:01:00Z", "localTime": "2026-03-12T16:01:00", "status": "delivered", "description": "Átvéve: Csomagod (vissza)kézbesítve lett, a címzett/feladó átvette.", "location": null, "code": null }, { "timestamp": "2026-03-12T09:22:00Z", "localTime": "2026-03-12T10:22:00", "status": "exception", "description": "Automatában: Csomagod megérkezett az általad választott (vissza)kézbesítési automatába, most már átveheted!", "location": null, "code": null }, { "timestamp": "2026-03-10T18:15:00Z", "localTime": "2026-03-10T19:15:00", "status": "label_created", "description": "Csomagod elkészült: Csomagod létrejött a rendszerünkben, a feladó még nem adta át azt a FOXPOST részére.", "location": null, "code": null } ] } ``` ## Notes - **Language**: Foxpost's page is Hungarian, so `description` is the step title plus its sentence in Hungarian (`Raktárban`, `Automatában`, `Úton`, `Átvéve`, `Visszaküldve`). - **Status**: a parcel waiting in the locker for the recipient reads `exception` (ready for collection); `returned` is set when the page says it is being sent back to the sender. - **Time zone**: scan times are Hungarian wall clock (`Europe/Budapest`); `timestamp` is that converted to UTC. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Franch Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/franchexpress Query live **Franch Express** (`franchexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `franchexpress` | | **Brand aliases** | Franch Express, Franch Express Courier, erpfranchexpress | | **Category** | Indian courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=48024430834,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Franch AWBs are 11 digits, a shape other carriers use too, so pass `?carrier=franchexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/48024430834?carrier=franchexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "franchexpress", "trackingNumber": "48024430834", "status": "in_transit", "statusDescription": "Forwarded to Blue Dart - Delhi", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": "Handed to Blue Dart as 48024430834", "events": [ { "timestamp": "2026-02-09T12:26:00Z", "localTime": "2026-02-09T17:56:00", "status": "in_transit", "description": "Forwarded to Blue Dart - Delhi", "location": null, "code": null }, { "timestamp": "2026-02-09T06:44:00Z", "localTime": "2026-02-09T12:14:00", "status": "in_transit", "description": "Received at Hub", "location": "Chennai hub, TN", "code": null }, { "timestamp": "2026-02-07T04:06:00Z", "localTime": "2026-02-07T09:36:00", "status": "exception", "description": "Holding at Hub", "location": "Chennai hub, TN", "code": null } ] } ``` ## Notes - **Handoff**: when a scan says `Forwarded to ` with a waybill, `message` names that carrier and number (for example `"Handed to Blue Dart as 48024430834"`). Pass that number to `GET /v1/track/{number}` for the partner's scans. - **How it is fetched**: the site's search form posts the AWB to get an opaque token, then loads the result page with it; both steps run in one request. - **Time zone**: scan times are Indian Standard Time (`Asia/Kolkata`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Fuhai Wulian Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fuhai618 Query live **Fuhai Wulian** (`fuhai618`) package status and scan history in a single synchronous `GET` request or MCP tool call. Fuhai Wulian numbers share their shape with other carriers' numbers, so pass `?carrier=fuhai618`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fuhai618` | | **Brand aliases** | Fuhai Wulian, 富海物联 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=fuhai618` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=fuhai618` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Fuhai Wulian tracking numbers have no shape of their own, so always pass `?carrier=fuhai618`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Fuhai Wulian in one request. - **Platform**: Fuhai Wulian runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # FJEX Tracking API & MCP URL: https://docs.lastscanned.com/carriers/fujexp Query live **FJEX** (`fujexp`) package status and scan history in a single synchronous `GET` request or MCP tool call. FJEX numbers share their shape with other carriers' numbers, so pass `?carrier=fujexp`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `fujexp` | | **Brand aliases** | FJEX, 富杰国际物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=fujexp` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=fujexp` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | FJEX tracking numbers have no shape of their own, so always pass `?carrier=fujexp`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to FJEX in one request. - **Platform**: FJEX runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GAASH Worldwide Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gaash Query live **GAASH Worldwide** (`gaash`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gaash` | | **Brand aliases** | GAASH, GAASH Worldwide, Gaash WD, GWD | | **Category** | Israeli cross-border e-commerce | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=PH8001877691,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^GAIH\d{8}$/` | none | `PH8001877691` | | **Pass 2 (`mayMatch`)** | `/^(?:GWD\d{9}|PH\d{10})$/` | none | `PH8001877691` | `GAIH` numbers belong to GAASH alone. `GWD` + 9 digits (also Purolator's loose shape) and `PH` + 10 digits are tried only when no other carrier claims them; `?carrier=gaash` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/PH8001877691?carrier=gaash" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gaash", "trackingNumber": "PH8001877691", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-27T07:12:13Z", "deliveredAtLocal": "2026-03-27T10:12:13", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-27T07:12:13Z", "localTime": "2026-03-27T10:12:13", "status": "delivered", "description": "Delivered", "location": null, "code": "16" }, { "timestamp": "2026-03-26T09:26:53Z", "localTime": "2026-03-26T12:26:53", "status": "exception", "description": "Arrived at pickup location", "location": null, "code": "15" }, { "timestamp": "2026-03-10T16:50:43Z", "localTime": "2026-03-10T19:50:43", "status": "in_transit", "description": "Parcel is on the way to destination country", "location": null, "code": "1001" } ] } ``` ## Notes - **Customs**: parcels held at the Ministry of Transportation or waiting on a payment show those steps as `in_transit` events with GAASH's own codes (`813`, `912`, `849`). - **Pickup points**: `Arrived at pickup location` reads `exception` (ready for collection), as other carriers' ready-for-pickup scans do. - **Time zone**: each scan carries its own offset (`GMT+02:00` / `GMT+03:00`), so `timestamp` is exact. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # JSH Galaxy Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/galaxyex Query live **JSH Galaxy Express** (`galaxyex`) package status and scan history in a single synchronous `GET` request or MCP tool call. JSH Galaxy Express numbers share their shape with other carriers' numbers, so pass `?carrier=galaxyex`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `galaxyex` | | **Brand aliases** | JSH Galaxy Express, 嘉盛泓国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=galaxyex` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=galaxyex` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | JSH Galaxy Express tracking numbers have no shape of their own, so always pass `?carrier=galaxyex`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to JSH Galaxy Express in one request. - **Platform**: JSH Galaxy Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Gaopost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gaopost Query live **Gaopost** (`gaopost`) package status and scan history in a single synchronous `GET` request or MCP tool call. Gaopost numbers share their shape with other carriers' numbers, so pass `?carrier=gaopost`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gaopost` | | **Brand aliases** | Gaopost, 高翔物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=gaopost` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=gaopost` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Gaopost tracking numbers have no shape of their own, so always pass `?carrier=gaopost`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Gaopost in one request. - **Platform**: Gaopost runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Gati Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gati Query live **Gati** (`gati`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gati` | | **Brand aliases** | Gati, Allcargo Gati, Gati-KWE, AllcargoGATI | | **Category** | Indian express freight | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=132692255,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Gati dockets are 9 digits, a shape other carriers use too, so pass `?carrier=gati`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/132692255" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gati", "trackingNumber": "132692255", "status": "delivered", "statusDescription": "Delivered", "service": "Sur Express", "deliveredAt": "2017-07-04T13:13:00Z", "deliveredAtLocal": "2017-07-04T18:43:00", "signedBy": "vel", "destination": { "city": "Chennai", "state": null, "country": "IN" }, "events": [ { "timestamp": "2017-07-04T13:13:00Z", "localTime": "2017-07-04T18:43:00", "status": "delivered", "description": "Delivered", "location": "Chennai", "code": "DDLVD" }, { "timestamp": "2017-07-04T06:52:00Z", "localTime": "2017-07-04T12:22:00", "status": "out_for_delivery", "description": "Out For Delivery", "location": "Chennai", "code": "DPDCC" }, { "timestamp": "2017-07-04T03:56:00Z", "localTime": "2017-07-04T09:26:00", "status": "in_transit", "description": "Arrived At Destination", "location": "Chennai", "code": "DKTAD" }, { "timestamp": "2017-07-04T03:46:00Z", "localTime": "2017-07-04T09:16:00", "status": "in_transit", "description": "Out For Next Location Chennai", "location": "Chennai Stc", "code": "TCSEO" }, { "timestamp": "2017-07-04T01:03:00Z", "localTime": "2017-07-04T06:33:00", "status": "in_transit", "description": "Received At Chennai Stc", "location": "Chennai Stc", "code": "TCAER" }, { "timestamp": "2017-07-03T18:03:00Z", "localTime": "2017-07-03T23:33:00", "status": "in_transit", "description": "Out For Next Location Chennai Stc", "location": "Bangalore", "code": "TCSEO" }, { "timestamp": "2017-07-03T10:43:00Z", "localTime": "2017-07-03T16:13:00", "status": "in_transit", "description": "Received At Bangalore", "location": "Bangalore", "code": "TCAER" }, { "timestamp": "2017-06-30T03:15:00Z", "localTime": "2017-06-30T08:45:00", "status": "in_transit", "description": "Out For Next Location Bangalore", "location": "Dankuni Outbound", "code": "TCSEO" }, { "timestamp": "2017-06-29T16:58:00Z", "localTime": "2017-06-29T22:28:00", "status": "in_transit", "description": "Received At Dankuni Outbound", "location": "Dankuni Outbound", "code": "TCAER" }, { "timestamp": "2017-06-29T12:28:00Z", "localTime": "2017-06-29T17:58:00", "status": "in_transit", "description": "Departed From Origin", "location": "Kalyani", "code": "TCSOU" }, { "timestamp": "2017-06-24T09:00:00Z", "localTime": "2017-06-24T14:30:00", "status": "label_created", "description": "Shipment Booked", "location": "Kalyani", "code": "DCRE" } ] } ``` ## Notes - **Codes**: each scan's `code` is Gati's milestone code (`DCRE` booked, `TCSOU` left origin, `TCAER` / `TCSEO` hub in and out, `DKTAD` arrived at destination, `DPDCC` out for delivery, `DUNDL` undelivered, `DDLVD` delivered). - **Time zone**: scan times are Indian Standard Time (`Asia/Kolkata`). - **Service**: `service` is Gati's product name (for example `Sur Express`); `signedBy` is the name the receiver gave on delivery. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ASGYL Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gdasgyl Query live **ASGYL** (`gdasgyl`) package status and scan history in a single synchronous `GET` request or MCP tool call. ASGYL numbers share their shape with other carriers' numbers, so pass `?carrier=gdasgyl`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gdasgyl` | | **Brand aliases** | ASGYL, 安速供应链 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=gdasgyl` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=gdasgyl` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ASGYL tracking numbers have no shape of their own, so always pass `?carrier=gdasgyl`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to ASGYL in one request. - **Platform**: ASGYL runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GDEX (Malaysia) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gdex Query live **GDEX** (`gdex`) package status and scan history in a single synchronous `GET` request or MCP tool call. GDEX numbers are not auto-detected, so pass `?carrier=gdex`. `lastscanned` returns a normalized `TrackingResult` JSON payload, with no GDEX account or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gdex` | | **Brand & service aliases** | GDEX, GD Express, GDEX Malaysia, `gdexpress.com` | | **Category** | Malaysian courier, domestic and international | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=gdex` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MY37324153968,...&carrier=gdex` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | | **Explicit (`?carrier=gdex`)** | GDEX consignment number | n/a | `MY37324153968` | GDEX consignment numbers are plain digits, a shape other carriers share, so `?carrier=gdex` is required. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/MY37324153968?carrier=gdex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/MY37324153968?carrier=gdex", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "MY37324153968", "carrier": "gdex" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "gdex", "trackingNumber": "MY37324153968", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-26T06:05:00Z", "localTime": "2026-10-26T14:05:00", "status": "delivered", "description": "Delivered", "location": "Penang", "code": null }, { "timestamp": "2026-10-25T12:10:00Z", "localTime": "2026-10-25T20:10:00", "status": "in_transit", "description": "In Transit", "location": "Shah Alam Hub", "code": null } ] } ``` ## Notes - GDEX has no JSON endpoint for its tracking page, so `lastscanned` reads the page's scan table. Scan times are Malaysia time, returned with a UTC `timestamp` and the scan's `localTime`. - Look up by consignment number; GDEX's customer reference lookup is not supported. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # GDWSE Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gdwse Query live **GDWSE** (`gdwse`) package status and scan history in a single synchronous `GET` request or MCP tool call. GDWSE numbers share their shape with other carriers' numbers, so pass `?carrier=gdwse`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gdwse` | | **Brand aliases** | GDWSE, 威速易 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=gdwse` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=gdwse` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | GDWSE tracking numbers have no shape of their own, so always pass `?carrier=gdwse`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to GDWSE in one request. - **Platform**: GDWSE runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Geis Tracking API & MCP URL: https://docs.lastscanned.com/carriers/geis Query live **Geis** (`geis`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `geis` | | **Brand aliases** | Geis Group, Geis CZ, Geis SK, Geis Transfer | | **Category** | Pallet and parcel freight (Czech Republic, Slovakia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: Geis numbers are 13 digits, a shape that is not exclusive, so pass `?carrier=geis`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1502200028227?carrier=geis" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "geis", "trackingNumber": "1502200028227", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-06-02T22:00:00Z", "deliveredAtLocal": "2026-06-03T00:00:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-06-02T22:00:00Z", "localTime": "2026-06-03T00:00:00", "status": "delivered", "description": "Delivered", "location": null, "code": "70" }, { "timestamp": "2026-05-29T17:25:00Z", "localTime": "2026-05-29T19:25:00", "status": "in_transit", "description": "Arrival to gateway", "location": null, "code": "40" }, { "timestamp": "2026-05-22T08:21:15Z", "localTime": "2026-05-22T10:21:15", "status": "in_transit", "description": "Loading to linehaul", "location": "Zvolen, Slovakia", "code": "30" }, { "timestamp": "2026-05-21T16:49:07Z", "localTime": "2026-05-21T18:49:07", "status": "in_transit", "description": "Arrived to depot", "location": "Zvolen, Slovakia", "code": "20" } ] } ``` ## Notes - **Source**: the "detail of cargo" page of `geis-group.sk`, and of `geis-group.cz` when the Slovak site has no record. Each site only knows its own network's parcels. No account is needed. - **Times**: every scan row carries an ISO time with its local offset, so `timestamp` is exact. - **Status codes**: code 70 is `delivered`; other codes (20 arrived to depot, 30 loading to linehaul, 40 arrival to gateway) are `in_transit`, and the rest are read from the wording. - **Not found**: the page's `was not found or was not handed over for transportation` heading becomes `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Geniki Taxydromiki Tracking API & MCP URL: https://docs.lastscanned.com/carriers/genikitaxydromiki Query live **Geniki Taxydromiki** (`genikitaxydromiki`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `genikitaxydromiki` | | **Brand aliases** | Geniki Taxydromiki, Γενική Ταχυδρομική, Geniki, GT | | **Category** | Greek parcel courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=5190865971,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Geniki vouchers are 10 digits, a shape other carriers use too, so pass `?carrier=genikitaxydromiki`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/5190865971?carrier=genikitaxydromiki" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "genikitaxydromiki", "trackingNumber": "5190865971", "status": "delivered", "statusDescription": "Shipment Delivered", "service": null, "deliveredAt": "2026-05-13T07:40:41Z", "deliveredAtLocal": "2026-05-13T10:40:41", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-13T07:40:41Z", "localTime": "2026-05-13T10:40:41", "status": "delivered", "description": "Shipment Delivered", "location": "Θεσσαλονικη", "code": "C_W2" }, { "timestamp": "2026-05-12T06:14:17Z", "localTime": "2026-05-12T09:14:17", "status": "out_for_delivery", "description": "Out for Delivery", "location": "Θεσσαλονικη", "code": "C_A3" }, { "timestamp": "2026-05-07T08:56:01Z", "localTime": "2026-05-07T11:56:01", "status": "label_created", "description": "Shipment label created/printed", "location": null, "code": "C_NW" } ] } ``` ## Notes - **Codes**: each scan's `code` is Geniki's checkpoint code (`C_NW` label printed, `C_A3` out for delivery, `C_W2` delivered, `C_EA_*` delivery attempts that did not succeed). - **Places**: service point and hub names come back in Greek capitals, tidied to title case. - **Time zone**: checkpoint times are Greek wall clock (`Europe/Athens`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GlobalPost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/globalpost Query live **GlobalPost** (`globalpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `globalpost` | | **Brand aliases** | GlobalPost, GlobalPost Plus, Global Post, goglobalpost | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=GPPISP0006823942US,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^GP[A-Z]{4}\d{10}(US|GB)$/` | none | `GPPISP0006823942US` | | **Pass 2 (`mayMatch`)** | none | none | none | `GP…US` / `GP…GB` numbers belong to GlobalPost alone, so `?carrier=globalpost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/GPPISP0006823942US?carrier=globalpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "globalpost", "trackingNumber": "GPPISP0006823942US", "status": "in_transit", "statusDescription": "Arrived at GlobalPost Facility", "service": "GlobalPost Plus", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "San Antonio", "state": "TX", "country": "US" }, "message": "Handed to Cirro as GPPISP0006823942US", "events": [ { "timestamp": null, "localTime": "2026-06-29T13:01:00", "status": "in_transit", "description": "Arrived at GlobalPost Facility", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-06-29T03:25:00", "status": "in_transit", "description": "In Transit", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-06-25T22:02:00", "status": "label_created", "description": "Label Created", "location": null, "code": null } ] } ``` ## Notes - **Handoff**: `message` names the final-mile carrier and its number (for example `"Handed to Cirro as GPPISP0006823942US"`). Pass that number to `GET /v1/track/{number}` for the partner's own scans. - **Time zone**: GlobalPost prints scan clocks with no zone and the places span countries, so only `localTime` is set and `timestamp` is `null`. - **Returns**: a `Delivered` scan in the origin city of a cross-border parcel is the parcel back with the sender, and reads `returned`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GLS Group Europe Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gls Query live **GLS Group Europe** (`gls`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` reads the same call as gls-group.eu's parcel-tracking page. GLS US is a separate carrier: see [GLS US](https://docs.lastscanned.com/carriers/glsus). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gls` | | **Brand & service aliases** | GLS, GLS Group, GLS Europe, GLS Germany (gls-pakete.de), General Logistics Systems | | **Category** | European ground parcel network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (11-digit numbers are tried when no other carrier claims them; otherwise add `?carrier=gls`) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=10272483975,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=gls`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | n/a | | **Pass 2 (`mayMatch`)** | `/^\d{11}$/` | None | `10272483975` | | **Explicit (`?carrier=gls`)** | Any GLS parcel number (11-14 digits, plus alphanumeric references) | None | `10272483975` | ### When is `?carrier=gls` optional vs required? - **Optional**: 11-digit numbers that no other carrier claims. - **Required (`?carrier=gls`)**: 12-digit numbers (FedEx's shape), other lengths and alphanumeric references. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/10272483975?carrier=gls" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/10272483975?carrier=gls", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "10272483975", "carrier": "gls" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "gls", "trackingNumber": "10272483975", "status": "delivered", "statusDescription": "The parcel has been delivered.", "service": null, "deliveredAt": "2026-10-22T07:15:00Z", "deliveredAtLocal": "2026-10-22T09:15:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-22T07:15:00Z", "localTime": "2026-10-22T09:15:00", "status": "delivered", "description": "The parcel has been delivered.", "location": "Neuss, Germany", "code": null }, { "timestamp": "2026-10-20T08:00:00Z", "localTime": "2026-10-20T10:00:00", "status": "in_transit", "description": "The parcel has been handed over to GLS.", "location": "Neuss, DE", "code": null } ] } ``` ## Notes - Uses `gls-group.eu/app/service/open/rest/EU/en/rstt029` with `caller=witt002`, as the tracking page does. An unknown number answers 404 and becomes `not_found`. - Scan times carry no zone; `timestamp` is set only when the scan's country is a single-time-zone country. - The package status follows GLS's own progress bar when it is present. ## Related Resources - **Live browser lookup tool**: [Track a GLS Group Europe package live on lastscanned.com/lookup/gls](https://lastscanned.com/lookup/gls) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # GLS Canada (Dicom) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/glscanada Query live **GLS Canada** (`glscanada`, formerly Dicom) parcel status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` reads the same service the tracker on gls-group.com/CA uses, so no account or API key is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `glscanada` | | **Brand aliases** | GLS Canada, Dicom, GLS Dicom | | **Category** | Canadian domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=glscanada` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=glscanada` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | none | none | | **Pass 2 (`mayMatch`)** | *None* | none | none | | **Explicit (`?carrier=glscanada`)** | GLS Canada / Dicom numbers | none | `P66776054` | GLS Canada numbers share their shape with other carriers, so a number is never auto-detected as GLS Canada. Always pass `?carrier=glscanada`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/P66776054?carrier=glscanada" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/P66776054?carrier=glscanada", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "P66776054", "carrier": "glscanada" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "glscanada", "trackingNumber": "P66776054", "status": "in_transit", "statusDescription": "In transit - Arrived at terminal", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Mississauga", "state": "ON", "country": "CA" }, "events": [ { "timestamp": null, "localTime": "2026-10-26T14:22:00", "status": "in_transit", "description": "In transit - Arrived at terminal", "location": "Toronto", "code": null } ] } ``` ## Notes - **Times**: scans carry no province, so a time without an offset keeps only `localTime`. - **Unknown numbers**: GLS Canada answers `NORECORD`, which comes back as `404 not_found`. - **Coverage**: GLS Canada shipments only. [GLS US](https://docs.lastscanned.com/carriers/glsus) is a different carrier. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # GLS France Tracking API & MCP URL: https://docs.lastscanned.com/carriers/glsfr Query live **GLS France** (`glsfr`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `glsfr` | | **Brand aliases** | GLS France, GLS Colis, moncolis.gls-france.com | | **Category** | French parcel courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=00LB1K6P,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^00(?=[A-Z0-9]{6}$)(?=.*[A-Z])(?=.*\d)[A-Z0-9]{6}$/` | none | `00LB1K6P` | GLS France track ids are eight letters and digits, a shape other carriers share; only the `00`-prefixed form is tried when no carrier claims the number. Pass `?carrier=glsfr` for the rest. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/00LB1K6P?carrier=glsfr" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "glsfr", "trackingNumber": "00LB1K6P", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-01T07:10:52Z", "deliveredAtLocal": "2026-10-01T09:10:52", "signedBy": "DUPONT", "destination": null, "events": [ { "timestamp": "2026-10-01T07:10:52Z", "localTime": "2026-10-01T09:10:52", "status": "delivered", "description": "Delivered", "location": "FR0057", "code": "LTV" }, { "timestamp": "2026-10-01T05:21:52Z", "localTime": "2026-10-01T07:21:52", "status": "out_for_delivery", "description": "Out for delivery", "location": "FR0057", "code": "TRV" }, { "timestamp": "2026-09-29T03:11:41Z", "localTime": "2026-09-29T05:11:41", "status": "label_created", "description": "Shipment information received", "location": "FR9900", "code": "CON" } ] } ``` ## Notes - **Backend**: the consignee API behind moncolis.gls-france.com, not the European GLS endpoint used by the [GLS](https://docs.lastscanned.com/docs/carriers/gls) carrier. - **Events**: the API sends status codes only (`CON` data received, `EXP` / `TRA` in transit, `REC` at the delivery depot, `TRV` out for delivery, `PBA` delivery not completed, `LTV` / `LIV` delivered); descriptions are written from them. `location` is the GLS depot code. - **Time zone**: scan times are French wall clock (`Europe/Paris`). `signedBy` is the signer name GLS records. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GLS Italy Tracking API & MCP URL: https://docs.lastscanned.com/carriers/glsit Query live **GLS Italy** (`glsit`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `glsit` | | **Brand aliases** | GLS Italy, GLS Italia, General Logistics Systems Italy | | **Category** | Italian parcel courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=NN664581111,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^[A-Z]{2}\d{9}$/` | none | `NN664581111` | GLS Italy parcel numbers are two letters and nine digits; as a loose shape it is tried only when no other carrier claims the number, so `?carrier=glsit` is the sure way. 11- and 12-digit European GLS numbers go to [GLS](https://docs.lastscanned.com/docs/carriers/gls). ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/NN664581111?carrier=glsit" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "glsit", "trackingNumber": "NN664581111", "status": "delivered", "statusDescription": "Delivered.", "service": null, "deliveredAt": "2026-02-27T13:15:00Z", "deliveredAtLocal": "2026-02-27T14:15:00", "signedBy": null, "destination": { "city": "Bologna", "state": "BO", "country": "IT" }, "events": [ { "timestamp": "2026-02-27T13:15:00Z", "localTime": "2026-02-27T14:15:00", "status": "delivered", "description": "Delivered.", "location": "Bologna", "code": null }, { "timestamp": "2026-02-27T06:34:00Z", "localTime": "2026-02-27T07:34:00", "status": "out_for_delivery", "description": "Delivery scheduled during the day.", "location": "Bologna", "code": null }, { "timestamp": "2026-02-19T19:05:00Z", "localTime": "2026-02-19T20:05:00", "status": "label_created", "description": "The shipment has been created by the sender, we are waiting for it to be entrusted to us for dispatch to its destination.", "location": "Milano Nord", "code": null } ] } ``` ## Notes - **Backend**: this is GLS Italy's own `rstt030` tracking call. The European GLS endpoint behind the [GLS](https://docs.lastscanned.com/docs/carriers/gls) carrier does not know these Italian national numbers. - **Status**: the parcel status comes from GLS's progress bar (`PREADVICE`, `INTRANSIT`, `INDELIVERY`, `DELIVERED`, ...); missed deliveries read `exception`. - **Time zone**: scan times are Italian wall clock (`Europe/Rome`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GLS US (Golden State Overnight / GSO) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/glsus Query live **GLS US** (`glsus`, formerly **Golden State Overnight / GSO**) West Coast package status and scan history in a single synchronous `GET` request or MCP tool call. > **Important — Always pass `?carrier=glsus` (or `"carrier": "glsus"` in MCP):** GLS US is **never auto-detected** (`matches: () => false`, no `mayMatch`). Because GLS US uses 8–11 digit uncheck-digited GSO numbers (typically 9 digits like `CA0W2208048` or `CA0W2208048`) as well as arbitrary shipper reference numbers (`CA0W2208048`, 20-digit references) that collide with other carriers—and because GLS US's system answers generic placeholder numbers shippers reuse—you must always specify `?carrier=glsus`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `glsus` (**Required on every request — never auto-detected**) | | **Brand & service aliases** | GLS US, GLS USA, GSO, Golden State Overnight, GLS Ground (`CPS`), Priority Overnight (`PDS`), Early Priority Overnight (`EPS`), Noon Priority Overnight (`NPS`), Saturday Delivery (`SDS`) | | **Category** | US West Coast regional parcel carrier — CA, AZ, NV, OR, WA, ID, NM, UT | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=glsus` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CA0W2208048,CA0W2208048&carrier=glsus` (up to 25 GLS US numbers per batch; up to 100 total numbers) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package` / `track_packages` with `"carrier": "glsus"` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for GLS US / GSO - **Deduplicates reused tracking numbers automatically**: Shippers on GLS US frequently reuse tracking numbers or reference numbers across multiple shipments over time, causing raw GLS US API responses to return multiple shipment objects for a single number. `lastscanned` automatically sorts matching shipments by newest `shipDate` and latest scan timestamp so you always get the active parcel. - **Translates GSO service codes & return-to-sender (`RTS`) states**: Raw GLS US responses return legacy GSO service codes (`CPS` → `"GLS Ground"`, `PDS` → `"Priority Overnight"`, `EPS` → `"Early Priority Overnight"`, `NPS` → `"Noon Priority Overnight"`, `SDS` → `"Saturday Delivery"`, `ESS` → `"Early Saturday Delivery"`) and stuff return reasons (`"RTS - UNABLE TO CONTACT RCPNT"`) into the `signedBy` field on returned shipments. `lastscanned` maps service names cleanly and clears `signedBy` to `null` unless the parcel is actually `delivered`. - **West Coast timezone normalization**: GLS US prints scan times in local wall-clock time without a UTC offset. `lastscanned` maps Pacific states (`CA`, `NV`, `OR`, `WA` → `America/Los_Angeles`) and Arizona (`AZ` → `America/Phoenix`, no DST) to compute accurate UTC `timestamp` values alongside `localTime`. ## Tracking Number Formats & Why `?carrier=glsus` Is Required | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None (`false`)* — **Never auto-detected** | — | — | | **Pass 2 (`mayMatch`)** | *None* — **Never auto-detected** | — | — | | **Explicit (`?carrier=glsus`)** | 9-digit GSO numbers, 8–11 digit numeric barcodes, or alphanumeric shipper references (`CA0W…`, 20-digit references) | — | `CA0W2208048`, `CA0W2208048`, `CA0W2208048` | ### Why GLS US is never auto-detected 1. **No check digit or fixed prefix on 9-digit GSO numbers**: Standard 9-digit numbers (`CA0W2208048`) have no check digit, and 20-digit shipper references collide directly with [FedEx](https://docs.lastscanned.com/carriers/fedex) and [DHL Paket](https://docs.lastscanned.com/carriers/dhl). 2. **Shipper-supplied tracking numbers**: GLS US indexes parcels by whatever barcode or reference number the shipper prints on the label, and even answers test/placeholder numbers (`CA0W2208048`) that shippers have reused. Requiring `?carrier=glsus` guarantees zero false positives on other carriers' numbers. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/CA0W2208048?carrier=glsus" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/CA0W2208048?carrier=glsus", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.service, pkg.signedBy); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "CA0W2208048", "carrier": "glsus" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "glsus", "trackingNumber": "CA0W2208048", "status": "delivered", "statusDescription": "SHIPMENT DELIVERED", "service": "GLS Ground", "deliveredAt": "2026-10-24T20:15:00Z", "deliveredAtLocal": "2026-10-24T13:15:00", "signedBy": "FRONT DOOR", "destination": { "city": "OAKLAND", "state": "CA", "country": "US" }, "estimatedDelivery": null, "events": [ { "timestamp": "2026-10-24T20:15:00Z", "localTime": "2026-10-24T13:15:00", "status": "delivered", "description": "SHIPMENT DELIVERED", "location": "OAKLAND, CA", "code": null }, { "timestamp": "2026-10-24T15:10:00Z", "localTime": "2026-10-24T08:10:00", "status": "out_for_delivery", "description": "ON ROUTE FOR DELIVERY", "location": "HAYWARD, CA", "code": null }, { "timestamp": "2026-10-24T11:42:00Z", "localTime": "2026-10-24T04:42:00", "status": "in_transit", "description": "SCANNED AT DELIVERY DEPOT", "location": "HAYWARD, CA", "code": null }, { "timestamp": "2026-10-23T22:05:00Z", "localTime": "2026-10-23T15:05:00", "status": "label_created", "description": "LABEL CREATED", "location": null, "code": null } ] } ``` ## Related Resources - **Live browser lookup tool**: [Track a GLS US package live on lastscanned.com/lookup/glsus](https://lastscanned.com/lookup/glsus) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # GMS Worldwide Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gmsworldwide Query live **GMS Worldwide Express** (`gmsworldwide`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gmsworldwide` | | **Brand aliases** | GMS Worldwide Express, GMS Worldwide, GMS Express, gmsglobe | | **Category** | Indian courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=437425658,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | GMS consignment numbers are 9 digits, a shape other carriers use too, so pass `?carrier=gmsworldwide`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/437425658?carrier=gmsworldwide" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gmsworldwide", "trackingNumber": "437425658", "status": "delivered", "statusDescription": "Delivered (POD)", "service": "RGS", "deliveredAt": "2026-04-14T06:51:10Z", "deliveredAtLocal": "2026-04-14T12:21:10", "signedBy": null, "destination": { "city": "Pune", "state": null, "country": "IN" }, "events": [ { "timestamp": "2026-04-14T06:51:10Z", "localTime": "2026-04-14T12:21:10", "status": "delivered", "description": "Delivered (POD)", "location": "Kothrud Bo, Pune", "code": null }, { "timestamp": "2026-04-14T05:42:50Z", "localTime": "2026-04-14T11:12:50", "status": "out_for_delivery", "description": "Consignment Out for delivery", "location": "Kothrud Bo, Pune", "code": null }, { "timestamp": "2026-04-10T14:02:04Z", "localTime": "2026-04-10T19:32:04", "status": "label_created", "description": "BOOKED AT NASHIK", "location": "Nashik Bo, Nashik", "code": null } ] } ``` ## Notes - **Time zone**: scan times are Indian Standard Time (`Asia/Kolkata`). - **Service**: `service` is GMS's service type code (for example `RGS`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GO4 Tracking API & MCP URL: https://docs.lastscanned.com/carriers/go4 Query live **GO4** (`go4`) parcel status in a single synchronous `GET` request or MCP tool call. Numbers are 11 digits, a shape other carriers use, so pass `?carrier=go4`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `go4` | | **Brand aliases** | GO4, GO4 Slovakia, zona.go4.eu | | **Category** | Domestic parcel courier (Slovakia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=26102600001,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. Parcel numbers are 11 digits (date prefix plus a serial), shared with other carriers, so `?carrier=go4` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/26102600001?carrier=go4" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "go4", "trackingNumber": "26102600001", "status": "delivered", "statusDescription": "Delivered: in good condition", "service": null, "deliveredAt": "2026-10-01T08:15:30Z", "deliveredAtLocal": "2026-10-01T10:15:30", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-01T08:15:30Z", "localTime": "2026-10-01T10:15:30", "status": "delivered", "description": "Delivered: in good condition", "location": null, "code": null }, { "timestamp": "2026-10-01T06:00:00Z", "localTime": "2026-10-01T08:00:00", "status": "label_created", "description": "Ordered", "location": null, "code": null } ] } ``` ## Notes - **Source**: GO4's status endpoint returns the order time, the main status and a detail line, and the delivery time. It has no scan list, so the result holds the order and, once delivered, the delivery. - **Time zone**: read as `Europe/Bratislava`. When the order time is later than the delivery time, the "Ordered" event is left out so events stay newest first. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GoBolt Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gobolt Query live **GoBolt** (`gobolt`) package status and scan history in a single synchronous `GET` request or MCP tool call. 12-character numbers are shared with other carriers, so pass `?carrier=gobolt`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gobolt` | | **Brand aliases** | GoBolt, SecondCloset, Bolt | | **Category** | Last-mile and furniture delivery (Canada, US) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=100227881387,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. Tracking numbers are 12 characters with at least one digit, a shape FedEx and others also use, so `?carrier=gobolt` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/100227881387?carrier=gobolt" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gobolt", "trackingNumber": "100227881387", "status": "delivered", "statusDescription": "Package delivered", "service": null, "deliveredAt": "2026-08-18T13:10:32Z", "deliveredAtLocal": "2026-08-18T09:10:32", "signedBy": null, "destination": null, "estimatedDelivery": "2026-08-18T07:00:00", "events": [ { "timestamp": "2026-08-18T13:10:32Z", "localTime": "2026-08-18T09:10:32", "status": "delivered", "description": "Package delivered", "location": "Boucherville, Québec, Canada", "code": "label_delivered" }, { "timestamp": "2026-08-18T12:02:03Z", "localTime": "2026-08-18T08:02:03", "status": "out_for_delivery", "description": "Package has left warehouse", "location": "Boucherville, Québec, Canada", "code": "label_out_for_delivery" }, { "timestamp": "2026-08-17T16:17:49Z", "localTime": "2026-08-17T12:17:49", "status": "label_created", "description": "Shipment created", "location": null, "code": "label_created" } ] } ``` ## Notes - **Source**: the label endpoint behind gobolt.com's tracker. Scan times carry an offset, so `timestamp` is exact. - **Estimated delivery**: `estimatedDelivery` is the label's estimate, as local time. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GO! Express & Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/goexpress Query live **GO! Express & Logistics** (`goexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. 12-digit waybills are shared with other carriers, so pass `?carrier=goexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `goexpress` | | **Brand aliases** | GO! Express, GO! Express & Logistics, General Overnight, GO! | | **Category** | Parcel and pallet network (Germany, Austria, Luxembourg) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=068952795000,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. Waybills are 12 digits, a shape FedEx and others also use, so `?carrier=goexpress` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/068952795000?carrier=goexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "goexpress", "trackingNumber": "068952795000", "status": "delivered", "statusDescription": "Zustellung Empfänger", "service": null, "deliveredAt": "2026-10-12T07:31:00Z", "deliveredAtLocal": "2026-10-12T09:31:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-12T07:31:00Z", "localTime": "2026-10-12T09:31:00", "status": "delivered", "description": "Zustellung Empfänger", "location": "München", "code": null }, { "timestamp": "2026-10-12T05:12:00Z", "localTime": "2026-10-12T07:12:00", "status": "out_for_delivery", "description": "Beladung Zustelltour", "location": "München", "code": null }, { "timestamp": "2026-10-10T20:44:00Z", "localTime": "2026-10-10T22:44:00", "status": "in_transit", "description": "Beladung Hub-Linie", "location": "HUB Niederaula", "code": null } ] } ``` ## Notes - **Source**: the GO! tracking page is server-rendered; scans come from its "Auftrags-Historie" list. The page lists some deliveries twice, so identical scans are collapsed. - **Wording and time zone**: German scan titles. Times are the station's clock, read as `Europe/Berlin` (Germany, Austria and Luxembourg share it). - **Detail**: the page shows full delivery details only after the recipient's postcode is entered; the scan list does not need it. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GOFO Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gofo Query live **GOFO Express** (`gofo`) US last-mile package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 18-character `GFUS…` barcodes in Pass 1 and 15-character `GF…` barcodes in Pass 2, returning a normalized `TrackingResult` JSON payload—with zero carrier credentials or webhook registration required. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gofo` | | **Brand & service aliases** | GOFO Express, GOFO US Last-Mile, `GFUS` / `GF` | | **Category** | US regional e-commerce last-mile carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=GFUS...,GFUS...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for GOFO Express - **No shipper contract or webhook setup**: GOFO's merchant API is only provisioned to direct high-volume shippers and consolidators. `lastscanned` lets any e-commerce store, 3PL, or AI support agent query GOFO shipments synchronously via `GET /v1/track/GFUS01074503026309?carrier=gofo`. - **Fixes GOFO's hardcoded `-0700` timezone offset bug**: GOFO's upstream API prints each scan in the facility's local clock alongside an IANA `processTimeZone` (e.g. `America/New_York`), but hardcodes `-0700` on the timestamp string regardless of state. `lastscanned` strips the bogus offset and converts the scan's local clock using its true IANA timezone so `timestamp` (UTC) and `localTime` are always accurate. - **Strips boilerplate support footers**: GOFO appends *"For Delivery Issues & Tracking Support..."* to every delivered scan description; `lastscanned` strips this noise automatically. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) GOFO is evaluated **eighth (#8)** in `lastscanned`'s two-pass detector and supports both Pass 1 (`matches`) and Pass 2 (`mayMatch`): | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — Standard `GFUS`** | `/^GFUS\d{14}$/i` (`GFUS` + 14 digits = 18 chars) | — | `GFUS01074503026309`, `GFUS01092837465012` | | **Pass 2 (`mayMatch`) — Legacy `GF`** | `/^GF\d{13}$/i` (`GF` + 13 digits = 15 chars) | — | `GF6281904827163` | ### Disambiguating GOFO vs Cirro & YunExpress (`?carrier=gofo`) - **Auto-detected (`GFUS` + 14 digits and `GF` + 13 digits)**: No `?carrier=` parameter is needed. - **Querying GOFO by shipper number (`CR…` or `YT…`)**: GOFO's tracking system also indexes parcels by their upstream [Cirro](https://docs.lastscanned.com/carriers/cirro) (`CR` + 12 digits) or [YunExpress](https://docs.lastscanned.com/carriers/yunexpress) (`YT` + 16 digits) waybill numbers. Without `?carrier=gofo`, `CR…` routes to `cirro` and `YT…` routes to `yunexpress`. Pass `?carrier=gofo` if you want to query GOFO directly using the upstream shipper number. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/GFUS01074503026309?carrier=gofo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/GFUS01074503026309?carrier=gofo", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.destination, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "GFUS01074503026309" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "gofo", "trackingNumber": "GFUS01074503026309", "status": "delivered", "statusDescription": "Your package has been delivered, Left at Front Door", "service": "GOFO Standard", "deliveredAt": "2026-10-25T17:42:11Z", "deliveredAtLocal": "2026-10-25T13:42:11", "signedBy": null, "destination": { "city": "EDISON", "state": "NJ", "country": "US" }, "estimatedDelivery": null, "events": [ { "timestamp": "2026-10-25T17:42:11Z", "localTime": "2026-10-25T13:42:11", "status": "delivered", "description": "Your package has been delivered, Left at Front Door", "location": "EDISON, NJ", "code": "205" }, { "timestamp": "2026-10-25T12:15:08Z", "localTime": "2026-10-25T08:15:08", "status": "out_for_delivery", "description": "Your package is out for delivery", "location": "EDISON, NJ", "code": "208" }, { "timestamp": "2026-10-25T07:30:22Z", "localTime": "2026-10-25T03:30:22", "status": "in_transit", "description": "Arrived at GOFO Distribution Facility", "location": "NEWARK, NJ", "code": "201" }, { "timestamp": "2026-10-23T09:10:00Z", "localTime": "2026-10-23T05:10:00", "status": "label_created", "description": "Shipping label created, GOFO awaiting item", "location": null, "code": "100" } ] } ``` > **Raw status & process codes**: `events[].code` preserves GOFO's `processCode` (`"100"` → `label_created`, `"200"` loaded on vehicle, `"201"`/`"202"` arrived at station/hub, `"205"` → `delivered`, `"208"` → `out_for_delivery`, `"411"`/`"412"` → `in_transit`), while package-level statuses (`Processing`, `Transit`, `Delivered`, `Alert`, `Returned`) map cleanly to the 7 standard statuses. ## Carrier-Specific Status & Integration Notes - **CIRRO E-Commerce acquisition**: GOFO acquired [Cirro E-Commerce](https://docs.lastscanned.com/carriers/cirro) in 2026 and handles US last-mile delivery for Cirro parcels. You can track `GFUS…` numbers under `gofo` (default) or `cirro`. - **High-throughput batch support**: Up to 35 GOFO tracking numbers can be queried in a single batch call via `GET /v1/track?numbers=...`. ## Related Resources - **Live browser lookup tool**: [Track a GOFO Express package live on lastscanned.com/lookup/gofo](https://lastscanned.com/lookup/gofo) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # GOFO France Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gofofr Query live **GOFO France** (`gofofr`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `GFFR…` waybills. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gofofr` | | **Brand aliases** | GOFO France, GOFO FR, Gofo Express France, CIRRO Parcel | | **Category** | Domestic parcel delivery (France) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=PK-4948681651650700612-0,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^PK-?\d{19}-?\d$/` (the shipper reference `PK-<19 digits>-0`) | none | `PK-4948681651650700612-0` | `CIFR` plus 13 digits is CIRRO's (`cirro`), which also follows these parcels. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/PK-4948681651650700612-0?carrier=gofofr" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gofofr", "trackingNumber": "PK-4948681651650700612-0", "status": "delivered", "statusDescription": "Livré En boîte aux lettres, PIN: Non", "service": "CIRRO Parcel", "deliveredAt": "2026-06-18T10:08:37Z", "deliveredAtLocal": "2026-06-18T12:08:37", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-06-18T10:08:37Z", "localTime": "2026-06-18T12:08:37", "status": "delivered", "description": "Livré En boîte aux lettres, PIN: Non", "location": "ANTONY,HAUTS DE SEINE", "code": "205" }, { "timestamp": "2026-06-16T05:01:56Z", "localTime": "2026-06-16T07:01:56", "status": "out_for_delivery", "description": "Le chauffeur est en route pour la livraison", "location": "ANTONY", "code": "208" }, { "timestamp": "2026-06-11T18:55:57Z", "localTime": "2026-06-11T20:55:57", "status": "label_created", "description": "Votre colis est en cours de préparation par l'expéditeur", "location": null, "code": "100" } ] } ``` ## Notes - **Backend**: the JSON that `www.gofo.com/fr` calls (`open-api/official/track/queryTrackV2`). It is a different API from GOFO US (`gofo`). - **Numbers**: the GOFO waybill (`GFFR` + 13–14 digits) or the shipper's own reference. Scan times carry an offset, so `timestamp` is exact. - **Status**: mapped from GOFO's event codes (100 label created, 205 delivered, 206 delivery failed, 208 out for delivery); other codes are in transit. Wording is in the country's language. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GOFO Italy Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gofoit Query live **GOFO Italy** (`gofoit`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `GFIT…` waybills. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gofoit` | | **Brand aliases** | GOFO Italy, GOFO IT, Gofo Express Italia, CIRRO Parcel | | **Category** | Domestic parcel delivery (Italy) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=GFIT26104011851374,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(GF|CI)IT\d{13,14}$/` | none | `GFIT26104011851374` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/GFIT26104011851374?carrier=gofoit" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gofoit", "trackingNumber": "GFIT26104011851374", "status": "delivered", "statusDescription": "Consegnato da Consegnato al destinatario, PIN: No, Numero civico: -", "service": "CIRRO Parcel", "deliveredAt": "2026-05-14T07:36:04Z", "deliveredAtLocal": "2026-05-14T09:36:04", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-14T07:36:04Z", "localTime": "2026-05-14T09:36:04", "status": "delivered", "description": "Consegnato da Consegnato al destinatario, PIN: No, Numero civico: -", "location": "Cuneo,Piemonte", "code": "205" }, { "timestamp": "2026-05-13T15:59:58Z", "localTime": "2026-05-13T17:59:58", "status": "exception", "description": "Consegna fallita, tipo:Destinatario assente", "location": "Cuneo", "code": "206" }, { "timestamp": "2026-04-14T20:04:10Z", "localTime": "2026-04-14T22:04:10", "status": "label_created", "description": "Il pacco è in fase di preparazione da parte del mittente", "location": null, "code": "100" } ] } ``` ## Notes - **Backend**: the JSON that `www.gofo.com/it` calls (`open-api/official/track/queryTrackV2`). It is a different API from GOFO US (`gofo`). - **Numbers**: the GOFO waybill (`GFIT` + 13–14 digits) or the shipper's own reference. Scan times carry an offset, so `timestamp` is exact. - **Status**: mapped from GOFO's event codes (100 label created, 205 delivered, 206 delivery failed, 208 out for delivery); other codes are in transit. Wording is in the country's language. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GOFO Netherlands Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gofonl Query live **GOFO Netherlands** (`gofonl`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `GFNL…` waybills. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gofonl` | | **Brand aliases** | GOFO Netherlands, GOFO NL, Gofo Express Nederland, CIRRO Parcel | | **Category** | Domestic parcel delivery (Netherlands) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=GFNL26142036286842,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(GF|CI)NL\d{13,14}$/` | none | `GFNL26142036286842` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/GFNL26142036286842?carrier=gofonl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gofonl", "trackingNumber": "GFNL26142036286842", "status": "delivered", "statusDescription": "Bezorgd op het bezorgadres, PIN: Nee, Deurnummer: -", "service": "CIRRO Parcel", "deliveredAt": "2026-05-28T15:08:28Z", "deliveredAtLocal": "2026-05-28T17:08:28", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-28T15:08:28Z", "localTime": "2026-05-28T17:08:28", "status": "delivered", "description": "Bezorgd op het bezorgadres, PIN: Nee, Deurnummer: -", "location": null, "code": "205" }, { "timestamp": "2026-05-28T13:05:48Z", "localTime": "2026-05-28T15:05:48", "status": "out_for_delivery", "description": "Bezorger is onderweg", "location": null, "code": "208" }, { "timestamp": "2026-05-22T17:11:22Z", "localTime": "2026-05-22T19:11:22", "status": "label_created", "description": "Zending nog niet ontvangen of verwerkt", "location": null, "code": "100" } ] } ``` ## Notes - **Backend**: the JSON that `www.gofo.com/nl` calls (`open-api/official/track/queryTrackV2`). It is a different API from GOFO US (`gofo`). - **Numbers**: the GOFO waybill (`GFNL` + 13–14 digits) or the shipper's own reference. Scan times carry an offset, so `timestamp` is exact. - **Status**: mapped from GOFO's event codes (100 label created, 205 delivered, 206 delivery failed, 208 out for delivery); other codes are in transit. Wording is in the country's language. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GoGo Xpress Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gogoxpress Query live **GoGo Xpress** (`gogoxpress`) delivery status and scan history in a single synchronous `GET` request or MCP tool call. Numbers look like `AVVS-LADY-6E56`; pass `?carrier=gogoxpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gogoxpress` | | **Brand aliases** | GoGo Xpress, GoGoXpress, Gogo | | **Category** | On-demand and next-day delivery (Philippines) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=AVVS-LADY-6E56,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. Order numbers are three groups of four letters and digits, a shape other carriers (AxleHire) also use, so `?carrier=gogoxpress` is required. The dashes are added back when they are left out. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/AVVS-LADY-6E56?carrier=gogoxpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gogoxpress", "trackingNumber": "AVVS-LADY-6E56", "status": "delivered", "statusDescription": "Delivered: DELIVERED CNEE", "service": "same day pickup", "deliveredAt": "2026-02-12T08:42:38Z", "deliveredAtLocal": "2026-02-12T16:42:38", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-12T08:42:38Z", "localTime": "2026-02-12T16:42:38", "status": "delivered", "description": "Delivered: DELIVERED CNEE", "location": null, "code": "delivered" }, { "timestamp": "2026-02-12T00:07:58Z", "localTime": "2026-02-12T08:07:58", "status": "out_for_delivery", "description": "Out for delivery", "location": null, "code": "out_for_delivery" }, { "timestamp": "2026-02-10T09:12:23Z", "localTime": "2026-02-10T17:12:23", "status": "in_transit", "description": "Received at pickup hub: Received by PASIG HUB", "location": "Pasig Hub", "code": "received_at_pickup_hub" }, { "timestamp": "2026-02-10T01:26:17Z", "localTime": "2026-02-10T09:26:17", "status": "label_created", "description": "Booking Confirmed: Item/s will be picked up on 10 Feb 2026, Tue Please prepare your shipment to avoid delays.", "location": null, "code": "for_pickup" } ] } ``` ## Notes - **Source**: GoGo Xpress's tracking API groups scans by phase (booked, on the way, delivered, failed, returns); they are merged and sorted newest first. - **Time zone**: `status_updated_at` carries `+08`, applied as `+08:00` (the Philippines has no DST). Remarks relayed from partner couriers are shown after the status name. - **Failures**: `failed_pickup`, `failed_delivery` and similar statuses map to `exception`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Grand Slam Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/grandslamexpress Query live **Grand Slam Express** (`grandslamexpress`) shipment status, scan history and forwarding handoff in a single synchronous `GET` request or MCP tool call. AWB numbers are plain digits; pass `?carrier=grandslamexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `grandslamexpress` | | **Brand aliases** | Grand Slam Express, GSE India, grandslamexpress.in | | **Category** | Cross-border courier into India (import from China, forwarding to Indian carriers) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=915504406,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. AWB numbers are 9 digits, a shape too common to detect, so `?carrier=grandslamexpress` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/915504406?carrier=grandslamexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "grandslamexpress", "trackingNumber": "915504406", "status": "delivered", "statusDescription": "Packet has been DELIVERED", "service": null, "deliveredAt": null, "deliveredAtLocal": "2021-05-25T19:18:00", "signedBy": null, "destination": null, "message": "Handed to DTDC as 915504406", "events": [ { "timestamp": null, "localTime": "2021-05-25T19:18:00", "status": "delivered", "description": "Packet has been DELIVERED", "location": "New Delhi", "code": null }, { "timestamp": null, "localTime": "2021-05-25T16:42:00", "status": "in_transit", "description": "Update Forwarding No: 915504406 And Forwarding Party: DTDC", "location": "New Delhi", "code": null }, { "timestamp": null, "localTime": "2021-05-24T11:40:00", "status": "in_transit", "description": "Packet Received", "location": "New Delhi", "code": null }, { "timestamp": null, "localTime": "2021-05-14T12:52:00", "status": "in_transit", "description": "Shipment Received at HUB", "location": "Shenzhen(China)", "code": null } ] } ``` ## Notes - **Source**: the "Packet History" table returned by the track form's AJAX endpoint (date, location, activity). - **Time zone**: the table prints no zone and its facilities span India and China, so only `localTime` is set. - **Handoff**: an activity like `Update Forwarding No: … And Forwarding Party: DTDC` becomes `message`; pass that number to the partner carrier for its own scans. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GS Postbox Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gspostbox Query live **GS Postbox** (`gspostbox`) package status and scan history in a single synchronous `GET` request or MCP tool call. Invoice numbers are 10–12 digits, shared with other Korean carriers, so pass `?carrier=gspostbox`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gspostbox` | | **Brand aliases** | GS Postbox, GS25 Postbox, CVSnet, 편의점택배, GS반값택배 | | **Category** | Convenience-store parcel service (South Korea) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=210400000005,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. Invoice numbers are 10–12 digits (GS25 half-price parcels start `21`), a shape FedEx and Korean carriers share, so `?carrier=gspostbox` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/210400000005?carrier=gspostbox" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gspostbox", "trackingNumber": "210400000005", "status": "delivered", "statusDescription": "고객에게 전달", "service": "반값택배", "deliveredAt": "2026-07-30T12:24:05Z", "deliveredAtLocal": "2026-07-30T21:24:05", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-07-30T12:24:05Z", "localTime": "2026-07-30T21:24:05", "status": "delivered", "description": "고객에게 전달", "location": "GS25뉴동인3가점", "code": "C11" }, { "timestamp": "2026-07-30T05:45:11Z", "localTime": "2026-07-30T14:45:11", "status": "exception", "description": "점포에 도착", "location": "GS25뉴동인3가점", "code": "C10" }, { "timestamp": "2026-07-27T00:13:09Z", "localTime": "2026-07-27T09:13:09", "status": "in_transit", "description": "점포에서 접수", "location": "GS25용인서천마을점", "code": "C01" } ] } ``` ## Notes - **Source**: cvsnet.co.kr's invoice page embeds the scans as JSON in a `trackingInfo` script variable. - **Status**: `C11` (handed to the customer) is delivered; `C10` (arrived at the destination store, waiting for the customer) is shown as `exception`, the API's "ready for pick-up" convention. - **Time zone**: scan times have no offset and are read as `Asia/Seoul`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GTA AirSkip Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gtaairskip Query live **GTA AirSkip** (`gtaairskip`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `GRS…` and `GRG…` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gtaairskip` | | **Brand aliases** | GTA AirSkip, AirSkip, GTA Global Supply Chain, GTA GSM | | **Category** | Cross-border and domestic parcel delivery (Canada) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=GRS018564KS2BEG9YC8,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^GR[GS]\d{5}[0-9A-Z]{11}$/` | none | `GRS018564KS2BEG9YC8` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/GRS018564KS2BEG9YC8?carrier=gtaairskip" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gtaairskip", "trackingNumber": "GRS018564KS2BEG9YC8", "status": "delivered", "statusDescription": "Completed Unloading at Delivery Location: Normal Status", "service": "Select", "deliveredAt": null, "deliveredAtLocal": "2025-01-13T20:52:16", "signedBy": null, "destination": { "city": "Montreal", "state": null, "country": null }, "events": [ { "timestamp": null, "localTime": "2025-01-13T20:52:16", "status": "delivered", "description": "Completed Unloading at Delivery Location: Normal Status", "location": "Montréal, QC", "code": null }, { "timestamp": null, "localTime": "2025-01-13T15:11:40", "status": "out_for_delivery", "description": "Loaded on Truck: Normal Status", "location": "Montréal, QC", "code": null }, { "timestamp": null, "localTime": "2025-01-11T18:30:20", "status": "in_transit", "description": "Received at sort hub", "location": null, "code": null }, { "timestamp": null, "localTime": "2025-01-10T14:33:14", "status": "label_created", "description": "Label Created", "location": null, "code": null } ] } ``` ## Notes - **Source**: the portal's `track-my-package` API with history; the portal's own account key (`Portal`) is sent. - **Location**: the place is the start of each event's description (`Winnipeg, MB. Normal Status`). - **Time zone**: event times have no offset and the API does not say which zone they are in, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # GoTo Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gtlgoto Query live **GoTo Logistics** (`gtlgoto`) shipment status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `GTL…` and `TKGTL…` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gtlgoto` | | **Brand aliases** | GoTo Logistics, GTL, GTL Express, gtl.id | | **Category** | Domestic parcel logistics (Indonesia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=GTL7100971618,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(TKGTL[0-9A-Z]{11}|GTL\d{10})$/` | none | `GTL7100971618` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/GTL7100971618?carrier=gtlgoto" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "gtlgoto", "trackingNumber": "GTL7100971618", "status": "delivered", "statusDescription": "Paket sudah sampai dan diterima oleh Penerima sendiri.", "service": "REG", "deliveredAt": null, "deliveredAtLocal": "2026-05-16T09:52:50", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-05-16T09:52:50", "status": "delivered", "description": "Paket sudah sampai dan diterima oleh Penerima sendiri.", "location": "GTL Tasikmalaya Kota Hub", "code": "signed_personally" }, { "timestamp": null, "localTime": "2026-05-16T07:52:00", "status": "out_for_delivery", "description": "Kurir sedang menuju lokasi pengantaran.", "location": "GTL Tasikmalaya Kota Hub", "code": "delivery_start" }, { "timestamp": null, "localTime": "2026-05-15T05:43:24", "status": "in_transit", "description": "Paket sudah berangkat dari Kosambi Sorting Center.", "location": "Kosambi Sorting Center", "code": "sc_outbound" }, { "timestamp": null, "localTime": "2026-05-14T11:41:06", "status": "label_created", "description": "Pesanan akan segera dipickup oleh kurir.", "location": "GTL Tambora Hub", "code": null } ] } ``` ## Notes - **Source**: the JSON behind gtl.id's tracking page. An unknown number is HTTP 422 with code `5413`. - **Status**: from the platform status of each step (`delivered`, `out_for_delivery`, `ready_for_pickup`), since one `status_code` can carry different wording. - **Time zone**: step times have no offset, and Indonesia has three zones, so only `localTime` is set. Driver names and phone numbers in the raw data are not returned. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Tianhai Supply Chain Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gzbtygj Query live **Tianhai Supply Chain** (`gzbtygj`) package status and scan history in a single synchronous `GET` request or MCP tool call. Tianhai Supply Chain numbers share their shape with other carriers' numbers, so pass `?carrier=gzbtygj`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gzbtygj` | | **Brand aliases** | Tianhai Supply Chain, 天海供应链 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=gzbtygj` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=gzbtygj` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Tianhai Supply Chain tracking numbers have no shape of their own, so always pass `?carrier=gzbtygj`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Tianhai Supply Chain in one request. - **Platform**: Tianhai Supply Chain runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # YouMeiYuTong Tracking API & MCP URL: https://docs.lastscanned.com/carriers/gzymyt Query live **YouMeiYuTong** (`gzymyt`) package status and scan history in a single synchronous `GET` request or MCP tool call. YouMeiYuTong numbers share their shape with other carriers' numbers, so pass `?carrier=gzymyt`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `gzymyt` | | **Brand aliases** | YouMeiYuTong, 优美宇通 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=gzymyt` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=gzymyt` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | YouMeiYuTong tracking numbers have no shape of their own, so always pass `?carrier=gzymyt`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to YouMeiYuTong in one request. - **Platform**: YouMeiYuTong runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Hanjin Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hanjin Query live **Hanjin** (`hanjin`) package status and scan history in a single synchronous `GET` request or MCP tool call. Hanjin is a South Korean domestic parcel carrier; lookups read its public waybill page. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hanjin` | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=hanjin` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=N1,N2&carrier=hanjin` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Examples | |---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | | **Explicit (`?carrier=hanjin`)** | 10- or 12-digit waybill | `520695602044` | This shape is shared with other carriers, so always pass `?carrier=hanjin`. Scan times are Korean local time (`Asia/Seoul`). ## Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/520695602044?carrier=hanjin" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hanjin", "trackingNumber": "520695602044", "status": "in_transit", "statusDescription": "In transit", "service": null, "deliveredAt": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-25T14:22:00", "status": "in_transit", "description": "In transit", "location": "Hub", "code": null } ] } ``` ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Happy-Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/happypost Query live **Happy-Post** (`happypost`) parcel status, steps and carrier handoff in a single synchronous `GET` request or MCP tool call. Numbers are 7–8 digits; pass `?carrier=happypost`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `happypost` | | **Brand aliases** | Happy-Post, HappyPost, Happy Post | | **Category** | Cross-border parcel forwarding (France, UK) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=10507830,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. Parcel numbers are 8 digits (7 are also issued), a shape too common to detect, so `?carrier=happypost` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/10507830?carrier=happypost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "happypost", "trackingNumber": "10507830", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2021-12-20T10:44:00", "signedBy": null, "destination": null, "message": "Handed to Chronopost as 10507830", "events": [ { "timestamp": null, "localTime": "2021-12-20T10:44:00", "status": "delivered", "description": "Delivered", "location": null, "code": "delivered" }, { "timestamp": null, "localTime": "2021-12-18T08:01:00", "status": "in_transit", "description": "Arrived in destination country", "location": null, "code": "international-arrival" }, { "timestamp": null, "localTime": "2021-12-15T13:48:57", "status": "in_transit", "description": "Collected", "location": null, "code": "collected" }, { "timestamp": null, "localTime": "2021-12-15T11:58:08", "status": "label_created", "description": "Label created", "location": null, "code": "ordered" } ] } ``` ## Notes - **Source**: Happy-Post's tracking JSON lists the journey steps in order; steps with no time yet are skipped. - **Handoff**: the `collected` step's `tracking_url` holds the Chronopost number, returned as `message`. - **Time zone**: timestamps have no offset, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # HayPost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/haypost Query live **HayPost** (`haypost`) mail status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending in `AM`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `haypost` | | **Brand aliases** | HayPost, Haypost Armenia, Armenia Post, Հայփոստ | | **Category** | National post (Armenia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CC003145018AM,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `S10 *AM` with a valid check digit (`/^[A-Z]{2}\d{9}AM$/`) | S10 | `CC003145018AM` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CC003145018AM?carrier=haypost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "haypost", "trackingNumber": "CC003145018AM", "status": "delivered", "statusDescription": "Deliver item (Inb)", "service": null, "deliveredAt": "2026-03-31T09:54:49Z", "deliveredAtLocal": "2026-03-31T13:54:49", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-31T09:54:49Z", "localTime": "2026-03-31T13:54:49", "status": "delivered", "description": "Deliver item (Inb)", "location": "Home Delivery Office, Armenia", "code": null }, { "timestamp": "2026-03-30T13:11:57Z", "localTime": "2026-03-30T17:11:57", "status": "exception", "description": "The notification was sent to the customer: Addressee not available; Scheduled for further action/processing today", "location": "Home Delivery Office, Armenia", "code": null }, { "timestamp": "2026-03-30T11:45:37Z", "localTime": "2026-03-30T15:45:37", "status": "in_transit", "description": "Send item to customs (Inb)", "location": "YEREVAN, Armenia", "code": null } ] } ``` ## Notes - **Source**: the `trackingNumber` endpoint of HayPost's own API (the one its track page calls). A number it rejects ("Not Valid Tracking Number Format") or has no scans for is reported as not found. - **Time zone**: events in Armenia are read as `Asia/Yerevan` (UTC+4, no DST); events in other countries keep `localTime` only. - **Customs**: "Send item to customs" and "Return item from customs" are `in_transit` scans, not exceptions. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # HCT Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hct Query live **HCT Logistics** (`hct`, Taiwan) package status and station-by-station scan history in a single synchronous `GET` request or MCP tool call. HCT's 10-digit numbers share a shape with DHL waybills, so pass `?carrier=hct`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hct` | | **Brand aliases** | HCT, HCT Logistics, Hsinchu Transport, 新竹物流, 新竹貨運 | | **Category** | Regional parcels (Taiwan) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=hct` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=hct` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | HCT 查貨碼 numbers are 10 digits and any 10-digit number can name some parcel, so `?carrier=hct` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/4792713601?carrier=hct" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hct", "trackingNumber": "4792713601", "status": "delivered", "statusDescription": "貨件已由西屯集配站送達。貨物件數共1件。", "service": null, "deliveredAt": "2026-08-19T06:14:00Z", "deliveredAtLocal": "2026-08-19T14:14:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-08-19T06:14:00Z", "localTime": "2026-08-19T14:14:00", "status": "delivered", "description": "貨件已由西屯集配站送達。貨物件數共1件。", "location": "西屯集配站", "code": null }, { "timestamp": "2026-08-18T23:56:00Z", "localTime": "2026-08-19T07:56:00", "status": "out_for_delivery", "description": "貨件由西屯集配站人員配送中。", "location": "西屯集配站", "code": null }, { "timestamp": "2026-08-18T19:38:00Z", "localTime": "2026-08-19T03:38:00", "status": "in_transit", "description": "貨件由西屯集配站保管中。", "location": "西屯集配站", "code": null } ] } ``` ## Notes - **Wording**: HCT sends no status codes, so its Traditional Chinese wording is mapped (送達 delivered, 配送中 out for delivery, 取件中 pickup scheduled, 無人接聽 or 異常 exception, 退回 returned). `location` is the station named in the scan. - **Time zone**: Taiwan time (UTC+8). - **Not found**: a number HCT has no record of (the page says 查無此配送資料) is `not_found`. - **How it is queried**: HCT's mobile web app pages (`/app/searchGoods_index.aspx`), which have no captcha step; the lookup is a short form post followed by a read of the result page. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Helthjem Tracking API & MCP URL: https://docs.lastscanned.com/carriers/helthjem Query live **Helthjem** (`helthjem`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects Helthjem's 18-digit parcel numbers (SSCC, with or without the leading `00`). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `helthjem` | | **Brand aliases** | Helthjem, Helthjem Norway, Helthjem.no | | **Category** | Home-delivery parcel service (Norway) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=370724763559618351,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(00)?37072476\d{10}$/` with a valid GS1 check digit | GS1 | `370724763559618351` | | **Pass 2 (`mayMatch`)** | none | none | none | The 17-digit shipment number is also accepted with `?carrier=helthjem`. Bring's looser `370…` mayMatch rule loses to Helthjem's checked range. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/370724763559618351?carrier=helthjem" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "helthjem", "trackingNumber": "370724763559618351", "status": "delivered", "statusDescription": "Pakken er levert på dørmatten din!", "service": null, "deliveredAt": "2026-09-24T00:47:59Z", "deliveredAtLocal": "2026-09-24T02:47:59", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-09-24T00:47:59Z", "localTime": "2026-09-24T02:47:59", "status": "delivered", "description": "Pakken er levert på dørmatten din!", "location": null, "code": "013" }, { "timestamp": "2026-09-23T08:29:02Z", "localTime": "2026-09-23T10:29:02", "status": "out_for_delivery", "description": "Planlagt levering natt til 24. september!", "location": null, "code": "113" }, { "timestamp": "2026-09-22T15:18:23Z", "localTime": "2026-09-22T17:18:23", "status": "in_transit", "description": "Vi har mottatt pakken din, og gjør den klar for veien videre.", "location": "Vestby", "code": "002" }, { "timestamp": "2026-09-16T20:45:14Z", "localTime": "2026-09-16T22:45:14", "status": "label_created", "description": "Nettbutikken har meldt at en pakke er på vei!", "location": null, "code": "001" } ] } ``` ## Notes - **Source**: the GraphQL (`GetTracking`) that Helthjem's tracking page calls, taking the SSCC or the shipment number. - **Status**: `REGISTERED`, `IN_TRANSIT`, `DELIVERING` (planned delivery tonight) and `DELIVERED`; other names fall back to their wording. - **Time zone**: event times carry an offset, so `timestamp` is exact. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # HepsiJET Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hepsijet Query live **HepsiJET** (`hepsijet`) delivery status and scan history in a single synchronous `GET` request or MCP tool call. Numbers are 12 characters; pass `?carrier=hepsijet`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hepsijet` | | **Brand aliases** | HepsiJET, Hepsijet, Hepsiburada Lojistik | | **Category** | E-commerce courier (Turkey) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=G5R6ICGIASHJ,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. Delivery numbers are 12 letters and digits, a shape other carriers use too, so `?carrier=hepsijet` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/G5R6ICGIASHJ?carrier=hepsijet" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hepsijet", "trackingNumber": "G5R6ICGIASHJ", "status": "delivered", "statusDescription": "Teslim edildi - Ali V***** (Kendi)", "service": "Standart Teslimat", "deliveredAt": "2026-10-10T14:16:52Z", "deliveredAtLocal": "2026-10-10T17:16:52", "signedBy": null, "destination": { "city": "İzmir", "state": null, "country": "TR" }, "estimatedDelivery": "2026-10-10T23:59:59", "events": [ { "timestamp": "2026-10-10T14:16:52Z", "localTime": "2026-10-10T17:16:52", "status": "delivered", "description": "Teslim edildi - Ali V***** (Kendi)", "location": "Alıcıda", "code": "DELIVERED" }, { "timestamp": "2026-10-10T08:27:36Z", "localTime": "2026-10-10T11:27:36", "status": "out_for_delivery", "description": "Kurye Dağıtıma Çıktı", "location": "Güzelbahçe Dağıtım Merkezi", "code": "DELIVERING" }, { "timestamp": "2026-10-09T06:50:56Z", "localTime": "2026-10-09T09:50:56", "status": "in_transit", "description": "Gönderi Alındı", "location": "Bodrum Dağıtım Merkezi", "code": "COLLECTED" } ] } ``` ## Notes - **Route**: `website-backend.hepsijet.com` is protected by Akamai bot challenges on direct datacenter requests; `lastscanned` handles session negotiation and returns normalized JSON. - **Status**: from `deliveryStatus` (`WAITING_FOR_DISPATCH`, `COLLECTING`, `COLLECTED`, `TRANSFERRING_TRANSFER`, `DISPATCHING`, `DELIVERING`, `DELIVERED`). Recipient names in the API are already masked. - **Time zone**: times carry `+03:00`, so `timestamp` is exact. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Hermes Austria Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hermesat Query live **Hermes Austria** (`hermesat`) package status and scan history in a single synchronous `GET` request or MCP tool call. 14-digit numbers are shared with other carriers, so pass `?carrier=hermesat`. This is a different network from Hermes Germany (`hermesde`). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hermesat` | | **Brand aliases** | Hermes Austria, Hermes Österreich, myhermes.at, Hermes AT | | **Category** | Parcel delivery (Austria) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=02271189000077,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. Numbers are 14 digits with a mod-10 check digit, a shape DPD and others also use, so `?carrier=hermesat` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/02271189000077?carrier=hermesat" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hermesat", "trackingNumber": "02271189000077", "status": "delivered", "statusDescription": "Sendung von Post-Abholstation abgeholt", "service": null, "deliveredAt": "2026-10-05T06:08:08Z", "deliveredAtLocal": "2026-10-05T08:08:08", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-05T06:08:08Z", "localTime": "2026-10-05T08:08:08", "status": "delivered", "description": "Sendung von Post-Abholstation abgeholt", "location": "Österreich", "code": null }, { "timestamp": "2026-10-02T09:41:47Z", "localTime": "2026-10-02T11:41:47", "status": "exception", "description": "Sendung in Abholstation eingelangt", "location": "Österreich", "code": null }, { "timestamp": "2026-10-02T05:27:46Z", "localTime": "2026-10-02T07:27:46", "status": "out_for_delivery", "description": "Sendung in Zustellung", "location": "Österreich", "code": null }, { "timestamp": "2026-09-28T07:16:17Z", "localTime": "2026-09-28T09:16:17", "status": "label_created", "description": "Sendung wurde Hermes elektronisch angekündigt", "location": "Österreich", "code": null } ] } ``` ## Notes - **Source**: the "Sendungsverlauf im Detail" table of the myhermes.at tracking page (`/sendungsverfolgung/trackingnummer/`). - **Status**: "in Zustellung" is out for delivery; "in Abholstation eingelangt" (waiting at a pick-up station) is shown as `exception`; "abgeholt", "zugestellt" and "übergeben" are delivered. - **Time zone**: times are read as `Europe/Vienna`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Hermes Germany Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hermesde Query live **Hermes Germany** (`hermesde`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` reads the JSON behind myhermes.de's Sendungsverfolgung. Hermes numbers share their shape with other carriers, so pass `?carrier=hermesde`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hermesde` | | **Brand & service aliases** | Hermes Germany, Hermes Deutschland, myHermes, Hermes Logistik | | **Category** | National parcel carrier (Germany) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=hermesde`) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=H1028030626845901017,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=hermesde`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | | **Explicit (`?carrier=hermesde`)** | 14-digit numbers and 20-character alphanumeric numbers | None | `H1028030626845901017` | ### When is `?carrier=hermesde` optional vs required? - **Required (`?carrier=hermesde`)**: always. Hermes' number shapes are also used by other carriers. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/H1028030626845901017?carrier=hermesde" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/H1028030626845901017?carrier=hermesde", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "H1028030626845901017", "carrier": "hermesde" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "hermesde", "trackingNumber": "H1028030626845901017", "status": "delivered", "statusDescription": "Die Sendung wurde zugestellt", "service": null, "deliveredAt": "2026-10-22T07:15:00Z", "deliveredAtLocal": "2026-10-22T09:15:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-22T07:15:00Z", "localTime": "2026-10-22T09:15:00", "status": "delivered", "description": "Die Sendung wurde zugestellt", "location": null, "code": "DELIVERED" }, { "timestamp": "2026-10-20T08:00:00Z", "localTime": "2026-10-20T10:00:00", "status": "label_created", "description": "Die Sendung wurde vom Versender angekündigt", "location": null, "code": "ANNOUNCED" } ] } ``` ## Notes - Uses `api.my-deliveries.de/tnt/v2/shipments/search/{number}`, the endpoint the Hermes tracking bundle calls. An unknown number answers an empty 404. - Event descriptions are in German, as Hermes publishes them. A time with no offset is read as Europe/Berlin. - If Hermes reports a newer related barcode, `message` names it. ## Related Resources - **Live browser lookup tool**: [Track a Hermes Germany package live on lastscanned.com/lookup/hermesde](https://lastscanned.com/lookup/hermesde) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Hispapost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hispapost Query live **Hispapost** (`hispapost`) parcel status in a single synchronous `GET` request or MCP tool call. Barcodes are free-form letters and digits, so pass `?carrier=hispapost`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hispapost` | | **Brand aliases** | Hispapost, Hispapost Spain, Grupo Hispapost | | **Category** | Parcel and mail delivery (Spain) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CNES01102880652,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^CNES\d{11}$/` | none | `CNES01102880652` | Barcodes are 6–40 letters and digits (`CNES…`, `BAE…`, Temu's `BG…`), too loose to detect except the `CNES` shape. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CNES01102880652?carrier=hispapost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hispapost", "trackingNumber": "CNES01102880652", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": "2024-03-07T10:44:00Z", "deliveredAtLocal": "2024-03-07T11:44:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2024-03-07T10:44:00Z", "localTime": "2024-03-07T11:44:00", "status": "delivered", "description": "Entregado", "location": null, "code": null } ] } ``` ## Notes - **Source**: the "Localizador de envíos" form is a Rails form: `lastscanned` loads it for a session cookie and CSRF token, then posts the barcode. The page answers with the state and its date. - **Single event**: Hispapost shows the latest state, not a scan list, so there is one event. An unknown barcode is HTTP 422. - **Time zone**: the date is read as `Europe/Madrid`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # HLSZ56 Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hlsz56 Query live **HLSZ56** (`hlsz56`) package status and scan history in a single synchronous `GET` request or MCP tool call. HLSZ56 numbers share their shape with other carriers' numbers, so pass `?carrier=hlsz56`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hlsz56` | | **Brand aliases** | HLSZ56, 华磊深圳速递 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=hlsz56` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=hlsz56` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | HLSZ56 tracking numbers have no shape of their own, so always pass `?carrier=hlsz56`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to HLSZ56 in one request. - **Platform**: HLSZ56 runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Hongkong Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hongkongpost Query live **Hongkong Post** (`hongkongpost`) mail status in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending in `HK`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hongkongpost` | | **Brand aliases** | Hongkong Post, Hong Kong Post, HKPost, 香港郵政 | | **Category** | National post (Hong Kong) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=LP157079155HK,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `S10 *HK` with a valid check digit (`/^[A-Z]{2}\d{9}HK$/`) | S10 | `LP157079155HK` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/LP157079155HK?carrier=hongkongpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hongkongpost", "trackingNumber": "LP157079155HK", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-06-25T02:27:00Z", "deliveredAtLocal": "2026-06-25T10:27:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-06-25T02:27:00Z", "localTime": "2026-06-25T10:27:00", "status": "delivered", "description": "Delivered", "location": null, "code": null } ] } ``` ## Notes - **Source**: Hongkong Post's web chatbot ("Talk2Elain"). `lastscanned` opens a chat session, walks its menu (English, mail tracing, tracking) and sends the number; the reply states the latest status and its time. - **Single event**: the chatbot gives only the latest status, so there is one event. "The system has no record of the mail item" is reported as not found. - **Time zone**: the time is read as `Asia/Hong_Kong`. Each lookup uses ten small requests, so allow a couple of seconds. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Horoz Lojistik Tracking API & MCP URL: https://docs.lastscanned.com/carriers/horoz Query live **Horoz Lojistik** (`horoz`) waybill status, movement history and delivery time in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `horoz` | | **Brand aliases** | Horoz Lojistik, Horoz Logistics, Horoz ATF | | **Category** | Turkish freight and parcel logistics | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=horoz` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=24982563748000,...&carrier=horoz` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ATF numbers are 14 digits, a shape other carriers use too, so pass `?carrier=horoz`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/24982563748000?carrier=horoz" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "horoz", "trackingNumber": "24982563748000", "status": "delivered", "statusDescription": "Teslim edildi", "service": null, "deliveredAt": "2026-10-16T10:25:37Z", "deliveredAtLocal": "2026-10-16T13:25:37", "signedBy": null, "destination": { "city": "KARAPÜRÇEK", "state": "SAKARYA", "country": "TR" }, "message": null, "events": [ { "timestamp": "2026-10-16T10:25:37Z", "localTime": "2026-10-16T13:25:37", "status": "delivered", "description": "Teslim edildi", "location": "KARAPÜRÇEK, SAKARYA", "code": "Teslim" }, { "timestamp": "2026-10-15T23:13:31Z", "localTime": "2026-10-16T02:13:31", "status": "in_transit", "description": "Çıkış (varış: DÜZCE)", "location": "DÜZCE", "code": "Çıkış" } ] } ``` ## Notes - **Wording**: descriptions are Turkish: `Çıkış` (departed a centre, with the next centre), `Giriş` (arrived), `Teslim edildi` (delivered). `code` holds the carrier's own word. - **Time zone**: scan times are Turkey time (UTC+3), converted to `timestamp`. - **Masked data**: Horoz masks sender and recipient names, so `signedBy` is `null`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Hovership Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hovership Query live **Hovership** (`hovership`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=hovership` unless the number is `HV` plus 8 characters and no other carrier claims it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hovership` | | **Brand aliases** | Hovership, Hovership Delivery | | **Category** | Last-mile delivery (United States) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=HVUB47RTK3,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^HV[A-Z0-9]{8}$/` | none | `HVUB47RTK3` | Only tried when no carrier claims the number. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/HVUB47RTK3?carrier=hovership" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hovership", "trackingNumber": "HVUB47RTK3", "status": "delivered", "statusDescription": "Delivered: Delivered to Front Door", "service": null, "deliveredAt": "2026-09-09T21:15:00Z", "deliveredAtLocal": "2026-09-09T14:15:00", "signedBy": null, "destination": { "city": "Bay Point", "state": "CA", "country": "US" }, "events": [ { "timestamp": "2026-09-09T21:15:00Z", "localTime": "2026-09-09T14:15:00", "status": "delivered", "description": "Delivered: Delivered to Front Door", "location": null, "code": null }, { "timestamp": "2026-09-09T17:09:00Z", "localTime": "2026-09-09T10:09:00", "status": "out_for_delivery", "description": "Out for Delivery: Shipment scanned out for delivery", "location": null, "code": null }, { "timestamp": "2026-09-09T00:07:00Z", "localTime": "2026-09-08T17:07:00", "status": "label_created", "description": "Label Created: Shipment label created", "location": null, "code": null } ] } ``` ## Notes - **Source**: the server-rendered tracking page (`/track//`). Each time ends in a US zone abbreviation (`PDT`, `CST`, …), which is converted to its offset so `timestamp` is exact. - **Privacy**: the page keeps the street address and proof of delivery behind a ZIP check; they are not read. The destination is the city and state it prints. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # HOYANG Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hoyang Query live **HOYANG Express** (`hoyang`) package status and scan history in a single synchronous `GET` request or MCP tool call. HOYANG Express numbers share their shape with other carriers' numbers, so pass `?carrier=hoyang`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hoyang` | | **Brand aliases** | HOYANG Express, 弘扬物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=hoyang` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=hoyang` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | HOYANG Express tracking numbers have no shape of their own, so always pass `?carrier=hoyang`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to HOYANG Express in one request. - **Platform**: HOYANG Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Heping Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hpgjwl Query live **Heping Logistics** (`hpgjwl`) package status and scan history in a single synchronous `GET` request or MCP tool call. Heping Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=hpgjwl`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hpgjwl` | | **Brand aliases** | Heping Logistics, 禾平物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=hpgjwl` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=hpgjwl` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Heping Logistics tracking numbers have no shape of their own, so always pass `?carrier=hpgjwl`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Heping Logistics in one request. - **Platform**: Heping Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # HR Parcel Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hrparcel Query live **HR Parcel** (`hrparcel`) shipment status and scan history in a single synchronous `GET` request or MCP tool call. 14-digit barcodes are shared with other carriers, so pass `?carrier=hrparcel`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hrparcel` | | **Brand aliases** | HR Parcel, HRParcel, HR Parcel Italia | | **Category** | Parcel delivery (Italy) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=16067000034640,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier is not auto-detected. Barcodes are 14 digits starting `16`, a shape other carriers also use, so `?carrier=hrparcel` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/16067000034640?carrier=hrparcel" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hrparcel", "trackingNumber": "16067000034640", "status": "delivered", "statusDescription": "Spedizione Consegnata", "service": null, "deliveredAt": "2024-05-31T11:13:58Z", "deliveredAtLocal": "2024-05-31T13:13:58", "signedBy": "MARIO ROSSI", "destination": null, "events": [ { "timestamp": "2024-05-31T11:13:58Z", "localTime": "2024-05-31T13:13:58", "status": "delivered", "description": "Spedizione Consegnata", "location": "Reggio nell'Emilia RE (RE)", "code": "1003" }, { "timestamp": "2024-05-31T06:20:58Z", "localTime": "2024-05-31T08:20:58", "status": "out_for_delivery", "description": "In Consegna", "location": "REGGIO EMILIA (RE)", "code": "1002" }, { "timestamp": "2024-05-30T12:56:34Z", "localTime": "2024-05-30T14:56:34", "status": "in_transit", "description": "Presa in carico all'HUB", "location": null, "code": "1001" }, { "timestamp": "2024-05-29T01:45:33Z", "localTime": "2024-05-29T03:45:33", "status": "label_created", "description": "Spedizione non ancora ricevuta presso i nostri magazzini", "location": null, "code": "1000" } ] } ``` ## Notes - **Source**: the WordPress `admin-ajax.php` action behind hrparcel.com's tracking box. An unknown barcode returns an empty shipment. - **Status**: from HR Parcel's codes: 1000 not yet received, 1001/1010 in transit, 1002 out for delivery, 1003 delivered. - **Time zone**: scan times are read as `Europe/Rome`. `signedBy` is the signatory on the delivery scan when it is a name (not "mano", by hand). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Hrvatska pošta Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hrvatskaposta Query live **Hrvatska pošta** (`hrvatskaposta`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hrvatskaposta` | | **Brand aliases** | Hrvatska pošta, Croatian Post, HP, posta.hr | | **Category** | Croatian national post (UPU S10 mail) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("HR")`: two letters + 9 digits + `HR`, valid S10 check digit | S10 mod 11 | `RG229353469HR` | | **Pass 2 (`mayMatch`)** | none | none | none | `Hrvatska pošta` numbers are claimed by `hrvatskaposta`, so `?carrier=hrvatskaposta` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RG229353469HR?carrier=hrvatskaposta" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hrvatskaposta", "trackingNumber": "RG229353469HR", "status": "delivered", "statusDescription": "Item delivered", "service": null, "deliveredAt": "2024-03-05T11:13:00Z", "deliveredAtLocal": "2024-03-05T12:13:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2024-03-05T11:13:00Z", "localTime": "2024-03-05T12:13:00", "status": "delivered", "description": "Item delivered", "location": null, "code": null }, { "timestamp": null, "localTime": "2024-03-02T00:39:00", "status": "in_transit", "description": "Item received in destination country", "location": "MADRID AP", "code": null }, { "timestamp": "2024-02-25T01:12:21Z", "localTime": "2024-02-25T02:12:21", "status": "in_transit", "description": "Item sent", "location": "ZAGREB", "code": null }, { "timestamp": "2024-02-23T12:25:35Z", "localTime": "2024-02-23T13:25:35", "status": "in_transit", "description": "Item received", "location": "ILOK", "code": null } ] } ``` ## Notes - **Time zone**: scans at a Croatian office (and the final delivery) are Croatian time (`Europe/Zagreb`) and `timestamp` is converted from it. Scans at a foreign office (for example `ESMADB`, Madrid) keep only `localTime`, as printed. - **Not found**: a number the page rejects (`Invalid barcode format`, including a wrong S10 check digit) or one with no scans returns `404 not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # HSD Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hsdex Query live **HSD Express** (`hsdex`) package status and scan history in a single synchronous `GET` request or MCP tool call. HSD Express numbers share their shape with other carriers' numbers, so pass `?carrier=hsdex`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hsdex` | | **Brand aliases** | HSD Express, 鸿盛达国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=hsdex` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=hsdex` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | HSD Express tracking numbers have no shape of their own, so always pass `?carrier=hsdex`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to HSD Express in one request. - **Platform**: HSD Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # HuaHan Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/huahan Query live **HuaHan Logistics** (`huahan`) package status, scan history, and the **destination carrier's tracking number** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `HHW…YQ` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `huahan` | | **Brand aliases** | HuaHan, HuaHan Logistics, 华翰物流, hh-exp | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=HHW...,HHW...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^HHW[A-Z]{2}\d{10}[A-Z]{2}$/` | none | `HHWWD6248490101YQ` | | **Pass 2 (`mayMatch`)** | none | none | none | `HHW` numbers belong to HuaHan alone, so `?carrier=huahan` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/HHWWD6248490101YQ?carrier=huahan" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "huahan", "trackingNumber": "HHWWD6248490101YQ", "status": "in_transit", "statusDescription": "Arrived at origin facility", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": "Handed to USPS as HHWWD6248490101YQ", "events": [ { "timestamp": null, "localTime": "2026-10-05T14:26:15", "status": "in_transit", "description": "Arrived at origin facility", "location": "SHENZHEN", "code": "AF" }, { "timestamp": null, "localTime": "2026-10-05T14:07:43", "status": "label_created", "description": "Shipment information received", "location": "CHINA", "code": "IR" } ] } ``` ## Notes - **Handoff**: `message` names the delivery partner and its number (for example `"Handed to USPS as HHWWD6248490101YQ"`). Pass that number to `GET /v1/track/{number}` for the partner's own scans. The `_D104`-style suffix HuaHan appends is dropped. - **Verification step**: HuaHan's tracking page asks a simple arithmetic question (such as "12 + 5 = ?") before it looks a number up. This carrier answers it with a strict parser (two whole numbers and `+`, `-` or `×`); anything else is a failed lookup, never a guess. - **Rate limit**: the site allows a limited number of verifications per IP per hour. Lookups are automatically retried when upstream rate-limiting is encountered. - **Time zone**: scan times carry no zone on HuaHan's page, so only `localTime` is set and `timestamp` is `null`. - **Not found**: an unknown number returns `404 not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Hunter Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hunterexpress Query live **Hunter Express (Australia)** (`hunterexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hunterexpress` | | **Brand aliases** | Hunter Express, Hunter Express Australia | | **Category** | Regional freight (Australia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | `ZPL039906` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | Consignment number | `^[A-Z]{3}\d{6}$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=hunterexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ZPL039906?carrier=hunterexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hunterexpress", "trackingNumber": "ZPL039906", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-03T00:05:00Z", "deliveredAtLocal": "2026-03-03T11:05:00", "signedBy": "J SMITH", "destination": { "city": "Sandringham", "state": "VIC", "country": "AU" }, "events": [ { "timestamp": "2026-03-03T00:05:00Z", "localTime": "2026-03-03T11:05:00", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": "2026-03-02T20:06:39Z", "localTime": "2026-03-03T07:06:39", "status": "out_for_delivery", "description": "On Delivery", "location": "MELBOURNE", "code": null }, { "timestamp": "2026-03-02T06:20:00Z", "localTime": "2026-03-02T17:20:00", "status": "in_transit", "description": "Depot In", "location": "MELBOURNE", "code": null }, { "timestamp": "2026-03-01T23:39:00Z", "localTime": "2026-03-02T10:39:00", "status": "in_transit", "description": "Pickup Completed", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: the portal prints scan times as AEDT/AEST, so they are converted from `Australia/Sydney`. Depot scans show only a date on the page; their exact moment comes from the page's own scan links. - A 3-letter + 6-digit consignment number is not unique to Hunter Express, so pass `?carrier=hunterexpress`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Huiyi Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hywl Query live **Huiyi Logistics** (`hywl`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hywl` | | **Brand aliases** | Huiyi Logistics, SZHYWL, szhywl.it.com, TRK | | **Category** | China cross-border parcels (Huiyi Logistics) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^TRK[0-9A-F]{12}$/` | none | `TRKB879BE6E9D8E` | | **Pass 2 (`mayMatch`)** | none | none | none | `Huiyi Logistics` numbers are claimed by `hywl`, so `?carrier=hywl` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/TRKB879BE6E9D8E?carrier=hywl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "hywl", "trackingNumber": "TRKB879BE6E9D8E", "status": "delivered", "statusDescription": "Delivered【Lyon, 69001】, 已妥投【Lyon, 69001】", "service": null, "deliveredAt": "2026-05-20T19:43:31Z", "deliveredAtLocal": "2026-05-20T19:43:31", "signedBy": null, "destination": { "city": null, "state": null, "country": "FR" }, "message": null, "events": [ { "timestamp": "2026-05-20T19:43:31Z", "localTime": "2026-05-20T19:43:31", "status": "delivered", "description": "Delivered【Lyon, 69001】, 已妥投【Lyon, 69001】", "location": "Lyon, 69001", "code": "Delivered" }, { "timestamp": "2026-05-19T12:43:31Z", "localTime": "2026-05-19T12:43:31", "status": "out_for_delivery", "description": "Dispatching【Lyon, 69001】, 出门投递【Lyon, 69001】", "location": "Lyon, 69001", "code": "Out for Delivery" }, { "timestamp": "2026-04-26T07:43:31Z", "localTime": "2026-04-26T07:43:31", "status": "in_transit", "description": "广州市 51000066, SZHYWL已收取邮件", "location": "广州市 51000066", "code": "Picked Up" } ] } ``` ## Notes - **Time zone**: the feed's times are UTC, so `localTime` is the same clock as `timestamp`. - **Descriptions** are bilingual as the carrier sends them; `code` is the carrier's own status (`Picked Up`, `In Transit`, `Customs`, `Out for Delivery`, `Delivered`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # JTEX Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hzjtex Query live **JTEX** (`hzjtex`) package status and scan history in a single synchronous `GET` request or MCP tool call. JTEX numbers share their shape with other carriers' numbers, so pass `?carrier=hzjtex`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hzjtex` | | **Brand aliases** | JTEX, 杭州捷通物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=hzjtex` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=hzjtex` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | JTEX tracking numbers have no shape of their own, so always pass `?carrier=hzjtex`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to JTEX in one request. - **Platform**: JTEX runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PD Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/hzpdex Query live **PD Express** (`hzpdex`) package status and scan history in a single synchronous `GET` request or MCP tool call. PD Express numbers share their shape with other carriers' numbers, so pass `?carrier=hzpdex`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `hzpdex` | | **Brand aliases** | PD Express, 蓬达国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=hzpdex` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=hzpdex` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | PD Express tracking numbers have no shape of their own, so always pass `?carrier=hzpdex`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to PD Express in one request. - **Platform**: PD Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ICS Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/icscourier Query live **ICS Courier** (`icscourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects ICS numbers (14 characters followed by the recipient's postal code). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `icscourier` | | **Brand aliases** | ICS Courier, ICS, Intelcom-style regional courier, icscourier.ca | | **Category** | Canadian regional courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=AB1...,AB1...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d[A-Z0-9]{11}[A-Z]\d[A-Z]\d[A-Z]\d$/` | none | `GR6EV0V3FFCBF1L4G7G2` | | **Pass 2 (`mayMatch`)** | none | none | none | The last six characters are the recipient's Canadian postal code, which is what keeps the shape specific to ICS. Pass `?carrier=icscourier` for any number that does not fit. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/GR6EV0V3FFCBF1L4G7G2?carrier=icscourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "icscourier", "trackingNumber": "GR6EV0V3FFCBF1L4G7G2", "status": "delivered", "statusDescription": "Delivered at: JANE DOE 1 MAIN ST TORONTO ON M5V 2T6", "service": null, "deliveredAt": "2026-03-10T18:12:43Z", "deliveredAtLocal": "2026-03-10T13:12:43", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-10T18:12:43Z", "localTime": "2026-03-10T13:12:43", "status": "delivered", "description": "Delivered at: JANE DOE 1 MAIN ST TORONTO ON M5V 2T6", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-10T07:22:23", "status": "out_for_delivery", "description": "Out for Delivery", "location": null, "code": null }, { "timestamp": "2026-03-10T05:48:00Z", "localTime": "2026-03-10T00:48:00", "status": "in_transit", "description": "At ICS Branch SCARBOROUGH, ON for processing", "location": "SCARBOROUGH, ON", "code": null } ] } ``` ## Notes - **Time zone**: scan times are local to the branch. When the scan names a province (`At ICS Branch CITY, ON ...`, or a trailing province and postal code), `timestamp` is converted from that province's zone; otherwise only `localTime` is returned and `timestamp` is `null`. - **Signature**: the name in the page's signature column becomes `signedBy`; the placeholder `NSR` (no signature required) is ignored. - **One number per request**: the tracking page lists several numbers but only fills the scan history of the first, so batches make one request per number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Ilyang Logis Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ilyanglogis Query live **Ilyang Logis** (`ilyanglogis`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=ilyanglogis` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ilyanglogis` | | **Brand aliases** | Ilyang Logis, 일양로지스, Ilyang, ilyanglogis.co.kr | | **Category** | South Korean parcel carrier (일양로지스) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is not unique to Ilyang Logis, so pass `?carrier=ilyanglogis`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2176000002?carrier=ilyanglogis" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ilyanglogis", "trackingNumber": "2176000002", "status": "delivered", "statusDescription": "배달완료", "service": null, "deliveredAt": "2026-09-29T01:47:00Z", "deliveredAtLocal": "2026-09-29T10:47:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-09-29T01:47:00Z", "localTime": "2026-09-29T10:47:00", "status": "delivered", "description": "배달완료", "location": "서초사무소", "code": "70" }, { "timestamp": "2026-09-28T22:59:00Z", "localTime": "2026-09-29T07:59:00", "status": "out_for_delivery", "description": "직원 배송중", "location": "서초사무소", "code": "50" }, { "timestamp": "2026-09-28T13:56:00Z", "localTime": "2026-09-28T22:56:00", "status": "in_transit", "description": "배송경유지 도착", "location": "옥천터미널", "code": "20" } ] } ``` ## Notes - **Detection**: 9-10 digit waybills are a shape other carriers also use, so pass `?carrier=ilyanglogis`. - **Time zone**: scan times are Korean time (`Asia/Seoul`); `timestamp` is converted from it. - **Codes**: `20` arrived at a hub, `40` left a hub, `50` out for delivery, `70` delivered; a scan with an exception code is an `exception`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # iMile Tracking API & MCP URL: https://docs.lastscanned.com/carriers/imile Query live **iMile** (`imile`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `imile` | | **Brand aliases** | iMile, iMile Delivery, imile.com | | **Category** | Middle East, Australia and Latin America last-mile courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^IM0601\d{10}$/` | none | `3781052124989` | | **Pass 2 (`mayMatch`)** | none | none | none | `iMile` numbers are claimed by `imile`, so `?carrier=imile` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/3781052124989?carrier=imile" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "imile", "trackingNumber": "3781052124989", "status": "delivered", "statusDescription": "Your order has been delivered successfully.", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-09-30T12:52:30", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-09-30T12:52:30", "status": "delivered", "description": "Your order has been delivered successfully.", "location": "Sydney Center", "code": "2060" }, { "timestamp": null, "localTime": "2026-09-28T17:27:30", "status": "out_for_delivery", "description": "Our delivery associate is out for delivery.", "location": "Sydney Center", "code": "1003" }, { "timestamp": null, "localTime": "2026-09-24T12:14:05", "status": "in_transit", "description": "Parcel is currently being processed.", "location": "Sydney Center", "code": "1003" } ] } ``` ## Notes - **Signed request**: the tracking page sends `sign`, the waybill number RSA-encrypted (PKCS#1 v1.5) with the public key in its own script, and `code`, an MD5 of the number plus a constant. Both are built per lookup. - **Time zone**: iMile prints scan times without a zone (the parcel's own country, and it serves several), so `timestamp` is `null` and only `localTime` is set. - **Detection**: only the `IM0601…` form is claimed; the plain 13-digit waybills are a shape other carriers use. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Indah Logistik Tracking API & MCP URL: https://docs.lastscanned.com/carriers/indahlogistik Query live **Indah Logistik** (`indahlogistik`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `indahlogistik` | | **Brand aliases** | Indah Logistik, Indah Logistic Cargo, ILC, indahonline.com | | **Category** | Indonesian cargo carrier (Indah Logistic Cargo) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{3}1CS(\d{8}|(PL)?\d{12})$/` | none | `BDO1CSPL210524505821` | | **Pass 2 (`mayMatch`)** | none | none | none | `Indah Logistik` numbers are claimed by `indahlogistik`, so `?carrier=indahlogistik` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/BDO1CSPL210524505821?carrier=indahlogistik" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "indahlogistik", "trackingNumber": "BDO1CSPL210524505821", "status": "delivered", "statusDescription": "Paket telah diterima", "service": "Indah Logistic Cargo", "deliveredAt": null, "deliveredAtLocal": "2026-01-14T19:26:05", "signedBy": "Budi ( YANG BERSANGKUTAN )", "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-01-14T19:26:05", "status": "delivered", "description": "Paket telah diterima", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-01-14T19:16:21", "status": "out_for_delivery", "description": "Paket sedang diantar oleh kurir", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-01-13T07:50:04", "status": "in_transit", "description": "Paket telah sampai di gudang tujuan", "location": "TABANAN (Tabanan)", "code": null }, { "timestamp": null, "localTime": "2026-01-06T15:13:39", "status": "label_created", "description": "Transaksi", "location": "KALIANDA", "code": null } ] } ``` ## Notes - **Time zone**: Indonesia has three zones and the feed names none, so only `localTime` is set. - **Description**: the courier's name and staff ids that follow the wording are dropped; the receiver shown on the delivery scan becomes `signedBy`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # InPost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/inpost Query live **InPost** (`inpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects InPost's 24-digit parcel numbers and reads InPost's own public tracking endpoint for Poland and the UK. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `inpost` | | **Brand & service aliases** | InPost, InPost Paczkomat, InPost Kurier, InPost UK, ShipX | | **Category** | Regional parcel locker & courier network (Poland, UK) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (auto-detected for 24-digit numbers starting 5 or 6) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=620999670120810441323519,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=inpost`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[56]\d{23}$/` (24 digits starting 5 or 6) | None | `620999670120810441323519` | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | ### When is `?carrier=inpost` optional vs required? - **Optional (auto-detected)**: 24-digit numbers starting 5 or 6. - **Required (`?carrier=inpost`)**: Any other InPost number shape. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/620999670120810441323519?carrier=inpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/620999670120810441323519?carrier=inpost", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "620999670120810441323519" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "inpost", "trackingNumber": "620999670120810441323519", "status": "delivered", "statusDescription": "Delivered.", "service": "locker standard", "deliveredAt": "2026-10-27T09:36:19Z", "deliveredAtLocal": "2026-10-27T10:36:19", "signedBy": null, "destination": { "city": "20-810 Lublin", "state": null, "country": null }, "events": [ { "timestamp": "2026-10-27T09:36:19Z", "localTime": "2026-10-27T10:36:19", "status": "delivered", "description": "Delivered.", "location": null, "code": "delivered" }, { "timestamp": "2026-10-27T07:31:48Z", "localTime": "2026-10-27T08:31:48", "status": "exception", "description": "Placed in the parcel machine.", "location": null, "code": "ready_to_pickup" }, { "timestamp": "2026-10-26T10:33:48Z", "localTime": "2026-10-26T11:33:48", "status": "label_created", "description": "Prepared by the Sender.", "location": null, "code": "confirmed" } ] } ``` ## Notes - Uses InPost's public ShipX tracking endpoint (`api-shipx-pl.easypack24.net/v1/tracking/{number}`). No account or key is needed. - Event wording is InPost's own English status titles. Event times carry their offset, so `timestamp` is set. - A parcel waiting in a locker or at a service point is reported as `exception`, the same way other carriers' held-for-collection scans are. ## Related Resources - **Live browser lookup tool**: [Track a InPost package live on lastscanned.com/lookup/inpost](https://lastscanned.com/lookup/inpost) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Integral Pack Tracking API & MCP URL: https://docs.lastscanned.com/carriers/integralpack Query live **Integral Pack** (`integralpack`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `integralpack` | | **Brand aliases** | Integral Pack, IPE, integralpack.com.ar | | **Category** | Argentine parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^IPE-\d{4}-[A-Z]-\d{8}$/` after normalizing | none | `IPE-1234-P-00012345` | | **Pass 2 (`mayMatch`)** | none | none | none | `Integral Pack` numbers are claimed by `integralpack`, so `?carrier=integralpack` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/IPE-1234-P-00012345?carrier=integralpack" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "integralpack", "trackingNumber": "IPE-1234-P-00012345", "status": "delivered", "statusDescription": "Entregada", "service": null, "deliveredAt": "2026-02-11T13:20:20Z", "deliveredAtLocal": "2026-02-11T10:20:20", "signedBy": null, "destination": { "city": "LA PLATA", "state": null, "country": "AR" }, "message": null, "events": [ { "timestamp": "2026-02-11T13:20:20Z", "localTime": "2026-02-11T10:20:20", "status": "delivered", "description": "Entregada", "location": "LA PLATA", "code": null }, { "timestamp": "2026-02-10T14:28:54Z", "localTime": "2026-02-10T11:28:54", "status": "in_transit", "description": "En destino", "location": "LA PLATA", "code": null }, { "timestamp": "2026-02-09T23:22:55Z", "localTime": "2026-02-09T20:22:55", "status": "label_created", "description": "Creada", "location": "RETIRO", "code": null } ] } ``` ## Notes - **Number forms**: the guide is printed as `series - type - number` (`2656 - P - 2733235`) or `IPE-2656-P-02733235`; both are rebuilt to the `IPE-` form with the number padded to 8 digits. - **Time zone**: Argentina has one offset (UTC-3, no daylight saving); `timestamp` is converted from `America/Argentina/Buenos_Aires`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Intelcom (Dragonfly) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/intelcom Query live **Intelcom / Dragonfly** (`intelcom`) package status, scan history, and driver drop-off notes in a single synchronous `GET` request or MCP tool call. Intelcom is Amazon Canada's largest private last-mile carrier and also operates internationally under the **Dragonfly** brand; `lastscanned` auto-detects 16-character `INTLCM…` tracking numbers in Pass 1 and returns a normalized `TrackingResult` JSON payload. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `intelcom` | | **Brand & service aliases** | Intelcom, Dragonfly, Intelcom Express, Dragonfly Shipping (`intelcom.ca`, `dragonflyshipping.ca`) | | **Category** | Canadian & regional e-commerce last-mile courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=INTLCM...,INTLCM...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Intelcom / Dragonfly - **Unified Intelcom + Dragonfly coverage with zero enterprise onboarding**: Intelcom rebranded its consumer-facing operations outside Quebec (and in Australia) to **Dragonfly**, and does not offer self-serve API keys to merchants or third-party developers. `lastscanned` tracks `INTLCM…` barcodes across both brands out of the box. - **Template interpolation & cleanup**: Intelcom's raw tracking responses contain uninterpolated placeholders like `"{driver} has delivered your package."` or trailing internal suffixes like `"First delivery attempt / REASON"`. `lastscanned` interpolates `driver_name` / `client_code`, strips internal suffixes, filters out hidden steps, and maps step numbers (`1`–`4`, negative steps for exceptions) into the 7 standard statuses. - **Drop-off location notes in `message`**: When an Intelcom driver leaves a package, `lastscanned` surfaces the English drop-off location note (for example, *"Your package was left at your front door"* or *"left in your mailbox or mail slot"*) in top-level `message`. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Intelcom is evaluated **twentieth (#20)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^INTLCM[A-Z]\d{9}$/i` (`INTLCM` + 1 letter + 9 digits = 16 chars) | — | `INTLCMJ099862529`, `INTLCMJ099862529` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=intelcom` optional vs required? - **Optional (auto-detected)**: All 16-character `INTLCM` + letter + 9-digit barcodes auto-detect in Pass 1 (the letter increments as the 9-digit counter wraps, e.g. `INTLCME…`, `INTLCMI…`, `INTLCMK…`). - **Amazon Canada `TBC…` numbers**: Amazon Logistics Canada numbers starting `TBC` + 12 digits route to [Amazon](https://docs.lastscanned.com/carriers/amazon) (`amazon`) by default. If you have a non-`INTLCM` partner reference billed directly through Intelcom, pass `?carrier=intelcom`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/INTLCMJ099862529?carrier=intelcom" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/INTLCMJ099862529?carrier=intelcom", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.message, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "INTLCMJ099862529" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "intelcom", "trackingNumber": "INTLCMJ099862529", "status": "delivered", "statusDescription": "Delivered - No Signature", "service": "STANDARD", "deliveredAt": "2026-10-25T17:42:10Z", "deliveredAtLocal": "2026-10-25T13:42:10", "signedBy": null, "destination": { "city": "Montreal", "state": "QC", "country": "CA" }, "estimatedDelivery": null, "estimatedDeliveryAt": null, "message": "Marc has delivered your package.", "events": [ { "timestamp": "2026-10-25T17:42:10Z", "localTime": "2026-10-25T13:42:10", "status": "delivered", "description": "Delivered - No Signature", "location": "Montreal, QC", "code": "601" }, { "timestamp": "2026-10-25T12:15:04Z", "localTime": "2026-10-25T08:15:04", "status": "out_for_delivery", "description": "Loaded", "location": null, "code": "300" }, { "timestamp": "2026-10-25T08:03:51Z", "localTime": "2026-10-25T04:03:51", "status": "in_transit", "description": "Delivery station inbound scan", "location": null, "code": "108" }, { "timestamp": "2026-10-24T19:20:00Z", "localTime": "2026-10-24T15:20:00", "status": "label_created", "description": "Data received", "location": null, "code": "0" } ] } ``` > **Raw status & step codes**: `events[].code` preserves Intelcom's numeric status code (`"0"` data received, `"105"` received, `"108"` delivery station inbound scan, `"300"` loaded / out for delivery, `"590"` first delivery attempt, `"601"` delivered without signature), while `status` maps Intelcom's `step` (`1` → `label_created`, `2` → `in_transit`, `3` → `out_for_delivery`, `4` → `delivered`, `< 0` → `exception`). ## Carrier-Specific Status & Integration Notes - **UTC & local timestamps**: Intelcom reports scan times as Unix epoch milliseconds alongside an offset-qualified `eta` timestamp (e.g. `2026-10-25T12:32:23.000000-04:00`), which `lastscanned` uses to compute both UTC `timestamp` and local wall-clock `localTime` (plus `estimatedDelivery` and `estimatedDeliveryAt` while in transit). - **Retention window**: Intelcom retains delivered parcels in its tracking system for roughly 90 days after delivery; older numbers return `404 not_found`. ## Related Resources - **Live browser lookup tool**: [Track an Intelcom / Dragonfly package live on lastscanned.com/lookup/intelcom](https://lastscanned.com/lookup/intelcom) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Internet Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/internetexpress Query live **Internet Express** (`internetexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=internetexpress` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `internetexpress` | | **Brand aliases** | Internet Express, IE, internetexpress.co.za | | **Category** | South African courier (Ship Logic portal) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is not unique to Internet Express, so pass `?carrier=internetexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/UAE9TB6GB?carrier=internetexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "internetexpress", "trackingNumber": "UAE9TB6GB", "status": "delivered", "statusDescription": "Delivered: PIN entered successfully", "service": "Major Economy 5kg-unlimited", "deliveredAt": "2026-08-03T12:29:51Z", "deliveredAtLocal": "2026-08-03T14:29:51", "signedBy": null, "destination": { "city": "Cape Town", "state": null, "country": "ZA" }, "message": null, "events": [ { "timestamp": "2026-08-03T12:29:51Z", "localTime": "2026-08-03T14:29:51", "status": "delivered", "description": "Delivered: PIN entered successfully", "location": "IE CPT", "code": "delivered" }, { "timestamp": "2026-08-03T04:49:34Z", "localTime": "2026-08-03T06:49:34", "status": "out_for_delivery", "description": "Out for delivery", "location": "IE CPT", "code": "out-for-delivery" }, { "timestamp": "2026-07-30T16:17:18Z", "localTime": "2026-07-30T18:17:18", "status": "in_transit", "description": "Collected", "location": "Internet Express Durban", "code": "collected" } ] } ``` ## Notes - **Detection**: the reference has no format of its own, so pass `?carrier=internetexpress`. - **Time zone**: the feed's times are UTC; `localTime` is that moment in South African time (`Africa/Johannesburg`, UTC+2). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Inter Rapidísimo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/interrapidisimo Query live **Inter Rapidísimo** (`interrapidisimo`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=interrapidisimo` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `interrapidisimo` | | **Brand aliases** | Inter Rapidísimo, Interrapidisimo, Inter Rapidisimo, interrapidisimo.com | | **Category** | Colombian parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is not unique to Inter Rapidísimo, so pass `?carrier=interrapidisimo`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/700121916699?carrier=interrapidisimo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "interrapidisimo", "trackingNumber": "700121916699", "status": "delivered", "statusDescription": "Entregamos tu envío", "service": null, "deliveredAt": "2024-03-13T00:47:49Z", "deliveredAtLocal": "2024-03-12T19:47:49", "signedBy": null, "destination": { "city": "Bogota", "state": "Cundinamarca", "country": "CO" }, "estimatedDelivery": "2024-03-12T18:00:00", "message": null, "events": [ { "timestamp": "2024-03-13T00:47:49Z", "localTime": "2024-03-12T19:47:49", "status": "delivered", "description": "Entregamos tu envío", "location": null, "code": "6" }, { "timestamp": "2024-03-12T12:38:32Z", "localTime": "2024-03-12T07:38:32", "status": "out_for_delivery", "description": "En reparto", "location": null, "code": "5" }, { "timestamp": "2024-03-11T13:37:59Z", "localTime": "2024-03-11T08:37:59", "status": "in_transit", "description": "Recibimos tu envío", "location": null, "code": "1" } ] } ``` ## Notes - **Route**: a query guid, then the guide summary and a session id, then the stage list authorised with that id. The captcha payload field is sent empty. - **Stages** are per route, so the wording (not the stage number) sets the status. Dates are month-first, Colombian time (`America/Bogota`, UTC-5). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Israel Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/israelpost Query live **Israel Post** (`israelpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `israelpost` | | **Brand aliases** | Israel Post, Doar Israel, israelpost.co.il, דואר ישראל | | **Category** | Israeli national post (UPU S10 mail) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("IL")`: two letters + 9 digits + `IL`, valid S10 check digit | S10 mod 11 | `RR700001230IL` | | **Pass 2 (`mayMatch`)** | none | none | none | `Israel Post` numbers are claimed by `israelpost`, so `?carrier=israelpost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RR700001230IL?carrier=israelpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "israelpost", "trackingNumber": "RR700001230IL", "status": "delivered", "statusDescription": "נמסר למיופ\"כ", "service": "רשום", "deliveredAt": null, "deliveredAtLocal": "2026-04-14", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-04-14", "status": "delivered", "description": "נמסר למיופ\"כ", "location": "סניף יד אליהו, תל אביב - יפו", "code": "5" }, { "timestamp": null, "localTime": "2026-04-09", "status": "exception", "description": "הגיע ליחידה לשם מסירתו לנמען", "location": "סניף יד אליהו, תל אביב - יפו", "code": "4" }, { "timestamp": null, "localTime": "2026-03-23", "status": "in_transit", "description": "התקבל למשלוח והועבר להמשך טיפול", "location": "סניף מגדל שלום, תל אביב - יפו", "code": "23" } ] } ``` ## Notes - **Language**: event text is Hebrew, as the carrier sends it. `code` is Israel Post's category (`5` delivered, `8` with the courier, `4` waiting for pickup, `3` sorting, `23` accepted, `6` returning to sender). - **Dates only**: scans carry a date and no time, so `timestamp` is `null` and `localTime` is the date. - **Not found**: a number with no history (`Maslul` empty) returns `404 not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # J&T Express Australia Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jandtau Query live **J&T Express Australia** (`jandtau`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jandtau` | | **Brand aliases** | J&T Express Australia, J&T Australia, JT Express AU, jtaunz.com | | **Category** | Australian parcel courier (J&T Express) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^JTAU\d{12}$/` | none | `JTAU100000010061` | | **Pass 2 (`mayMatch`)** | none | none | none | `J&T Express Australia` numbers are claimed by `jandtau`, so `?carrier=jandtau` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JTAU100000010061?carrier=jandtau" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jandtau", "trackingNumber": "JTAU100000010061", "status": "delivered", "statusDescription": "Your parcel has been delivered.", "service": null, "deliveredAt": "2026-08-27T00:29:23Z", "deliveredAtLocal": "2026-08-27T00:29:23", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-08-27T00:29:23Z", "localTime": "2026-08-27T00:29:23", "status": "delivered", "description": "Your parcel has been delivered.", "location": null, "code": null }, { "timestamp": "2026-08-26T04:41:39Z", "localTime": "2026-08-26T04:41:39", "status": "out_for_delivery", "description": "Your parcel is out for delivery.", "location": null, "code": null }, { "timestamp": "2026-08-25T10:24:25Z", "localTime": "2026-08-25T10:24:25", "status": "in_transit", "description": "The parcel is dispatched from the transit center to the next destination", "location": null, "code": null } ] } ``` ## Notes - **Signed request**: the site signs each call with an MD5 of its app id, timestamp, nonce, the sorted request body and a key, all built per lookup (shared with J&T Express Germany). - **Time zone**: the request asks for GMT+0000, so scan times are UTC and `localTime` is the same clock as `timestamp`. Scans carry no place. - Other J&T countries are separate carriers. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # J&T Cargo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jandtcargo Query live **J&T Cargo** (`jandtcargo`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=jandtcargo` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jandtcargo` | | **Brand aliases** | J&T Cargo, JT Cargo, jtcargo.co.id | | **Category** | Indonesian freight arm of J&T Express | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is not unique to J&T Cargo, so pass `?carrier=jandtcargo`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/201452885645?carrier=jandtcargo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jandtcargo", "trackingNumber": "201452885645", "status": "delivered", "statusDescription": "【Kota Surabaya】Recceived!Recceived by【diterima sendiri】", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-04-13T11:25:38", "signedBy": null, "destination": { "city": "Kota Surabaya", "state": null, "country": "ID" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-04-13T11:25:38", "status": "delivered", "description": "【Kota Surabaya】Recceived!Recceived by【diterima sendiri】", "location": "Kota Surabaya, Jawa Timur", "code": "100" }, { "timestamp": null, "localTime": "2026-04-13T11:13:59", "status": "out_for_delivery", "description": "【Kota Surabaya】【SUB064A】J&T courier EDI Delivering", "location": "Kota Surabaya, Jawa Timur", "code": "94" }, { "timestamp": null, "localTime": "2026-03-29T19:50:48", "status": "in_transit", "description": "【Kab Belitung】【TJQ004A】Your J&T Courier Andy Picked up。", "location": "Kab Belitung, Kepulauan Bangka Belitung", "code": "10" } ] } ``` ## Notes - **Detection**: digit-only waybills are a shape other carriers also use, so pass `?carrier=jandtcargo`. - **Time zone**: Indonesia has three zones and the feed names none, so only `localTime` is set. Courier phone numbers in the carrier's text are removed. - **Codes**: `10` picked up, `50`/`90`/`92` moving, `94` out for delivery, `100` signed for. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # J&T Express Germany Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jandtde Query live **J&T Express Germany** (`jandtde`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jandtde` | | **Brand aliases** | J&T Express Germany, J&T Germany, JT Express DE, jtexpress.eu | | **Category** | German parcel courier (J&T Express) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^JTDE\d{12}$/` | none | `JTDE100007312985` | | **Pass 2 (`mayMatch`)** | none | none | none | `J&T Express Germany` numbers are claimed by `jandtde`, so `?carrier=jandtde` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JTDE100007312985?carrier=jandtde" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jandtde", "trackingNumber": "JTDE100007312985", "status": "delivered", "statusDescription": "Your package has been successfully delivered.", "service": null, "deliveredAt": "2026-06-12T09:15:33Z", "deliveredAtLocal": "2026-06-12T09:15:33", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-06-12T09:15:33Z", "localTime": "2026-06-12T09:15:33", "status": "delivered", "description": "Your package has been successfully delivered.", "location": null, "code": null }, { "timestamp": "2026-06-12T04:41:13Z", "localTime": "2026-06-12T04:41:13", "status": "out_for_delivery", "description": "Your package has been loaded and is on its way to you", "location": null, "code": null }, { "timestamp": "2026-06-08T13:13:20Z", "localTime": "2026-06-08T13:13:20", "status": "in_transit", "description": "The shipment has been successfully picked up and is being prepared for transportation", "location": null, "code": null } ] } ``` ## Notes - **Signed request**: the same MD5-signed call as J&T Express Australia (one shared backend). - **Time zone**: the request asks for GMT+0000, so scan times are UTC and `localTime` is the same clock as `timestamp`. Scans carry no place. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Janio Tracking API & MCP URL: https://docs.lastscanned.com/carriers/janio Query live **Janio** (`janio`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `janio` | | **Brand aliases** | Janio, Janio Asia, janio.asia | | **Category** | Southeast Asia cross-border logistics | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^JN[A-Z]{2}\d{12}$/` | none | `JNCN000002534863` | | **Pass 2 (`mayMatch`)** | none | none | none | `Janio` numbers are claimed by `janio`, so `?carrier=janio` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JNCN000002534863?carrier=janio" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "janio", "trackingNumber": "JNCN000002534863", "status": "delivered", "statusDescription": "The parcel has been successfully delivered to the recipient.", "service": null, "deliveredAt": "2025-06-27T06:49:20Z", "deliveredAtLocal": "2025-06-27T06:49:20", "signedBy": null, "destination": { "city": null, "state": null, "country": "Singapore" }, "message": "Handed to SingPost as JNCN000002534863", "events": [ { "timestamp": "2025-06-27T06:49:20Z", "localTime": "2025-06-27T06:49:20", "status": "delivered", "description": "The parcel has been successfully delivered to the recipient.", "location": "Singapore", "code": "DELIVERY_COMPLETED" }, { "timestamp": "2025-06-27T02:47:29Z", "localTime": "2025-06-27T02:47:29", "status": "out_for_delivery", "description": "The parcel is on its way to the recipient.", "location": null, "code": "DELIVERY_IN_PROGRESS" }, { "timestamp": "2025-06-24T14:58:45Z", "localTime": "2025-06-24T14:58:45", "status": "label_created", "description": "We have received the order details, but not the parcel.", "location": null, "code": "ORDER_CREATED" } ] } ``` ## Notes - **Handoff**: when the parcel runs on a partner's number (`external_tracking_nos`), `message` names the partner and the number, for example `"Handed to SingPost as JNCN000002534863"`. Pass it to `GET /v1/track/{number}` for the partner's own scans. - **Time zone**: Janio's times are UTC, so `localTime` is the same clock as `timestamp`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Japan Post (EMS, International Mail) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/japanpost Query live **Japan Post** (`japanpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `JP` (with a valid check digit) in Pass 1 and returns a normalized `TrackingResult` JSON payload, with no Japan Post account or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `japanpost` | | **Brand & service aliases** | Japan Post (日本郵便), Japan Post EMS, `trackings.post.japanpost.jp`, S10 `…JP` | | **Category** | National postal operator (Japan), international mail | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=152515917783,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Japan Post - **HTML to JSON**: Japan Post's English results page is server-rendered HTML with paired table rows and `MM/DD/YYYY` dates. `lastscanned` reads the history table and returns normalized events, newest first. - **Local-time caveat handled**: Japan Post prints overseas scans in the destination's local time. Only scans in Japan get a UTC `timestamp` (`Asia/Tokyo`); foreign scans carry `localTime` only. ## Tracking Number Formats & Auto-Detection (`matches`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}JP$/` (UPU S10) | S10 mod-11 | `152515917783` | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | Only S10 numbers whose check digit is valid are claimed. Anything else needs `?carrier=japanpost`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/152515917783?carrier=japanpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "152515917783" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "japanpost", "trackingNumber": "152515917783", "status": "exception", "statusDescription": "Item arrival at collection point for pick-up", "service": "EMS", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-14T07:43:00", "status": "exception", "description": "Item arrival at collection point for pick-up", "location": "UNITED KINGDOM", "code": null }, { "timestamp": null, "localTime": "2026-06-30T15:08:00", "status": "in_transit", "description": "Item into sorting centre", "location": "UNITED KINGDOM", "code": null }, { "timestamp": null, "localTime": "2025-12-01T11:18:00", "status": "in_transit", "description": "Arrival at inward office of exchange", "location": "COVENTRY PARCELFORCE, UNITED KINGDOM", "code": null } ] } ``` `timestamp` is `null` here because these scans happened overseas, where Japan Post prints local time with no zone. ## Notes - **Domestic numbers**: Japan Post's domestic 11 to 13 digit numbers are not auto-detected; only S10 numbers ending `JP` are. - **Pick-up notices**: scans such as `Item arrival at collection point for pick-up` map to `exception`, matching how other carriers' ready-for-collection notices are treated. - **No codes**: Japan Post gives no event codes, so `code` is `null` and `status` comes from the wording. - An unknown number returns `404 not_found` (cached for 5 minutes). ## Related Resources - **Live browser lookup tool**: [Track a Japan Post package live on lastscanned.com/lookup/japanpost](https://lastscanned.com/lookup/japanpost) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # JCEX Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jcex Query live **JCEX** (`jcex`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jcex` | | **Brand aliases** | JCEX, JCEX Express, jcex.com | | **Category** | China cross-border parcels (JCEX) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^JCZ\d{10}DH$/` | none | `JCZ0318108989DH` | | **Pass 2 (`mayMatch`)** | none | none | none | `JCEX` numbers are claimed by `jcex`, so `?carrier=jcex` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JCZ0318108989DH?carrier=jcex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jcex", "trackingNumber": "JCZ0318108989DH", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-30T15:05:00Z", "deliveredAtLocal": "2026-03-30T10:05:00", "signedBy": null, "destination": { "city": "Macon", "state": "MO", "country": "US" }, "message": null, "events": [ { "timestamp": "2026-03-30T15:05:00Z", "localTime": "2026-03-30T10:05:00", "status": "delivered", "description": "Delivered", "location": "MACON, MO, 63552", "code": "I4" }, { "timestamp": "2026-03-30T11:44:00Z", "localTime": "2026-03-30T06:44:00", "status": "out_for_delivery", "description": "out for delivery", "location": "MACON, MO, 63552", "code": "G8" }, { "timestamp": "2026-03-20T17:09:38Z", "localTime": "2026-03-21T01:09:38", "status": "in_transit", "description": "Arrive at the delivery point", "location": "CN", "code": "AP" } ] } ``` ## Notes - **Time zone**: each scan has a wall-clock time and an offset, but `+08:00` is also stamped on destination scans. That offset is trusted only for scans in China or Hong Kong; other `+08:00` scans keep only `localTime`. - **Batch**: several numbers go in one upstream call. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # JD Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jdlogistics Query live **JD Logistics** (`jdlogistics`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jdlogistics` | | **Brand aliases** | JD Logistics, JDL, JD Express, jdl.com | | **Category** | JD Logistics international express | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(VG\d{11}|JD([A-Z]\d{12}|[A-Z]{2}\d{11}))$/` | none | `JDW100615049942` | | **Pass 2 (`mayMatch`)** | none | none | none | `JD Logistics` numbers are claimed by `jdlogistics`, so `?carrier=jdlogistics` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JDW100615049942?carrier=jdlogistics" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jdlogistics", "trackingNumber": "JDW100615049942", "status": "delivered", "statusDescription": "Your package has been signed for, thank you for choosing JD Logistics!", "service": null, "deliveredAt": "2025-07-20T10:18:25Z", "deliveredAtLocal": "2025-07-20T13:18:25", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2025-07-20T10:18:25Z", "localTime": "2025-07-20T13:18:25", "status": "delivered", "description": "Your package has been signed for, thank you for choosing JD Logistics!", "location": "Jazan Province, Saudi Arabia", "code": "DLV" }, { "timestamp": "2025-07-18T12:20:00Z", "localTime": "2025-07-18T15:20:00", "status": "in_transit", "description": "Your package has begun clearance", "location": "Riyadh Province, Saudi Arabia", "code": "CCL" }, { "timestamp": "2025-07-13T18:35:56Z", "localTime": "2025-07-14T02:35:56", "status": "label_created", "description": "Order Created.", "location": null, "code": "COSH" } ] } ``` ## Notes - **Time zone**: each node carries its own zone (`UTC+3`, `UTC+8`), so `timestamp` is exact. - **Detection**: `JD` followed by 13 digits is DHL eCommerce's shape and is not claimed; pass `?carrier=jdlogistics` for those. Courier names and phone numbers in the carrier's text are removed. - One number per upstream call: a batch containing an unknown number returns nothing for all of them. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Jeebly Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jeebly Query live **Jeebly** (`jeebly`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jeebly` | | **Brand aliases** | Jeebly UAE, Jeebly Express | | **Category** | Domestic parcels (UAE) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^JB\d{6,7}$/ and /^JBP\d{6}$/` | none | `JB8084948` | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` takes `JB` plus 6 or 7 digits, or `JBP` plus 6 digits. `mayMatch` is empty. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JB8084948?carrier=jeebly" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jeebly", "trackingNumber": "JB8084948", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-02-26T15:14:00Z", "deliveredAtLocal": "2026-02-26T19:14:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-26T15:14:00Z", "localTime": "2026-02-26T19:14:00", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": "2026-02-26T03:31:00Z", "localTime": "2026-02-26T07:31:00", "status": "out_for_delivery", "description": "Out For Delivery", "location": null, "code": null }, { "timestamp": "2026-02-25T17:16:00Z", "localTime": "2026-02-25T21:16:00", "status": "in_transit", "description": "Inscan At Hub", "location": null, "code": null }, { "timestamp": "2026-02-25T15:03:00Z", "localTime": "2026-02-25T19:03:00", "status": "in_transit", "description": "Pickup Completed", "location": null, "code": null }, { "timestamp": "2026-02-24T12:59:00Z", "localTime": "2026-02-24T16:59:00", "status": "label_created", "description": "Pickup Scheduled", "location": null, "code": null } ] } ``` ## Notes - **Source**: the server-rendered tracking page (`myjeebly.jeebly.com/shipment-tracking/`), read from its step blocks. No account is needed. - **Time zone**: the page prints UAE clock times (UTC+4, no daylight saving), so they are converted from `Asia/Dubai`. - **Not found**: a number with no steps becomes `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Jersey Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jerseypost Query live **Jersey Post** (`jerseypost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jerseypost` | | **Brand aliases** | Jersey Post, Jersey Post International, jerseypost.com | | **Category** | Jersey (Channel Islands) post (UPU S10 mail) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("JE")`: two letters + 9 digits + `JE`, valid S10 check digit | S10 mod 11 | `LX153962241JE` | | **Pass 2 (`mayMatch`)** | none | none | none | `Jersey Post` numbers are claimed by `jerseypost`, so `?carrier=jerseypost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/LX153962241JE?carrier=jerseypost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jerseypost", "trackingNumber": "LX153962241JE", "status": "delivered", "statusDescription": "Item delivered to customer", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-14T05:17:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-14T05:17:00", "status": "delivered", "description": "Item delivered to customer", "location": "Hong Kong", "code": null }, { "timestamp": null, "localTime": "2026-10-13T00:02:00", "status": "exception", "description": "Unsuccessful Delivery Attempt - Incorrect/illegible/incomplete address", "location": "Hong Kong", "code": null }, { "timestamp": null, "localTime": "2026-10-06T14:15:00", "status": "in_transit", "description": "Item assigned to Flight", "location": "Jersey", "code": null }, { "timestamp": null, "localTime": "2026-09-25T13:24:41", "status": "label_created", "description": "Awaiting Item from sender", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: scans happen in Jersey, the UK and the destination country and the feed names no zone, so only `localTime` is set. - **Not found**: result code `3` returns `404 not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Jetline Couriers Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jetlinecouriers Query live **Jetline Couriers** (`jetlinecouriers`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=jetlinecouriers` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jetlinecouriers` | | **Brand aliases** | Jetline Couriers, Jetline, jetlinecouriers.in | | **Category** | Indian surface courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is not unique to Jetline Couriers, so pass `?carrier=jetlinecouriers`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/12769898?carrier=jetlinecouriers" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jetlinecouriers", "trackingNumber": "12769898", "status": "in_transit", "statusDescription": "SHIPMENT RECEIVED AT GORAKHPUR IN GORKHP", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "GORAKHPUR", "state": null, "country": "IN" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-13", "status": "in_transit", "description": "SHIPMENT RECEIVED AT GORAKHPUR IN GORKHP", "location": "GORAKHPUR", "code": null }, { "timestamp": null, "localTime": "2026-10-12", "status": "in_transit", "description": "SHIPMENT DISPATCH FOR DESTIANTION GORAKHPUR FROM LUCKNOW", "location": "GORAKHPUR", "code": null }, { "timestamp": null, "localTime": "2026-10-12", "status": "label_created", "description": "BOOKED AT LUCKNOW", "location": "LUCKNOW", "code": null } ] } ``` ## Notes - **Detection**: the AWB is a plain 8-digit number, so pass `?carrier=jetlinecouriers`. - **Route**: the page is an ASP.NET form flow. A lookup posts the AWB to the home page, follows the redirect to `track.aspx`, then posts the grid's *View History* link back with that page's hidden fields. Three requests per number. - **Dates only**: scans carry a date (dd/mm/yyyy), so `timestamp` is `null`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Jet Logistic Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jetlogistic Query live **Jet Logistic** (`jetlogistic`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=jetlogistic` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jetlogistic` | | **Brand aliases** | Jet Logistic, Jet Logistics KZ, jetlogistic.kz | | **Category** | Kazakhstan, Russia and Kyrgyzstan cargo | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This shape is not unique to Jet Logistic, so pass `?carrier=jetlogistic`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/029210751390?carrier=jetlogistic" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jetlogistic", "trackingNumber": "029210751390", "status": "delivered", "statusDescription": "Груз выдан", "service": null, "deliveredAt": null, "deliveredAtLocal": "2020-12-04", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2020-12-04", "status": "delivered", "description": "Груз выдан", "location": null, "code": null }, { "timestamp": null, "localTime": "2020-12-02T22:04:10", "status": "in_transit", "description": "Доставка груза на склад выдачи", "location": "Караганды, Карагандинская область", "code": null }, { "timestamp": null, "localTime": "2020-11-24T13:00:00", "status": "in_transit", "description": "Забор груза от грузоотправителя", "location": "Москва, Москва Город", "code": null } ] } ``` ## Notes - **Detection**: the 12-digit shape is shared, so pass `?carrier=jetlogistic`. - **Format**: the carrier answers one block of Russian text; the stage lines (`stage-city-(region), дата выполнения : date`) and the hand-over line are read from it. Times are local to the stage's city and no zone is given; the hand-over has a date only. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Jiuhao International Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jhgj Query live **Jiuhao International** (`jhgj`) package status and scan history in a single synchronous `GET` request or MCP tool call. Jiuhao International numbers share their shape with other carriers' numbers, so pass `?carrier=jhgj`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jhgj` | | **Brand aliases** | Jiuhao International, 玖号国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=jhgj` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=jhgj` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Jiuhao International tracking numbers have no shape of their own, so always pass `?carrier=jhgj`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Jiuhao International in one request. - **Platform**: Jiuhao International runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # JDT Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jiudt Query live **JDT Logistics** (`jiudt`) package status and scan history in a single synchronous `GET` request or MCP tool call. JDT Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=jiudt`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jiudt` | | **Brand aliases** | JDT Logistics, 玖鼎通国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=jiudt` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=jiudt` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | JDT Logistics tracking numbers have no shape of their own, so always pass `?carrier=jiudt`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to JDT Logistics in one request. - **Platform**: JDT Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # JNE Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jne Query live **JNE** (`jne`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jne` | | **Brand aliases** | JNE, Jalur Nugraha Ekakurir, JNE Express, jne.co.id | | **Category** | Indonesian parcel courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^JT\d{11}$/` | none | `JT61692093502` | | **Pass 2 (`mayMatch`)** | none | none | none | `JNE` numbers are claimed by `jne`, so `?carrier=jne` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JT61692093502?carrier=jne" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jne", "trackingNumber": "JT61692093502", "status": "delivered", "statusDescription": "DELIVERED TO", "service": "JTR5", "deliveredAt": null, "deliveredAtLocal": "2025-08-23T16:14:00", "signedBy": "Siti", "destination": { "city": "JONGGOL,KAB.BOGOR", "state": null, "country": "ID" }, "message": null, "events": [ { "timestamp": null, "localTime": "2025-08-23T16:14:00", "status": "delivered", "description": "DELIVERED TO", "location": "BOGOR", "code": null }, { "timestamp": null, "localTime": "2025-08-23T10:53:00", "status": "out_for_delivery", "description": "WITH DELIVERY COURIER", "location": "BOGOR, DROP POINT JONGGOL", "code": null }, { "timestamp": null, "localTime": "2025-08-22T20:42:00", "status": "in_transit", "description": "SHIPMENT RECEIVED AT", "location": "TANGERANG, OUT BANMAS", "code": null } ] } ``` ## Notes - **Route**: a guest login returns a token, then the lookup is sent with it. A batch uses one token. - **Time zone**: Indonesia has three zones and the feed names none, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Jordan Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jordanpost Query live **Jordan Post** (`jordanpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jordanpost` | | **Brand aliases** | Jordan Post, Jordan Post Company, jordanpost.com.jo | | **Category** | Jordanian national post (UPU S10 mail) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("JO")`: two letters + 9 digits + `JO`, valid S10 check digit | S10 mod 11 | `RR549463016JO` | | **Pass 2 (`mayMatch`)** | none | none | none | `Jordan Post` numbers are claimed by `jordanpost`, so `?carrier=jordanpost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RR549463016JO?carrier=jordanpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jordanpost", "trackingNumber": "RR549463016JO", "status": "in_transit", "statusDescription": "Insert item into bag (Otb)", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2025-02-20T09:47:43Z", "localTime": "2025-02-20T12:47:43", "status": "in_transit", "description": "Insert item into bag (Otb)", "location": "AMMAN, Jordan", "code": null }, { "timestamp": "2025-02-20T09:37:19Z", "localTime": "2025-02-20T12:37:19", "status": "in_transit", "description": "Receive item at office of exchange (Otb)", "location": "AMMAN, Jordan", "code": null }, { "timestamp": "2025-02-19T08:31:00Z", "localTime": "2025-02-19T11:31:00", "status": "in_transit", "description": "Receive item from customer (Otb)", "location": "AMMAN, Jordan", "code": null } ] } ``` ## Notes - **Route**: the site's hostname serves an expired certificate and a 403, but the IP `212.35.69.85` answers with a valid certificate that lists it, so the request goes to the IP. - **Time zone**: scans in Jordan are `Asia/Amman` (UTC+3 since 2022, earlier daylight-saving rules before); scans in other countries keep only `localTime`. Dates are month-first. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # JS Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jsexpress Query live **JS Express** (`jsexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the number format below. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jsexpress` | | **Brand aliases** | JS Express, JSE, js-exp.com | | **Category** | China cross-border parcels (JS Express) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^JSE[A-Z]{2}\d{10}YQ$/` | none | `JSEJA1143458320YQ` | | **Pass 2 (`mayMatch`)** | none | none | none | `JS Express` numbers are claimed by `jsexpress`, so `?carrier=jsexpress` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JSEJA1143458320YQ?carrier=jsexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jsexpress", "trackingNumber": "JSEJA1143458320YQ", "status": "delivered", "statusDescription": "Delivered (Bracebridge, ON)", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-16T21:19:16", "signedBy": null, "destination": { "city": null, "state": null, "country": "Canada" }, "message": "Handed to Straightship as JSEJA1143458320YQ", "events": [ { "timestamp": null, "localTime": "2026-10-16T21:19:16", "status": "delivered", "description": "Delivered (Bracebridge, ON)", "location": "Bracebridge, ON", "code": "DSD" }, { "timestamp": "2026-10-12T00:30:28Z", "localTime": "2026-10-11T20:30:28", "status": "in_transit", "description": "Item Flight landing", "location": "Toronto, Ontario Province", "code": "OIT" }, { "timestamp": "2026-10-07T00:08:10Z", "localTime": "2026-10-07T08:08:10", "status": "label_created", "description": "Electronic notification of order creation received.", "location": "Shenzhen", "code": "OIR" } ] } ``` ## Notes - **Handoff**: `message` names the last-mile carrier and its number (for example `"Handed to Straightship as JSEJA1143458320YQ"`). Pass it to `GET /v1/track/{number}` for that carrier's own scans. - **Time zone**: each scan has a wall-clock time and an offset, but `+08:00` is also stamped on destination scans. That offset is trusted only for scans in China or Hong Kong; others use their real offset (`-04:00`, `-07:00`) or keep only `localTime`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Jumppoint Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jumppoint Query live **Jumppoint** (`jumppoint`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jumppoint` | | **Brand aliases** | Jumppoint, Jumppoint HK, jumppoint.io | | **Category** | Hong Kong parcel delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=JP135264631722,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | /^JP\d{12}$/ | none | `JP135264631722` | | **Pass 2 (`mayMatch`)** | none | none | none | `JP` + 12 digits belong to Jumppoint alone, so `?carrier=jumppoint` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JP135264631722?carrier=jumppoint" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jumppoint", "trackingNumber": "JP135264631722", "status": "delivered", "statusDescription": "Completed (signed by recipient)", "service": "parcel", "deliveredAt": "2026-05-02T08:41:12Z", "deliveredAtLocal": "2026-05-02T16:41:12", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-02T08:41:12Z", "localTime": "2026-05-02T16:41:12", "status": "delivered", "description": "Completed (signed by recipient)", "location": null, "code": "COMPLETED" }, { "timestamp": "2026-05-02T04:02:55Z", "localTime": "2026-05-02T12:02:55", "status": "out_for_delivery", "description": "On the way to customer", "location": null, "code": "ON_THE_WAY_TO_CUSTOMER" }, { "timestamp": "2026-05-02T03:30:10Z", "localTime": "2026-05-02T11:30:10", "status": "in_transit", "description": "Passed to courier", "location": null, "code": "PASSED_TO_COURIER" }, { "timestamp": "2026-05-01T22:15:03Z", "localTime": "2026-05-02T06:15:03", "status": "label_created", "description": "Confirmed", "location": null, "code": "CONFIRMED" } ] } ``` ## Notes - **Time zone**: Jumppoint sends scan times in UTC. `timestamp` is that instant; `localTime` is the same moment in Hong Kong time (UTC+8), since Jumppoint is a Hong Kong service. - **Status codes**: `CONFIRMED`, `PASSED_TO_COURIER`, `ON_THE_WAY_TO_CUSTOMER` and `COMPLETED` are mapped directly. Any other code is shown in plain words and classified from its wording. - **Remarks**: a scan's `remarks` text, when present, follows the description in brackets. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # JYExpress Tracking API & MCP URL: https://docs.lastscanned.com/carriers/jyexpress Query live **JYExpress** (`jyexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. JYExpress numbers share their shape with China Post and DHL numbers, so pass `?carrier=jyexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `jyexpress` | | **Brand aliases** | JYExpress, JY Express, JY-Express | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=jyexpress` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=jyexpress` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | JYExpress tracking numbers are mostly China Post S10 numbers (`LN666628565CN`, `LN666628565CN`) or 10 digits, and other carriers own those shapes, so always pass `?carrier=jyexpress`. The tracker also accepts the shipper's reference number and the JY invoice number. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/LN666628565CN?carrier=jyexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "jyexpress", "trackingNumber": "LN666628565CN", "status": "delivered", "statusDescription": "Delivered, Front Door/Porch", "service": "广州EUB", "deliveredAt": null, "deliveredAtLocal": "2026-02-14T14:32:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-02-14T14:32:00", "status": "delivered", "description": "Delivered, Front Door/Porch", "location": "TINLEY PARK, IL 60477", "code": null }, { "timestamp": null, "localTime": "2026-02-07T22:44:00", "status": "in_transit", "description": "收寄", "location": "广州市邮政速递物流公司国际业务分公司", "code": null } ] } ``` ## Notes - **Scan wording**: scans are in Chinese for the Chinese leg and in the destination post's English (USPS, DHL) for the rest. - **Time zone**: scan times come with no zone and span China and the destination, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to JYExpress in one request. - **Platform**: JYExpress runs the Hualei (华磊) tracker, which other Chinese forwarders also use. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Kazpost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/kazpost Query live **Kazpost** (`kazpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `kazpost` | | **Brand aliases** | Kazpost, Kazakhstan Post, Казпочта, post.kz | | **Category** | Kazakhstan national post (UPU S10 items) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EL180811365KZ,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("KZ")`: `/^[A-Z]{2}\d{9}KZ$/` with a valid UPU S10 check digit | UPU S10 | `EL180811365KZ` | | **Pass 2 (`mayMatch`)** | none | none | none | Items ending `KZ` belong to Kazpost alone. Items other posts send to Kazakhstan end in their own country code, so pass `?carrier=kazpost` for those. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EL180811365KZ?carrier=kazpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "kazpost", "trackingNumber": "EL180811365KZ", "status": "delivered", "statusDescription": "Вручено", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-12T09:20:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-12T09:20:00", "status": "delivered", "description": "Вручено", "location": "Управление приема обработки и доставки EMS, Город республиканского значения Астана", "code": "DPAY_I" }, { "timestamp": null, "localTime": "2026-03-12T06:10:00", "status": "out_for_delivery", "description": "Передано почтальону/курьеру на доставку", "location": "Управление приема обработки и доставки EMS, Город республиканского значения Астана", "code": "DLV_I" }, { "timestamp": null, "localTime": "2026-03-10T23:45:00", "status": "in_transit", "description": "Прошло таможенное оформление", "location": "ИЛЦ ЮГ Актобе (Место международного почтового обмена)", "code": "SNDZONE_T" }, { "timestamp": "2026-03-09T14:02:00Z", "localTime": "2026-03-09T19:02:00", "status": "in_transit", "description": "Принято почтовое отправление", "location": "ИЛЦ ЮГ Актобе (Место международного почтового обмена)", "code": "Registered" } ] } ``` ## Notes - **Wording**: Kazpost's tracking API returns status codes only. The tracking page turns them into text from a dictionary in its own script; the same Russian dictionary is built in. Internal sorting acts the page does not show (`Act_G`, `New_act_G` and similar) are left out. - **Time zone**: times carry no zone (Kazakhstan changed its time zones in 2024), so only `localTime` is given. - **Other posts' items**: Kazpost also tracks S10 items other posts send to Kazakhstan, but those are not detected automatically; pass `?carrier=kazpost`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # KEX Express Thailand (Kerry Express) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/kex Query live **KEX Express Thailand** (`kex`) package status and scan history in a single synchronous `GET` request or MCP tool call. KEX numbers are not auto-detected, so pass `?carrier=kex`. `lastscanned` returns a normalized `TrackingResult` JSON payload, with no KEX account or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `kex` | | **Brand & service aliases** | KEX Express, KEX Express Thailand, Kerry Express Thailand, `th.kex-express.com` | | **Category** | Thai domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=kex` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=DCAT0000175027,...&carrier=kex` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | | **Explicit (`?carrier=kex`)** | The consignment number printed on the KEX label or in the sender's message | n/a | `DCAT0000175027` | KEX numbers come in several shapes that other carriers share, so `?carrier=kex` is required. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/DCAT0000175027?carrier=kex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/DCAT0000175027?carrier=kex", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "DCAT0000175027", "carrier": "kex" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "kex", "trackingNumber": "DCAT0000175027", "status": "out_for_delivery", "statusDescription": "Out for delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": "Chiang Mai", "country": "TH" }, "events": [ { "timestamp": "2026-10-26T02:15:00Z", "localTime": "2026-10-26T09:15:00", "status": "out_for_delivery", "description": "Out for delivery", "location": "Chiang Mai", "code": "060.01" }, { "timestamp": "2026-10-25T15:40:00Z", "localTime": "2026-10-25T22:40:00", "status": "in_transit", "description": "Arrived at hub", "location": "Bangkok", "code": "105" } ] } ``` ## Notes - Scan times are Thailand time, returned with a UTC `timestamp` and the scan's `localTime`. - `delivered` is set from KEX's own codes (`POD` and `400`), `returned` from `401`, and `out_for_delivery` from the `060` family. - When KEX gives a due date it is returned as `estimatedDelivery`. - Some KEX proofs of delivery (signature, photo) are only shown in the KEX app and are not returned. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # KEX Express Hong Kong Tracking API & MCP URL: https://docs.lastscanned.com/carriers/kexexpresshk Query live **KEX Express Hong Kong** (`kexexpresshk`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `kexexpresshk` | | **Brand aliases** | KEX Express Hong Kong, KEX HK, Kerry Express Hong Kong, kex.kln.com | | **Category** | Hong Kong express parcels (formerly Kerry Express Hong Kong) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=L511058521,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^KEHKAZ\d{8}$/` | none | `L511058521` | | **Pass 2 (`mayMatch`)** | `/^L\d{9}$/` | none | `L511058521` | `KEHKAZ…` numbers belong to KEX Express Hong Kong alone. The `L` + 9 digit shape is only a loose fallback, so pass `?carrier=kexexpresshk` for it. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/L511058521?carrier=kexexpresshk" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "kexexpresshk", "trackingNumber": "L511058521", "status": "delivered", "statusDescription": "Shipment is delivered. Thank you for using KEX Express", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-14", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-02-14", "status": "delivered", "description": "Shipment is delivered. Thank you for using KEX Express", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-14", "status": "in_transit", "description": "Shipment is on the way of delivery", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-13", "status": "in_transit", "description": "Shipment arrived at KEX Express sortation hub", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-12", "status": "label_created", "description": "KEX Express has received the order information. The package is not yet received by KEX Express.", "location": null, "code": null } ] } ``` ## Notes - **Dates only**: the page shows a date for each scan and no time of day (its AM/PM marker is not a real time), so `timestamp` is `null` and `localTime` is a date. Scans on one day stay in the page's order. - **Branding**: older parcels read "Kerry Express" in their scan text; the service is the same. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Korea Post (EMS, International Mail) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/koreapost Query live **Korea Post** (`koreapost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `KR` (with a valid check digit) in Pass 1 and returns a normalized `TrackingResult` JSON payload, with no Korea Post account or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `koreapost` | | **Brand & service aliases** | Korea Post (우정사업본부), ePOST, Korea EMS, `service.epost.go.kr`, S10 `…KR` | | **Category** | National postal operator (South Korea), international mail | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=6097542557191,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Korea Post - **Korean HTML to English-keyed JSON**: ePOST returns Korean server-rendered HTML. `lastscanned` reads the scan table and maps Korean status words (배달완료, 배달준비, 미배달, 반송) to the standard statuses. - **Local-time caveat handled**: after the parcel leaves Korea, ePOST prints the destination's local time. Only scans at a Korean post office get a UTC `timestamp` (`Asia/Seoul`). ## Tracking Number Formats & Auto-Detection (`matches`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}KR$/` (UPU S10) | S10 mod-11 | `6097542557191` | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | Only S10 numbers whose check digit is valid are claimed. Anything else needs `?carrier=koreapost`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/6097542557191?carrier=koreapost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "6097542557191" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "koreapost", "trackingNumber": "6097542557191", "status": "delivered", "statusDescription": "배달완료", "service": null, "deliveredAt": "2026-10-22T05:20:00Z", "deliveredAtLocal": "2026-10-22T14:20:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-22T05:20:00Z", "localTime": "2026-10-22T14:20:00", "status": "delivered", "description": "배달완료", "location": "Seoul Post Office", "code": null }, { "timestamp": "2026-10-22T00:05:00Z", "localTime": "2026-10-22T09:05:00", "status": "out_for_delivery", "description": "배달준비", "location": "Seoul Post Office", "code": null }, { "timestamp": "2026-10-20T09:40:00Z", "localTime": "2026-10-20T18:40:00", "status": "in_transit", "description": "발송교환국 도착", "location": "Incheon International Mail Center", "code": null } ] } ``` ## Notes - **Unverified scan layout**: the scan-row parser was written from the page markup without a live number to compare; the not-found path was verified. - **Domestic numbers**: Korea Post's 13-digit domestic numbers are not auto-detected; only S10 numbers ending `KR` are. - An unknown number returns `404 not_found` (cached for 5 minutes). ## Related Resources - **Live browser lookup tool**: [Track a Korea Post package live on lastscanned.com/lookup/koreapost](https://lastscanned.com/lookup/koreapost) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Kuehne+Nagel Tracking API & MCP URL: https://docs.lastscanned.com/carriers/kuehnenagel Query live **Kuehne+Nagel** (`kuehnenagel`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `kuehnenagel` | | **Brand aliases** | Kuehne+Nagel, Kuehne Nagel, Kühne + Nagel, KN, mykn.kuehne-nagel.com | | **Category** | Freight forwarding and road logistics | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RWM009228162,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^RWM\d{9}$/` or `/^\d{2}A\d{9}$/` | none | `RWM009228162` | `RWM` numbers are also claimed by an earlier carrier in detection, so pass `?carrier=kuehnenagel` for Kuehne+Nagel references. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RWM009228162?carrier=kuehnenagel" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "kuehnenagel", "trackingNumber": "RWM009228162", "status": "delivered", "statusDescription": "Proof of delivery available", "service": "road", "deliveredAt": "2026-06-04T09:04:00Z", "deliveredAtLocal": "2026-06-04T09:04:00", "signedBy": null, "destination": { "city": "OLESNICA SLASKA", "state": null, "country": "PL" }, "events": [ { "timestamp": "2026-06-04T09:04:00Z", "localTime": "2026-06-04T09:04:00", "status": "delivered", "description": "Proof of delivery available", "location": null, "code": "pod-available" }, { "timestamp": "2026-06-04T08:04:00Z", "localTime": "2026-06-04T10:04:00", "status": "delivered", "description": "Cargo delivered", "location": "OLESNICA SLASKA, PL", "code": "cargo-delivered" }, { "timestamp": "2026-06-04T05:21:00Z", "localTime": "2026-06-04T07:21:00", "status": "out_for_delivery", "description": "In delivery", "location": "Wroclaw, PL", "code": "in-delivery" }, { "timestamp": "2026-05-29T07:12:00Z", "localTime": "2026-05-29T09:12:00", "status": "in_transit", "description": "Vehicle arrived", "location": "Poznan, PL", "code": "vehicle-arrived" }, { "timestamp": "2026-05-26T10:00:00Z", "localTime": "2026-05-26T10:00:00", "status": "label_created", "description": "Booking submission", "location": null, "code": "booking-submission" } ] } ``` ## Notes - **Three calls**: the shipment list finds the shipment, then its route (location milestones) and information milestones are read. Only milestones that have happened are shown; planned ones are left out. - **Times**: every milestone has its own UTC offset, so `timestamp` and `localTime` are both exact. - **Detection**: the `RWM` shape is claimed by another carrier first, so Kuehne+Nagel is only reached with `?carrier=kuehnenagel`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Kun Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/kunexpress Query live **Kun Express** (`kunexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `kunexpress` | | **Brand aliases** | Kun Express, KUN, KUN Logistics | | **Category** | China to US cross-border e-commerce | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=KUN7000012345,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^KUN\d{10}$/` | none | `KUN7000012345` | | **Pass 2 (`mayMatch`)** | none | none | none | `KUN` + 10 digits belong to Kun Express alone, so `?carrier=kunexpress` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/KUN7000012345?carrier=kunexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "kunexpress", "trackingNumber": "KUN7000012345", "status": "delivered", "statusDescription": "Delivered, In/At Mailbox", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-04-20T15:12:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-04-20T15:12:00", "status": "delivered", "description": "Delivered, In/At Mailbox", "location": "DENVER,CO 80202", "code": null }, { "timestamp": null, "localTime": "2026-04-20T08:40:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "DENVER,CO 80202", "code": null }, { "timestamp": null, "localTime": "2026-04-18T21:05:00", "status": "in_transit", "description": "Arrived at USPS Regional Facility", "location": "DENVER CO DISTRIBUTION CENTER", "code": null }, { "timestamp": null, "localTime": "2026-04-08T10:30:00", "status": "label_created", "description": "Shipment information received", "location": null, "code": null } ] } ``` ## Notes - **Route**: queries the forwarder's Hualei (华磊) tracking endpoint and normalizes the scan history. - **Time zone**: each scan is in the clock of the place it happened (China for pick-up and export, the US for the rest) and the page gives no zone, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Kunyoung Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/kunyoung Query live **Kunyoung Express** (`kunyoung`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=kunyoung` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `kunyoung` | | **Brand aliases** | Kunyoung Express, Kunyoung Logistics, 건영택배, kunyoung.com | | **Category** | South Korean parcel delivery (건영택배) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=8800145352,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Ten-digit waybills are used by several Korean carriers, so pass `?carrier=kunyoung`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/8800145352?carrier=kunyoung" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "kunyoung", "trackingNumber": "8800145352", "status": "delivered", "statusDescription": "배송을 완료하였습니다.", "service": null, "deliveredAt": "2026-01-16T05:15:06Z", "deliveredAtLocal": "2026-01-16T14:15:06", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-01-16T05:15:06Z", "localTime": "2026-01-16T14:15:06", "status": "delivered", "description": "배송을 완료하였습니다.", "location": "건영로젠", "code": "Y" }, { "timestamp": "2026-01-15T09:32:13Z", "localTime": "2026-01-15T18:32:13", "status": "in_transit", "description": "배송할 터미널에 도착하였습니다.", "location": "군포터미널", "code": "V" }, { "timestamp": "2026-01-15T09:22:13Z", "localTime": "2026-01-15T18:22:13", "status": "label_created", "description": "배송 예정인 상품을 접수하였습니다.", "location": null, "code": "A" } ] } ``` ## Notes - **Wording**: scan text is Korean, as on the carrier's page. - **Time zone**: Korea Standard Time (`Asia/Seoul`, UTC+9); `timestamp` is converted from that. - **Detection**: a ten-digit number is not specific to Kunyoung, so it is only reached with `?carrier=kunyoung`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Kyungdong Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/kyoungdong Query live **Kyungdong Express** (`kyoungdong`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=kyoungdong` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `kyoungdong` | | **Brand aliases** | Kyungdong Express, Kyoungdong Express, 경동택배, kdexp.com | | **Category** | South Korean parcel and freight delivery (경동택배) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=8026081691918,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Thirteen-digit waybills are used by more than one Korean carrier, so pass `?carrier=kyoungdong`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/8026081691918?carrier=kyoungdong" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "kyoungdong", "trackingNumber": "8026081691918", "status": "delivered", "statusDescription": "배송완료", "service": null, "deliveredAt": "2026-02-10T03:41:49Z", "deliveredAtLocal": "2026-02-10T12:41:49", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-10T03:41:49Z", "localTime": "2026-02-10T12:41:49", "status": "delivered", "description": "배송완료", "location": "홍길동(배송기사)", "code": "0007" }, { "timestamp": "2026-02-10T03:41:33Z", "localTime": "2026-02-10T12:41:33", "status": "out_for_delivery", "description": "배송중", "location": "서울강동지점", "code": "0008" }, { "timestamp": "2026-02-09T19:25:19Z", "localTime": "2026-02-10T04:25:19", "status": "in_transit", "description": "도착", "location": "서울강동지점", "code": "0006" }, { "timestamp": "2026-02-09T00:33:27Z", "localTime": "2026-02-09T09:33:27", "status": "in_transit", "description": "발송", "location": "김포지점", "code": "0002" } ] } ``` ## Notes - **Wording**: scan text is Korean (`발송` sent, `도착` arrived, `배송중` out for delivery, `배송완료` delivered). - **Time zone**: Korea Standard Time (`Asia/Seoul`, UTC+9); `timestamp` is converted from that. - **Unknown number**: the carrier answers `result: fail`, which is returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Kyrgyz Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/kyrgyzpost Query live **Kyrgyz Post** (`kyrgyzpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `kyrgyzpost` | | **Brand aliases** | Kyrgyz Post, Kyrgyzstan Post, Кыргыз Почтасы, post.kg | | **Category** | Kyrgyzstan national post (UPU S10 items) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RO176297048RU,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("KG")`: `/^[A-Z]{2}\d{9}KG$/` with a valid UPU S10 check digit | UPU S10 | `RO176297048RU` | | **Pass 2 (`mayMatch`)** | none | none | none | Items ending `KG` belong to Kyrgyz Post alone. Items other posts send to Kyrgyzstan (for example from Russia) end in their own code, so pass `?carrier=kyrgyzpost` for those. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RO176297048RU?carrier=kyrgyzpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "kyrgyzpost", "trackingNumber": "RO176297048RU", "status": "in_transit", "statusDescription": "Поступило в отделение связи Бишкек 1", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-20T08:49:10", "status": "in_transit", "description": "Поступило в отделение связи Бишкек 1", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-20T00:15:47", "status": "in_transit", "description": "Отправлено из РФ в отделение связи Бишкек 1", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-19T11:16:52", "status": "in_transit", "description": "Поступило в ЦМПОЛ", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-02T12:01:00", "status": "in_transit", "description": "Вложить отправление в мешок (исх.)", "location": "ORENBURG", "code": null } ] } ``` ## Notes - **Wording**: Kyrgyz Post's scan text is Russian. A trailing `Офис: ` is moved into `location`. - **Time zone**: the list mixes offices in Kyrgyzstan and abroad and gives no zone, so only `localTime` is set. - **Inbound items**: the tracker also reads S10 items of other posts that were sent to Kyrgyzstan (`…RU`, `…CN`), which are not detected automatically. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Laar Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/laarcourier Query live **Laar Courier** (`laarcourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=laarcourier` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `laarcourier` | | **Brand aliases** | Laar Courier, Laar, laarcourier.com | | **Category** | Ecuador courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2024015842,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Guia numbers are plain digits shared with other formats, so pass `?carrier=laarcourier`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2024015842?carrier=laarcourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "laarcourier", "trackingNumber": "2024015842", "status": "delivered", "statusDescription": "Entrega al Destinatario", "service": null, "deliveredAt": "2026-02-05T14:10:51Z", "deliveredAtLocal": "2026-02-05T09:10:51", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-05T14:10:51Z", "localTime": "2026-02-05T09:10:51", "status": "delivered", "description": "Entrega al Destinatario", "location": "Guayaquil", "code": "7" }, { "timestamp": "2026-02-05T13:30:48Z", "localTime": "2026-02-05T08:30:48", "status": "out_for_delivery", "description": "En zona para entrega al destino", "location": "Guayaquil", "code": "6" }, { "timestamp": "2026-02-04T01:07:11Z", "localTime": "2026-02-03T20:07:11", "status": "in_transit", "description": "En proceso operativo", "location": "Guayaquil", "code": "5" }, { "timestamp": "2026-02-04T00:12:35Z", "localTime": "2026-02-03T19:12:35", "status": "in_transit", "description": "Envío Recolectado", "location": "Daule", "code": "3" } ] } ``` ## Notes - **Credentials**: the tracking site's own script (`assets/main-*.js`) contains the Basic credentials and the `API_KEY_LAAR` value it sends, so they are public and are repeated by the adapter. - **Privacy**: the same API also returns the parties' names, addresses and phone numbers; only the stage list is used. - **Time zone**: Ecuador time (`America/Guayaquil`, UTC-5, no DST); `timestamp` is converted from that. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # LaBaih Tracking API & MCP URL: https://docs.lastscanned.com/carriers/labaih Query live **LaBaih** (`labaih`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=labaih` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `labaih` | | **Brand aliases** | LaBaih, La Baih, لبيه, mylabaih.com | | **Category** | Saudi Arabian last-mile delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=25010112000012,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | A 14-digit number whose first 12 digits are the creation date and time is not specific enough to claim, so pass `?carrier=labaih`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/25010112000012?carrier=labaih" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "labaih", "trackingNumber": "25010112000012", "status": "delivered", "statusDescription": "Shipment Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-01-03T00:31:22", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-01-03T00:31:22", "status": "delivered", "description": "Shipment Delivered", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-01-02T22:52:33", "status": "in_transit", "description": "In-Transit to Customer", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-01-01T23:50:32", "status": "in_transit", "description": "Arrived at Riyadh Facility", "location": "Riyadh", "code": null }, { "timestamp": null, "localTime": "2026-01-01T18:39:46", "status": "label_created", "description": "Shipment created", "location": null, "code": null } ] } ``` ## Notes - **Page comments**: the page contains HTML comments with sample markup (a 2021 demo timeline); they are removed before reading. - **Time zone**: the page does not state one, so only `localTime` is given. - **Unknown number**: the site redirects (302) to its 404 page, which is returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Landmark Global Tracking API & MCP URL: https://docs.lastscanned.com/carriers/landmark Query live **Landmark Global** (`landmark`) package status, scan history, and the **destination carrier's tracking number** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `LTN…` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `landmark` | | **Brand aliases** | Landmark Global, Landmark Tracking, bpost cross-border, LTN | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=LTN...,LTN...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^LTN\d{8,14}$/` | none | `LTN480634985` | | **Pass 2 (`mayMatch`)** | none | none | none | `LTN` numbers belong to Landmark alone, so `?carrier=landmark` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/LTN480634985?carrier=landmark" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "landmark", "trackingNumber": "LTN480634985", "status": "delivered", "statusDescription": "Delivered to recipient's front door", "service": null, "deliveredAt": "2026-08-10T17:40:27Z", "deliveredAtLocal": "2026-08-10T12:40:27", "signedBy": null, "destination": { "city": "Edmonton", "state": "AB", "country": "CA" }, "message": "Handed to Canada Post as 4013555822229464", "events": [ { "timestamp": "2026-08-10T17:40:27Z", "localTime": "2026-08-10T12:40:27", "status": "delivered", "description": "Delivered to recipient's front door", "location": "Edmonton, AB", "code": null }, { "timestamp": "2026-08-04T20:32:17Z", "localTime": "2026-08-04T15:32:17", "status": "in_transit", "description": "Item picked up by Canada Post", "location": "York, ON", "code": null } ] } ``` ## Notes - **Handoff**: `message` names the delivery partner and its number (for example `"Handed to Canada Post as 4013555822229464"`). Pass that number to `GET /v1/track/{number}` for the partner's own scans. - **Time zone**: Landmark's page prints scan times in US Central time, whatever the parcel's location. `localTime` is that clock time and `timestamp` is it converted from `America/Chicago`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # La Poste / Colissimo / Chronopost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/laposte Query live **La Poste** (`laposte`, covering **Colissimo**, **Chronopost** and tracked mail such as Lettre suivie and Recommandé) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects Colissimo parcel numbers and UPU S10 numbers ending `FR`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `laposte` | | **Brand & service aliases** | La Poste, Colissimo, Chronopost, Lettre suivie, Recommandé | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=NUMBER1,NUMBER2` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — Colissimo** | 1 digit, 1 letter, then 11 digits (13 characters) | GS1 mod-10 over the 11 digits | `5N30053962734` | | **Pass 1 (`matches`) — UPU S10** | 2 letters, 9 digits, `FR` | UPU S10 mod-11 | `5N30053962734` | | **Pass 2 (`mayMatch`)** | *None* | — | — | Chronopost numbers that are not S10 shaped need `?carrier=laposte`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/5N30053962734?carrier=laposte" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/5N30053962734?carrier=laposte", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "5N30053962734" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "laposte", "trackingNumber": "5N30053962734", "status": "in_transit", "statusDescription": "Votre Colissimo est en cours de traitement sur le site de tri local.", "service": "Colissimo", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "estimatedDelivery": null, "message": null, "events": [ { "timestamp": "2026-10-08T06:59:01Z", "localTime": "2026-10-08T08:59:01", "status": "in_transit", "description": "Votre Colissimo est en cours de traitement sur le site de tri local.", "location": "FR", "code": "EP1" } ] } ``` ## Notes - Scan wording is French, as La Poste prints it. Each scan carries its own UTC offset, so `timestamp` is exact. - A number La Poste has no scans for yet, and a number with a wrong check digit, both come back as `not_found`. - When the parcel goes on under a partner's number (international Colissimo), `message` reads `"Handed to as "`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # La Poste Burkina Faso Tracking API & MCP URL: https://docs.lastscanned.com/carriers/laposteburkinafaso Query live **La Poste Burkina Faso** (`laposteburkinafaso`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `laposteburkinafaso` | | **Brand aliases** | La Poste Burkina Faso, Burkina Faso Post, SONAPOST, laposte.bf | | **Category** | Burkina Faso national post (UPU S10 items) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CA000591121BF,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("BF")`: `/^[A-Z]{2}\d{9}BF$/` with a valid UPU S10 check digit | UPU S10 | `CA000591121BF` | | **Pass 2 (`mayMatch`)** | none | none | none | Items ending `BF` belong to La Poste Burkina Faso alone. Items other posts send to Burkina Faso end in their own code, so pass `?carrier=laposteburkinafaso` for those. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CA000591121BF?carrier=laposteburkinafaso" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "laposteburkinafaso", "trackingNumber": "CA000591121BF", "status": "delivered", "statusDescription": "Deliver item (Inb)", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-01-22T12:14:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-01-22T12:14:00", "status": "delivered", "description": "Deliver item (Inb)", "location": "512140, France", "code": null }, { "timestamp": null, "localTime": "2026-01-22T00:00:00", "status": "out_for_delivery", "description": "Send item out for physical delivery (Inb)", "location": "512140, France", "code": null }, { "timestamp": null, "localTime": "2026-01-20T08:47:00", "status": "in_transit", "description": "Receive item at sorting centre (Inb)", "location": "556140, France", "code": null }, { "timestamp": null, "localTime": "2026-01-19T07:00:00", "status": "in_transit", "description": "Receive item at office of exchange (Inb)", "location": "CHILLY MAZARIN CENTRE ECHANGES INT, France", "code": null } ] } ``` ## Notes - **HTTP only**: the post's IPS Web Tracking server answers plain `http://` only and can take several seconds. - **Event names**: the IPS English names are shown as they are (`Deliver item (Inb)`). The `Country` column is added to the location. - **Time zone**: each time is local to the event's country; events in Burkina Faso (UTC+0, no DST) get a `timestamp`, others only `localTime`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # La Poste du Sénégal Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lapostesenegal Query live **La Poste du Sénégal** (`lapostesenegal`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lapostesenegal` | | **Brand aliases** | La Poste du Sénégal, Senegal Post, La Poste Sénégal, laposte.sn | | **Category** | Senegal national post (UPU S10 items) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RR021441710SN,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("SN")`: `/^[A-Z]{2}\d{9}SN$/` with a valid UPU S10 check digit | UPU S10 | `RR021441710SN` | | **Pass 2 (`mayMatch`)** | none | none | none | Items ending `SN` belong to La Poste du Sénégal alone. Items other posts send to Senegal end in their own code, so pass `?carrier=lapostesenegal` for those. Jotnaci numbers go to another system and are not read. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RR021441710SN?carrier=lapostesenegal" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "lapostesenegal", "trackingNumber": "RR021441710SN", "status": "in_transit", "statusDescription": "Expédier envoi à adresse nationale (Ent)", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-08T02:53:09Z", "localTime": "2026-02-08T02:53:09", "status": "in_transit", "description": "Expédier envoi à adresse nationale (Ent)", "location": "DAKAR CENTRE DE TRI, Senegal", "code": "35" }, { "timestamp": "2026-02-07T22:59:41Z", "localTime": "2026-02-07T22:59:41", "status": "in_transit", "description": "Recevoir envoi au bureau d'échange (Ent)", "location": "DAKAR CENTRE DE TRI, Senegal", "code": "30" }, { "timestamp": "2026-02-06T09:15:00Z", "localTime": "2026-02-06T09:15:00", "status": "in_transit", "description": "Recevoir envoi au bureau de livraison (Ent)", "location": "Thiaroye, Senegal", "code": "32" } ] } ``` ## Notes - **Wording**: the French (`LocalName`) text is shown; status is worked out from the IPS English name. - **Time zone**: events in Senegal (UTC+0, no DST) get a `timestamp`; events abroad only `localTime`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Last One Mile Co-op Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lastonemilecoop Query live **Last One Mile Co-op** (`lastonemilecoop`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=lastonemilecoop` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lastonemilecoop` | | **Brand aliases** | Last One Mile Co-op, Last One Mile, ラストワンマイル協同組合, y-track.jp | | **Category** | Japanese last-mile delivery cooperative (ラストワンマイル協同組合) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=504451147642,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Twelve-digit waybills are shared with other Japanese carriers, so pass `?carrier=lastonemilecoop`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/504451147642?carrier=lastonemilecoop" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "lastonemilecoop", "trackingNumber": "504451147642", "status": "delivered", "statusDescription": "配達完了", "service": null, "deliveredAt": "2026-03-10T03:28:47Z", "deliveredAtLocal": "2026-03-10T12:28:47", "signedBy": null, "destination": null, "message": "Handed to ジー・ジー・カンパニー株式会社 as 504451147642", "events": [ { "timestamp": "2026-03-10T03:28:47Z", "localTime": "2026-03-10T12:28:47", "status": "delivered", "description": "配達完了", "location": "平和島センター", "code": null }, { "timestamp": "2026-03-09T21:43:57Z", "localTime": "2026-03-10T06:43:57", "status": "in_transit", "description": "中継連絡", "location": "LOM本部", "code": null }, { "timestamp": "2026-03-09T14:44:54Z", "localTime": "2026-03-09T23:44:54", "status": "in_transit", "description": "引受", "location": "立川立飛センター", "code": null } ] } ``` ## Notes - **Handoff**: when a scan lists a partner waybill (the second number in the waybill column) that differs from the one tracked, the parcel went on under that number and `message` names the partner and the number. Pass that number to `GET /v1/track/{number}` for the partner's own scans. - **Wording**: scan text is Japanese (`引受` accepted, `中継連絡` relay, `配達完了` delivered). - **Time zone**: Japan Standard Time (`Asia/Tokyo`, UTC+9); `timestamp` is converted from that. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # LBC Express (Philippines) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lbc Query live **LBC Express** (`lbc`) package status and scan history in a single synchronous `GET` request or MCP tool call. LBC numbers are not auto-detected, so pass `?carrier=lbc`. `lastscanned` returns a normalized `TrackingResult` JSON payload, with no LBC account or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lbc` | | **Brand & service aliases** | LBC Express, LBC, `lbcexpress.com` | | **Category** | Philippine courier and cargo, domestic and international | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=lbc` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=174004181161,...&carrier=lbc` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | | **Explicit (`?carrier=lbc`)** | 12 to 16 digits | n/a | `174004181161` | LBC numbers are plain digits, a shape other carriers share, so `?carrier=lbc` is required. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/174004181161?carrier=lbc" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/174004181161?carrier=lbc", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "174004181161", "carrier": "lbc" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "lbc", "trackingNumber": "174004181161", "status": "out_for_delivery", "statusDescription": "Out for delivery - Cebu", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-22", "status": "out_for_delivery", "description": "Out for delivery - Cebu", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-10-20", "status": "in_transit", "description": "Booked at LBC Makati", "location": null, "code": null } ] } ``` ## Notes - LBC reports a date for each scan but no time of day, so `localTime` is a date and `timestamp` is `null`. - The scan description carries LBC's own `status and location` wording, so `location` is `null`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # LeiYi Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/leiyi Query live **LeiYi Logistics** (`leiyi`) package status and scan history in a single synchronous `GET` request or MCP tool call. LeiYi Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=leiyi`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `leiyi` | | **Brand aliases** | LeiYi Logistics, 雷翼国际物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=leiyi` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=leiyi` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | LeiYi Logistics tracking numbers have no shape of their own, so always pass `?carrier=leiyi`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to LeiYi Logistics in one request. - **Platform**: LeiYi Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Leopards Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/leopardscourier Query live **Leopards Courier** (`leopardscourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=leopardscourier` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `leopardscourier` | | **Brand aliases** | Leopards Courier, Leopards, Leopard Courier, leopardscourier.com | | **Category** | Pakistan courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=KI0646202929,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `KI…` consignment numbers are shared with other formats, so pass `?carrier=leopardscourier`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/KI0646202929?carrier=leopardscourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "leopardscourier", "trackingNumber": "KI0646202929", "status": "delivered", "statusDescription": "Delivered at LAHORE", "service": null, "deliveredAt": "2026-04-12T04:26:00Z", "deliveredAtLocal": "2026-04-12T09:26:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-04-12T04:26:00Z", "localTime": "2026-04-12T09:26:00", "status": "delivered", "description": "Delivered at LAHORE", "location": "LAHORE", "code": null }, { "timestamp": "2026-04-12T03:25:00Z", "localTime": "2026-04-12T08:25:00", "status": "in_transit", "description": "Assigned to Leopards in LAHORE", "location": "LAHORE", "code": null }, { "timestamp": "2026-04-09T09:30:00Z", "localTime": "2026-04-09T14:30:00", "status": "in_transit", "description": "Inter Transfer at KARACHI", "location": "KARACHI", "code": null } ] } ``` ## Notes - **Two calls**: the tracking box first sends the number to `/shipment_tracking-new` (which stores it in the visitor's session), then the result page `/shipment_tracking_view` is fetched with that session cookie. - **Receiver name**: a delivery line ends with the name of the person who signed (`... ~ STAFF`); it is cut from the description. - **Time zone**: Pakistan time (`Asia/Karachi`, UTC+5, no DST); `timestamp` is converted from that. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Liccardi Express Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/liccardi Query live **Liccardi Express Courier** (`liccardi`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=liccardi` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `liccardi` | | **Brand aliases** | Liccardi Express Courier, Liccardi, Liccardi Trasporti, liccarditrasporti.com | | **Category** | Italian express courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=6601701813466,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Thirteen-digit numbers are not specific to Liccardi, so pass `?carrier=liccardi`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/6601701813466?carrier=liccardi" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "liccardi", "trackingNumber": "6601701813466", "status": "delivered", "statusDescription": "SPEDIZIONE CONSEGNATA", "service": null, "deliveredAt": "2026-05-14T12:24:50Z", "deliveredAtLocal": "2026-05-14T14:24:50", "signedBy": null, "destination": { "city": "Luzzi", "state": "CS", "country": "IT" }, "events": [ { "timestamp": "2026-05-14T12:24:50Z", "localTime": "2026-05-14T14:24:50", "status": "delivered", "description": "SPEDIZIONE CONSEGNATA", "location": "Catanzaro", "code": "1" }, { "timestamp": "2026-05-14T08:37:47Z", "localTime": "2026-05-14T10:37:47", "status": "out_for_delivery", "description": "IN CONSEGNA", "location": "Catanzaro", "code": "52" }, { "timestamp": "2026-05-12T03:14:00Z", "localTime": "2026-05-12T05:14:00", "status": "in_transit", "description": "ARRIVO SU FILIALE DI DESTINO", "location": "Catanzaro", "code": "72" }, { "timestamp": "2026-05-08T07:39:51Z", "localTime": "2026-05-08T09:39:51", "status": "label_created", "description": "DATI SPEDIZIONE TRASMESSI A LICCARDI", "location": "CASANDRINO", "code": "50" } ] } ``` ## Notes - **Wording**: scan text is Italian (`IN CONSEGNA` out for delivery, `SPEDIZIONE CONSEGNATA` delivered). - **Parcels**: a shipment with several parcels lists each parcel's scans; the first parcel's are shown. - **Time zone**: the API sends UTC; `localTime` is Italian time (`Europe/Rome`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Lietuvos paštas Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lietuvospastas Query live **Lietuvos paštas** (`lietuvospastas`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lietuvospastas` | | **Brand aliases** | Lietuvos paštas, Lithuania Post, Lithuanian Post, Unisend, LP Express, post.lt | | **Category** | Lithuania national post and Unisend/LP Express parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=HC025271224LT,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("LT")` or `/^(CC|CH|HC)\d{9}LT$/` | UPU S10 | `HC025271224LT` | | **Pass 2 (`mayMatch`)** | none | none | none | Items ending `LT` belong to Lietuvos paštas, including LP Express `CC`/`CH`/`HC` parcels whose numbers usually fail the S10 check digit. Items other posts send to Lithuania end in their own code, so pass `?carrier=lietuvospastas` for those. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/HC025271224LT?carrier=lietuvospastas" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "lietuvospastas", "trackingNumber": "HC025271224LT", "status": "delivered", "statusDescription": "The parcel has been delivered to the recipient", "service": null, "deliveredAt": "2026-05-08T17:48:20Z", "deliveredAtLocal": "2026-05-08T20:48:20", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-08T17:48:20Z", "localTime": "2026-05-08T20:48:20", "status": "delivered", "description": "The parcel has been delivered to the recipient", "location": "2204 paštomatas, Norfa, Palanga", "code": "DELIVERY_DELIVERED" }, { "timestamp": "2026-05-08T13:32:45Z", "localTime": "2026-05-08T16:32:45", "status": "in_transit", "description": "The parcel was delivered to the UNISEND parcel locker", "location": "2204 paštomatas, Norfa, Palanga", "code": "RECEIVED_TERMINAL" }, { "timestamp": "2026-05-08T03:47:46Z", "localTime": "2026-05-08T06:47:46", "status": "out_for_delivery", "description": "The parcel has been forwarded for delivery", "location": null, "code": "TRANSFERRED_FOR_DELIVERY_COURIER" }, { "timestamp": "2026-05-06T05:13:11Z", "localTime": "2026-05-06T08:13:11", "status": "label_created", "description": "The label for the parcel has been created", "location": null, "code": "LABEL_CREATED" } ] } ``` ## Notes - **Time zone**: events carry their own UTC offset (Lithuanian time), so `timestamp` and `localTime` are exact. - **Parcel lockers**: "delivered to the parcel locker" is a pick-up point arrival, so it stays `in_transit`; `delivered` is the recipient collecting it. - **Inbound items**: S10 items other posts send to Lithuania are tracked too, but only `LT`-suffixed and `CC`/`CH`/`HC` shapes are detected automatically. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Lightning Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lightningexpress Query live **Lightning Express** (`lightningexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lightningexpress` | | **Brand aliases** | Lightning Express, Lightning Express CA, lightningexpressca.com | | **Category** | Canadian parcel delivery (Lightning Express CA) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=YYZ123202601011234,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{3}\d{3}20\d{2}[01]\d[0-3]\d\d{4}$/` (spaces optional) | none | `YYZ122 20251212 3256` | | **Pass 2 (`mayMatch`)** | none | none | none | The region + creation date + sequence shape belongs to Lightning Express alone, with or without the spaces. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/YYZ122 20251212 3256?carrier=lightningexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "lightningexpress", "trackingNumber": "YYZ122 20251212 3256", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-01-01T18:05:43", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-01-01T18:05:43", "status": "delivered", "description": "Delivered", "location": null, "code": "2" }, { "timestamp": null, "localTime": "2026-01-01T18:03:43", "status": "in_transit", "description": "Received", "location": null, "code": "1" }, { "timestamp": null, "localTime": "2026-01-01T15:10:38", "status": "label_created", "description": "Label created", "location": null, "code": "0" } ] } ``` ## Notes - **Spaces**: waybills are printed `YYZ122 20251212 3256`; the API accepts them with or without the spaces and the result echoes the number without spaces. - **Steps**: the API gives one time per step (created, received, collected, completed, returned), not a scan list, so each step with a time becomes an event. - **Time zone**: the API does not state one, so only `localTime` is given. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Line Clear Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lineclear Query live **Line Clear Express** (`lineclear`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=lineclear` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lineclear` | | **Brand aliases** | Line Clear Express, Line Clear, LCE Malaysia, lineclearexpress.com | | **Category** | Malaysian express delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=V179130211638001,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Waybill shapes are not claimed, so pass `?carrier=lineclear`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/V179130211638001?carrier=lineclear" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "lineclear", "trackingNumber": "V179130211638001", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-04-02T03:11:36Z", "deliveredAtLocal": "2026-04-02T11:11:36", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-04-02T03:11:36Z", "localTime": "2026-04-02T11:11:36", "status": "delivered", "description": "Delivered", "location": "MUAR", "code": "WB021" }, { "timestamp": "2026-04-02T00:58:57Z", "localTime": "2026-04-02T08:58:57", "status": "out_for_delivery", "description": "Out for Delivery", "location": "MUAR", "code": "WB018" }, { "timestamp": "2026-04-01T14:15:17Z", "localTime": "2026-04-01T22:15:17", "status": "in_transit", "description": "Checked In at Pickup Branch", "location": "HBBR108AWM", "code": "WB002" }, { "timestamp": "2026-03-31T17:43:12Z", "localTime": "2026-04-01T01:43:12", "status": "label_created", "description": "Awaiting Shipment Handover", "location": "SEGAMAT", "code": "WB024" } ] } ``` ## Notes - **Credentials**: the tracker page's own bundle contains the static bearer token its API call sends, so it is public and is repeated by the adapter. - **Privacy**: each scan's `Description` names the courier who handled it; only the `Status` text is used. - **Branch names**: codes like `HTKK` are turned into place names (`MUAR`) with the site's `branchplace` lookup; a code with no name is shown as is. - **Time zone**: Malaysia time (`Asia/Kuala_Lumpur`, UTC+8); `timestamp` is converted from that. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Lingdong International Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lingdong Query live **Lingdong International** (`lingdong`) package status and scan history in a single synchronous `GET` request or MCP tool call. Lingdong International numbers share their shape with other carriers' numbers, so pass `?carrier=lingdong`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lingdong` | | **Brand aliases** | Lingdong International, 领东国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=lingdong` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=lingdong` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Lingdong International tracking numbers have no shape of their own, so always pass `?carrier=lingdong`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Lingdong International in one request. - **Platform**: Lingdong International runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # LinHan International Tracking API & MCP URL: https://docs.lastscanned.com/carriers/linhan Query live **LinHan International** (`linhan`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `linhan` | | **Brand aliases** | LinHan International, Linhan, 林汉国际, linhan56.com | | **Category** | Chinese cross-border e-commerce logistics (林汉国际) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=LHGJ32271042CD,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^LHGJ\d{8}CD$/` | none | `LHGJ32271042CD` | | **Pass 2 (`mayMatch`)** | none | none | none | `LHGJ` + 8 digits + `CD` belong to LinHan alone, so `?carrier=linhan` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/LHGJ32271042CD?carrier=linhan" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "linhan", "trackingNumber": "LHGJ32271042CD", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-05-18T04:16:36Z", "deliveredAtLocal": "2026-05-18T12:16:36", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-18T04:16:36Z", "localTime": "2026-05-18T12:16:36", "status": "delivered", "description": "Delivered", "location": "Springfield, Illinois", "code": null }, { "timestamp": "2026-05-16T03:58:58Z", "localTime": "2026-05-16T11:58:58", "status": "in_transit", "description": "Leaving the sorting center", "location": "Springfield, Illinois", "code": null }, { "timestamp": "2026-05-07T21:21:24Z", "localTime": "2026-05-08T05:21:24", "status": "in_transit", "description": "Leave the Los Angeles processing center", "location": null, "code": null }, { "timestamp": "2026-05-01T07:55:56Z", "localTime": "2026-05-01T15:55:56", "status": "label_created", "description": "Order information received", "location": null, "code": null } ] } ``` ## Notes - **Location**: US scans read `Springfield, Illinois, 62701 Delivered`; the place is moved to `location` and the ZIP and wording are separated. - **Time zone**: China time (`Asia/Shanghai`, UTC+8) for every scan; `timestamp` is converted from that. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Lion Parcel Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lionparcel Query live **Lion Parcel** (`lionparcel`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lionparcel` | | **Brand aliases** | Lion Parcel, Lion Air Parcel, LP Indonesia, lionparcel.com | | **Category** | Indonesian express parcel delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=11LP1751526746292,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^\d{2}LP\d{10,13}$/` | none | `11LP1751526746292` | | **Pass 2 (`mayMatch`)** | none | none | none | `LP` after two digits belongs to Lion Parcel, so `?carrier=lionparcel` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/11LP1751526746292?carrier=lionparcel" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "lionparcel", "trackingNumber": "11LP1751526746292", "status": "delivered", "statusDescription": "Paketmu telah sampai di tujuan & diterima", "service": "JAGOPACK", "deliveredAt": "2026-03-04T06:20:47Z", "deliveredAtLocal": "2026-03-04T13:20:47", "signedBy": null, "destination": { "city": "JAKARTA", "state": null, "country": "ID" }, "events": [ { "timestamp": "2026-03-04T06:20:47Z", "localTime": "2026-03-04T13:20:47", "status": "delivered", "description": "Paketmu telah sampai di tujuan & diterima", "location": "JAKARTA", "code": "POD" }, { "timestamp": "2026-03-04T01:19:37Z", "localTime": "2026-03-04T08:19:37", "status": "out_for_delivery", "description": "Paketmu diantar ke alamat penerima. Pastikan nomor penerima dapat dihubungi oleh kurir", "location": "JAKARTA", "code": "DEL" }, { "timestamp": "2026-03-03T08:54:47Z", "localTime": "2026-03-03T15:54:47", "status": "in_transit", "description": "Paketmu sampai di Gudang Transit Lion Parcel BOGOR KAB, GUNUNG PUTRI, BOGOR", "location": "BOGOR KAB", "code": "STI-SC" }, { "timestamp": "2026-03-03T07:12:26Z", "localTime": "2026-03-03T14:12:26", "status": "label_created", "description": "Paketmu telah diproses oleh Agen Lion Parcel BOGOR KAB, CIKEAS UDIK, GUNUNG PUTRI, BOGOR", "location": "BOGOR KAB", "code": "BKD" } ] } ``` ## Notes - **Captcha**: the tracking page sends an empty `captcha_token`, which the API accepts. - **Privacy**: delivery lines name the courier and the person who signed; the name is cut from the description. - **Time zone**: scans carry `+07:00` (Indonesian western time), so `timestamp` and `localTime` are exact. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Logen Tracking API & MCP URL: https://docs.lastscanned.com/carriers/logen Query live **Logen** (`logen`) package status and scan history in a single synchronous `GET` request or MCP tool call. Logen (로젠택배) is a South Korean domestic parcel carrier; lookups read its public tracking page. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `logen` | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=logen` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=N1,N2&carrier=logen` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Examples | |---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | | **Explicit (`?carrier=logen`)** | 11-digit waybill | `92954263220` | This shape is shared with other carriers, so always pass `?carrier=logen`. Scan times are Korean local time (`Asia/Seoul`). ## Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/92954263220?carrier=logen" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "logen", "trackingNumber": "92954263220", "status": "in_transit", "statusDescription": "In transit", "service": null, "deliveredAt": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-25T14:22:00", "status": "in_transit", "description": "In transit", "location": "Hub", "code": null } ] } ``` ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Logistiq Tracking API & MCP URL: https://docs.lastscanned.com/carriers/logistiq Query live **Logistiq** (`logistiq`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `logistiq` | | **Brand aliases** | Logistiq, Logistiq UAE, logistiq.io | | **Category** | UAE and Saudi last-mile courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ALAEAEF000892617,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^ALAEAEF\d{9}$/` | none | `ALAEAEF000892617` | | **Pass 2 (`mayMatch`)** | `/^AL[A-Z]{5,6}\d{9}$/` | none | `ALAEAEF000892617` | `ALAEAEF…` AWBs belong to Logistiq alone. Other `AL…` prefixes are only a loose fallback, so pass `?carrier=logistiq` for them. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ALAEAEF000892617?carrier=logistiq" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "logistiq", "trackingNumber": "ALAEAEF000892617", "status": "delivered", "statusDescription": "Order Delivered", "service": null, "deliveredAt": "2026-03-05T16:49:01Z", "deliveredAtLocal": "2026-03-05T20:49:01", "signedBy": null, "destination": { "city": "Al Ain", "state": null, "country": "AE" }, "events": [ { "timestamp": "2026-03-05T16:49:01Z", "localTime": "2026-03-05T20:49:01", "status": "delivered", "description": "Order Delivered", "location": "LOGAIN1", "code": "112" }, { "timestamp": "2026-03-04T18:35:48Z", "localTime": "2026-03-04T22:35:48", "status": "exception", "description": "Order Delivery Failed: Customer not available", "location": "LOGAIN1", "code": "122" }, { "timestamp": "2026-03-03T20:32:07Z", "localTime": "2026-03-04T00:32:07", "status": "in_transit", "description": "Order In Transit", "location": "LOGDXB", "code": "110" }, { "timestamp": "2026-02-28T09:25:27Z", "localTime": "2026-02-28T13:25:27", "status": "label_created", "description": "Booked", "location": null, "code": "101" } ] } ``` ## Notes - **Time zone**: Logistiq sends UTC. When the origin and destination are in the same country (UAE or Saudi Arabia, one zone each, no DST) `localTime` is that country's clock; otherwise it is the UTC wall time. - **Failed delivery**: code `122` is `exception` and its reason (`additional_remarks`) follows the description. - **Unknown AWB**: the API answers HTTP 400 `invalid AWB`, which is returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Loomis Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/loomis Query live **Loomis Express** (`loomis`, a TFI company) waybill status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` reads the same results page the tracker on loomis-express.com shows, so no account is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `loomis` | | **Brand aliases** | Loomis, Loomis Express | | **Category** | Canadian domestic courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=loomis` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=loomis` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | none | none | | **Pass 2 (`mayMatch`)** | *None* | none | none | | **Explicit (`?carrier=loomis`)** | Loomis waybill numbers (plain digits) | none | `NET78458182` | Loomis waybills are plain digits with no check digit, so a number is never auto-detected as Loomis. Always pass `?carrier=loomis`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/NET78458182?carrier=loomis" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/NET78458182?carrier=loomis", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "NET78458182", "carrier": "loomis" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "loomis", "trackingNumber": "NET78458182", "status": "in_transit", "statusDescription": "Package Has Arrived at Our Facility", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-26T18:45:58", "status": "in_transit", "description": "Package Has Arrived at Our Facility", "location": "ETOBICOKE", "code": null }, { "timestamp": null, "localTime": "2026-10-23T18:56:00", "status": "in_transit", "description": "Package Has Arrived at Our Facility", "location": "ETOBICOKE", "code": null } ] } ``` ## Notes - **Times**: each scan shows a local date and time and a city but no province, so only `localTime` is set and `timestamp` is `null`. - **Unknown numbers**: Loomis answers "not available at this moment", which comes back as `404 not_found`. - **Fields**: the tracker shows no service, destination or signer, so those stay `null`. - **Sister brands**: [Canpar](https://docs.lastscanned.com/carriers/canpar) is also part of TFI but uses a different service. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Lotte Global Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lotte Query live **Lotte Global Logistics** (`lotte`) package status and scan history in a single synchronous `GET` request or MCP tool call. Lotte Global Logistics is a South Korean domestic parcel carrier; lookups read its public tracking page. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lotte` | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=lotte` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=N1,N2&carrier=lotte` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Examples | |---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | | **Explicit (`?carrier=lotte`)** | 12-digit invoice number | `987654321006` | This shape is shared with other carriers, so always pass `?carrier=lotte`. Scan times are Korean local time (`Asia/Seoul`). ## Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/243321238742?carrier=lotte" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "lotte", "trackingNumber": "243321238742", "status": "in_transit", "statusDescription": "In transit", "service": null, "deliveredAt": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-25T14:22:00", "status": "in_transit", "description": "In transit", "location": "Hub", "code": null } ] } ``` ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # L-POST Tracking API & MCP URL: https://docs.lastscanned.com/carriers/lpost Query live **L-POST** (`lpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `lpost` | | **Brand aliases** | L-POST, Л-Пост, L-Post Labirint, l-post.ru | | **Category** | Russian e-commerce delivery (Labirint's L-Post) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ABC53832318,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^ABC\d{8}$/` | none | `ABC53832318` | | **Pass 2 (`mayMatch`)** | none | none | none | `ABC` + 8 digits belong to L-POST alone, so `?carrier=lpost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ABC53832318?carrier=lpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "lpost", "trackingNumber": "ABC53832318", "status": "delivered", "statusDescription": "Выдан получателю", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-04T13:20:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-04T13:20:00", "status": "delivered", "description": "Выдан получателю", "location": null, "code": "9" }, { "timestamp": null, "localTime": "2026-03-03T09:12:00", "status": "in_transit", "description": "Поступил в пункт выдачи", "location": null, "code": "7" }, { "timestamp": null, "localTime": "2026-03-01T15:40:00", "status": "label_created", "description": "Готово к отгрузке со склада Интернет-магазина", "location": null, "code": "4" }, { "timestamp": null, "localTime": "2026-02-28T10:05:00", "status": "label_created", "description": "Создано", "location": null, "code": "1" } ] } ``` ## Notes - **Wording**: status text is Russian. A cancelled order (`Аннулировано`) is reported as `exception`. - **Time zone**: Russian local time without a zone (Russia spans eleven), so only `localTime` is set. - **Shop references**: the page also finds an order by the shop's own number; that is not a track number and is not sent. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Madhur Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/madhurcourier Query live **Madhur Courier** (`madhurcourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. Madhur Courier Services (India) C-Note tracking and movement history. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `madhurcourier` | | **Brand aliases** | Madhur Courier Services, Madhur Couriers | | **Category** | Indian domestic courier and cargo | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=5191830085,5191830085` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `^P\d{9}$` | none | `5191830085` | The shape is shared with other carriers, so it is only tried when no other carrier claims the number; `?carrier=madhurcourier` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/5191830085?carrier=madhurcourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "madhurcourier", "trackingNumber": "5191830085", "status": "delivered", "statusDescription": "DELIVERED TO AREA:.... IN PATNA Pcs:2", "service": null, "deliveredAt": null, "deliveredAtLocal": "2020-11-13", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2020-11-13", "status": "delivered", "description": "DELIVERED TO AREA:.... IN PATNA Pcs:2", "location": "PATNA", "code": "RUNSHEET UPDATE" }, { "timestamp": null, "localTime": "2020-10-30", "status": "label_created", "description": "PARCEL BOOKED BY DELHI FROM NAYA BAZAR (DEL) TO PATNA Pcs:2", "location": "NAYA BAZAR (DEL)", "code": "BOOKING" } ] } ``` ## Notes - **Source**: The C-Note tracking page `madhurcouriers.in/CNoteTracking`, an ASP.NET form run under its cookieless session: `lastscanned` opens the session, posts the number with the form's hidden fields and reads the movements table. No account. - **Dates only**: the movements table has a date but no time of day, so `timestamp` is `null` and `localTime` is the date (`2020-11-13`). Same-day movements keep the carrier's order, newest first. - **Locations**: the branch the movement names (the destination branch when there is one, else the origin). - **Digit-only numbers** (10–11 digits) are shared with other carriers, so pass `?carrier=madhurcourier`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Maersk Container Tracking API & MCP URL: https://docs.lastscanned.com/carriers/maersk Query live **Maersk** (`maersk`) shipping container moves in a single synchronous `GET` request or MCP tool call. Pass the container number; no booking, bill of lading or Maersk account is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `maersk` | | **Brand aliases** | Maersk, Maersk Line, A.P. Moller-Maersk, Hamburg Süd, maersk.com/tracking | | **Category** | Ocean container shipping line | | **Single-container REST endpoint** | `GET https://api.lastscanned.com/v1/track/{containerNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MSKU7812341,MNBU0123457` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Container Number Format & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(MSKU\|MRKU\|MRSU\|MNBU\|SUDU)\d{7}$/` | ISO 6346 | `MSKU7812341` · `MNBU0123457` · `MRSU1234566` | | **Pass 2 (`mayMatch`)** | none | none | none | A container number is the owner's 4-letter code, 6 digits and an ISO 6346 check digit. Maersk's own owner codes detect to `maersk` automatically. A leased container (Textainer `TGHU`, Triton `TCNU`, CAI `CAIU`, SeaCo `SEGU` and others) can sail with any line, so pass `?carrier=maersk` for one booked with Maersk. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/MSKU7812341" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` The response below is a real lookup from November 2026, with its events cut to the newest four of 16. ```json { "carrier": "maersk", "trackingNumber": "MSKU7812341", "status": "delivered", "statusDescription": "Empty container returned", "service": "20' Dry", "deliveredAt": null, "deliveredAtLocal": "2026-10-19T13:03:00", "signedBy": null, "destination": { "city": "Genoa", "state": null, "country": "IT" }, "estimatedDelivery": null, "events": [ { "timestamp": null, "localTime": "2026-10-19T13:03:00", "status": "delivered", "description": "Empty container returned", "location": "Genoa City Limits, IT", "code": "CONTAINER RETURN" }, { "timestamp": null, "localTime": "2026-10-16T14:37:00", "status": "out_for_delivery", "description": "Gate out (full)", "location": "Genoa, IT", "code": "GATE-OUT" }, { "timestamp": null, "localTime": "2026-10-15T03:56:00", "status": "in_transit", "description": "Discharged from vessel, Estelle Maersk 634W", "location": "Genoa, IT", "code": "DISCHARG" }, { "timestamp": null, "localTime": "2026-10-14T15:13:00", "status": "in_transit", "description": "Vessel arrived, Estelle Maersk 634W", "location": "Genoa, IT", "code": "CONTAINER ARRIVAL" } ] } ``` ## Notes - **Source**: the JSON maersk.com's own tracking page receives. Akamai refuses that call from servers, so it is read through a browser session; one session serves a whole batch, and a lookup takes several seconds. - **Events**: actual moves only (gate out empty, gate in full, loaded, vessel departed and arrived, discharged, gate out full, empty returned), each with the vessel and voyage where there is one. Planned moves are left out; the final ETA is `estimatedDelivery`. - **Times**: Maersk gives each move's local time without a zone, so `localTime` is set and `timestamp` is null. - **Status**: the empty box going to the shipper is `label_created`, the full box leaving for the consignee is `out_for_delivery`, and the empty coming back is `delivered` (the trip is over). Everything between is `in_transit`. - **Hamburg Süd** (`SUDU`) containers are tracked on maersk.com and detect to `maersk`. ## Related Resources - **All container lines**: [Ocean container tracking](https://docs.lastscanned.com/container-tracking-api) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # MailAmericas Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mailamericas Query live **MailAmericas** (`mailamericas`) package status and scan history in a single synchronous `GET` request or MCP tool call. MailAmericas cross-border e-commerce parcels into Latin America, with customs and last-mile scans. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mailamericas` | | **Brand aliases** | Mail Americas, ML…EX | | **Category** | Cross-border e-commerce parcels to Latin America (AR, BR, CL, CO, CR, EC, MX, PE, SV, UY) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MLAR086293445EX,MLAR086293445EX` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | /^ML[A-Z]{2}\d{9}(?:R|EX)$/ and /^MMXQP\d{9}[ENR]$/ | none | `MLAR086293445EX` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to MailAmericas alone, so `?carrier=mailamericas` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/MLAR086293445EX?carrier=mailamericas" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "mailamericas", "trackingNumber": "MLAR086293445EX", "status": "delivered", "statusDescription": "Finished: Delivered", "service": "Registered", "deliveredAt": null, "deliveredAtLocal": "2026-06-04T17:42:00", "signedBy": null, "destination": { "city": "La Plata", "state": "Buenos Aires", "country": "AR" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-06-04T17:42:00", "status": "delivered", "description": "Finished: Delivered", "location": "La Plata", "code": "PF-1" }, { "timestamp": null, "localTime": "2026-05-19T16:46:00", "status": "label_created", "description": "Order created: Label generated", "location": null, "code": "OC-1" } ] } ``` ## Notes - **Source**: The JSON POST `mailamericas.com/api/tracking` the tracking page calls. Direct POST request with a browser User-Agent, no account. - **Descriptions** are the stage and the wording, such as `Finished: Delivered` or `Delivery office: In distribution with postman`; `code` is MailAmericas' event code. - **Time zone**: scans are the local clock of the country the parcel is in, not given per scan, so only `localTime` is set. - **Destination**: the delivery city and state, with the country as an ISO code. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # MailPlus Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mailplus Query live **MailPlus** (`mailplus`) package status and scan history in a single synchronous `GET` request or MCP tool call. MailPlus (Australia) parcels, with the Australia Post leg scans. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mailplus` | | **Brand aliases** | MailPlus Australia, Mail Plus | | **Category** | Australian parcels and freight (includes Australia Post hand-offs) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MPX010156973,MPX010156973` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `^MPXL\d{6}$` | none | `MPX010156973` | | **Pass 2 (`mayMatch`)** | `^MPX\d{9}$` | none | none | These numbers belong to MailPlus alone, so `?carrier=mailplus` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/MPX010156973?carrier=mailplus" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "mailplus", "trackingNumber": "MPX010156973", "status": "delivered", "statusDescription": "Freight item has been delivered.", "service": null, "deliveredAt": "2025-04-07T06:37:44Z", "deliveredAtLocal": "2025-04-07T16:37:44", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2025-04-07T06:37:44Z", "localTime": "2025-04-07T16:37:44", "status": "delivered", "description": "Freight item has been delivered.", "location": "SYDNEY NSW, Australia", "code": "Delivered" }, { "timestamp": "2025-04-03T01:43:04Z", "localTime": "2025-04-03T12:43:04", "status": "in_transit", "description": "Parcel picked up", "location": "Waterloo, Australia", "code": "Picked up" } ] } ``` ## Notes - **Source**: The JSON `wapp.mailplus.com.au/api/v1/customer/trackings/public/{number}` the MailPlus tracking page calls. Direct GET request, no account. - **Time zone**: each event time carries its own offset (for example `+10:00`), which is converted to UTC. - **Detection**: `MPXL######` is MailPlus's alone. `MPX#########` is also a Purolator PIN shape, so it is only auto-detected when no other carrier claims it; use `?carrier=mailplus` to be sure. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Mainfreight Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mainfreight Query live **Mainfreight** (`mainfreight`) package status and scan history in a single synchronous `GET` request or MCP tool call. Mainfreight numbers are not auto-detected: consignment references have no unique format, so pass `?carrier=mainfreight`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mainfreight` | | **Brand & service aliases** | Mainfreight, Mainfreight Transport (`mainfreight.com`) | | **Category** | Freight and logistics carrier (New Zealand, Australia, Europe, USA) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=mainfreight` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=S03645401,...&carrier=mainfreight` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Mainfreight - **Current status of a freight consignment** from Mainfreight's public tracker, without a Mainfreight login. - **Journey and service**: the result carries the consignment's service type and the time its status was set. ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=mainfreight`)** | A Mainfreight consignment or reference number | — | `S03645401` | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/S03645401?carrier=mainfreight" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/S03645401?carrier=mainfreight", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "S03645401", "carrier": "mainfreight" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "mainfreight", "trackingNumber": "S03645401", "status": "in_transit", "statusDescription": "In Transit", "service": "AirAndOcean", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-25T21:30:00Z", "localTime": null, "status": "in_transit", "description": "In Transit", "location": "Auckland to Sydney", "code": null } ] } ``` ## Notes - **One event**: the public tracker shows a status banner, not a list of scans, so `events` holds the current status. - **Written from the page's own scripts**: the empty answer for an unknown number was checked live; the field names of a found consignment come from the page's code. ## Related Resources - **Live browser lookup tool**: [Track a Mainfreight package live on lastscanned.com/lookup/mainfreight](https://lastscanned.com/lookup/mainfreight) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # MaltaPost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/maltapost Query live **MaltaPost** (`maltapost`) package status and scan history in a single synchronous `GET` request or MCP tool call. MaltaPost parcels, Easipik pick-up point deliveries and S10 mail. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `maltapost` | | **Brand aliases** | Malta Post, Easipik | | **Category** | Maltese national post and Easipik parcel lockers | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SS000120003MT,SS000120003MT` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | S10 numbers ending MT with a valid check digit | UPU S10 mod-11 | `SS000120003MT` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to MaltaPost alone, so `?carrier=maltapost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SS000120003MT?carrier=maltapost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "maltapost", "trackingNumber": "SS000120003MT", "status": "delivered", "statusDescription": "Item delivered/collected by recipient", "service": null, "deliveredAt": "2026-10-10T12:38:00Z", "deliveredAtLocal": "2026-10-10T14:38:00", "signedBy": null, "destination": { "city": "Tas-Sliema", "state": null, "country": "MT" }, "message": null, "events": [ { "timestamp": "2026-10-10T12:38:00Z", "localTime": "2026-10-10T14:38:00", "status": "delivered", "description": "Item delivered/collected by recipient", "location": "MaltaPost", "code": "EMI" }, { "timestamp": "2026-10-07T15:00:00Z", "localTime": "2026-10-07T17:00:00", "status": "label_created", "description": "Item created", "location": "MaltaPost", "code": "EMA" } ] } ``` ## Notes - **Source**: The JSON `www.maltapost.com/TrackAndTraceApi/v1/trackedItems?barcode={number}` the Track & Trace page calls. Direct GET request, no account. - **Time zone**: `date` has no offset; Malta is `Europe/Malta`, which is what `timestamp` is converted from. - **Movement codes**: `EMA` item created, `EMD`/`EMF` inbound sorting centre, `EMG` forwarded to the delivery centre, `EDG` scheduled for delivery (out for delivery), `EDH` at a collection point, `EMI` delivered or collected. - An unknown barcode answers 200 with an empty movement list; it comes back as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Maritime-Ontario Tracking API & MCP URL: https://docs.lastscanned.com/carriers/maritimeontario Query live **Maritime-Ontario** (`maritimeontario`) package status and scan history in a single synchronous `GET` request or MCP tool call. Maritime-Ontario LTL freight bills and status history. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `maritimeontario` | | **Brand aliases** | Maritime Ontario, M-O, MO Freight | | **Category** | Canadian LTL freight (Ontario, Quebec and the Maritimes) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=F1163994,F1163994` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `^F\d{7}$` | none | `F1163994` | The shape is shared with other carriers, so it is only tried when no other carrier claims the number; `?carrier=maritimeontario` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/F1163994?carrier=maritimeontario" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "maritimeontario", "trackingNumber": "F1163994", "status": "delivered", "statusDescription": "COMPLETE", "service": "REG-DR", "deliveredAt": null, "deliveredAtLocal": "2017-08-08T14:40:01", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2017-08-08T14:40:01", "status": "delivered", "description": "COMPLETE", "location": "Centreville, NB", "code": "COMPLETE" }, { "timestamp": null, "localTime": "2017-08-04T00:04:17", "status": "in_transit", "description": "INTRANSIT", "location": null, "code": "INTRANSIT" } ] } ``` ## Notes - **Source**: The TM4Web external trace page `cp.m-o.com/trace`: `lastscanned` starts a session, resolves the bill with `bill_details_ajax.msw?func=ExternalTrace`, then reads `func=BillDetails`. No account. - **Statuses** are the freight codes: `INTRANSIT`, `ARRCONS` (arrived at the consignee), `DEPCONS` (departed the consignee), `COMPLETE` (delivered). - **Time zone**: status times carry no zone, so only `localTime` is set. - **Location**: the bill's current zone, on the newest event only. - `service` is the service level (for example `REG-DR`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Matkahuolto Tracking API & MCP URL: https://docs.lastscanned.com/carriers/matkahuolto Query live **Matkahuolto** (`matkahuolto`) package status and scan history in a single synchronous `GET` request or MCP tool call. Matkahuolto (Finland) parcels and pick-up point deliveries. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `matkahuolto` | | **Brand aliases** | Matkahuolto Finland, MH…FI | | **Category** | Finnish parcel and coach-network delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MH723328765FI,MH723328765FI` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `^MH\d{9}FI$` | none | `MH723328765FI` | | **Pass 2 (`mayMatch`)** | `^MA\d{19}$` | none | none | These numbers belong to Matkahuolto alone, so `?carrier=matkahuolto` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/MH723328765FI?carrier=matkahuolto" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "matkahuolto", "trackingNumber": "MH723328765FI", "status": "delivered", "statusDescription": "The consignment has been delivered. Thank you for choosing Matkahuolto!", "service": "Pick-up Parcel", "deliveredAt": "2025-11-13T13:37:00Z", "deliveredAtLocal": "2025-11-13T15:37:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2025-11-13T13:37:00Z", "localTime": "2025-11-13T15:37:00", "status": "delivered", "description": "The consignment has been delivered. Thank you for choosing Matkahuolto!", "location": "Tampere", "code": null }, { "timestamp": "2025-11-12T18:26:00Z", "localTime": "2025-11-12T20:26:00", "status": "in_transit", "description": "Consignment is being processed", "location": "Vantaa", "code": null } ] } ``` ## Notes - **Source**: The JSON `wwwservice.matkahuolto.fi/search/trackingInfo` the tracking page calls. Direct GET request, no account. - **Time zone**: dates (`13.11.2025`) and times are Finnish local time, converted from `Europe/Helsinki`. - **Pick-up points**: when a parcel waits at a pick-up point its scan is mapped to `exception` (the kit treats "ready for collection" that way); the next scan is `delivered`. - **Detection**: `MH#########FI` also passes Posti's S10 check, so it can detect as Posti first; use `?carrier=matkahuolto` to be sure. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Mauritius Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mauritiuspost Query live **Mauritius Post** (`mauritiuspost`) package status and scan history in a single synchronous `GET` request or MCP tool call. Mauritius Post parcels and S10 mail, with counter and delivery scans. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mauritiuspost` | | **Brand aliases** | Mauritius Post Ltd, Post Mauritius, MU Post | | **Category** | National post of Mauritius | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=DP512267469MU,DP512267469MU` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | S10 numbers ending MU with a valid check digit | UPU S10 mod-11 | `DP512267469MU` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to Mauritius Post alone, so `?carrier=mauritiuspost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/DP512267469MU?carrier=mauritiuspost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "mauritiuspost", "trackingNumber": "DP512267469MU", "status": "delivered", "statusDescription": "Delivered Through Counter", "service": null, "deliveredAt": "2025-12-30T11:10:00Z", "deliveredAtLocal": "2025-12-30T15:10:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2025-12-30T11:10:00Z", "localTime": "2025-12-30T15:10:00", "status": "delivered", "description": "Delivered Through Counter", "location": "Camp de Masque Pave", "code": null }, { "timestamp": "2025-12-30T03:36:00Z", "localTime": "2025-12-30T07:36:00", "status": "in_transit", "description": "Received From Customer", "location": "Virtual Office", "code": null } ] } ``` ## Notes - **Source**: The Track & Trace page `www.mauritiuspost.mu/track-trace/?tracking_code={number}`, server-rendered WordPress HTML parsed into normalized events. No account. - **Time zone**: scan times are Mauritius time (`Indian/Mauritius`, UTC+4, no daylight saving). - An unknown number shows "No tracking information available for this item" and returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Mayi Yinfu Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mayiyinfu Query live **Mayi Yinfu** (`mayiyinfu`) package status and scan history in a single synchronous `GET` request or MCP tool call. Mayi Yinfu numbers share their shape with other carriers' numbers, so pass `?carrier=mayiyinfu`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mayiyinfu` | | **Brand aliases** | Mayi Yinfu, 蚂蚁银服 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=mayiyinfu` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=mayiyinfu` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Mayi Yinfu tracking numbers have no shape of their own, so always pass `?carrier=mayiyinfu`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Mayi Yinfu in one request. - **Platform**: Mayi Yinfu runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Meest Tracking API & MCP URL: https://docs.lastscanned.com/carriers/meest Query live **Meest** (`meest`) parcels in a single synchronous `GET` request or MCP tool call. `lastscanned` reads the XML that Meest's tracker (t.meest-group.com) returns and normalizes the scans. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `meest` | | **Category** | Ukrainian and cross-border parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=meest` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CV950076856US,...&carrier=meest` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP · Free tier (5 unique numbers/day) · Pro ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection | Rule | Pattern | Detection | |---|---|---| | Meest China-Ukraine parcels | `CV` + 9 digits + `UA` | Pass 2 (`mayMatch`) | Other Meest numbers need `?carrier=meest`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CV950076856US?carrier=meest" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "meest", "trackingNumber": "CV950076856US", "status": "in_transit", "statusDescription": "Parcel arrived at the sorting center", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-25T11:20:00", "status": "in_transit", "description": "Parcel arrived at the sorting center", "location": "Lviv, Ukraine", "code": "909" } ] } ``` ## Notes - Scans come from several countries, so no zone is assumed; only `localTime` is set. - The request is signed with an MD5 token built from a constant in Meest's tracker page, as the page itself does. - Meest's internal status `1628` is hidden, as on the page. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Micro Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/microexpress Query live **Micro Express** (`microexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Micro Express (Australia) parcels, with the local delivery depot scans. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `microexpress` | | **Brand aliases** | MicroExpress, ME tracking | | **Category** | Australian cross-border and domestic parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ME1729012377695VRE,ME1729012377695VRE` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `^ME\d{13}[A-Z0-9]{3}$` | none | `ME1729012377695VRE` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to Micro Express alone, so `?carrier=microexpress` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ME1729012377695VRE?carrier=microexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "microexpress", "trackingNumber": "ME1729012377695VRE", "status": "delivered", "statusDescription": "Delivered-Left at safe place", "service": null, "deliveredAt": "2025-11-18T08:05:14Z", "deliveredAtLocal": "2025-11-18T19:05:14", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2025-11-18T08:05:14Z", "localTime": "2025-11-18T19:05:14", "status": "delivered", "description": "Delivered-Left at safe place", "location": null, "code": "DOWN" }, { "timestamp": "2025-11-11T10:05:02Z", "localTime": "2025-11-11T21:05:02", "status": "label_created", "description": "Order Creation, order submitted, pending to receive.", "location": null, "code": "INIT" } ] } ``` ## Notes - **Source**: The JSON POST `microexpress.com.au/partner/tracking-info` the tracking page calls. Direct POST request, no account. - **Time zone**: every event carries its IANA zone (`Australia/Melbourne`) and the local clock time; `timestamp` is converted from them. - **Event codes**: `INIT` order created, `IN` processed at the local courier's sorting facility, `COLLECT` received by the local delivery depot, `OUT` onboard for delivery, `DOWN` delivered. - Numbers may be typed with a space after `ME`; it is removed. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Midland Transport Tracking API & MCP URL: https://docs.lastscanned.com/carriers/midlandtransport Query live **Midland Transport** (`midlandtransport`) package status and scan history in a single synchronous `GET` request or MCP tool call. Midland Transport / Midland Courier (Canada) parcels, with the travel history. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `midlandtransport` | | **Brand aliases** | Midland Courier, Midland | | **Category** | Canadian courier and LTL (Atlantic Canada and Quebec) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2606250011700001,2606250011700001` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `^\d{16}$` | none | `2606250011700001` | The shape is shared with other carriers, so it is only tried when no other carrier claims the number; `?carrier=midlandtransport` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2606250011700001?carrier=midlandtransport" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "midlandtransport", "trackingNumber": "2606250011700001", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-09-18T14:58:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-09-18T14:58:00", "status": "delivered", "description": "Delivered", "location": "PARADISE, NL", "code": "Delivered" }, { "timestamp": null, "localTime": "2026-09-17T11:08:00", "status": "exception", "description": "Delivery Exception: Delayed in Transit - SHIPPER'S DELAY", "location": "DIEPPE, NB", "code": "Delivery Exception" } ] } ``` ## Notes - **Source**: The 2Ship-hosted tracking page `ship.midlandtransport.com/Tracking/TrackClientTrackings?TrackingNumber={number}`, server-rendered HTML parsed into normalized events. No account. - **Activities** (`In Transit`, `Delivery Exception`, `Out For Delivery`, `Delivered`) become the status; the description is the activity and the wording, and the place is the `(CITY,PR)` the wording ends with. - The "Shipment Created" step comes from the page's progress bar. - **Time zone**: the page does not say which zone its clock is in, so only `localTime` is set. - A 16-digit number is not unique to Midland, so it is only auto-detected when nothing else claims it. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # 99minutos Tracking API & MCP URL: https://docs.lastscanned.com/carriers/minutos99 Query live **99minutos** (`minutos99`) package status and scan history in a single synchronous `GET` request or MCP tool call. 99minutos numbers are not auto-detected: the carrier's tracking IDs have no verified format, so pass `?carrier=minutos99`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `minutos99` | | **Brand & service aliases** | 99minutos, 99 minutos (`99minutos.com`) | | **Category** | Latin American last-mile courier (Mexico, Colombia, Chile) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=minutos99` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2423885732,...&carrier=minutos99` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for 99minutos - **Same status changes as the 99minutos tracking page**: created, collected, in transit, out for delivery, delivered, with the comment the courier left. - **UTC timestamps**: 99minutos sends each change as a UTC instant, so `timestamp` is set (the local time is not known). ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=minutos99`)** | The order's tracking ID from 99minutos | — | `2423885732` | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/2423885732?carrier=minutos99" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/2423885732?carrier=minutos99", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "2423885732", "carrier": "minutos99" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "minutos99", "trackingNumber": "2423885732", "status": "out_for_delivery", "statusDescription": "Pedido en camino hacia el domicilio", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-25T16:20:00Z", "localTime": "2026-10-25T16:20:00", "status": "out_for_delivery", "description": "Pedido en camino hacia el domicilio", "location": null, "code": "ToDelivery" }, { "timestamp": "2026-10-24T13:05:00Z", "localTime": "2026-10-24T13:05:00", "status": "in_transit", "description": "Pedido en el almacén, en preparación para la entrega", "location": null, "code": "Warehouse" }, { "timestamp": "2026-10-23T10:45:00Z", "localTime": "2026-10-23T10:45:00", "status": "in_transit", "description": "Pedido recogido en el negocio", "location": null, "code": "Collected" } ] } ``` ## Notes - **Recipient verification**: some orders make the 99minutos page ask the recipient to confirm their identity. Those return a lookup error here. - **Written from the page's own scripts**: the not-found answer was checked live; the field names of a found order come from the page's code. ## Related Resources - **Live browser lookup tool**: [Track a 99minutos package live on lastscanned.com/lookup/minutos99](https://lastscanned.com/lookup/minutos99) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Miuson Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/miuson Query live **Miuson Express** (`miuson`) package status and scan history in a single synchronous `GET` request or MCP tool call. Miuson Express numbers share their shape with other carriers' numbers, so pass `?carrier=miuson`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `miuson` | | **Brand aliases** | Miuson Express, 淼信国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=miuson` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=miuson` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Miuson Express tracking numbers have no shape of their own, so always pass `?carrier=miuson`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Miuson Express in one request. - **Platform**: Miuson Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # DHL eCommerce Türkiye (MNG Kargo) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mngkargo Query live **DHL eCommerce Türkiye (MNG Kargo)** (`mngkargo`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mngkargo` | | **Brand aliases** | MNG Kargo, DHL eCommerce Turkey, DHL eCommerce TR | | **Category** | Domestic parcels (Türkiye) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | `matches` and `mayMatch` are both empty: numbers are 12 digits, a shape other carriers share, so pass `?carrier=mngkargo`. This is not DHL eCommerce Americas (`dhlecommerce`). ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/778116427393?carrier=mngkargo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "mngkargo", "trackingNumber": "778116427393", "status": "delivered", "statusDescription": "Teslim Edildi", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-10", "signedBy": "AB** CD**", "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-10", "status": "delivered", "description": "Teslim Edildi", "location": "DÖRTYOL", "code": null }, { "timestamp": null, "localTime": "2026-10-10", "status": "out_for_delivery", "description": "Gönderi Dağıtımda", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-10-10", "status": "in_transit", "description": "Gönderi Teslimat Şubesinde", "location": "DÖRTYOL", "code": null }, { "timestamp": null, "localTime": "2026-10-09", "status": "in_transit", "description": "Transfer Aşamasında", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-10-09", "status": "in_transit", "description": "Gönderi Hazırlanıyor", "location": "AMZ-ANK", "code": null } ] } ``` ## Notes - **Source**: the form on `dhlecommerce.com.tr/gonderitakip`, which posts its anti-forgery token and the number. `lastscanned` loads the page for the token and cookie once per batch. No account is needed. - **Dates only**: the "Gönderi Hareketleri" list shows a date for each stage and no time of day, so `timestamp` is `null` and `localTime` is a date. - **Wording**: stage names are the carrier's own Turkish text. - **`signedBy`**: the receiver is printed masked (`AB** CD**`) and passed through. - **Not found**: an unknown number redirects back to the home page, which becomes `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # M-ONE Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mone Query live **M-ONE** (`mone`) package status and scan history in a single synchronous `GET` request or MCP tool call. M-ONE (Serbia) parcels, with scan history in Serbian. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mone` | | **Brand aliases** | M-ONE, M-ONE Serbia, M-One e-comm | | **Category** | Serbian domestic and e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=PL002782509RS,PL002782509RS` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `^PL\d{9}RS$` | none | `PL002782509RS` | The shape is shared with other carriers, so it is only tried when no other carrier claims the number; `?carrier=mone` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/PL002782509RS?carrier=mone" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "mone", "trackingNumber": "PL002782509RS", "status": "delivered", "statusDescription": "Uručena pošiljka", "service": null, "deliveredAt": "2026-02-27T14:35:01Z", "deliveredAtLocal": "2026-02-27T15:35:01", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-02-27T14:35:01Z", "localTime": "2026-02-27T15:35:01", "status": "delivered", "description": "Uručena pošiljka", "location": null, "code": "ST07" }, { "timestamp": "2026-02-23T05:40:13Z", "localTime": "2026-02-23T06:40:13", "status": "out_for_delivery", "description": "Na dostavnom vozilu", "location": null, "code": "ST05" } ] } ``` ## Notes - **Source**: The JSON `api.m-one.rs/api/statushistory/{number}` the M-ONE tracker calls. Direct GET request, no account. - **Language**: scan descriptions are in Serbian (for example `Uručena pošiljka`, delivered). - **Time zone**: M-ONE sends local Serbian time; `timestamp` is it converted from `Europe/Belgrade`. - **Status codes**: `ST01` order created, `ST02` picked up, `ST04`/`ST06` in transit, `ST05` on the delivery vehicle, `ST07` delivered, `ST35` delivery attempt (notice left), `ST48` recipient will collect. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Morning Global Tracking API & MCP URL: https://docs.lastscanned.com/carriers/morningglobal Query live **Morning Global** (`morningglobal`) package status and scan history in a single synchronous `GET` request or MCP tool call. Morning Global (Hong Kong) cross-border parcels, with customs and last-mile scans. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `morningglobal` | | **Brand aliases** | Morning Global Logistics, MORNING GLOBAL | | **Category** | Hong Kong cross-border e-commerce logistics | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=BR003081784MG,BR003081784MG` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `^BR\d{9}MG$` | none | `BR003081784MG` | The shape is shared with other carriers, so it is only tried when no other carrier claims the number; `?carrier=morningglobal` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/BR003081784MG?carrier=morningglobal" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "morningglobal", "trackingNumber": "BR003081784MG", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2025-10-06T16:33:00Z", "deliveredAtLocal": "2025-10-06T12:33:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2025-10-06T16:33:00Z", "localTime": "2025-10-06T12:33:00", "status": "delivered", "description": "Delivered", "location": "CA", "code": null }, { "timestamp": "2025-10-06T10:44:00Z", "localTime": "2025-10-06T06:44:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "CA", "code": null }, { "timestamp": "2025-10-03T17:55:00Z", "localTime": "2025-10-03T13:55:00", "status": "in_transit", "description": "Handed Over for Delivery", "location": "CA", "code": null }, { "timestamp": "2025-10-02T20:36:00Z", "localTime": "2025-10-02T16:36:00", "status": "in_transit", "description": "Customs Cleared", "location": "CA", "code": null }, { "timestamp": "2025-10-02T11:24:00Z", "localTime": "2025-10-02T07:24:00", "status": "in_transit", "description": "Customs Clearance Begins", "location": "CA", "code": null }, { "timestamp": "2025-09-30T21:27:00Z", "localTime": "2025-09-30T17:27:00", "status": "in_transit", "description": "Arrive Destination", "location": "CA", "code": null }, { "timestamp": null, "localTime": "2025-09-30T03:36:00", "status": "in_transit", "description": "Flight Departure to Destination", "location": null, "code": null }, { "timestamp": null, "localTime": "2025-09-30T02:19:00", "status": "in_transit", "description": "Ready for Departure", "location": null, "code": null }, { "timestamp": null, "localTime": "2025-09-29T10:26:00", "status": "in_transit", "description": "Arrive Hub", "location": null, "code": null }, { "timestamp": "2025-09-29T01:41:00Z", "localTime": "2025-09-29T09:41:00", "status": "in_transit", "description": "Collection", "location": "HK", "code": null }, { "timestamp": "2025-09-27T07:55:00Z", "localTime": "2025-09-27T15:55:00", "status": "label_created", "description": "Order Created", "location": "HK", "code": null } ] } ``` ## Notes - **Source**: The WordPress AJAX call its Trace & Track page makes: the Worker reads the page's nonce, then POSTs `action=mg_tr_lookup` to `wp-admin/admin-ajax.php`. No account. - **Time zone**: a scan's place reads like `CA (UTC-4)`; when it has an offset, `timestamp` is converted from it. Scans with no place keep `localTime` only. - An unknown number answers an empty result list and comes back as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # MRL Global Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mrlglobal Query live **MRL Global** (`mrlglobal`) package status and scan history in a single synchronous `GET` request or MCP tool call. MRL Global (Australia) consignments, with every scan event. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mrlglobal` | | **Brand aliases** | MRL, MRL Global Australia | | **Category** | Australian freight and parcel consignments | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CAFG690126,CAFG690126` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `^C[A-Z]{3}\d{6}$` | none | `CAFG690126` | The shape is shared with other carriers, so it is only tried when no other carrier claims the number; `?carrier=mrlglobal` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CAFG690126?carrier=mrlglobal" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "mrlglobal", "trackingNumber": "CAFG690126", "status": "delivered", "statusDescription": "Confirmation of Delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": "2024-11-25T13:29:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2024-11-25T13:29:00", "status": "delivered", "description": "Confirmation of Delivery", "location": null, "code": null }, { "timestamp": null, "localTime": "2024-11-21T14:23:00", "status": "in_transit", "description": "Pickup Scan", "location": null, "code": null } ] } ``` ## Notes - **Source**: The tracking page `www.mrlglobal.com/tracking/?connoteno={number}`, server-rendered WordPress HTML parsed into normalized events. No account. - **Time zone**: dates (`25/11/2024`) and times carry no zone (Australian states differ), so only `localTime` is set. - **Signed by** is read from the consignment box once the parcel is delivered. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # MRW Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mrw Query live **MRW (Spain / Portugal)** (`mrw`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mrw` | | **Brand aliases** | MRW, MRW Spain, MRW Portugal | | **Category** | Regional express (Spain, Portugal) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^\d{5}[A-Z]\d{6}$/` | none | `04319F171575` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | Waybill (5 digits, letter, 6 digits) | `^\d{5}[A-Z]\d{6}$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=mrw`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/04319F171575?carrier=mrw" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "mrw", "trackingNumber": "04319F171575", "status": "delivered", "statusDescription": "Envío entregado", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-09-10T19:29:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-09-10T19:29:00", "status": "delivered", "description": "Envío entregado", "location": "28931 Móstoles", "code": null }, { "timestamp": null, "localTime": "2026-09-10T13:38:00", "status": "out_for_delivery", "description": "Envío en reparto", "location": "28931 Móstoles", "code": null }, { "timestamp": null, "localTime": "2026-09-07T13:41:00", "status": "in_transit", "description": "Envío recogido en origen", "location": "46410 Sueca", "code": null } ] } ``` ## Notes - **Session flow**: MRW keeps the number in an ASP session, so each lookup is a short sequence (about two seconds, run one at a time in a batch). - **Purged history**: when MRW has dropped the scans but kept the final state, the result has that one event. - **Local time only**: Spain and Portugal are an hour apart and the page prints no zone, so `timestamp` is `null`. Descriptions are in Spanish. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # MSC Container Tracking API & MCP URL: https://docs.lastscanned.com/carriers/msc Query live **MSC** (`msc`) shipping container moves in a single synchronous `GET` request or MCP tool call. Pass the container number; no booking, bill of lading or MSC account is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `msc` | | **Brand aliases** | MSC, Mediterranean Shipping Company, MSC Cargo, msc.com/track-a-shipment | | **Category** | Ocean container shipping line | | **Single-container REST endpoint** | `GET https://api.lastscanned.com/v1/track/{containerNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MEDU1234562,MSCU6789016` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Container Number Format & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(MSCU\|MEDU\|MSDU\|MSMU\|MSNU\|MSBU)\d{7}$/` | ISO 6346 | `MEDU1234562` · `MSCU6789016` · `MSNU1234560` | | **Pass 2 (`mayMatch`)** | none | none | none | A container number is the owner's 4-letter code, 6 digits and an ISO 6346 check digit. MSC's own owner codes detect to `msc` automatically. A leased container (Textainer `TGHU`, Triton `TCNU`, CAI `CAIU`, SeaCo `SEGU` and others) can sail with any line, so pass `?carrier=msc` for one booked with MSC. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/MEDU1234562" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` The response below is a real lookup from November 2026, with its events cut to the newest four of 11. ```json { "carrier": "msc", "trackingNumber": "MEDU1234562", "status": "in_transit", "statusDescription": "Full Transshipment Loaded, Msc Desiree UK642A", "service": "20' DRY VAN", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Montreal", "state": null, "country": "CA" }, "estimatedDelivery": "2026-11-21", "message": "Bill of lading MEDUKU746112", "events": [ { "timestamp": null, "localTime": "2026-11-06", "status": "in_transit", "description": "Full Transshipment Loaded, Msc Desiree UK642A", "location": "Busan, KR", "code": "Full Transshipment Loaded" }, { "timestamp": null, "localTime": "2026-11-05", "status": "in_transit", "description": "Full Transshipment Positioned In", "location": "Busan, KR", "code": "Full Transshipment Positioned In" }, { "timestamp": null, "localTime": "2026-11-05", "status": "in_transit", "description": "Full Transshipment Positioned Out", "location": "Busan, KR", "code": "Full Transshipment Positioned Out" }, { "timestamp": null, "localTime": "2026-11-04", "status": "in_transit", "description": "Full Transshipment Discharged, Msc Lorena HI639R", "location": "Busan, KR", "code": "Full Transshipment Discharged" } ] } ``` ## Notes - **Source**: the tracking JSON msc.com's own page requests. Akamai refuses it from servers, so it is fetched from inside a browser session on msc.com; one session serves a whole batch. - **Events**: every move on the container's bill of lading, transshipments included, with the vessel and voyage. MSC's estimated arrival is left out of the events and returned as `estimatedDelivery`. - **Times**: MSC gives dates without a time of day, so `localTime` is a date (`2026-11-06`) and `timestamp` is null. - **Bill of lading**: `message` names the bill the container sails under. - **Status**: `Empty to Shipper` is `label_created`, `Import to consignee` is `out_for_delivery`, and `Empty received at CY` is `delivered`. A container MSC lists as `Off Service` is `not_found`. ## Related Resources - **All container lines**: [Ocean container tracking](https://docs.lastscanned.com/container-tracking-api) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Muller & Phipps (M&P) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mulphilog Query live **Muller & Phipps (M&P)** (`mulphilog`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=mulphilog` to select it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mulphilog` | | **Brand aliases** | Muller & Phipps, M&P, M&P Logistics, mulphilog.com | | **Category** | Pakistani courier and logistics (Muller & Phipps) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=192261152249,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Twelve-digit consignment numbers are shared with other carriers, so pass `?carrier=mulphilog`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/192261152249?carrier=mulphilog" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "mulphilog", "trackingNumber": "192261152249", "status": "delivered", "statusDescription": "The shipment has been delivered at the consignee's address", "service": null, "deliveredAt": "2026-04-11T10:14:00Z", "deliveredAtLocal": "2026-04-11T15:14:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-04-11T10:14:00Z", "localTime": "2026-04-11T15:14:00", "status": "delivered", "description": "The shipment has been delivered at the consignee's address", "location": "KARACHI", "code": "Delivered" }, { "timestamp": "2026-04-11T04:16:00Z", "localTime": "2026-04-11T09:16:00", "status": "out_for_delivery", "description": "The shipment has been scheduled for delivery. Please keep your mobile on", "location": "KARACHI", "code": "Out-for-Delivery" }, { "timestamp": "2026-04-08T15:47:00Z", "localTime": "2026-04-08T20:47:00", "status": "in_transit", "description": "The shipment has been dispatched and is on its way to the destination city", "location": "ISLAMABAD", "code": "In-transit" }, { "timestamp": "2026-04-03T12:21:00Z", "localTime": "2026-04-03T17:21:00", "status": "label_created", "description": "Your order has been placed. It will be packed and prepared for shipment.", "location": "LAHORE", "code": "Booked" } ] } ``` ## Notes - **Privacy**: the delivery line ends "...and has been received by ``"; the name is cut off. - **Time zone**: Pakistan time (`Asia/Karachi`, UTC+5, no DST); `timestamp` is converted from that. - **Unknown number**: the page renders without any steps, which is returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Mylerz Tracking API & MCP URL: https://docs.lastscanned.com/carriers/mylerz Query live **Mylerz** (`mylerz`) package status and scan history in a single synchronous `GET` request or MCP tool call. Mylerz (Egypt) last-mile parcels, with the status log. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `mylerz` | | **Brand aliases** | Mylerz Egypt | | **Category** | Egyptian last-mile delivery (also Tunisia, Morocco, Algeria, Jordan) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=63777275972001,63777275972001` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `^63\d{12}$` | none | `63777275972001` | The shape is shared with other carriers, so it is only tried when no other carrier claims the number; `?carrier=mylerz` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/63777275972001?carrier=mylerz" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "mylerz", "trackingNumber": "63777275972001", "status": "delivered", "statusDescription": "Delivered, Enjoy it :-)", "service": null, "deliveredAt": null, "deliveredAtLocal": "2025-09-30T12:02:08", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2025-09-30T12:02:08", "status": "delivered", "description": "Delivered, Enjoy it :-)", "location": null, "code": "2" }, { "timestamp": null, "localTime": "2025-09-29T12:06:38", "status": "label_created", "description": "Uploaded", "location": null, "code": "12" } ] } ``` ## Notes - **Source**: The JSON `api.mylerz.net/api/package/GetPackageTrackingDetailsByBarCode` the Mylerz tracking page calls. Direct GET request, no account. - **Statuses** are Mylerz's customer statuses: `Uploaded` (label created), `Picked from shipper`, `In-Transit`, `mylerz on the way` (out for delivery), `Delivered`. - **Time zone**: `ChangedDate` has no zone, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Nacex Tracking API & MCP URL: https://docs.lastscanned.com/carriers/nacex Query live **Nacex (Spain / Portugal)** (`nacex`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `nacex` | | **Brand aliases** | Nacex, Nacex Spain, Nacex Portugal | | **Category** | Regional express (Spain, Portugal) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^\d{4}\/\d{8}$/` (agency/waybill; a hyphen is normalized to the slash first) | none | `0316/11189371` · `0316-11189371` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | Agency / waybill | `^\d{4}/\d{8}$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=nacex`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/0316-11189371?carrier=nacex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "nacex", "trackingNumber": "0316-11189371", "status": "delivered", "statusDescription": "Entregado", "service": "E-NACEX", "deliveredAt": null, "deliveredAtLocal": "2026-07-01T13:24:00", "signedBy": "MARIA PEREZ", "destination": null, "events": [ { "timestamp": null, "localTime": "2026-07-01T13:24:00", "status": "delivered", "description": "Entregado", "location": "3014 - MOLINA S.", "code": null }, { "timestamp": null, "localTime": "2026-07-01", "status": "out_for_delivery", "description": "En reparto", "location": "3014 - MOLINA S.", "code": null }, { "timestamp": null, "localTime": "2026-06-29", "status": "in_transit", "description": "En tránsito", "location": "9028 - PLATMADRID", "code": null } ] } ``` ## Notes - **Number**: the 4-digit agency and the 8-digit waybill, separated by a slash (`0316/11189371`) or a hyphen (`0316-11189371`). - **Dates only**: the page lists scans under date headings without times. Only the delivery has a time (its 'Hora entrega'), so other events carry a date in `localTime` and `timestamp` is `null`. Scans from one day keep the carrier's order, newest first. - Descriptions are in Spanish. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Naqel Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/naqel Query live **Naqel Express (Saudi Arabia)** (`naqel`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `naqel` | | **Brand aliases** | Naqel, Naqel Express, NAQEL Saudi | | **Category** | Regional express (Saudi Arabia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | `360952416` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | Waybill (9 digits) | `^\d{9}$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=naqel`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/360952416?carrier=naqel" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "naqel", "trackingNumber": "360952416", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2025-09-11T12:12:00", "signedBy": null, "destination": { "city": "Jubail", "state": null, "country": null }, "estimatedDelivery": "2025-09-18", "events": [ { "timestamp": null, "localTime": "2025-09-11T12:12:00", "status": "delivered", "description": "Delivered", "location": "System", "code": null }, { "timestamp": null, "localTime": "2025-09-10T10:11:00", "status": "out_for_delivery", "description": "Out For Delivery with Courier", "location": "Jubail", "code": null }, { "timestamp": null, "localTime": "2025-09-07T14:06:00", "status": "in_transit", "description": "Picked up by Naqel", "location": "Dubai", "code": null } ] } ``` ## Notes - **Local time only**: the page prints no zone and scans span countries (a pickup in Dubai, delivery in Jubail), so `timestamp` is `null`. - A 9-digit waybill is not unique to Naqel, so pass `?carrier=naqel`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Nationex Tracking API & MCP URL: https://docs.lastscanned.com/carriers/nationex Query live **Nationex** (`nationex`) parcel status, delivery contact and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` reads the same service the tracker on nationex.com uses, so no account or API key is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `nationex` | | **Brand aliases** | Nationex, Nationex Courier | | **Category** | Canadian domestic courier (Quebec, Ontario, Atlantic and Western Canada) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=nationex` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=nationex` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | none | none | | **Pass 2 (`mayMatch`)** | *None* | none | none | | **Explicit (`?carrier=nationex`)** | Nationex numbers and shipper references | none | `518908681` | Nationex numbers are plain digits or shipper references, so a number is never auto-detected as Nationex. Always pass `?carrier=nationex`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/518908681?carrier=nationex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/518908681?carrier=nationex", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "518908681", "carrier": "nationex" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "nationex", "trackingNumber": "518908681", "status": "delivered", "statusDescription": "Delivery completed", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-06T09:33:06", "signedBy": "Phanie", "destination": { "city": "Montreal", "state": null, "country": "CA" }, "estimatedDelivery": null, "events": [ { "timestamp": null, "localTime": "2026-02-06T09:33:06", "status": "delivered", "description": "Delivery completed", "location": "Montreal Gilmore", "code": "119" }, { "timestamp": null, "localTime": "2026-02-06T06:45:31", "status": "out_for_delivery", "description": "Parcel out for delivery", "location": "Montreal Gilmore", "code": "900" }, { "timestamp": null, "localTime": "2026-02-05T19:27:16", "status": "in_transit", "description": "Pickup of the parcel confirmed", "location": "St-Hubert", "code": "252" } ] } ``` ## Notes - **Lookup keys**: the number can be a Nationex shipment or parcel number or the shipper's own reference. For a multi-parcel shipment, the parcel matching the number is shown, else the first. - **Times**: scans name a depot but no province, so only `localTime` is set and `timestamp` is `null`. - **Unknown numbers**: Nationex answers "Sorry, no results.", which comes back as `404 not_found`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Next Level Tracking API & MCP URL: https://docs.lastscanned.com/carriers/nextleveldelivery Query live **Next Level** (`nextleveldelivery`) package status and scan history in a single synchronous `GET` request or MCP tool call. Next Level (Bulgaria, Romania, Greece and neighbours) parcels, with courier scans. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `nextleveldelivery` | | **Brand aliases** | Next Level Delivery, Nextlevel | | **Category** | South-east and central European parcel delivery (BG, GR, RO, PL, SK, CZ, SI, HU, HR, CY) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1000000157123,1000000157123` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier's numbers are not unique to it, so pass `?carrier=nextleveldelivery`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1000000157123?carrier=nextleveldelivery" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "nextleveldelivery", "trackingNumber": "1000000157123", "status": "returned", "statusDescription": "Delivered to sender", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2023-02-15T21:47:28", "status": "returned", "description": "Delivered to sender", "location": "Sofia", "code": "14" }, { "timestamp": null, "localTime": "2023-02-15T20:54:34", "status": "in_transit", "description": "Received by courier", "location": "Sofia", "code": "2" } ] } ``` ## Notes - **Source**: The JSON POST `api.nextlevel.delivery/v1/track` its tracking page calls, with `{"ids":[...]}`. Direct POST request, no account; a batch is one request. - **Language**: descriptions are English when the API provides them, else Bulgarian. - **Returns**: `Delivered to sender` and `Picked up by courier for return` are `returned`. - **Time zone**: Next Level covers several countries and does not say which, so only `localTime` is set. - 8- and 13-digit numbers are shared with many carriers; pass `?carrier=nextleveldelivery`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Nim Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/nimexpress Query live **Nim Express** (`nimexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Nim Express (Thailand) parcels, with branch and sorting-centre scans in Thai. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `nimexpress` | | **Brand aliases** | NIM Express, นิ่มเอ็กซ์เพรส, Nim Express Thailand | | **Category** | Thai domestic parcel and freight delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=6102608000100,6102608000100` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier's numbers are not unique to it, so pass `?carrier=nimexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/6102608000100?carrier=nimexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "nimexpress", "trackingNumber": "6102608000100", "status": "delivered", "statusDescription": "จัดส่งสำเร็จ", "service": null, "deliveredAt": "2026-10-20T05:30:13Z", "deliveredAtLocal": "2026-10-20T12:30:13", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-10-20T05:30:13Z", "localTime": "2026-10-20T12:30:13", "status": "delivered", "description": "จัดส่งสำเร็จ", "location": null, "code": null }, { "timestamp": "2026-10-19T16:18:47Z", "localTime": "2026-10-19T23:18:47", "status": "in_transit", "description": "พัสดุออกจากต้นทาง", "location": "ศูนย์คัดแยก บางนา", "code": null } ] } ``` ## Notes - **Source**: The tracking page `www.nimexpress.com/web/p/tracking?h_i={numbers}`, server-rendered HTML parsed into normalized events (one request for up to 20 numbers). No account. - **Language**: scan descriptions are in Thai (for example `จัดส่งสำเร็จ`, delivered). - **Time zone**: Thailand is UTC+7 all year. The page prints Buddhist-era years (`2569`); they are converted to Gregorian. - An unknown number's card says `Tracking no. ไม่ถูกต้อง` and returns `not_found`. - 11–13 digit numbers are shared with other carriers; pass `?carrier=nimexpress`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Ninja Van Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ninjavan Query live **Ninja Van** (`ninjavan`) package status and scan history across its Southeast Asian networks in a single synchronous `GET` request or MCP tool call. `lastscanned` queries each country's backend for you, so one number works whichever country shipped it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ninjavan` | | **Brand & service aliases** | Ninja Van, Ninja Xpress (Indonesia), NVSG / NLMY-style tracking IDs | | **Category** | Regional parcel carrier (Southeast Asia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=ninjavan` where noted below) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SEDMY1481550430953689088,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | `/^(NV\|NL)(SG\|MY\|ID\|PH\|VN\|TH\|MM)[A-Z0-9]{6,16}$/` | — | `SEDMY1481550430953689088`, `SEDMY1481550430953689088` | | **Explicit (`?carrier=ninjavan`)** | Any other Ninja Van tracking ID | — | — | Ninja Van IDs carry the shipping country right after the two-letter prefix, which `lastscanned` tries first; if that backend has no record it asks the other six countries before answering `not_found`. IDs that do not follow the prefix pattern work with `?carrier=ninjavan`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/SEDMY1481550430953689088?carrier=ninjavan" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/SEDMY1481550430953689088?carrier=ninjavan", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "SEDMY1481550430953689088", "carrier": "ninjavan" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "ninjavan", "trackingNumber": "SEDMY1481550430953689088", "status": "out_for_delivery", "statusDescription": "With courier for delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-10-26T01:12:40Z", "localTime": "2026-10-26T01:12:40", "status": "out_for_delivery", "description": "With courier for delivery", "location": null, "code": "DRIVER_INBOUND_SCAN" }, { "timestamp": "2026-10-25T22:05:03Z", "localTime": "2026-10-25T22:05:03", "status": "in_transit", "description": "Arrived at delivery facility", "location": "Jurong Hub", "code": "ARRIVED_AT_DESTINATION_HUB" }, { "timestamp": "2026-10-24T09:31:15Z", "localTime": "2026-10-24T09:31:15", "status": "label_created", "description": "Order information received", "location": null, "code": "CREATE_ORDER" } ] } ``` ## Status Notes - **Event wording**: Ninja Van's API returns event types (`HUB_INBOUND_SCAN`, `DELIVERY_FAILURE`, ...) rather than text; the descriptions are the wording the Ninja Van tracking page shows for each type, with the hub or pickup point as `location` and the failure reason appended to failed attempts. - **Handoffs**: when Ninja Van passes a parcel to a partner carrier it reports the partner's tracking number in `message` (for example `Handed to a partner carrier as ...`). - **Times**: timestamps are converted to UTC only when the API sends a time with an offset; otherwise only `localTime` is set. ## Related Resources - **Live browser lookup tool**: [Track a Ninja Van package live on lastscanned.com/lookup/ninjavan](https://lastscanned.com/lookup/ninjavan) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # NOEST Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/noest Query live **NOEST Express** (`noest`) package status and scan history in a single synchronous `GET` request or MCP tool call. NOEST Express (Algeria) parcels, with the order status history in French. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `noest` | | **Brand aliases** | NOEST, Noest DZ | | **Category** | Algerian e-commerce delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=QWJ-35C-10348784,QWJ-35C-10348784` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `^[A-Z0-9]{3}-[A-Z0-9]{3}-\d{6,9}$` | none | `QWJ-35C-10348784` | The shape is shared with other carriers, so it is only tried when no other carrier claims the number; `?carrier=noest` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/QWJ-35C-10348784?carrier=noest" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "noest", "trackingNumber": "QWJ-35C-10348784", "status": "exception", "statusDescription": "Commande supprimée", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2025-08-09T01:00:05Z", "localTime": "2025-08-09T02:00:05", "status": "exception", "description": "Commande supprimée", "location": null, "code": null }, { "timestamp": "2025-08-08T17:07:33Z", "localTime": "2025-08-08T18:07:33", "status": "label_created", "description": "Uploadé sur le système", "location": null, "code": null } ] } ``` ## Notes - **Source**: The tracking form `app.noest-dz.com/list/t`, a Laravel form: `lastscanned` takes the session cookie and CSRF token from a GET, then POSTs the number. No account. - **Hyphens** are part of the number and are kept (`QWJ-35C-10348784`). - **Language**: statuses are French (`Uploadé sur le système`, `Commande supprimée` is an `exception`). - **Time zone**: Algeria is UTC+1 all year, so `timestamp` is converted from `Africa/Algiers`. - The number format also looks like Paquetexpress's, so pass `?carrier=noest` when detection picks another carrier. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Northline (Australia) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/northline Query live **Northline** (`northline`) package status and scan history in a single synchronous `GET` request or MCP tool call. Consignment notes (`4KIS2101438`) are tried only when no other carrier claims the number. Pass `?carrier=northline` to be sure. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `northline` | | **Brand aliases** | Northline, Northline Australia, Northline Freight | | **Category** | Freight carrier (Australia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=4KIS2101438,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^\d[A-Z]{3}\d{5,8}$/` (customer-prefixed consignment notes) | none | `4KIS2101438` | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/4KIS2101438?carrier=northline" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "northline", "trackingNumber": "4KIS2101438", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-22T01:16:41Z", "deliveredAtLocal": "2026-03-22T12:16:41", "signedBy": null, "destination": { "city": "BOSSLEY PARK", "state": "NSW", "country": "AU" }, "events": [ { "timestamp": "2026-03-22T01:16:41Z", "localTime": "2026-03-22T12:16:41", "status": "delivered", "description": "Delivered", "location": null, "code": "8" }, { "timestamp": "2026-03-22T01:16:19Z", "localTime": "2026-03-22T12:16:19", "status": "out_for_delivery", "description": "On Delivery", "location": null, "code": "6" }, { "timestamp": "2026-03-04T03:57:20Z", "localTime": "2026-03-04T14:57:20", "status": "in_transit", "description": "Dest Depot", "location": null, "code": "7" }, { "timestamp": "2026-02-26T05:39:50Z", "localTime": "2026-02-26T15:39:50", "status": "in_transit", "description": "Send Depot", "location": null, "code": "2" }, { "timestamp": "2026-02-20T00:25:59Z", "localTime": "2026-02-20T10:25:59", "status": "label_created", "description": "Booking Received", "location": null, "code": "1" } ] } ``` ## Notes - **Time zone**: Northline's timestamps end in `Z` but are the branch's local clock. The `branch` zone (`AEST` = Brisbane +10:00, `AEDT` = Sydney and Melbourne +11:00 in summer) gives the offset, so `timestamp` is exact. - **Unknown numbers**: Northline returns an empty shell (id 0, no milestones) for an unknown note, reported as not found. Repeated identical milestones are collapsed. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Nova Global Tracking API & MCP URL: https://docs.lastscanned.com/carriers/novaglobal Query live **Nova Global** (`novaglobal`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `novaglobal` | | **Brand aliases** | Nova Poshta Global, Nova Post, NPG, personal.nova.global | | **Category** | Ukrainian international parcel service | | **Region** | Ukraine | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=WB0000000142524733NPG,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^WB\d{16}NPG$/` | none | `WB0000000142524733NPG` | | **Pass 2 (`mayMatch`)** | none | none | none | `WB` + 16 digits + `NPG` belongs to Nova Global alone, so `?carrier=novaglobal` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/WB0000000142524733NPG?carrier=novaglobal" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "novaglobal", "trackingNumber": "WB0000000142524733NPG", "status": "in_transit", "statusDescription": "Poland.Cargo departed from the transit sorting centre", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "CA" }, "message": "Handed to UPS as 1ZKE25700405950895", "events": [ { "timestamp": "2026-02-05T16:31:30Z", "localTime": "2026-02-05T19:31:30", "status": "in_transit", "description": "Poland.Cargo departed from the transit sorting centre", "location": "PL", "code": "26" }, { "timestamp": "2026-02-04T10:30:32Z", "localTime": "2026-02-04T13:30:32", "status": "in_transit", "description": "Ukraine.Flight departed for the destination", "location": "UA", "code": "54" }, { "timestamp": "2026-02-01T19:33:24Z", "localTime": "2026-02-01T22:33:24", "status": "label_created", "description": "Order for delivery to the destination country placed", "location": null, "code": "1-0" } ] } ``` ## Notes - **Language**: the API answers Ukrainian whatever `lang` is sent; the wording is kept as sent (the sample above is translated for illustration). Status comes from the numeric `code` where known. - **Time zone**: `timestamp` is the real instant (epoch seconds); `localTime` is Kyiv time as the site prints it. - **Handoff**: the reply's `bills` lists the numbers the parcel travels under; the last one is the partner's (`partner`, for example UPS). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Nova Poshta Tracking API & MCP URL: https://docs.lastscanned.com/carriers/novaposhta Query live **Nova Poshta** (`novaposhta`) parcels in a single synchronous `GET` request or MCP tool call. `lastscanned` reads Nova Poshta's public JSON API (`api.novaposhta.ua`) and returns the document's current status. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `novaposhta` | | **Category** | Ukrainian domestic and international courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=novaposhta` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=59001766134310,...&carrier=novaposhta` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP · Free tier (5 unique numbers/day) · Pro ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection | Rule | Pattern | Detection | |---|---|---| | Express invoice number | 14 digits starting `20` or `59` | Pass 2 (`mayMatch`), only when no other carrier claims the number | Other 14-digit numbers need `?carrier=novaposhta`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/59001766134310?carrier=novaposhta" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "novaposhta", "trackingNumber": "59001766134310", "status": "in_transit", "statusDescription": "Parcel is on its way to the recipient city", "service": "WarehouseWarehouse", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Lviv", "state": null, "country": "UA" }, "events": [ { "timestamp": "2026-10-26T14:05:00.000Z", "localTime": "2026-10-26T17:05:00", "status": "in_transit", "description": "Parcel is on its way to the recipient city", "location": "Lviv", "code": "5" } ] } ``` ## Notes - Without the phone number from the express invoice, Nova Poshta returns only the current status. A result therefore has a single event (the latest status), not a full scan history. - Times are Ukrainian local time and carry a UTC timestamp. - Status codes are Nova Poshta's own: `1` created, `5` on the way, `7`/`8` waiting at a branch or locker, `9`/`10`/`11` received, `101` courier on the way, `106` return created. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # nox Tracking API & MCP URL: https://docs.lastscanned.com/carriers/nox Query live **nox** (`nox`) package status and scan history in a single synchronous `GET` request or MCP tool call. nox (Germany) parcels, with depot and delivery scans in German. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `nox` | | **Brand aliases** | nox NachtExpress, nox Express, nox Germany | | **Category** | German overnight and parcel network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SWR022371152309011144205,SWR022371152309011144205` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `^SWR\d{21}$` | none | `SWR022371152309011144205` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to nox alone, so `?carrier=nox` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SWR022371152309011144205?carrier=nox" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "nox", "trackingNumber": "SWR022371152309011144205", "status": "delivered", "statusDescription": "Collo von nox zugestellt", "service": null, "deliveredAt": "2023-09-08T04:27:52Z", "deliveredAtLocal": "2023-09-08T06:27:52", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2023-09-08T04:27:52Z", "localTime": "2023-09-08T06:27:52", "status": "delivered", "description": "Collo von nox zugestellt", "location": null, "code": null }, { "timestamp": "2023-09-07T22:04:04Z", "localTime": "2023-09-08T00:04:04", "status": "out_for_delivery", "description": "Collo in nox Zustellfahrzeug geladen", "location": null, "code": null } ] } ``` ## Notes - **Source**: The JSON `trackandtrace.app.nox.express/api/scannungen/{barcode}` the nox Track & Trace app calls. Direct GET request, no account. - **Language**: scan descriptions are German (`Collo von nox zugestellt`, delivered). - **Time zone**: `scanZeit` has no zone; nox runs in Germany, so it is converted from `Europe/Berlin`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # NZ Couriers Tracking API & MCP URL: https://docs.lastscanned.com/carriers/nzcouriers Query live **NZ Couriers** (`nzcouriers`) package status and scan history in a single synchronous `GET` request or MCP tool call. NZ Couriers is part of the Freightways group in New Zealand. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `nzcouriers` | | **Brand aliases** | NZ Couriers, New Zealand Couriers, NZC, Freightways | | **Category** | Regional courier (New Zealand) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=nzcouriers` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=nzcouriers` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | NZ Couriers tickets, charge labels and consignment numbers share shapes with other carriers and with the other Freightways brands, so there is no auto-detection: always pass `?carrier=nzcouriers`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/E1130250006?carrier=nzcouriers" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "nzcouriers", "trackingNumber": "E1130250006", "status": "in_transit", "statusDescription": "We've picked up your parcel", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-10-21T01:00:17Z", "localTime": "2026-10-21T14:00:17", "status": "in_transit", "description": "Picked Up", "location": "Whanganui, Whanganui District", "code": "P" }, { "timestamp": "2026-10-20T22:30:00Z", "localTime": "2026-10-21T11:30:00", "status": "label_created", "description": "Label Created", "location": "Penrose, Auckland", "code": "P" } ] } ``` ## Notes - **Time zone**: the carrier sends scan times in UTC; `timestamp` keeps them and `localTime` is the same moment on the New Zealand clock (`Pacific/Auckland`). - **Networks**: NZ Couriers, Post Haste and Castle Parcels are Freightways brands that answer from one tracking service. Each network only knows its own consignments, so use the carrier slug of the brand that sent the parcel. - **Number shapes**: a courier ticket or pack is a product code and a number (`AB E1130250006`, the space or hyphen is kept). Anything else is searched as typed, without leading zeros. Customer-printed labels that need the sender's account number as well are not supported. - **Errors**: a number the network does not know is `not_found`. A short query (under 6 characters) is also `not_found`, and a query that matches several consignments is a `carrier_error` asking for a longer number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # NZ Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/nzpost Query live **NZ Post** (`nzpost`, including CourierPost parcels) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending in `NZ` in Pass 1; other NZ Post number shapes need `?carrier=nzpost`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `nzpost` | | **Brand & service aliases** | NZ Post, New Zealand Post, CourierPost | | **Category** | National post and parcel carrier (New Zealand) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=nzpost` for non-S10 numbers) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=LX072774186NZ,LX072774186NZ` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}NZ$/` | UPU S10 mod 11 | `LX072774186NZ` | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=nzpost`)** | Domestic and inbound numbers that other carriers also use, such as 20-digit numbers starting `00` | — | `00792019188064003181` | Pass `?carrier=nzpost` for any number that is not an S10 ending `NZ`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/LX072774186NZ?carrier=nzpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/LX072774186NZ?carrier=nzpost", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "LX072774186NZ" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "nzpost", "trackingNumber": "LX072774186NZ", "status": "in_transit", "statusDescription": "Your item has arrived in New Zealand", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-26T19:17:13Z", "localTime": "2026-10-27T08:17:13", "status": "in_transit", "description": "Your item has arrived in New Zealand", "location": "Auckland Processing Centre", "code": "591" } ] } ``` ## Status Notes - **Time zones**: NZ Post reports scan times as UTC instants. `timestamp` is that UTC time and `localTime` is the same moment on the New Zealand wall clock (`Pacific/Auckland`), as the NZ Post tracking page shows it. - **Status codes**: Delivered, delivery-attempted, out-for-delivery and held-for-collection scans are recognised by NZ Post's own event codes (`code`); other scans are classified from their wording. Attempted deliveries and parcels held for collection are reported as `exception`. - **Signature**: `signedBy` is filled from the delivery scan when NZ Post records a signer's name. ## Related Resources - **Live browser lookup tool**: [Track an NZ Post package live on lastscanned.com/lookup/nzpost](https://lastscanned.com/lookup/nzpost) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # OCA Argentina Tracking API & MCP URL: https://docs.lastscanned.com/carriers/oca Query live **OCA** (`oca`, Argentina) package status and scan history in a single synchronous `GET` request or MCP tool call. 19-digit piece numbers fall back to OCA when no other carrier claims them; pass `?carrier=oca` to be sure. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `oca` | | **Brand aliases** | OCA, OCA Argentina, OCA e-Pak, Organización Coordinadora Argentina | | **Category** | Regional parcels (Argentina) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^\d{19}$/` | none | `1862100001440549954` | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1862100001440549954?carrier=oca" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "oca", "trackingNumber": "1862100001440549954", "status": "delivered", "statusDescription": "Acuse digitalizado", "service": null, "deliveredAt": "2025-03-21T13:16:59Z", "deliveredAtLocal": "2025-03-21T10:16:59", "signedBy": null, "destination": null, "events": [ { "timestamp": "2025-03-26T17:55:11Z", "localTime": "2025-03-26T14:55:11", "status": "delivered", "description": "Acuse digitalizado", "location": "PLANTA DIGITALIZADORA", "code": null }, { "timestamp": "2025-03-21T13:16:59Z", "localTime": "2025-03-21T10:16:59", "status": "delivered", "description": "Entregado", "location": "CONCORDIA", "code": null }, { "timestamp": "2025-03-21T09:34:15Z", "localTime": "2025-03-21T06:34:15", "status": "out_for_delivery", "description": "Visita a Domicilio en Curso", "location": "CONCORDIA", "code": null } ] } ``` ## Notes - **Wording**: OCA sends no status codes, so its Spanish state names are mapped (`Entregado` delivered, `Visita a Domicilio en Curso` out for delivery, `Devuelto al Remitente` returned, `No entregado` exception). A reason other than "Sin Motivo" is appended to the description in brackets. - **Delivery time**: `deliveredAt` is the `Entregado` scan, not the later `Acuse digitalizado` (scan of the signed proof). - **Time zone**: scan times are Argentina time (UTC-3 all year). - **How it is queried**: OCA's e-Pak tracking web service called with its customer fields empty; no captcha is involved. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # OCASA Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ocasa Query live **OCASA** (`ocasa`, Argentina) package status, scan history and who received it in a single synchronous `GET` request or MCP tool call. OCASA numbers share shapes with other carriers, so pass `?carrier=ocasa`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ocasa` | | **Brand aliases** | OCASA, OCASA Argentina, Seguimiento OCASA | | **Category** | Regional parcels (Argentina) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=ocasa` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=ocasa` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | OCASA numbers are 11 digits (also GLS's shape), 18 digits or letters and digits, so `?carrier=ocasa` is required. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/26479735260?carrier=ocasa" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ocasa", "trackingNumber": "26479735260", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": "2026-07-05T13:00:00Z", "deliveredAtLocal": "2026-07-05T10:00:00", "signedBy": "Maria Perez", "destination": { "city": "La Rioja", "state": null, "country": "AR" }, "events": [ { "timestamp": "2026-07-05T13:00:00Z", "localTime": "2026-07-05T10:00:00", "status": "delivered", "description": "Entregado", "location": null, "code": null }, { "timestamp": "2026-07-05T11:23:00Z", "localTime": "2026-07-05T08:23:00", "status": "out_for_delivery", "description": "Hoy llegamos", "location": null, "code": null }, { "timestamp": "2026-06-28T12:26:00Z", "localTime": "2026-06-28T09:26:00", "status": "in_transit", "description": "Pedido en centro", "location": "Salta - AR", "code": null } ] } ``` ## Notes - **Year is inferred**: OCASA prints scan times as `05/JUL - 10:00 hs.` with no year. The newest scan is placed in the latest year that is not in the future, and the year steps back whenever the list jumps to a later month. A parcel whose latest scan is over a year old can therefore come out a year late. - **Time zone**: Argentina time (UTC-3 all year). - **Wording**: no status codes, so the Spanish state names are mapped (`Entregado`, `Hoy llegamos` out for delivery, `Entrega no efectuada` exception, `Pedido en centro` in transit). - **How it is queried**: OCASA's `/TrackingOnline/index` page, which renders the tracking timeline without a captcha step. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # OCS ANA Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ocsana Query live **OCS ANA** (`ocsana`) package status and scan history in a single synchronous `GET` request or MCP tool call. OCS ANA Group (Japan) express shipments into and out of Japan, with every handling scan. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ocsana` | | **Brand aliases** | OCS, OCS Worldwide, ANA Group OCS | | **Category** | International express, Japan | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=366256104712,366256104712` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | This carrier's numbers are not unique to it, so pass `?carrier=ocsana`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/366256104712?carrier=ocsana" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ocsana", "trackingNumber": "366256104712", "status": "delivered", "statusDescription": "Delivered: Delivery Completed, Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-04-15T11:43:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-04-15T11:43:00", "status": "delivered", "description": "Delivered: Delivery Completed, Delivered", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-04-14T11:26:00", "status": "in_transit", "description": "Ready to Hand Over to Contracted Company", "location": "TOKYO SKYGATE / JAPAN", "code": null } ] } ``` ## Notes - **Source**: The OCS tracking result page `webcsw.ocs.co.jp/csw/ECSWG0201R00003P.do?cwbno={number}`, server-rendered HTML parsed into normalized events. No account. - **Descriptions** are the activity and the memo (`Status Updated by Delivery Contracted Company: Out for Delivery`); a waybill number glued to the memo is dropped. - **Time zone**: scans happen in several countries and the page gives no zone, so only `localTime` is set. - 11–12 digit numbers are shared with FedEx and others, so pass `?carrier=ocsana`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Olva Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/olvacourier Query live **Olva Courier** (`olvacourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. Olva Courier (Peru) shipments and AliExpress-to-Peru parcels, with warehouse and delivery scans in Spanish. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `olvacourier` | | **Brand aliases** | Olva, Olva Peru | | **Category** | Peruvian courier and AliExpress last mile | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=26-1211221,26-1211221` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `^ALI-OLVA\d{8}$` | none | `26-1211221` | | **Pass 2 (`mayMatch`)** | `^(?:\d{2}-\d{6,8}|\d{6,8}-\d{2})$` | none | none | These numbers belong to Olva Courier alone, so `?carrier=olvacourier` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/26-1211221?carrier=olvacourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "olvacourier", "trackingNumber": "26-1211221", "status": "delivered", "statusDescription": "¡Entregado exitosamente!", "service": "NACIONAL", "deliveredAt": "2026-05-08T23:40:07Z", "deliveredAtLocal": "2026-05-08T18:40:07", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-05-08T23:40:07Z", "localTime": "2026-05-08T18:40:07", "status": "delivered", "description": "¡Entregado exitosamente!", "location": "LIMA", "code": "ENTREGADO" }, { "timestamp": "2026-05-08T12:51:37Z", "localTime": "2026-05-08T07:51:37", "status": "label_created", "description": "Aún no tenemos tu envío. ¡Te esperamos en Olva!", "location": "LIMA", "code": "REGISTRADO" } ] } ``` ## Notes - **Source**: The tracking page `tracking.olvacourier.com/?q={number}`, which embeds its result as `var OlvaTracking = {...}`; parsed into normalized events. No account. - **Hyphens** matter: Olva only reads its numbers with the hyphen (`26-1211221`, `ALI-OLVA00000412`). `ALIOLVA…` typed without it is corrected to `ALI-OLVA…`. - **Language**: scan descriptions are Spanish (`¡Entregado exitosamente!`, delivered). - **Time zone**: Peru is `America/Lima` (UTC-5, no daylight saving). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # OMGO Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/omgo Query live **OMGO** (`omgo`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `OMGO` + 13 digits. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `omgo` | | **Brand aliases** | OMGO, OMGO Express, OMGOexpress | | **Category** | Cross-border e-commerce parcels (China) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=OMGO0000000393548,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^OMGO\d{13}$/` | none | `OMGO0000000393548` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/OMGO0000000393548?carrier=omgo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "omgo", "trackingNumber": "OMGO0000000393548", "status": "delivered", "statusDescription": "Your parcel has been delivered to a safe place (RECEPTION)", "service": "OMGO Express", "deliveredAt": "2026-01-24T11:42:00Z", "deliveredAtLocal": "2026-01-24T19:42:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "GB" }, "events": [ { "timestamp": "2026-01-24T11:42:00Z", "localTime": "2026-01-24T19:42:00", "status": "delivered", "description": "Your parcel has been delivered to a safe place (RECEPTION)", "location": "EXAMPLE SERVICE CENTRE", "code": null }, { "timestamp": "2026-01-24T10:00:00Z", "localTime": "2026-01-24T18:00:00", "status": "out_for_delivery", "description": "Your parcel is with one of our drivers for delivery (due between 10:53 - 12:53)", "location": "EXAMPLE SERVICE CENTRE", "code": null }, { "timestamp": "2026-01-09T08:24:00Z", "localTime": "2026-01-09T16:24:00", "status": "label_created", "description": "Order fulfillment complete", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: OMGO stamps every scan in China Standard Time (`Asia/Shanghai`), whatever the parcel's country, so `localTime` is the Beijing clock. - **Nonce**: the tracker needs the one-time value its page prints; the adapter reads it per lookup. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Omniva Tracking API & MCP URL: https://docs.lastscanned.com/carriers/omniva Query live **Omniva** (`omniva`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending in `EE`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `omniva` | | **Brand aliases** | Omniva, Eesti Post parcel, Omniva parcel locker | | **Category** | Regional parcels (Estonia, Latvia, Lithuania) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=JJEE51086300000202035,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `S10 *EE` with a valid check digit (`/^[A-Z]{2}\d{9}EE$/`) | S10 | `JJEE51086300000202035` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JJEE51086300000202035?carrier=omniva" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "omniva", "trackingNumber": "JJEE51086300000202035", "status": "delivered", "statusDescription": "Shipment delivered", "service": null, "deliveredAt": "2026-08-10T10:38:04Z", "deliveredAtLocal": "2026-08-10T13:38:04", "signedBy": null, "destination": { "city": null, "state": null, "country": "EE" }, "events": [ { "timestamp": "2026-08-10T10:38:04Z", "localTime": "2026-08-10T13:38:04", "status": "delivered", "description": "Shipment delivered", "location": "Example parcel locker, EE", "code": "TRT_SHIPMENT_DELIVERED" } ] } ``` ## Notes - **Source**: the guest JSON of Omniva's own mobile app (`mobile-be.omniva.ee`). It needs no key, token or cookie. The tracking pages on `minu.omniva.ee` are not used. - **Times**: Omniva sends UTC. `localTime` is that instant in the zone of the scan's country (Estonia, Latvia or Lithuania). - **Thin records**: a delivered parcel can have no scans at all. Then `events` is empty and `status` comes from Omniva's state (`delivered` or `returned`). - **Domestic numbers**: Omniva's own long domestic numbers are not auto-detected; pass `?carrier=omniva`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ONE Container Tracking API & MCP URL: https://docs.lastscanned.com/carriers/one Query live **ONE (Ocean Network Express)** (`one`) shipping container moves in a single synchronous `GET` request or MCP tool call. Pass the container number; no booking, bill of lading or ONE account is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `one` | | **Brand aliases** | ONE, Ocean Network Express, ONE Line, one-line.com | | **Category** | Ocean container shipping line | | **Single-container REST endpoint** | `GET https://api.lastscanned.com/v1/track/{containerNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ONEU1234566,ONEU0123450` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Container Number Format & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(ONEU\|KKFU)\d{7}$/` | ISO 6346 | `ONEU1234566` · `ONEU0123450` · `KKFU8123458` | | **Pass 2 (`mayMatch`)** | none | none | none | A container number is the owner's 4-letter code, 6 digits and an ISO 6346 check digit. ONE's own owner codes detect to `one` automatically. A leased container (Textainer `TGHU`, Triton `TCNU`, CAI `CAIU`, SeaCo `SEGU` and others) can sail with any line, so pass `?carrier=one` for one booked with ONE. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ONEU1234566" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` The response below is a real lookup from November 2026, with its events cut to the newest four of 13. ```json { "carrier": "one", "trackingNumber": "ONEU1234566", "status": "in_transit", "statusDescription": "Departure from Transshipment Port", "service": "40'DRY HC.", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Guayaquil", "state": null, "country": "EC" }, "estimatedDelivery": "2026-11-12T01:00:00", "estimatedDeliveryAt": "2026-11-12T06:00:00Z", "message": "Booking ASUG00526300", "events": [ { "timestamp": "2026-10-25T09:20:00Z", "localTime": "2026-10-25T04:20:00", "status": "in_transit", "description": "Departure from Transshipment Port", "location": "Cartagena, CO", "code": "E073-01" }, { "timestamp": "2026-10-25T04:27:00Z", "localTime": "2026-10-24T23:27:00", "status": "in_transit", "description": "Loaded on Vessel at Transshipment Port, Magellan Star 2643N", "location": "Cartagena, CO", "code": "E070-01" }, { "timestamp": "2026-10-06T16:26:00Z", "localTime": "2026-10-06T11:26:00", "status": "in_transit", "description": "Vessel Arrival at T/S Port", "location": "Cartagena, CO", "code": "E066" }, { "timestamp": "2026-10-06T02:48:00Z", "localTime": "2026-10-05T21:48:00", "status": "in_transit", "description": "Departure from Transshipment Port", "location": "Cartagena, CO", "code": "E073-02" } ] } ``` ## Notes - **Source**: ONE's public cargo tracking API. The container search finds the booking, then the booking's events give every move. Two plain requests, no browser. - **Times**: ONE gives each move in UTC and in the port's local time, so both `timestamp` and `localTime` are exact. It is the only line here that does. - **ETA**: the planned vessel arrival at the port of discharge is `estimatedDelivery` (local) and `estimatedDeliveryAt` (UTC). Planned moves are never mixed into `events`. - **Booking**: `message` names the booking the container travels under. - **Status**: `Empty Container Release to Shipper` is `label_created`, `Gate Out from Inbound Terminal for Delivery to Consignee` is `out_for_delivery`, and `Empty Container Returned from Customer` is `delivered`. ## Related Resources - **All container lines**: [Ocean container tracking](https://docs.lastscanned.com/container-tracking-api) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # One World Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/oneworldexpress Query live **One World Express** (`oneworldexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. One World Express (UK) international express parcels, tracked on SmartTrack. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `oneworldexpress` | | **Brand aliases** | OWE, SmartTrack, One World Express UK | | **Category** | Low-cost international express parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=OWE000101836230,OWE000101836230` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `^OWE\d{12}$` | none | `OWE000101836230` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to One World Express alone, so `?carrier=oneworldexpress` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/OWE000101836230?carrier=oneworldexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "oneworldexpress", "trackingNumber": "OWE000101836230", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-26T20:00:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": "2026-02-26T20:00:00", "status": "delivered", "description": "Delivered", "location": "USA", "code": null }, { "timestamp": null, "localTime": "2026-02-17T01:12:00", "status": "label_created", "description": "Data Received", "location": "Delhi Service Centre - IND", "code": null } ] } ``` ## Notes - **Source**: The SmartTrack page `www.smarttrack.co/tracking.php?tracking_number={number}`, server-rendered HTML parsed into normalized events. No account. - **Time zone**: scans happen in several countries and the page gives no zone, so only `localTime` is set. - An unknown number shows "No Tracking available." and returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # OnTrac (LaserShip) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ontrac Query live **OnTrac** and **LaserShip** (`ontrac`) package status and scan history in a single synchronous `GET` request or MCP tool call. Following the OnTrac–LaserShip merger, both networks share one tracking system: `lastscanned` auto-detects legacy OnTrac `C…`/`D…` barcodes as well as LaserShip `1LS…` and `L[AEHINX]…` numbers, returning a normalized `TrackingResult` JSON payload—with zero enterprise shipper contract gating. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ontrac` | | **Brand & service aliases** | OnTrac, LaserShip, OnTrac Ground, LaserShip Residential | | **Category** | US coast-to-coast regional last-mile parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1LS...,D100...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for OnTrac / LaserShip - **No enterprise shipper account or EDI/webhook contract**: Official OnTrac / LaserShip API credentials are restricted to contracted high-volume shippers. `lastscanned` lets any merchant, 3PL dashboard, or WISMO AI agent query OnTrac and LaserShip numbers synchronously via `GET /v1/track/1LS729108273411?carrier=ontrac`. - **Clean event code normalization**: OnTrac's raw payload mixes dozens of 2- to 4-letter internal event codes (`OFDL`, `FOTO`, `NFRP`, `CUPT`, `CUDM`, `DLAY`) and labels routine transit delays as `"Pending"`. `lastscanned` maps every OnTrac event code into the 7 standard statuses while preserving the full event description in `message`. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) OnTrac is evaluated **sixth (#6)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — OnTrac `C`/`D`** | `/^[CD]\d{14}$/i` (`C` or `D` + 14 digits = 15 chars) | — | `1LS729108273411`, `C10987654321098` | | **Pass 1 (`matches`) — LaserShip `1LS`** | `/^1LS[A-Z0-9]{12,15}(-\d)?$/i` (`1LS` + 12–15 alphanumeric chars, optional `-N` piece suffix) | — | `1LS729108273411`, `1LSCYNV001D4HGY`, `1LSCXLNA060523159-1` | | **Pass 1 (`matches`) — Legacy LaserShip** | `/^L[AEHINX]\d{8}$/i` (`LA`, `LE`, `LH`, `LI`, `LN`, or `LX` + 8 digits) | — | `1LS729108273411`, `LA98765432` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=ontrac` optional vs required? - **Optional (auto-detected)**: All `C`/`D` + 14-digit OnTrac numbers, `1LS…` LaserShip numbers, and `L[AEHINX]` + 8-digit legacy LaserShip numbers auto-detect in Pass 1 with zero collisions against UPS, USPS, DHL, or FedEx. - **Required (`?carrier=ontrac`)**: Custom merchant reference numbers or numeric-only shipper order IDs inducted into OnTrac without a standard `C`/`D` or `1LS` prefix. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/1LS729108273411?carrier=ontrac" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/1LS729108273411?carrier=ontrac", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.statusDescription, pkg.deliveredAtLocal); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "1LS729108273411" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "ontrac", "trackingNumber": "1LS729108273411", "status": "delivered", "statusDescription": "Delivered", "service": "Ground", "deliveredAt": "2026-10-23T22:25:19Z", "deliveredAtLocal": "2026-10-23T15:25:19", "signedBy": null, "destination": { "city": "PHOENIX", "state": "AZ", "country": "US" }, "estimatedDelivery": "2026-10-23T00:00:00", "message": "Your package was delivered to the front door.", "events": [ { "timestamp": "2026-10-23T22:25:19Z", "localTime": "2026-10-23T15:25:19", "status": "delivered", "description": "Delivered", "location": "PHOENIX, AZ, US", "code": "FOTO" }, { "timestamp": "2026-10-23T14:10:04Z", "localTime": "2026-10-23T07:10:04", "status": "out_for_delivery", "description": "Out for Delivery", "location": "PHOENIX, AZ, US", "code": "OFDL" }, { "timestamp": "2026-10-23T09:42:51Z", "localTime": "2026-10-23T02:42:51", "status": "in_transit", "description": "Arrived at Facility", "location": "PHOENIX, AZ, US", "code": "AR" }, { "timestamp": "2026-10-21T18:00:12Z", "localTime": "2026-10-21T11:00:12", "status": "label_created", "description": "Shipping Label Created - OnTrac awaits item", "location": "ONTARIO, CA, US", "code": "OE" } ] } ``` > **Raw status & scan codes**: `statusDescription` carries OnTrac's `EventShortDescription`, top-level `message` carries `EventLongDescription`, and `events[].code` preserves the raw OnTrac event code (`OE`, `CUPT`, `OFDL`, `OD`, `FOTO`, `DLVD`, `DN`, `RETN`, etc.). ## Carrier-Specific Status & Integration Notes - **Exact UTC (`timestamp`) and scan-local (`localTime`) clocks**: OnTrac provides both `UtcEventDateTime` and `ZonedEventDateTime` on every scan, so both `timestamp` and `localTime` are populated with second-level precision. - **Estimated delivery behavior**: While a package is still in `label_created` (before OnTrac receives the physical parcel), `estimatedDelivery` is `null` (matching the OnTrac tracker's *"Pending"* state). Once inducted, `estimatedDelivery` reflects `ExpectedDeliveryDate`. ## Related Resources - **Live browser lookup tool**: [Track an OnTrac / LaserShip package live on lastscanned.com/lookup/ontrac](https://lastscanned.com/lookup/ontrac) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # ORLEN Paczka Tracking API & MCP URL: https://docs.lastscanned.com/carriers/orlenpaczka Query live **ORLEN Paczka** (`orlenpaczka`) package status and scan history in a single synchronous `GET` request or MCP tool call. ORLEN Paczka (Poland) pick-up point parcels, with sorting and pick-up scans in Polish. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `orlenpaczka` | | **Brand aliases** | Orlen, Orlen Paczka, Ruch Paczka | | **Category** | Polish pick-up point parcel service | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2102796889215,2102796889215` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | /^210\d{10}$/ with a GS1 check digit | GS1 | `2102796889215` | The shape is shared with other carriers, so it is only tried when no other carrier claims the number; `?carrier=orlenpaczka` is the sure way. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2102796889215?carrier=orlenpaczka" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "orlenpaczka", "trackingNumber": "2102796889215", "status": "delivered", "statusDescription": "Cieszymy się, że Twoja paczka została już odebrana z punktu odbioru", "service": null, "deliveredAt": "2026-10-07T16:32:00Z", "deliveredAtLocal": "2026-10-07T18:32:00", "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-10-07T16:32:00Z", "localTime": "2026-10-07T18:32:00", "status": "delivered", "description": "Cieszymy się, że Twoja paczka została już odebrana z punktu odbioru", "location": null, "code": "1000" }, { "timestamp": "2026-10-06T06:06:00Z", "localTime": "2026-10-06T08:06:00", "status": "label_created", "description": "Twoja paczka jest w trakcie przygotowania przez nadawcę", "location": null, "code": "200" } ] } ``` ## Notes - **Source**: The JSONP `nadaj.orlenpaczka.pl/parcel/api-status?id={number}` its tracking widget calls. Direct GET request, no account. - **Language**: scan descriptions are Polish (`Twoja paczka czeka na odbiór w punkcie`, waiting at the pick-up point, is reported as `exception`). - **Time zone**: dates (`07-10-2026, 18:32`) are converted from `Europe/Warsaw`. - **History codes**: `200` being prepared, `100`/`653` sorting centre, `680` on the way to the point, `690` waiting at the point, `1000` collected. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # OSM Worldwide Tracking API & MCP URL: https://docs.lastscanned.com/carriers/osm Query live **OSM Worldwide** (`osm`, One Stop Mailing) consolidator package status and middle-mile sort scans in a single synchronous `GET` request or MCP tool call. > **Solving the `"USPS Currently Awaiting Package"` consolidator black hole with `?carrier=osm`:** Most OSM Worldwide parcels travel under a **22-digit `92…` USPS IMpb barcode** (or 30-digit `420` + ZIP + `92…` barcode). Because `usps` claims all `92…` barcodes in Pass 1, querying a `92…` number without `?carrier=` queries USPS—which only shows *"Pre-Shipment: Shipping Label Created, USPS Awaiting Item"* (`"Picked Up by Shipping Partner, USPS Awaiting Item"`) for 3–7 days while OSM moves the parcel across the country. Pass **`?carrier=osm`** (or `"carrier": "osm"` in MCP) with that exact same `92…` or `420…92…` USPS number to retrieve OSM Worldwide's live middle-mile sort facility scans (`OSM04`/`OSM05`) before USPS receives the bag! ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `osm` | | **Brand & service aliases** | OSM Worldwide, OSM, One Stop Mailing (`osmworldwide.com`) | | **Category** | US domestic & international e-commerce parcel consolidator / Postal Qualified Wholesaler | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=osm` (or without `?carrier=` for `OSM…` / `A…` IDs) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=OSM...,92...&carrier=osm` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for OSM Worldwide - **Eliminate WISMO tickets during the 3–7 day USPS pre-shipment black hole**: High-volume DTC brands, book/media clubs, and 3PLs ship millions of parcels via OSM Worldwide where USPS is only the final-mile carrier. While `tools.usps.com` says *"USPS Currently Awaiting Package"*, calling `GET /v1/track/92...?carrier=osm` exposes every intermediate OSM sort center arrival and departure scan (`Glendale Heights, IL`, `Atlanta, GA`, `York, PA`, `Las Vegas, NV`, `Dallas, TX`)—and continues relaying USPS's final-mile scans (`OSM06`–`OSM15`, `OSM01`) after induction. - **Automatic `420` + ZIP prefix stripping**: If your warehouse or label system stores the full 30-digit GS1-128 barcode (`420` + 5-digit ZIP + 22-digit `92…`), `lastscanned` automatically strips the `420\d{5}` routing prefix before querying OSM Worldwide and returns your original tracking number in `trackingNumber`. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch` vs `?carrier=osm`) OSM Worldwide is evaluated **twenty-fifth (#25)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — Native `OSM` ID** | `/^OSM[0-9A-Z]{14}$/i` (`OSM` + 14 letters and digits = 17 chars) | — | `OSM4F7K2Q9X1B3D5H`, `OSM000000LM00B0LO` | | **Pass 2 (`mayMatch`) — Legacy `A…` Hub ID** | `/^A\d{10}[A-Z]{3}\d{8}$/i` (`A` + 10 digits + 3-letter hub code + 8 digits = 22 chars) | — | `A1353543146ATL03930071` | | **Explicit (`?carrier=osm`) — USPS `92…` / `420…92…` IMpb** | `/^(420\d{5})?9[2345]\d{18,24}$/` (Matches [USPS](https://docs.lastscanned.com/carriers/usps) in Pass 1 unless `?carrier=osm` is passed) | — | `9261290312839104827163`, `420787019261290312839104827163` | ### Recommended WISMO workflow for `92…` USPS consolidator labels If your merchant ships with OSM Worldwide (or if a [USPS](https://docs.lastscanned.com/carriers/usps) lookup returns `status: "label_created"` with description containing `"Shipping Partner: OSM WORLDWIDE"` or `"USPS Awaiting Item"`), immediately query the same tracking number with **`?carrier=osm`** to get the live middle-mile sort scans and OSM's `estimatedDelivery` date. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash # Query a 92... USPS IMpb consolidator barcode directly on OSM Worldwide curl -s "https://api.lastscanned.com/v1/track/9261290318412001879814?carrier=osm" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" # Native OSM... package ID (auto-detected) curl -s "https://api.lastscanned.com/v1/track/9261290318412001879814?carrier=osm" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch( "https://api.lastscanned.com/v1/track/9261290318412001879814?carrier=osm", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` } } ); const pkg = await res.json(); console.log(pkg.status, pkg.estimatedDelivery, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "9261290312839104827163", "carrier": "osm" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "osm", "trackingNumber": "9261290318412001879814", "status": "in_transit", "statusDescription": "Departed OSM Facility", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "estimatedDelivery": "2026-10-28", "events": [ { "timestamp": "2026-10-25T09:14:00Z", "localTime": "2026-10-25T04:14:00", "status": "in_transit", "description": "Departed OSM Facility", "location": "GLENDALE HEIGHTS, IL", "code": "OSM05" }, { "timestamp": "2026-10-24T22:31:00Z", "localTime": "2026-10-24T17:31:00", "status": "in_transit", "description": "Arrived at OSM Facility", "location": "GLENDALE HEIGHTS, IL", "code": "OSM04" }, { "timestamp": "2026-10-23T19:05:00Z", "localTime": "2026-10-23T14:05:00", "status": "label_created", "description": "Picked Up by Shipping Partner, USPS Awaiting Item", "location": "GLENDALE HEIGHTS, IL", "code": "OSM03" } ] } ``` > **Raw status & event codes**: `events[].code` preserves OSM Worldwide's event code (`"OSM02"` label created, `"OSM03"` picked up by shipping partner / manifest uploaded, `"OSM04"`/`"OSM05"` arrived at / departed OSM sort facility, `"OSM06"`/`"OSM07"`/`"OSM09"`/`"OSM13"` USPS arrival, acceptance, processing, and departure scans, `"OSM15"` out for delivery, `"OSM01"` delivered). Note that `"OSM03"` is emitted when the label is uploaded before OSM physically scans the parcel at a hub, so `lastscanned` maps `"OSM03"` to `label_created` until `"OSM04"` occurs. ## Carrier-Specific Status & Integration Notes - **Rate limits on unbatched OSM lookups**: OSM Worldwide's upstream endpoint holds each request for ~3 seconds and rate-limits rapid bursts (`429`). Avoid sending large simultaneous bursts of `osm` numbers in a single request. - **State-based UTC conversion**: OSM prints scan times in local wall-clock time without a timezone offset. Scans in US states that lie wholly within a single IANA timezone (`NY`, `PA`, `GA`, `IL`, `CA`, etc.) include a computed UTC `timestamp`; scans in split-timezone states (`TX`, `FL`, `TN`, `IN`, `KY`, etc.) populate `localTime` with `timestamp: null`. ## Related Resources - **Live browser lookup tool**: [Track an OSM Worldwide package live on lastscanned.com/lookup/osm](https://lastscanned.com/lookup/osm) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Paack Tracking API & MCP URL: https://docs.lastscanned.com/carriers/paack Track **Paack** parcels (Spain, Portugal, France, Italy and UK last mile, `PK` numbers) through Evri International's GlobalEco tracking page. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `paack` | | **Brand aliases** | Paack, Paack 48H, GlobalEco, Evri International | | **Category** | Regional last-mile parcels (ES, PT, FR, IT, GB) | | **Source** | GlobalEco.app tracking page (`POST /track`); server-rendered HTML history table, no account | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=PK415000000000166147,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^PK\d{18}$/` | none | `PK415000000000166147` | | **Pass 2 (`mayMatch`)** | none | none | none | This shape belongs to Paack alone, so `?carrier=paack` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/PK415000000000166147?carrier=paack" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "paack", "trackingNumber": "PK415000000000166147", "status": "delivered", "statusDescription": "Delivered", "service": "Paack 48H", "deliveredAt": null, "deliveredAtLocal": "2026-06-18T10:08:12", "signedBy": null, "destination": { "city": "Lyon", "state": null, "country": "FR" }, "events": [ { "timestamp": null, "localTime": "2026-06-18T10:08:12", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-06-18T06:23:41", "status": "out_for_delivery", "description": "Out for delivery", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-06-16T10:05:13", "status": "in_transit", "description": "Cross Docked", "location": "Venlo, NL", "code": null }, { "timestamp": null, "localTime": "2026-06-12T14:00:45", "status": "label_created", "description": "Created", "location": "Slough, GB", "code": null } ] } ``` ## Notes - **Time zone**: the page prints scan times with no zone, so `timestamp` and `deliveredAt` are `null` and only `localTime` is set. - **Route**: Paack parcels are listed on the GlobalEco.app (Evri International) page, which shows the Paack 48H service name and the destination city. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Packeta (Zásilkovna) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/packeta Query live **Packeta (Zásilkovna)** (`packeta`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects Packeta `Z…` numbers and reads the same API that tracking.packeta.com calls. Events from the destination carrier, when Packeta lists them, are merged into the scan history. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `packeta` | | **Brand & service aliases** | Packeta, Zásilkovna, Zasilkovna | | **Category** | Regional pickup-point network (Central & Eastern Europe) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (auto-detected for Z-numbers) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=Z2202657636,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=packeta`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^Z\d{9,10}$/` | None | `Z2202657636`, `Z2202657636` | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | ### When is `?carrier=packeta` optional vs required? - **Optional (auto-detected)**: `Z` followed by 9 or 10 digits. - **Required (`?carrier=packeta`)**: Any other Packeta number shape. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/Z2202657636?carrier=packeta" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/Z2202657636?carrier=packeta", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "Z2202657636" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "packeta", "trackingNumber": "Z2202657636", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-22T07:15:00Z", "deliveredAtLocal": "2026-10-22T09:15:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-22T07:15:00Z", "localTime": "2026-10-22T09:15:00", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": "2026-10-20T08:00:00Z", "localTime": "2026-10-20T10:00:00", "status": "label_created", "description": "Data received", "location": null, "code": null } ] } ``` ## Notes - Uses the page's `POST /api/getPacketById/{number}/en`; an unknown number answers 404 and becomes `not_found`. - Packeta shows its times in Europe/Prague. `timestamp` is set only when the time carries its own offset. - A parcel ready at a pickup point is reported as `exception` until it is collected. ## Related Resources - **Live browser lookup tool**: [Track a Packeta (Zásilkovna) package live on lastscanned.com/lookup/packeta](https://lastscanned.com/lookup/packeta) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Packlink Tracking API & MCP URL: https://docs.lastscanned.com/carriers/packlink Track **Packlink** shipment references (`ES2026COM…` / `…PRO…`) with the delivering carrier's scans and its tracking number. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `packlink` | | **Brand aliases** | Packlink, Packlink PRO, packlink.com | | **Category** | Shipping platform / multi-carrier (ES, FR, IT, DE, PT, NL) | | **Source** | Packlink public tracking JSON (`GET api.packlink.com/v1/trackings/{reference}`), no key | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ES2026COM0000394716,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}20\d{2}(?:COM|PRO)\d{10}$/` | none | `ES2026COM0000394716` | | **Pass 2 (`mayMatch`)** | none | none | none | This shape belongs to Packlink alone, so `?carrier=packlink` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ES2026COM0000394716?carrier=packlink" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "packlink", "trackingNumber": "ES2026COM0000394716", "status": "delivered", "statusDescription": "ENTREGADO", "service": null, "deliveredAt": "2026-09-16T17:44:00Z", "deliveredAtLocal": "2026-09-16T17:44:00", "signedBy": null, "destination": null, "message": "Handed to the destination carrier as ES2026COM0000394716", "events": [ { "timestamp": "2026-09-16T17:44:00Z", "localTime": "2026-09-16T17:44:00", "status": "delivered", "description": "ENTREGADO", "location": null, "code": "ENTREGADO" }, { "timestamp": "2026-09-16T09:18:23Z", "localTime": "2026-09-16T09:18:23", "status": "exception", "description": "REPARTO FALLIDO", "location": null, "code": "REPARTO FALLIDO" }, { "timestamp": "2026-09-16T08:56:42Z", "localTime": "2026-09-16T08:56:42", "status": "out_for_delivery", "description": "EN REPARTO", "location": null, "code": "EN REPARTO" }, { "timestamp": "2026-09-15T09:37:01Z", "localTime": "2026-09-15T09:37:01", "status": "label_created", "description": "SIN RECEPCION", "location": null, "code": "SIN RECEPCION" } ] } ``` ## Notes - **Handoff**: `message` carries the delivering carrier's tracking number, which Packlink's answer does not tie to a carrier name. - **Time zone**: Packlink returns UTC, so `localTime` is the UTC clock time. - **Scans**: the first parcel with checkpoints is shown; incident checkpoints (such as a failed delivery) are `exception`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pack-Man Tracking API & MCP URL: https://docs.lastscanned.com/carriers/packman Track **Pack-Man** (Greece) courier shipments with its status timeline. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `packman` | | **Brand aliases** | Pack-Man, Packman, Pack-Man Courier, pack-man.gr | | **Category** | Regional courier (GR) | | **Source** | pack-man.gr tracking page (`GET /anazitisi-apostolis.html?code=`); server-rendered HTML timeline | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=A-20185489,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers look like other carriers' numbers, so pass `?carrier=packman`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/A-20185489?carrier=packman" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "packman", "trackingNumber": "A-20185489", "status": "delivered", "statusDescription": "Τιμολογημένη", "service": null, "deliveredAt": "2026-03-03T10:06:09Z", "deliveredAtLocal": "2026-03-03T12:06:09", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-05T14:28:34Z", "localTime": "2026-03-05T16:28:34", "status": "delivered", "description": "Τιμολογημένη", "location": null, "code": null }, { "timestamp": "2026-03-03T10:06:09Z", "localTime": "2026-03-03T12:06:09", "status": "delivered", "description": "Παραδόθηκε στον Παραλήπτη", "location": null, "code": null }, { "timestamp": "2026-03-03T08:01:40Z", "localTime": "2026-03-03T10:01:40", "status": "out_for_delivery", "description": "Εγινε Ανάθεση σε Οδηγό", "location": null, "code": null }, { "timestamp": "2026-02-27T13:47:00Z", "localTime": "2026-02-27T15:47:00", "status": "label_created", "description": "Εκκρεμεί (προς Παραλαβή)", "location": null, "code": null } ] } ``` ## Notes - **Number format**: Pack-Man codes (`A-` plus eight digits) are not unique to it, so auto-detection does not claim them; pass `?carrier=packman`. The dash is optional. - **Statuses**: Greek wording is not parsed; the step kind on the page sets the status. The invoicing steps after delivery keep the status `delivered`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pakistan Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pakistanpost Query live **Pakistan Post** (`pakistanpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `PK` and the domestic `RGL` / `PAR` / `UMS` + 8 digit article numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pakistanpost` | | **Brand aliases** | Pakistan Post, Pakistan Post Office, PK Post, EMTTS | | **Category** | National post (Pakistan) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EB021217847PK,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | Valid UPU S10 number ending `PK` (check digit verified), or `/^(RGL\|PAR\|UMS)\d{8}$/` | mod-11 (S10) for the S10 form | `EB021217847PK` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EB021217847PK?carrier=pakistanpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "pakistanpost", "trackingNumber": "EB021217847PK", "status": "delivered", "statusDescription": "Deliver item in destination country", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-06T13:56:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "Saudi Arabia" }, "events": [ { "timestamp": null, "localTime": "2026-02-06T13:56:00", "status": "delivered", "description": "Deliver item in destination country", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-05T11:50:00", "status": "in_transit", "description": "Send item out of sorting centre in destination country", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-04T09:03:00", "status": "in_transit", "description": "Receive item at office of exchange in destination country", "location": "JEDDAH SORTING CENTRE", "code": null }, { "timestamp": null, "localTime": "2026-01-15T05:12:00", "status": "in_transit", "description": "Receive item at office of exchange in origin country", "location": "KARACHI EMS CENTRE (IMO EP)", "code": null } ] } ``` ## Notes - **Time zone**: each row is the clock at the scanning office, which is in Pakistan or in the destination country, so no zone is given and `timestamp` is `null`. - **Pickup**: `Receive item at collection point for pick-up` reports `exception`, like other carriers' waiting-at-pickup scans. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Paperfly Tracking API & MCP URL: https://docs.lastscanned.com/carriers/paperfly Query live **Paperfly** (`paperfly`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `paperfly` | | **Brand aliases** | Paperfly Bangladesh, Paperfly Private Limited, Paperfly Courier | | **Category** | Bangladeshi domestic courier | | **Region** | Bangladesh | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=PFL-BD-CB-1000012345,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^PFL-BD-CB-\d{10}$/` | none | `PFL-BD-CB-1000012345` | | **Pass 2 (`mayMatch`)** | `/^\d{6}-\d{6}-[A-Z]\d-[A-Z]\d$/` | none | `PFL-BD-CB-1000012345` | `PFL-BD-CB-` plus ten digits is a marketplace order number that belongs to Paperfly; Paperfly's own `ddmmyy-nnnnnn-A1-K1` order numbers are tried when nothing else claims them. The dashes are part of the number. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/PFL-BD-CB-1000012345?carrier=paperfly" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "paperfly", "trackingNumber": "PFL-BD-CB-1000012345", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-02-04T22:44:27Z", "deliveredAtLocal": "2026-02-05T04:44:27", "signedBy": null, "destination": { "city": null, "state": null, "country": "BD" }, "events": [ { "timestamp": "2026-02-04T22:44:27Z", "localTime": "2026-02-05T04:44:27", "status": "in_transit", "description": "Parcel in transit", "location": null, "code": null } ] } ``` ## Notes - **Overall status**: the reply's `status` ("Delivered") can run ahead of the timeline, whose last message may still read "Parcel in transit". `status` and `statusDescription` follow the overall status. - **Time zone**: Bangladesh local time (`+06:00`). - **Privacy**: the reply also carries sender, receiver and address blocks; the adapter does not read them. A marketplace number resolves to Paperfly's own order number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Paquetexpress Tracking API & MCP URL: https://docs.lastscanned.com/carriers/paquetexpress Query live **Paquetexpress** (`paquetexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Paquetexpress numbers are not auto-detected: the guide (`MEX01WW4512652`) is only tried when no other carrier claims a number, and the 12-digit tracking code overlaps other carriers' shapes, so pass `?carrier=paquetexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `paquetexpress` | | **Brand & service aliases** | Paquetexpress, PAQUETEXPRESS, Paquete Express (`paquetexpress.com.mx`) | | **Category** | Mexican parcel and freight carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=paquetexpress` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MEX01WW4512652,...&carrier=paquetexpress` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Paquetexpress - **Scan history with a real UTC time**: Paquetexpress sends each scan's UTC instant alongside its local clock, so `timestamp` and `localTime` are both set. - **Three ways to look a parcel up**: the guide number, the 12-digit tracking code or the shipper's own reference all return the same history. ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | `/^[A-Z]{3}\d{2}[A-Z]{1,3}\d{6,9}$/` (branch code, document code, serial) | — | `MEX01WW4512652` | | **Explicit (`?carrier=paquetexpress`)** | The 12-digit tracking code or the shipper's reference | — | `191215094985` | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/MEX01WW4512652?carrier=paquetexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/MEX01WW4512652?carrier=paquetexpress", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "MEX01WW4512652", "carrier": "paquetexpress" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "paquetexpress", "trackingNumber": "MEX01WW4512652", "status": "in_transit", "statusDescription": "En tránsito a sucursal destino", "service": "A domicilio", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Zamora", "state": "Michoacan", "country": "MX" }, "events": [ { "timestamp": "2026-10-24T18:20:00Z", "localTime": "2026-10-24T12:20:00", "status": "in_transit", "description": "En tránsito a sucursal destino", "location": "Guadalajara, Jalisco", "code": "TRS" }, { "timestamp": "2026-10-23T22:05:00Z", "localTime": "2026-10-23T16:05:00", "status": "in_transit", "description": "Recepción en sucursal origen", "location": "San Nicolas De Los Garza, Nuevo Leon", "code": "REC" }, { "timestamp": "2026-10-23T15:40:00Z", "localTime": "2026-10-23T09:40:00", "status": "label_created", "description": "Documentación de servicios web", "location": "San Nicolas De Los Garza, Nuevo Leon", "code": "SWB" } ] } ``` ## Notes - **Cancelled guides** ("Guia Cancelada") are reported as `exception`, and delivery wording ("Entrega exitosa") as `delivered`. - **Destination** comes from the guide's destination city, with the country fixed to `MX`. ## Related Resources - **Live browser lookup tool**: [Track a Paquetexpress package live on lastscanned.com/lookup/paquetexpress](https://lastscanned.com/lookup/paquetexpress) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Passport Tracking API & MCP URL: https://docs.lastscanned.com/carriers/passport Query live **Passport** (`passport`) package status, scan history, and the **last-mile carrier's tracking number** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `PG…` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `passport` | | **Brand aliases** | Passport, Passport Global, Passport Shipping, passportglobal.com | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=PG6519662122CA,PG6519662122CA` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^PG\d{10,11}[A-Z]{2}$/` | none | `PG6519662122CA` | | **Pass 2 (`mayMatch`)** | none | none | none | The last two characters are the destination country. `PG` numbers belong to Passport alone, so `?carrier=passport` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/PG6519662122CA?carrier=passport" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "passport", "trackingNumber": "PG6519662122CA", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-12T12:22:00", "signedBy": null, "destination": { "city": "Edinburgh", "state": "Midlothian", "country": "GB" }, "message": "Handed to Royal Mail as PG6519662122CA", "events": [ { "timestamp": null, "localTime": "2026-10-12T12:22:00", "status": "delivered", "description": "Delivered", "location": "EDINBURGH WEST DO, GB", "code": null }, { "timestamp": null, "localTime": "2026-10-12T08:38:00", "status": "out_for_delivery", "description": "Out for delivery - package is enroute to delivery. parcel out for delivery", "location": "EDINBURGH WEST DO, GB", "code": null }, { "timestamp": null, "localTime": "2026-10-02T20:13:00", "status": "label_created", "description": "Thank you, order information received!", "location": "US", "code": null } ] } ``` ## Notes - **Handoff**: `message` names the last-mile carrier and its number (for example `"Handed to Royal Mail as PG6519662122CA"`). Pass that number to `GET /v1/track/{number}` for the partner's own scans. When the partner uses the Passport number itself, `message` is `null`. - **Time zone**: Passport's page prints scan dates as "Oct 12" and times without a zone, so `timestamp` is `null` and `localTime` is the printed clock time. The year is worked out from the purchase date. - **Estimates**: estimated milestones on the page are not scans and are left out. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pathao Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pathao Query live **Pathao Courier** (`pathao`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pathao` | | **Brand aliases** | Pathao, Pathao Parcel, Pathao Merchant | | **Category** | Bangladeshi domestic courier | | **Region** | Bangladesh | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=DD011024EG97WG,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^D[A-Z]\d{6}[A-Z0-9]{6}$/` | none | `DD011024EG97WG` | | **Pass 2 (`mayMatch`)** | none | none | none | Consignment IDs (`D` + a letter, the order date as `ddmmyy`, then six letters or digits) belong to Pathao alone, so `?carrier=pathao` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/DD011024EG97WG?carrier=pathao" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "pathao", "trackingNumber": "DD011024EG97WG", "status": "delivered", "statusDescription": "Order has been delivered to the customer", "service": null, "deliveredAt": "2026-01-15T10:56:00Z", "deliveredAtLocal": "2026-01-15T16:56:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "BD" }, "events": [ { "timestamp": "2026-01-15T10:56:00Z", "localTime": "2026-01-15T16:56:00", "status": "delivered", "description": "Order has been delivered to the customer", "location": null, "code": null }, { "timestamp": "2026-01-15T09:35:00Z", "localTime": "2026-01-15T15:35:00", "status": "out_for_delivery", "description": "Order has been assigned to a rider for delivery", "location": null, "code": null }, { "timestamp": "2026-01-14T08:52:00Z", "localTime": "2026-01-14T14:52:00", "status": "in_transit", "description": "Order has been reached at delivery hub", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: Pathao prints Bangladesh local time (`+06:00`), so `timestamp` is exact. - **Privacy**: rider names and phone numbers in the wording are replaced ("assigned to a rider"). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PCP Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pcpexpress Track **PCP Express** (Indonesia) AWBs with the full status history. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pcpexpress` | | **Brand aliases** | PCP Express, PCP, PCP Express Indonesia | | **Category** | Regional courier (ID) | | **Source** | PCP Express tracking JSON (`POST www.pcpexpress.com/apps/RequestTracking.php`, body is the AWB as a JSON string) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=JKTPKUB3250304M00007,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers look like other carriers' numbers, so pass `?carrier=pcpexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JKTPKUB3250304M00007?carrier=pcpexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "pcpexpress", "trackingNumber": "JKTPKUB3250304M00007", "status": "delivered", "statusDescription": "SHIPMENT STATUS DELIVERED", "service": "TITIPAN REGULER EXPRESS - (TREX)", "deliveredAt": null, "deliveredAtLocal": "2025-03-12T16:07:37", "signedBy": null, "destination": { "city": "MEDAN", "state": null, "country": "ID" }, "events": [ { "timestamp": null, "localTime": "2025-03-12T16:07:37", "status": "delivered", "description": "SHIPMENT STATUS DELIVERED", "location": "MEDAN", "code": "2" }, { "timestamp": null, "localTime": "2025-03-12T15:23:45", "status": "out_for_delivery", "description": "DELIVERY PROCESS", "location": "MEDAN", "code": "42" }, { "timestamp": null, "localTime": "2025-03-07T11:59:35", "status": "in_transit", "description": "ARRIVAL AT DESTINATION", "location": "MEDAN", "code": "41" }, { "timestamp": null, "localTime": "2025-03-05T01:53:59", "status": "in_transit", "description": "ARRIVE AT OPERATION", "location": "JAKARTA", "code": "201" } ] } ``` ## Notes - **Number format**: AWBs are not distinctive enough to auto-detect; pass `?carrier=pcpexpress`. - **Time zone**: Indonesia spans three zones and the scan office does not fix one, so only `localTime` is set. - **Codes**: status id 2 is delivered, 42 and 77 are delivery runs, 1 is a failed attempt ("kirim ulang"). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PDN Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pdnexpress Track **PDN Express** (`PDN…`) cross-border parcels into Canada with timed scans. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pdnexpress` | | **Brand aliases** | PDN Express, PDN, pdn.express | | **Category** | Cross-border e-commerce parcels | | **Source** | PDN Express tracking JSON (`POST pdn.express/api/track`), no account | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=PDN0013911461,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^PDN\d{10}$/` | none | `PDN0013911461` | | **Pass 2 (`mayMatch`)** | none | none | none | This shape belongs to PDN Express alone, so `?carrier=pdnexpress` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/PDN0013911461?carrier=pdnexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "pdnexpress", "trackingNumber": "PDN0013911461", "status": "delivered", "statusDescription": "Your package has been delivered to the Front door.", "service": null, "deliveredAt": "2025-05-07T20:23:30Z", "deliveredAtLocal": "2025-05-07T16:23:30", "signedBy": null, "destination": { "city": null, "state": null, "country": "Canada" }, "events": [ { "timestamp": "2025-05-07T20:23:30Z", "localTime": "2025-05-07T16:23:30", "status": "delivered", "description": "Your package has been delivered to the Front door.", "location": "Toronto, Canada", "code": "D860" }, { "timestamp": "2025-05-07T13:27:28Z", "localTime": "2025-05-07T09:27:28", "status": "out_for_delivery", "description": "Your package is out for delivery.", "location": "Toronto, Canada", "code": "D840" }, { "timestamp": "2025-05-07T02:32:53Z", "localTime": "2025-05-06T22:32:53", "status": "in_transit", "description": "We've got your package.", "location": "Toronto, Canada", "code": "D830" }, { "timestamp": "2025-04-30T19:41:20Z", "localTime": "2025-04-30T19:41:20", "status": "label_created", "description": "Package information received.", "location": null, "code": "D800" } ] } ``` ## Notes - **Time zone**: every scan carries an IANA zone (`America/Toronto`, `UTC`), so `timestamp` is exact. - **Codes**: D800 pre-alert, D830 in transit, D840 out for delivery, D860 delivered. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PDQ Cargo Trader Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pdqchile Track **PDQ Cargo Trader** (Chile) guide numbers with scans and delivery. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pdqchile` | | **Brand aliases** | PDQ Cargo Trader, PDQ, PDQ Chile, pdq.cl | | **Category** | Regional courier (CL) | | **Source** | PDQ tracking JSON (`GET www.pdq.cl/api/tracking?q={number}`) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=777701055551,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers look like other carriers' numbers, so pass `?carrier=pdqchile`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/777701055551?carrier=pdqchile" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "pdqchile", "trackingNumber": "777701055551", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-05-20T17:00:00", "signedBy": null, "destination": { "city": "Valdivia", "state": null, "country": "CL" }, "events": [ { "timestamp": null, "localTime": "2026-05-20T17:00:00", "status": "delivered", "description": "Entregado", "location": "Valdivia", "code": "ENTR" }, { "timestamp": null, "localTime": "2026-05-20T12:39:00", "status": "out_for_delivery", "description": "En reparto", "location": "Valdivia", "code": "REPA" }, { "timestamp": null, "localTime": "2026-05-19T21:16:00", "status": "in_transit", "description": "En viaje a destino", "location": "Cd Maipu", "code": "CPCE" } ] } ``` ## Notes - **Number format**: twelve-digit guides are not unique to PDQ, so pass `?carrier=pdqchile`. - **Time zone**: Chile has more than one zone, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PFC Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pfcexpress Track **PFC Express** cross-border orders (`R…`) with scans from PFC and the partner post. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pfcexpress` | | **Brand aliases** | PFC Express, PFC, PFC Track, pfctrack.com | | **Category** | Cross-border e-commerce parcels (CN origin) | | **Source** | PFC tracking page XHR (`GET www.pfctrack.com/Index?handler=AccessRedirect&nos={number}`); HTML fragment inside JSON | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=R965692608022,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^R\d{5,6}2\d(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{1,4}$/` | none | `R965692608022` | The shape is only a last-resort guess, so pass `?carrier=pfcexpress` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/R965692608022?carrier=pfcexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "pfcexpress", "trackingNumber": "R965692608022", "status": "exception", "statusDescription": "Export cancelled by Customs", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": "Handed to the destination carrier as R965692608022", "events": [ { "timestamp": null, "localTime": "2026-09-03T22:37:00", "status": "exception", "description": "Export cancelled by Customs", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-09-03T10:57:53", "status": "in_transit", "description": "邮件离开【广东省深圳市国际互换局】,正在发往下一站", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-08-03T11:38:44", "status": "in_transit", "description": "Shipment picked up", "location": null, "code": null } ] } ``` ## Notes - **Handoff**: the partner's number from the summary row is put in `message`. - **Languages**: PFC's own scans are English; the partner post's scans are passed through in Chinese. Chinese returned, out-for-delivery and signed wordings are recognised. - **Time zone**: scans come from several systems with no zone, so only `localTime` is set. - **Auto-detection**: the shape is only a last-resort guess (`mayMatch`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PHLPost (Philippine Postal Corporation) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/phlpost Query live **PHLPost** (`phlpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `PH`. PHLPost's tracker also follows S10 numbers from other posts that send to the Philippines; pass `?carrier=phlpost` for those. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `phlpost` | | **Brand aliases** | PHLPost, Philippine Postal Corporation, PhilPost, Philippine Post | | **Category** | National post (Philippines) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EE182948114PH,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | Valid UPU S10 number ending `PH` (check digit verified) | mod-11 (S10) | `EE182948114PH` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EE182948114PH?carrier=phlpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "phlpost", "trackingNumber": "EE182948114PH", "status": "delivered", "statusDescription": "Item delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-06-03T13:52:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-06-03T13:52:00", "status": "delivered", "description": "Item delivered", "location": "United States of America", "code": "37" }, { "timestamp": null, "localTime": "2026-06-03T04:35:00", "status": "in_transit", "description": "Receive item at delivery office", "location": "United States of America", "code": "32" }, { "timestamp": "2026-05-21T02:28:49Z", "localTime": "2026-05-21T10:28:49", "status": "in_transit", "description": "Posting of item", "location": "PHILIPPINES", "code": "1" } ] } ``` ## Notes - **Time zone**: scans in the Philippines are `Asia/Manila` (so `timestamp` is set). Scans abroad are that country's clock time with no zone, so `timestamp` is `null`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pilot Freight Services Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pilotfreight Track **Pilot Freight Services** (Maersk, US) PRO numbers with event history. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pilotfreight` | | **Brand aliases** | Pilot Freight Services, Pilot, Pilot Air Freight, Maersk Pilot | | **Category** | Regional freight and final-mile delivery (US) | | **Source** | Pilot tracking JSON (`GET wwwapi.pilotdelivers.com/track/{base64 PRO}/orgzip/0/dstzip/0/custnum/0`), no key | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=069865795,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers look like other carriers' numbers, so pass `?carrier=pilotfreight`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/069865795?carrier=pilotfreight" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "pilotfreight", "trackingNumber": "069865795", "status": "in_transit", "statusDescription": "PICKED UP", "service": "HOME DELIVERY-STANDARD 2 MAN", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-07-07T00:33:00Z", "localTime": "2026-07-06T20:33:00", "status": "in_transit", "description": "PICKED UP", "location": "TAMPA, FL", "code": "PU" }, { "timestamp": "2026-07-06T20:29:08Z", "localTime": "2026-07-06T16:29:08", "status": "in_transit", "description": "APPOINTMENT SCHEDULED", "location": "ON-LINE/ON PHONE", "code": "APT" } ] } ``` ## Notes - **Number format**: nine-digit PROs are not unique to Pilot, so pass `?carrier=pilotfreight`. - **Time zone**: each event time carries its UTC offset. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pingda International Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pingda56 Query live **Pingda International** (`pingda56`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pingda International numbers share their shape with other carriers' numbers, so pass `?carrier=pingda56`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pingda56` | | **Brand aliases** | Pingda International, 平达国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=pingda56` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=pingda56` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Pingda International tracking numbers have no shape of their own, so always pass `?carrier=pingda56`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Pingda International in one request. - **Platform**: Pingda International runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pitney Bowes Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pitneybowes Query live **Pitney Bowes** (`pitneybowes`) domestic consolidator and **eBay International Shipping** (`UPAA…`) package status and scan history in a single synchronous `GET` request or MCP tool call. > **Solving the `"USPS Currently Awaiting Package"` consolidator black hole with `?carrier=pitneybowes`:** Pitney Bowes operates one of the largest US e-commerce parcel sortation networks, inducting millions of domestic **`92…` / `420+ZIP+92…` USPS IMpb barcodes** into USPS for final delivery. Because `usps` claims all `92…` barcodes in Pass 1, querying a `92…` label without `?carrier=` queries USPS—which remains stuck on *"Pre-Shipment / Picked Up by Shipping Partner (PITNEY BOWES), USPS Currently Awaiting Package"* while the parcel moves through Pitney Bowes hubs (`Monroe Twp, NJ`, `Greenwood, IN`, `heb/Dallas, TX`, `Bloomington, CA`). Pass **`?carrier=pitneybowes`** (or `"carrier": "pitneybowes"` in MCP) with that `92…` or `420…92…` number to retrieve Pitney Bowes's live middle-mile sort scans and estimated delivery date! ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pitneybowes` | | **Brand & service aliases** | Pitney Bowes, PB, Pitney Bowes Ecommerce, eBay International Shipping (`UPAA…`), eBay Global Shipping Program (`tracking.pb.com`) | | **Category** | Cross-border & US domestic e-commerce parcel consolidator | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (auto-detected for `UPAA…`; add `?carrier=pitneybowes` for `92…` USPS labels) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=UPAA...,UPAA...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Pitney Bowes - **Replaces the retired `pitneybowes.narvar.com` tracker**: Pitney Bowes decommissioned its legacy Narvar tracking portal in favor of `tracking.pb.com` (`trackpb.shipment.co`), and official Pitney Bowes Shipping 360 / Cross-Border APIs require enterprise OAuth developer keys. `lastscanned` queries Pitney Bowes synchronously with zero carrier credentials. - **Full eBay International Shipping (`UPAA…`) visibility**: eBay International Shipping orders travel from the US seller to the Pitney Bowes Global Shipping Center (e.g. `Glendale Heights, IL`) and then onward to international destination carriers. `lastscanned` auto-detects `UPAA…` numbers in Pass 1 and returns both the US hub scans and the overseas partner's relayed delivery scans. - **Surfaces pre-USPS Pitney Bowes sort scans on `92…` labels**: When a `92…` USPS barcode is still in Pitney Bowes's middle-mile network, passing `?carrier=pitneybowes` returns every Pitney Bowes hub arrival/departure scan plus Pitney Bowes's `estimatedDelivery` date (`eddTime`), and automatically strips any leading `420` + 5-digit ZIP prefix. ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=pitneybowes`) Pitney Bowes is evaluated **twenty-sixth (#26)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — eBay International Shipping** | `/^UPAA[A-Z]\d{15}$/i` (`UPAA` + 1 letter + 15 digits = 20 chars) | — | `UPAAG000000089627496`, `UPAAG000000089627496` | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=pitneybowes`) — USPS `92…` / `420…92…` IMpb** | `/^(420\d{5})?9[2345]\d{18,24}$/` (Matches [USPS](https://docs.lastscanned.com/carriers/usps) in Pass 1 unless `?carrier=pitneybowes` is passed) | — | `9261290982736451029384`, `420100019261290982736451029384` | ### When is `?carrier=pitneybowes` optional vs required? - **Optional (auto-detected)**: All 20-character `UPAA` + letter + 15-digit eBay International Shipping numbers auto-detect in Pass 1. - **Required (`?carrier=pitneybowes`)**: All 22-digit `92…` (or 30-digit `420` + ZIP + `92…`) USPS labels created through Pitney Bowes when you want to inspect Pitney Bowes hub scans while USPS still says *"USPS Currently Awaiting Package"*. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash # eBay International Shipping UPAA... number (auto-detected) curl -s "https://api.lastscanned.com/v1/track/UPAAG000000089627496?carrier=pitneybowes" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" # 92... USPS IMpb consolidator label via Pitney Bowes curl -s "https://api.lastscanned.com/v1/track/UPAAG000000089627496?carrier=pitneybowes" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/UPAAG000000089627496?carrier=pitneybowes", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.service, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "9261290982736451029384", "carrier": "pitneybowes" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "pitneybowes", "trackingNumber": "UPAAG000000089627496", "status": "in_transit", "statusDescription": "Shipped from Global Shipping Center to Destination", "service": "eBay International Shipping", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "estimatedDelivery": "2026-10-30", "events": [ { "timestamp": "2026-10-25T20:11:00Z", "localTime": "2026-10-25T15:11:00", "status": "in_transit", "description": "Shipped from Global Shipping Center to Destination", "location": "Glendale Heights, IL, US", "code": null }, { "timestamp": "2026-10-25T01:40:00Z", "localTime": "2026-10-24T20:40:00", "status": "in_transit", "description": "Processing at Shipping Center", "location": "Glendale Heights, IL, US", "code": null }, { "timestamp": "2026-10-22T14:22:00Z", "localTime": "2026-10-22T10:22:00", "status": "label_created", "description": "Tracking details uploaded", "location": "Columbus, OH, US", "code": null } ] } ``` ## Related Resources - **Live browser lookup tool**: [Track a Pitney Bowes package live on lastscanned.com/lookup/pitneybowes](https://lastscanned.com/lookup/pitneybowes) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # PITT OHIO Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pittohio Track **PITT OHIO** LTL freight by PRO number with the shipment history. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pittohio` | | **Brand aliases** | PITT OHIO, Pitt Ohio, PITT OHIO LTL | | **Category** | Regional LTL freight (US) | | **Source** | PITT OHIO LTL trace page (`GET pittohio.com/myPittOhio/Shipping/LTL/TraceRequest?pro={pro}`); server-rendered HTML | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=5012300005,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | 10 digits whose last digit is the first nine digits mod 7 | mod 7 | `5012300005` | The shape is only a last-resort guess, so pass `?carrier=pittohio` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/5012300005?carrier=pittohio" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "pittohio", "trackingNumber": "5012300005", "status": "delivered", "statusDescription": "Delivered at consignee location", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-09-25T11:45:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-09-25T11:45:00", "status": "delivered", "description": "Delivered at consignee location", "location": "York, PA", "code": null }, { "timestamp": null, "localTime": "2026-09-24T15:10:00", "status": "exception", "description": "Delivery Attempted - Consignee Closed", "location": "York, PA", "code": null }, { "timestamp": null, "localTime": "2026-09-23T22:44:00", "status": "in_transit", "description": "Shipment arrived at PITT OHIO destination terminal", "location": "Lancaster, PA", "code": null } ] } ``` ## Notes - **Auto-detection**: ten-digit PROs are shared with other carriers, so detection never claims them on its own; pass `?carrier=pittohio`. - **Time zone**: the page prints scan times without a zone, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Planzer Tracking API & MCP URL: https://docs.lastscanned.com/carriers/planzer Query live **Planzer** (`planzer`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `planzer` | | **Brand aliases** | Planzer Transport, Planzer Paket, Planzer Schweiz | | **Category** | Swiss freight and parcel carrier | | **Region** | Switzerland | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=12345.11652.0059554609,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^\d{5}\.\d{10}$/` | none | `12345.11652.0059554609` | | **Pass 2 (`mayMatch`)** | none | none | none | The customer reference `12345.11652.0059554609` (five digits, a dot, ten digits) belongs to Planzer alone. A bare 8-digit shipment number (`11652.0059554609`) is too common a shape to claim, so pass `?carrier=planzer` for it. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/11652.0059554609?carrier=planzer" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "planzer", "trackingNumber": "11652.0059554609", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-06-06T12:57:55Z", "deliveredAtLocal": "2026-06-06T14:57:55", "signedBy": null, "destination": { "city": "Zürich", "state": null, "country": "CH" }, "events": [ { "timestamp": "2026-06-06T12:57:55Z", "localTime": "2026-06-06T14:57:55", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": "2026-06-06T05:00:50Z", "localTime": "2026-06-06T07:00:50", "status": "out_for_delivery", "description": "In delivery", "location": null, "code": null }, { "timestamp": "2026-06-01T08:02:42Z", "localTime": "2026-06-01T10:02:42", "status": "in_transit", "description": "Transferred", "location": null, "code": null }, { "timestamp": "2026-05-27T14:12:35Z", "localTime": "2026-05-27T16:12:35", "status": "label_created", "description": "Recorded", "location": null, "code": null } ] } ``` ## Notes - **Shipment number**: the API takes the shipment number alone (`11652.0059554609`); the adapter drops the customer prefix and the zero padding from `12345.11652.0059554609`. - **Time zone**: scan times are Swiss local time (`Europe/Zurich`). - **Wording**: Planzer's English text for *Zugestellt* reads "Shipped"; the adapter words that scan "Delivered". ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Poczta Polska Tracking API & MCP URL: https://docs.lastscanned.com/carriers/polishpost Query live **Poczta Polska** (`polishpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. S10 numbers ending `PL` auto-detect in Pass 1. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `polishpost` | | **Category** | National post (Poland) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CP265970733PL,CP265970733PL` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}PL$/` with a valid S10 check digit | S10 mod 11 | `CP265970733PL` | | **Pass 2 (`mayMatch`)** | *None* | — | — | Domestic Poczta Polska numbers (20 digits) need `?carrier=polishpost`. Event text is the carrier's English wording; scans are read as Europe/Warsaw. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CP265970733PL?carrier=polishpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "polishpost", "trackingNumber": "CP265970733PL", "status": "in_transit", "statusDescription": "Sent from sorting office", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-24T08:15:00Z", "localTime": "2026-10-24T10:15:00", "status": "in_transit", "description": "Sent from sorting office", "location": "Warszawa UC", "code": "P_WYS" } ] } ``` ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pos Indonesia Tracking API & MCP URL: https://docs.lastscanned.com/carriers/posindonesia Query live **Pos Indonesia** (`posindonesia`) domestic waybill status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `posindonesia` | | **Brand aliases** | PT Pos Indonesia, Pos Indo | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^P\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{7}$/` | none | `P2111130063958` | Pass `?carrier=posindonesia` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/P2111130063958?carrier=posindonesia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "posindonesia", "trackingNumber": "P2111130063958", "status": "delivered", "statusDescription": "Barang anda selesai dikirim dan diterima", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-01-08T14:50:09", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-01-08T14:50:09", "status": "delivered", "description": "Barang anda selesai dikirim dan diterima", "location": "Kota Contoh 12345", "code": "DELIVERED" }, { "timestamp": null, "localTime": "2026-01-07T14:40:49", "status": "out_for_delivery", "description": "Barang anda telah melewati proses DeliveryRunsheet di Kantor Pos Contoh 12346", "location": "Contoh 12346", "code": "DELIVERYRUNSHEET" }, { "timestamp": null, "localTime": "2026-01-03T20:50:58", "status": "in_transit", "description": "Bagging", "location": null, "code": "inBAG" } ] } ``` ## Notes - **Source**: the API behind posindonesia.co.id's tracking page. Its JSON is malformed when numeric fields are blank, which the adapter repairs. Only the domestic `P…` waybill is auto-detected; `…ID` S10 items are shared with the UPU network, so use `?carrier=posindonesia`. - **Time zone**: Indonesia spans three zones, so only `localTime` is set. - **Statuses**: `DELIVERED`, `DELIVERYRUNSHEET` (out for delivery), `PENDING` (created) and wording for the rest. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pos Malaysia (Pos Laju) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/posmalaysia Query live **Pos Malaysia** (`posmalaysia`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending `MY` (with a valid check digit) in Pass 1 and returns a normalized `TrackingResult` JSON payload, with no Pos Malaysia account or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `posmalaysia` | | **Brand & service aliases** | Pos Malaysia, Pos Laju, Poslaju, `pos.com.my`, S10 `…MY` | | **Category** | National postal operator (Malaysia), domestic and international parcels and mail | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=LP661177776MY,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10: two letters, nine digits, `MY` | Yes (S10) | `LP661177776MY` | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | Local Pos Laju numbers that are not S10 shaped can be tracked with `?carrier=posmalaysia`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/LP661177776MY?carrier=posmalaysia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/LP661177776MY?carrier=posmalaysia", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "LP661177776MY" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "posmalaysia", "trackingNumber": "LP661177776MY", "status": "out_for_delivery", "statusDescription": "Your parcel is with our courier and is out for delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Kuala Lumpur", "state": "Kuala Lumpur", "country": "MY" }, "events": [ { "timestamp": "2026-10-26T01:52:32Z", "localTime": "2026-10-26T09:52:32", "status": "out_for_delivery", "description": "Your parcel is with our courier and is out for delivery", "location": "Pusat POS Laju Kepong", "code": "EM014" }, { "timestamp": "2026-10-25T19:16:01Z", "localTime": "2026-10-26T03:16:01", "status": "in_transit", "description": "Your parcel has been sorted. We are on our way!", "location": "HUB Parcel Domestik Shah Alam", "code": "EM010" }, { "timestamp": "2026-10-24T02:05:10Z", "localTime": "2026-10-24T10:05:10", "status": "in_transit", "description": "We have received your parcel and can't wait to deliver it!", "location": "POS Laju Kiosk", "code": "EM001" } ] } ``` ## Notes - Scan times are Malaysia time, returned with a UTC `timestamp` and the scan's `localTime`. - `destination` comes from the recipient's city, state and country that Pos Malaysia reports. - The tracking page asks for a phone number only before showing the proof-of-delivery photo. The scans do not need it, and `lastscanned` does not return the photo. - Up to 5 numbers go in one batch request. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Pošta na Severna Makedonija Tracking API & MCP URL: https://docs.lastscanned.com/carriers/postamk Track **Pošta na Severna Makedonija** (North Macedonia) mail by UPU S10 number, including foreign items it receives. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `postamk` | | **Brand aliases** | Pošta na Severna Makedonija, Posta Makedonije, Macedonian Post, Pošta na Severna Makedonija, MK Post | | **Category** | National postal operator (MK) | | **Source** | posta.com.mk shipment JSON (`GET www.posta.com.mk/api/api.php/shipment?code={number}`) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CF154260298AU,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10 format with the `MK` suffix and a valid check digit | UPU S10 | `CF154260298AU` | | **Pass 2 (`mayMatch`)** | none | none | none | This shape belongs to Pošta na Severna Makedonija alone, so `?carrier=postamk` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CF154260298AU?carrier=postamk" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "postamk", "trackingNumber": "CF154260298AU", "status": "in_transit", "statusDescription": "Pristignata vo Naizmeni!na po{ta (Vlez)", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-09-20T04:47:00Z", "localTime": "2026-09-20T06:47:00", "status": "in_transit", "description": "Pristignata vo Naizmeni!na po{ta (Vlez)", "location": "North Macedonia", "code": "MKSKPB" } ] } ``` ## Notes - **Language**: the post's notes are Macedonian typed in a Latin-letter font mapping (`po{ta` is pošta), passed through as sent. - **Time zone**: scans by a Macedonian office are in `Europe/Skopje`; scans by foreign offices keep `localTime` only. - **Scope**: foreign S10 numbers (for example `…HU`, `…AU`) also work with `?carrier=postamk`. - **Statuses**: delivered wording has not been seen in sample data, so unrecognised notes show as `in_transit`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Posta Shqiptare (Albanian Post) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/postashqiptare Query live **Posta Shqiptare** (`postashqiptare`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `AL`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `postashqiptare` | | **Brand aliases** | Posta Shqiptare, Albanian Post, Posta Shqiptare AL, Koliposte | | **Category** | National post (Albania) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CP214220554AL,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | Valid UPU S10 number ending `AL` (check digit verified) | mod-11 (S10) | `CP214220554AL` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CP214220554AL?carrier=postashqiptare" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "postashqiptare", "trackingNumber": "CP214220554AL", "status": "delivered", "statusDescription": "Objekti u dorezua", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-12T13:45:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-12T13:45:00", "status": "delivered", "description": "Objekti u dorezua", "location": "Itali", "code": null }, { "timestamp": null, "localTime": "2026-03-12T09:23:00", "status": "in_transit", "description": "Objekti u pranua ne zyren e shperndarjes", "location": "Itali", "code": null }, { "timestamp": null, "localTime": "2026-03-02T09:11:00", "status": "in_transit", "description": "Pranim objekti nga klienti / Receive item from customer", "location": "ZP Tirana 5, TIRANA", "code": null } ] } ``` ## Notes - **Language**: descriptions are Albanian, often followed by ` / ` and the UPU English wording. For items abroad the `location` is a country name (in Albanian); for Albanian offices it is the office and town. - **Time zone**: scan times are clock times with no zone, so `timestamp` is `null` and only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pošta Slovenije (Post of Slovenia) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/postaslovenije Query live **Pošta Slovenije** (`postaslovenije`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `SI`. Pošta Slovenije's tracker also follows S10 numbers from other posts it delivers; pass `?carrier=postaslovenije` for those. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `postaslovenije` | | **Brand aliases** | Pošta Slovenije, Posta Slovenije, Post of Slovenia, Slovenian Post, moja.posta.si | | **Category** | National post (Slovenia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CF369007664SI,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | Valid UPU S10 number ending `SI` (check digit verified) | mod-11 (S10) | `CF369007664SI` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CF369007664SI?carrier=postaslovenije" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "postaslovenije", "trackingNumber": "CF369007664SI", "status": "delivered", "statusDescription": "The item was delivered to the mailbox / P.O. box. The item was delivered to the doorstep", "service": null, "deliveredAt": "2026-09-11T06:29:34Z", "deliveredAtLocal": "2026-09-11T08:29:34", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-09-11T06:29:34Z", "localTime": "2026-09-11T08:29:34", "status": "delivered", "description": "The item was delivered to the mailbox / P.O. box. The item was delivered to the doorstep", "location": "Jesenice", "code": "VL" }, { "timestamp": "2026-09-10T08:10:00Z", "localTime": "2026-09-10T10:10:00", "status": "out_for_delivery", "description": "The item is expected to be delivered today. The item is out for doorstep delivery", "location": "Jesenice", "code": "N" }, { "timestamp": "2026-09-03T13:16:54Z", "localTime": "2026-09-03T15:16:54", "status": "label_created", "description": "The item information has been received in the Pošta Slovenije system. The sender has not yet handed over the item to Pošta Slovenije", "location": null, "code": "NAJ" } ] } ``` ## Notes - **Response time**: Pošta Slovenije's tracking endpoint requires session token verification; a lookup takes several seconds. - **Returns**: a return to the sender (code `VRP`) reports `returned`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Poste Italiane Tracking API & MCP URL: https://docs.lastscanned.com/carriers/posteitaliane Query live **Poste Italiane** (`posteitaliane`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending `IT`; Poste's domestic numbers need `?carrier=posteitaliane`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `posteitaliane` | | **Brand & service aliases** | Poste Italiane, Poste.it, Poste Delivery Business, Raccomandata, Pacco Ordinario | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=NUMBER1,NUMBER2` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | 2 letters, 9 digits, `IT` | UPU S10 mod-11 | `2IMA0051035900` | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=posteitaliane`)** | Domestic Raccomandata and parcel numbers | — | — | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/2IMA0051035900?carrier=posteitaliane" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/2IMA0051035900?carrier=posteitaliane", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "2IMA0051035900" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "posteitaliane", "trackingNumber": "2IMA0051035900", "status": "in_transit", "statusDescription": "In transito", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-21T08:15:00Z", "localTime": "2026-10-21T10:15:00", "status": "in_transit", "description": "In transito", "location": "Milano Roserio", "code": null } ] } ``` ## Notes - Scan wording is Italian, as Poste prints it. Times are read as Italian local time (`Europe/Rome`). - Poste searches by age window; the lookup tries the 0-2, 3-4 and 4-6 month windows before answering `not_found`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # PostEx Tracking API & MCP URL: https://docs.lastscanned.com/carriers/postex Query live **PostEx** (`postex`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `postex` | | **Brand aliases** | PostEx Pakistan, PostEx.pk, PostEx Courier | | **Category** | Pakistani domestic courier (cash on delivery) | | **Region** | Pakistan | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=25488300076953,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | PostEx numbers are 14 digits, a shape other carriers use, so pass `?carrier=postex`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/25488300076953?carrier=postex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "postex", "trackingNumber": "25488300076953", "status": "delivered", "statusDescription": "Delivered to Customer", "service": null, "deliveredAt": "2026-03-02T17:20:03Z", "deliveredAtLocal": "2026-03-02T22:20:03", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-02T17:20:03Z", "localTime": "2026-03-02T22:20:03", "status": "delivered", "description": "Delivered to Customer", "location": null, "code": "0005" }, { "timestamp": "2026-03-02T07:57:58Z", "localTime": "2026-03-02T12:57:58", "status": "out_for_delivery", "description": "Enroute for Delivery", "location": null, "code": "0004" }, { "timestamp": "2026-02-28T06:14:04Z", "localTime": "2026-02-28T11:14:04", "status": "label_created", "description": "At Example Store Warehouse", "location": null, "code": "0001" } ] } ``` ## Notes - **Time zone**: PostEx sends ISO times with a `+0500` offset (Pakistan), so `timestamp` is exact. - **Privacy**: the reply also names the consignee; the adapter does not pass that on. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Post Haste Tracking API & MCP URL: https://docs.lastscanned.com/carriers/posthaste Query live **Post Haste** (`posthaste`) package status and scan history in a single synchronous `GET` request or MCP tool call. Post Haste is part of the Freightways group in New Zealand. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `posthaste` | | **Brand aliases** | Post Haste, Posthaste, Freightways | | **Category** | Regional courier (New Zealand) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=posthaste` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=posthaste` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Post Haste tickets, charge labels and consignment numbers share shapes with other carriers and with the other Freightways brands, so there is no auto-detection: always pass `?carrier=posthaste`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/XL00325000?carrier=posthaste" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "posthaste", "trackingNumber": "XL00325000", "status": "in_transit", "statusDescription": "We've picked up your parcel", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-10-21T01:00:17Z", "localTime": "2026-10-21T14:00:17", "status": "in_transit", "description": "Picked Up", "location": "Whanganui, Whanganui District", "code": "P" }, { "timestamp": "2026-10-20T22:30:00Z", "localTime": "2026-10-21T11:30:00", "status": "label_created", "description": "Label Created", "location": "Penrose, Auckland", "code": "P" } ] } ``` ## Notes - **Time zone**: the carrier sends scan times in UTC; `timestamp` keeps them and `localTime` is the same moment on the New Zealand clock (`Pacific/Auckland`). - **Networks**: NZ Couriers, Post Haste and Castle Parcels are Freightways brands that answer from one tracking service. Each network only knows its own consignments, so use the carrier slug of the brand that sent the parcel. - **Number shapes**: a courier ticket or pack is a product code and a number (`AB XL00325000`, the space or hyphen is kept). Anything else is searched as typed, without leading zeros. Customer-printed labels that need the sender's account number as well are not supported. - **Errors**: a number the network does not know is `not_found`. A short query (under 6 characters) is also `not_found`, and a query that matches several consignments is a `carrier_error` asking for a longer number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Posti (Finland) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/posti Query live **Posti** (`posti`) item status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending `FI` and returns a normalized `TrackingResult` JSON payload, without an OmaPosti login. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `posti` | | **Brand & service aliases** | Posti, Posti Finland, Itella, OmaPosti, Smartposti | | **Category** | Finnish national post and parcel network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=JJFI61706620145567903,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Posti - **No OmaPosti account**: the posti.fi tracking page asks Posti's auth service for an anonymous session and then queries its GraphQL API. `lastscanned` does the same and returns JSON from one `fetch()`. - **Package-level scans**: when a shipment holds several parcels, the scans of the parcel you asked for are returned. - **Reasons kept**: when Posti gives a reason for an event (for example a failed delivery attempt), it is appended to the description. ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=posti`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}FI$/` with a valid UPU S10 check digit | S10 mod 11 | `JJFI61706620145567903` | | **Pass 2 (`mayMatch`)** | `/^JJFI\d{14}$/` (Posti parcel number) | — | `JJFI61706620145567903` | | **Explicit (`?carrier=posti`)** | Any other number Posti tracks | — | — | ### When is `?carrier=posti` optional vs required? - **Optional (auto-detected)**: S10 numbers ending `FI` with a valid check digit (Pass 1) and `JJFI` + 14 digits when no other carrier claims them (Pass 2). - **Required**: any other Posti number. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/JJFI61706620145567903?carrier=posti" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/JJFI61706620145567903?carrier=posti", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "JJFI61706620145567903" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "posti", "trackingNumber": "JJFI61706620145567903", "status": "in_transit", "statusDescription": "Item is on its way to the destination country", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-25T10:12:00Z", "localTime": "2026-10-25T10:12:00", "status": "in_transit", "description": "Item is on its way to the destination country", "location": "Vantaa", "code": null }, { "timestamp": "2026-10-24T07:30:00Z", "localTime": "2026-10-24T07:30:00", "status": "in_transit", "description": "Item has been processed in the sorting centre", "location": "Helsinki", "code": null }, { "timestamp": "2026-10-23T12:05:00Z", "localTime": "2026-10-23T12:05:00", "status": "in_transit", "description": "Item has been received by Posti", "location": "Helsinki", "code": null } ] } ``` > **Times and codes**: Posti's events carry an ISO time and a city but no event code, so `code` is `null`. `timestamp` is set when the ISO time includes an offset. Descriptions are requested in English. > **No record**: a number Posti has no record of returns `not_found`. ## Related Resources - **Live browser lookup tool**: [Track a Posti package live on lastscanned.com/lookup/posti](https://lastscanned.com/lookup/posti) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # POST Luxembourg Tracking API & MCP URL: https://docs.lastscanned.com/carriers/postluxembourg Track **POST Luxembourg** parcels and letters (UPU S10, `…LU`) with dated events. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `postluxembourg` | | **Brand aliases** | POST Luxembourg, POST Luxembourg, Post Luxembourg, LU Post, P&T Luxembourg | | **Category** | National postal operator (LU) | | **Source** | POST Luxembourg track-and-trace API (`POST api.post.lu/services/trackandtrace-api/items`, batch of ids); the public client id from its tracking page | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CP107621231LU,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10 format with the `LU` suffix and a valid check digit | UPU S10 | `CP107621231LU` | | **Pass 2 (`mayMatch`)** | none | none | none | This shape belongs to POST Luxembourg alone, so `?carrier=postluxembourg` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CP107621231LU?carrier=postluxembourg" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "postluxembourg", "trackingNumber": "CP107621231LU", "status": "delivered", "statusDescription": "Final delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-15", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-15", "status": "delivered", "description": "Final delivery", "location": null, "code": "EMI" }, { "timestamp": null, "localTime": "2026-10-12", "status": "out_for_delivery", "description": "Item out for delivery", "location": null, "code": "EDG" }, { "timestamp": null, "localTime": "2026-10-06", "status": "in_transit", "description": "Entry into the postal network", "location": "Bureau de poste Esch", "code": "EMA" } ] } ``` ## Notes - **Dates only**: events carry a date with no time of day, so `localTime` is a date and `timestamp` is `null`. - **Batching**: numbers go to the API in one request. - **Scope**: the API also tracks S10 items from other posts that POST Luxembourg delivers; auto-detection claims only `…LU` numbers. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PostNet South Africa Tracking API & MCP URL: https://docs.lastscanned.com/carriers/postnet Query live **PostNet** (`postnet`) package status and scan history in a single synchronous `GET` request or MCP tool call. PostNet numbers are not auto-detected: PostNet hands parcels to several couriers, so the numbers have no single shape; pass `?carrier=postnet`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `postnet` | | **Brand & service aliases** | PostNet, PostNet South Africa (`postnet.co.za`) | | **Category** | South African franchise courier and parcel network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=postnet` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=34795277683,...&carrier=postnet` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for PostNet - **One lookup for the couriers PostNet uses**: the PostNet tracker asks DHL, Aramex, CIT, Sprint and Coastal in turn; `lastscanned` does the same and returns the first answer. - **No session handling on your side**: the tracker's one-off token and cookie are fetched for every lookup. ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=postnet`)** | Whatever number PostNet gave you | — | `34795277683` | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/34795277683?carrier=postnet" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/34795277683?carrier=postnet", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "34795277683", "carrier": "postnet" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "postnet", "trackingNumber": "34795277683", "status": "in_transit", "statusDescription": "Departed facility", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-25T14:05:00", "status": "in_transit", "description": "Departed facility", "location": "Johannesburg", "code": null }, { "timestamp": null, "localTime": "2026-10-24T09:12:00", "status": "in_transit", "description": "Arrived at facility", "location": "Cape Town", "code": null }, { "timestamp": null, "localTime": "2026-10-23T16:40:00", "status": "label_created", "description": "Shipment information received", "location": "Cape Town", "code": null } ] } ``` ## Notes - **Scan times** have no zone, so only `localTime` is set. - **Each lookup makes six requests** (the page, then one per courier), so it is slower than most carriers. ## Related Resources - **Live browser lookup tool**: [Track a PostNet package live on lastscanned.com/lookup/postnet](https://lastscanned.com/lookup/postnet) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # PostNL Tracking API & MCP URL: https://docs.lastscanned.com/carriers/postnl Query live **PostNL** (`postnl`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `3S` barcodes and UPU S10 numbers ending `NL`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `postnl` | | **Brand & service aliases** | PostNL, TNT Post, jouw.postnl.nl Track & Trace | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=NUMBER1,NUMBER2` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — PostNL barcode** | `3S` + 4 letters + 7 to 9 digits | — | `3STBDG061270842` | | **Pass 1 (`matches`) — UPU S10** | 2 letters, 9 digits, `NL` | UPU S10 mod-11 | `3STBDG061270842` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/3STBDG061270842?carrier=postnl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/3STBDG061270842?carrier=postnl", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "3STBDG061270842" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "postnl", "trackingNumber": "3STBDG061270842", "status": "in_transit", "statusDescription": "Parcel is being sorted", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "NL" }, "events": [ { "timestamp": "2026-10-24T11:20:00Z", "localTime": "2026-10-24T13:20:00", "status": "in_transit", "description": "Parcel is being sorted", "location": null, "code": null } ] } ``` ## Notes - The lookup uses the barcode with `NL` and no recipient postcode, which is what PostNL accepts without one; some parcels show fewer details that way. - A barcode PostNL has no record of comes back as `not_found`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # PostNord Tracking API & MCP URL: https://docs.lastscanned.com/carriers/postnord Query live **PostNord** (`postnord`) package status and scan history in a single synchronous `GET` request or MCP tool call. S10 numbers ending `SE` or `DK` auto-detect in Pass 1. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `postnord` | | **Category** | National post (Sweden, Denmark) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=00573132901903503247,00573132901903503247` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}(SE|DK)$/` with a valid S10 check digit | S10 mod 11 | `00573132901903503247` | | **Pass 2 (`mayMatch`)** | *None* | — | — | PostNord parcel barcodes (SSCC and similar) are shared with other carriers and need `?carrier=postnord`. PostNord repeats some scans every few minutes; `lastscanned` keeps the first of each. Scan times are UTC, and the local wall clock is derived for Sweden and Denmark. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/00573132901903503247?carrier=postnord" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "postnord", "trackingNumber": "00573132901903503247", "status": "in_transit", "statusDescription": "The shipment item has been delivered to a service point.", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-24T08:15:00Z", "localTime": "2026-10-24T10:15:00", "status": "in_transit", "description": "The shipment item has been delivered to a service point.", "location": "Borås, Sweden", "code": "1" } ] } ``` ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pósturinn Tracking API & MCP URL: https://docs.lastscanned.com/carriers/posturinn Query live **Pósturinn** (`posturinn`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `posturinn` | | **Brand aliases** | Posturinn, Iceland Post, Íslandspóstur, Postur.is | | **Category** | National post (Iceland) | | **Region** | Iceland | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CF085175606IS,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10 `..IS`, valid check digit | UPU S10 mod 11 | `CF085175606IS` | | **Pass 2 (`mayMatch`)** | none | none | none | S10 numbers ending in `IS` with a valid check digit auto-detect to Pósturinn. It also tracks foreign mail arriving in Iceland; pass `?carrier=posturinn` for those. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CF085175606IS?carrier=posturinn" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "posturinn", "trackingNumber": "CF085175606IS", "status": "delivered", "statusDescription": "Afhending bókuð", "service": null, "deliveredAt": "2026-02-17T12:04:50Z", "deliveredAtLocal": "2026-02-17T12:04:50", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-17T12:04:50Z", "localTime": "2026-02-17T12:04:50", "status": "delivered", "description": "Afhending bókuð", "location": "Póstbox Egilsstöðum", "code": null }, { "timestamp": "2026-02-17T09:17:37Z", "localTime": "2026-02-17T09:17:37", "status": "in_transit", "description": "Rafræn tilkynning (SMS eða tölvupóstur)", "location": "Póstbox Egilsstöðum", "code": null }, { "timestamp": "2026-02-16T10:58:26Z", "localTime": "2026-02-16T10:58:26", "status": "in_transit", "description": "Móttekið frá sendanda og verður sent áfram", "location": "Pósthús Síðumúla 3-5", "code": null } ] } ``` ## Notes - **Language**: the API answers Icelandic only; the wording is kept as sent and status is read from it. - **Time zone**: Iceland is UTC all year, which is what the `+00:00` times are. - **Unknown numbers**: Pósturinn answers an unknown number with an empty HTTP 204, reported as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PPL Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ppl Track **PPL** (Czech Republic) parcels with the delivery event timeline. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ppl` | | **Brand aliases** | PPL, PPL CZ, PPL Czech, ppl.cz | | **Category** | Regional parcels (CZ) | | **Source** | PPL tracking JSON (`POST api.dhl.com/ecs/ppl/webapi/TrackAndTrace/{number}`, the public key its tracking page sends) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=44600000027,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers look like other carriers' numbers, so pass `?carrier=ppl`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/44600000027?carrier=ppl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ppl", "trackingNumber": "44600000027", "status": "delivered", "statusDescription": "We have delivered the shipment to the recipient", "service": null, "deliveredAt": "2026-07-28T12:09:24Z", "deliveredAtLocal": "2026-07-28T14:09:24", "signedBy": null, "destination": { "city": "Liberec", "state": null, "country": "CZ" }, "message": "Pick-up point: PPL Parcelbox 100", "events": [ { "timestamp": "2026-07-28T12:09:24Z", "localTime": "2026-07-28T14:09:24", "status": "delivered", "description": "We have delivered the shipment to the recipient", "location": null, "code": "Delivered" }, { "timestamp": "2026-07-28T04:34:43Z", "localTime": "2026-07-28T06:34:43", "status": "out_for_delivery", "description": "The shipment will be delivered today", "location": null, "code": "LoadingForDelivery" }, { "timestamp": "2026-07-27T07:17:27Z", "localTime": "2026-07-27T09:17:27", "status": "label_created", "description": "We are waiting for the shipment to be accepted for transport", "location": null, "code": "WaitingForShipment" } ] } ``` ## Notes - **Number format**: eleven-digit numbers are not unique to PPL, so pass `?carrier=ppl`. - **Pick-up points**: a parcel delivered to a PPL pick-up point shows `exception` (waiting for collection) until it is collected. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Precision Deliveries Tracking API & MCP URL: https://docs.lastscanned.com/carriers/precisiondeliveries Track **Precision Deliveries** (Canada, `ASL…`) parcels with scans and local times. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `precisiondeliveries` | | **Brand aliases** | Precision Deliveries, Precision, ASL, Precision Deliveries Canada | | **Category** | Regional last-mile parcels (CA) | | **Source** | Precision tracking JSON (`GET track.precisiondeliveries.com/api/shipment-itemId/{id}` after `POST /api/authentication` for a token cookie) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ASL0055543060,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^ASL\d{10}$/` | none | `ASL0055543060` | | **Pass 2 (`mayMatch`)** | none | none | none | This shape belongs to Precision Deliveries alone, so `?carrier=precisiondeliveries` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ASL0055543060?carrier=precisiondeliveries" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "precisiondeliveries", "trackingNumber": "ASL0055543060", "status": "delivered", "statusDescription": "Delivered - Mailroom/Mailbox", "service": "AMZ_FREIGHT", "deliveredAt": "2026-02-18T02:41:21Z", "deliveredAtLocal": "2026-02-17T21:41:21", "signedBy": null, "destination": { "city": "Laval", "state": "QC", "country": "CA" }, "events": [ { "timestamp": "2026-02-18T02:41:21Z", "localTime": "2026-02-17T21:41:21", "status": "delivered", "description": "Delivered - Mailroom/Mailbox", "location": null, "code": "AMZ_DELIVERY_D1_LX" }, { "timestamp": "2026-02-17T13:40:31Z", "localTime": "2026-02-17T08:40:31", "status": "out_for_delivery", "description": "Out for Delivery", "location": null, "code": "AMNS1" }, { "timestamp": "2026-02-17T10:01:42Z", "localTime": "2026-02-17T05:01:42", "status": "label_created", "description": "Manifest Scan", "location": null, "code": "1" } ] } ``` ## Notes - **Token**: the API hands out a one-hour cookie token from an unauthenticated POST; the adapter reuses it for 30 minutes. - **Time zone**: scan times are read in the destination province's zone. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pro Carrier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/procarrier Query live **Pro Carrier** (`procarrier`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `procarrier` | | **Brand aliases** | Pro Carrier Ltd, weareprocarrier, UBG | | **Category** | Cross-border e-commerce delivery (UK) | | **Region** | United Kingdom / Europe | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=UBG000623916,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^UBG\d{9}$/` | none | `UBG000623916` | | **Pass 2 (`mayMatch`)** | none | none | none | `UBG` plus nine digits belongs to Pro Carrier alone, so `?carrier=procarrier` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/UBG000623916?carrier=procarrier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "procarrier", "trackingNumber": "UBG000623916", "status": "delivered", "statusDescription": "parcel delivered in mailbox", "service": "PCPL", "deliveredAt": null, "deliveredAtLocal": "2026-02-14T14:24:00", "signedBy": null, "destination": { "city": "NANTES", "state": null, "country": "FR" }, "message": "Handed to Colis Privé as UBG000623916", "events": [ { "timestamp": null, "localTime": "2026-02-14T14:24:00", "status": "delivered", "description": "parcel delivered in mailbox", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-14T09:54:00", "status": "out_for_delivery", "description": "parcel out for delivery", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-12T10:20:26", "status": "in_transit", "description": "customs cleared", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-09T18:05:49", "status": "label_created", "description": "pre-advice received", "location": null, "code": null } ] } ``` ## Notes - **Response time**: Pro Carrier's tracking endpoint may take up to 10 to 15 seconds on uncached lookups. - **Handoff**: the page's *Track your delivery on partner site* button names the last-mile carrier and its number; `message` carries them. - **Time zone**: scan times carry no zone (the parcel crosses countries), so only `localTime` is given. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ProShips Tracking API & MCP URL: https://docs.lastscanned.com/carriers/proships Track **ProShips** (Colombia) cross-border shipments with the Spanish status history. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `proships` | | **Brand aliases** | ProShips, Proships Colombia, proships.com | | **Category** | Cross-border e-commerce parcels (CO) | | **Source** | ProShips tracking page (`GET proships.com/tracking/?tracking=`, rendered into the page; through a browser when AWS WAF challenges) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ML267690798MH,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^ML\d{9}MH$/` | none | `ML267690798MH` | The shape is only a last-resort guess, so pass `?carrier=proships` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ML267690798MH?carrier=proships" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "proships", "trackingNumber": "ML267690798MH", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-08-22T12:26:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-08-22T12:26:00", "status": "delivered", "description": "Entregado", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-08-22T10:06:00", "status": "out_for_delivery", "description": "SALIDA DE MANIFIESTO En manos del cartero", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-08-21T03:10:00", "status": "in_transit", "description": "Recepción en aduana", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-08-05T03:31:00", "status": "label_created", "description": "Orden generada", "location": null, "code": null } ] } ``` ## Notes - **Nonce**: the page embeds a WordPress nonce that the lookup call needs; the adapter reads it first on each lookup. - **Time zone**: no zone is printed, so only `localTime` is set. - **Auto-detection**: the shape is only a last-resort guess (`mayMatch`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PTS Worldwide Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ptsexpress Query live **PTS Worldwide Express** (`ptsexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ptsexpress` | | **Brand aliases** | PTS, PTS Worldwide, PTS Express, pts.net | | **Category** | Turkish cross-border express | | **Region** | Turkey | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2276314169,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | PTS numbers are ten digits, a shape other carriers use, so pass `?carrier=ptsexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2276314169?carrier=ptsexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ptsexpress", "trackingNumber": "2276314169", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-02-13T11:20:00Z", "deliveredAtLocal": "2026-02-13T11:20:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": "Handed to UPS EXPEDITED as 2276314169", "events": [ { "timestamp": "2026-02-13T11:20:00Z", "localTime": "2026-02-13T11:20:00", "status": "delivered", "description": "Delivered", "location": null, "code": "999" }, { "timestamp": "2026-02-12T08:05:00Z", "localTime": "2026-02-12T08:05:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": null, "code": "300" }, { "timestamp": "2026-02-09T06:37:00Z", "localTime": "2026-02-09T06:37:00", "status": "label_created", "description": "Shipment Data Received", "location": "ISTANBUL-TURKEY", "code": "004" } ] } ``` ## Notes - **Handoff**: once PTS passes the parcel to a last-mile carrier (UPS, Cainiao, ...), `message` names it and its number. Pass that number to `GET /v1/track/{number}` for the carrier's own scans. - **Time zone**: PTS prints scan times with a `+00:00` offset. `timestamp` is that instant; `localTime` is the printed clock time. Many scans carry no place (`location` is `null`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Pullman Cargo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pullmancargo Track **Pullman Cargo** (Chile) ODT numbers with UTC scans. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pullmancargo` | | **Brand aliases** | Pullman Cargo, Pullman, Pullman Bus Cargo, pullmancargo.cl | | **Category** | Regional parcels and cargo (CL) | | **Source** | Pullman Cargo SvelteKit data endpoint (`GET pullmancargo.cl/seguimiento/{odt}/__data.json`) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=00300168610,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers look like other carriers' numbers, so pass `?carrier=pullmancargo`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/00300168610?carrier=pullmancargo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "pullmancargo", "trackingNumber": "00300168610", "status": "delivered", "statusDescription": "Encomienda entregada", "service": null, "deliveredAt": "2022-04-23T14:40:07Z", "deliveredAtLocal": "2022-04-23T14:40:07", "signedBy": null, "destination": { "city": "VALPARAISO", "state": null, "country": "CL" }, "events": [ { "timestamp": "2022-04-23T14:40:07Z", "localTime": "2022-04-23T14:40:07", "status": "delivered", "description": "Encomienda entregada", "location": "QUILLOTA CENTRO DISTRIBUCION", "code": null }, { "timestamp": "2022-04-23T09:02:17Z", "localTime": "2022-04-23T09:02:17", "status": "out_for_delivery", "description": "En reparto", "location": "QUILLOTA CENTRO DISTRIBUCION", "code": null }, { "timestamp": "2022-04-13T14:13:03Z", "localTime": "2022-04-13T14:13:03", "status": "label_created", "description": "Venta Creada", "location": "ANTOFAGASTA CENTRO DISTRIBUCION", "code": null } ] } ``` ## Notes - **Number format**: ODTs are plain digits shared with other shapes, so pass `?carrier=pullmancargo`; keep any leading zeroes. - **Time zone**: Pullman sends UTC, so `localTime` is the UTC clock time. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Purolator Tracking API & MCP URL: https://docs.lastscanned.com/carriers/purolator Query live **Purolator** (`purolator`) package status and scan history across Canada and the US in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 12-character alphanumeric Purolator PINs (`3 letters + 9 digits`) in Pass 2 (`mayMatch`) and tracks 12-digit numeric PINs with `?carrier=purolator`, returning a normalized `TrackingResult` JSON payload—without requiring a Purolator E-Ship Web Services production key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `purolator` | | **Brand & service aliases** | Purolator, Purolator Courier, Purolator Express, Purolator Ground | | **Category** | Canadian national courier & freight network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=PQR...,EWN...` (up to 25 Purolator numbers per batch; up to 100 total numbers) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Purolator instead of direct requests - **Skip Purolator E-Ship SOAP/REST certification & WAF rejections**: Purolator's official E-Ship developer portal requires registering a billing account, requesting development keys, and completing formal certification for production credentials, while unconfigured requests to `public-tracking.purolator.com` are rejected by Purolator's WAF. `lastscanned` returns normalized JSON in a single `fetch()`. - **Automatic Canadian provincial timezone conversion**: Purolator prints scan times (`"2026-10-24 18:45:19"`) in the local clock of the scanning terminal without a UTC offset. `lastscanned` maps all 13 Canadian provinces and territories (`BC` → `America/Vancouver`, `AB` → `America/Edmonton`, `SK` → `America/Regina`, `MB` → `America/Winnipeg`, `ON`/`QC` → `America/Toronto`, `NB` → `America/Moncton`, `NS`/`PE` → `America/Halifax`, `NL` → `America/St_Johns`, `YT`/`NT`/`NU`) to compute accurate UTC `timestamp` values alongside `localTime`. - **Full event history per parcel**: Multi-number searches on Purolator's portal only return summary statuses; `lastscanned` fetches the full scan-by-scan history for up to 25 PINs in parallel. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Purolator is evaluated **twenty-second (#22)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None (`false`)* | — | — | | **Pass 2 (`mayMatch`) — Alphanumeric PIN** | `/^[A-Z]{3}\d{9}$/i` (3 letters + 9 digits = 12 chars) | — | `PQR482019376`, `EWN001815469` | | **Explicit (`?carrier=purolator`) — 12-digit PIN** | `/^\d{12}$/` (12 digits — collides with [FedEx](https://docs.lastscanned.com/carriers/fedex) in Pass 1) | — | `520769802262`, `334918273645` | ### Why 12-digit Purolator PINs require `?carrier=purolator` - **Alphanumeric PINs (`PQR482019376`) auto-detect in Pass 2**: 3-letter + 9-digit Purolator PINs do not collide with any Pass 1 carrier (note that [Sendle](https://docs.lastscanned.com/carriers/sendle)'s `QSS` + 9 digits matches in Pass 1 before Pass 2 runs) and are routed to `purolator` automatically. - **12-digit numeric PINs (`520769802262`) require `?carrier=purolator`**: Because 12-digit numeric tracking numbers have no check digit and are also the primary format for [FedEx Express / Ground](https://docs.lastscanned.com/carriers/fedex), bare 12-digit numbers route to `fedex` by default. Always append `?carrier=purolator` (or pass `"carrier": "purolator"` in MCP) when tracking a 12-digit numeric Purolator PIN. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash # 3-letter + 9-digit PIN (auto-detected) curl -s "https://api.lastscanned.com/v1/track/PQR482019376?carrier=purolator" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" # 12-digit numeric PIN (pass ?carrier=purolator) curl -s "https://api.lastscanned.com/v1/track/PQR482019376?carrier=purolator" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/PQR482019376?carrier=purolator", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.destination, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "520769802262", "carrier": "purolator" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "purolator", "trackingNumber": "PQR482019376", "status": "delivered", "statusDescription": "Shipment delivered", "service": null, "deliveredAt": "2026-10-24T22:45:19Z", "deliveredAtLocal": "2026-10-24T18:45:19", "signedBy": null, "destination": { "city": "Etobicoke", "state": "ON", "country": "CA" }, "estimatedDelivery": null, "events": [ { "timestamp": "2026-10-24T22:45:19Z", "localTime": "2026-10-24T18:45:19", "status": "delivered", "description": "Shipment delivered", "location": "Etobicoke, ON", "code": "9500" }, { "timestamp": "2026-10-24T12:18:04Z", "localTime": "2026-10-24T08:18:04", "status": "out_for_delivery", "description": "On vehicle for delivery", "location": "Etobicoke, ON", "code": "4200" }, { "timestamp": "2026-10-24T07:52:30Z", "localTime": "2026-10-24T03:52:30", "status": "in_transit", "description": "Arrived at sort facility", "location": "Mississauga, ON", "code": "0300" }, { "timestamp": "2026-10-23T20:10:00Z", "localTime": "2026-10-23T16:10:00", "status": "label_created", "description": "Shipping label created with reference(s)", "location": "Toronto, ON", "code": "3000" } ] } ``` > **Raw status & scan codes**: `events[].code` preserves Purolator's 4-digit scan code (`"3000"`/`"3010"` label created, `"2380"` picked up, `"0300"`/`"1310"`/`"4060"`/`"7220"` arrived at sort facility, `"1300"`/`"7525"` departed sort facility, `"4200"` on vehicle for delivery, `"9260"` attempted delivery, `"6500"`/`"9230"` address correction required, `"9550"` held for pickup, `"9500"`/`"9000"` delivered), while package-level states (`SDR`, `POP`, `IND`, `INT`, `OFD`, `ATT`, `DEL`) normalize to the 7 standard statuses. ## Related Resources - **Live browser lookup tool**: [Track a Purolator package live on lastscanned.com/lookup/purolator](https://lastscanned.com/lookup/purolator) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # PY Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/pyexpress Query live **PY Express** (`pyexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. PY Express numbers share their shape with other carriers' numbers, so pass `?carrier=pyexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `pyexpress` | | **Brand aliases** | PY Express, 派优供应链 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=pyexpress` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=pyexpress` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | PY Express tracking numbers have no shape of their own, so always pass `?carrier=pyexpress`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to PY Express in one request. - **Platform**: PY Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # QFL Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/qfl Query live **QFL Express** (`qfl`) package status and scan history in a single synchronous `GET` request or MCP tool call. QFL Express numbers share their shape with other carriers' numbers, so pass `?carrier=qfl`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `qfl` | | **Brand aliases** | QFL Express, 清风速运 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=qfl` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=qfl` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | QFL Express tracking numbers have no shape of their own, so always pass `?carrier=qfl`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to QFL Express in one request. - **Platform**: QFL Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Quantium Solutions Tracking API & MCP URL: https://docs.lastscanned.com/carriers/quantium Query live **Quantium Solutions** (`quantium`) package status and scan history in a single synchronous `GET` request or MCP tool call. Quantium numbers share the S10 shape with Singapore Post, so pass `?carrier=quantium`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `quantium` | | **Brand aliases** | Quantium Solutions, Quantium Worldwide, Quantium | | **Category** | Cross-border e-commerce parcels (Singapore, Malaysia, Thailand, Australia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RQ726289734SG,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (the numbers look like S10 mail numbers, which Singapore Post also claims) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RQ726289734SG?carrier=quantium" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "quantium", "trackingNumber": "RQ726289734SG", "status": "delivered", "statusDescription": "Shipment delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-05-13T15:10:33", "signedBy": null, "destination": { "city": null, "state": "PENNSYLVANIA", "country": "United States" }, "message": "Handed to the last-mile partner as RQ726289734SG", "events": [ { "timestamp": null, "localTime": "2026-05-13T15:10:33", "status": "delivered", "description": "Shipment delivered", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-05-13T09:08:53", "status": "out_for_delivery", "description": "Shipment out for delivery", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-05-12T06:25:00", "status": "in_transit", "description": "In Transit", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-05-01T14:25:35", "status": "label_created", "description": "Shipment created", "location": null, "code": null } ] } ``` ## Notes - **Handoff**: `message` carries the co-loader (last-mile partner) number Quantium shows, for example `"Handed to the last-mile partner as RQ726289734SG"`. - **Time zone**: scan times are clock times with no zone, so `timestamp` is `null`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Quiqup Tracking API & MCP URL: https://docs.lastscanned.com/carriers/quiqup Track **Quiqup** (UAE) same-day orders with the state-change history. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `quiqup` | | **Brand aliases** | Quiqup, Quiqup UAE | | **Category** | Regional same-day delivery (AE) | | **Source** | Quiqup order tracking JSON (`GET ex-api.quiqup.com/order_management/tracking?order_id={number}`) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=24986507,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers look like other carriers' numbers, so pass `?carrier=quiqup`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/24986507?carrier=quiqup" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "quiqup", "trackingNumber": "24986507", "status": "delivered", "statusDescription": "Delivery complete", "service": "Partner same day", "deliveredAt": "2026-03-29T13:29:19Z", "deliveredAtLocal": "2026-03-29T17:29:19", "signedBy": null, "destination": { "city": null, "state": null, "country": "AE" }, "events": [ { "timestamp": "2026-03-29T13:29:19Z", "localTime": "2026-03-29T17:29:19", "status": "delivered", "description": "Delivery complete", "location": null, "code": "delivery_complete" }, { "timestamp": "2026-03-26T17:30:33Z", "localTime": "2026-03-26T21:30:33", "status": "exception", "description": "Delivery failed", "location": null, "code": "delivery_failed" }, { "timestamp": "2026-03-26T07:50:20Z", "localTime": "2026-03-26T11:50:20", "status": "label_created", "description": "Ready for collection", "location": null, "code": "ready_for_collection" } ] } ``` ## Notes - **Number format**: order numbers are plain digits, so pass `?carrier=quiqup`. Seven-digit orders are shorter than the 8-character minimum and always return `not_found`. - **Time zone**: each time carries the UAE offset. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Qwintry Tracking API & MCP URL: https://docs.lastscanned.com/carriers/qwintry Query live **Qwintry** (`qwintry`, US to Russia forwarder) status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `qwintry` | | **Brand aliases** | Qwintry Logistics | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^QR\d{8}$/` | none | `QR10142264` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to this carrier, so `?carrier=qwintry` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/QR10142264?carrier=qwintry" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "qwintry", "trackingNumber": "QR10142264", "status": "delivered", "statusDescription": "Shipment delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-05T16:38:13", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-05T16:38:13", "status": "delivered", "description": "Shipment delivered", "location": null, "code": "delivered" }, { "timestamp": null, "localTime": "2026-03-03T09:52:08", "status": "exception", "description": "Shipment is now in pickup point, go get it!", "location": null, "code": "pickup_point" }, { "timestamp": null, "localTime": "2026-02-26T19:04:22", "status": "label_created", "description": "Electronic info received", "location": null, "code": "info_received" } ] } ``` ## Notes - **Source**: Qwintry's public tracking page (server-rendered HTML). - **Time zone**: the page does not state one, so only `localTime` is set. - **Message**: while the parcel waits for a local courier, the page's courier notice is returned as `message`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # QYEXP Tracking API & MCP URL: https://docs.lastscanned.com/carriers/qyexp Query live **QYEXP** (`qyexp`) package status and scan history in a single synchronous `GET` request or MCP tool call. QYEXP numbers share their shape with other carriers' numbers, so pass `?carrier=qyexp`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `qyexp` | | **Brand aliases** | QYEXP, 前雨国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=qyexp` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=qyexp` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | QYEXP tracking numbers have no shape of their own, so always pass `?carrier=qyexp`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to QYEXP in one request. - **Platform**: QYEXP runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Qyun Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/qyun Query live **Qyun Express** (`qyun`) package status and scan history in a single synchronous `GET` request or MCP tool call. Qyun Express numbers share their shape with other carriers' numbers, so pass `?carrier=qyun`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `qyun` | | **Brand aliases** | Qyun Express, 青云物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=qyun` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=qyun` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Qyun Express tracking numbers have no shape of their own, so always pass `?carrier=qyun`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Qyun Express in one request. - **Platform**: Qyun Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Raben Tracking API & MCP URL: https://docs.lastscanned.com/carriers/raben Track **Raben Group** road freight consignments (DE, PL, NL, AT, IT, CZ) with per-scan time zones. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `raben` | | **Brand aliases** | Raben, Raben Group, MyRaben | | **Category** | Regional road freight (EU) | | **Source** | MyRaben (Mendix) anonymous session: `GET oftc.myraben.com/link/ShipmentInformation?ShipmentNumber={n}` for cookies, then `POST /xas/` `get_session_data` | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=276574000227500,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^276(?:574|634)\d{9}$/` | none | `276574000227500` | The shape is only a last-resort guess, so pass `?carrier=raben` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/276574000227500?carrier=raben" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "raben", "trackingNumber": "276574000227500", "status": "delivered", "statusDescription": "delivered", "service": "Raben Germany", "deliveredAt": "2026-10-27T13:53:00Z", "deliveredAtLocal": "2026-10-27T14:53:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-27T13:53:00Z", "localTime": "2026-10-27T14:53:00", "status": "delivered", "description": "delivered", "location": "Salzburg, Austria", "code": "E03" }, { "timestamp": "2026-10-27T11:02:00Z", "localTime": "2026-10-27T12:02:00", "status": "out_for_delivery", "description": "in delivery", "location": "Salzburg, Austria", "code": "E05" }, { "timestamp": "2026-10-22T14:31:00Z", "localTime": "2026-10-22T16:31:00", "status": "in_transit", "description": "loaded", "location": "Linz, Austria", "code": "E08" } ] } ``` ## Notes - **Session**: the lookup is two requests (a cookie-setting link, then the Mendix session data); events are read from the session state. - **Time zone**: scan times are UTC; `localTime` is converted using the scan's country. Scans with no country keep `timestamp` only. - **Shipment**: `estimatedDelivery` is set while the consignment is not delivered. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # RAM Hand-to-Hand Couriers Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ramh2h Track **RAM Hand-to-Hand Couriers** (South Africa) waybills with scans in South African time. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ramh2h` | | **Brand aliases** | RAM Hand-to-Hand Couriers, RAM, RAM Couriers, Ram Hand to Hand | | **Category** | Regional courier (ZA) | | **Source** | RAM tracking JSON (`GET www.ram.co.za/api/track/{waybill}`) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=K3081510,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^RAM\d{8}$/` | none | `K3081510` | | **Pass 2 (`mayMatch`)** | none | none | none | This shape belongs to RAM Hand-to-Hand Couriers alone, so `?carrier=ramh2h` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/K3081510?carrier=ramh2h" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ramh2h", "trackingNumber": "K3081510", "status": "delivered", "statusDescription": "POD CAPTURED IN Sandton, Johannesburg.", "service": null, "deliveredAt": "2022-03-30T08:54:00Z", "deliveredAtLocal": "2022-03-30T10:54:00", "signedBy": "A RECEIVER", "destination": null, "events": [ { "timestamp": "2022-03-30T17:42:00Z", "localTime": "2022-03-30T19:42:00", "status": "delivered", "description": "POD CAPTURED IN Sandton, Johannesburg.", "location": "Sandton, Johannesburg", "code": null }, { "timestamp": "2022-03-30T08:54:00Z", "localTime": "2022-03-30T10:54:00", "status": "delivered", "description": "DELIVERED, RECEIVED BY A RECEIVER.", "location": null, "code": null }, { "timestamp": "2022-03-30T05:18:00Z", "localTime": "2022-03-30T07:18:00", "status": "out_for_delivery", "description": "OUT FOR DELIVERY IN Sandton, Johannesburg.", "location": "Sandton, Johannesburg", "code": null }, { "timestamp": "2022-03-23T09:48:00Z", "localTime": "2022-03-23T11:48:00", "status": "label_created", "description": "CONSIGNED IN Client Site.", "location": "Client Site", "code": null } ] } ``` ## Notes - **Number format**: only `RAM` plus eight digits is auto-detected; short `K…` waybills need `?carrier=ramh2h`. - **Call log**: outgoing/incoming call, SMS and email notes in the waybill log are left out; only scans are returned. - **Time zone**: South Africa is one zone (Africa/Johannesburg). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Redur Tracking API & MCP URL: https://docs.lastscanned.com/carriers/redur Query live **Redur** (`redur`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `redur` | | **Brand aliases** | Redur Transporte, Redur Spain, redur.es | | **Category** | Iberian parcel and pallet network (Spain, Portugal) | | **Region** | Spain / Portugal | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=58525000077447,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Redur numbers are 14 digits, a shape other carriers use, so pass `?carrier=redur`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/58525000077447?carrier=redur" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "redur", "trackingNumber": "58525000077447", "status": "delivered", "statusDescription": "ENTREGA", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-15T10:05:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-15T10:05:00", "status": "delivered", "description": "ENTREGA", "location": "Madrid", "code": null }, { "timestamp": null, "localTime": "2026-03-15T08:18:00", "status": "out_for_delivery", "description": "SALIDA A REPARTO", "location": "Madrid", "code": null }, { "timestamp": null, "localTime": "2026-03-10T08:58:00", "status": "in_transit", "description": "CARGA CAMION T. INTERNACIONAL", "location": "Valencia", "code": null }, { "timestamp": null, "localTime": "2026-03-03T00:00:00", "status": "label_created", "description": "DOCUMENTACION", "location": "Valencia", "code": null } ] } ``` ## Notes - **Language**: Redur's wording is Spanish and is kept as sent. - **Time zone**: the page prints the depot's local clock for Spain or Portugal without a zone, so only `localTime` is given. - **Request**: the site's form is posted with an empty captcha field, which the server accepts. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # RedX Tracking API & MCP URL: https://docs.lastscanned.com/carriers/redx Query live **RedX** (`redx`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `redx` | | **Brand aliases** | REDX, Redx Bangladesh, RedX Courier | | **Category** | Bangladeshi domestic courier | | **Region** | Bangladesh | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=24A322FR13WRG7,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | RedX ids are 14 letters and digits in more than one layout, so pass `?carrier=redx`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/24A322FR13WRG7?carrier=redx" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "redx", "trackingNumber": "24A322FR13WRG7", "status": "delivered", "statusDescription": "Parcel is delivered successfully", "service": null, "deliveredAt": "2026-03-24T11:54:47Z", "deliveredAtLocal": "2026-03-24T11:54:47", "signedBy": null, "destination": { "city": null, "state": null, "country": "BD" }, "events": [ { "timestamp": "2026-03-24T11:54:47Z", "localTime": "2026-03-24T11:54:47", "status": "delivered", "description": "Parcel is delivered successfully", "location": null, "code": "agent-delivered" }, { "timestamp": "2026-03-24T05:16:21Z", "localTime": "2026-03-24T05:16:21", "status": "out_for_delivery", "description": "Parcel is on the way to delivery by a delivery agent", "location": null, "code": "dispatched-to-agent" }, { "timestamp": "2026-03-22T16:31:12Z", "localTime": "2026-03-22T16:31:12", "status": "label_created", "description": "Parcel is created successfully", "location": null, "code": "pickup-pending" } ] } ``` ## Notes - **Last character**: the service ignores the id's last character (a check letter), so a wrong final character still returns the parcel; an unknown id answers `isError: true`. - **Time zone**: events are UTC (`…Z`). - **Privacy**: agent names and phone numbers in the messages are replaced by "a delivery agent". *On Hold* scans are reported as `exception`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Relais Colis Tracking API & MCP URL: https://docs.lastscanned.com/carriers/relaiscolis Track **Relais Colis** (France, `CC…`) parcels with the pickup-network steps. Query live status, scan history and normalized fields in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `relaiscolis` | | **Brand aliases** | Relais Colis, Relais Colis France, relaiscolis.com | | **Category** | Regional pickup-point parcels (FR) | | **Source** | Relais Colis tracking form (`GET /colis/suivre` for the session and CSRF token, then `POST /colis/suivre`); server-rendered HTML | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CC109000006501,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^CC\d{10,14}$/` | none | `CC109000006501` | | **Pass 2 (`mayMatch`)** | none | none | none | This shape belongs to Relais Colis alone, so `?carrier=relaiscolis` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CC109000006501?carrier=relaiscolis" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "relaiscolis", "trackingNumber": "CC109000006501", "status": "in_transit", "statusDescription": "Colis en transit sur notre plateforme parisienne.", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-04-28T13:21:00Z", "localTime": "2026-04-28T15:21:00", "status": "in_transit", "description": "Colis en transit sur notre plateforme parisienne.", "location": null, "code": null }, { "timestamp": "2026-04-20T10:19:00Z", "localTime": "2026-04-20T12:19:00", "status": "in_transit", "description": "Votre colis est pris en charge par le Relais Colis", "location": null, "code": null }, { "timestamp": "2026-04-19T13:25:00Z", "localTime": "2026-04-19T15:25:00", "status": "label_created", "description": "Votre colis a été annoncé.", "location": null, "code": null } ] } ``` ## Notes - **Form token**: the lookup first loads the form to get a session cookie and CSRF token. - **Time zone**: dates are French wall clock, read as Europe/Paris. - **Wording**: French delivery, out-for-delivery and pickup-ready wordings are mapped; wording not seen yet falls back to `in_transit`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # R+L Carriers Tracking API & MCP URL: https://docs.lastscanned.com/carriers/rlcarriers Query live **R+L Carriers** (`rlcarriers`) package status and scan history in a single synchronous `GET` request or MCP tool call. R+L Carriers numbers have no shape that is theirs alone, so pass `?carrier=rlcarriers`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `rlcarriers` | | **Brand aliases** | R+L Carriers, R&L Carriers, RL Carriers, RLC, R and L Carriers | | **Category** | LTL freight (US) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=410603085,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/410603085?carrier=rlcarriers" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "rlcarriers", "trackingNumber": "410603085", "status": "delivered", "statusDescription": "Delivered", "service": "Standard Service", "deliveredAt": null, "deliveredAtLocal": "2026-10-09T15:05:00", "signedBy": null, "destination": { "city": "VIDALIA", "state": "GA", "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-10-09T15:05:00", "status": "delivered", "description": "Delivered", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-10-07T17:12:26", "status": "in_transit", "description": "Arrived at KENNESAW, GA", "location": "KENNESAW, GA", "code": null }, { "timestamp": null, "localTime": "2026-10-06T11:52:56", "status": "in_transit", "description": "Picked Up in LENEXA, KS", "location": "LENEXA, KS", "code": null } ] } ``` ## Notes - **Time zone**: the page prints each terminal's local clock without a zone, so only `localTime` is given. - **PRO format**: R+L names a PRO with a leading `I` (`410603085`); the form takes it without, and a leading `I` is dropped. Alphanumeric PROs (`410603085`, with or without the dash) work too. - **Auto-detection**: 9-digit PROs are shared with other LTL carriers, so pass `?carrier=rlcarriers`. The consignee's name and street are not returned, only the city and state. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Roadrunner Tracking API & MCP URL: https://docs.lastscanned.com/carriers/roadrunner Query live **Roadrunner** (`roadrunner`) package status and scan history in a single synchronous `GET` request or MCP tool call. Roadrunner numbers have no shape that is theirs alone, so pass `?carrier=roadrunner`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `roadrunner` | | **Brand aliases** | Roadrunner, Roadrunner Transportation, Roadrunner Freight, RRTS | | **Category** | LTL freight (US) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=449894385,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/449894385?carrier=roadrunner" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "roadrunner", "trackingNumber": "449894385", "status": "in_transit", "statusDescription": "Shipment was picked up", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "SAN ANTONIO", "state": "TX", "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-03-04T16:29:00", "status": "in_transit", "description": "Shipment was picked up", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-04T13:11:00", "status": "label_created", "description": "Pickup Request Received.", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: the page prints a local clock without a zone, so only `localTime` is given. - **PRO format**: nine digits; an eight-digit number gets a leading zero. An unknown or invalid PRO is answered `not_found`. - **Auto-detection**: 9-digit PROs are shared with other LTL carriers, so pass `?carrier=roadrunner`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # RPX Indonesia Tracking API & MCP URL: https://docs.lastscanned.com/carriers/rpxindonesia Query live **RPX Indonesia** (`rpxindonesia`) package status and scan history in a single synchronous `GET` request or MCP tool call. RPX Indonesia numbers have no shape that is theirs alone, so pass `?carrier=rpxindonesia`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `rpxindonesia` | | **Brand aliases** | RPX Indonesia, RPX, RPX Express, Repex | | **Category** | Domestic express and e-commerce parcels, Indonesia | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=700075011630,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/700075011630?carrier=rpxindonesia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "rpxindonesia", "trackingNumber": "700075011630", "status": "delivered", "statusDescription": "Shipment received by Consignee", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-08-11T20:30:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-08-11T20:30:00", "status": "delivered", "description": "Shipment received by Consignee", "location": "RPX Pondok Pinang", "code": "POD" }, { "timestamp": null, "localTime": "2026-08-08T23:50:00", "status": "in_transit", "description": "Departed from RPX Origin station", "location": "RPX Cikarang", "code": "SOP" }, { "timestamp": null, "localTime": "2026-08-01T17:26:00", "status": "label_created", "description": "Your order is still on packing process by Shipper/Seller", "location": null, "code": "WPU" } ] } ``` ## Notes - **Time zone**: scans have a date and a 12-hour time in Indonesian local time; Indonesia spans three zones and the scan does not say which, so only `localTime` is given. - **Not found**: an unknown number is an HTTP 400 `No data found`, answered as `not_found`. Other HTTP errors stay `carrier_error`. - **Auto-detection**: 12-digit numbers are shared with other carriers, so pass `?carrier=rpxindonesia`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Sagawa Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sagawa Query live **Sagawa Express** (`sagawa`) package status in a single synchronous `GET` request or MCP tool call. Sagawa's numbers are 10 or 12 digits, a shape other carriers share, so pass `?carrier=sagawa`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sagawa` | | **Brand aliases** | Sagawa Express, Sagawa, 佐川急便 | | **Category** | International (Japan) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=sagawa` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=sagawa` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Sagawa waybill numbers (お問い合せ送り状No.) are 10 or 12 digits, like FedEx and DHL numbers, so always pass `?carrier=sagawa`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/501775509605?carrier=sagawa" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sagawa", "trackingNumber": "501775509605", "status": "delivered", "statusDescription": "【配達完了】 お荷物のお届けが完了致しました。ご利用頂きありがとうございました。", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": null, "localTime": null, "status": "delivered", "description": "【配達完了】 お荷物のお届けが完了致しました。ご利用頂きありがとうございました。", "location": null, "code": "0051" } ] } ``` ## Notes - **Current state only**: Sagawa's open endpoint (the one its app widget uses) returns the latest state and its message, not the scan history or times. `events` holds that one state, with `timestamp` and `localTime` `null`. Sagawa's web page has the history, but it refuses automated requests. - **Status codes**: `code` is Sagawa's state code (`0051` is delivered); the other states are read from the 【label】 in the message. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Sagawa Global (SGX) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sagawaglobal Query live **Sagawa Global Express / SGX** (`sagawaglobal`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sagawaglobal` | | **Brand aliases** | Sagawa Global, SGX, Sagawa Global Express | | **Category** | Cross-border parcels (Japan) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^IDA\d{12}$/` | none | `357111471592` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | SGX air waybill (IDA + MMDDYYYY + 4 digits) | `^IDA\d{12}$` | | Sagawa domestic number (12 digits) | `^\d{12}$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=sagawaglobal`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/357111471592?carrier=sagawaglobal" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sagawaglobal", "trackingNumber": "357111471592", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-01-10T10:20:00Z", "deliveredAtLocal": "2026-01-10T19:20:00", "signedBy": null, "destination": null, "message": "Handed to Sagawa Express as 357111471592", "events": [ { "timestamp": "2026-01-10T10:20:00Z", "localTime": "2026-01-10T19:20:00", "status": "delivered", "description": "Delivered", "location": "NARITA, JAPAN", "code": null }, { "timestamp": "2026-01-09T09:26:00Z", "localTime": "2026-01-09T18:26:00", "status": "out_for_delivery", "description": "Out For Delivery", "location": "NARITA, JAPAN", "code": null }, { "timestamp": "2026-01-05T20:05:00Z", "localTime": "2026-01-05T12:05:00", "status": "in_transit", "description": "On Board Aircraft", "location": "LOS ANGELES,U.S.A", "code": null } ] } ``` ## Notes - **Handoff**: `message` names the domestic Sagawa number. Pass it to `GET /v1/track/{number}?carrier=sagawa` for Sagawa Express's own scans. - **Domestic number**: searching with the 12-digit local number follows SGX's one-row summary to its waybill. 12-digit numbers are shared with other carriers, so pass `?carrier=sagawaglobal`. - **Time zone**: scans in Japan are converted from `Asia/Tokyo` and scans in Los Angeles from `America/Los_Angeles`; other places keep local time only. `ABSENCE` scans are exceptions. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Saia Tracking API & MCP URL: https://docs.lastscanned.com/carriers/saia Query live **Saia** (`saia`) package status and scan history in a single synchronous `GET` request or MCP tool call. Saia numbers have no shape that is theirs alone, so pass `?carrier=saia`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `saia` | | **Brand aliases** | Saia, Saia LTL, Saia Motor Freight, Saia Inc | | **Category** | LTL freight (US) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=77136436530,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/77136436530?carrier=saia" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "saia", "trackingNumber": "77136436530", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-07-09T11:09:00", "signedBy": "J. Doe", "destination": { "city": "MIAMISBURG", "state": "OH", "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-07-09T11:09:00", "status": "delivered", "description": "Delivered", "location": "MIAMISBURG, OH", "code": null }, { "timestamp": null, "localTime": "2026-07-09T08:28:00", "status": "out_for_delivery", "description": "Dispatched for Delivery", "location": "Dayton, OH", "code": null }, { "timestamp": null, "localTime": "2026-07-06T16:13:00", "status": "in_transit", "description": "Depart from Customer Location", "location": "Houston, TX", "code": null } ] } ``` ## Notes - **WAF & CSRF handling**: Saia's tracking endpoint sits behind a WAF and requires an active CSRF session cookie; `lastscanned` handles session negotiation automatically. - **Time zone**: scans give a date and `hh:mm am/pm` in the terminal's zone, not stated, so only `localTime` is given. - **PRO format**: eleven digits (a twelfth is dropped). Auto-detection: PROs are shared with other LTL carriers, so pass `?carrier=saia`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Sailpost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sailpost Query live **Sailpost** (`sailpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. Sailpost numbers have no shape that is theirs alone, so pass `?carrier=sailpost`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sailpost` | | **Brand aliases** | Sailpost, Sailpost SpA, Sailpost Italy, Sailpost Viaggiante | | **Category** | Postal and parcel delivery, Italy | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=2119110250035103,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2119110250035103?carrier=sailpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sailpost", "trackingNumber": "2119110250035103", "status": "returned", "statusDescription": "Resa al Mittente", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "AOSTA", "state": "AO", "country": "IT" }, "events": [ { "timestamp": "2026-03-12T09:07:46Z", "localTime": "2026-03-12T10:07:46", "status": "returned", "description": "Resa al Mittente", "location": "SAILPOST SPA - CENTRO SERVIZI", "code": "901" }, { "timestamp": "2026-03-10T14:35:45Z", "localTime": "2026-03-10T15:35:45", "status": "returned", "description": "Inviata a Mittente", "location": "Mittente", "code": "912" }, { "timestamp": "2026-02-20T11:21:00Z", "localTime": "2026-02-20T12:21:00", "status": "exception", "description": "In Giacenza", "location": "DS MILANO 16", "code": "60" }, { "timestamp": "2026-02-19T14:34:46Z", "localTime": "2026-02-19T15:34:46", "status": "out_for_delivery", "description": "In Consegna", "location": "DS MILANO 16", "code": "20" } ] } ``` ## Notes - **Time zone**: each event has `DataUTC`, the scan instant; `localTime` is that instant in Rome time (`Europe/Rome`). - **Status**: Sailpost's state groups are mapped: delivered, in transit, held (`Giacenza`), out for delivery, problem. Anything naming `Mittente` (sender) is a return. - **Auto-detection**: numbers are digits and letters of 8 to 30 characters, too generic to claim, so pass `?carrier=sailpost`. Not found is an empty event list. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Sameday Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sameday Query live **Sameday** (`sameday`) AWBs in a single synchronous `GET` request or MCP tool call. `lastscanned` reads the public JSON that Sameday's tracker calls (`api.sameday.ro/api/public/awb/{awb}/awb-history`). ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sameday` | | **Category** | Romanian, Bulgarian and Hungarian courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=sameday` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1TMB2419700167,...&carrier=sameday` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP · Free tier (5 unique numbers/day) · Pro ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection Sameday AWB numbers have no check digit and share shapes with other carriers, so they are not auto-detected. Pass `?carrier=sameday`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1TMB2419700167?carrier=sameday" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sameday", "trackingNumber": "1TMB2419700167", "status": "in_transit", "statusDescription": "Colet in tranzit", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-26T09:12:00", "status": "in_transit", "description": "Colet in tranzit", "location": "Cluj", "code": "12" } ] } ``` ## Notes - Status wording is Sameday's own (Romanian). The status is taken from Sameday's `statusState` when present, otherwise from the wording. - Scan times have no zone attached (the API serves Romania, Bulgaria and Hungary), so only `localTime` is set. - Sameday's website sits behind a Cloudflare challenge; the API used here does not. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # South African Post Office Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sapo Query live **South African Post Office** (`sapo`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `ZA`. SAPO's tracker also follows S10 numbers from other posts that deliver in South Africa; pass `?carrier=sapo` for those. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sapo` | | **Brand aliases** | South African Post Office, SAPO, SA Post Office, Post Office ZA | | **Category** | National post (South Africa) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CN017750683ZA,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | Valid UPU S10 number ending `ZA` (check digit verified) | mod-11 (S10) | `CN017750683ZA` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CN017750683ZA?carrier=sapo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sapo", "trackingNumber": "CN017750683ZA", "status": "in_transit", "statusDescription": "Outgoing International", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-10T09:52:00Z", "localTime": "2026-02-10T11:52:00", "status": "in_transit", "description": "Outgoing International", "location": "JIMC D SUR, ECON, SAL PARCELS", "code": null }, { "timestamp": "2026-02-09T09:04:00Z", "localTime": "2026-02-09T11:04:00", "status": "in_transit", "description": "Receive item from customer (Otb)", "location": "JOHANNESBURG", "code": null } ] } ``` ## Notes - **Time zone**: scans are South African time (`Africa/Johannesburg`, UTC+2, no daylight saving). - **Foreign numbers**: the tracker accepts any origin's S10 number; the scans are the ones the South African Post Office recorded. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SAP Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sapxexpress Query live **SAP Express** (`sapxexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. SAP Express numbers have no shape that is theirs alone, so pass `?carrier=sapxexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sapxexpress` | | **Brand aliases** | SAP Express, SAPX, SAP Express Indonesia, Satria Antaran Prima, SAP Satria | | **Category** | Domestic express and cargo, Indonesia | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CGK8158354802046,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CGK8158354802046?carrier=sapxexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sapxexpress", "trackingNumber": "CGK8158354802046", "status": "delivered", "statusDescription": "Paket Telah Diterima", "service": "SATRIA ODS", "deliveredAt": null, "deliveredAtLocal": "2026-04-06T17:56:00", "signedBy": null, "destination": { "city": "Padang", "state": null, "country": "ID" }, "events": [ { "timestamp": null, "localTime": "2026-04-06T17:56:00", "status": "delivered", "description": "Paket Telah Diterima", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-04-04T11:55:00", "status": "out_for_delivery", "description": "Paket Diantar Kurir Satria", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-04-03T10:48:00", "status": "in_transit", "description": "Sampai di Kantor Cabang Padang", "location": "Padang", "code": null }, { "timestamp": null, "localTime": "2026-04-02T21:10:00", "status": "label_created", "description": "Verifikasi Paket", "location": "Kantor Pusat", "code": null } ] } ``` ## Notes - **Time zone**: step times are `dd Mon yyyy | hh:mm` with Indonesian month names (`Mei`, `Agu`, `Okt`, `Des`); Indonesia spans three zones and the page does not say which, so only `localTime` is given. - **Privacy**: courier and recipient names in a step's note are left out, including the `oleh ` in the delivery step. - **Auto-detection**: `CGK…` AWBs and similar are not unique to SAP Express, so pass `?carrier=sapxexpress`. A number the site does not know renders an empty page, answered `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SAT (Ukraine) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/satukraine Query live **SAT (Ukraine)** (`satukraine`) package status and scan history in a single synchronous `GET` request or MCP tool call. SAT (Ukraine) numbers have no shape that is theirs alone, so pass `?carrier=satukraine`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `satukraine` | | **Brand aliases** | SAT (Ukraine), SAT, SAT Ukraine, SAT Sat.ua, Servis Avto Trans | | **Category** | Domestic freight and parcels, Ukraine | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=009000119,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/009000119?carrier=satukraine" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "satukraine", "trackingNumber": "009000119", "status": "delivered", "statusDescription": "The cargo received by the receiver", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-12", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-02-12", "status": "delivered", "description": "The cargo received by the receiver", "location": "Lviv", "code": "ВыданПолучателю" }, { "timestamp": null, "localTime": "2026-02-10", "status": "in_transit", "description": "The cargo has arrived at the branch", "location": "Lviv", "code": "ПоступилНаСкладВыдачи" }, { "timestamp": null, "localTime": "2026-02-07", "status": "in_transit", "description": "The cargo received at the branch", "location": "Kyiv 1", "code": "Принят" } ] } ``` ## Notes - **Dates only**: SAT gives each state a date (`dd.mm.yyyy`) and no time of day, so `localTime` is a date and `timestamp` is `null`. - **Language**: the English wording is requested; some town names still come back in Ukrainian. `code` is SAT's own state key. - **Auto-detection**: 9-digit numbers are shared with other carriers, so pass `?carrier=satukraine`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Seino Transportation Tracking API & MCP URL: https://docs.lastscanned.com/carriers/seino Query live **Seino Transportation** (`seino`, Japan freight) status and scan history; up to ten numbers are answered in one upstream request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `seino` | | **Brand aliases** | Seino, 西濃運輸 | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Pass `?carrier=seino` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/9026242908?carrier=seino" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "seino", "trackingNumber": "9026242908", "status": "delivered", "statusDescription": "配達", "service": null, "deliveredAt": "2026-03-05T02:03:00Z", "deliveredAtLocal": "2026-03-05T11:03:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-05T02:03:00Z", "localTime": "2026-03-05T11:03:00", "status": "delivered", "description": "配達", "location": "東京", "code": null }, { "timestamp": "2026-03-05T00:51:00Z", "localTime": "2026-03-05T09:51:00", "status": "out_for_delivery", "description": "持出", "location": "東京", "code": null }, { "timestamp": "2026-03-01T03:38:00Z", "localTime": "2026-03-01T12:38:00", "status": "in_transit", "description": "受付", "location": "能登", "code": null } ] } ``` ## Notes - **Source**: Seino's public tracking page (Shift_JIS HTML). Ten digits (also written `123-456-7890`) is shared with other carriers, so use `?carrier=seino`. - **Time zone**: Japan keeps one zone (`Asia/Tokyo`). Seino prints only the day of the month, so the month and year are worked out from the acceptance date. - **Retention**: Seino drops numbers about two months after delivery (`not_found`). Descriptions are Seino's Japanese step names (受付 accepted, 発送 dispatched, 中継 relayed, 到着 arrived, 持出 out for delivery, 配達 delivered). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SEKO Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/seko Query live **SEKO Logistics** (`seko`) package status and scan history in a single synchronous `GET` request or MCP tool call. SEKO Logistics numbers have no shape that is theirs alone, so pass `?carrier=seko`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `seko` | | **Brand aliases** | SEKO Logistics, SEKO, MySEKO, SEKO Worldwide | | **Category** | Freight forwarding and parcel logistics (US, UK, Australia, New Zealand) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=TSE3402603,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/TSE3402603?carrier=seko" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "seko", "trackingNumber": "TSE3402603", "status": "delivered", "statusDescription": "Shipment Delivered", "service": "SEKO 3-5 Day", "deliveredAt": null, "deliveredAtLocal": "2026-05-18T11:06:00", "signedBy": "J. Smith", "destination": { "city": "SPRINGFIELD", "state": "OR", "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-05-18T11:06:00", "status": "delivered", "description": "Shipment Delivered", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-05-18T08:14:00", "status": "out_for_delivery", "description": "Shipment is Out for Delivery", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-05-16T17:00:00", "status": "in_transit", "description": "At Delivery Terminal", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-05-12T17:20:00", "status": "in_transit", "description": "At Pickup Terminal", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: milestone times are ISO wall-clock with no zone and the shipment can be in the US, UK, Australia or New Zealand, so only `localTime` is given. - **Booking references**: SEKO's service also looks shipments up by booking reference, so only a whole number with a run of seven digits is sent; shorter strings are answered `not_found` without calling SEKO. - **Auto-detection**: SEKO numbers are letters followed by digits, a shape other carriers share, so pass `?carrier=seko`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Sendex Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sendex Query live **Sendex** (`sendex`, Mexico) status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sendex` | | **Brand aliases** | Sendex by Coordi, Coordi Sendex | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Pass `?carrier=sendex` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/389408460019?carrier=sendex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sendex", "trackingNumber": "389408460019", "status": "delivered", "statusDescription": "ENTREGADO", "service": "REGULAR", "deliveredAt": null, "deliveredAtLocal": "2026-03-14T15:18:00", "signedBy": null, "destination": { "city": "Ejemplo", "state": "Nuevo León", "country": "MEXICO" }, "events": [ { "timestamp": null, "localTime": "2026-03-14T15:18:00", "status": "delivered", "description": "ENTREGADO", "location": "SUCURSAL EJEMPLO (SDX)", "code": null }, { "timestamp": null, "localTime": "2026-03-13T08:32:00", "status": "out_for_delivery", "description": "EN RUTA PARA ENTREGA", "location": "SUCURSAL EJEMPLO (SDX)", "code": null }, { "timestamp": null, "localTime": "2026-03-10T17:55:00", "status": "in_transit", "description": "EN TRÁNSITO", "location": "CENTRO EJEMPLO", "code": null } ] } ``` ## Notes - **Source**: Sendex's public tracking page (`sendex.coordi.com/rastreo`), server-rendered HTML. Twelve digits is a shape shared with other carriers, so use `?carrier=sendex`. - **Time zone**: Mexico spans several zones, so only `localTime` is set. - **Fields**: `signedBy` is the receiver's name when delivered; `service` is the service type. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Sending (Spain) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sending Query live **Sending** (`sending`) package status and scan history in a single synchronous `GET` request or MCP tool call. Sending numbers are 12 digits, a shape other carriers share, so pass `?carrier=sending`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sending` | | **Brand aliases** | Sending, Sending Spain, Sending Transporte Urgente | | **Category** | Parcel courier (Spain) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=782002722921,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/782002722921?carrier=sending" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sending", "trackingNumber": "782002722921", "status": "delivered", "statusDescription": "El envio ha sido entregado", "service": null, "deliveredAt": "2026-09-14T12:00:00Z", "deliveredAtLocal": "2026-09-14T14:00:00", "signedBy": null, "destination": { "city": "Granada", "state": null, "country": "ES" }, "events": [ { "timestamp": "2026-09-14T12:00:00Z", "localTime": "2026-09-14T14:00:00", "status": "delivered", "description": "El envio ha sido entregado", "location": "Granada", "code": null }, { "timestamp": "2026-09-14T11:59:00Z", "localTime": "2026-09-14T13:59:00", "status": "out_for_delivery", "description": "Tu envio esta en reparto", "location": "Granada", "code": null }, { "timestamp": "2026-09-10T17:36:00Z", "localTime": "2026-09-10T19:36:00", "status": "exception", "description": "Has sido ausente", "location": "Granada", "code": null }, { "timestamp": "2026-09-09T13:17:00Z", "localTime": "2026-09-09T15:17:00", "status": "in_transit", "description": "Mercancia recogida", "location": "Barcelona", "code": null } ] } ``` ## Notes - **Language**: descriptions are Spanish. **Time zone**: Spanish local time (`Europe/Madrid`). - **Session**: Sending's JSF app files the number in the visitor's session (a POST that redirects, then a GET), so a lookup is two requests sharing one cookie. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Sendle Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sendle Query live **Sendle** (`sendle`) package status and scan history across Australia in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects both 12-character `QSS…` tracking numbers and 8-character `QS…` order numbers in Pass 1 and returns a normalized `TrackingResult` JSON payload—without requiring a Sendle merchant ID or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sendle` | | **Brand & service aliases** | Sendle (`sendle.com`), `QSS…`, `QS…` | | **Category** | Australian small-business & e-commerce parcel courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=QSS...,QS...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Sendle instead of direct requests - **Works with Sendle's relaunched 2026 platform & SHA-256 proof-of-work gate**: Following Sendle's 2026 platform relaunch, legacy `api.sendle.com` / `track.sendle.com` endpoints and old `S`-prefixed references were retired, and public lookups now require solving a cryptographic SHA-256 proof-of-work challenge (`salt:nonce` zero-bit difficulty check) before returning parcel data. Calling `GET https://api.lastscanned.com/v1/track/QSS000284255?carrier=sendle` handles the entire lookup and returns normalized JSON in one `fetch()`. - **Tracks both `QSS` tracking numbers and `QS` order numbers**: Whether your customer pastes the 12-character `QSS000284255` parcel tracking number or the 8-character `QS416938` order reference, `lastscanned` auto-detects and tracks both in Pass 1. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Sendle is evaluated **thirtieth (#30)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — Tracking number (`QSS`)** | `/^QSS\d{9}$/i` (`QSS` + 9 digits = 12 chars) | — | `QSS000284255`, `QSS000284255` | | **Pass 1 (`matches`) — Order number (`QS`)** | `/^QS\d{6}$/i` (`QS` + 6 digits = 8 chars) | — | `QS416938`, `QSS000284255` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### Disambiguating Sendle (`QSS` + 9 digits) vs Purolator (3 letters + 9 digits) - **Zero collision with [Purolator](https://docs.lastscanned.com/carriers/purolator)**: Even though `QSS` + 9 digits has the shape `3 letters + 9 digits`, Sendle's `matches()` runs in **Pass 1**, whereas Purolator's `/^[A-Z]{3}\d{9}$/i` rule only runs in **Pass 2 (`mayMatch`)**. Therefore, `QSS000284255` always routes to `sendle` automatically. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/QSS000284255?carrier=sendle" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/QSS000284255?carrier=sendle", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.statusDescription, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "QSS000284255" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "sendle", "trackingNumber": "QSS000284255", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-25T03:16:56Z", "deliveredAtLocal": "2026-10-25T14:16:56", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-25T03:16:56Z", "localTime": "2026-10-25T14:16:56", "status": "delivered", "description": "Delivered: Parcel left in a safe place at front door", "location": null, "code": null }, { "timestamp": "2026-10-24T21:40:12Z", "localTime": "2026-10-25T08:40:12", "status": "out_for_delivery", "description": "Out for Delivery: With local courier for delivery today", "location": null, "code": null }, { "timestamp": "2026-10-23T06:15:00Z", "localTime": "2026-10-23T17:15:00", "status": "in_transit", "description": "Picked Up: Parcel collected from sender", "location": null, "code": null }, { "timestamp": "2026-10-22T23:05:10Z", "localTime": "2026-10-23T10:05:10", "status": "label_created", "description": "Order Created: Ready for pickup", "location": null, "code": null } ] } ``` ## Carrier-Specific Status & Integration Notes - **Australian Eastern (`Australia/Sydney`) timezone normalization**: Sendle timestamps are recorded in `Australia/Sydney` time without an explicit offset string. `lastscanned` preserves the local clock in `localTime` (`deliveredAtLocal`) and converts it to UTC in `timestamp` (`deliveredAt`). - **Status category mapping**: Sendle's `statusCategory` values map deterministically to normalized statuses (`received` / `label` → `label_created`, `transit` → `in_transit` or `out_for_delivery`, `delivered` → `delivered`, `returned` → `returned`, `cancelled` → `exception`). ## Related Resources - **Live browser lookup tool**: [Track a Sendle package live on lastscanned.com/lookup/sendle](https://lastscanned.com/lookup/sendle) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Serpost Tracking API & MCP URL: https://docs.lastscanned.com/carriers/serpost Query live **Serpost** (`serpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `serpost` | | **Brand aliases** | Serpost Peru, Servicios Postales del Perú, Correos del Perú | | **Category** | National post (Peru) | | **Region** | Peru | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RE104856140PE,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10 `..PE`, valid check digit | UPU S10 mod 11 | `RE104856140PE` | | **Pass 2 (`mayMatch`)** | none | none | none | S10 numbers ending in `PE` with a valid check digit auto-detect to Serpost. Serpost also tracks mail that arrives from other posts, but those numbers belong to their origin posts, so pass `?carrier=serpost` for them. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RE104856140PE?carrier=serpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "serpost", "trackingNumber": "RE104856140PE", "status": "delivered", "statusDescription": "ENVÍO ENTREGADO", "service": null, "deliveredAt": "2026-03-09T17:12:30Z", "deliveredAtLocal": "2026-03-09T12:12:30", "signedBy": null, "destination": { "city": null, "state": null, "country": "PE" }, "events": [ { "timestamp": "2026-03-09T17:12:30Z", "localTime": "2026-03-09T12:12:30", "status": "delivered", "description": "ENVÍO ENTREGADO", "location": null, "code": "5" }, { "timestamp": "2026-03-09T12:13:46Z", "localTime": "2026-03-09T07:13:46", "status": "out_for_delivery", "description": "ENVÍO EN PROCESO DE DISTRIBUCIÓN", "location": null, "code": "9" }, { "timestamp": "2026-03-02T14:30:00Z", "localTime": "2026-03-02T09:30:00", "status": "in_transit", "description": "ENVÍO ADMITIDO EN ADMINISTRACION POSTAL CUSCO", "location": "CUSCO", "code": "012" } ] } ``` ## Notes - **Language**: Serpost's wording is Spanish and is kept as sent. - **Check digit**: Serpost matches the *start* of what it is sent, so a number with a bad check digit can return a stranger's parcel. Numbers that fail the S10 check are answered `not_found` without a request. - **Time zone**: scan times are Peru time (`-05:00`, no daylight saving), printed month first (`03/09/2026` is 9 March). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Servientrega Tracking API & MCP URL: https://docs.lastscanned.com/carriers/servientrega Query live **Servientrega** (`servientrega`, Colombia) status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `servientrega` | | **Brand aliases** | Servientrega Colombia | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Pass `?carrier=servientrega` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/9182007473?carrier=servientrega" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "servientrega", "trackingNumber": "9182007473", "status": "delivered", "statusDescription": "Entrega verificada", "service": "Mercancia premier", "deliveredAt": "2026-03-14T15:54:00Z", "deliveredAtLocal": "2026-03-14T10:54:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-14T15:54:00Z", "localTime": "2026-03-14T10:54:00", "status": "delivered", "description": "Entrega verificada", "location": "Ejemplo (Valle)", "code": "11" }, { "timestamp": "2026-03-13T20:29:00Z", "localTime": "2026-03-13T15:29:00", "status": "out_for_delivery", "description": "Envio para entrega a domicilio", "location": "Ejemplo (Valle)", "code": "32" }, { "timestamp": "2026-03-10T19:30:00Z", "localTime": "2026-03-10T14:30:00", "status": "in_transit", "description": "Admision del envio en cds", "location": "Origen (Caldas)", "code": "2" } ] } ``` ## Notes - **Source**: the Servientrega tracking gateway (`apim-servientrega-prd.azure-api.net`), not the portal's iframe host. Nine or ten digits is shared with other carriers, so use `?carrier=servientrega`. - **Time zone**: Colombia keeps one zone, so times are converted from `America/Bogota`. - **Fields**: `service` is the product type; `signedBy` is the signer when given. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SEUR Tracking API & MCP URL: https://docs.lastscanned.com/carriers/seur Query live **SEUR** (`seur`) shipment status and scan history in a single synchronous `GET` request or MCP tool call. SEUR's tracking numbers share their shapes with other carriers, so pass `?carrier=seur`. The result is a normalized `TrackingResult` JSON payload, without a miSEUR login. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `seur` | | **Brand & service aliases** | SEUR, SEUR Predict, SEUR Frío, miSEUR | | **Category** | Spanish express parcel carrier (DPDgroup) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=48285234834793,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for SEUR - **No miSEUR login**: SEUR's own app (`seur.com/miseur`) looks a number up through a public endpoint with the number alone. `lastscanned` uses that endpoint and returns normalized JSON. - **Grouped statuses mapped**: SEUR groups its scans (delivered groups `1` and `7`, incident group `6`); those and the Spanish or English scan wording map to the 7 standard statuses. - **Scan codes kept**: `events[].code` holds SEUR's `cod_situacion`. ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=seur`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=seur`)** | SEUR shipment numbers | — | `48285234834793` | ### When is `?carrier=seur` required? - **Always**: SEUR's numbers have no check digit and overlap other carriers' shapes (12 and 15 digits go to [FedEx](https://docs.lastscanned.com/carriers/fedex)), so auto-detection never claims them. UPU S10 numbers ending `ES` go to [Correos](https://docs.lastscanned.com/carriers/correos). ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/48285234834793?carrier=seur" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/48285234834793?carrier=seur", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "48285234834793", "carrier": "seur" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "seur", "trackingNumber": "48285234834793", "status": "in_transit", "statusDescription": "In transit to the destination delegation", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-26T09:40:00", "status": "in_transit", "description": "In transit to the destination delegation", "location": null, "code": "LL001" }, { "timestamp": null, "localTime": "2026-10-25T18:10:00", "status": "in_transit", "description": "Shipment sorted at the origin platform", "location": null, "code": "LL002" }, { "timestamp": null, "localTime": "2026-10-25T11:00:00", "status": "label_created", "description": "Shipment data received", "location": null, "code": "LL000" } ] } ``` > **Times**: Spain spans two time zones (the Canary Islands), so `timestamp` is always `null` and `localTime` is SEUR's clock reading. **No record**: a number SEUR has no record of returns `not_found`. ## Related Resources - **Live browser lookup tool**: [Track a SEUR package live on lastscanned.com/lookup/seur](https://lastscanned.com/lookup/seur) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # SFC (Sendfromchina) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sfc Query live **SFC (Sendfromchina)** (`sfc`) package status and scan history in a single synchronous `GET` request or MCP tool call. SFC is a Shenzhen cross-border forwarder; the lookup takes its order code or the last-mile tracking number. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sfc` | | **Brand aliases** | SFC, Sendfromchina, SendFromChina.com | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=sfc` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=sfc` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | SFC order codes and the last-mile numbers they travel under use shapes other carriers also use, so always pass `?carrier=sfc`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SFCAA0121278784YQ?carrier=sfc" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sfc", "trackingNumber": "SFCAA0121278784YQ", "status": "in_transit", "statusDescription": "Departed SFC warehouse", "service": "SFC Priority", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "United States" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-21T09:12:00", "status": "in_transit", "description": "Departed SFC warehouse", "location": "Shenzhen", "code": null }, { "timestamp": null, "localTime": "2026-10-20T16:40:00", "status": "in_transit", "description": "SFC received the parcel", "location": "Shenzhen", "code": null } ] } ``` ## Notes - **Time zone**: scan times come with no zone, so `localTime` is the carrier's clock time and `timestamp` is `null`. - **Hand-off**: when SFC passes the parcel to a last-mile carrier under another number, `message` says `Handed to as `. - **Status**: SFC groups parcels as in transit, long transit, delivered, returned, arrived for pickup, received by SFC or left the SFC warehouse; the first four decide `delivered`, `returned` and `exception` (waiting for pickup), the rest map to `in_transit` unless the newest scan says otherwise. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Shadowfax Tracking API & MCP URL: https://docs.lastscanned.com/carriers/shadowfax Query live **Shadowfax** (`shadowfax`) package status and scan history in a single synchronous `GET` request or MCP tool call. Shadowfax is an Indian e-commerce courier; lookups use the same JSON its tracker page calls. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `shadowfax` | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=shadowfax` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=N1,N2&carrier=shadowfax` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Examples | |---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | | **Explicit (`?carrier=shadowfax`)** | Shadowfax AWB (format varies) | `SF1904798183E` | This shape is shared with other carriers, so always pass `?carrier=shadowfax`. Scan times are Indian Standard Time (`Asia/Kolkata`). ## Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SF1904798183E?carrier=shadowfax" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "shadowfax", "trackingNumber": "SF1904798183E", "status": "in_transit", "statusDescription": "In transit", "service": null, "deliveredAt": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-25T14:22:00", "status": "in_transit", "description": "In transit", "location": "Hub", "code": null } ] } ``` ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Shang Fang International Tracking API & MCP URL: https://docs.lastscanned.com/carriers/shangfang Query live **Shang Fang International** (`shangfang`) package status and scan history in a single synchronous `GET` request or MCP tool call. Shang Fang International numbers share their shape with other carriers' numbers, so pass `?carrier=shangfang`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `shangfang` | | **Brand aliases** | Shang Fang International, 尚方国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=shangfang` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=shangfang` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Shang Fang International tracking numbers have no shape of their own, so always pass `?carrier=shangfang`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Shang Fang International in one request. - **Platform**: Shang Fang International runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Shipa Delivery Tracking API & MCP URL: https://docs.lastscanned.com/carriers/shipa Query live **Shipa** (`shipa`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `SD` + 9 digits. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `shipa` | | **Brand aliases** | Shipa, Shipa Delivery, Shipa UAE | | **Category** | Last-mile courier (UAE, Saudi Arabia, Kuwait) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SD024457139,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SD\d{9}$/` | none | `SD024457139` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SD024457139?carrier=shipa" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "shipa", "trackingNumber": "SD024457139", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-02-10T04:13:06Z", "deliveredAtLocal": "2026-02-10T08:13:06", "signedBy": null, "destination": { "city": null, "state": null, "country": "AE" }, "events": [ { "timestamp": "2026-02-10T04:13:06Z", "localTime": "2026-02-10T08:13:06", "status": "delivered", "description": "Delivered", "location": "Dubai", "code": "19" }, { "timestamp": "2026-02-09T14:43:35Z", "localTime": "2026-02-09T18:43:35", "status": "exception", "description": "Delivery Failed: Address - Customer changed location", "location": "Dubai", "code": "20" }, { "timestamp": "2026-02-09T04:07:49Z", "localTime": "2026-02-09T08:07:49", "status": "out_for_delivery", "description": "Out For Delivery", "location": "Dubai", "code": "16" }, { "timestamp": "2026-01-31T06:32:38Z", "localTime": null, "status": "label_created", "description": "Order Created", "location": null, "code": "1" } ] } ``` ## Notes - **Time zone**: Shipa sends UTC instants. `localTime` uses the destination country's offset (UAE +04:00, Saudi Arabia and Kuwait +03:00); the `Order Created` scan is stamped at the origin, so it has `timestamp` only. - **Unknown numbers**: a number with an empty order story is reported as not found. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ShipEntegra Tracking API & MCP URL: https://docs.lastscanned.com/carriers/shipentegra Query live **ShipEntegra** (`shipentegra`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `shipentegra` | | **Brand aliases** | Ship Entegra, ShipEntegra Tracking, 1SE | | **Category** | Turkish cross-border e-commerce shipping | | **Region** | Turkey | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1SE588480146,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^1SE\d{9}$/` | none | `1SE588480146` | | **Pass 2 (`mayMatch`)** | none | none | none | `1SE` plus nine digits belongs to ShipEntegra alone, so `?carrier=shipentegra` is optional. The bare nine digits (`1SE588480146`) are a shape other carriers use; pass `?carrier=shipentegra` for them. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1SE588480146?carrier=shipentegra" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "shipentegra", "trackingNumber": "1SE588480146", "status": "delivered", "statusDescription": "Package has been delivered.", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-20T07:17:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "AE" }, "message": "Handed to widect as AJA100005814241", "events": [ { "timestamp": null, "localTime": "2026-02-20T07:17:00", "status": "delivered", "description": "Package has been delivered.", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-19T08:19:00", "status": "out_for_delivery", "description": "Package is out for delivery.", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-14T03:49:00", "status": "in_transit", "description": "Shipment arrived to destination facility.", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-02-11T09:18:00", "status": "label_created", "description": "ShipEntegra Currently Awaiting Shipment and Tracking Will Be Updated When Received", "location": null, "code": null } ] } ``` ## Notes - **Prefix**: the service refuses the `1SE` printed on labels (HTTP 400), so the adapter sends the nine digits alone. - **Handoff**: `last_mile_carrier` and `last_mile_tracking_number` become `message`; `SE` (ShipEntegra itself) gives none. - **Time zone**: activity times carry no zone, so only `localTime` is given. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Shree Anjani Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/shreeanjani Query live **Shree Anjani Courier** (`shreeanjani`) package status and scan history in a single synchronous `GET` request or MCP tool call. Shree Anjani Courier numbers have no shape that is theirs alone, so pass `?carrier=shreeanjani`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `shreeanjani` | | **Brand aliases** | Shree Anjani Courier, Shree Anjani, Anjani Courier, Shree Anjani Courier India | | **Category** | Domestic courier (India) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1734480435,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1734480435?carrier=shreeanjani" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "shreeanjani", "trackingNumber": "1734480435", "status": "delivered", "statusDescription": "DELIVERED ON 14/3/2026", "service": null, "deliveredAt": "2026-03-14T07:38:55Z", "deliveredAtLocal": "2026-03-14T13:08:55", "signedBy": null, "destination": { "city": "MUMBAI", "state": null, "country": "IN" }, "events": [ { "timestamp": "2026-03-14T07:38:55Z", "localTime": "2026-03-14T13:08:55", "status": "delivered", "description": "Delivered", "location": "BHANDUP(W)", "code": null }, { "timestamp": "2026-03-13T06:53:26Z", "localTime": "2026-03-13T12:23:26", "status": "in_transit", "description": "Out To ANDHERI R.O. From MAHAPE R.O.", "location": "MAHAPE R.O.", "code": "OUT" }, { "timestamp": null, "localTime": "2026-03-12", "status": "label_created", "description": "Booked", "location": "ISLAMPUR", "code": null } ] } ``` ## Notes - **Time zone**: times are ISO UTC; `localTime` is that instant in India time (`Asia/Kolkata`). Booking has a date only. - **Merged feed**: one answer holds the booking (`Booked`), hub scans (`Out To X From Y`) and delivery runs (`drs_list`); all become events. - **Not found**: an unknown docket is a 200 with empty fields, answered as `not_found`. Auto-detection: dockets are plain digits, so pass `?carrier=shreeanjani`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Shree Maruti Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/shreemaruti Query live **Shree Maruti Courier** (`shreemaruti`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `shreemaruti` | | **Brand aliases** | Shree Maruti, Shree Maruti Courier Services, SMCS, Innofulfill | | **Category** | Indian domestic courier (docket numbers) | | **Region** | India | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=25022100094102,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Dockets are 14 digits beginning with a yymmdd date, a shape other carriers also use, so pass `?carrier=shreemaruti`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/25022100094102?carrier=shreemaruti" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "shreemaruti", "trackingNumber": "25022100094102", "status": "delivered", "statusDescription": "Order has been delivered", "service": "courier", "deliveredAt": "2026-03-14T09:31:40Z", "deliveredAtLocal": "2026-03-14T15:01:40", "signedBy": null, "destination": { "city": "JAIPUR", "state": "RAJASTHAN", "country": "IN" }, "events": [ { "timestamp": "2026-03-14T09:31:40Z", "localTime": "2026-03-14T15:01:40", "status": "delivered", "description": "Order has been delivered", "location": "JAIPUR OFFICE", "code": "delivered" }, { "timestamp": "2026-03-14T03:40:11Z", "localTime": "2026-03-14T09:10:11", "status": "out_for_delivery", "description": "Shipment is out for delivery", "location": "JAIPUR", "code": "out_for_delivery" }, { "timestamp": "2026-03-11T06:30:28Z", "localTime": "2026-03-11T12:00:28", "status": "label_created", "description": "Order Has been Confirmed", "location": "DELHI", "code": "order placed in system" } ] } ``` ## Notes - **Time zone**: scan times are epoch milliseconds, shown at India Standard Time (`+05:30`). - **Re-delivery scans**: a delivered docket can carry a second, later `delivered` scan (proof-of-delivery upload); the newest one drives `deliveredAt`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SHSGEXP Tracking API & MCP URL: https://docs.lastscanned.com/carriers/shsgexp Query live **SHSGEXP** (`shsgexp`) package status and scan history in a single synchronous `GET` request or MCP tool call. SHSGEXP numbers share their shape with other carriers' numbers, so pass `?carrier=shsgexp`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `shsgexp` | | **Brand aliases** | SHSGEXP, 上海世格国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=shsgexp` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=shsgexp` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | SHSGEXP tracking numbers have no shape of their own, so always pass `?carrier=shsgexp`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to SHSGEXP in one request. - **Platform**: SHSGEXP runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Singapore Post (SingPost, Speedpost) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/singpost Query live **SingPost** (`singpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `SG` (with a valid check digit) in Pass 1 and returns a normalized `TrackingResult` JSON payload, with no SingPost account or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `singpost` | | **Brand & service aliases** | SingPost, Singapore Post, Speedpost, `singpost.com`, S10 `…SG` | | **Category** | National postal operator (Singapore), international mail | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CZ003411963SG,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for SingPost - **No captcha in the way**: the SingPost tracking page loads reCAPTCHA but its `track-events` call does not use the token, so one JSON request returns the whole history. - **Delivered detection from SingPost codes**: delivery is read from SingPost's own status codes (`D?C`, `R?C`, `IDBC`, `FD`), with the wording as the fallback. ## Tracking Number Formats & Auto-Detection (`matches`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{2}\d{9}SG$/` (UPU S10) | S10 mod-11 | `CZ003411963SG` | | **Pass 2 (`mayMatch`)** | *None* | n/a | n/a | Only S10 numbers whose check digit is valid are claimed. Anything else needs `?carrier=singpost`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/CZ003411963SG?carrier=singpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "CZ003411963SG" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "singpost", "trackingNumber": "CZ003411963SG", "status": "delivered", "statusDescription": "Delivered", "service": "Speedpost", "deliveredAt": "2026-10-25T02:12:00Z", "deliveredAtLocal": "2026-10-25T10:12:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-25T02:12:00Z", "localTime": "2026-10-25T10:12:00", "status": "delivered", "description": "Delivered", "location": "Singapore", "code": null }, { "timestamp": "2026-10-25T00:30:00Z", "localTime": "2026-10-25T08:30:00", "status": "out_for_delivery", "description": "Out for delivery", "location": "Singapore", "code": null }, { "timestamp": "2026-10-24T13:05:00Z", "localTime": "2026-10-24T21:05:00", "status": "in_transit", "description": "Item processed at mail centre", "location": "Singapore", "code": null } ] } ``` ## Notes - **Time zone**: scan times are treated as Singapore time (`Asia/Singapore`) unless the string carries its own offset. - **Reasons**: SingPost's reason text, when present, is appended to the description as `Reason: …`. - An unknown number returns `404 not_found` (cached for 5 minutes). ## Related Resources - **Live browser lookup tool**: [Track a SingPost package live on lastscanned.com/lookup/singpost](https://lastscanned.com/lookup/singpost) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Skroutz Last Mile Tracking API & MCP URL: https://docs.lastscanned.com/carriers/skroutzlastmile Query live **Skroutz Last Mile** (`skroutzlastmile`) package status and scan history in a single synchronous `GET` request or MCP tool call. Skroutz Last Mile numbers have no shape that is theirs alone, so pass `?carrier=skroutzlastmile`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `skroutzlastmile` | | **Brand aliases** | Skroutz Last Mile, Skroutz, Sendx, SLM, Skroutz Last Mile Greece | | **Category** | E-commerce last-mile and locker delivery, Greece and Cyprus | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=7OGLWYZ124KVQ,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/7OGLWYZ124KVQ?carrier=skroutzlastmile" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "skroutzlastmile", "trackingNumber": "7OGLWYZ124KVQ", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-24T14:57:07Z", "deliveredAtLocal": "2026-03-24T16:57:07", "signedBy": null, "destination": { "city": null, "state": null, "country": "GR" }, "events": [ { "timestamp": "2026-03-24T14:57:07Z", "localTime": "2026-03-24T16:57:07", "status": "delivered", "description": "Delivered", "location": null, "code": "DELIVERED" }, { "timestamp": "2026-03-24T09:20:34Z", "localTime": "2026-03-24T11:20:34", "status": "in_transit", "description": "The shipment is en route for delivery", "location": null, "code": "PICKED_UP" }, { "timestamp": "2026-03-23T14:25:18Z", "localTime": "2026-03-23T16:25:18", "status": "in_transit", "description": "The shipment is at SLM HUB Thessaloniki", "location": "SLM HUB Thessaloniki", "code": "SCANNED" } ] } ``` ## Notes - **Time zone**: checkpoint times are UTC; `localTime` is that instant in Athens (`Europe/Athens`), which Cyprus shares. - **Not found**: an unknown voucher is an HTTP 400 `Package not found`, answered as `not_found`. - **Auto-detection**: a 13-character letters-and-digits voucher is too generic to claim, so pass `?carrier=skroutzlastmile`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SkyKing Tracking API & MCP URL: https://docs.lastscanned.com/carriers/skyking Query live **SkyKing** (`skyking`) package status and scan history in a single synchronous `GET` request or MCP tool call. SkyKing numbers have no shape that is theirs alone, so pass `?carrier=skyking`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `skyking` | | **Brand aliases** | SkyKing, Sky King, SkyKing India, Flyking | | **Category** | Domestic courier (India) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=445662077,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/445662077?carrier=skyking" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "skyking", "trackingNumber": "445662077", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-08-18T09:45:53Z", "deliveredAtLocal": "2026-08-18T15:15:53", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-08-18T09:45:53Z", "localTime": "2026-08-18T15:15:53", "status": "delivered", "description": "Delivered", "location": "EXAMPLE MARKET,SURAT", "code": "DRS" }, { "timestamp": "2026-08-17T06:10:37Z", "localTime": "2026-08-17T11:40:37", "status": "out_for_delivery", "description": "Out For Delivery", "location": "EXAMPLE MARKET,SURAT", "code": null }, { "timestamp": "2026-08-17T05:50:36Z", "localTime": "2026-08-17T11:20:36", "status": "in_transit", "description": "INBOUND SCAN DONE", "location": "SURAT HUB FACILITY", "code": "INB" } ] } ``` ## Notes - **Two requests**: SkyKing issues a one-off key (`GetAPIKeyValue`) that goes back as the `KeyValue` header on the scan list request. - **Time zone**: `dd/mm/yyyy - hh:mm:ss` in India time (UTC+05:30); `Statusflag` 1 marks the delivery. - **Privacy**: the driver's name in `Out For Delivery, Area Name: ..., Delivery Boy: ...` is cut off. Auto-detection: plain digits, so pass `?carrier=skyking`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SkyNet Worldwide Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/skynetworldwide Query live **SkyNet Worldwide Express** (`skynetworldwide`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `skynetworldwide` | | **Brand aliases** | SkyNet, SkyNet Worldwide, SkyNet Express, SkyNet WWE | | **Category** | International express courier | | **Region** | United Kingdom / global network | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=711952411623,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | SkyNet numbers are 12 digits, a shape other carriers use, so pass `?carrier=skynetworldwide`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/711952411623?carrier=skynetworldwide" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "skynetworldwide", "trackingNumber": "711952411623", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-05T11:04:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-05T11:04:00", "status": "delivered", "description": "Delivered", "location": "SINGAPORE", "code": null }, { "timestamp": null, "localTime": "2026-03-05T08:20:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "SINGAPORE", "code": null }, { "timestamp": null, "localTime": "2026-03-02T23:13:00", "status": "in_transit", "description": "Sorted to Destination", "location": "London - UNITED KINGDOM", "code": null } ] } ``` ## Notes - **Source**: SkyNet's tracker is the GETOnline page at `tracking.frontierforce.com`, which has no JSON; the scans are read from the page. - **Time zone**: the page prints scan times without a zone and a parcel crosses countries, so only `localTime` is given and `timestamp` is `null`. - **Privacy**: the page's masked recipient-name note is not passed on. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SkyPostal Tracking API & MCP URL: https://docs.lastscanned.com/carriers/skypostal Query live **SkyPostal** (`skypostal`, US to Latin America e-commerce) status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `skypostal` | | **Brand aliases** | Sky Postal | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SKAMZUS\d{10}$/` | none | `SP00006998749BR` | | **Pass 2 (`mayMatch`)** | `/^SP\d{11}BR$/` | none | none | These numbers belong to this carrier, so `?carrier=skypostal` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SP00006998749BR?carrier=skypostal" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "skypostal", "trackingNumber": "SP00006998749BR", "status": "delivered", "statusDescription": "DELIVERED", "service": null, "deliveredAt": "2026-03-27T14:02:00Z", "deliveredAtLocal": "2026-03-27T11:02:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "BR" }, "message": "Handed to Correios as SP00006998749BR", "events": [ { "timestamp": "2026-03-27T14:02:00Z", "localTime": "2026-03-27T11:02:00", "status": "delivered", "description": "DELIVERED", "location": "Example City", "code": "DEL" }, { "timestamp": "2026-03-13T19:14:00Z", "localTime": "2026-03-13T16:14:00", "status": "exception", "description": "AVAILABLE FOR PICKUP", "location": "Example City", "code": "PIK" }, { "timestamp": "2026-03-01T16:36:53Z", "localTime": "2026-03-01T12:36:53", "status": "label_created", "description": "DATA RECEIVED", "location": null, "code": "DRC" } ] } ``` ## Notes - **Source**: tracking.skypostal.com's own API. Its request and reply are encrypted end to end (an ECDH key exchange with the server's published key, then AES-GCM); the adapter does this with Web Crypto. No account or key. - **Time zone**: each scan carries a GMT offset (for example `GMT-03:00`). - **Handoff**: a Brazilian destination number (`…BR`) is returned in `message` as a Correios number. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Slovenská pošta Tracking API & MCP URL: https://docs.lastscanned.com/carriers/slovenskaposta Query live **Slovenská pošta** (`slovenskaposta`) package status and scan history in a single synchronous `GET` request or MCP tool call. The shape belongs to Slovenská pošta alone, so `?carrier=slovenskaposta` is optional for it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `slovenskaposta` | | **Brand aliases** | Slovenská pošta, Slovak Post, Slovenska posta, Posta.sk, Slovakia Post | | **Category** | National post, Slovakia (UPU S10 items, outbound and inbound) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=LZ316815810US,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("SK")`: `/^[A-Z]{2}\d{9}SK$/` | UPU S10 | `LZ316815810US` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/LZ316815810US?carrier=slovenskaposta" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "slovenskaposta", "trackingNumber": "LZ316815810US", "status": "delivered", "statusDescription": "Picked up", "service": null, "deliveredAt": "2026-05-15T12:03:23Z", "deliveredAtLocal": "2026-05-15T14:03:23", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-15T12:03:23Z", "localTime": "2026-05-15T14:03:23", "status": "delivered", "description": "Picked up", "location": "Pošta Bratislava 27", "code": "OKP" }, { "timestamp": "2026-05-15T11:43:10Z", "localTime": "2026-05-15T13:43:10", "status": "exception", "description": "Deposited at P.O.BOX", "location": "Pošta Bratislava 27", "code": "BOX" }, { "timestamp": "2026-05-14T08:25:12Z", "localTime": "2026-05-14T10:25:12", "status": "in_transit", "description": "Returned from import Customs", "location": null, "code": "IPS_EDC" }, { "timestamp": "2026-05-02T20:00:05Z", "localTime": "2026-05-02T22:00:05", "status": "in_transit", "description": "Posted at post office", "location": "US", "code": "IPS_EMA" } ] } ``` ## Notes - **Inbound foreign codes**: Slovak Post also tracks S10 codes of other posts sent to Slovakia (for example `...US`, `...NL`). Other carriers claim those shapes, so pass `?carrier=slovenskaposta`. - **Time zone**: events are epoch instants; `localTime` is Bratislava time for Slovak scans. Scans abroad (the office's `country` is not `SK`) keep the UTC `timestamp` only. - **Status**: `Returned from import Customs` is clearance, not a return, and `Deposited at P.O.BOX` (waiting for collection) is `exception`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SMSA Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/smsa Query live **SMSA Express (Saudi Arabia)** (`smsa`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `smsa` | | **Brand aliases** | SMSA, SMSA Express, SMSA Saudi | | **Category** | Regional express (Saudi Arabia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | `290953547445` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | AWB (12 digits) | `^\d{12}$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=smsa`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/290953547445?carrier=smsa" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "smsa", "trackingNumber": "290953547445", "status": "delivered", "statusDescription": "Delivered, Signed by: Amani", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-12T16:29:00", "signedBy": "Amani", "destination": { "city": "Dammam", "state": null, "country": "SA" }, "estimatedDelivery": "2026-10-23", "events": [ { "timestamp": null, "localTime": "2026-10-12T16:29:00", "status": "delivered", "description": "Delivered, Signed by: Amani", "location": "Dammam", "code": null }, { "timestamp": null, "localTime": "2026-10-12T09:40:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "Dammam", "code": null }, { "timestamp": null, "localTime": "2026-10-11T07:03:00", "status": "in_transit", "description": "Shipment Received at SMSA Sorting Facility", "location": "Riyadh", "code": null } ] } ``` ## Notes - **Route**: the public tracking page `www.smsaexpress.com/sa/trackingdetails`. Its TLS certificate is served without the intermediate, so strict clients cannot verify it, which `lastscanned` handles automatically. The Android app's SOAP API (which needs the app's own login) is not used. - **Local time only**: SMSA serves several countries and the page prints no zone, so `timestamp` is `null`. - 12-digit numbers are shared with other carriers, so pass `?carrier=smsa`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Southeastern Freight Lines Tracking API & MCP URL: https://docs.lastscanned.com/carriers/southeasternfreightlines Query live **Southeastern Freight Lines** (`southeasternfreightlines`) package status and scan history in a single synchronous `GET` request or MCP tool call. Southeastern Freight Lines numbers have no shape that is theirs alone, so pass `?carrier=southeasternfreightlines`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `southeasternfreightlines` | | **Brand aliases** | Southeastern Freight Lines, SEFL, Southeastern Freight, Southeastern Freight Lines SEFL | | **Category** | LTL freight (US Southeast) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=396824668,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/396824668?carrier=southeasternfreightlines" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "southeasternfreightlines", "trackingNumber": "396824668", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-02-12T14:07:00Z", "deliveredAtLocal": "2026-02-12T08:07:00", "signedBy": "D. Smith", "destination": { "city": "DOTHAN", "state": "AL", "country": "US" }, "events": [ { "timestamp": "2026-02-12T14:07:00Z", "localTime": "2026-02-12T08:07:00", "status": "delivered", "description": "Delivered", "location": "DOTHAN, AL", "code": "DLV" }, { "timestamp": "2026-02-12T12:45:00Z", "localTime": "2026-02-12T06:45:00", "status": "out_for_delivery", "description": "Out for Delivery on Trailer 536000", "location": "DOTHAN, AL", "code": "CDY" }, { "timestamp": "2026-02-10T17:48:00Z", "localTime": "2026-02-10T11:48:00", "status": "in_transit", "description": "Shipment Pickup using Trailer 536369L", "location": "MEMPHIS, TN", "code": "LOD" } ] } ``` ## Notes - **Time zone**: each scan has a `utcOffset`, so `timestamp` is exact. Dates are US format (`mm/dd/yyyy`). - **Signed by**: `Delivered - Signed By: ` is split into the `Delivered` description and `signedBy`. - **Auto-detection**: 9-digit PROs are shared with other LTL carriers, so pass `?carrier=southeasternfreightlines`. Seven-digit PROs are answered `not_found` without calling SEFL. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Speedaf Tracking API & MCP URL: https://docs.lastscanned.com/carriers/speedaf Query live **Speedaf** (`speedaf`, Africa, Middle East and Central Asia parcels from China) status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `speedaf` | | **Brand aliases** | Speedaf Express, SPEEDAF | | **Category** | International | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^(AE|EG|GH|KE|KZ|MA|MU|MV|NG|PK|RE|RW|SA|TR|UG|ZA|ZM)(\d{12}T?|\d{9}[ER])$/` | none | `ZA000295504R` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to this carrier, so `?carrier=speedaf` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ZA000295504R?carrier=speedaf" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "speedaf", "trackingNumber": "ZA000295504R", "status": "delivered", "statusDescription": "Parcel delivered Collected; Collection site is Example-Site.", "service": null, "deliveredAt": "2026-03-02T12:51:35Z", "deliveredAtLocal": "2026-03-02T14:51:35", "signedBy": null, "destination": { "city": null, "state": null, "country": "ZA" }, "events": [ { "timestamp": "2026-03-02T12:51:35Z", "localTime": "2026-03-02T14:51:35", "status": "delivered", "description": "Parcel delivered Collected; Collection site is Example-Site.", "location": null, "code": "5" }, { "timestamp": "2026-03-02T06:47:15Z", "localTime": "2026-03-02T08:47:15", "status": "out_for_delivery", "description": "Example Courier in Example-Site scanned for delivery.", "location": null, "code": "4" }, { "timestamp": "2026-02-26T11:36:41Z", "localTime": "2026-02-26T19:36:41", "status": "in_transit", "description": "[Guangzhou warehouse] processing, order has been inbounded", "location": null, "code": "150" } ] } ``` ## Notes - **Source**: Speedaf's public tracking JSON (`listExpressTrack`). A batch of numbers goes in one request. - **Time zone**: each scan carries its own UTC offset (China-side scans +08:00, destination scans local), so `timestamp` is exact. - **Description**: the English message with Speedaf's 【】 brackets removed. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Gokulam Speed & Safe Tracking API & MCP URL: https://docs.lastscanned.com/carriers/speedandsafe Query live **Gokulam Speed & Safe** (`speedandsafe`) package status and scan history in a single synchronous `GET` request or MCP tool call. Gokulam Speed & Safe numbers have no shape that is theirs alone, so pass `?carrier=speedandsafe`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `speedandsafe` | | **Brand aliases** | Gokulam Speed & Safe, Speed & Safe, Speed and Safe, Gokulam Speed and Safe, Gokulam | | **Category** | Domestic courier (Kerala, India) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=20000000,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/20000000?carrier=speedandsafe" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "speedandsafe", "trackingNumber": "20000000", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-05-15T09:49:58Z", "deliveredAtLocal": "2026-05-15T15:19:58", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-15T09:49:58Z", "localTime": "2026-05-15T15:19:58", "status": "delivered", "description": "Delivered", "location": "Example Road-Franchisee", "code": "D" }, { "timestamp": "2026-05-13T06:57:30Z", "localTime": "2026-05-13T12:27:30", "status": "out_for_delivery", "description": "Out for Delivery", "location": "Example Road-Franchisee", "code": "O" }, { "timestamp": "2026-05-13T05:38:55Z", "localTime": "2026-05-13T11:08:55", "status": "in_transit", "description": "Dispatched to Example Road-Franchisee", "location": "Kozhikode-Hub", "code": "M" } ] } ``` ## Notes - **Time zone**: `processdate` carries the `+05:30` offset, so `timestamp` is exact. - **Hops**: `M` (dispatched) shows the sending branch and names the next in the description; `I` (arrived) shows the receiving branch; `O` and `D` use the delivering branch. - **Auto-detection**: 8-digit numbers are too generic, so pass `?carrier=speedandsafe`. Numbers shorter than eight characters are answered `not_found` without calling the carrier. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Spee-Dee Delivery Tracking API & MCP URL: https://docs.lastscanned.com/carriers/speedee Query live **Spee-Dee Delivery Service** (`speedee`) package status and scan history across the Upper Midwest in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 18- and 20-character `SP…` barcodes, filters out recycled barcode history from older shipments, and returns a normalized `TrackingResult` JSON payload. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `speedee` | | **Brand & service aliases** | Spee-Dee Delivery Service, Spee-Dee Ground | | **Category** | US Upper Midwest regional parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SP...,SP...` (note: upstream rate limit of 10 lookups/minute) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Spee-Dee Delivery - **Clean JSON from a legacy HTML-only carrier**: Spee-Dee's public package progress system returns legacy HTML tables with embedded debug comments and no JSON API. `lastscanned` parses the summary and scan rows into the standard `TrackingResult` JSON schema. - **Automatic recycled-barcode deduplication**: Spee-Dee shippers sometimes reuse barcode ranges across separate shipments months apart, causing a single tracking page to list scans from multiple historical deliveries. `lastscanned` detects when an older `delivered` event sits a day or more below a newer shipment's scans and automatically trims the stale shipment history. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Spee-Dee is evaluated **tenth (#10)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SP(\d{16}\|\d{18})$/i` (`SP` + 16 or 18 digits = 18 or 20 chars) | — | `SP029692450001607639`, `SP029692450001607639` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=speedee` optional vs required? - **Optional (auto-detected)**: All `SP` + 16-digit and `SP` + 18-digit Spee-Dee tracking numbers auto-detect in Pass 1 (no collision with USPS S10 numbers, which are 2 letters + 9 digits + `US`). - **Required (`?carrier=speedee`)**: Custom shipper barcodes or non-`SP` reference numbers inducted into Spee-Dee. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/SP029692450001607639?carrier=speedee" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/SP029692450001607639?carrier=speedee", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.signedBy, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "SP029692450001607639" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "speedee", "trackingNumber": "SP029692450001607639", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-23T16:53:00Z", "deliveredAtLocal": "2026-10-23T11:53:00", "signedBy": "J. ANDERSON", "destination": { "city": "ST CLOUD", "state": "MN", "country": "US" }, "estimatedDelivery": null, "events": [ { "timestamp": "2026-10-23T16:53:00Z", "localTime": "2026-10-23T11:53:00", "status": "delivered", "description": "Delivered", "location": "ST CLOUD, MN", "code": null }, { "timestamp": "2026-10-23T12:18:00Z", "localTime": "2026-10-23T07:18:00", "status": "out_for_delivery", "description": "OUT FOR DELIVERY (31092)", "location": "ST CLOUD, MN", "code": null }, { "timestamp": "2026-10-23T09:04:00Z", "localTime": "2026-10-23T04:04:00", "status": "in_transit", "description": "ARRIVAL SCAN", "location": "ST CLOUD, MN", "code": null } ] } ``` > **Raw status & scan fields**: Spee-Dee scans do not carry separate status codes (`events[].code` is `null`); `events[].description` preserves the exact scan text (including route numbers like `"OUT FOR DELIVERY (31092)"`). ## Carrier-Specific Status & Integration Notes - **Upstream rate limit (10 lookups / minute)**: Spee-Dee enforces a strict limit of 10 tracking searches per minute. If you send a large batch of Spee-Dee numbers at once, excess numbers return HTTP `429` with `code: "rate_limited"` (`"Spee-Dee allows 10 searches a minute; try again in a minute"`). Space Spee-Dee batch lookups to ≤10 numbers per minute. - **No `estimatedDelivery` field**: Spee-Dee does not publish estimated delivery dates prior to delivery, so `estimatedDelivery` is always `null`. - **Central Time UTC conversion**: For scans located in states wholly within the Central timezone (`AL`, `AR`, `IA`, `IL`, `LA`, `MN`, `MO`, `MS`, `OK`, `WI`), `timestamp` is converted to UTC using `America/Chicago`. Scans in split-timezone states populate `localTime` with `timestamp: null`. ## Related Resources - **Live browser lookup tool**: [Track a Spee-Dee package live on lastscanned.com/lookup/speedee](https://lastscanned.com/lookup/speedee) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Speedex Tracking API & MCP URL: https://docs.lastscanned.com/carriers/speedex Query live **Speedex** (`speedex`) package status and scan history in a single synchronous `GET` request or MCP tool call. Speedex numbers have no shape that is theirs alone, so pass `?carrier=speedex`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `speedex` | | **Brand aliases** | Speedex, Speedex Courier, Speedex Greece, Σπήντεξ | | **Category** | Domestic courier, Greece | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=JJD014600012743269756,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/JJD014600012743269756?carrier=speedex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "speedex", "trackingNumber": "JJD014600012743269756", "status": "delivered", "statusDescription": "Η ΑΠΟΣΤΟΛΗ ΠΑΡΑΔΟΘΗΚΕ", "service": null, "deliveredAt": "2026-10-05T08:30:00Z", "deliveredAtLocal": "2026-10-05T11:30:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-05T08:30:00Z", "localTime": "2026-10-05T11:30:00", "status": "delivered", "description": "Η ΑΠΟΣΤΟΛΗ ΠΑΡΑΔΟΘΗΚΕ", "location": "ΚΑΛΛΙΘΕΑ", "code": null }, { "timestamp": "2026-10-05T05:48:00Z", "localTime": "2026-10-05T08:48:00", "status": "out_for_delivery", "description": "ΠΡΟΣ ΠΑΡΑΔΟΣΗ", "location": "ΚΑΛΛΙΘΕΑ", "code": null }, { "timestamp": "2026-10-02T10:45:00Z", "localTime": "2026-10-02T13:45:00", "status": "label_created", "description": "ΑΝΑΜΟΝΗ ΑΝΑΘΕΣΗΣ ΑΠΟ ΑΠΟΣΤΟΛΕΑ", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: Greek local time (`Europe/Athens`); `timestamp` is converted from it. - **Recipient privacy**: the delivery card's recipient name is dropped; the description is just `Η ΑΠΟΣΤΟΛΗ ΠΑΡΑΔΟΘΗΚΕ` (the shipment was delivered). - **Status**: `ΠΡΟΣ ΠΑΡΑΔΟΣΗ` is out for delivery, `ΕΠΙΣΤΡΟΦΗ …` a return. The Viber notification lines stay `in_transit`. Auto-detection: the `JJD…` shape is shared with other carriers, so pass `?carrier=speedex`. The site is sometimes slow; the request waits up to 40 seconds. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SpeedPAK (Orange Connex) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/speedpak Query live **SpeedPAK** (`speedpak`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects the 28-character `ES…` / `EE…` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `speedpak` | | **Brand aliases** | SpeedPAK, Speed PAK, Orange Connex, OrangeConnex, SpeedPAK eBay | | **Category** | Cross-border e-commerce parcels (China) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ES1003113494686UN0101240600N,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^E[ES][A-Z0-9]{26}$/` | none | `ES1003113494686UN0101240600N` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ES1003113494686UN0101240600N?carrier=speedpak" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "speedpak", "trackingNumber": "ES1003113494686UN0101240600N", "status": "delivered", "statusDescription": "Delivered. (Recipient's front door)", "service": null, "deliveredAt": "2026-02-18T19:12:47Z", "deliveredAtLocal": "2026-02-18T13:12:47", "signedBy": null, "destination": { "city": "Farmington", "state": null, "country": "US" }, "message": "Handed to DHL eCommerce as ES1003113494686UN0101240600N", "events": [ { "timestamp": "2026-02-18T19:12:47Z", "localTime": "2026-02-18T13:12:47", "status": "delivered", "description": "Delivered. (Recipient's front door)", "location": "Farmington Minnesota, US", "code": null }, { "timestamp": "2026-02-16T02:40:06Z", "localTime": "2026-02-15T20:40:06", "status": "out_for_delivery", "description": "Out for delivery", "location": "Farmington Minnesota, US", "code": null }, { "timestamp": "2026-01-28T03:47:02Z", "localTime": "2026-01-28T11:47:02", "status": "in_transit", "description": "Package Received", "location": "WuHan, CN", "code": null }, { "timestamp": "2026-01-27T08:17:39Z", "localTime": "2026-01-27T16:17:39", "status": "label_created", "description": "Shipment Data Received", "location": null, "code": null } ] } ``` ## Notes - **Handoff**: when SpeedPAK passes the parcel on, a scan reads `LM Carrier: [DHL eCommerce] , LM tracking No.: [...]`; `message` names that carrier and its number. Pass the number to `GET /v1/track/{number}` for the partner's scans. - **Time zone**: each scan carries its local time and UTC offset, so both `timestamp` and `localTime` are exact. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SpeedX Tracking API & MCP URL: https://docs.lastscanned.com/carriers/speedx Query live **SpeedX** (`speedx`) last-mile package status and scan history across the US and Australia in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 18- and 24-character `SPX…` barcodes in Pass 1 and returns a normalized `TrackingResult` JSON payload—without requiring a SpeedX shipper account or webhook registration. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `speedx` | | **Brand & service aliases** | SpeedX, Speed X, SPX US, SPX Australia, `tracking.speedx.io` | | **Category** | US & Australian e-commerce last-mile carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SPX...,SPX...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for SpeedX instead of direct requests - **No public developer API or self-serve credentials**: SpeedX powers high-volume last-mile deliveries for Temu, Shein, TikTok Shop, and AliExpress across major US metros (`SPXLAX…`, `SPXJFK…`, `SPXORD…`, `SPXCLT…`) and Australia (`SPXSYD…`), but does not offer a public self-serve REST API for merchants or post-purchase tools. - **Full scan history instead of latest-event-only summaries**: SpeedX's summary endpoints only return the single latest scan. `lastscanned` returns the complete chronological scan history (`events`), recipient city/state (`destination`), estimated delivery date (`estimatedDelivery`), and normalized status codes in one `GET` request. - **Cross-border handoff target**: Cross-border parcels from [Cainiao](https://docs.lastscanned.com/carriers/cainiao), [YunExpress](https://docs.lastscanned.com/carriers/yunexpress), [Yanwen](https://docs.lastscanned.com/carriers/yanwen), and [SunYou](https://docs.lastscanned.com/carriers/sunyou) frequently hand over to SpeedX for final-mile delivery under an `SPX…` tracking number. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) SpeedX is evaluated **nineteenth (#19)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — Standard 18-char `SPX`** | `/^SPX[0-9A-Z]{15}$/i` (`SPX` + 15 letters and digits = 18 chars, typically `SPX` + 3-letter airport/hub code + 12 digits) | — | `SPXCLT138701431240`, `SPXCLT138701431240`, `SPXSYD104600343237` | | **Pass 1 (`matches`) — Extended 24-char `SPX`** | `/^SPX[0-9A-Z]{21}$/i` (`SPX` + 21 letters and digits = 24 chars on cross-border labels) | — | `SPXWCA003022610150019140` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### Disambiguating SpeedX (`SPX…`) vs Spee-Dee (`SP…`) - **Zero collision with [Spee-Dee Delivery](https://docs.lastscanned.com/carriers/speedee)**: Spee-Dee tracking numbers start with `SP` followed strictly by 16 or 18 digits (`/^SP(\d{16}|\d{18})$/i`), whereas SpeedX tracking numbers always start with `SPX` followed by 15 or 21 alphanumeric characters (`/^SPX([0-9A-Z]{15}|[0-9A-Z]{21})$/i`). Both auto-detect in Pass 1 without `?carrier=`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/SPXCLT138701431240?carrier=speedx" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/SPXCLT138701431240?carrier=speedx", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.destination, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "SPXCLT138701431240" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "speedx", "trackingNumber": "SPXCLT138701431240", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-25T18:14:22Z", "deliveredAtLocal": "2026-10-25T14:14:22", "signedBy": null, "destination": { "city": "Bronx", "state": "NY", "country": "US" }, "estimatedDelivery": null, "events": [ { "timestamp": "2026-10-25T18:14:22Z", "localTime": "2026-10-25T14:14:22", "status": "delivered", "description": "Delivered", "location": "Bronx, NY", "code": "57201" }, { "timestamp": "2026-10-25T12:47:01Z", "localTime": "2026-10-25T08:47:01", "status": "out_for_delivery", "description": "Out for delivery", "location": "Jamaica, NY", "code": "57104" }, { "timestamp": "2026-10-25T07:19:40Z", "localTime": "2026-10-25T03:19:40", "status": "in_transit", "description": "Arrived at last-mile facility", "location": "Jamaica, NY", "code": "57101" }, { "timestamp": "2026-10-23T04:10:00Z", "localTime": "2026-10-23T00:10:00", "status": "label_created", "description": "Shipping label created", "location": null, "code": "50001" } ] } ``` > **Raw status & event codes**: `events[].code` preserves SpeedX's 5-digit event code (`"50001"` label created, `"51005"` picked up, `"52001"`/`"52002"` origin facility, `"57101"`/`"57102"`/`"57112"` last-mile facility, `"57104"` out for delivery, `"57201"`–`"57203"` delivered, `"57411"` weather exception) alongside SpeedX's milestone category (`PICKUP`, `ORIGIN_HANDLING`, `MIDDLE_MILE`, `LAST_MILE_ENROUTE`, `LAST_MILE_DELIVERED`, `LAST_MILE_ATTEMPTED`, `LAST_MILE_UNDELIVERED`, `LAST_MILE_INTERCEPT`, `LAST_MILE_RETURNS`). ## Carrier-Specific Status & Integration Notes - **Dual UTC and local timestamps (`timestamp` + `localTime`)**: SpeedX provides both UTC timestamps (`ts`) and offset-qualified local timestamps (`localTs`), so both `timestamp` and `localTime` (plus `deliveredAt` and `deliveredAtLocal`) are populated on every scan. - **Estimated delivery (`estimatedDelivery`)**: While a parcel is in transit, `estimatedDelivery` holds SpeedX's expected delivery date (`YYYY-MM-DD`). Once delivered, `estimatedDelivery` is cleared to `null`. ## Related Resources - **Live browser lookup tool**: [Track a SpeedX package live on lastscanned.com/lookup/speedx](https://lastscanned.com/lookup/speedx) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Speedy Tracking API & MCP URL: https://docs.lastscanned.com/carriers/speedy Query live **Speedy** (`speedy`) package status, scan history and the foreign carrier's number (for Greek deliveries via ACS) in a single synchronous `GET` request or MCP tool call. Speedy's 11-digit numbers look like other carriers' numbers, so pass `?carrier=speedy`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `speedy` | | **Brand aliases** | Speedy, Speedy Bulgaria, MySpeedy | | **Category** | Regional courier (Bulgaria) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=63761151459,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none (11 digits, shared with other carriers) | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/63761151459?carrier=speedy" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "speedy", "trackingNumber": "63761151459", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-12T10:11:38Z", "deliveredAtLocal": "2026-10-12T13:11:38", "signedBy": null, "destination": null, "message": "Handed to ACS as 63761151459", "events": [ { "timestamp": "2026-10-12T10:11:38Z", "localTime": "2026-10-12T13:11:38", "status": "delivered", "description": "Delivered", "location": "Athens, Greece", "code": "-14" }, { "timestamp": "2026-10-04T12:08:55Z", "localTime": "2026-10-04T15:08:55", "status": "label_created", "description": "Shipment data received", "location": null, "code": "148" } ] } ``` ## Notes - **Source**: the public REST JSON of the MySpeedy portal (`myspeedy.speedy.bg/rest/public/track`). It is shared with [DPD Romania](https://docs.lastscanned.com/docs/carriers/dpdro). - **Handoff**: when Speedy passes the parcel to a partner (ACS in Greece), `message` carries the partner and its number. - **Status**: Speedy's own phase (`DELIVERED`, `DELIVERED_BACK_TO_SENDER`) sets `delivered` or `returned`; otherwise the newest scan's wording decides. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SPL Saudi Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/spl Query live **SPL Saudi Post** (`spl`, Saudi Post / سبل) parcel status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects UPU S10 numbers ending in `SA` (valid check digit) in Pass 1; SPL's other number shapes need `?carrier=spl`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `spl` | | **Brand & service aliases** | SPL, Saudi Post, Saudi Post and Logistics, SaudiPost, سبل, البريد السعودي | | **Category** | National post of Saudi Arabia | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=spl` for numbers that are not S10 `…SA`) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RR...SA,RR...SA` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=spl`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10: `/^[A-Z]{2}\d{9}SA$/` | S10 mod 11 | `CRDSAL0304948755`, `CRDSAL0304948755` | | **Pass 2 (`mayMatch`)** | *None* | none | none | | **Explicit (`?carrier=spl`)** | SPL's other shapes: letters, 4 to 25 digits, then a check character | none | `?carrier=spl` | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CRDSAL0304948755?carrier=spl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "spl", "trackingNumber": "CRDSAL0304948755", "status": "out_for_delivery", "statusDescription": "Under delivery", "service": "Registered Mail", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "estimatedDelivery": "2026-10-28T00:00:00", "events": [ { "timestamp": null, "localTime": "2026-10-27T08:40:00", "status": "out_for_delivery", "description": "Under delivery", "location": "Riyadh Mail Center", "code": "4" }, { "timestamp": null, "localTime": "2026-10-26T19:05:00", "status": "in_transit", "description": "Received from the customer", "location": "Jeddah Post Office", "code": "1" } ] } ``` ## Status Notes - **Times**: scan times are printed without a zone, so events carry `localTime` only. - **Customs bill**: status code `8` means a VAT bill has been issued and must be paid; it reports `exception`. - **Naqel numbers**: SPL's tracking page also accepts Naqel waybills (8, 9, 13 or 14 digits). Those are Naqel shipments and are not tracked as `spl`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # PostNL (Spring GDS) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/springgds Query live **PostNL International** (`springgds`) status and scan history for cross-border e-commerce parcels that the consumer PostNL tracker (`postnl`) does not know. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `springgds` | | **Brand aliases** | PostNL International, PostNL e-commerce, postnl.post | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Pass `?carrier=springgds` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CK089862199NL?carrier=springgds" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "springgds", "trackingNumber": "CK089862199NL", "status": "delivered", "statusDescription": "The item has been delivered successfully", "service": null, "deliveredAt": "2026-03-30T07:45:39Z", "deliveredAtLocal": "2026-03-30T09:45:39", "signedBy": null, "destination": { "city": null, "state": null, "country": "Germany" }, "events": [ { "timestamp": "2026-03-30T07:45:39Z", "localTime": "2026-03-30T09:45:39", "status": "delivered", "description": "The item has been delivered successfully", "location": "Germany", "code": "37" }, { "timestamp": "2026-03-30T06:12:35Z", "localTime": "2026-03-30T08:12:35", "status": "out_for_delivery", "description": "The item is out for delivery", "location": "Germany", "code": "74" }, { "timestamp": "2026-03-05T09:01:00Z", "localTime": "2026-03-05T10:01:00", "status": "label_created", "description": "The item is pre-advised to PostNL", "location": null, "code": "1233" } ] } ``` ## Notes - **Source**: postnl.post, PostNL International's e-commerce tracker. An anonymous 24-hour bearer token is fetched automatically. - **Overlap with `postnl`**: `CK089862199NL`-style and `3S…` numbers are also claimed by `postnl`, which returns `not_found` for these parcels. Use `?carrier=springgds` for them. - **Time zone**: `datetime_local` is local time; it is converted from the zone of the country on the scan (Europe/Amsterdam when the scan has no country). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Slovak Parcel Service (SPS) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sps Query live **Slovak Parcel Service** (`sps`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `703` + 11 digits (and the 16-digit parcel number). The bare 11-digit shipment number (for example `030-43181455`) needs `?carrier=sps`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sps` | | **Brand aliases** | Slovak Parcel Service, SPS, SPS Slovakia, sps-sro | | **Category** | Parcel courier (Slovakia) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=030-43181455,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^703\d{11}(\d{2})?$/` (SPS's 703 prefix; the 11-digit shipment number alone is shared with other carriers) | none | `030-43181455` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/030-43181455?carrier=sps" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sps", "trackingNumber": "030-43181455", "status": "delivered", "statusDescription": "Doručenie", "service": null, "deliveredAt": "2026-05-28T13:47:26Z", "deliveredAtLocal": "2026-05-28T15:47:26", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-05-28T13:47:26Z", "localTime": "2026-05-28T15:47:26", "status": "delivered", "description": "Doručenie", "location": null, "code": "40" }, { "timestamp": "2026-05-28T07:36:32Z", "localTime": "2026-05-28T09:36:32", "status": "out_for_delivery", "description": "Doručovací hárok", "location": null, "code": "30" }, { "timestamp": "2026-05-27T20:11:15Z", "localTime": "2026-05-27T22:11:15", "status": "label_created", "description": "Prvá registrácia", "location": null, "code": "10" } ] } ``` ## Notes - **Number forms**: SPS accepts the shipment number (`030-43181455`), with the `703` prefix (14 digits) or the full 16-digit parcel number; dashes are ignored. - **Language**: descriptions are Slovak. **Time zone**: Slovak local time (`Europe/Bratislava`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SPX Express Brazil Tracking API & MCP URL: https://docs.lastscanned.com/carriers/spxbr Query live **SPX Express Brazil** (`spxbr`) package status and scan history in a single synchronous `GET` request or MCP tool call. The shape is only tried when no other carrier claims the number, so pass `?carrier=spxbr` to be certain. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `spxbr` | | **Brand aliases** | SPX Express Brazil, SPX Brazil, Shopee Xpress Brazil, SPX BR, Shopee Entrega | | **Category** | Domestic and cross-border e-commerce parcels (Shopee), Brazil | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=BR257449972818X,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^BR\d{12}[0-9A-Z]$/` | none | `BR257449972818X` | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/BR257449972818X?carrier=spxbr" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "spxbr", "trackingNumber": "BR257449972818X", "status": "delivered", "statusDescription": "Pedido entregue", "service": null, "deliveredAt": "2026-03-24T14:59:58Z", "deliveredAtLocal": "2026-03-24T14:59:58", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-24T14:59:58Z", "localTime": "2026-03-24T14:59:58", "status": "delivered", "description": "Pedido entregue", "location": null, "code": "F980" }, { "timestamp": "2026-03-24T09:05:49Z", "localTime": "2026-03-24T09:05:49", "status": "out_for_delivery", "description": "Pedido em rota de entrega para seu endereço, aguarde pelas próximas horas.", "location": null, "code": "F600" }, { "timestamp": "2026-03-20T10:18:29Z", "localTime": "2026-03-20T10:18:29", "status": "in_transit", "description": "Pedido chegou ao centro de distribuição", "location": "São Paulo - SP", "code": "F510" } ] } ``` ## Notes - **Time zone**: SPX Brazil gives epoch seconds and no zone, and Brazil spans several, so events carry the UTC `timestamp` and `localTime` is `null`. - **Same backend as the other SPX countries**: `spx.com.br` serves the open JSON that `spx.ph`, `spx.com.my` and the others do. A number not found answers `not_found`. - **Auto-detection**: the `BR…` shape is only tried when no other carrier claims the number (`mayMatch`), so pass `?carrier=spxbr` to be certain. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SPX Express Indonesia Tracking API & MCP URL: https://docs.lastscanned.com/carriers/spxid Query live **SPX Express Indonesia** (`spxid`, Shopee Xpress) parcel status and scan history in a single synchronous request. Both the SPX number and the Shopee order number are accepted. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `spxid` | | **Brand aliases** | SPX Indonesia, Shopee Xpress Indonesia, SPX ID | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SPXID\d{11}[0-9A-Z]$/` | none | `SPXID069495685978` | | **Pass 2 (`mayMatch`)** | `/^ID\d{12}[0-9A-Z]?$/` | none | none | These numbers belong to this carrier, so `?carrier=spxid` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SPXID069495685978?carrier=spxid" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "spxid", "trackingNumber": "SPXID069495685978", "status": "delivered", "statusDescription": "Pesanan tiba di alamat tujuan.", "service": null, "deliveredAt": "2026-03-02T07:10:44Z", "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-02T07:10:44Z", "localTime": null, "status": "delivered", "description": "Pesanan tiba di alamat tujuan.", "location": null, "code": "F980" }, { "timestamp": "2026-03-02T05:02:10Z", "localTime": null, "status": "out_for_delivery", "description": "Pesanan dalam proses pengantaran.", "location": "Example Hub", "code": "F600" }, { "timestamp": "2026-03-01T01:30:00Z", "localTime": null, "status": "label_created", "description": "Pengirim telah mengatur pengiriman.", "location": null, "code": "F000" } ] } ``` ## Notes - **Source**: SPX's public tracking JSON on `spx.co.id`, shared by all five SPX countries (one factory, `platforms/spx.ts`). Hub names appear as the location when SPX gives one. - **Statuses**: mapped from SPX's milestone and event codes (`F980` delivered, `F600` out for delivery, `F650` failed attempt, `F999` returned to sender). - **Time zone**: Indonesia spans three zones, so only the UTC `timestamp` is given and `localTime` is `null`. Descriptions are in Indonesian. - **Unknown numbers**: SPX answers an error body for numbers it has no record of, returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SPX Express Malaysia Tracking API & MCP URL: https://docs.lastscanned.com/carriers/spxmy Query live **SPX Express Malaysia** (`spxmy`, Shopee Xpress) parcel status and scan history in a single synchronous request. Both the SPX number and the Shopee order number are accepted. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `spxmy` | | **Brand aliases** | SPX Malaysia, Shopee Xpress Malaysia, SPX MY | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SPXMY\d{11}[0-9A-Z]$/` | none | `SPXMY05985179327A` | | **Pass 2 (`mayMatch`)** | `/^MY\d{12}[0-9A-Z]$/` | none | none | These numbers belong to this carrier, so `?carrier=spxmy` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SPXMY05985179327A?carrier=spxmy" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "spxmy", "trackingNumber": "SPXMY05985179327A", "status": "delivered", "statusDescription": "Parcel has been delivered", "service": null, "deliveredAt": "2026-03-02T07:10:44Z", "deliveredAtLocal": "2026-03-02T15:10:44", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-02T07:10:44Z", "localTime": "2026-03-02T15:10:44", "status": "delivered", "description": "Parcel has been delivered", "location": null, "code": "F980" }, { "timestamp": "2026-03-02T05:02:10Z", "localTime": "2026-03-02T13:02:10", "status": "out_for_delivery", "description": "Parcel is out for delivery", "location": "Example Hub", "code": "F600" }, { "timestamp": "2026-03-01T01:30:00Z", "localTime": "2026-03-01T09:30:00", "status": "label_created", "description": "Sender is preparing to ship your parcel", "location": null, "code": "F000" } ] } ``` ## Notes - **Source**: SPX's public tracking JSON on `spx.com.my`, shared by all five SPX countries (one factory, `platforms/spx.ts`). Hub names appear as the location when SPX gives one. - **Statuses**: mapped from SPX's milestone and event codes (`F980` delivered, `F600` out for delivery, `F650` failed attempt, `F999` returned to sender). - **Time zone**: SPX sends epoch seconds; `localTime` is shown in Malaysian time (`Asia/Kuala_Lumpur`). - **Unknown numbers**: SPX answers an error body for numbers it has no record of, returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SPX Express Philippines Tracking API & MCP URL: https://docs.lastscanned.com/carriers/spxph Query live **SPX Express Philippines** (`spxph`, Shopee Xpress) parcel status and scan history in a single synchronous request. Both the SPX number and the Shopee order number are accepted. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `spxph` | | **Brand aliases** | SPX Philippines, Shopee Xpress Philippines, SPX PH | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SPXPH\d{10,16}[A-Z]?$/`, `/^SPEPH\d{11}[0-9A-Z]$/` | none | `PH2542959127193` | | **Pass 2 (`mayMatch`)** | `/^PH\d{12,14}[A-Z]?$/` | none | none | These numbers belong to this carrier, so `?carrier=spxph` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/PH2542959127193?carrier=spxph" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "spxph", "trackingNumber": "PH2542959127193", "status": "delivered", "statusDescription": "Parcel has been delivered", "service": null, "deliveredAt": "2026-03-02T07:10:44Z", "deliveredAtLocal": "2026-03-02T15:10:44", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-02T07:10:44Z", "localTime": "2026-03-02T15:10:44", "status": "delivered", "description": "Parcel has been delivered", "location": null, "code": "F980" }, { "timestamp": "2026-03-02T05:02:10Z", "localTime": "2026-03-02T13:02:10", "status": "out_for_delivery", "description": "Parcel is out for delivery", "location": null, "code": "F600" }, { "timestamp": "2026-03-01T01:30:00Z", "localTime": "2026-03-01T09:30:00", "status": "label_created", "description": "Sender is preparing to ship your parcel", "location": null, "code": "F000" } ] } ``` ## Notes - **Source**: SPX's public tracking JSON on `spx.ph`, shared by all five SPX countries (one factory, `platforms/spx.ts`). Hub names appear as the location when SPX gives one. - **Statuses**: mapped from SPX's milestone and event codes (`F980` delivered, `F600` out for delivery, `F650` failed attempt, `F999` returned to sender). - **Time zone**: SPX sends epoch seconds; `localTime` is shown in Philippine time (`Asia/Manila`). - **Unknown numbers**: SPX answers an error body for numbers it has no record of, returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SPX Express Thailand Tracking API & MCP URL: https://docs.lastscanned.com/carriers/spxth Query live **SPX Express Thailand** (`spxth`, Shopee Xpress) parcel status and scan history in a single synchronous request. Both the SPX number and the Shopee order number are accepted. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `spxth` | | **Brand aliases** | SPX Thailand, Shopee Xpress Thailand, SPX TH | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SPXTH\d{11}[0-9A-Z]$/` | none | `TH253387116642V` | | **Pass 2 (`mayMatch`)** | `/^TH\d{12}[0-9A-Z]?$/` | none | none | `SPXTH…` numbers belong to this carrier. For a `TH…` number such as `TH253387116642V`, pass `?carrier=spxth`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/TH253387116642V?carrier=spxth" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "spxth", "trackingNumber": "TH253387116642V", "status": "delivered", "statusDescription": "พัสดุถูกจัดส่งสำเร็จแล้ว", "service": null, "deliveredAt": "2026-03-02T07:10:44Z", "deliveredAtLocal": "2026-03-02T14:10:44", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-02T07:10:44Z", "localTime": "2026-03-02T14:10:44", "status": "delivered", "description": "พัสดุถูกจัดส่งสำเร็จแล้ว", "location": null, "code": "F980" }, { "timestamp": "2026-03-02T05:02:10Z", "localTime": "2026-03-02T12:02:10", "status": "out_for_delivery", "description": "พัสดุกำลังจัดส่ง", "location": null, "code": "F600" }, { "timestamp": "2026-03-01T01:30:00Z", "localTime": "2026-03-01T08:30:00", "status": "label_created", "description": "ผู้ส่งกำลังเตรียมพัสดุ", "location": null, "code": "F000" } ] } ``` ## Notes - **Source**: SPX's public tracking JSON on `spx.co.th`, shared by all five SPX countries (one factory, `platforms/spx.ts`). Hub names appear as the location when SPX gives one. - **Statuses**: mapped from SPX's milestone and event codes (`F980` delivered, `F600` out for delivery, `F650` failed attempt, `F999` returned to sender). - **Language and time zone**: descriptions are in Thai; `localTime` is Thai time (`Asia/Bangkok`). The bare Shopee form (`TH` + 12 digits + letter) is also claimed by Flash Express in auto-detection, so pass `?carrier=spxth` for those. - **Unknown numbers**: SPX answers an error body for numbers it has no record of, returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SPX Express Vietnam Tracking API & MCP URL: https://docs.lastscanned.com/carriers/spxvn Query live **SPX Express Vietnam** (`spxvn`, Shopee Xpress) parcel status and scan history in a single synchronous request. Both the SPX number and the Shopee order number are accepted. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `spxvn` | | **Brand aliases** | SPX Vietnam, Shopee Xpress Vietnam, SPX VN | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SPXVN\d{11}[0-9A-Z]$/` | none | `SPXVN051474089339` | | **Pass 2 (`mayMatch`)** | `/^VN\d{12}[0-9A-Z]$/` | none | none | These numbers belong to this carrier, so `?carrier=spxvn` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SPXVN051474089339?carrier=spxvn" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "spxvn", "trackingNumber": "SPXVN051474089339", "status": "delivered", "statusDescription": "Giao hàng thành công", "service": null, "deliveredAt": "2026-03-02T07:10:44Z", "deliveredAtLocal": "2026-03-02T14:10:44", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-02T07:10:44Z", "localTime": "2026-03-02T14:10:44", "status": "delivered", "description": "Giao hàng thành công", "location": null, "code": "F980" }, { "timestamp": "2026-03-02T05:02:10Z", "localTime": "2026-03-02T12:02:10", "status": "out_for_delivery", "description": "Đơn hàng đang được giao", "location": null, "code": "F600" }, { "timestamp": "2026-03-01T01:30:00Z", "localTime": "2026-03-01T08:30:00", "status": "label_created", "description": "Người gửi đang chuẩn bị hàng", "location": null, "code": "F000" } ] } ``` ## Notes - **Source**: SPX's public tracking JSON on `spx.vn`, shared by all five SPX countries (one factory, `platforms/spx.ts`). Hub names appear as the location when SPX gives one. - **Statuses**: mapped from SPX's milestone and event codes (`F980` delivered, `F600` out for delivery, `F650` failed attempt, `F999` returned to sender). - **Language and time zone**: descriptions are in Vietnamese; `localTime` is Vietnamese time (`Asia/Ho_Chi_Minh`). - **Unknown numbers**: SPX answers an error body for numbers it has no record of, returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Stallion Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/stallionexpress Query live **Stallion Express** (`stallionexpress`, Canadian shipping platform) status and scan history, plus the partner carrier's number. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `stallionexpress` | | **Brand aliases** | Stallion, stallion.ca | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^(SE)?2\d(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])[0-9A-Z]{4}$/` | none | `260315ABC1` | Pass `?carrier=stallionexpress` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/260315ABC1?carrier=stallionexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "stallionexpress", "trackingNumber": "260315ABC1", "status": "delivered", "statusDescription": "Delivered, In/At Mailbox", "service": "US Economy", "deliveredAt": "2026-03-20T21:07:00Z", "deliveredAtLocal": "2026-03-20T21:07:00", "signedBy": null, "destination": { "city": "Denver", "state": "CO", "country": "US" }, "message": "Handed to USPS as 260315ABC1", "events": [ { "timestamp": "2026-03-20T21:07:00Z", "localTime": "2026-03-20T21:07:00", "status": "delivered", "description": "Delivered, In/At Mailbox", "location": "DENVER", "code": null }, { "timestamp": "2026-03-20T11:30:00Z", "localTime": "2026-03-20T11:30:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "DENVER", "code": null }, { "timestamp": "2026-03-15T15:06:00Z", "localTime": "2026-03-15T15:06:00", "status": "in_transit", "description": "Picked Up by Shipping Partner, USPS Awaiting Item", "location": "NIAGARA FALLS", "code": null } ] } ``` ## Notes - **Source**: stallion.ca's tracking form (WordPress ajax). A leading `SE` is dropped. - **Time zone**: Stallion gives UTC; `localTime` repeats the UTC clock time. - **Handoff**: the partner (USPS, Canada Post…) and its number come back in `message`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Starex Tracking API & MCP URL: https://docs.lastscanned.com/carriers/starex Query live **Starex** (`starex`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `STR` + two country letters + 12 digits. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `starex` | | **Brand aliases** | Starex, Starex Global, Starex Azerbaijan, STRAZ | | **Category** | Parcel forwarder (Azerbaijan, Uzbekistan) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=STRAZ605859592152,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^STR[A-Z]{2}\d{12}$/` | none | `STRAZ605859592152` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/STRAZ605859592152?carrier=starex" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "starex", "trackingNumber": "STRAZ605859592152", "status": "delivered", "statusDescription": "Delivered: The package has been successfully delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-05-01T14:23:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-05-01T14:23:00", "status": "delivered", "description": "Delivered: The package has been successfully delivered", "location": null, "code": "delivered" }, { "timestamp": null, "localTime": "2026-04-30T13:35:00", "status": "exception", "description": "Ready for Pickup: The package is ready for pickup at the branch.", "location": null, "code": "ready_for_pickup" }, { "timestamp": null, "localTime": "2026-04-29T15:15:00", "status": "in_transit", "description": "Customs Cleared: The package has successfully cleared customs.", "location": null, "code": "import_customs_released" }, { "timestamp": null, "localTime": "2026-03-23T22:33:00", "status": "label_created", "description": "Confirm Package: The package must be confirmed to continue processing.", "location": null, "code": "waiting_for_confirmation" } ] } ``` ## Notes - **Status codes**: `code` is Starex's own step (`waiting_for_confirmation`, `accepted_at_facility`, `export_customs_clearance`, `import_customs_released`, `sorting`, `in_transit`, `ready_for_pickup`, `delivered`). A parcel waiting at a branch (`ready_for_pickup`) reports `exception`. - **Time zone**: Starex prints `dd-mm-yyyy hh:mm` with no zone, so `timestamp` is `null`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # StarGlobal Tracking API & MCP URL: https://docs.lastscanned.com/carriers/starglobal Query live **StarGlobal** (`starglobal`) package status and scan history in a single synchronous `GET` request or MCP tool call. StarGlobal numbers share their shape with other carriers' numbers, so pass `?carrier=starglobal`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `starglobal` | | **Brand aliases** | StarGlobal, 星环球物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=starglobal` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=starglobal` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | StarGlobal tracking numbers have no shape of their own, so always pass `?carrier=starglobal`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to StarGlobal in one request. - **Platform**: StarGlobal runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Starken Tracking API & MCP URL: https://docs.lastscanned.com/carriers/starken Query live **Starken (Chile)** (`starken`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `starken` | | **Brand aliases** | Starken, Starken Chile, Starken OF | | **Category** | Regional parcels (Chile) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | `261538238` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | OF number (6-12 digits) | `^\d{6,12}$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=starken`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/261538238?carrier=starken" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "starken", "trackingNumber": "261538238", "status": "delivered", "statusDescription": "ENTREGADO A DESTINATARIO", "service": "Domicilio", "deliveredAt": null, "deliveredAtLocal": "2026-01-14T11:44:29", "signedBy": "MARIA***********", "destination": { "city": "Talca", "state": "VII Maule", "country": "CL" }, "estimatedDelivery": "2026-01-17", "events": [ { "timestamp": null, "localTime": "2026-01-14T11:44:29", "status": "delivered", "description": "ENTREGADO A DESTINATARIO", "location": "Centro Distribucion Regional", "code": "1" }, { "timestamp": null, "localTime": "2026-01-14T08:04:22", "status": "out_for_delivery", "description": "EN REPARTO A DOMICILIO", "location": "Hub Talca", "code": "9" }, { "timestamp": null, "localTime": "2026-01-12T21:33:36", "status": "in_transit", "description": "EN TRANSITO HACIA SUCURSAL HUB TALCA", "location": "Centro Distribucion Regional", "code": "6" } ] } ``` ## Notes - **Local time only**: scan times are Chilean local time (`America/Santiago`, whose DST schedule has changed over the years), so `timestamp` is `null`. - **Signed by**: the carrier masks the recipient's name (`MARIA***********`), and `signedBy` is that masked text. - **Not found**: an OF number Starken does not know returns `not_found`. - A bare 6-12 digit OF number is not unique to Starken, so pass `?carrier=starken`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ST Courier (India) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/stcourier Query live **ST Courier** (`stcourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. ST Courier AWBs are 11 digits, a shape other carriers share, so pass `?carrier=stcourier`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `stcourier` | | **Brand aliases** | ST Courier, S.T. Courier, ST Courier India, STC | | **Category** | Domestic courier (India) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=64172872315,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/64172872315?carrier=stcourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "stcourier", "trackingNumber": "64172872315", "status": "delivered", "statusDescription": "Delivered to MR.EXAMPLE NAME", "service": null, "deliveredAt": "2026-02-12T13:54:00Z", "deliveredAtLocal": "2026-02-12T19:24:00", "signedBy": "MR.EXAMPLE NAME", "destination": null, "events": [ { "timestamp": "2026-02-12T13:54:00Z", "localTime": "2026-02-12T19:24:00", "status": "delivered", "description": "Delivered to MR.EXAMPLE NAME", "location": null, "code": null }, { "timestamp": "2026-02-10T13:17:00Z", "localTime": "2026-02-10T18:47:00", "status": "in_transit", "description": "Forwarded to UPS", "location": null, "code": null }, { "timestamp": "2026-02-09T13:33:00Z", "localTime": "2026-02-09T19:03:00", "status": "in_transit", "description": "Received at Hub", "location": "Example hub, TN", "code": null } ] } ``` ## Notes - **Time zone**: Indian Standard Time (`Asia/Kolkata`). - **Handoff**: a `Forwarded to UPS` scan names the next carrier but ST Courier does not show its number, so there is no `message`. - **Session**: ST Courier files the number in the visitor's session, so a lookup is two requests (a POST then a GET) sharing one cookie. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # STO Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sto Query live **STO Express** (`sto`) package status and scan history in a single synchronous `GET` request or MCP tool call. STO numbers share their shape with other carriers, so pass `?carrier=sto`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sto` | | **Brand aliases** | STO Express, 申通快递, 申通 | | **Category** | Regional (China domestic parcels) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=sto` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=sto` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | STO waybills are 12 to 15 digits (for example `77xxxxxxxxxxxxx`), a shape other carriers also use, so they are not auto-detected: pass `?carrier=sto`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/772081358264432?carrier=sto" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sto", "trackingNumber": "772081358264432", "status": "delivered", "statusDescription": "【驿站】包裹已签收!", "service": null, "deliveredAt": "2026-10-01T05:40:37Z", "deliveredAtLocal": "2026-10-01T13:40:37", "signedBy": "凭取件码签收", "destination": null, "message": null, "events": [ { "timestamp": "2026-10-01T05:40:37Z", "localTime": "2026-10-01T13:40:37", "status": "delivered", "description": "【驿站】包裹已签收!", "location": "海南省, 定安县, 海南定安县公司", "code": "客户签收" }, { "timestamp": "2026-09-30T14:20:16Z", "localTime": "2026-09-30T22:20:16", "status": "in_transit", "description": "【海口市】快件已发往 海南定安县公司", "location": "海南省, 海口市, 海南海口转运中心", "code": "发件" } ] } ``` ## Notes - **Language**: STO's scan text is Chinese. `code` holds the scan type (收件 collected, 发件 departed, 到件 arrived, 派件 out for delivery, 驿站代收 left at a pickup point, 客户签收 signed). - **Time zone**: scans are in China time (UTC+8); `timestamp` is converted from that. - **Unknown numbers**: STO answers an empty list, returned as `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Straightship Tracking API & MCP URL: https://docs.lastscanned.com/carriers/straightship Query live **Straightship** (`straightship`, Canadian B2C parcels) status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `straightship` | | **Brand aliases** | Straight Ship | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^STR(TD\d{9}|TD\d{16,17}|CA\d{13})$/` | none | `STRTD917564850` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to this carrier, so `?carrier=straightship` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/STRTD917564850?carrier=straightship" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "straightship", "trackingNumber": "STRTD917564850", "status": "delivered", "statusDescription": "Delivered (Nanaimo, BC)", "service": null, "deliveredAt": "2026-03-03T23:29:28Z", "deliveredAtLocal": "2026-03-03T23:29:28", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-03T23:29:28Z", "localTime": "2026-03-03T23:29:28", "status": "delivered", "description": "Delivered (Nanaimo, BC)", "location": "Nanaimo, BC", "code": null }, { "timestamp": "2026-03-03T19:33:50Z", "localTime": "2026-03-03T19:33:50", "status": "out_for_delivery", "description": "Package will be delivered before 9:00pm (Nanaimo, BC)", "location": "Nanaimo, BC", "code": null }, { "timestamp": "2026-02-26T00:39:37Z", "localTime": "2026-02-26T00:39:37", "status": "label_created", "description": "Package information is created in the system", "location": null, "code": null } ] } ``` ## Notes - **Source**: Straightship's public tracking page, server-rendered. - **Time zone**: the page states its timestamps are UTC; `localTime` repeats the UTC clock time. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Sundarban Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sundarbancourier Query live **Sundarban Courier** (`sundarbancourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. Sundarban Courier numbers have no shape that is theirs alone, so pass `?carrier=sundarbancourier`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sundarbancourier` | | **Brand aliases** | Sundarban Courier, Sundarban, Sundarban Courier Service, SCS Bangladesh | | **Category** | Domestic courier (Bangladesh) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=10123000012345,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/10123000012345?carrier=sundarbancourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "sundarbancourier", "trackingNumber": "10123000012345", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-08-06", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-08-06", "status": "delivered", "description": "Delivered", "location": "হাব কল্যাণপুর", "code": null }, { "timestamp": null, "localTime": "2026-08-06", "status": "out_for_delivery", "description": "Out for Delivery", "location": "হাব কল্যাণপুর", "code": null }, { "timestamp": null, "localTime": "2026-08-04", "status": "label_created", "description": "Booking Complete", "location": "ঢাকা মহাখালী", "code": null } ] } ``` ## Notes - **Dates only**: scans carry a date and no time of day, so `localTime` is a date and `timestamp` is `null`. Branch names are in Bangla. - **Hops**: `Out for Destination` scans name the next hub (`Out for Destination to `). - **Auto-detection**: CN numbers are plain digits, so pass `?carrier=sundarbancourier`. Not found is an empty array. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # SunYou (SYPost) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sunyou Query live **SunYou / SYPost** (`sunyou`, 顺友物流) cross-border package status, scan history, and **destination last-mile handoff numbers** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 13-character `SY…` waybills in Pass 1 and returns a normalized `TrackingResult` JSON payload—without requiring a SunYou merchant account or API key. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sunyou` | | **Brand & service aliases** | SunYou (顺友物流), SYPost, Sunyou Logistics (`sypost.net`), `SY…` | | **Category** | Chinese cross-border e-commerce logistics carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SYUS...,SYGB...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for SunYou / SYPost - **Clean JSON instead of SYPost JSONP callbacks**: SunYou's public tracker (`sypost.net`) wraps responses in JSONP `searchCallback({...})` payloads with oldest-first scan arrays and mislabels destination-country scans (status `2xx` in the US, UK, or Australia) with China's `"+08:00"` timezone offset. `lastscanned` unwraps the payload, reverses the scan timeline to newest-first, filters out bogus `+08:00` offsets on non-UTC+8 destination scans, and maps SunYou's `displayStatus` and `eventCode` values into the 7 standard statuses. - **Automatic last-mile carrier & exchange number extraction**: Once SunYou hands an AliExpress or marketplace parcel to a destination carrier ([USPS](https://docs.lastscanned.com/carriers/usps), Royal Mail, [SpeedX](https://docs.lastscanned.com/carriers/speedx), [UniUni](https://docs.lastscanned.com/carriers/uniuni), Australia Post), `lastscanned` extracts `carrierName` and the secondary `trackingNumber` into top-level `message` (e.g. `"Handed to USPS as 9261290312839104827163"`). ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) SunYou is evaluated **twenty-eighth (#28)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SY[A-Z]{2}\d{9}$/i` (`SY` + 2 letters + 9 digits = 13 chars; the 2 letters typically indicate destination country or product code) | — | `SYGB024500000`, `SYUS016825135`, `SYRM120273923`, `SYAE009517613` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### Disambiguating SunYou (`SY…`) vs UPU S10 numbers - **Zero collision with UPU S10 international numbers**: Standard UPU S10 numbers end with a 2-letter ISO country code (`SYGB024500000`, `SYGB024500000`, `SYGB024500000`), whereas SunYou's 13-character numbers put the 4 letters at the beginning (`SY` + 2 letters + 9 digits). All `SY[A-Z]{2}\d{9}` numbers auto-detect in Pass 1 without `?carrier=`. - **When `?carrier=sunyou` is required**: If you are querying a non-`SY` partner tracking number (`LP…`, `SYB…` reference) directly against SunYou. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/SYGB024500000?carrier=sunyou" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/SYGB024500000?carrier=sunyou", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.message, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "SYUS016825135" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "sunyou", "trackingNumber": "SYGB024500000", "status": "delivered", "statusDescription": "Delivered, In/At Mailbox", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-25T13:18:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": "Handed to USPS as 9200190312839104827163", "events": [ { "timestamp": null, "localTime": "2026-10-25T13:18:00", "status": "delivered", "description": "Delivered, In/At Mailbox", "location": "AUSTIN, TX, United States", "code": "Delivered_Mailbox" }, { "timestamp": null, "localTime": "2026-10-25T07:10:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "AUSTIN, TX, United States", "code": "OutForDelivery" }, { "timestamp": "2026-10-19T15:30:00Z", "localTime": "2026-10-19T23:30:00", "status": "in_transit", "description": "Departed Sunyou Facility, Carrier Tracking Number: 9200190312839104827163", "location": "Shenzhen, China", "code": "Dispatch" }, { "timestamp": "2026-10-18T02:14:00Z", "localTime": "2026-10-18T10:14:00", "status": "label_created", "description": "Pre-Shipment Info Sent to Destination", "location": "China", "code": "PreAlert" } ] } ``` > **Raw status & event codes**: `events[].code` preserves SunYou's milestone identifier (`"PreAlert"`, `"InboundScan"`, `"Dispatch"`, `"PortArrival"`, `"ClearanceSuccessed_Export"`, `"PortDeparture"`, `"DestinationAirPortArrival"`, `"ClearanceSuccessed"`, `"HandoverLastMile"`, `"OutForDelivery"`, `"DeliveryFail_"`, `"Delivered"`, `"Delivered_Mailbox"`, `"Returned"`). ## Related Resources - **Live browser lookup tool**: [Track a SunYou package live on lastscanned.com/lookup/sunyou](https://lastscanned.com/lookup/sunyou) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # SwiftX Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/swiftx Query live **SwiftX Express** (`swiftx`) parcel status in a single synchronous `GET` request or MCP tool call. SwiftX delivers Cainiao (AliExpress) parcels across the US, and `lastscanned` auto-detects its `SWX` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `swiftx` | | **Brand aliases** | SwiftX, SwiftX Express (`swiftx-express.com`) | | **Category** | US last-mile parcel carrier (Cainiao) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SWX421890000223565246,...` (up to 20 SwiftX numbers per tracker request) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^SWX\d{18}$/` (`SWX` + 18 digits = 21 chars) | none | `SWX421890000223565246` | | **Pass 2 (`mayMatch`)** | none | none | none | `SWX` numbers are auto-detected, so `?carrier=swiftx` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SWX421890000223565246" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "swiftx", "trackingNumber": "SWX421890000223565246", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-11-02T15:27:45", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": "SwiftX shows its scan history only with the last 4 digits of the recipient's phone number; this is the parcel's current step.", "events": [ { "timestamp": null, "localTime": "2026-11-02T15:27:45", "status": "delivered", "description": "Delivered", "location": null, "code": "step 5" } ] } ``` ## Notes - **Current step, not every scan**: SwiftX's tracker shows the full scan list only to someone who enters the last 4 digits of the recipient's phone number. Without them it gives the parcel's step on a five-step bar (Label created, Picked up, In transit, Out for delivery, Delivered) and when that step was last updated. `lastscanned` returns that step as one event (`code` is `step 1` to `step 5`) and says so in `message`. - **Statuses**: Label created maps to `label_created`; Picked up and In transit to `in_transit`; Out for delivery to `out_for_delivery`; Delivered to `delivered`. - **Time zone**: SwiftX gives the update time with no zone, so only `localTime` is set and `timestamp` is `null`. - **Bot wall**: swiftx-express.com puts its tracker behind a Cloudflare challenge, so lookups run in a cloud browser and take about 10 to 15 seconds. A batch of up to 20 numbers shares one browser session. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **Upstream consolidator**: [Cainiao](https://docs.lastscanned.com/carriers/cainiao) # Swiss Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/swisspost Query live **Swiss Post** (`swisspost`, Die Post / La Poste Suisse) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `CH` (with a valid check digit) and the 18-digit domestic parcel numbers that start with `99`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `swisspost` | | **Brand & service aliases** | Swiss Post, Die Schweizerische Post, La Poste Suisse, PostPac, Meine Sendungen | | **Category** | National post (Switzerland) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=996013273002019507,996013273002019507` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | UPU S10 ending `CH`, or `99` + 16 digits (printed `99.00.996013273002019507.996013273002019507`) | S10 mod 11 for the S10 form | `996013273002019507`, `996013273002019507` | | **Pass 2 (`mayMatch`)** | *None* | — | — | Dots and spaces in the domestic form are ignored. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/996013273002019507?carrier=swisspost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "996013273002019507" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "swisspost", "trackingNumber": "996013273002019507", "status": "in_transit", "statusDescription": "Arrival at the delivery point", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-26T06:41:00Z", "localTime": "2026-10-26T07:41:00", "status": "in_transit", "description": "Arrival at the delivery point", "location": "8010 Zürich", "code": "1100" } ] } ``` ## Status Notes - Swiss Post's scans are codes, not text. The adapter turns them into wording with the same public text bundle the tracking page uses, and falls back to the partner carrier's own description or the bare code. - Scan times are Swiss local time (`Europe/Zurich`). - The shipment-level state (delivered, missed delivery, returned) overrides the newest scan's status when Swiss Post reports one. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Swiss Post Cargo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/swisspostcargo Query live **Swiss Post Cargo** (`swisspostcargo`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `swisspostcargo` | | **Brand aliases** | Swiss Post Cargo, Swisspost Cargo, Post CH Cargo, SSCC | | **Category** | Swiss freight and pallet delivery | | **Region** | Switzerland | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=00876401518210952508,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Swiss Post Cargo's 20-digit SSCC shape is also claimed by FedEx's auto-detection, so pass `?carrier=swisspostcargo`. The parcel service `swisspost` is a separate carrier. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/00876401518210952508?carrier=swisspostcargo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "swisspostcargo", "trackingNumber": "00876401518210952508", "status": "delivered", "statusDescription": "Signed for", "service": null, "deliveredAt": "2026-02-09T09:06:46Z", "deliveredAtLocal": "2026-02-09T10:06:46", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-09T09:06:46Z", "localTime": "2026-02-09T10:06:46", "status": "delivered", "description": "Delivered", "location": "Genève, Genève", "code": "POD" }, { "timestamp": "2026-02-09T06:52:57Z", "localTime": "2026-02-09T07:52:57", "status": "out_for_delivery", "description": "Loaded for delivery", "location": null, "code": "SCA" }, { "timestamp": "2026-02-06T12:33:19Z", "localTime": "2026-02-06T13:33:19", "status": "in_transit", "description": "Received at depot", "location": "Depot Meyrin / Geneve", "code": "RFS" }, { "timestamp": "2026-02-05T14:07:02Z", "localTime": "2026-02-05T15:07:02", "status": "label_created", "description": "Shipment data received", "location": null, "code": "NTF" } ] } ``` ## Notes - **Language**: the API words scans in German; the adapter replaces the five codes it has seen (`NTF`, `RFS`, `SCA`, `POD`, `SIG`) with English and keeps the carrier's text for any other code. - **Time zone**: scan times are Swiss local time (`Europe/Zurich`). - **Same-time scans**: delivery (`POD`) and signature (`SIG`) arrive with the same second. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TDE Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/sztdgyl Query live **TDE Logistics** (`sztdgyl`) package status and scan history in a single synchronous `GET` request or MCP tool call. TDE Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=sztdgyl`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `sztdgyl` | | **Brand aliases** | TDE Logistics, 通达供应链 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=sztdgyl` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=sztdgyl` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | TDE Logistics tracking numbers have no shape of their own, so always pass `?carrier=sztdgyl`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to TDE Logistics in one request. - **Platform**: TDE Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Tanzania Posts Corporation Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tanzaniaposts Query live **Tanzania Posts Corporation** (`tanzaniaposts`) package status and scan history in a single synchronous `GET` request or MCP tool call. The shape belongs to Tanzania Posts Corporation alone, so `?carrier=tanzaniaposts` is optional for it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tanzaniaposts` | | **Brand aliases** | Tanzania Posts Corporation, Tanzania Posts, TPC, Posta Tanzania, Tanzania Post | | **Category** | National post, Tanzania (UPU S10 items) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=EE245907820TZ,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("TZ")`: `/^[A-Z]{2}\d{9}TZ$/` | UPU S10 | `EE245907820TZ` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/EE245907820TZ?carrier=tanzaniaposts" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tanzaniaposts", "trackingNumber": "EE245907820TZ", "status": "delivered", "statusDescription": "Delivered to J. DOE", "service": null, "deliveredAt": "2026-06-28T10:44:51Z", "deliveredAtLocal": "2026-06-28T13:44:51", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-06-28T10:44:51Z", "localTime": "2026-06-28T13:44:51", "status": "delivered", "description": "Delivered to J. DOE", "location": null, "code": null }, { "timestamp": "2026-06-28T06:17:25Z", "localTime": "2026-06-28T09:17:25", "status": "in_transit", "description": "Received at Office of Dispatch", "location": null, "code": null }, { "timestamp": "2026-06-24T09:07:59Z", "localTime": "2026-06-24T12:07:59", "status": "in_transit", "description": "Acceptance", "location": "Mbozi Hpo", "code": null } ] } ``` ## Notes - **Time zone**: Tanzania is UTC+3 all year; `timestamp` is converted from it. The site prints a 24-hour clock with a stray AM/PM, which is dropped. - **Page, not API**: the item data comes as an HTML fragment in a JSON wrapper (`status: Success`, `temp`); the tracking table is parsed. Not found is `status: Error`. - **Slow site**: lookups can take several seconds. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Taxydema Tracking API & MCP URL: https://docs.lastscanned.com/carriers/taxydema Query live **Taxydema** (`taxydema`) package status and scan history in a single synchronous `GET` request or MCP tool call. Taxydema numbers have no shape that is theirs alone, so pass `?carrier=taxydema`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `taxydema` | | **Brand aliases** | Taxydema, Taxydema Greece, Ταχυδέμα | | **Category** | Domestic courier, Greece | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=400000973541,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/400000973541?carrier=taxydema" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "taxydema", "trackingNumber": "400000973541", "status": "delivered", "statusDescription": "Η αποστολή παραδόθηκε στον παραλήπτη", "service": null, "deliveredAt": "2026-02-12T08:19:13Z", "deliveredAtLocal": "2026-02-12T10:19:13", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-12T08:19:13Z", "localTime": "2026-02-12T10:19:13", "status": "delivered", "description": "Η αποστολή παραδόθηκε στον παραλήπτη", "location": "ΚΑΛΛΙΘΕΑ ΤΧ", "code": null }, { "timestamp": "2026-02-12T06:29:02Z", "localTime": "2026-02-12T08:29:02", "status": "out_for_delivery", "description": "Ανάθεση αποστολής για παράδοση σε διανομέα", "location": "ΚΑΛΛΙΘΕΑ ΤΧ", "code": null }, { "timestamp": "2026-02-10T08:13:15Z", "localTime": "2026-02-10T10:13:15", "status": "in_transit", "description": "Άφιξη τεμαχίου στο Σταθμό Παράδοσης ΚΑΛΛΙΘΕΑ ΤΧ", "location": "ΚΑΛΛΙΘΕΑ ΤΧ", "code": null } ] } ``` ## Notes - **Time zone**: scan lines are `YYYY-MM-DD HH:MM:SS` in Greek local time (`Europe/Athens`); `timestamp` is converted from it. - **Status**: Greek wording is mapped for delivered, returned and out for delivery; the `delivered` milestone time decides `deliveredAt`. Notification (SMS) lines stay `in_transit` and do not change the status. - **Auto-detection**: 12-digit numbers are shared with other carriers, so pass `?carrier=taxydema`. The site refuses requests without a browser user agent, which the adapter sends. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # T-cat (Taiwan Pelican Express) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tcat Query live **T-cat (Taiwan Pelican Express)** (`tcat`) package status and scan history in a single synchronous `GET` request or MCP tool call. T-cat, the black cat parcel service of Taiwan Pelican Express (統一速達), is tracked through its public detail page. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tcat` | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=tcat` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=N1,N2&carrier=tcat` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule | Examples | |---|---|---| | **Pass 1 (`matches`)** | *None* | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | | **Explicit (`?carrier=tcat`)** | 12-digit tracking number | `907798809486` | This shape is shared with other carriers, so always pass `?carrier=tcat`. Scan times are Taiwan local time (`Asia/Taipei`). T-cat keeps three months of history. ## Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/907798809486?carrier=tcat" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tcat", "trackingNumber": "907798809486", "status": "in_transit", "statusDescription": "In transit", "service": null, "deliveredAt": null, "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-10-25T14:22:00", "status": "in_transit", "description": "In transit", "location": "Hub", "code": null } ] } ``` ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TCI Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tciexpress Query live **TCI Express** (`tciexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=tciexpress` (or the MCP `carrier` argument) so the lookup goes to TCI Express. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tciexpress` | | **Brand aliases** | TCI Express, TCI, Transport Corporation of India Express, tciexpress.in | | **Category** | Regional (express parcel and surface cargo, India) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=829434104,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Nine- or ten-digit dockets are a shape other carriers also use, so pass `?carrier=tciexpress`. Accepted shape: `^\d{9,10}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/829434104?carrier=tciexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tciexpress", "trackingNumber": "829434104", "status": "delivered", "statusDescription": "Shipment delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-20", "signedBy": null, "destination": { "city": "PUNE", "state": null, "country": "IN" }, "events": [ { "timestamp": null, "localTime": "2026-03-20", "status": "delivered", "description": "Shipment delivered", "location": null, "code": null }, { "timestamp": "2026-03-17T08:58:00Z", "localTime": "2026-03-17T14:28:00", "status": "in_transit", "description": "Arrived", "location": "XPNH (PUNE HUB)", "code": null }, { "timestamp": "2026-03-14T17:53:00Z", "localTime": "2026-03-14T23:23:00", "status": "in_transit", "description": "Despatched to XPNH (PUNE HUB)", "location": "XDEL (DELHI HUB)", "code": null }, { "timestamp": null, "localTime": "2026-03-12", "status": "in_transit", "description": "Booked", "location": "XJPR (JAIPUR BKG)", "code": null } ] } ``` ## Notes - **Scans**: the docket page lists the delivery rows, the booking and a hub-to-hub transhipment table. Each transhipment row becomes a `Despatched to …` scan (at the sending hub) and, once it has arrived, an `Arrived` scan (at the receiving hub). - **Time zone**: India has one offset (+05:30). Delivery and booking rows have a date only, so they carry `localTime` as a date and no `timestamp`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TCS Pakistan Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tcspakistan Query live **TCS Pakistan** (`tcspakistan`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=tcspakistan` (or the MCP `carrier` argument) so the lookup goes to TCS Pakistan. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tcspakistan` | | **Brand aliases** | TCS, TCS Pakistan, TCS Express, tcsexpress.com | | **Category** | Regional (courier, Pakistan) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=40617591178,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Eleven-digit consignment numbers are a shape other carriers also use, so pass `?carrier=tcspakistan`. Accepted shape: `^\d{11}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/40617591178?carrier=tcspakistan" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tcspakistan", "trackingNumber": "40617591178", "status": "delivered", "statusDescription": "Shipment Delivered", "service": null, "deliveredAt": "2026-03-12T05:10:00Z", "deliveredAtLocal": "2026-03-12T10:10:00", "signedBy": "ALI", "destination": { "city": "LAHORE", "state": null, "country": "PK" }, "events": [ { "timestamp": "2026-03-12T05:10:00Z", "localTime": "2026-03-12T10:10:00", "status": "delivered", "description": "Shipment Delivered", "location": "LAHORE", "code": null }, { "timestamp": "2026-03-12T03:30:00Z", "localTime": "2026-03-12T08:30:00", "status": "out_for_delivery", "description": "Out For Delivery", "location": null, "code": null }, { "timestamp": "2026-03-11T22:15:00Z", "localTime": "2026-03-12T03:15:00", "status": "in_transit", "description": "Arrived at TCS Facility", "location": "LAHORE", "code": null }, { "timestamp": "2026-03-11T14:40:00Z", "localTime": "2026-03-11T19:40:00", "status": "in_transit", "description": "Departed From TCS Facility", "location": "KARACHI", "code": null } ] } ``` ## Notes - **Signer**: the delivery checkpoint carries the receiver's name, returned as `signedBy`. - **Time zone**: Pakistan has one offset (+05:00). Times are converted only when both the origin and destination are in Pakistan, since an international parcel's scans may be elsewhere. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TDN Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tdn Query live **TDN** (`tdn`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=tdn` (or the MCP `carrier` argument) so the lookup goes to TDN. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tdn` | | **Brand aliases** | TDN, TDN Transporte y Distribucion Nacional, tdnonline.com | | **Category** | Regional (domestic parcel, Spain) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=999933300001,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | TDN's twelve-digit numbers start with `9999`, a shape FedEx's twelve-digit numbers also take, so pass `?carrier=tdn`. Accepted shape: `^9999\d{8}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/999933300001?carrier=tdn" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tdn", "trackingNumber": "999933300001", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-12T11:17:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-12T11:17:00", "status": "delivered", "description": "Entregado", "location": "MADRID", "code": null } ] } ``` ## Notes - **One scan**: TDN's page ends in one line, `Entregado - 028 MADRID - 12/03/2026 11:17` (status, delegation, date, time). That line is the only event, so `events` always has one entry. - **Time zone**: the delegations include the islands, so the time carries `localTime` only. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Tealca Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tealca Query live **Tealca** (`tealca`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=tealca` (or the MCP `carrier` argument) so the lookup goes to Tealca. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tealca` | | **Brand aliases** | Tealca, Tealca Venezuela, tealca.com | | **Category** | Regional (courier and parcel, Venezuela) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=84512525,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Six- to twelve-digit guías are a shape other carriers also use, so pass `?carrier=tealca`. Accepted shape: `^\d{6,12}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/84512525?carrier=tealca" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tealca", "trackingNumber": "84512525", "status": "delivered", "statusDescription": "Guía entregada a Maria Perez - 84512525", "service": null, "deliveredAt": "2026-03-12T14:20:00Z", "deliveredAtLocal": "2026-03-12T10:20:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-12T14:20:00Z", "localTime": "2026-03-12T10:20:00", "status": "delivered", "description": "Guía entregada a Maria Perez - 84512525", "location": null, "code": null }, { "timestamp": "2026-03-11T16:30:00Z", "localTime": "2026-03-11T12:30:00", "status": "in_transit", "description": "Recepción en tienda destino 3007 - TIPURO", "location": null, "code": null }, { "timestamp": "2026-03-10T19:15:00Z", "localTime": "2026-03-10T15:15:00", "status": "label_created", "description": "Guía creada con el número 84512525. En la tienda 2909.", "location": null, "code": null } ] } ``` ## Notes - **Wording**: scan text is Tealca's own Spanish; a scan's second line (for example `En la tienda 2909.`) is appended to the first. - **Time zone**: Venezuela has one offset (-04:00, no DST). The city and state on each scan repeat the shipment's origin, so `location` is left out. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Team Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/teamexpressae Query live **Team Express** (`teamexpressae`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=teamexpressae` (or the MCP `carrier` argument) so the lookup goes to Team Express. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `teamexpressae` | | **Brand aliases** | Team Express, Team Express Services, TES UAE, teamexpressme.com | | **Category** | Regional (express courier, UAE) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=RAKPOS20001488,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Team Express airwaybills are a letters-plus-digits shape other carriers also use, so pass `?carrier=teamexpressae`. Accepted shape: `^[A-Z]{3,8}\d{6,10}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/RAKPOS20001488?carrier=teamexpressae" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "teamexpressae", "trackingNumber": "RAKPOS20001488", "status": "delivered", "statusDescription": "DELIVERED", "service": "NEXT DAY DELIVERY - NDD", "deliveredAt": "2026-03-12T08:17:00Z", "deliveredAtLocal": "2026-03-12T12:17:00", "signedBy": null, "destination": { "city": "RAS AL KHAIMAH", "state": null, "country": "AE" }, "events": [ { "timestamp": "2026-03-12T08:17:00Z", "localTime": "2026-03-12T12:17:00", "status": "delivered", "description": "DELIVERED", "location": "RAS AL KHAIMAH", "code": null }, { "timestamp": "2026-03-12T05:21:00Z", "localTime": "2026-03-12T09:21:00", "status": "out_for_delivery", "description": "OUT FOR DELIVERY", "location": "RAS AL KHAIMAH", "code": null }, { "timestamp": "2026-03-11T18:16:00Z", "localTime": "2026-03-11T22:16:00", "status": "in_transit", "description": "SHIPMENT ARRIVED AT HUB FACILITY", "location": "DUBAI - UMM RAMOOL", "code": null }, { "timestamp": "2026-03-11T09:06:00Z", "localTime": "2026-03-11T13:06:00", "status": "label_created", "description": "SHIPMENT INFORMATION RECEIVED", "location": null, "code": null } ] } ``` ## Notes - **Service**: the details table's service type (for example `NEXT DAY DELIVERY - NDD`) is returned as `service`. - **Time zone**: the UAE has one offset (+04:00, no DST); the page prints 12-hour times, converted from `Asia/Dubai`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Team Global Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/teamglobalexpress Query live **Team Global Express** (`teamglobalexpress`, the former Toll IPEC and Toll Priority) consignment status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `teamglobalexpress` | | **Brand & service aliases** | Team Global Express, TGE, Toll IPEC, Toll Priority, MyParcel | | **Category** | Australian domestic freight and parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=teamglobalexpress` where noted below) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=218517752283,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=teamglobalexpress`)** | Team Global Express consignment numbers | — | `218517752283` | Consignment numbers have no shape that other carriers do not share, so they are not auto-detected: pass `?carrier=teamglobalexpress`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/218517752283?carrier=teamglobalexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/218517752283?carrier=teamglobalexpress", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "218517752283", "carrier": "teamglobalexpress" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "teamglobalexpress", "trackingNumber": "218517752283", "status": "in_transit", "statusDescription": "In transit", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": null, "events": [ { "timestamp": "2026-10-25T23:30:00Z", "localTime": "2026-10-26T10:30:00", "status": "in_transit", "description": "In transit", "location": "Chullora, NSW", "code": null }, { "timestamp": "2026-10-24T05:10:00Z", "localTime": "2026-10-24T15:10:00", "status": "in_transit", "description": "Picked up", "location": "Dandenong, VIC", "code": null } ] } ``` ## Status Notes - **Source**: the tracking form at `teamglobalexp.com/myparcel`, which has no JSON API. `lastscanned` loads the form, submits the number and reads the result the page embeds. - **Other business units**: consignments that belong to the group's other businesses are not shown on this page; for those the call fails with an error naming the site that tracks them. - **Times**: scan times are local with no zone. When the scan's state is a state code the zone is derived from it, otherwise only `localTime` is set. ## Related Resources - **Live browser lookup tool**: [Track a Team Global Express package live on lastscanned.com/lookup/teamglobalexpress](https://lastscanned.com/lookup/teamglobalexpress) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Team Worldwide Tracking API & MCP URL: https://docs.lastscanned.com/carriers/teamworldwide Query live **Team Worldwide** (`teamworldwide`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=teamworldwide` (or the MCP `carrier` argument) so the lookup goes to Team Worldwide. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `teamworldwide` | | **Brand aliases** | Team Worldwide, TeamTrac, Team Trac, teamww.com | | **Category** | Regional (freight forwarding and final-mile, United States) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=ATLM00090373R,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Team Bills are a letters-plus-digits shape other carriers also use, so pass `?carrier=teamworldwide`. Accepted shape: `^[A-Z]{3,5}\d{6,10}[A-Z]?$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/ATLM00090373R?carrier=teamworldwide" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "teamworldwide", "trackingNumber": "ATLM00090373R", "status": "delivered", "statusDescription": "SIGNED FOR BY: FRONT DESK", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-12T14:00:00", "signedBy": "FRONT DESK", "destination": { "city": "ATLANTA", "state": "GA", "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-03-12T14:00:00", "status": "delivered", "description": "SIGNED FOR BY: FRONT DESK", "location": null, "code": "POD" }, { "timestamp": null, "localTime": "2026-03-12T09:11:00", "status": "in_transit", "description": "IN TRANSIT", "location": null, "code": "ITR" }, { "timestamp": null, "localTime": "2026-03-10T15:07:00", "status": "in_transit", "description": "PICKED UP FROM SHIPPER", "location": null, "code": "PKU" }, { "timestamp": null, "localTime": "2026-03-05T13:01:00", "status": "label_created", "description": "SHIPMENT NOTIFICATION RECEIVED FROM API", "location": null, "code": "ESN" } ] } ``` ## Notes - **Codes**: `code` is TeamTrac's own (`ESN` notification received, `ACK` pickup acknowledged, `PKU` picked up, `ITR` in transit, `POD` signed for). - **Time zone**: scans happen across the US and the page prints no zone, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Teleship Tracking API & MCP URL: https://docs.lastscanned.com/carriers/teleship Query live **Teleship** (`teleship`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `teleship` | | **Brand aliases** | Teleship, Teleship UK, teleship.com | | **Category** | Cross-border (cross-border e-commerce, UK) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=TSGBUSSR9EMI013412826,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^TSGB[A-Z]{2}[A-Z0-9]{15}$/` | none | `TSGBUSSR9EMI013412826` | | **Pass 2 (`mayMatch`)** | none | none | none | `TSGB…` IDs belong to Teleship alone, so `?carrier=teleship` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/TSGBUSSR9EMI013412826?carrier=teleship" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "teleship", "trackingNumber": "TSGBUSSR9EMI013412826", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-12T16:20:11Z", "deliveredAtLocal": "2026-03-12T16:20:11", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-12T16:20:11Z", "localTime": "2026-03-12T16:20:11", "status": "delivered", "description": "Delivered", "location": null, "code": "S_900" }, { "timestamp": "2026-03-09T08:02:45Z", "localTime": "2026-03-09T08:02:45", "status": "in_transit", "description": "Shipment in transit", "location": null, "code": "S_300" }, { "timestamp": "2026-03-02T11:44:14Z", "localTime": "2026-03-02T11:44:14", "status": "label_created", "description": "Shipment info received by carrier", "location": null, "code": "S_102" } ] } ``` ## Notes - **Stages**: Teleship's `type` (`label_created`, `cancelled`, …) is used where it is known: a cancelled shipment reports `exception`. - **Time zone**: the API gives UTC only, so `localTime` is the UTC clock time. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TFM Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tfmexpress Query live **TFM Express** (`tfmexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=tfmexpress` (or the MCP `carrier` argument) so the lookup goes to TFM Express. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tfmexpress` | | **Brand aliases** | TFM Express, TFM, TFMEX, tfmex.com | | **Category** | Regional (express courier, UAE) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=971700329734,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Twelve-digit airwaybills are a shape other carriers also use, so pass `?carrier=tfmexpress`. Accepted shape: `^\d{12}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/971700329734?carrier=tfmexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tfmexpress", "trackingNumber": "971700329734", "status": "delivered", "statusDescription": "Shipment delivered to Consignee", "service": null, "deliveredAt": "2026-03-12T11:06:00Z", "deliveredAtLocal": "2026-03-12T15:06:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-12T11:06:00Z", "localTime": "2026-03-12T15:06:00", "status": "delivered", "description": "Shipment delivered to Consignee", "location": null, "code": null }, { "timestamp": "2026-03-12T06:46:00Z", "localTime": "2026-03-12T10:46:00", "status": "out_for_delivery", "description": "Shipment Out for Delivery", "location": null, "code": null }, { "timestamp": "2026-03-11T19:18:00Z", "localTime": "2026-03-11T23:18:00", "status": "in_transit", "description": "Received at HUB", "location": null, "code": null }, { "timestamp": "2026-03-11T13:39:00Z", "localTime": "2026-03-11T17:39:00", "status": "label_created", "description": "Shipment Created", "location": null, "code": null } ] } ``` ## Notes - **Time zone**: the page's `clientTimeZoneOffSetHour` field is sent as `4`, so it prints Gulf time (the UAE has no DST). `timestamp` is that time at +04:00. - **Activity**: `description` is the History table's Activity column (for example `Not at Home/Office`); a failed attempt reports `exception`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TForce Final Mile Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tforce Query live **TForce Final Mile / TForce Logistics** (`tforce`, formerly Dynamex) package status and scan history across the US and Canada in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 20-character `TF…` package IDs in Pass 1 (`matches`) and hyphenated order piece numbers (`NJ0342070-1`) in Pass 2 (`mayMatch`), returning a normalized `TrackingResult` JSON payload. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tforce` | | **Brand & service aliases** | TForce Final Mile, TForce Logistics, Dynamex (`tforcelogistics.com`, `direct.tfesg.com/finalmiletrack`) | | **Category** | US & Canadian final-mile parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=TF...,NJ...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for TForce Final Mile - **Structured JSON from TForce's HTML-only final-mile tracker**: TForce Logistics' public Final Mile tracker (`direct.tfesg.com/finalmiletrack`) renders multi-package HTML tables without a JSON endpoint and prints scan dates without a calendar year (e.g. `"Oct 24 - 5:43 PM EDT"`). `lastscanned` isolates the exact requested Package ID block, resolves the year and timezone offset (`EDT`, `EST`, `CDT`, `CST`, `MDT`, `MST`, `PDT`, `PST`, `ADT`, `AST`, `NDT`, `NST`), and returns structured JSON. - **Smart `"Returned To Sender"` & `"Shortage"` normalization**: When a TForce parcel is returning to the shipper, the trip back still prints as `"Out For Delivery"` in the scan rows while the summary `Status` row says `"Returned To Sender"`; similarly, when a shipper manifests a parcel without handing it over, TForce logs a `"Shortage"` row alongside *"Package information has been provided but the item has not been received"*. `lastscanned` reconciles both into `returned` and `label_created` respectively. - **Distinguishes recipient signatures from drop-off locations**: TForce's `"Delivered To"` field holds either a person's name or a drop-off spot (`"FRONT DOOR"`, `"PORCH"`, `"MAILROOM"`). `lastscanned` only populates `signedBy` when the value is an actual recipient signature. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) TForce Final Mile is evaluated **twenty-third (#23)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — `TF` Package ID** | `/^TF\d{18}$/i` (`TF` + 18 digits = 20 chars) | — | `TF105840000342954623` | | **Pass 2 (`mayMatch`) — Order Piece** | `/^[A-Z]{2}\d{7}-\d{1,2}$/i` (2-letter depot code + 7 digits + `-` + 1–2 digit piece number) | — | `NJ0342070-1`, `CD1524403-1` | ### When is `?carrier=tforce` required? - **Optional (auto-detected)**: All 20-character `TF` + 18-digit package IDs (Pass 1) and depot order piece numbers such as `NJ0342070-1` (Pass 2). - **Required (`?carrier=tforce`)**: Shipper-assigned reference numbers that TForce also delivers (such as Best Buy `BBYC…` references or cross-border labels handed to TForce under another carrier's barcode). Note that TForce's tracker covers shipments from the last **120 days**. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/TF105840000342954623?carrier=tforce" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/TF105840000342954623?carrier=tforce", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.destination, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "TF105840000342954623" } } ``` ### Normalized `TrackingResult` JSON response A real TForce parcel that came back to the shipper: the summary `Status` row says "Returned To Sender" while the newest scan, the trip back, prints as "Out For Delivery". ```json { "carrier": "tforce", "trackingNumber": "TF105840000342954623", "status": "returned", "statusDescription": "Returned To Sender", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Marina Del Rey", "state": "CA", "country": "US" }, "estimatedDelivery": null, "message": null, "events": [ { "timestamp": "2026-10-26T14:00:00Z", "localTime": "2026-10-26T07:00:00", "status": "out_for_delivery", "description": "Out For Delivery", "location": "COMMERCE, CA 90040", "code": null }, { "timestamp": "2026-10-18T05:00:00Z", "localTime": "2026-10-17T22:00:00", "status": "exception", "description": "Delivery Delayed", "location": "Marina Del Rey, CA 90292", "code": null }, { "timestamp": "2026-09-19T10:34:00Z", "localTime": "2026-09-19T03:34:00", "status": "in_transit", "description": "Received At Delivery Facility", "location": "COMMERCE, CA 90040", "code": null }, { "timestamp": "2026-09-18T22:09:00Z", "localTime": "2026-09-18T15:09:00", "status": "in_transit", "description": "Received At Sort Facility", "location": "Rialto, CA 92377", "code": null }, { "timestamp": "2026-09-18T20:35:00Z", "localTime": "2026-09-18T13:35:00", "status": "label_created", "description": "Manifested By Shipper", "location": null, "code": null } ] } ``` > **Note on TForce Final Mile vs TForce Freight**: This integration covers **TForce Final Mile / TForce Logistics** e-commerce parcel deliveries (`TF…` and order piece numbers) across the US and Canada, not LTL pallet freight PRO numbers. ## Related Resources - **Live browser lookup tool**: [Track a TForce Final Mile package live on lastscanned.com/lookup/tforce](https://lastscanned.com/lookup/tforce) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Tgroup Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tgroup Query live **Tgroup** (`tgroup`) package status and scan history in a single synchronous `GET` request or MCP tool call. The shape belongs to Tgroup alone, so `?carrier=tgroup` is optional for it. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tgroup` | | **Brand aliases** | Tgroup, T Group, T-Group, Tgroup SpA, T Group Italy | | **Category** | Domestic logistics and parcels, Italy | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=3010TGR82656617290945,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^3010TGR\d{14}$/` | none | `3010TGR82656617290945` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/3010TGR82656617290945?carrier=tgroup" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tgroup", "trackingNumber": "3010TGR82656617290945", "status": "delivered", "statusDescription": "Spedizione Consegnata", "service": null, "deliveredAt": "2026-08-03T08:37:00Z", "deliveredAtLocal": "2026-08-03T10:37:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-08-03T08:37:00Z", "localTime": "2026-08-03T10:37:00", "status": "delivered", "description": "Spedizione Consegnata", "location": "FIANO ROMANO", "code": null }, { "timestamp": "2026-07-31T08:14:00Z", "localTime": "2026-07-31T10:14:00", "status": "out_for_delivery", "description": "Affidata Al Giro Consegna", "location": null, "code": null }, { "timestamp": "2026-07-28T20:35:00Z", "localTime": "2026-07-28T22:35:00", "status": "in_transit", "description": "In Partenza Da Centro Smistamento", "location": "MELEGNANO", "code": null }, { "timestamp": "2026-07-28T10:17:00Z", "localTime": "2026-07-28T12:17:00", "status": "label_created", "description": "Nuova Spedizione Creata", "location": "SANDIGLIANO", "code": null } ] } ``` ## Notes - **Time zone**: `dd/mm/yyyy hh:mm` in Italian local time (`Europe/Rome`); `timestamp` is converted from it. - **Locations**: the depot comes as `158 - SANDIGLIANO`; the numeric depot code is dropped. - **Auto-detection**: the `3010TGR` prefix belongs to Tgroup alone, so `?carrier=tgroup` is optional. An unknown number answers `NUMERO SPEDIZIONE NON TROVATO`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Thailand Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/thailandpost Query live **Thailand Post** (`thailandpost`) international mail in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending in `TH`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `thailandpost` | | **Brand aliases** | Thailand Post, Thai Post, ไปรษณีย์ไทย | | **Category** | National post (Thailand), international mail | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=WB371672691TH,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `S10 *TH` with a valid check digit (`/^[A-Z]{2}\d{9}TH$/`) | S10 | `WB371672691TH` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/WB371672691TH?carrier=thailandpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "thailandpost", "trackingNumber": "WB371672691TH", "status": "delivered", "statusDescription": "Final delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-09-22T15:00:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-09-22T15:00:00", "status": "delivered", "description": "Final delivery", "location": "BKK", "code": "EMI" }, { "timestamp": "2026-09-13T12:12:00Z", "localTime": "2026-09-13T19:12:00", "status": "in_transit", "description": "Item presented to export Customs/Security", "location": "THBKKA", "code": "EXA" } ] } ``` ## Notes - **Source**: the JSON Thailand Post's own tracking page (track.thailandpost.co.th) reads. If that refuses, S10 numbers fall back to the UPU's public Global Track & Trace, and the rest to the same lookup run in a browser session. - **Coverage**: domestic and international items, with Thai post office names and times in Bangkok time (UTC+7). - **Times**: scans at a Thai office (code starting `TH`) are converted to UTC from Bangkok time. Other scans carry `localTime` only. - **Sample note**: the sample above is illustrative. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # The Courier Guy (South Africa) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/thecourierguy Query live **The Courier Guy** (`thecourierguy`) package status and scan history in a single synchronous `GET` request or MCP tool call. The Courier Guy numbers are not auto-detected: waybill numbers have no format that is unique to the carrier, so pass `?carrier=thecourierguy`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `thecourierguy` | | **Brand & service aliases** | The Courier Guy, TCG, ShipLogic (`thecourierguy.co.za`) | | **Category** | South African courier and parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=thecourierguy` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=TCG196191744T,...&carrier=thecourierguy` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for The Courier Guy - **Behind the Cloudflare page**: `thecourierguy.co.za` challenges plain requests, but the tracking portal's own API does not, so lookups need no browser. - **Waybill history**: collection, hub, out-for-delivery and delivery scans with their messages and locations. ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | *None* | — | — | | **Explicit (`?carrier=thecourierguy`)** | The Courier Guy waybill number | — | `TCG196191744T` | ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/TCG196191744T?carrier=thecourierguy" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/TCG196191744T?carrier=thecourierguy", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "TCG196191744T", "carrier": "thecourierguy" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "thecourierguy", "trackingNumber": "TCG196191744T", "status": "out_for_delivery", "statusDescription": "Out for delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-26T06:45:00Z", "localTime": "2026-10-26T08:45:00", "status": "out_for_delivery", "description": "Out for delivery", "location": "Johannesburg", "code": "out-for-delivery" }, { "timestamp": "2026-10-25T14:10:00Z", "localTime": "2026-10-25T16:10:00", "status": "in_transit", "description": "Arrived at the Johannesburg hub", "location": "Johannesburg", "code": "at-hub" }, { "timestamp": "2026-10-23T09:30:00Z", "localTime": "2026-10-23T11:30:00", "status": "in_transit", "description": "Collected from sender", "location": "Cape Town", "code": "collected" } ] } ``` ## Notes - **Times** carry their own offset; a time without one is read as South African time (`Africa/Johannesburg`). - **Shipment vs parcel events**: scans for the whole shipment are used; if there are none, the parcel scans are. ## Related Resources - **Live browser lookup tool**: [Track a The Courier Guy package live on lastscanned.com/lookup/thecourierguy](https://lastscanned.com/lookup/thecourierguy) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Tianhui Hengyuan Tracking API & MCP URL: https://docs.lastscanned.com/carriers/thhy Query live **Tianhui Hengyuan** (`thhy`) package status and scan history in a single synchronous `GET` request or MCP tool call. Tianhui Hengyuan numbers share their shape with other carriers' numbers, so pass `?carrier=thhy`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `thhy` | | **Brand aliases** | Tianhui Hengyuan, 天汇恒源 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=thhy` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=thhy` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Tianhui Hengyuan tracking numbers have no shape of their own, so always pass `?carrier=thhy`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Tianhui Hengyuan in one request. - **Platform**: Tianhui Hengyuan runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TIPSA Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tipsa Query live **TIPSA** (`tipsa`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tipsa` | | **Brand aliases** | TIP-SA, Tipsa Dinapaq, DinaPaq, Tipsa Spain | | **Category** | Iberian parcel carrier (Spain, Portugal, Andorra) | | **Region** | Spain / Portugal / Andorra | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=0280010280017024953690,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^\d{22}$/ (not starting `96`)` | none | `0280010280017024953690` | A 22-digit number that nothing else claims is tried against TIPSA. FedEx's `96…` 22-digit numbers are excluded. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/0280010280017024953690?carrier=tipsa" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tipsa", "trackingNumber": "0280010280017024953690", "status": "delivered", "statusDescription": "ENTREGADO", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-09-01T18:53:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-09-01T18:53:00", "status": "delivered", "description": "ENTREGADO", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-08-26T17:27:00", "status": "out_for_delivery", "description": "REPARTO", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-08-26T15:01:00", "status": "exception", "description": "Ausente", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-08-12T17:50:00", "status": "label_created", "description": "PENDIENTE DE ENTREGAR A TIPSA", "location": null, "code": null } ] } ``` ## Notes - **Reference**: 22 digits are the charging agency (6), the origin agency (6) and the waybill (10). - **Language**: TIPSA's wording is Spanish and is kept as sent. The page is ISO-8859-1 and is decoded as such. - **Time zone**: agencies in Spain and Portugal print local time without a zone, so only `localTime` is given. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Shree Tirupati Courier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tirupaticourier Query live **Shree Tirupati Courier** (`tirupaticourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=tirupaticourier` (or the MCP `carrier` argument) so the lookup goes to Shree Tirupati Courier. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tirupaticourier` | | **Brand aliases** | Shree Tirupati Courier, Tirupati Courier, Shree Tirupati, shreetirupaticourier.net | | **Category** | Regional (courier, India) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=186300128228,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Twelve-digit AWBs are a shape other carriers also use, so pass `?carrier=tirupaticourier`. Accepted shape: `^\d{12}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/186300128228?carrier=tirupaticourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tirupaticourier", "trackingNumber": "186300128228", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-12", "signedBy": null, "destination": { "city": "PUNE", "state": null, "country": "IN" }, "events": [ { "timestamp": null, "localTime": "2026-03-12", "status": "delivered", "description": "Delivered", "location": "PUNE-VISHRANTWADI (15)", "code": null }, { "timestamp": "2026-03-10T16:01:00Z", "localTime": "2026-03-10T21:31:00", "status": "in_transit", "description": "Booked", "location": "PUNE-PIMPRI", "code": null } ] } ``` ## Notes - **How it asks**: the home page form is fetched for its ASP.NET fields, posted with the AWB (the answer is a redirect carrying the AWB encrypted), and the redirect target is fetched. Three plain requests, no cookies. - **Scans**: the result page has the booking row and one status line (`Delivered On Dated 12-03-26 By `, date only). Its scan table is empty, so a parcel in transit shows the booking and the status text. - **Time zone**: India has one offset (+05:30). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TMM Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tmmexpress Query live **TMM Express** (`tmmexpress`, Ukraine, Poland, Belarus and Luxembourg freight) status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tmmexpress` | | **Brand aliases** | TMM, ТММ Экспресс | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Pass `?carrier=tmmexpress` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/6993674857?carrier=tmmexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tmmexpress", "trackingNumber": "6993674857", "status": "delivered", "statusDescription": "Consignment delivered in good condition", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-07T16:25:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "Ukraine" }, "events": [ { "timestamp": null, "localTime": "2026-03-07T16:25:00", "status": "delivered", "description": "Consignment delivered in good condition", "location": "KYIV", "code": "OK" }, { "timestamp": null, "localTime": "2026-03-02T08:00:00", "status": "exception", "description": "Linehaul Delayed", "location": "KHARKIV", "code": "LAW" }, { "timestamp": null, "localTime": "2026-02-28T11:45:00", "status": "in_transit", "description": "Entered to warehouse", "location": "WARSAW CENTRAL HUB", "code": "DH" } ] } ``` ## Notes - **Source**: ukr.tmm-express.com's tracking page, server-rendered; the consignment is read from the XML the page embeds. Ten digits is shared with other carriers, so use `?carrier=tmmexpress`. - **Time zone**: depots span Poland and Ukraine, so only `localTime` is set. - **Fields**: `signedBy` is the signatory; `destination.country` the destination country. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TNT Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tnt Query live **TNT** (`tnt`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tnt` | | **Brand aliases** | TNT Express, TNT Consignment, FedEx TNT | | **Category** | Global express courier (FedEx-owned) | | **Region** | Global | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=505650117,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | TNT consignment numbers are nine digits, a shape other carriers use, so pass `?carrier=tnt`. FedEx's own 12, 15 and 20-digit numbers stay with `fedex`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/505650117?carrier=tnt" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tnt", "trackingNumber": "505650117", "status": "delivered", "statusDescription": "Shipment delivered in good condition", "service": null, "deliveredAt": "2026-03-24T14:14:00Z", "deliveredAtLocal": "2026-03-24T16:14:00", "signedBy": null, "destination": { "city": "Zurich", "state": null, "country": "CH" }, "events": [ { "timestamp": "2026-03-24T14:14:00Z", "localTime": "2026-03-24T16:14:00", "status": "delivered", "description": "Shipment delivered in good condition", "location": "Zurich, Switzerland", "code": "OK" }, { "timestamp": "2026-03-24T06:11:00Z", "localTime": "2026-03-24T08:11:00", "status": "in_transit", "description": "Shipment now at depot nearest to delivery address", "location": "Zurich, Switzerland", "code": "IR" }, { "timestamp": "2026-03-20T10:21:16Z", "localTime": "2026-03-20T18:21:16", "status": "in_transit", "description": "Shipment collected from collection address", "location": "Shenzhen-Futian, China", "code": "PU" } ] } ``` ## Notes - **Time zone**: TNT sends ISO times with an offset (for example `+08:00` in China, `+02:00` in Switzerland), so each scan's `timestamp` is exact. - **Source**: the JSON behind TNT's open tracking page (`channel=OPENTRACK`). TNT is part of FedEx. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TNT Italy Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tntit Query live **TNT Italy** (`tntit`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=tntit` (or the MCP `carrier` argument) so the lookup goes to TNT Italy. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tntit` | | **Brand aliases** | TNT Italy, TNT Italia, TNT Express Italy, tnt.it | | **Category** | Regional (express courier, Italy) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=MY23642676,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Two letters plus eight digits is a shape other carriers also use, so pass `?carrier=tntit`. Accepted shape: `^[A-Z]{2}\d{8}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/MY23642676?carrier=tntit" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tntit", "trackingNumber": "MY23642676", "status": "delivered", "statusDescription": "Spedizione consegnata", "service": "Express", "deliveredAt": "2026-03-12T08:30:00Z", "deliveredAtLocal": "2026-03-12T09:30:00", "signedBy": null, "destination": { "city": "PIACENZA", "state": "PC", "country": "IT" }, "events": [ { "timestamp": "2026-03-12T08:30:00Z", "localTime": "2026-03-12T09:30:00", "status": "delivered", "description": "Spedizione consegnata", "location": "MILANO MEGA", "code": "90" }, { "timestamp": "2026-03-12T08:11:00Z", "localTime": "2026-03-12T09:11:00", "status": "out_for_delivery", "description": "La spedizione e' in consegna in data odierna", "location": "MILANO MEGA", "code": "14" }, { "timestamp": "2026-03-10T15:02:00Z", "localTime": "2026-03-10T16:02:00", "status": "in_transit", "description": "La spedizione e' regolarmente partita", "location": "CATANIA", "code": "07" } ] } ``` ## Notes - **Different backend**: the global `tnt` carrier (`www.tnt.com`) answers `not found` for these waybills; TNT Italy's own tracker holds them. - **Status groups**: `C` is delivered; `N` (not deliverable, operational delay) and `NC` (held at the depot) report `exception`; everything else is read from the Italian wording. - **Time zone**: Italy is `Europe/Rome`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TOPTRANS Tracking API & MCP URL: https://docs.lastscanned.com/carriers/toptrans Query live **TOPTRANS** (`toptrans`, Czech Republic and Slovakia freight) status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `toptrans` | | **Brand aliases** | Toptrans CZ, TOPTRANS SK | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Pass `?carrier=toptrans` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/26181000570?carrier=toptrans" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "toptrans", "trackingNumber": "26181000570", "status": "delivered", "statusDescription": "Zásilka doručena", "service": null, "deliveredAt": "2026-03-15T11:55:00Z", "deliveredAtLocal": "2026-03-15T12:55:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-15T11:55:00Z", "localTime": "2026-03-15T12:55:00", "status": "delivered", "description": "Zásilka doručena", "location": "Bratislava", "code": null }, { "timestamp": "2026-03-15T10:13:00Z", "localTime": "2026-03-15T11:13:00", "status": "out_for_delivery", "description": "Zásilka se rozváží", "location": "Bratislava", "code": null }, { "timestamp": "2026-03-08T15:56:00Z", "localTime": "2026-03-08T16:56:00", "status": "label_created", "description": "Přijata objednávka přepravy", "location": "Trenčín", "code": null } ] } ``` ## Notes - **Source**: TOPTRANS's public tracking endpoint (server-rendered HTML). Eleven digits is shared with other carriers, so use `?carrier=toptrans`. - **Time zone**: converted from `Europe/Prague` (Czech and Slovak depots share it). Descriptions are Czech. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TopYou Tracking API & MCP URL: https://docs.lastscanned.com/carriers/topyou Query live **TopYou** (`topyou`) package status and scan history in a single synchronous `GET` request or MCP tool call. TopYou number shapes are not documented, so pass `?carrier=topyou`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `topyou` | | **Brand & service aliases** | TopYou, Topyou Express, Shenzhen Tongyou (通邮集团), szty56 | | **Category** | Chinese cross-border e-commerce forwarder | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}`?carrier=topyou | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=topyou` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Examples | |---|---|---| | **Pass 1 (`matches`)** | *None* (use `?carrier=topyou`) | n/a | | **Pass 2 (`mayMatch`)** | *None* | n/a | **Required**: always pass `?carrier=topyou`; no shape is claimed in auto-detection. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/TYZRB0013485170YQ?carrier=topyou" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "TYZRB0013485170YQ", "carrier": "topyou" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "topyou", "trackingNumber": "TYZRB0013485170YQ", "status": "in_transit", "statusDescription": "Departed from sorting center", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": null, "events": [ { "timestamp": null, "localTime": "2026-10-21T14:05:00", "status": "in_transit", "description": "Departed from sorting center", "location": "Shenzhen", "code": null }, { "timestamp": null, "localTime": "2026-10-19T10:00:00", "status": "in_transit", "description": "Received at warehouse", "location": "Shenzhen", "code": null } ] } ``` ## Notes - **Source**: the JSON API behind `track.szty56.com` (`POST /order/track`); several numbers go in one request. - **Statuses**: TopYou's own codes (pre-alert, warehouse in/out, transfer, destination country, customs, delivered, exception, returned) set the overall `status`. - **Handoff**: when TopYou gives a transfer number for a partner carrier, it appears in `message`. - **Times**: scans carry no zone, so only `localTime` is set. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Torrestir Tracking API & MCP URL: https://docs.lastscanned.com/carriers/torrestir Query live **Torrestir** (`torrestir`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `torrestir` | | **Brand aliases** | Torrestir, Torrestir Transportes, torrestir.com | | **Category** | Regional (road freight, Portugal / Spain / Germany) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=M0010002L00401935478,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^M001\d{4}[0-9A-Z]\d{11}$/` | none | `M0010002L00401935478` | | **Pass 2 (`mayMatch`)** | none | none | none | `M001…` codes belong to Torrestir alone, so `?carrier=torrestir` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/M0010002L00401935478?carrier=torrestir" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "torrestir", "trackingNumber": "M0010002L00401935478", "status": "delivered", "statusDescription": "Entregue", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-12T12:50:00", "signedBy": null, "destination": { "city": "LISBOA", "state": null, "country": null }, "events": [ { "timestamp": null, "localTime": "2026-03-12T12:50:00", "status": "delivered", "description": "Entregue", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-12T09:47:00", "status": "out_for_delivery", "description": "Em Distribuição", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-10T17:02:00", "status": "in_transit", "description": "Recolhido", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-09T00:00:00", "status": "label_created", "description": "Guia Criada", "location": null, "code": null } ] } ``` ## Notes - **Wording**: scan text is Torrestir's Portuguese. A `Devolvido` scan (returned to the platform after a failed delivery) reports `exception`, since the parcel is usually redelivered. - **Time zone**: Torrestir moves freight across three countries and the page prints no zone, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Total Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/totalexpress Query live **Total Express (Brazil)** (`totalexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `totalexpress` | | **Brand aliases** | Total Express, Total Express Brasil, TX | | **Category** | Regional parcels (Brazil) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{4}\d{9}TX$/` | none | `TXAQ589033943TX` | | **Pass 2 (`mayMatch`)** | none | none | none | | Format | Pattern | |---|---| | AWB (4 letters, 9 digits, TX) | `^[A-Z]{4}\d{9}TX$` | Shapes this carrier does not own alone are not auto-detected; pass `?carrier=totalexpress`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/TXAQ589033943TX?carrier=totalexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "totalexpress", "trackingNumber": "TXAQ589033943TX", "status": "delivered", "statusDescription": "ENTREGA REALIZADA", "service": null, "deliveredAt": "2026-09-18T12:20:00Z", "deliveredAtLocal": "2026-09-18T09:20:00", "signedBy": null, "destination": null, "estimatedDelivery": "2026-10-02", "message": "Handed to Correios as TXAQ589033943TX", "events": [ { "timestamp": "2026-09-18T12:20:00Z", "localTime": "2026-09-18T09:20:00", "status": "delivered", "description": "ENTREGA REALIZADA", "location": null, "code": "1" }, { "timestamp": "2026-09-18T10:03:51Z", "localTime": "2026-09-18T07:03:51", "status": "out_for_delivery", "description": "PROCESSO DE ENTREGA", "location": null, "code": "104" }, { "timestamp": "2026-09-12T09:33:09Z", "localTime": "2026-09-12T06:33:09", "status": "in_transit", "description": "RECEBIDO CD DE:- TZO", "location": null, "code": "103" } ] } ``` ## Notes - **Time zone**: Brazilian local time, converted from `America/Sao_Paulo` (no DST). - **Handoff**: `redespachoNumero`, when present, becomes `message` (for a Correios `..BR` number: `Handed to Correios as ...`). - **Not found**: the detail endpoint answers 500 for an unknown AWB, so the adapter checks the search endpoint to tell 'no such parcel' from a failure. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Trackon Couriers Tracking API & MCP URL: https://docs.lastscanned.com/carriers/trackon Query live **Trackon Couriers** (`trackon`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=trackon` (or the MCP `carrier` argument) so the lookup goes to Trackon Couriers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `trackon` | | **Brand aliases** | Trackon, Trackon Couriers, Trackon Courier, trackon.in | | **Category** | Regional (express courier, India) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=100449931424,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Ten- and twelve-digit AWBs are shapes other carriers also use, so pass `?carrier=trackon`. Accepted shape: `^\d{10}$|^\d{12}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/100449931424?carrier=trackon" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "trackon", "trackingNumber": "100449931424", "status": "delivered", "statusDescription": "DELIVERED WITH MOBILE APP UPDATE", "service": "AIR", "deliveredAt": "2026-03-12T10:48:00Z", "deliveredAtLocal": "2026-03-12T16:18:00", "signedBy": null, "destination": { "city": "DELHI", "state": null, "country": "IN" }, "events": [ { "timestamp": "2026-03-12T10:48:00Z", "localTime": "2026-03-12T16:18:00", "status": "delivered", "description": "DELIVERED WITH MOBILE APP UPDATE", "location": "NAJAFGARH (NAYA BAZAR), DELHI", "code": "DDUF" }, { "timestamp": "2026-03-12T07:22:00Z", "localTime": "2026-03-12T12:52:00", "status": "in_transit", "description": "DELIVERY MANIFEST PREPARED FOR NAJAFGARH (NAYA BAZAR)", "location": "NAJAFGARH BRANCH SF, DELHI", "code": "DRBG" }, { "timestamp": "2026-03-09T15:23:00Z", "localTime": "2026-03-09T20:53:00", "status": "in_transit", "description": "S/MENT BOOKED", "location": "KANKARIA BRANCH, GUJARAT", "code": "BOKN" } ] } ``` ## Notes - **Codes**: `code` is Trackon's `TRACKING_CODE` (`DDUF` delivered with app update, `BOKN` booked, `FMDT` picked up, and so on); the branch code prefix on a city (`D10123-`) is dropped and a trailing ` - NULL` is trimmed from the status. - **Time zone**: India has one offset (+05:30). The API is slow at times. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TracX Logis Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tracxlogis Query live **TracX Logis** (`tracxlogis`, Singapore, Korea, Japan, Hong Kong and Taiwan e-commerce logistics) status and scan history, plus the last-mile carrier. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tracxlogis` | | **Brand aliases** | TracX, Tracxlogis | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^QSP\d{9}$/` | none | `QSP222954533` | | **Pass 2 (`mayMatch`)** | none | none | none | These numbers belong to this carrier, so `?carrier=tracxlogis` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/QSP222954533?carrier=tracxlogis" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tracxlogis", "trackingNumber": "QSP222954533", "status": "delivered", "statusDescription": "Delivery Completed", "service": null, "deliveredAt": "2026-03-15T04:51:46Z", "deliveredAtLocal": "2026-03-15T04:51:46", "signedBy": null, "destination": { "city": null, "state": null, "country": "SG" }, "message": "Handed to EXAMPLE LAST MILE as QSP222954533", "events": [ { "timestamp": "2026-03-15T04:51:46Z", "localTime": "2026-03-15T04:51:46", "status": "delivered", "description": "Delivery Completed", "location": null, "code": "D4" }, { "timestamp": "2026-03-14T14:28:23Z", "localTime": "2026-03-14T14:28:23", "status": "in_transit", "description": "Received at Collection Center", "location": "Example DPC1", "code": "D2" }, { "timestamp": "2026-03-13T03:34:23Z", "localTime": "2026-03-13T03:34:23", "status": "label_created", "description": "Received Shipping Order", "location": null, "code": "N1" } ] } ``` ## Notes - **Source**: the Next.js server action behind tracxlogis.com's tracking form. The action id is re-read from the site's scripts automatically when it changes. - **Time zone**: TracX gives UTC; `localTime` repeats the UTC clock time. - **Handoff**: the last-mile company and its number come back in `message`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Transcorp Tracking API & MCP URL: https://docs.lastscanned.com/carriers/transcorp Query live **Transcorp** (`transcorp`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=transcorp` (or the MCP `carrier` argument) so the lookup goes to Transcorp. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `transcorp` | | **Brand aliases** | Transcorp, Transcorp International, Elite, app.elite-co.com | | **Category** | Regional (last-mile courier, UAE / Saudi Arabia / Qatar / Bahrain / Kuwait / Oman) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1700133700,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Ten-digit airwaybills are a shape other carriers also use, so pass `?carrier=transcorp`. Accepted shape: `^\d{10}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1700133700?carrier=transcorp" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "transcorp", "trackingNumber": "1700133700", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-12T05:36:33Z", "deliveredAtLocal": "2026-03-12T09:36:33", "signedBy": "A. Rahman", "destination": { "city": null, "state": null, "country": "AE" }, "events": [ { "timestamp": "2026-03-12T05:36:33Z", "localTime": "2026-03-12T09:36:33", "status": "delivered", "description": "Delivered", "location": null, "code": "DELIVERED" }, { "timestamp": "2026-03-12T04:05:25Z", "localTime": "2026-03-12T08:05:25", "status": "out_for_delivery", "description": "Out For Delivery", "location": null, "code": "OUT_FOR_DELIVERY" }, { "timestamp": "2026-03-11T08:00:00Z", "localTime": "2026-03-11T12:00:00", "status": "in_transit", "description": "CUSTOMS CLEARANCE COMPLETED", "location": null, "code": "CUSTOMS_CLEARANCE_COMPLETED" }, { "timestamp": "2026-03-08T13:32:53Z", "localTime": "2026-03-08T17:32:53", "status": "in_transit", "description": "Departed Shipper Premises", "location": null, "code": "DEPARTED_SHIPPER_PREMISES" } ] } ``` ## Notes - **How it asks**: the tracking page is a Next.js app; with `RSC: 1` it streams the shipment as JSON inside the flight payload, which the adapter picks out. No browser needed. - **Time zone**: the operating country sets the zone (UAE and Oman +04:00; Saudi Arabia, Qatar, Bahrain, Kuwait +03:00; none observe DST). The platform's `timestamp` is used as UTC. - **Codes**: `code` is the platform's event type (`DELIVERED`, `PICKED_UP`, `CONSIGNEE_UNREACHABLE`, …); an unreachable consignee reports `exception`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TST-CF Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tstcfexpress Query live **TST-CF Express** (`tstcfexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=tstcfexpress` (or the MCP `carrier` argument) so the lookup goes to TST-CF Express. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tstcfexpress` | | **Brand aliases** | TST-CF Express, TST CF Express, TST Express, tst-cfexpress.com | | **Category** | Regional (less-than-truckload freight, Canada / United States) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=7712024354,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Ten-digit PRO numbers are a shape other carriers also use, so pass `?carrier=tstcfexpress`. Accepted shape: `^[1-9]\d{9}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/7712024354?carrier=tstcfexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tstcfexpress", "trackingNumber": "7712024354", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-12T15:26:00", "signedBy": null, "destination": { "city": "PENINSULA", "state": "OH", "country": null }, "events": [ { "timestamp": null, "localTime": "2026-03-12T15:26:00", "status": "delivered", "description": "Delivered", "location": "PENINSULA, OH", "code": null }, { "timestamp": null, "localTime": "2026-03-09T20:06:00", "status": "in_transit", "description": "Customs release", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-02", "status": "in_transit", "description": "Shipped", "location": "STE CLAIRE, QC", "code": null } ] } ``` ## Notes - **How it asks**: `GET /tracing/by-url?lang=e&PRO=…` stores the lookup in the session and `GET /tracing/results` (with the session cookie) renders it. Two plain requests. - **Scans**: the page has no scan list, only the status line (`Delivered on 03/12/2026 at 15:26`), the ship date and an optional customs-release time, so these are the events. - **Time zone**: the page prints no zone, so only `localTime` is set. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TufesaPack Tracking API & MCP URL: https://docs.lastscanned.com/carriers/tufesa Query live **TufesaPack** (`tufesa`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=tufesa` (or the MCP `carrier` argument) so the lookup goes to TufesaPack. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `tufesa` | | **Brand aliases** | TufesaPack, Tufesa Pack, Tufesa, tufesa.com.mx | | **Category** | Regional (bus-network parcel, Mexico / United States) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=10935008,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Seven- and eight-digit folios are a shape other carriers also use, so pass `?carrier=tufesa`. Accepted shape: `^[1-9]\d{6,7}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/10935008?carrier=tufesa" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "tufesa", "trackingNumber": "10935008", "status": "delivered", "statusDescription": "Envío Entregado", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-12T15:19:00", "signedBy": "MARIA LOPEZ", "destination": { "city": "Guasave", "state": "Sinaloa", "country": "MX" }, "events": [ { "timestamp": null, "localTime": "2026-03-12T15:19:00", "status": "delivered", "description": "Envío Entregado", "location": "Guasave, Sinaloa", "code": "EN" }, { "timestamp": null, "localTime": "2026-03-12T15:07:00", "status": "in_transit", "description": "Recibido En Sucursal Destino", "location": "Guasave, Sinaloa", "code": "RC" }, { "timestamp": null, "localTime": "2026-03-10T21:00:00", "status": "in_transit", "description": "Envío En Tránsito", "location": "Nogales, Sonora", "code": "EM" }, { "timestamp": null, "localTime": "2026-03-10T15:43:00", "status": "label_created", "description": "Envío Documentado", "location": "Nogales, Sonora", "code": "RG" } ] } ``` ## Notes - **Codes**: `code` is the movement code (`RG` registered, `EM` boarded, `TK` route stop, `DS` unloaded, `RC` received at the destination branch, `EN` delivered). The customer wording (`MensageCliente`) is the description. - **Time zone**: the route crosses several Mexican zones and the API prints none, so only `localTime` is set. A movement with no customer wording (the 'received by' echo) is left out; the receiver is returned as `signedBy`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # TWS Express Courier (Italy) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/twsexpress Query live **TWS Express Courier** (`twsexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. Waybills (`28` + four digits + a letter + six digits) are tried only when no other carrier claims the number. Pass `?carrier=twsexpress` to be sure. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `twsexpress` | | **Brand aliases** | TWS Express Courier, TWS, TWS Italia, TWS Spedizioni | | **Category** | Parcel and freight courier (Italy) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=281790J005342,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^28\d{4}[A-Z]\d{6}$/` | none | `281790J005342` | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/281790J005342?carrier=twsexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "twsexpress", "trackingNumber": "281790J005342", "status": "delivered", "statusDescription": "CONSEGNATA", "service": null, "deliveredAt": "2026-01-16T15:14:00Z", "deliveredAtLocal": "2026-01-16T16:14:00", "signedBy": null, "destination": null, "estimatedDelivery": "2026-01-11", "events": [ { "timestamp": "2026-01-16T15:14:00Z", "localTime": "2026-01-16T16:14:00", "status": "delivered", "description": "CONSEGNATA", "location": null, "code": "000" }, { "timestamp": "2026-01-12T09:55:00Z", "localTime": "2026-01-12T10:55:00", "status": "out_for_delivery", "description": "IN CONSEGNA (MATT)", "location": null, "code": "GGG" }, { "timestamp": "2026-01-10T19:44:07Z", "localTime": "2026-01-10T20:44:07", "status": "exception", "description": "DESTINATARIO ASSENTE", "location": null, "code": "008" }, { "timestamp": "2026-01-02T13:46:47Z", "localTime": "2026-01-02T14:46:47", "status": "label_created", "description": "NUOVA", "location": null, "code": "NV" } ] } ``` ## Notes - **Language**: descriptions are Italian. **Time zone**: Italian local time (`Europe/Rome`). - **Estimate**: `estimatedDelivery` is TWS's `eta` date. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # UBI Smart Parcel Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ubi Query live **UBI Smart Parcel** (`ubi`) cross-border package status, scan history, and **destination carrier handoff numbers** (Australia Post, Aramex, Team Global Express, Dragonfly, iMile) in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 15-character `AU…` UBI tracking numbers in Pass 1 and returns a normalized `TrackingResult` JSON payload—without requiring an eTower / UBI shipper account. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ubi` | | **Brand & service aliases** | UBI Smart Parcel, UBI Logistics, Gotoubi (`ubismartparcel.com`, `shipper.ubismartparcel.com`) | | **Category** | Cross-border e-commerce logistics carrier — China to Australia, Canada & global | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=AU000...,AU000...` (up to 30 UBI numbers per batch; up to 100 total numbers) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for UBI Smart Parcel - **Deduplicates dual-number scans & filters future flight bookings**: UBI's eTower portal mixes UBI's own origin scans in China with relayed partner scans filed under the destination carrier's barcode—often emitting duplicate events 1 second apart under both tracking numbers, pre-populating future flight departure timestamps before the flight has taken off, and stamping `"Out for delivery"` and `"Delivered"` at the exact same minute. `lastscanned` deduplicates dual-number scans, filters out future-dated flight projections, orders `"Delivered"` ahead of same-minute `"Out for delivery"` scans, and ensures a partner's mid-transit electronic manifest (`INF`) never resets an `in_transit` parcel back to `label_created`. - **Automatic last-mile carrier & exchange number extraction**: UBI hands parcels over to **Australia Post** (`auspost.com.au`), **Aramex** (`aramex.com.au`), **Team Global Express** (`teamglobalexp.com`), **Dragonfly** (`dragonflyshipping.com.au`), **iMile**, or **[Canada Post](https://docs.lastscanned.com/carriers/canadapost)**. `lastscanned` extracts both the partner carrier name and secondary barcode into top-level `message` (e.g. `"Handed to Australia Post as AU0000005887447"`). ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) UBI Smart Parcel is evaluated **twenty-ninth (#29)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^AU\d{13}$/i` (`AU` + 13 digits = 15 chars) | — | `AU0000005887447`, `AU0000006050000` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=ubi` optional vs required? - **Optional (auto-detected)**: All 15-character `AU` + 13-digit UBI Smart Parcel numbers auto-detect in Pass 1. - **Required (`?carrier=ubi`)**: When querying UBI by the destination partner's barcode (such as an Australia Post barcode, an Aramex `MP…` number, or a 16-digit [Canada Post](https://docs.lastscanned.com/carriers/canadapost) PIN that would otherwise route to `canadapost` in Pass 1). ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/AU0000005887447?carrier=ubi" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/AU0000005887447?carrier=ubi", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.message, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "AU0000005887447" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "ubi", "trackingNumber": "AU0000005887447", "status": "delivered", "statusDescription": "Delivered - Left in a safe place", "service": null, "deliveredAt": "2026-10-26T00:05:07Z", "deliveredAtLocal": "2026-10-26T11:05:07", "signedBy": null, "destination": { "city": null, "state": null, "country": "AU" }, "message": "Handed to Australia Post as AU0000005887447", "events": [ { "timestamp": "2026-10-26T00:05:07Z", "localTime": "2026-10-26T11:05:07", "status": "delivered", "description": "Delivered - Left in a safe place", "location": "PARRAMATTA, NSW", "code": "DLD" }, { "timestamp": "2026-10-25T21:18:00Z", "localTime": "2026-10-26T08:18:00", "status": "out_for_delivery", "description": "Onboard for delivery", "location": "PARRAMATTA, NSW", "code": "INF-OFD" }, { "timestamp": null, "localTime": "2026-10-23T14:40:00", "status": "in_transit", "description": "Customs clearance completed", "location": "SYDNEY", "code": "CCD" }, { "timestamp": "2026-10-20T09:12:00Z", "localTime": "2026-10-20T17:12:00", "status": "label_created", "description": "Shipping information approved by Australia Post", "location": null, "code": "INF" } ] } ``` > **Raw status & event codes**: `events[].code` preserves UBI's eTower event code (`"INF"` shipping information / manifest, `"RCV"` received at hub, `"SCN"` transit scan, `"LHL"` linehaul flight, `"CCD-EXP"`/`"CCD"` customs clearance, `"ARR"`/`"BSE"` arrived in destination country, `"HDD"` handed to last-mile carrier, `"RSN"` new tracking number assigned, `"CRD"` awaiting collection, `"INF-OFD"` out for delivery, `"DLV"`/`"DLV-DLF"` failed delivery attempt, `"DLD"` delivered, `"RTN"` returned). ## Related Resources - **Live browser lookup tool**: [Track a UBI Smart Parcel package live on lastscanned.com/lookup/ubi](https://lastscanned.com/lookup/ubi) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Ukrposhta Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ukrposhta Query live **Ukrposhta** (`ukrposhta`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending in `UA`; 13-digit domestic numbers are tried when nothing else claims them. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ukrposhta` | | **Brand aliases** | Ukrposhta, Ukrainian Post, Укрпошта | | **Category** | National post (Ukraine) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=0505683900154,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `S10 *UA` with a valid check digit (`/^[A-Z]{2}\d{9}UA$/`) | S10 | `0505683900154` | | **Pass 2 (`mayMatch`)** | `/^05\d{11}$/` | none | `0505683900154` | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/0505683900154?carrier=ukrposhta" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ukrposhta", "trackingNumber": "0505683900154", "status": "delivered", "statusDescription": "Final delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-09-26T09:00:00", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-09-26T09:00:00", "status": "delivered", "description": "Final delivery", "location": "China", "code": "48000" }, { "timestamp": null, "localTime": "2026-09-26T08:28:00", "status": "out_for_delivery", "description": "Item out for physical delivery", "location": "China", "code": "29500" }, { "timestamp": "2026-09-12T12:35:00Z", "localTime": "2026-09-12T15:35:00", "status": "label_created", "description": "Registered", "location": "Kyiv", "code": "10100" } ] } ``` ## Notes - **Source**: the status API of Ukrposhta's own Android app, which uses one static application key that ships in the app. The `track.ukrposhta.ua` page (reCAPTCHA) is not used. - **Times**: scans inside Ukraine have `timestamp` (Kyiv time converted to UTC). Scans by the destination post come in that country's time with no zone given, so they carry `localTime` only and `deliveredAt` can be null. - **Returns**: scans of a returned domestic parcel are marked `returned`, ending in `Return: Delivered to Sender`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # United Delivery Service Tracking API & MCP URL: https://docs.lastscanned.com/carriers/uniteddeliveryservice Query live **United Delivery Service** (`uniteddeliveryservice`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `uniteddeliveryservice` | | **Brand aliases** | United Delivery Service, UDS, UDS Delivery, uniteddeliveryservice.com | | **Category** | Regional (regional last-mile, United States) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=APUDS01940000,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^APUDS\d{8}$/` | none | `APUDS01940000` | | **Pass 2 (`mayMatch`)** | none | none | none | `APUDS…` barcodes belong to UDS alone, so `?carrier=uniteddeliveryservice` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/APUDS01940000?carrier=uniteddeliveryservice" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "uniteddeliveryservice", "trackingNumber": "APUDS01940000", "status": "delivered", "statusDescription": "Delivered (Front Door)", "service": null, "deliveredAt": "2026-03-12T18:54:37Z", "deliveredAtLocal": "2026-03-12T13:54:37", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-12T18:54:37Z", "localTime": "2026-03-12T13:54:37", "status": "delivered", "description": "Delivered (Front Door)", "location": null, "code": null } ] } ``` ## Notes - **One scan**: the page shows only the latest status (`The package is delivered.`, `2026-03-12 - 01:54:37 PM CDT`, `POD Details: Front Door`), so `events` has one entry. - **Time zone**: the US abbreviation printed with the time (CST, CDT, EST, EDT, MST, MDT, PST, PDT) gives the offset. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # UniUni Tracking API & MCP URL: https://docs.lastscanned.com/carriers/uniuni Query live **UniUni** (`uniuni`) package status and scan history across the US and Canada in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects primary `UUS…` tracking numbers in Pass 1 and `UR…` / `U9999…` / `U000…` partner numbers in Pass 2, returning a normalized `TrackingResult` JSON payload—without requiring a UniUni enterprise shipper contract or webhook integration. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `uniuni` | | **Brand & service aliases** | UniUni, UniUni Express, UniUni US & Canada Last-Mile | | **Category** | US & Canada e-commerce last-mile carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=UUS...,UUS...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for UniUni - **No merchant shipper account required**: UniUni's shipper API is gated behind commercial onboarding for direct e-commerce merchants and 3PLs. With `lastscanned`, any application or AI support agent can track UniUni parcels immediately via `GET /v1/track/UR07270000003615622?carrier=uniuni`. - **Translates opaque numeric state codes**: UniUni's raw payload reports numeric state codes (`190`, `195`, `200`, `202`, `203`, `211`, `213`, `230`, `1870`) and oldest-first scan arrays. `lastscanned` reverses the timeline to newest-first and normalizes every state code into the 7 standard statuses. - **Seamless cross-border handoff target**: Parcels originating on [YunExpress](https://docs.lastscanned.com/carriers/yunexpress), [Yanwen](https://docs.lastscanned.com/carriers/yanwen), [4PX](https://docs.lastscanned.com/carriers/4px), or [Cainiao](https://docs.lastscanned.com/carriers/cainiao) frequently hand off to UniUni for North American final delivery. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) UniUni is evaluated **seventh (#7)** in `lastscanned`'s two-pass detector and uses both Pass 1 (`matches`) and Pass 2 (`mayMatch`): | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — Primary `UUS`** | `/^UUS[0-9A-Z]{13,16}$/i` (`UUS` + 13–16 alphanumeric characters = 16–19 chars) | — | `UUS5BM1269395824723`, `UUSC000019638703` | | **Pass 2 (`mayMatch`) — Partner `UR` / `U9999` / `U000`** | `/^(UR\d{12,20}\|U9999\d{6,20}\|U000\d{6,20})$/i` | — | `UR07270000003615622`, `UR07270000003615622`, `UR07270000003615622` | ### When is `?carrier=uniuni` optional vs required? - **Optional (auto-detected in Pass 1)**: All `UUS` + 13–16 alphanumeric tracking numbers. - **Optional (auto-detected in Pass 2)**: `UR` + 12–20 digits, `U9999` + 6–20 digits, and `U000` + 6–20 digits. Because these formats sit in Pass 2 (`mayMatch`), they route to `uniuni` whenever no Pass 1 carrier claims the number. - **Required (`?carrier=uniuni`)**: Canadian / partner barcodes starting with `GV…` or `JY…` (such as `GV2601…CAA0…` or `JY2601…CAA0…`). Pass `?carrier=uniuni` when querying these numbers. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/UR07270000003615622?carrier=uniuni" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/UR07270000003615622?carrier=uniuni", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.statusDescription, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "UUS5BM1269395824723" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "uniuni", "trackingNumber": "UR07270000003615622", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-24T21:18:42Z", "deliveredAtLocal": "2026-10-24T14:18:42", "signedBy": null, "destination": { "city": "LOS ANGELES", "state": "CA", "country": "US" }, "estimatedDelivery": null, "events": [ { "timestamp": "2026-10-24T21:18:42Z", "localTime": "2026-10-24T14:18:42", "status": "delivered", "description": "Delivered", "location": "Los Angeles, CA", "code": "203" }, { "timestamp": "2026-10-24T15:04:10Z", "localTime": "2026-10-24T08:04:10", "status": "out_for_delivery", "description": "Out for delivery", "location": "Los Angeles, CA", "code": "202" }, { "timestamp": "2026-10-24T06:31:55Z", "localTime": "2026-10-23T23:31:55", "status": "in_transit", "description": "Arrived at UniUni facility", "location": "Los Angeles, CA", "code": "195" }, { "timestamp": null, "localTime": "2026-10-21T05:46:35", "status": "label_created", "description": "Order received", "location": null, "code": "190" } ] } ``` > **Raw status & state codes**: `events[].code` preserves UniUni's numeric `state` code as a string (`"190"` / `"1870"` → `label_created`; `"202"` → `out_for_delivery`; `"203"` / `"216"` / `"228"` → `delivered`; `"230"` → `returned`; `"206"`, `"207"`, `"209"`, `"211"` failed attempt, `"215"`, `"222"`, `"229"`, `"235"` → `exception`; `"195"`, `"199"`, `"200"`, `"212"`, `"213"`, `"217"`, `"220"` → `in_transit`). ## Carrier-Specific Status & Integration Notes - **Timestamps (`timestamp` vs `localTime`)**: Physical hub and driver scans include both a Unix epoch (`ts`), local clock (`localTime`), and IANA `timezone`, populating both `timestamp` (UTC) and `localTime`. The initial electronic *"Order received"* scan (`190`/`1870`) carries no timezone, so `timestamp` is `null` and `localTime` holds the printed timestamp. - **Failed delivery attempts vs depot returns**: State `211` (failed delivery attempt) maps to `exception`, whereas state `213` (parcel returned to local UniUni depot for redelivery) maps to `in_transit` and state `230` (returned to merchant/sender) maps to `returned`. ## Related Resources - **Live browser lookup tool**: [Track a UniUni package live on lastscanned.com/lookup/uniuni](https://lastscanned.com/lookup/uniuni) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Upaya Tracking API & MCP URL: https://docs.lastscanned.com/carriers/upaya Query live **Upaya** (`upaya`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `upaya` | | **Brand aliases** | Upaya, Upaya Nepal, Upaya Logistics, upaya.com.np | | **Category** | Regional (last-mile courier, Nepal) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=KTMKTM8304-1658055,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[A-Z]{6}\d{4}-\d{7}$/` | none | `KTMKTM8304-1658055` | | **Pass 2 (`mayMatch`)** | none | none | none | Upaya's `KTMKTM…-…` codes belong to Upaya alone, so `?carrier=upaya` is optional. The dash is kept (it is added back if left out). ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/KTMKTM8304-1658055?carrier=upaya" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "upaya", "trackingNumber": "KTMKTM8304-1658055", "status": "delivered", "statusDescription": "Delivered", "service": "Door to Door Delivery", "deliveredAt": "2026-03-12T10:20:00Z", "deliveredAtLocal": "2026-03-12T16:05:00", "signedBy": null, "destination": { "city": "Lazimpat", "state": null, "country": "NP" }, "events": [ { "timestamp": "2026-03-12T10:20:00Z", "localTime": "2026-03-12T16:05:00", "status": "delivered", "description": "Delivered", "location": "Kathmandu Hub", "code": null }, { "timestamp": "2026-03-12T05:10:00Z", "localTime": "2026-03-12T10:55:00", "status": "out_for_delivery", "description": "Out for delivery", "location": "Kathmandu Hub", "code": null }, { "timestamp": "2026-03-11T09:00:00Z", "localTime": "2026-03-11T14:45:00", "status": "label_created", "description": "Order created", "location": "Kathmandu Hub", "code": null } ] } ``` ## Notes - **Format**: the code is `<6 letters><4 digits>-<7 digits>`; the dash is part of the number. - **Time zone**: Nepal is UTC+05:45 (no DST); the page gives UTC times, shown here in Nepal time. A scan's `Title: detail` line (for example `Pickup Process: Failed pickup`) is the description. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # UPS Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ups Query live **UPS** (`ups`) package status and full scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` validates UPS `1Z` Mod-10 check digits upfront and returns a normalized `TrackingResult` JSON payload—without requiring a UPS Developer Portal OAuth application, shipper account number, or webhook receiver. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ups` | | **Brand & service aliases** | United Parcel Service, UPS Ground, UPS Next Day Air, UPS 2nd Day Air, UPS 3 Day Select, UPS SurePost, UPS Worldwide Express / Saver / Expedited | | **Category** | National & international parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1Z...,1Z...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for UPS instead of direct requests - **Avoid Akamai Bot Manager `403` blocks from serverless & edge IPs**: If you try to call `webapis.ups.com/track/api/Track/GetStatus` directly from a Cloudflare Worker, Vercel function, or AWS Lambda, Akamai rejects datacenter TLS fingerprints and IPs, and requires paired `GetCSRFToken` / `X-XSRF-TOKEN-ST` session cookies. Calling `GET https://api.lastscanned.com/v1/track/1Z000Y770414233027?carrier=ups` from your Worker or Lambda returns clean JSON in one `fetch()`. - **Skip UPS Developer Kit OAuth 2.0 & shipper account linking**: Official UPS Track API credentials require registering an enterprise app, linking a 6-character UPS shipper account, and refreshing short-lived OAuth tokens. `lastscanned` works immediately with a single Bearer key (or keyless via HTTP 402). - **Synchronous GET—no webhook registration**: Unlike AfterShip, Ship24, or EasyPost where you must `POST` a tracker first and wait for an async webhook, `GET /v1/track/1Z000Y770414233027?carrier=ups` returns the live UPS scan timeline inline. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) UPS is evaluated **first (#1)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^1Z[0-9A-Z]{16}$/i` (18 characters starting with `1Z`) | **Yes — `ups1Z(n)` (Mod-10)** | `1Z000Y770414233027`, `1Z5868Y60389226681` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### `ups1Z` Mod-10 check-digit algorithm Every 18-character `1Z` number consists of `1Z` + 6-character shipper account + 2-digit service code + 7-digit package identifier + 1 Mod-10 check digit. `lastscanned` validates the check digit before making any network call so typos fail fast with `400 unknown_carrier`: ```ts /** UPS 1Z: letters count as (char code - 63) mod 10, odd positions doubled, mod 10. */ export function ups1Z(n: string): boolean { const body = n.slice(2, -1).toUpperCase(); let sum = 0; for (let i = 0; i < body.length; i++) { const ch = body[i]; const v = ch >= "0" && ch <= "9" ? Number(ch) : (ch.charCodeAt(0) - 63) % 10; sum += i % 2 ? v * 2 : v; } return (10 - (sum % 10)) % 10 === Number(n.slice(-1)); } ``` ### When is `?carrier=ups` optional vs required? - **Optional (auto-detected)**: All standard 18-character `1Z` tracking numbers with a valid Mod-10 check digit. No other carrier uses the `1Z` prefix. - **Required (`?carrier=ups`)**: Non-`1Z` UPS formats such as 9-digit or 12-digit UPS Freight / TForce PRO numbers, UPS InfoNotice numbers, or UPS Mail Innovations labels that do not use a USPS `92…`/`93…` IMpb barcode. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/1Z000Y770414233027?carrier=ups" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/1Z000Y770414233027?carrier=ups", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.service, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "1Z000Y770414233027" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "ups", "trackingNumber": "1Z000Y770414233027", "status": "delivered", "statusDescription": "Delivered", "service": "UPS Ground", "deliveredAt": "2026-10-23T20:17:14Z", "deliveredAtLocal": "2026-10-23T15:17:00", "signedBy": "FRONT DOOR", "destination": { "city": "AUSTIN", "state": "TX", "country": "US" }, "events": [ { "timestamp": "2026-10-23T20:17:14Z", "localTime": "2026-10-23T15:17:00", "status": "delivered", "description": "Delivered", "location": "AUSTIN, TX, US", "code": "KB" }, { "timestamp": "2026-10-23T13:42:08Z", "localTime": "2026-10-23T08:42:00", "status": "out_for_delivery", "description": "Out For Delivery Today", "location": "AUSTIN, TX, US", "code": "OT" }, { "timestamp": "2026-10-23T09:15:30Z", "localTime": "2026-10-23T04:15:00", "status": "in_transit", "description": "Arrived at Facility", "location": "AUSTIN, TX, US", "code": "AR" }, { "timestamp": "2026-10-21T22:04:11Z", "localTime": "2026-10-21T18:04:00", "status": "label_created", "description": "Shipper created a label, UPS has not received the package yet.", "location": "US", "code": "MP" } ] } ``` > **Raw status & scan codes**: Top-level `statusDescription` preserves UPS's exact status wording (e.g. `"Delivered"`, `"On the Way"`), while each entry in `events[]` includes normalized `status`, raw `description`, and UPS's 2-character activity `code` (e.g. `"KB"`, `"OT"`, `"AR"`, `"DP"`, `"MP"`). ## Carrier-Specific Status & Integration Notes - **Exact UTC (`timestamp`) and scan-local (`localTime`) clocks**: UPS reports both `gmtDate`/`gmtTime` (down to the second in UTC, e.g. `"2026-10-23T20:17:14Z"`) and the scan location's wall-clock time (`date`/`time`, normalized to `"2026-10-23T15:17:00"`). Both `timestamp` and `localTime` are populated on every scan. - **UPS status type mapping**: UPS package status types map deterministically to the 7 normalized statuses: `M` → `label_created`, `I` → `in_transit`, `O` → `out_for_delivery`, `D` → `delivered`, `X` → `exception`, and `RS` → `returned`. - **Service level & proof of delivery**: `service` returns the specific UPS service product (such as `"UPS Ground"`, `"UPS Next Day Air"`, or `"UPS 2nd Day Air"`), and `signedBy` captures the receiver name or release location (`receivedBy`) when available. ## Related Resources - **Live browser lookup tool**: [Track a UPS package live on lastscanned.com/lookup/ups](https://lastscanned.com/lookup/ups) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Urbano Tracking API & MCP URL: https://docs.lastscanned.com/carriers/urbano Query live **Urbano** (`urbano`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=urbano` (or the MCP `carrier` argument) so the lookup goes to Urbano. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `urbano` | | **Brand aliases** | Urbano, Urbano Express, Urbano Peru, urbano.com.pe | | **Category** | Regional (courier, Peru / Ecuador) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=33555601,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Eight-digit guías are a shape other carriers also use, so pass `?carrier=urbano`. Accepted shape: `^\d{8}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/33555601?carrier=urbano" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "urbano", "trackingNumber": "33555601", "status": "delivered", "statusDescription": "ENTREGAMOS TU PEDIDO: Entrega A Titular", "service": null, "deliveredAt": "2026-03-12T02:12:00Z", "deliveredAtLocal": "2026-03-11T21:12:00", "signedBy": null, "destination": { "city": "Cusco", "state": null, "country": null }, "events": [ { "timestamp": "2026-03-12T02:12:00Z", "localTime": "2026-03-11T21:12:00", "status": "delivered", "description": "ENTREGAMOS TU PEDIDO: Entrega A Titular", "location": "Cusco", "code": "EN" }, { "timestamp": "2026-03-11T15:05:00Z", "localTime": "2026-03-11T10:05:00", "status": "out_for_delivery", "description": "SALIO A ENTREGARSE", "location": "Cusco", "code": "ER" }, { "timestamp": "2026-03-10T01:12:00Z", "localTime": "2026-03-09T20:12:00", "status": "in_transit", "description": "DESPACHAMOS A SU CIUDAD", "location": "Lima", "code": "DD" }, { "timestamp": "2026-03-06T15:28:00Z", "localTime": "2026-03-06T10:28:00", "status": "label_created", "description": "PEDIDO CREADO", "location": "Lima", "code": "PU" } ] } ``` ## Notes - **Codes**: `code` is the movement code (`PU` created, `AO` received at origin, `CK` pre-boarding, `DD` dispatched, `AR` at the destination city, `ER` out for delivery, `CV` attempt, `EN` delivered). A delivery attempt reports `exception`, with the reason after the title. - **Time zone**: Peru and Ecuador both sit at UTC-5 all year, so times carry -05:00. The agency code on each movement is shown as the origin or destination city. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Urvaam Tracking API & MCP URL: https://docs.lastscanned.com/carriers/urvaam Query live **Urvaam** (`urvaam`, Spain last mile) status and scan history in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `urvaam` | | **Brand aliases** | Urvaam Spain | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Pass `?carrier=urvaam` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/2754952309141741?carrier=urvaam" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "urvaam", "trackingNumber": "2754952309141741", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-14T09:07:28", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-14T09:07:28", "status": "delivered", "description": "Delivered", "location": null, "code": "3" }, { "timestamp": null, "localTime": "2026-03-14T09:04:44", "status": "out_for_delivery", "description": "On its way to the courier", "location": null, "code": "2" }, { "timestamp": null, "localTime": "2026-03-04T19:09:24", "status": "label_created", "description": "Order placed", "location": null, "code": "0" } ] } ``` ## Notes - **Source**: the JSON API behind Urvaam's tracking page. A batch of numbers goes in one request. Sixteen digits is a shape shared with other carriers, so use `?carrier=urvaam`. - **Time zone**: the page does not state one, so only `localTime` is set. - **Statuses**: from Urvaam's `track_status` (1 registered, 2 in transit, 3 on its way, 4 delivered, 5/6 problem or pickup point, 7 return). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Usky Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/usky Query live **Usky Express** (`usky`) package status and scan history in a single synchronous `GET` request or MCP tool call. Usky Express numbers share their shape with other carriers' numbers, so pass `?carrier=usky`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `usky` | | **Brand aliases** | Usky Express, 全酋通物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=usky` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=usky` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Usky Express tracking numbers have no shape of their own, so always pass `?carrier=usky`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Usky Express in one request. - **Platform**: Usky Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # USPS Tracking API & MCP URL: https://docs.lastscanned.com/carriers/usps Query live **United States Postal Service (USPS)** (`usps`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` detects 20–26 digit USPS IMpb barcodes (including `420` + ZIP routing prefixes) and UPU S10 international tracking numbers, returning a normalized `TrackingResult` JSON payload—without requiring a USPS Web Tools / COPRA developer registration or MID/CRID onboarding. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `usps` | | **Brand & service aliases** | United States Postal Service, USPS Ground Advantage, Priority Mail, Priority Mail Express, First-Class Package International, Certified Mail, Media Mail | | **Category** | US national postal service | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=9400...,9205...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for USPS instead of direct requests - **Avoid Akamai challenge pages & `403` blocks from serverless backends**: Direct requests to `tools.usps.com` from Cloudflare Workers, Vercel, or AWS Lambda frequently receive blank Akamai challenge responses or HTTP `403` blocks. Calling `GET https://api.lastscanned.com/v1/track/9500113174066286229114?carrier=usps` from your serverless function returns structured JSON in one `fetch()`. - **No USPS COPRA / Web Tools migration friction**: USPS retired legacy Web Tools XML endpoints in favor of the v3 OAuth API requiring Business Customer Gateway accounts, Mailer IDs (MID), and Customer Registration IDs (CRID). `lastscanned` requires zero USPS account onboarding. - **Cross-border & consolidator handoff target**: Cross-border parcels from [Yanwen](https://docs.lastscanned.com/carriers/yanwen), [4PX](https://docs.lastscanned.com/carriers/4px), [Cainiao](https://docs.lastscanned.com/carriers/cainiao), [YunExpress](https://docs.lastscanned.com/carriers/yunexpress), [CNE Express](https://docs.lastscanned.com/carriers/cne), and [SunYou](https://docs.lastscanned.com/carriers/sunyou)—plus domestic consolidators like [OSM Worldwide](https://docs.lastscanned.com/carriers/osm), [Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes), and DHL eCommerce—induct into USPS under `420` + ZIP + `92/93…` barcodes that `lastscanned` tracks natively. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) USPS is evaluated **second (#2)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — Domestic IMpb** | `/^(420\d{5})?9[2345]\d{18,24}$/` (20–26 digits starting `92`, `93`, `94`, or `95`, optionally preceded by `420` + 5-digit ZIP) | — | `9400111899223847192011`, `420787019261290312839104827163` | | **Pass 1 (`matches`) — UPU S10** | `/^[A-Z]{2}\d{9}US$/i` (2 letters + 9 digits + `US`) | **Yes — `s10(n)` (Mod-11)** | `LK987654323US` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### UPU `s10` Mod-11 check-digit algorithm For 13-character international numbers ending in `US`, `lastscanned` validates the 9th digit (index 10) against the first 8 serial digits using UPU S10 weights `[8, 6, 4, 2, 3, 5, 9, 7]`: ```ts /** UPU S10 (EA123456785US): weights 8,6,4,2,3,5,9,7 over the 8 serial digits, mod 11. */ export function s10(n: string): boolean { const d = n.slice(2, 11); const w = [8, 6, 4, 2, 3, 5, 9, 7]; const c = 11 - (w.reduce((s, x, i) => s + x * Number(d[i]), 0) % 11); return (c === 10 ? 0 : c === 11 ? 5 : c) === Number(d[8]); } ``` ### Disambiguating 22-digit USPS vs FedEx & Consolidator Labels (`?carrier=osm`, `?carrier=pitneybowes`) - **No collision with FedEx 22-digit SmartPost**: USPS 22-digit IMpb labels start with `92`, `93`, `94`, or `95`, whereas FedEx 22-digit numbers start with `96` (`/^96\d{20}$/`). Both auto-detect without `?carrier=`. - **Resolving `"USPS Currently Awaiting Package"` on `92…` consolidator labels**: When a parcel is shipped through **[OSM Worldwide](https://docs.lastscanned.com/carriers/osm)** or **[Pitney Bowes](https://docs.lastscanned.com/carriers/pitneybowes)** using a `92…` (or `420` + ZIP + `92…`) USPS barcode, USPS only displays *"Pre-Shipment / Picked Up by Shipping Partner, USPS Awaiting Item"* until the consolidator drops the bag at the local USPS facility days later. Pass **`?carrier=osm`** or **`?carrier=pitneybowes`** with that same `92…` number to retrieve the consolidator's live middle-mile sort scans! - **When `?carrier=usps` is required**: Legacy 20-digit Certified Mail labels starting with `70…`, 13-character inbound international S10 parcels originating outside the US (e.g. `RR…GB`, `CP…CN` once handed to USPS), or 10-digit Global Express Guaranteed numbers. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/9500113174066286229114?carrier=usps" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/9500113174066286229114?carrier=usps", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.statusDescription, pkg.events[0]); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "9400111899223847192011" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "usps", "trackingNumber": "9500113174066286229114", "status": "delivered", "statusDescription": "Delivered, In/At Mailbox", "service": "USPS Ground Advantage - Retail", "deliveredAt": null, "deliveredAtLocal": "2026-10-19T16:22:00", "signedBy": null, "destination": { "city": "Gainesville", "state": "FL", "country": "US" }, "estimatedDelivery": null, "events": [ { "timestamp": null, "localTime": "2026-10-19T16:22:00", "status": "delivered", "description": "Delivered, In/At Mailbox", "location": "Gainesville, FL", "code": null }, { "timestamp": null, "localTime": "2026-10-19T06:10:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "Gainesville, FL", "code": null }, { "timestamp": "2026-10-13T21:46:00Z", "localTime": "2026-10-13T17:46:00", "status": "in_transit", "description": "USPS in possession of the item", "location": "Newtonville, MA", "code": null } ] } ``` > **Raw status & scan fields**: USPS does not expose numeric event codes on public tracking timelines, so `events[].code` is `null` while `statusDescription`, `message`, and `events[].description` preserve the exact USPS scan wording (e.g. `"Delivered, In/At Mailbox"`, `"Arrived at USPS Regional Facility"`). ## Carrier-Specific Status & Integration Notes - **Timestamps (`localTime` and `timestamp`)**: USPS prints wall-clock times without an explicit UTC offset on each scan row (and date-only strings like `"2026-10-22"` on transit facility milestones without a clock time). `lastscanned` preserves the exact printed clock in `localTime` and converts full date-time scans to UTC in `timestamp`. - **Top-level `message` summary**: USPS provides a human-readable summary sentence for the latest scan (for example, *"Your item was delivered in or at the mailbox at 2:12 pm…"* or *"Your package will arrive later than expected, but is still on its way."*), which is returned in `message`. - **Up to 35 USPS numbers per batch**: `GET /v1/track?numbers=...` and the MCP `track_packages` tool accept up to 35 USPS tracking numbers in a single batch call. ## Related Resources - **Live browser lookup tool**: [Track a USPS package live on lastscanned.com/lookup/usps](https://lastscanned.com/lookup/usps) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Uzbekistan Post Tracking API & MCP URL: https://docs.lastscanned.com/carriers/uzbekistanpost Query live **Uzbekistan Post** (`uzbekistanpost`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects these numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `uzbekistanpost` | | **Brand aliases** | Uzbekistan Post, Uzbek Post, UzPost, O'zbekiston Pochtasi, pochta.uz | | **Category** | International (national postal operator, Uzbekistan) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=CI152320192UZ,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `s10From("UZ")` | S10 mod 11 | `CI152320192UZ` | | **Pass 2 (`mayMatch`)** | none | none | none | S10 numbers ending `UZ` with a valid check digit belong to Uzbekistan Post, so `?carrier=uzbekistanpost` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/CI152320192UZ?carrier=uzbekistanpost" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "uzbekistanpost", "trackingNumber": "CI152320192UZ", "status": "delivered", "statusDescription": "Issued to recipient", "service": "Bir Qadam - Qopsiz", "deliveredAt": "2026-03-12T10:25:35Z", "deliveredAtLocal": "2026-03-12T15:25:35", "signedBy": null, "destination": { "city": "Shofirkon", "state": null, "country": "UZ" }, "events": [ { "timestamp": "2026-03-12T10:25:35Z", "localTime": "2026-03-12T15:25:35", "status": "delivered", "description": "Issued to recipient", "location": "UzPost - Shofirkon Pochtamt", "code": "issued_to_recipient" }, { "timestamp": "2026-03-12T10:22:35Z", "localTime": "2026-03-12T15:22:35", "status": "out_for_delivery", "description": "Out for delivery", "location": "UzPost - Shofirkon Pochtamt", "code": "out_for_delivery" }, { "timestamp": "2026-03-08T11:07:37Z", "localTime": "2026-03-08T16:07:37", "status": "label_created", "description": "New order", "location": "UzPost - Marg'ilon Pochtamt", "code": "unassigned" } ] } ``` ## Notes - **Statuses**: `code` is UzPost's status (`unassigned`, `in_sorting_facility`, `in_transit`, `ready_for_issue`, `out_for_delivery`, `issued_to_recipient`); the description is the English label. `ready_for_issue` (waiting at the post office) reports `exception`. - **Time zone**: Uzbekistan has one offset (+05:00, no DST); the API gives UTC times. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Valmo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/valmo Query live **Valmo** (`valmo`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `valmo` | | **Brand aliases** | Valmo Logistics, Meesho Valmo, valmo.in | | **Category** | Indian e-commerce logistics (Meesho) | | **Region** | India | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=VL0085433818083,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^VL\d{13}$/` | none | `VL0085433818083` | | **Pass 2 (`mayMatch`)** | none | none | none | `VL` plus 13 digits belongs to Valmo alone, so `?carrier=valmo` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/VL0085433818083?carrier=valmo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "valmo", "trackingNumber": "VL0085433818083", "status": "delivered", "statusDescription": "Order has been delivered", "service": null, "deliveredAt": "2026-03-24T12:17:50Z", "deliveredAtLocal": "2026-03-24T17:47:50", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-24T12:17:50Z", "localTime": "2026-03-24T17:47:50", "status": "delivered", "description": "Delivered", "location": null, "code": "ORDER_DELIVERED" }, { "timestamp": "2026-03-24T06:53:16Z", "localTime": "2026-03-24T12:23:16", "status": "out_for_delivery", "description": "Out for Delivery", "location": null, "code": "ORDER_OUT_FOR_DELIVERY" }, { "timestamp": "2026-03-20T13:02:36Z", "localTime": "2026-03-20T18:32:36", "status": "in_transit", "description": "Reached Pune hub", "location": "Pune", "code": "ORDER_REACHED_HUB" } ] } ``` ## Notes - **Time zone**: scan times are epoch milliseconds, shown at India Standard Time (`+05:30`). - **Stages**: the reply groups scans into stages (confirmed, shipped, out for delivery, delivered) with the hub scans nested under *shipped*; the adapter flattens them into one list. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Vasp Expresso (Portugal) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/vaspexpresso Query live **Vasp Expresso** (`vaspexpresso`) package status and scan history in a single synchronous `GET` request or MCP tool call. Vasp numbers are 13 digits (service barcode) or 16 digits (volume barcode), shapes other carriers share, so pass `?carrier=vaspexpresso`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `vaspexpresso` | | **Brand aliases** | Vasp Expresso, Vasp, VASP Portugal | | **Category** | Parcel courier (Portugal) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1331326492431,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1331326492431?carrier=vaspexpresso" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "vaspexpresso", "trackingNumber": "1331326492431", "status": "delivered", "statusDescription": "Delivered to customer", "service": null, "deliveredAt": "2026-09-17T08:20:12Z", "deliveredAtLocal": "2026-09-17T09:20:12", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-09-17T08:20:12Z", "localTime": "2026-09-17T09:20:12", "status": "delivered", "description": "Delivered to customer", "location": "Algarve", "code": "18" }, { "timestamp": "2026-09-15T07:40:23Z", "localTime": "2026-09-15T08:40:23", "status": "out_for_delivery", "description": "Loaded in vehicle", "location": "Algarve", "code": "7" }, { "timestamp": "2026-09-10T23:38:40Z", "localTime": "2026-09-11T00:38:40", "status": "in_transit", "description": "At depot", "location": "Lisboa", "code": "10" }, { "timestamp": "2026-09-10T18:27:14Z", "localTime": "2026-09-10T19:27:14", "status": "label_created", "description": "Created in system", "location": null, "code": "1" } ] } ``` ## Notes - **Failures**: a delivery that failed reads like `Distribution incidence: Absent Recipient` and reports `exception`. - **Time zone**: `createdDateUtc` is the UTC instant and `localTime` is that instant on the Portuguese clock (`Europe/Lisbon`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Veho Tracking API & MCP URL: https://docs.lastscanned.com/carriers/veho Query live **Veho** (`veho`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 14-character `VH…` tracking numbers and returns a normalized `TrackingResult` JSON payload—without requiring a Veho enterprise client integration, webhook receiver, or Firebase App Check token flow. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `veho` | | **Brand & service aliases** | Veho, ShipVeho, Veho Next-Day Delivery, Veho Doorstep | | **Category** | US regional e-commerce & subscription last-mile carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=VH...,VH...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Veho instead of direct requests - **Bypass Firebase App Check & reCAPTCHA Enterprise `401`/`403` rejections**: If you try to call `graph.shipveho.com/graphql` (`getOrderByTrackingIdCWA`) from a Cloudflare Worker, Vercel function, or AWS Lambda, Veho rejects the call with `401 Unauthorized` / `403 Forbidden` unless it carries a live Firebase App Check token minted via reCAPTCHA Enterprise. Calling `GET https://api.lastscanned.com/v1/track/VH2PN7CHYPNMPR?carrier=veho` from your backend returns normalized JSON in a single `fetch()`. - **No enterprise shipper contract required**: Veho's merchant webhooks and APIs are available only to contracted enterprise shippers. `lastscanned` works immediately for any developer, post-purchase portal, or WISMO AI agent. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Veho is evaluated **ninth (#9)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^VH[0-9A-Z]{12}$/i` (`VH` + 12 alphanumeric characters = 14 chars) | — | `VH2PN7CHYPNMPR`, `VH8K4M2P9X1Q7Z` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=veho` optional vs required? - **Optional (auto-detected)**: All 14-character `VH` + 12 alphanumeric tracking numbers auto-detect in Pass 1 (before AxleHire's 12/16-char alphanumeric rule in Pass 2). - **Required (`?carrier=veho`)**: Shipper-assigned tracking numbers or merchant order barcodes inducted into Veho that do not start with `VH`. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/VH2PN7CHYPNMPR?carrier=veho" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/VH2PN7CHYPNMPR?carrier=veho", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.statusDescription, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "VH2PN7CHYPNMPR" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "veho", "trackingNumber": "VH2PN7CHYPNMPR", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-10-22T20:46:52Z", "deliveredAtLocal": "2026-10-22T15:46:52", "signedBy": null, "destination": { "city": "DALLAS", "state": "TX", "country": "US" }, "estimatedDelivery": null, "message": null, "events": [ { "timestamp": "2026-10-22T20:46:52Z", "localTime": "2026-10-22T15:46:52", "status": "delivered", "description": "Delivered", "location": "Dallas, TX", "code": "delivered" }, { "timestamp": "2026-10-22T14:12:30Z", "localTime": "2026-10-22T09:12:30", "status": "out_for_delivery", "description": "Out for delivery", "location": "Dallas, TX", "code": "pickedUpFromVeho" }, { "timestamp": "2026-10-22T08:05:19Z", "localTime": "2026-10-22T03:05:19", "status": "in_transit", "description": "Arrived at Veho facility", "location": "Dallas, TX", "code": "PackageArrivedAtFacility" }, { "timestamp": "2026-10-21T16:40:00Z", "localTime": "2026-10-21T11:40:00", "status": "label_created", "description": "Order info received", "location": null, "code": "created" } ] } ``` > **Raw status & operation codes**: `events[].code` preserves Veho's GraphQL `operation` identifier (`"created"` → `label_created`; `"pickedUpFromClient"`, `"PackageLoadedOntoFirstMileTransit"`, `"droppedOffAtVeho"`, `"PackageArrivedAtFacility"`, `"PackageDepartedFromFacility"` → `in_transit`; `"pickedUpFromVeho"` → `out_for_delivery`; `"delivered"` → `delivered`; `"returned"`, `"returnedToClient"`, `"returnedToVeho"` → `returned`; `"misdelivered"`, `"PackageHadDeliveryIssue"`, `"PackageDelayed"`, `"cancelled"` → `exception`). ## Carrier-Specific Status & Integration Notes - **Exact UTC (`timestamp`) and local (`localTime`) clocks**: Veho provides millisecond-precision UTC timestamps alongside the package's IANA `timeZone` (e.g. `America/Chicago`), so both `timestamp` and `localTime` are populated on every event. - **Delivery alerts in `message`**: If Veho posts an order-level delivery alert (`order.alert.body`), `lastscanned` surfaces it in the top-level `message` field. ## Related Resources - **Live browser lookup tool**: [Track a Veho package live on lastscanned.com/lookup/veho](https://lastscanned.com/lookup/veho) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Veloces Tracking API & MCP URL: https://docs.lastscanned.com/carriers/veloces Query live **Veloces** (`veloces`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=veloces` (or the MCP `carrier` argument) so the lookup goes to Veloces. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `veloces` | | **Brand aliases** | Veloces, Veloces Delivery, veloces.app | | **Category** | Regional (last-mile courier, Colombia / Mexico / Ecuador / Chile) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=V4000919466,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^V\d{10}$/` | none | `V4000919466` | `V` plus ten digits is tried only when no other carrier claims the number; pass `?carrier=veloces` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/V4000919466?carrier=veloces" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "veloces", "trackingNumber": "V4000919466", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": "2026-03-12T20:32:39Z", "deliveredAtLocal": "2026-03-12T20:32:39", "signedBy": null, "destination": { "city": "QUITO", "state": null, "country": null }, "events": [ { "timestamp": "2026-03-12T20:32:39Z", "localTime": "2026-03-12T20:32:39", "status": "delivered", "description": "Entregado", "location": null, "code": "4" }, { "timestamp": "2026-03-12T14:49:40Z", "localTime": "2026-03-12T14:49:40", "status": "out_for_delivery", "description": "En Camino", "location": null, "code": "8" }, { "timestamp": "2026-03-11T00:18:52Z", "localTime": "2026-03-11T00:18:52", "status": "exception", "description": "Novedad: No contesta", "location": null, "code": "5" }, { "timestamp": "2026-03-08T15:02:18Z", "localTime": "2026-03-08T15:02:18", "status": "label_created", "description": "Guía Generada", "location": null, "code": "1" } ] } ``` ## Notes - **Statuses**: `code` is Veloces' status id (1 guide generated, 11 picked up, 2 and 13 warehouses, 3 on route, 8 on the way to the recipient, 5 and 17 incident, 4 delivered). An incident's note (for example `No contesta`) is appended. - **Time zone**: Veloces runs in several countries and the API gives UTC only, so `localTime` is the UTC clock time. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Venipak Tracking API & MCP URL: https://docs.lastscanned.com/carriers/venipak Query live **Venipak** (`venipak`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects parcel numbers (`V` + 5 digits + `E` + 7 digits). Shipment numbers (7 to 10 digits) are not auto-detected; pass `?carrier=venipak`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `venipak` | | **Brand aliases** | Venipak, Venipak Lithuania, Venipak Baltic | | **Category** | Parcel courier (Baltics) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=V29878E0228412,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | Parcel numbers: `/^V\d{5}E\d{7}$/` | none | `V29878E0228412` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/V29878E0228412?carrier=venipak" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "venipak", "trackingNumber": "V29878E0228412", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-02-06T16:49:00Z", "deliveredAtLocal": "2026-02-06T18:49:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-02-06T16:49:00Z", "localTime": "2026-02-06T18:49:00", "status": "delivered", "description": "Delivered", "location": null, "code": "9" }, { "timestamp": "2026-02-06T09:35:00Z", "localTime": "2026-02-06T11:35:00", "status": "out_for_delivery", "description": "Out for delivery", "location": null, "code": "2" }, { "timestamp": "2026-02-05T18:34:00Z", "localTime": "2026-02-05T20:34:00", "status": "in_transit", "description": "At terminal", "location": "KAUNAS", "code": "1" }, { "timestamp": "2026-01-22T12:24:00Z", "localTime": "2026-01-22T14:24:00", "status": "label_created", "description": "At sender", "location": null, "code": "2" } ] } ``` ## Notes - **Several parcels**: a shipment number can cover several parcels; their scans are merged and the parcel number is put in front of the `location`. - **Time zone**: Baltic local time (UTC+2, +3 in summer; the same in all three countries). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Via Cargo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/viacargo Query live **Via Cargo** (`viacargo`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=viacargo` (or the MCP `carrier` argument) so the lookup goes to Via Cargo. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `viacargo` | | **Brand aliases** | Via Cargo, ViaCargo, Vía Cargo, viacargo.com.ar | | **Category** | Regional (parcel and freight, Argentina) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=999008443755,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Twelve-digit envío numbers are a shape other carriers also use, so pass `?carrier=viacargo`. Accepted shape: `^\d{12}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/999008443755?carrier=viacargo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "viacargo", "trackingNumber": "999008443755", "status": "delivered", "statusDescription": "ENTREGADA", "service": "Via Cargo Estandar", "deliveredAt": "2026-03-12T13:45:00Z", "deliveredAtLocal": "2026-03-12T10:45:00", "signedBy": "JUAN PEREZ", "destination": { "city": "Villa Gesell", "state": "Buenos Aires", "country": "AR" }, "events": [ { "timestamp": "2026-03-12T13:45:00Z", "localTime": "2026-03-12T10:45:00", "status": "delivered", "description": "ENTREGADA", "location": "Villa Gesell", "code": "ENTR" }, { "timestamp": "2026-03-09T13:05:00Z", "localTime": "2026-03-09T10:05:00", "status": "in_transit", "description": "RECIBIDO EN DESTINO", "location": "Villa Gesell", "code": "RCPV" }, { "timestamp": "2026-03-05T18:19:00Z", "localTime": "2026-03-05T15:19:00", "status": "label_created", "description": "INGRESO A VIA CARGO", "location": "Olivos - Echeverria 2870", "code": "ALTA" } ] } ``` ## Notes - **Codes**: `code` is the event type (`ALTA` entered, `RECD` received at a distribution centre, `MANI` manifest, `CPCE` departed, `RCPV` received at the destination branch, `ENTR` delivered). - **Time zone**: Argentina has one offset (-03:00, no DST). The request carries the site script's public key and an empty captcha token. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Vimenpaq Tracking API & MCP URL: https://docs.lastscanned.com/carriers/vimenpaq Query live **Vimenpaq** (`vimenpaq`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=vimenpaq` (or the MCP `carrier` argument) so the lookup goes to Vimenpaq. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `vimenpaq` | | **Brand aliases** | Vimenpaq, Vimenpaq Express, vimenpaq.com | | **Category** | Regional (cargo and courier, Dominican Republic / United States / Spain) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SVM0063108325,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Three letters plus ten digits is a shape other carriers also use, so pass `?carrier=vimenpaq`. Accepted shape: `^[A-Z]{3}\d{10}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/SVM0063108325?carrier=vimenpaq" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "vimenpaq", "trackingNumber": "SVM0063108325", "status": "delivered", "statusDescription": "Entregado", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-12T15:44:46", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-12T15:44:46", "status": "delivered", "description": "Entregado", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-12T12:42:48", "status": "exception", "description": "Disponible para retiro", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-10T23:43:56", "status": "out_for_delivery", "description": "En ruta para entrega", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-10T17:11:58", "status": "in_transit", "description": "Recibido en Centro de Distribución", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-06T15:31:11", "status": "label_created", "description": "En proceso de recoleccion", "location": null, "code": null } ] } ``` ## Notes - **Repeats**: the same status is often logged several times within seconds (for example `Disponible para retiro`); repeats within a minute are collapsed. The internal comment field (bin and bag numbers) is not returned. - **Time zone**: the API prints no zone, so only `localTime` is set. `Disponible para retiro` (ready for pickup) reports `exception`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Vinted Go Tracking API & MCP URL: https://docs.lastscanned.com/carriers/vintedgo Query live **Vinted Go** (`vintedgo`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `vintedgo` | | **Brand aliases** | VintedGo, Vinted Go Parcel, Vinted Go Locker | | **Category** | Marketplace parcel-shop and locker delivery (FR, BE, NL, ES, PT) | | **Region** | France / Benelux / Iberia | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1787868588362357,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^1[78]\d{14}$/` | none | `1787868588362357` | A 16-digit id beginning `17` or `18` that nothing else claims is tried against Vinted Go. Other carriers use 16 digits too, so pass `?carrier=vintedgo` when in doubt. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1787868588362357?carrier=vintedgo" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "vintedgo", "trackingNumber": "1787868588362357", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-09-07T11:47:06Z", "deliveredAtLocal": "2026-09-07T11:47:06", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-09-07T11:47:06Z", "localTime": "2026-09-07T11:47:06", "status": "delivered", "description": "Delivered", "location": null, "code": "delivered" }, { "timestamp": "2026-09-06T11:36:42Z", "localTime": "2026-09-06T11:36:42", "status": "exception", "description": "Ready to collect at the parcel shop", "location": "Example Street 1, Lisbon, PT", "code": "ready_for_pickup" }, { "timestamp": "2026-09-05T06:19:18Z", "localTime": "2026-09-05T06:19:18", "status": "in_transit", "description": "At sorting center in Lisbon, PT", "location": "Lisbon, PT", "code": "in_transit" }, { "timestamp": "2026-08-27T22:09:48Z", "localTime": "2026-08-27T22:09:48", "status": "label_created", "description": "Shipment created", "location": null, "code": "created" } ] } ``` ## Notes - **Time zone**: events are UTC (`…Z`). - **Ready to collect**: a parcel waiting at a shop or locker is reported as `exception`, as the other carriers' *ready for collection* scans are. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Vozovoz Tracking API & MCP URL: https://docs.lastscanned.com/carriers/vozovoz Query live **Vozovoz** (`vozovoz`, Russian freight) order status in a single synchronous request. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `vozovoz` | | **Brand aliases** | Возовоз, Vozovoz Russia | | **Category** | Regional | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Pass `?carrier=vozovoz` so the number is routed here. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/250411646?carrier=vozovoz" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "vozovoz", "trackingNumber": "250411646", "status": "delivered", "statusDescription": "Груз выдан", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-19T13:42:43", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-19T13:42:43", "status": "delivered", "description": "Груз выдан", "location": null, "code": null }, { "timestamp": null, "localTime": "2026-03-15T13:54:57", "status": "label_created", "description": "Заказ создан", "location": null, "code": null } ] } ``` ## Notes - **Source**: the JSON that vozovoz.ru's tracking form calls. It holds the order's milestone dates, not a scan list, so there are two events at most. Nine digits is shared with other carriers, so use `?carrier=vozovoz`. - **Time zone**: Russian times carry no zone, so only `localTime` is set. - **In-transit orders**: the live answer for an order still in motion was not available when this was written; non-delivered orders are reported `in_transit`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # VRL Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/vrllogistics Query live **VRL Logistics** (`vrllogistics`) package status and scan history in a single synchronous `GET` request or MCP tool call. Pass `?carrier=vrllogistics` (or the MCP `carrier` argument) so the lookup goes to VRL Logistics. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `vrllogistics` | | **Brand aliases** | VRL Logistics, VRL, VRL Cargo, VRL Parcel, vrlgroup.in | | **Category** | Regional (surface logistics, India) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1085512249,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Nine- and ten-digit LR numbers are a shape other carriers also use, so pass `?carrier=vrllogistics`. Accepted shape: `^\d{9,10}$`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1085512249?carrier=vrllogistics" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "vrllogistics", "trackingNumber": "1085512249", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": "2026-03-12T09:31:00Z", "deliveredAtLocal": "2026-03-12T15:01:00", "signedBy": null, "destination": { "city": "CHENNAI ENNORE", "state": null, "country": "IN" }, "events": [ { "timestamp": "2026-03-12T09:31:00Z", "localTime": "2026-03-12T15:01:00", "status": "delivered", "description": "Delivered", "location": "CHENNAI ENNORE", "code": null }, { "timestamp": "2026-03-12T04:31:00Z", "localTime": "2026-03-12T10:01:00", "status": "in_transit", "description": "Arrived at destination", "location": "CHENNAI ENNORE", "code": null }, { "timestamp": "2026-03-08T13:31:00Z", "localTime": "2026-03-08T19:01:00", "status": "in_transit", "description": "In transit", "location": "DELHI PATPARGANJ", "code": null }, { "timestamp": null, "localTime": "2026-03-07", "status": "in_transit", "description": "Booked", "location": "DELHI", "code": null } ] } ``` ## Notes - **Scans**: each completed step of the page's progress bar is a scan (booking has a date only; hub steps have a time, branch code and name). - **Time zone**: India has one offset (+05:30). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Whistl (Parcelhub) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/whistl Query live **Whistl** (`whistl`, the Parcelhub tracker) status, scan history and the **underlying carrier's tracking number** in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `whistl` | | **Brand aliases** | Whistl, Parcelhub, Whistl Parcelhub | | **Category** | UK parcel hub and shipping platform | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=TYPQYU501214190,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^TYP[A-Z]{3}\d{9}$/` | none | `TYPQYU501214190` | Parcelhub references have no single published shape, so only the `TYP…` form seen so far is tried automatically. Pass `?carrier=whistl` for any other reference. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/TYPQYU501214190?carrier=whistl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "whistl", "trackingNumber": "TYPQYU501214190", "status": "in_transit", "statusDescription": "Arrived at hub", "service": "EU DDP Premium", "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": null, "message": "Handed to Interpost as 011B004A44001390720001", "events": [ { "timestamp": null, "localTime": "2026-09-09T08:12:40", "status": "in_transit", "description": "Arrived at hub", "location": null, "code": "Arrived" }, { "timestamp": null, "localTime": "2026-09-08T13:21:25", "status": "label_created", "description": "Shipment Created", "location": null, "code": "Shipment Created" } ] } ``` ## Notes - **Handoff**: `message` names the carrier Parcelhub passed the parcel to and its number (for example `"Handed to Interpost as 011B004A44001390720001"`). - **Time zone**: the page prints day-first wall-clock times with no zone, so events carry `localTime` only (`timestamp` is `null`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Winit Tracking API & MCP URL: https://docs.lastscanned.com/carriers/winit Query live **Winit** (`winit`) package status and scan history in a single synchronous `GET` request or MCP tool call. Winit takes its own order number, or the last-mile tracking number on the label. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `winit` | | **Brand aliases** | Winit, 万邑通, Winit Logistics | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=winit` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=winit` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Winit order numbers and the last-mile numbers they travel under use shapes other carriers also use, so always pass `?carrier=winit`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/WO9152844585?carrier=winit" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "winit", "trackingNumber": "WO9152844585", "status": "in_transit", "statusDescription": "In Transit - Departed facility", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "message": "Handed to USPS as 9400111899223197428490", "events": [ { "timestamp": null, "localTime": "2026-10-22T07:40:00", "status": "in_transit", "description": "In Transit - Departed facility", "location": "Memphis, TN", "code": null }, { "timestamp": null, "localTime": "2026-10-19T13:20:00", "status": "in_transit", "description": "Picked up - Parcel collected", "location": "Shenzhen", "code": null } ] } ``` ## Notes - **Time zone**: scan times come with no zone and span several countries, so `localTime` is each scan's clock time and `timestamp` is `null`. - **Status**: Winit files each parcel as handed to the post, in transit, undelivered, delivered or alert; those decide `delivered` and `exception`. - **Batches**: up to 30 numbers go to Winit in one request. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # WM Cloud Tracking API & MCP URL: https://docs.lastscanned.com/carriers/wmycc Query live **WM Cloud** (`wmycc`) package status and scan history in a single synchronous `GET` request or MCP tool call. WM Cloud numbers share their shape with other carriers' numbers, so pass `?carrier=wmycc`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `wmycc` | | **Brand aliases** | WM Cloud, 万盟云仓 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=wmycc` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=wmycc` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | WM Cloud tracking numbers have no shape of their own, so always pass `?carrier=wmycc`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to WM Cloud in one request. - **Platform**: WM Cloud runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # XDE Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/xdelogistics Query live **XDE Logistics** (`xdelogistics`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `XSO…` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `xdelogistics` | | **Brand aliases** | XDE Logistics, XDE, XDE Philippines | | **Category** | Philippines domestic parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=XSO000001356184,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^XSO\d{12}$/` | none | `XSO000001356184` | | **Pass 2 (`mayMatch`)** | none | none | none | `XSO` numbers belong to XDE alone, so `?carrier=xdelogistics` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/XSO000001356184?carrier=xdelogistics" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "xdelogistics", "trackingNumber": "XSO000001356184", "status": "delivered", "statusDescription": "Delivery successful", "service": null, "deliveredAt": "2026-03-12T05:51:31Z", "deliveredAtLocal": "2026-03-12T13:51:31", "signedBy": "Juan Dela Cruz", "destination": { "city": "Quezon City", "state": "Metro Manila", "country": "PH" }, "events": [ { "timestamp": "2026-03-12T05:51:31Z", "localTime": "2026-03-12T13:51:31", "status": "delivered", "description": "Delivery successful", "location": null, "code": null }, { "timestamp": "2026-03-11T08:04:24Z", "localTime": "2026-03-11T16:04:24", "status": "out_for_delivery", "description": "First delivery attempt", "location": null, "code": null }, { "timestamp": "2026-03-10T10:23:28Z", "localTime": "2026-03-10T18:23:28", "status": "in_transit", "description": "Received at hub", "location": "Manila Main Warehouse", "code": null } ] } ``` ## Notes - **Time zone**: scan times are Philippine wall clock (`Asia/Manila`), converted to `timestamp`. - **Signer**: `signedBy` is the name XDE records on the delivery scan. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # XLCourier Tracking API & MCP URL: https://docs.lastscanned.com/carriers/xlcourier Query live **XLCourier** (`xlcourier`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `XLC…` numbers. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `xlcourier` | | **Brand aliases** | XLCourier, XL Courier, XLC | | **Category** | UK parcel delivery | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=XLC354092310529,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^XLC\d{10,12}$/` | none | `XLC354092310529` | | **Pass 2 (`mayMatch`)** | none | none | none | `XLC` numbers belong to XLCourier alone, so `?carrier=xlcourier` is optional. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/XLC354092310529?carrier=xlcourier" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "xlcourier", "trackingNumber": "XLC354092310529", "status": "delivered", "statusDescription": "Your parcel has been delivered successfully. Thank you!", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-12T15:25:23", "signedBy": null, "destination": { "city": null, "state": null, "country": "GB" }, "events": [ { "timestamp": null, "localTime": "2026-10-12T15:25:23", "status": "delivered", "description": "Your parcel has been delivered successfully. Thank you!", "location": null, "code": "1600" }, { "timestamp": null, "localTime": "2026-10-12T08:00:42", "status": "out_for_delivery", "description": "Your parcel is currently out for delivery.", "location": null, "code": "1000" }, { "timestamp": null, "localTime": "2026-10-02T04:28:05", "status": "label_created", "description": "Your shipment information has been submitted.", "location": null, "code": "100" } ] } ``` ## Notes - **Codes**: `code` is XLCourier's numeric event status (100 created, 600 received, 1000 out for delivery, 1100 delivery failed, 1600 delivered). - **Time zone**: times carry no zone, so events have `localTime` only (`timestamp` is `null`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # XPO LTL Tracking API & MCP URL: https://docs.lastscanned.com/carriers/xpoltl Query live **XPO LTL** (`xpoltl`) PRO status, terminal scan history, consignee city and signer in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `xpoltl` | | **Brand aliases** | XPO, XPO LTL, XPO Logistics, Con-way Freight | | **Category** | US LTL freight (PRO numbers) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=817817302,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^\d{9}$/` (only when no other carrier claims it) | none | `817817302` | A 9-digit PRO is a common shape, so XPO is only tried when no other carrier claims the number. Pass `?carrier=xpoltl` to be sure. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/817817302?carrier=xpoltl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "xpoltl", "trackingNumber": "817817302", "status": "delivered", "statusDescription": "Final delivered from XPN", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-10-13T17:17:00", "signedBy": "J Smith", "destination": { "city": "Port Huron", "state": "MI", "country": "US" }, "events": [ { "timestamp": null, "localTime": "2026-10-13T17:17:00", "status": "delivered", "description": "Final delivered from XPN", "location": "Warren, MI", "code": null }, { "timestamp": null, "localTime": "2026-10-13T11:25:00", "status": "out_for_delivery", "description": "Out for delivery from XPN - P&D route: PHN 11LG", "location": "Warren, MI", "code": null }, { "timestamp": null, "localTime": "2026-10-08T15:04:00", "status": "in_transit", "description": "Loaded on trailer", "location": "Salt Lake City, UT", "code": null } ] } ``` ## Notes - **Time zone**: XPO prints each scan in the local time of its service center without naming a zone, so events carry `localTime` only (`timestamp` is `null`). - **Sources**: scans come from XPO's shipment history page; the consignee city and signer from its tracking page. - **Availability**: a PRO XPO cannot show (not yet picked up, or unknown) returns `not_found`. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # XQ Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/xqexpress Query live **XQ Express** (`xqexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. XQ Express numbers share their shape with other carriers' numbers, so pass `?carrier=xqexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `xqexpress` | | **Brand aliases** | XQ Express, | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=xqexpress` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=xqexpress` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | XQ Express tracking numbers have no shape of their own, so always pass `?carrier=xqexpress`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to XQ Express in one request. - **Platform**: XQ Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # XS Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/xsexp Query live **XS Express** (`xsexp`) package status and scan history in a single synchronous `GET` request or MCP tool call. XS Express numbers share their shape with other carriers' numbers, so pass `?carrier=xsexp`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `xsexp` | | **Brand aliases** | XS Express, 新树物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=xsexp` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=xsexp` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | XS Express tracking numbers have no shape of their own, so always pass `?carrier=xsexp`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to XS Express in one request. - **Platform**: XS Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Yamato Transport (Kuroneko Yamato / ヤマト運輸) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yamato Query live **Yamato Transport** (`yamato`, クロネコヤマト / TA-Q-BIN) package status and scan history in a single synchronous `GET` request or MCP tool call. Up to 10 numbers go out in one request to Yamato's own tracking system. Pass `?carrier=yamato`: Yamato's 12-digit invoice numbers share their shape with FedEx. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yamato` | | **Brand & service aliases** | Yamato Transport, Kuroneko Yamato, クロネコヤマト, ヤマト運輸, TA-Q-BIN, 宅急便 | | **Category** | Japan domestic parcel | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=yamato` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=303142820352,303142820352&carrier=yamato` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=yamato`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | *None* | — | — | | **Pass 2 (`mayMatch`)** | `/^\d{12}$/` where the last digit equals the first 11 digits mod 7 | mod 7 | `303142820352` | | **Explicit (`?carrier=yamato`)** | Any Yamato invoice number (伝票番号) | mod 7 | `303142820352` | ### When is `?carrier=yamato` optional vs required? - **Required**: a 12-digit run is also a [FedEx](https://docs.lastscanned.com/carriers/fedex) shape, which wins auto-detection. Always pass `?carrier=yamato` for Yamato invoice numbers. - Numbers with a wrong check digit come back `not_found` (伝票番号誤り). ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/303142820352?carrier=yamato" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```ts const res = await fetch("https://api.lastscanned.com/v1/track/303142820352?carrier=yamato", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.events[0]); ``` MCP `track_package` tool call: ```json { "tool": "track_package", "arguments": { "tracking_number": "303142820352", "carrier": "yamato" } } ``` Normalized `TrackingResult` response: ```json { "carrier": "yamato", "trackingNumber": "303142820352", "status": "delivered", "statusDescription": "配達完了", "service": null, "deliveredAt": "2026-10-21T02:05:00Z", "deliveredAtLocal": "2026-10-21T11:05:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-21T02:05:00Z", "localTime": "2026-10-21T11:05:00", "status": "delivered", "description": "配達完了", "location": "大阪営業所", "code": null }, { "timestamp": "2026-10-20T16:10:00Z", "localTime": "2026-10-21T01:10:00", "status": "in_transit", "description": "発送", "location": "東京ターミナル", "code": null } ] } ``` ## Notes - **Source**: Yamato's own 荷物お問い合わせシステム (`toi.kuronekoyamato.co.jp`), server-rendered HTML read from the page's own markup. No account, key or captcha. - **No year on scans**: Yamato prints scans as `10/21 15:30`, so the year is worked out from today's date (no scan is in the future). - **Japanese wording**: `description` is Yamato's own text; `status` is mapped from step names such as 荷物受付 (accepted), 配達中 (out for delivery), 配達完了 (delivered) and 持戻 (brought back). - **Times**: every scan is in Japan, so each event carries `timestamp` in UTC computed from `Asia/Tokyo`. ## Related Resources - **Live browser lookup tool**: [Track a Yamato Transport package live on lastscanned.com/lookup/yamato](https://lastscanned.com/lookup/yamato) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Yang Ming Container Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yangming Query live **Yang Ming** (`yangming`) shipping container moves in a single synchronous `GET` request or MCP tool call. Pass the container number; no booking, bill of lading or Yang Ming account is needed. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yangming` | | **Brand aliases** | Yang Ming, Yang Ming Marine Transport, YML, yangming.com | | **Category** | Ocean container shipping line | | **Single-container REST endpoint** | `GET https://api.lastscanned.com/v1/track/{containerNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=YMMU6123458,YMMU7123452` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Container Number Format & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^YMMU\d{7}$/` | ISO 6346 | `YMMU6123458` · `YMMU7123452` · `YMMU1123455` | | **Pass 2 (`mayMatch`)** | none | none | none | A container number is the owner's 4-letter code, 6 digits and an ISO 6346 check digit. Yang Ming's own owner codes detect to `yangming` automatically. A leased container (Textainer `TGHU`, Triton `TCNU`, CAI `CAIU`, SeaCo `SEGU` and others) can sail with any line, so pass `?carrier=yangming` for one booked with Yang Ming. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/YMMU6123458" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` The response below is a real lookup from November 2026, with its events cut to the newest four of 26. ```json { "carrier": "yangming", "trackingNumber": "YMMU6123458", "status": "delivered", "statusDescription": "Empty Returned", "service": "40' HQ", "deliveredAt": null, "deliveredAtLocal": "2026-11-03T04:02:00", "signedBy": null, "destination": null, "estimatedDelivery": null, "events": [ { "timestamp": null, "localTime": "2026-11-03T04:02:00", "status": "delivered", "description": "Empty Returned", "location": "Port Klang", "code": "Empty Returned" }, { "timestamp": null, "localTime": "2026-11-03T03:04:00", "status": "out_for_delivery", "description": "Full to Consignee", "location": "Port Klang", "code": "Full to Consignee" }, { "timestamp": null, "localTime": "2026-11-01T05:22:00", "status": "in_transit", "description": "Discharged", "location": "Port Klang", "code": "Discharged" }, { "timestamp": null, "localTime": "2026-10-31T05:50:00", "status": "in_transit", "description": "On Board (Transit), Anbien Bay 2610N", "location": "Singapore", "code": "On Board (Transit)" } ] } ``` ## Notes - **Source**: Yang Ming's public cargo tracking API. One plain request, no browser. - **Events**: every move, including inland rail legs (each rail ramp it passes), with the vessel and voyage on loading moves. - **Times**: local time without a zone, so `localTime` is set and `timestamp` is null. - **Status**: `Empty to Shipper` is `label_created`, `Full to Consignee` is `out_for_delivery`, and `Empty Returned` is `delivered`. - **Owner codes**: only `YMMU` is detected automatically. For any other container booked with Yang Ming, pass `?carrier=yangming`. ## Related Resources - **All container lines**: [Ocean container tracking](https://docs.lastscanned.com/container-tracking-api) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # YJI Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yanjin Query live **YJI Logistics** (`yanjin`) package status and scan history in a single synchronous `GET` request or MCP tool call. YJI Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=yanjin`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yanjin` | | **Brand aliases** | YJI Logistics, 彦锦国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=yanjin` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=yanjin` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | YJI Logistics tracking numbers have no shape of their own, so always pass `?carrier=yanjin`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to YJI Logistics in one request. - **Platform**: YJI Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Yanwen Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yanwen Query live **Yanwen Logistics** (`yanwen`, 燕文物流) cross-border package status, scan history, and **domestic last-mile exchange tracking numbers** in a single synchronous `GET` request or MCP tool call. `lastscanned` validates 13-character `…YP` S10 barcodes and 17-character `YW…` waybills, returning a normalized `TrackingResult` JSON payload—with zero Yanwen merchant keys required. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yanwen` | | **Brand & service aliases** | Yanwen Express, Yanwen Logistics (燕文物流), `…YP`, `YW…` | | **Category** | China cross-border e-commerce logistics consolidator | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=UL...YP,YW...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for Yanwen - **Skip MD5 signature hashes & bilingual HTML parsing**: Yanwen's tracking endpoint requires computing an MD5 payload signature (`cyp`) with a shared salt and returns HTML `
` timelines with Chinese category headers (`制单完成`, `运输途中`, `到达待取`, `正在派送`, `投递成功`, `退件`, `运单异常`). `lastscanned` normalizes the entire timeline into English JSON in one `fetch()`. - **Automatic domestic last-mile handoff extraction**: When Yanwen hands a parcel to a destination carrier like [USPS](https://docs.lastscanned.com/carriers/usps), [UniUni](https://docs.lastscanned.com/carriers/uniuni), or Royal Mail, `lastscanned` extracts the exchange tracking number and carrier name into the top-level `message` field (e.g. `"Handed to USPS as 420100019261290312839104827163"`), making two-step cross-border tracking effortless. ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) Yanwen is evaluated **fifteenth (#15)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`) — UPU S10 `…YP`** | `/^[A-Z]{2}\d{9}YP$/i` (2 letters + 9 digits + `YP`) | **Yes — `s10(n)` (Mod-11)** | `UL494089685YP`, `VR519204815YP` | | **Pass 1 (`matches`) — `YW` waybill** | `/^YW[A-Z]{3}\d{12}$/i` (`YW` + 3 letters + 12 digits = 17 chars) | — | `YWSTL010022557186` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### UPU `s10` check digit on `…YP` numbers 13-character Yanwen numbers ending in `YP` follow the UPU S10 Mod-11 standard (weights `[8, 6, 4, 2, 3, 5, 9, 7]` over the first 8 digits), which `lastscanned` verifies before making any network request. ### When is `?carrier=yanwen` optional vs required? - **Optional (auto-detected)**: All valid 13-character `…YP` S10 numbers and 17-character `YW[A-Z]{3}\d{12}` numbers. - **Required (`?carrier=yanwen`)**: Numeric-only Yanwen customer order numbers or destination-carrier tracking numbers that you want to look up inside Yanwen's system. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/UL494089685YP?carrier=yanwen" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/UL494089685YP?carrier=yanwen", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.message, pkg.deliveredAt); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "UL494089685YP" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "yanwen", "trackingNumber": "UL494089685YP", "status": "delivered", "statusDescription": "Delivered, In/At Mailbox", "service": null, "deliveredAt": "2026-10-23T18:45:00Z", "deliveredAtLocal": "2026-10-23T14:45:00", "signedBy": null, "destination": { "city": null, "state": null, "country": "United States" }, "estimatedDelivery": null, "message": "Handed to USPS as 420100019261290312839104827163", "events": [ { "timestamp": "2026-10-23T18:45:00Z", "localTime": "2026-10-23T14:45:00", "status": "delivered", "description": "Delivered, In/At Mailbox", "location": "NEW YORK, NY 10001", "code": null }, { "timestamp": "2026-10-23T10:10:00Z", "localTime": "2026-10-23T06:10:00", "status": "out_for_delivery", "description": "Out for Delivery", "location": "NEW YORK, NY 10001", "code": null }, { "timestamp": "2026-10-19T06:30:00Z", "localTime": "2026-10-19T14:30:00", "status": "in_transit", "description": "Departed from Yanwen Facility", "location": "SHENZHEN", "code": null }, { "timestamp": "2026-10-18T02:15:00Z", "localTime": "2026-10-18T10:15:00", "status": "label_created", "description": "Order processed by shipper", "location": null, "code": null } ] } ``` ## Chaining Last-Mile Handoffs (`message`) When Yanwen transfers a parcel to a domestic last-mile carrier, `lastscanned` populates `message` with: - `"Handed to as "` (when both the partner carrier name and exchange tracking number are present), or - `"Handed to the destination carrier as "` Your application or AI agent can extract the trailing tracking number from `message` and call `GET /v1/track/{exchangeNumber}` to get live doorstep scans directly from [USPS](https://docs.lastscanned.com/carriers/usps), [UniUni](https://docs.lastscanned.com/carriers/uniuni), [GOFO](https://docs.lastscanned.com/carriers/gofo), or [FedEx](https://docs.lastscanned.com/carriers/fedex). ## Carrier-Specific Status & Integration Notes - **Explicit `[GMT±XX]` timezone parsing**: Yanwen annotates each scan description with a `[GMT+08]` or `[GMT-04]` tag; `lastscanned` strips the tag from `description` and uses the offset to compute exact UTC `timestamp` alongside `localTime`. - **Up to 35 numbers per batch**: Yanwen supports native multi-number lookups, and `GET /v1/track?numbers=...` accepts up to 35 Yanwen tracking numbers in one call. ## Related Resources - **Live browser lookup tool**: [Track a Yanwen package live on lastscanned.com/lookup/yanwen](https://lastscanned.com/lookup/yanwen) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # YCS Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ycslogistics Query live **YCS Logistics** (`ycslogistics`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ycslogistics` | | **Brand aliases** | YCS Logistics, YCS Express, 洋基通運 | | **Category** | Taiwan domestic and cross-border parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=70001448601,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | YCS bill numbers are 11 or 13 digits, a shape other carriers use, so the carrier is not auto-detected. Pass `?carrier=ycslogistics`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/70001448601?carrier=ycslogistics" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ycslogistics", "trackingNumber": "70001448601", "status": "delivered", "statusDescription": "貨件已由大甲營業所送達。貨物件數共1件。", "service": null, "deliveredAt": "2026-03-05T03:52:00Z", "deliveredAtLocal": "2026-03-05T11:52:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-03-05T03:52:00Z", "localTime": "2026-03-05T11:52:00", "status": "delivered", "description": "貨件已由大甲營業所送達。貨物件數共1件。", "location": "大甲營業所", "code": "999" }, { "timestamp": "2026-03-04T22:51:00Z", "localTime": "2026-03-05T06:51:00", "status": "out_for_delivery", "description": "貨件由大甲營業所人員配送中。", "location": "大甲營業所", "code": "601" }, { "timestamp": "2026-03-02T21:10:39Z", "localTime": "2026-03-03T05:10:39", "status": "label_created", "description": "檔案上傳成功", "location": null, "code": "0" } ] } ``` ## Notes - **Language**: scan text is Traditional Chinese, as YCS prints it. Station scans name their office (營業所) in `location`. - **Time zone**: scan times are Taiwan wall clock (`Asia/Taipei`), converted to `timestamp`. - **Batches**: a batch of numbers goes to YCS in one request. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # YDH Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ydh Query live **YDH** (`ydh`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects numbers shaped `YDH` + 10 digits + 2 letters. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ydh` | | **Brand & service aliases** | YDH, YDH Express, YDH Cross Border, Yida (義達), ydhex.com | | **Category** | Chinese cross-border e-commerce forwarder | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Examples | |---|---|---| | **Pass 1 (`matches`)** | `/^YDH\d{10}[A-Z]{2}$/` | `YDH0004849752AZ`, `YDH3001564927YQ` | | **Pass 2 (`mayMatch`)** | *None* | n/a | YDH only claims its own `YDH…` shape, so `?carrier=ydh` is normally not needed. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/YDH0004849752AZ?carrier=ydh" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "YDH0004849752AZ" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "ydh", "trackingNumber": "YDH0004849752AZ", "status": "delivered", "statusDescription": "配達完了", "service": null, "deliveredAt": null, "deliveredAtLocal": "2023-08-01T13:27:01", "signedBy": null, "destination": { "city": null, "state": null, "country": "ES" }, "message": null, "events": [ { "timestamp": null, "localTime": "2023-08-01T13:27:01", "status": "delivered", "description": "配達完了", "location": null, "code": null }, { "timestamp": null, "localTime": "2023-07-28T20:47:28", "status": "in_transit", "description": "Shipped", "location": null, "code": null }, { "timestamp": null, "localTime": "2023-07-22T22:52:43", "status": "in_transit", "description": "貨物お預かり", "location": "SHENZHEN", "code": null }, { "timestamp": null, "localTime": "2023-07-22T08:58:17", "status": "label_created", "description": "情報お預かり", "location": null, "code": null } ] } ``` ## Notes - **Source**: the `track.ydhex.com` query form (server-rendered HTML), queried directly; no bot wall. - **Wording**: scan text is whatever YDH prints, a mix of Chinese, Japanese and English. `status` is derived from it, and `description` is passed through as is. - **Times**: scans print local time with no zone, so only `localTime` is set (`timestamp` is `null`). - **Unknown numbers**: YDH answers "no record", returned as a `404 not_found`. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # YF Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yfexpress Query live **YF Express** (`yfexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. YF Express numbers share their shape with other carriers' numbers, so pass `?carrier=yfexpress`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yfexpress` | | **Brand aliases** | YF Express, YF, 亿飞 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=yfexpress` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=yfexpress` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | YF Express tracking numbers have no shape of their own, so always pass `?carrier=yfexpress`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to YF Express in one request. - **Platform**: YF Express runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Yilong Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yilong Query live **Yilong Logistics** (`yilong`) package status and scan history in a single synchronous `GET` request or MCP tool call. Yilong Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=yilong`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yilong` | | **Brand aliases** | Yilong Logistics, 一龙物流 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=yilong` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=yilong` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Yilong Logistics tracking numbers have no shape of their own, so always pass `?carrier=yilong`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Yilong Logistics in one request. - **Platform**: Yilong Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Yincag Logistics Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yincag Query live **Yincag Logistics** (`yincag`) package status and scan history in a single synchronous `GET` request or MCP tool call. Yincag Logistics numbers share their shape with other carriers' numbers, so pass `?carrier=yincag`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yincag` | | **Brand aliases** | Yincag Logistics, 云仓国际 | | **Category** | Cross-border e-commerce parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=yincag` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=yincag` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Yincag Logistics tracking numbers have no shape of their own, so always pass `?carrier=yincag`. ## Notes - **Scan wording**: Chinese for the Chinese leg, the destination post's wording for the rest. - **Time zone**: scan times come with no zone, so `localTime` is each scan's own clock time and `timestamp` and `deliveredAt` are `null`. - **Batches**: up to 20 numbers go to Yincag Logistics in one request. - **Platform**: Yincag Logistics runs the Hualei (华磊) tracker, shared with [JYExpress](https://docs.lastscanned.com/docs/carriers/jyexpress) and other Chinese forwarders. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # YTO Express (Yuantong) Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yto Query live **YTO Express** (`yto`, Yuantong 圆通速递) parcel status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `YT` + 13 digit numbers in Pass 1; YTO's all-digit and other letter-prefixed numbers need `?carrier=yto`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yto` | | **Brand & service aliases** | YTO, YTO Express, Yuantong, 圆通, 圆通速递 | | **Category** | China domestic express parcel carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=yto` for numbers that are not `YT` + 13 digits) | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=YT...,YT...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Tracking Number Formats & Auto-Detection (`matches` vs `?carrier=yto`) | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^YT\d{13}$/` and `/^YT[DGHZ]\d{12}$/` | none | `YT8879092508074`, `YT8879092508074` | | **Pass 2 (`mayMatch`)** | *None* | none | none | | **Explicit (`?carrier=yto`)** | YTO's all-digit numbers (for example 18 digits starting with 6 or 8) and letter-prefixed numbers such as `G8…` or `M…` | none | `?carrier=yto` | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/YT8879092508074?carrier=yto" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "yto", "trackingNumber": "YT8879092508074", "status": "delivered", "statusDescription": "您的快件已领取,收件人在[丰巢]取件", "service": null, "deliveredAt": "2026-10-14T03:50:57Z", "deliveredAtLocal": "2026-10-14T11:50:57", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-10-14T03:50:57Z", "localTime": "2026-10-14T11:50:57", "status": "delivered", "description": "您的快件已领取,收件人在[丰巢]取件", "location": "江苏省常州市新北区龙城", "code": "745" }, { "timestamp": "2026-10-13T09:17:22Z", "localTime": "2026-10-13T17:17:22", "status": "out_for_delivery", "description": "【江苏省常州市新北区龙城】的派件员正在为您派件", "location": "江苏省常州市新北区龙城", "code": "710" } ] } ``` ## Status Notes - **Language**: scan descriptions and locations are in Chinese, as YTO prints them. - **Times**: scan times are China time (`Asia/Shanghai`), so every event has both `timestamp` (UTC) and `localTime`. - **Parcel lockers**: a scan putting the parcel in a locker or parcel station (code `751`) and a courier taking it back out (`756`) both report `exception`, since the parcel is waiting for the recipient. - **Recycled numbers**: YTO reuses numbers, so an old number can show an earlier parcel's history. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Yunda Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yunda Query live **Yunda Express** (`yunda`) package status and scan history in a single synchronous `GET` request or MCP tool call. Yunda's numbers share their shape with other Chinese carriers, so pass `?carrier=yunda`. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yunda` | | **Brand aliases** | Yunda Express, Yunda, 韵达快递, 韵达 | | **Category** | China domestic express | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=yunda` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=313016422911811,...&carrier=yunda` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Yunda's 13 to 15 digit numbers overlap with other Chinese carriers, so always send `?carrier=yunda`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/313016422911811?carrier=yunda" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "yunda", "trackingNumber": "313016422911811", "status": "delivered", "statusDescription": "【代收点】您的快件已投递,收件人凭取件码在【矿冶研究院大门入口旁蜜罐】领取", "service": null, "deliveredAt": "2026-05-10T05:02:37Z", "deliveredAtLocal": "2026-05-10T13:02:37", "signedBy": null, "destination": { "city": "长沙市", "state": null, "country": "CN" }, "message": null, "events": [ { "timestamp": "2026-05-10T05:02:37Z", "localTime": "2026-05-10T13:02:37", "status": "delivered", "description": "【代收点】您的快件已投递,收件人凭取件码在【矿冶研究院大门入口旁蜜罐】领取", "location": null, "code": "已签收" }, { "timestamp": "2026-05-10T01:34:47Z", "localTime": "2026-05-10T09:34:47", "status": "out_for_delivery", "description": "【代收点】您的快件已暂存至矿冶研究院大门入口旁蜜罐,请及时领取签收", "location": null, "code": "待取件" } ] } ``` ## Notes - **Retention**: Yunda drops domestic waybills after about five months, after which the number returns `not_found`. - **Language and time zone**: scan text is Chinese. Times are China time (UTC+8), converted to `timestamp`. - **How it is fetched**: Yunda's tracking page asks for a slider puzzle; the lookup solves it automatically, so a request can take a few seconds. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # YunExpress Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yunexpress Query live **YunExpress** (`yunexpress`, 云途物流 / YunTrack) cross-border package status, scan history, and **domestic last-mile handoff numbers** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 18-character `YT…` waybills and returns a normalized `TrackingResult` JSON payload—without requiring a YunExpress customer number or API secret. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yunexpress` | | **Brand & service aliases** | YunExpress (云途物流), YunTrack, `YT…` | | **Category** | Global cross-border e-commerce logistics carrier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=YT...,YT...` (up to 35 numbers per carrier in a 100-number call) | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` (`claude mcp add --transport http lastscanned https://mcp.lastscanned.com/mcp`) | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · **1 free keyless lookup/day per IP** · **Free tier** (5 unique numbers/day, $0) · **Pro** ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · **HTTP 402 Stripe MPP** ($0.50 for 25-number `lsk_pack_` key or $0.02/number in USDC on Tempo or Solana) | ## Why developers use `lastscanned` for YunExpress instead of direct requests - **Avoid Alibaba Cloud WAF `405` blocks & 30-minute IP bans**: Direct requests from Cloudflare Workers, Vercel, or AWS Lambda to `services.yuntrack.com` are blocked by Alibaba Cloud's web application firewall (`acw_tc` / `405 Method Not Allowed`), which issues 30-minute IP bans on automated datacenter traffic. Calling `GET https://api.lastscanned.com/v1/track/YT2621200705470145?carrier=yunexpress` from your backend returns clean JSON in one `fetch()`. - **Automatic last-mile carrier & exchange number extraction**: YunExpress hands US and Canadian parcels to [USPS](https://docs.lastscanned.com/carriers/usps), [UniUni](https://docs.lastscanned.com/carriers/uniuni), [GOFO Express](https://docs.lastscanned.com/carriers/gofo), [OnTrac](https://docs.lastscanned.com/carriers/ontrac), or [FedEx](https://docs.lastscanned.com/carriers/fedex). `lastscanned` extracts both the last-mile carrier name (`AdditionalNotes`) and secondary tracking number (`TrackInfo.TrackingNumber`) into top-level `message` (e.g. `"Handed to GOFO Express as GFUS01074503026309"`). ## Tracking Number Formats & Auto-Detection (`matches` vs `mayMatch`) YunExpress is evaluated **eighteenth (#18)** in `lastscanned`'s two-pass detector: | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^YT\d{16}$/i` (`YT` + 16 digits = 18 chars) | — | `YT2604521272152698`, `YT2610928374650192` | | **Pass 2 (`mayMatch`)** | *None* | — | — | ### When is `?carrier=yunexpress` optional vs required? - **Optional (auto-detected)**: All 18-character `YT` + 16-digit tracking numbers auto-detect in Pass 1. No other carrier uses the `YT` prefix. - **Required (`?carrier=yunexpress`)**: Customer order reference numbers or last-mile exchange numbers that you want to query inside YunTrack instead of the domestic last-mile carrier. ## Synchronous `GET` Request & Normalized JSON Response ### `curl` ```bash curl -s "https://api.lastscanned.com/v1/track/YT2621200705470145?carrier=yunexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ### JavaScript / TypeScript (`fetch`) ```ts const res = await fetch("https://api.lastscanned.com/v1/track/YT2621200705470145?carrier=yunexpress", { headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` }, }); const pkg = await res.json(); console.log(pkg.status, pkg.service, pkg.message); ``` ### MCP `track_package` tool call ```json { "tool": "track_package", "arguments": { "tracking_number": "YT2604521272152698" } } ``` ### Normalized `TrackingResult` JSON response ```json { "carrier": "yunexpress", "trackingNumber": "YT2621200705470145", "status": "delivered", "statusDescription": "Delivered", "service": "YunExpress Standard", "deliveredAt": null, "deliveredAtLocal": "2026-10-25T13:42:11", "signedBy": null, "destination": { "city": null, "state": null, "country": "US" }, "estimatedDelivery": null, "message": "Handed to GOFO Express as GFUS01074503026309", "events": [ { "timestamp": null, "localTime": "2026-10-25T13:42:11", "status": "delivered", "description": "Delivered", "location": "EDISON, NJ", "code": null }, { "timestamp": null, "localTime": "2026-10-25T08:15:08", "status": "out_for_delivery", "description": "Out for delivery", "location": "EDISON, NJ", "code": null }, { "timestamp": null, "localTime": "2026-10-22T19:30:00", "status": "in_transit", "description": "Arrived at destination airport", "location": "JFK, US", "code": null }, { "timestamp": null, "localTime": "2026-10-19T11:04:22", "status": "label_created", "description": "Shipment information received", "location": "SHENZHEN", "code": null } ] } ``` ## Chaining Last-Mile Handoffs (`message`) Because YunExpress prints scan times in each facility's local clock without a UTC offset (`timestamp: null`, `localTime` populated) and only reports country-level `destination.country`, chaining the last-mile tracking number from `message` gives you even richer data: 1. Check `pkg.message` on the YunExpress response (for example, `"Handed to GOFO Express as GFUS01074503026309"` or `"Handed to USPS as 9261290312839104827163"`). 2. Extract the trailing tracking number and call `GET https://api.lastscanned.com/v1/track/YT2621200705470145?carrier=yunexpress`. 3. Receive exact UTC `timestamp` values, destination city/state, and doorstep delivery details from the domestic carrier. ## Carrier-Specific Status & Integration Notes - **YunExpress `PackageState` mapping**: YunExpress numeric package states map deterministically to normalized statuses: `3`, `4`, `17` → `delivered`; `19` → `out_for_delivery`; `7`, `8`, `10`, `15` → `returned`; `2`, `6`, `9`, `11`, `12`, `13`, `14`, `16` → `exception`; `1`, `5`, `18` → `in_transit` (or `label_created` when only *"Shipment information received"* exists). ## Related Resources - **Live browser lookup tool**: [Track a YunExpress package live on lastscanned.com/lookup/yunexpress](https://lastscanned.com/lookup/yunexpress) - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) - **AI support workflows**: [WISMO AI agents & synchronous tracking](https://docs.lastscanned.com/wismo) # Yurtiçi Kargo Tracking API & MCP URL: https://docs.lastscanned.com/carriers/yurtici Query live **Yurtiçi Kargo** (`yurtici`) shipments in a single synchronous `GET` request or MCP tool call. `lastscanned` calls the same service endpoints as the shipment-tracking page on yurticikargo.com and returns the movements. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `yurtici` | | **Category** | Turkish domestic and international courier | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=yurtici` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=190669647990,...&carrier=yurtici` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP · Free tier (5 unique numbers/day) · Pro ($4.99/mo for 1,000 unique numbers) | ## Tracking Number Formats & Auto-Detection Yurtiçi Kargo codes have no check digit and share shapes with other carriers, so they are not auto-detected. Pass `?carrier=yurtici`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/190669647990?carrier=yurtici" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "yurtici", "trackingNumber": "190669647990", "status": "out_for_delivery", "statusDescription": "Out for delivery", "service": null, "deliveredAt": null, "deliveredAtLocal": null, "signedBy": null, "destination": { "city": "Istanbul", "state": "Kadikoy", "country": "TR" }, "events": [ { "timestamp": "2026-10-26T05:10:00.000Z", "localTime": "2026-10-26T08:10:00", "status": "out_for_delivery", "description": "Out for delivery", "location": "Kadikoy Branch", "code": null } ] } ``` ## Notes - Lookup is three steps (search, summary, movements); the result is one response. - Domestic scans are Turkish local time and carry a UTC timestamp. International parcels (`IsAbroad`) list scans in several zones, so those keep `localTime` only, and a `CarrierTrackingRefNo` is reported in `message` as the handoff number. ## Related Resources - **Carrier hub**: [All supported carriers](https://docs.lastscanned.com/carriers) - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Zajil Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/zajil Query live **Zajil Express** (`zajil`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `zajil` | | **Brand aliases** | Zajil Express, Zajil, Zajil Saudi | | **Category** | Saudi Arabia domestic parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=52583577107,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | none | none | none | Zajil's 11-digit numbers are a common length, so the carrier is not auto-detected. Pass `?carrier=zajil`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/52583577107" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "zajil", "trackingNumber": "52583577107", "status": "delivered", "statusDescription": "Delivered (POD)", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-02-06T06:02:26", "signedBy": null, "destination": { "city": "Riyadh", "state": null, "country": "SA" }, "events": [ { "timestamp": null, "localTime": "2026-02-06T06:02:26", "status": "delivered", "description": "Delivered (POD)", "location": "Taif", "code": "POD" } ] } ``` ## Notes - **Language**: `description` is Zajil's English label for the scan (the Arabic text is used only if the English label is missing). - **Time zone**: times carry no zone, so events have `localTime` only (`timestamp` is `null`). - **Speed**: Zajil's API can take several seconds to answer. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # Zeleris Tracking API & MCP URL: https://docs.lastscanned.com/carriers/zeleris Query live **Zeleris** (`zeleris`) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 8 hex characters + 9 digits + a letter. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `zeleris` | | **Brand aliases** | Zeleris, Zeleris Spain, Zeleris Envios | | **Category** | Parcel courier (Spain) | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=1458297C072540367P,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^[0-9A-F]{8}\d{9}[A-Z]$/` | none | `1458297C072540367P` | | **Pass 2 (`mayMatch`)** | none | none | none | ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/1458297C072540367P?carrier=zeleris" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "zeleris", "trackingNumber": "1458297C072540367P", "status": "delivered", "statusDescription": "Tu envío ha sido entregado.", "service": null, "deliveredAt": "2026-01-28T08:24:00Z", "deliveredAtLocal": "2026-01-28T09:24:00", "signedBy": null, "destination": null, "events": [ { "timestamp": "2026-01-28T08:24:00Z", "localTime": "2026-01-28T09:24:00", "status": "delivered", "description": "Tu envío ha sido entregado.", "location": null, "code": null }, { "timestamp": "2026-01-28T05:38:00Z", "localTime": "2026-01-28T06:38:00", "status": "out_for_delivery", "description": "Tu envío está en reparto.", "location": null, "code": null }, { "timestamp": "2026-01-24T15:41:00Z", "localTime": "2026-01-24T16:41:00", "status": "exception", "description": "No hemos podido entregarte el envío.", "location": null, "code": null }, { "timestamp": "2026-01-23T16:50:00Z", "localTime": "2026-01-23T17:50:00", "status": "label_created", "description": "Tu envío ya esta preparado. Te avisaremos cuando este en camino.", "location": null, "code": null } ] } ``` ## Notes - **Language**: descriptions are Spanish, as Zeleris prints them. There is no location on a scan. - **Time zone**: Spanish local time (`Europe/Madrid`). ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ZR Express Tracking API & MCP URL: https://docs.lastscanned.com/carriers/zrexpress Query live **ZR Express** (`zrexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `zrexpress` | | **Brand aliases** | ZR, ZR Express Algérie, ZRexpress, Zimou Relais | | **Category** | Algerian domestic courier | | **Region** | Algeria | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=16-ABCDE12345-ZR,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | `/^\d{1,2}-[A-Z0-9]{10}-ZR$/` | none | `16-ABCDE12345-ZR` | | **Pass 2 (`mayMatch`)** | none | none | none | A wilaya number, ten letters or digits and `ZR` belongs to ZR Express alone, so `?carrier=zrexpress` is optional. The dashes are part of the number. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/16-ABCDE12345-ZR?carrier=zrexpress" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "zrexpress", "trackingNumber": "16-ABCDE12345-ZR", "status": "delivered", "statusDescription": "Encaissé", "service": null, "deliveredAt": "2026-08-07T16:49:57Z", "deliveredAtLocal": "2026-08-07T16:49:57", "signedBy": null, "destination": { "city": null, "state": null, "country": "DZ" }, "events": [ { "timestamp": "2026-08-07T16:49:57Z", "localTime": "2026-08-07T16:49:57", "status": "delivered", "description": "Encaissé", "location": null, "code": "encaisse" }, { "timestamp": "2026-08-06T19:34:46Z", "localTime": "2026-08-06T19:34:46", "status": "delivered", "description": "Livré", "location": "Hub Alger 16", "code": "livre" }, { "timestamp": "2026-08-06T16:43:00Z", "localTime": "2026-08-06T16:43:00", "status": "out_for_delivery", "description": "Sortie en livraison", "location": null, "code": "sortie_en_livraison" }, { "timestamp": "2026-08-05T15:27:34Z", "localTime": "2026-08-05T15:27:34", "status": "in_transit", "description": "Confirmé au bureau", "location": "Hub Blida 09", "code": "confirme_au_bureau" } ] } ``` ## Notes - **Source**: the site is a Next.js app; a GET with `RSC: 1` returns its React flight payload, and the scan elements are read from it. If a deploy changes that payload's shape the lookup fails (`carrier_error`) rather than reporting `not_found`. - **Language**: the wording is French (hub names may be Arabic) and is kept as sent. - **Time zone**: the scan's UTC time is in the element key; the printed clock time is the same UTC time. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # ZTO International Tracking API & MCP URL: https://docs.lastscanned.com/carriers/ztointl Query live **ZTO International** (`ztointl`) package status and scan history, from the overseas warehouse through customs to delivery in China, in a single synchronous `GET` request or MCP tool call. 14-digit numbers starting `77122` fall back to ZTO International when no other carrier claims them. ## Overview & Quick Facts | Property | Value | |---|---| | **Carrier slug (`?carrier=`)** | `ztointl` | | **Brand aliases** | ZTO International, ZTO Global, ZTO Express International, 中通国际 | | **Category** | Cross-border parcels | | **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` | | **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` | | **MCP server (`https://mcp.lastscanned.com/mcp`)** | `track_package`, `track_packages`, `list_carriers` | | **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP | ## Tracking Number Formats & Auto-Detection | Pass | Rule / Regex | Check Digit | Examples | |---|---|---|---| | **Pass 1 (`matches`)** | none | none | none | | **Pass 2 (`mayMatch`)** | `/^77122\d{9}$/` | none | `77122472360073` | Other ZTO International number shapes need `?carrier=ztointl`. ## Synchronous `GET` Request & Normalized JSON Response ```bash curl -s "https://api.lastscanned.com/v1/track/77122472360073?carrier=ztointl" \ -H "Authorization: Bearer $LASTSCANNED_API_KEY" ``` ```json { "carrier": "ztointl", "trackingNumber": "77122472360073", "status": "delivered", "statusDescription": "Delivered", "service": null, "deliveredAt": null, "deliveredAtLocal": "2026-03-09T09:04:08", "signedBy": null, "destination": null, "events": [ { "timestamp": null, "localTime": "2026-03-09T09:04:08", "status": "delivered", "description": "Delivered", "location": null, "code": "5" }, { "timestamp": null, "localTime": "2026-03-09T07:26:10", "status": "out_for_delivery", "description": "Physical delivery scheduled.", "location": null, "code": "4" }, { "timestamp": null, "localTime": "2026-03-05T14:32:00", "status": "in_transit", "description": "Import customs in progress.", "location": null, "code": "360" } ] } ``` ## Notes - **Status codes**: ZTO's codes are mapped (4 out for delivery, 5 and 15 delivered, 16 left with an agent or at a pickup point as `exception`; warehouse, flight, ship, line-haul and customs codes are `in_transit`). `code` carries ZTO's own number. - **English wording only**: descriptions are ZTO's English lines; the Chinese text is not used because it carries couriers' phone numbers. - **Time zone**: scans start abroad (Korea, Japan, US, Hong Kong...) and end in China, so there is no single zone; only `localTime` is set. - **Batches**: several numbers go to ZTO in one request. - **How it is queried**: the applet API behind m.ztoglobal.com, sent as that page sends it, which answers without a captcha code. ## Related Resources - **Regex & check digits**: [Tracking number formats & auto-detection](https://docs.lastscanned.com/formats) # List carriers URL: https://docs.lastscanned.com/reference/tracking/listCarriers `GET https://api.lastscanned.com/v1/carriers` Carrier ids accepted by `carrier`. No API key needed. Responses: - 200: Carrier ids. ```json { "carriers": [ "ups", "usps", "dhl", "fedex", "amazon", "ontrac", "uniuni", "gofo", "veho", "speedee", "cdl", "bettertrucks", "axlehire", "cirro", "yanwen", "4px", "cainiao", "yunexpress", "speedx", "intelcom", "canadapost", "purolator", "tforce", "glsus", "osm", "pitneybowes", "cne", "sunyou", "ubi", "sendle", "asendia", "japanpost", "singpost", "koreapost", "nzpost", "dpduk", "apc", "landmark", "canpar", "loomis", "glscanada", "nationex", "bpost", "postnord", "austrianpost", "polishpost", "gls", "inpost", "packeta", "hermesde", "ydh", "equick", "topyou", "laposte", "postnl", "correos", "posteitaliane", "cjlogistics", "yamato", "delhivery", "bluedart", "evri", "anpost", "swisspost", "brt", "aramexau", "couriersplease", "teamglobalexpress", "ninjavan", "flashexpress", "icscourier", "chitchats", "passport", "epostglobal", "jyexpress", "sagawa", "aramex", "tcat", "hanjin", "lotte", "logen", "shadowfax", "sfc", "anjun", "winit", "nzcouriers", "posthaste", "castleparcels", "gaopost", "yfexpress", "gdwse", "chronopost", "bring", "posti", "ceskaposta", "ctt", "seur", "novaposhta", "sameday", "fancourier", "econt", "meest", "yurtici", "paquetexpress", "andreani", "thecourierguy", "postnet", "minutos99", "mainfreight", "yto", "spl", "kex", "posmalaysia", "gdex", "citylink", "lbc", "dhlecommerce", "dhlparcelnl", "dhlparceles", "dhlparcelpl", "dhlecommerceuk", "dhlfreight", "dhlink", "xqexpress", "alibusiness", "omniva", "ukrposhta", "speedy", "dpdro", "dpdpl", "dpd", "dpdpt", "thailandpost", "chunghwapost", "ems", "elta", "estafeta", "totalexpress", "sagawaglobal", "mrw", "nacex", "huahan", "chukou1", "ztointl", "sto", "oca", "ocasa", "coordinadora", "hct", "starken", "hunterexpress", "aras", "smsa", "naqel", "asusexp", "bdtpost", "byhd", "byt", "chengda", "chunhong", "cyexpress", "dhfex", "edlexpress", "edpost", "etscp", "fuhai618", "fujexp", "galaxyex", "gdasgyl", "gzbtygj", "gzymyt", "hlsz56", "hoyang", "hpgjwl", "hsdex", "hzjtex", "hzpdex", "jhgj", "jiudt", "leiyi", "lingdong", "mayiyinfu", "miuson", "pingda56", "pyexpress", "qfl", "qyexp", "qyun", "shangfang", "shsgexp", "starglobal", "sztdgyl", "thhy", "usky", "wmycc", "xsexp", "yanjin", "yilong", "yincag", "eshun", "acscourier", "airpakexpress", "allegroone", "anteraja", "aymakan", "cargus", "cdek", "correosexpress", "cttexpress", "daipost", "ecms", "ecoscooting", "geis", "jeebly", "mngkargo", "northline", "novaglobal", "omgo", "pakistanpost", "paperfly", "pathao", "phlpost", "planzer", "posindonesia", "postashqiptare", "postaslovenije", "postex", "posturinn", "procarrier", "ptsexpress", "quantium", "qwintry", "redur", "redx", "sapo", "seino", "sendex", "sending", "serpost", "servientrega", "shipa", "shipentegra", "shreemaruti", "skynetworldwide", "skypostal", "speedaf", "speedpak", "springgds", "sps", "spxid", "spxmy", "spxph", "spxth", "spxvn", "stallionexpress", "starex", "stcourier", "straightship", "swisspostcargo", "tipsa", "tmmexpress", "tnt", "toptrans", "tracxlogis", "twsexpress", "urvaam", "valmo", "vaspexpresso", "venipak", "vintedgo", "vozovoz", "zeleris", "zrexpress", 472, "kuehnenagel", "mailplus", "amerijet", "matkahuolto", "noest", "17feia", "2go", "4sides", "5post", "a1post", "abffreight", "aduiepyle", "aexparaguay", "aitworldwide", "ajex", "amhomedelivery", "ampm", "anserx", "apcovernight", "appleexpress", "aramexnz", "atuhoraexpress", "bangladeshpost", "bexexpress", "bjshomedelivery", "blueex", "blueexpress", "bombino", "bookurier", "mrlglobal", "borderexpress", "bosta", "boxnow", "bringerparcel", "bulgarianposts", "burddelivery", "c3x", "cacesa", "castores", "ccfs", "centraltransport", "cevalogistics", "chazki", "chilexpress", "chronodiali", "ciblex", "cityexpressrs", "citymail", "cjpacket", "closerlogistics", "colisweb", "connectcouriers", "copacourier", "correoargentino", "correosmexico", "correossalvador", "correouruguayo", "couriercenter", "cserussia", "cypruspost", "danskefragtmaend", "daylighttransport", "dayross", "daytonfreight", "dellin", "gaash", "dexpress", "direx", "dobropost", "domainlogistics", "domex", "dpdza", "dpex", "dragonstarcurier", "drop2shop", "dropp", "dsv", "earlybird", "easymail", "egyptpost", "ekart", "emile", "emsvietnam", "enviacolombia", "envialia", "estes", "euroexpressba", "evdemo", "evropat", "ewe", "exelot", "exline", "exmate", "expressone", "fargouz", "fastfrate", "fedexfreight", "fedexpl", "fermopoint", "firstline", "flashexpressph", "fleetex", "fleetoptics", "flippost", "followmont", "forwardair", "forzadelivery", "foxpost", "franchexpress", "genikitaxydromiki", "globalpost", "glsfr", "glsit", "gmsworldwide", "go4", "gobolt", "goexpress", "gofofr", "gofoit", "gofonl", "gogoxpress", "grandslamexpress", "gspostbox", "gtaairskip", "gtlgoto", "happypost", "haypost", "helthjem", "hepsijet", "hermesat", "hispapost", "hongkongpost", "hovership", "hrparcel", "hrvatskaposta", "hywl", "ilyanglogis", "imile", "indahlogistik", "integralpack", "internetexpress", "interrapidisimo", "israelpost", "jandtau", "jandtcargo", "jandtde", "janio", "jcex", "jdlogistics", "jerseypost", "jetlinecouriers", "jetlogistic", "jne", "jsexpress", "jumppoint", "kazpost", "kexexpresshk", "kunexpress", "kunyoung", "kyoungdong", "kyrgyzpost", "laarcourier", "labaih", "laposteburkinafaso", "lapostesenegal", "lastonemilecoop", "leopardscourier", "liccardi", "lietuvospastas", "lightningexpress", "lineclear", "linhan", "lionparcel", "logistiq", "lpost", "madhurcourier", "mailamericas", "maltapost", "maritimeontario", "mauritiuspost", "microexpress", "midlandtransport", "mone", "mulphilog", "mylerz", "nextleveldelivery", "nimexpress", "nox", "ocsana", "olvacourier", "oneworldexpress", "orlenpaczka", "paack", "packlink", "packman", "pcpexpress", "pdnexpress", "pdqchile", "pfcexpress", "pilotfreight", "pittohio", "postamk", "postluxembourg", "ppl", "precisiondeliveries", "proships", "pullmancargo", "quiqup", "raben", "ramh2h", "relaiscolis", "rlcarriers", "roadrunner", "rpxindonesia", "saia", "sailpost", "sapxexpress", "satukraine", "seko", "shreeanjani", "skroutzlastmile", "skyking", "slovenskaposta", "southeasternfreightlines", "speedandsafe", "speedex", "spxbr", "sundarbancourier", "tanzaniaposts", "taxydema", "tciexpress", "tcspakistan", "tdn", "tealca", "teamexpressae", "teamworldwide", "teleship", "tfmexpress", "tgroup", "tirupaticourier", "tntit", "torrestir", "trackon", "transcorp", "tstcfexpress", "tufesa", "uniteddeliveryservice", "upaya", "urbano", "uzbekistanpost", "veloces", "viacargo", "vimenpaq", "vrllogistics", "whistl", "xdelogistics", "xlcourier", "xpoltl", "ycslogistics", "yunda", "dohrn", "horoz", "dao", "morningglobal", "jordanpost", "chinapost", "gati", "zajil", "swiftx", "maersk", "msc", "cosco", "evergreen", "one", "yangming" ] } ``` Full spec: https://docs.lastscanned.com/openapi.yaml # Track one number URL: https://docs.lastscanned.com/reference/tracking/trackOne `GET https://api.lastscanned.com/v1/track/{trackingNumber}` The carrier is detected from the number's format (and check digit, where it has one). Detection sends the number to exactly one carrier and never falls back to another; pass `carrier` to ask a different one. Counts one tracking number toward the account's usage. Parameters: - `trackingNumber` (path, required): Case-insensitive; spaces at either end are trimmed. - `carrier` (query): Skip detection and ask this carrier. Needed for numbers too generic to detect. Responses: - 200: The tracking result. - 400: `unknown_carrier`: no carrier's format matches the number (or its check digit is wrong), or `carrier` isn't supported. - 401: `unauthorized`: missing, wrong or revoked key, or a disabled account. - 404: `not_found`: the carrier has no record of the number, or no such key. - 429: `rate_limited`: the account's daily limit is reached (resets 00:00 UTC), or the carrier is throttling (Spee-Dee). - 500: `internal_error`: unexpected failure. - 502: `carrier_error`: the carrier failed or blocked the lookup. Retry. - 503: `carrier_unavailable`: the carrier can't be asked right now (its firewall refuses us, its site is down or not answering, or it failed its last several lookups). Retry in a few minutes. ```json { "carrier": "ups", "trackingNumber": "1Z999AA10123456784", "status": "delivered", "statusDescription": "Delivered", "service": "UPS Ground", "deliveredAt": "2026-08-07T21:17:14Z", "deliveredAtLocal": "2026-08-07T16:17:00", "signedBy": null, "destination": { "city": "AUSTIN", "state": "TX", "country": "US" }, "estimatedDelivery": "2026-08-07", "estimatedDeliveryAt": null, "events": [ { "timestamp": "2026-08-07T21:17:14Z", "localTime": "2026-08-07T16:17:00", "status": "delivered", "description": "DELIVERED", "location": "AUSTIN, TX, US", "code": "FS" }, { "timestamp": "2026-08-07T13:02:41Z", "localTime": "2026-08-07T08:02:00", "status": "out_for_delivery", "description": "Out For Delivery Today", "location": "AUSTIN, TX, US", "code": "OT" } ] } ``` Full spec: https://docs.lastscanned.com/openapi.yaml # Track several numbers URL: https://docs.lastscanned.com/reference/tracking/trackMany `GET https://api.lastscanned.com/v1/track` Up to 100 numbers per call and 35 per carrier. Duplicates are removed; numbers from different carriers can be mixed. `results` has one entry per number, in the order requested, each with either `result` or `error`; one bad number never fails the others. Counts each distinct number toward the account's usage. Parameters: - `numbers` (query, required): Comma-separated tracking numbers. - `carrier` (query): Skip detection and ask this carrier. Needed for numbers too generic to detect. Responses: - 200: One entry per number. - 400: `bad_request`: no numbers, more than 100, or more than 35 for one carrier. `unknown_carrier`: unsupported `carrier`. - 401: `unauthorized`: missing, wrong or revoked key, or a disabled account. - 429: `rate_limited`: the account's daily limit is reached (resets 00:00 UTC), or the carrier is throttling (Spee-Dee). - 500: `internal_error`: unexpected failure. ```json { "results": [ { "trackingNumber": "1Z999AA10123456784", "result": { "carrier": "ups", "trackingNumber": "1Z999AA10123456784", "status": "in_transit", "statusDescription": "In Transit", "service": "UPS Ground", "deliveredAt": null, "signedBy": null, "destination": { "city": "AUSTIN", "state": "TX", "country": "US" }, "estimatedDelivery": "2026-08-07", "events": [ { "timestamp": "2026-08-06T08:44:09Z", "localTime": "2026-08-06T03:44:00", "status": "in_transit", "description": "Arrived at Facility", "location": "AUSTIN, TX, US", "code": "AR" } ] } }, { "trackingNumber": "123456789012", "error": { "code": "not_found", "message": "FedEx returned no track details for that number" } } ] } ``` Full spec: https://docs.lastscanned.com/openapi.yaml # Compare shipping rates URL: https://docs.lastscanned.com/reference/rates/getRates `GET https://api.lastscanned.com/v1/rates` USPS, UPS and FedEx prices to ship one parcel between two US ZIP codes, cheapest first, with delivery days and an itemized breakdown. Each quote names its `source` and `rateType`; today's source is Stamps.com, so prices are its own (`reseller`). Quotes only: nothing is bought. A source or carrier that can't quote is listed in `errors`; when none could, the answer is `502 no_quotes` and nothing is spent. Counts as one tracking number toward the account's day. Without a key, 5 free quotes a day per IP. `POST /v1/rates` takes the same fields as a JSON object. Parameters: - `from` (query, required): Origin postal code (5-digit ZIP in the US). - `to` (query, required): Destination postal code. - `weight` (query, required): Above 0; at most 150 lb. - `weightUnit` (query) - `fromCountry` (query) - `toCountry` (query) - `residential` (query) - `length` (query): Give length - `width` (query) - `height` (query) - `dimensionUnit` (query) - `carriers` (query): Comma-separated carrier ids to ask; omit for all. Responses: - 200: Quotes, cheapest first. - 400: The shipment is malformed. - 502: `no_quotes`: no carrier could quote (nothing spent). - 503: `rates_unavailable`: rate quotes aren't live yet. Full spec: https://docs.lastscanned.com/openapi.yaml # List watches URL: https://docs.lastscanned.com/reference/webhooks/listWatches `GET https://api.lastscanned.com/v1/watches` Parameters: - `active` (query) - `limit` (query) - `cursor` (query) Responses: - 200: Watches, newest first. - 401: `unauthorized`: missing, wrong or revoked key, or a disabled account. Full spec: https://docs.lastscanned.com/openapi.yaml # Watch numbers URL: https://docs.lastscanned.com/reference/webhooks/createWatch `POST https://api.lastscanned.com/v1/watches` Looks the numbers up now and returns each watch with its current `result`, then re-checks them on a schedule and POSTs to the account's webhook whenever the status, newest event or estimate changes. A new watch counts as a tracked number; re-checks are free. A number already being watched keeps its watch (200 instead of 201). Body: ```json { "trackingNumber": "541270563758", "metadata": { "order": "A1" } } ``` Responses: - 200: Already watched; the existing watch. - 201: The watch (or `{watches}` for `trackingNumbers`), with its first result. - 400: `unknown_carrier`: no carrier's format matches the number (or its check digit is wrong), or `carrier` isn't supported. - 401: `unauthorized`: missing, wrong or revoked key, or a disabled account. - 429: `rate_limited`: the account's daily limit is reached (resets 00:00 UTC), or the carrier is throttling (Spee-Dee). Full spec: https://docs.lastscanned.com/openapi.yaml # Get a watch URL: https://docs.lastscanned.com/reference/webhooks/getWatch `GET https://api.lastscanned.com/v1/watches/{id}` Parameters: - `id` (path, required) Responses: - 200: The watch with its last result or error. - 404: `not_found`: the carrier has no record of the number, or no such key. Full spec: https://docs.lastscanned.com/openapi.yaml # Stop watching URL: https://docs.lastscanned.com/reference/webhooks/deleteWatch `DELETE https://api.lastscanned.com/v1/watches/{id}` Parameters: - `id` (path, required) Responses: - 200: `{id, active: false, endReason: deleted}` - 404: `not_found`: the carrier has no record of the number, or no such key. Full spec: https://docs.lastscanned.com/openapi.yaml # Get the webhook URL: https://docs.lastscanned.com/reference/webhooks/getWebhook `GET https://api.lastscanned.com/v1/webhook` Responses: - 200: The webhook. Full spec: https://docs.lastscanned.com/openapi.yaml # Remove the webhook URL: https://docs.lastscanned.com/reference/webhooks/deleteWebhook `DELETE https://api.lastscanned.com/v1/webhook` Responses: - 200: The webhook Full spec: https://docs.lastscanned.com/openapi.yaml # Set the webhook URL: https://docs.lastscanned.com/reference/webhooks/setWebhook `PUT https://api.lastscanned.com/v1/webhook` Sets the URL and/or format. The signing secret is made on first use and kept when the URL changes; `rotateSecret` makes a new one. Body: ```json { "url": "https://example.com/hooks/tracking", "format": "lastscanned" } ``` Responses: - 200: The webhook. - 400: Not an https URL Full spec: https://docs.lastscanned.com/openapi.yaml # Send a test event URL: https://docs.lastscanned.com/reference/webhooks/testWebhook `POST https://api.lastscanned.com/v1/webhook/test` Responses: - 200: What the endpoint answered. Full spec: https://docs.lastscanned.com/openapi.yaml # Delivery log URL: https://docs.lastscanned.com/reference/webhooks/listDeliveries `GET https://api.lastscanned.com/v1/webhook/deliveries` Webhook deliveries from the last 30 days, newest first. Parameters: - `state` (query) - `limit` (query) - `cursor` (query) Responses: - 200: Deliveries. Full spec: https://docs.lastscanned.com/openapi.yaml # Send a delivery again URL: https://docs.lastscanned.com/reference/webhooks/retryDelivery `POST https://api.lastscanned.com/v1/webhook/deliveries/{id}/retry` Parameters: - `id` (path, required) Responses: - 200: The delivery, queued to send. - 404: `not_found`: the carrier has no record of the number, or no such key. Full spec: https://docs.lastscanned.com/openapi.yaml # Get the account URL: https://docs.lastscanned.com/reference/account/getAccount `GET https://api.lastscanned.com/v1/account` Responses: - 200: The account. - 401: `unauthorized`: missing, wrong or revoked key, or a disabled account. ```json { "id": "acct_9c4e1b7a2d6f3e80", "email": "you@example.com", "name": null, "dailyLimit": 5, "createdAt": "2026-10-01T09:12:44Z", "usedToday": 2, "keys": [ { "prefix": "lsk_live_1a2b3c4d", "name": "default", "createdAt": "2026-10-01T09:12:44Z", "lastUsedAt": "2026-10-26T18:06:20Z" } ] } ``` Full spec: https://docs.lastscanned.com/openapi.yaml # Daily usage URL: https://docs.lastscanned.com/reference/account/getUsage `GET https://api.lastscanned.com/v1/usage` Parameters: - `days` (query) Responses: - 200: One row per UTC day with activity, newest first. - 401: `unauthorized`: missing, wrong or revoked key, or a disabled account. ```json { "usage": [ { "day": "2026-10-26", "lookups": 4, "live": 3 } ] } ``` Full spec: https://docs.lastscanned.com/openapi.yaml # Lookup history URL: https://docs.lastscanned.com/reference/account/getLookups `GET https://api.lastscanned.com/v1/lookups` One entry per tracking number per request, newest first, from the last 30 days. Parameters: - `limit` (query) - `cursor` (query): The previous page's nextCursor. - `number` (query): Only this tracking number, or numbers starting with it. Responses: - 200: A page of lookups. - 400: `bad_request`: the cursor isn't one this route returned. - 401: `unauthorized`: missing, wrong or revoked key, or a disabled account. ```json { "lookups": [ { "number": "1Z999AA10123456784", "carrier": "ups", "status": "delivered", "error": null, "source": "api", "cached": false, "createdAt": "2026-10-26T18:06:20Z" } ], "nextCursor": null } ``` Full spec: https://docs.lastscanned.com/openapi.yaml # Create a key URL: https://docs.lastscanned.com/reference/account/createKey `POST https://api.lastscanned.com/v1/keys` The full key is in this response only. Body: ```json { "name": "production" } ``` Responses: - 200: The new key. - 401: `unauthorized`: missing, wrong or revoked key, or a disabled account. ```json { "key": "lsk_live_…", "prefix": "lsk_live_1a2b3c4d", "name": "production" } ``` Full spec: https://docs.lastscanned.com/openapi.yaml # Revoke a key URL: https://docs.lastscanned.com/reference/account/revokeKey `DELETE https://api.lastscanned.com/v1/keys/{prefix}` Parameters: - `prefix` (path, required): `lsk_live_` + the key's first 8 hex characters. Responses: - 200: Revoked. - 401: `unauthorized`: missing, wrong or revoked key, or a disabled account. - 404: `not_found`: the carrier has no record of the number, or no such key. ```json { "revoked": "lsk_live_1a2b3c4d" } ``` Full spec: https://docs.lastscanned.com/openapi.yaml