Deterministic synchronous REST & official remote MCP—built for production code and AI agents.
ParcelsApp is primarily a consumer ad-supported tracking website whose API relies on asynchronous polling tokens when results aren't cached. lastscanned is engineered specifically for software and AI agents: one synchronous GET /v1/track/:number returns a strict TypeScript-ready JSON schema with a 7-state status enum, UTC + local timestamps, and an official remote MCP server (https://mcp.lastscanned.com) for $4.99/month.
lastscanned vs. ParcelsApp at a glance
Side-by-side comparison of architecture, monthly pricing across 31 supported carriers, and AI agent integration.
| Feature | lastscanned | ParcelsApp |
|---|---|---|
| Primary audience | Developers, SaaS backends, WISMO workflows & AI agents | Consumer ad-supported web lookup with secondary API |
| Request execution | Single synchronous GET /v1/track/:number (or batch ?numbers=...) | Often returns a uuid requiring repeated follow-up polling requests |
| Response contract | Strict JSON schema: 7-state status enum, ISO-8601 UTC timestamp + localTime, structured location | Loosely typed aggregator strings across varying courier formats |
| Pricing & re-polling | $0 Free (5/day) or $4.99/mo Pro (1,000 unique numbers + unlimited free re-polls all month) | Tiered request quotas where repeated polling consumes request allowance |
| Official remote MCP server | https://mcp.lastscanned.com (Streamable HTTP + URL-path auth) | None |
| Machine-readable discovery | OpenAPI 3.1 (/openapi.yaml, api.lastscanned.com/openapi.json), /llms.txt, /llms-full.txt, and .md docs | Basic documentation page |
| Keyless HTTP 402 Stripe MPP | Built-in ($0.50 / 25-pack card or $0.02 USDC on Tempo) | None |
Single-trip synchronous JSON vs. UUID polling loops
Consumer tracking aggregators frequently return an incomplete response with a job UUID, forcing your backend to sleep and poll in a loop until the lookup finishes.
- One request, one complete answer
- GET https://api.lastscanned.com/v1/track/:number holds the connection and returns the complete, normalized TrackingResult in a single HTTP response.
- Batch up to 100 tracking numbers
- Query GET /v1/track?numbers=num1,num2,... to retrieve an ordered results[] array with per-item status and body.
Strict, predictable schema for production code and LLMs
Your application shouldn't need regexes to parse the tracking API's own output.
- Normalized 7-state status enum
- Every carrier maps cleanly to label_created, in_transit, out_for_delivery, delivered, exception, returned, or unknown.
- Dual timestamps & clean handoff messages
- Every event provides both UTC timestamp and local wall-clock localTime, and cross-border handoffs populate top-level message ('Handed to <carrier> as <number>').
Agent-native: MCP, llms.txt & HTTP 402 Stripe MPP
lastscanned treats AI agents as first-class API citizens alongside human developers.
- Hosted Streamable HTTP MCP
- Connect Claude Code, Cursor, Windsurf, or ChatGPT to https://mcp.lastscanned.com in one line.
- Unlimited re-polls on $4.99/mo Pro
- Track 1,000 unique numbers per month for $4.99 with unlimited free re-polls on every active package, or pay per request over HTTP 402.
Switch in one synchronous request
No SDKs, no tracker registration queues, and no webhook listeners. Query up to 100 tracking numbers at once over REST or connect your AI agent over Streamable HTTP MCP.
REST (Synchronous GET)
curl "https://api.lastscanned.com/v1/track/INTLCM123456789" \
-H "Authorization: Bearer lsk_live_YOUR_API_KEY"Remote MCP (Claude Code / Cursor / ChatGPT)
claude mcp add --transport http lastscanned https://mcp.lastscanned.com \
--header "Authorization: Bearer lsk_live_YOUR_API_KEY"Then ask your agent
> Track Intelcom Dragonfly package INTLCM123456789 and show its delivery status.
lastscanned vs. ParcelsApp FAQ
- Does lastscanned require polling a job UUID after submitting a tracking number?
- No. GET /v1/track/:number is synchronous and returns the normalized tracking status and scan events in the initial HTTP response.
- How does lastscanned normalize statuses and timestamps across 31 carriers?
- Every carrier response is normalized into a single JSON schema with a 7-value status enum (label_created, in_transit, out_for_delivery, delivered, exception, returned, unknown), YYYY-MM-DD estimatedDelivery, and events containing both UTC timestamp and local wall-clock localTime.
- Can AI agents use lastscanned without an account?
- Yes. Every IP gets 1 free keyless lookup per day on GET /v1/track/:number, and autonomous agents can pay for additional lookups automatically via HTTP 402 Stripe Machine Payments Protocol ($0.50 for a 25-number credit pack or $0.02 USDC on Tempo).
Compare other tracking providers
See how lastscanned compares to legacy tracking aggregators, shipping-label platforms, and direct carrier endpoints.
- lastscanned vs. AfterShip/vs/aftership
- lastscanned vs. EasyPost/vs/easypost
- lastscanned vs. Ship24/vs/ship24
- lastscanned vs. 17TRACK/vs/17track
- lastscanned vs. Direct Carrier APIs/vs/direct-carrier-apis
- lastscanned vs. Shippo/vs/shippo
- lastscanned vs. ShipEngine/vs/shipengine
- Full architecture & WAF comparison guidedocs.lastscanned.com/comparison