Carriers

Spee-Dee Delivery Tracking API & MCP

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

PropertyValue
Carrier slug (?carrier=)speedee
Brand & service aliasesSpee-Dee Delivery Service, Spee-Dee Ground
CategoryUS Upper Midwest regional parcel carrier (Detection precedence #10 of 31)
Single-package REST endpointGET https://api.lastscanned.com/v1/track/{trackingNumber}
Batch REST endpointGET https://api.lastscanned.com/v1/track?numbers=SP...,SP... (note: upstream rate limit of 10 lookups/minute)
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 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:

PassRule / RegexCheck DigitExamples
Pass 1 (matches)/^SP(\d{16}|\d{18})$/i (SP + 16 or 18 digits = 18 or 20 chars)—SP029692450001607639, SP0000000000000001
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

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

JavaScript / TypeScript (fetch)

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

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

Normalized TrackingResult JSON response

{
  "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.

On this page