# 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 |

Without a key, `GET /v1/track/:number` also works once a day per IP address.

## 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** 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.

See [Pay per request](/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.
