# 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 542 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 |
| **Instant Credit Pack** | **$0.50 one-time** | **25 live lookups** (`$0.02/lookup`) | Buy another pack anytime | One-off spreadsheet audits & quick batches |
| **Pro Plan** | **$4.99 / month** | **1,000 live lookups / month** (`$0.005/lookup`) | **$0.005 / lookup** (`$5` per 1,000) | Daily Web UI Dashboard Watches, webhooks & production APIs |
| **Keyless x402 / Tempo MPP** | **$0.005 / lookup** | Pay-per-request on Base USDC | No account required | Autonomous AI agents & headless CLI scripts |

---

## 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`)](/webhooks)**
