Carriers

Amazon Logistics Tracking API & MCP

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

PropertyValue
Carrier slug (?carrier=)amazon
Brand & service aliasesAmazon Logistics, Amazon Shipping (SWA), Amazon Multi-Channel Fulfillment (MCF), TBA / TBC / TBM
CategoryNational e-commerce & merchant fulfillment carrier (Detection precedence #5 of 31)
Single-package REST endpointGET https://api.lastscanned.com/v1/track/{trackingNumber}
Batch REST endpointGET 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)track_package, track_packages, list_carriers (claude mcp add --transport http lastscanned https://mcp.lastscanned.com)
Authentication & pricingAuthorization: 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)

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/:number.
  • 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:

PassRule / RegexCheck DigitExamples
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

curl -s "https://api.lastscanned.com/v1/track/TBA319482710492" \
  -H "Authorization: Bearer $LASTSCANNED_API_KEY"

JavaScript / TypeScript (fetch)

const res = await fetch("https://api.lastscanned.com/v1/track/TBA319482710492", {
  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

{
  "tool": "track_package",
  "arguments": {
    "tracking_number": "TBA319482710492"
  }
}

Normalized TrackingResult JSON response

{
  "carrier": "amazon",
  "trackingNumber": "TBA319482710492",
  "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.

On this page