UPS Tracking Scraper — Bulk Package Status Lookup avatar

UPS Tracking Scraper — Bulk Package Status Lookup

Pricing

from $22.00 / 1,000 ups tracking results

Go to Apify Store
UPS Tracking Scraper — Bulk Package Status Lookup

UPS Tracking Scraper — Bulk Package Status Lookup

Automate UPS tracking for up to 25 packages per run without a UPS developer account: status, delivery estimate, latest update. USD 30 per 1,000 results.

Pricing

from $22.00 / 1,000 ups tracking results

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

6

Monthly active users

9 days ago

Last modified

Security

Limited permissions

Share

UPS Tracking Scraper checks up to 25 UPS tracking or InfoNotice numbers per run on the public UPS tracking page and returns the current status, delivery estimate, latest update, delivered-to location and received-by text as one JSON record per package. It is built for customer-support, ecommerce and operations teams that need bulk UPS tracking without a UPS developer account, and costs USD 30 per 1,000 tracking results on the FREE tier, charged only for results delivered.

How do I bulk track UPS packages without a UPS developer account?

Give this Actor your list of numbers; it opens the public UPS tracker in a real browser for each one, so you need only an Apify account. UPS's official Tracking API requires a developer registration and OAuth credentials, while UPS's website tracks a limited batch by hand. This Actor sits in between: up to 25 numbers per run, structured output, and the same input every time from the API, a schedule or an AI agent.

{
"trackingNumbers": ["1Z999AA10123456784", "YOUR_SECOND_UPS_NUMBER"],
"locale": "en_US",
"requestTimeoutSecs": 45
}
InputDefaultNotes
trackingNumbers (required)["1Z999AA10123456784"]1–25 UPS package or InfoNotice numbers, 7–34 letters or digits; spaces, hyphens and duplicates are removed
localeen_USUPS language and country version, for example en_GB
requestTimeoutSecs4520–90 seconds the browser waits for one result

The prefill is UPS's widely published sample number. Replace it with your own numbers; a number UPS has no active record for ends as EMPTY and is not charged. Do not enter order numbers or addresses.

What UPS tracking data does it return?

Each number with an active public UPS result becomes one record. Fields UPS does not show are null, never guessed.

FieldWhat it means
trackingNumberUPS tracking or InfoNotice number
carrierAlways UPS
statusStable category: pre_advice, accepted, in_transit, out_for_delivery, delayed, delivery_attempted, ready_for_pickup, delivered, returned, exception or unknown
statusTextStatus text as UPS shows it
terminaltrue when delivered or returned, so you can stop polling
delivered / delayedYes/no flags for automations
estimatedDeliveryUPS delivery estimate when shown
lastEventLatest update text and its location
deliveredToDelivery location text, such as city and state
receivedByRecipient text when UPS shows it; may be personal data
sourceUrl / scrapedAtUPS tracking page and UTC time of the lookup

Run diagnostics go to the OUTPUT record in the key-value store: an outcome of DATA, EMPTY, BLOCKED, REJECTED or FAILED, counts, and a masked warning for each number without a record.

When should you use UPS Tracking Scraper, and when not?

Use it when your list is UPS only and you want the current status per package for support triage, delivery-exception checks or periodic order audits, including InfoNotice numbers and a non-US UPS locale.

Pick a different tool when:

  • Your list mixes carriers, or you need the full UPS scan history. Multi-Carrier Package Tracking auto-detects UPS and FedEx numbers and returns UPS scan events and origin and destination when UPS exposes them.
  • Your numbers are FedEx. Use FedEx Tracking Scraper, which handles 30 numbers per run.
  • Your numbers are DHL. Use DHL Package Tracking Scraper.
  • You need other carriers or postal services. 17TRACK Package Tracking Scraper reads 17TRACK's public tracker.
  • You need shipping labels, rates, address validation, claims, delivery changes or proof-of-delivery signatures. Those belong on UPS's authenticated APIs.

How do I run it from code or on a schedule?

Call it with apify-client, or save the input as an Apify schedule (daily, hourly or any cron) and read each run's dataset.

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/ups-package-tracking-scraper').call({
trackingNumbers: ['1Z999AA10123456784'],
locale: 'en_US',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.trackingNumber, i.status, i.estimatedDelivery]));

Python:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("muhammadafzal/ups-package-tracking-scraper").call(
run_input={"trackingNumbers": ["1Z999AA10123456784"], "locale": "en_US"}
)
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item["trackingNumber"], item["status"], item["deliveredTo"])

Keep the Apify token in an authorization header, environment variable or secret store, and keep tracking numbers out of public logs.

Use it from an AI assistant

UPS Tracking Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/ups-package-tracking-scraper as a server, then ask, for example: "Check these UPS tracking numbers and tell me which packages are delivered and which are still on the way." The agent can read the input schema and the price per result before it runs.

What does the output look like?

Two records (values are illustrative):

[
{
"trackingNumber": "1Z999AA10123456784",
"carrier": "UPS",
"status": "delivered",
"statusText": "Delivered",
"terminal": true,
"delivered": true,
"delayed": false,
"estimatedDelivery": null,
"lastEvent": { "text": "Delivered", "location": "Austin, TX, United States" },
"deliveredTo": "Austin, TX",
"receivedBy": "FRONT DESK",
"sourceUrl": "https://www.ups.com/track?loc=en_US&tracknum=1Z999AA10123456784&requester=ST%2Ftrackdetails",
"scrapedAt": "2026-10-22T07:30:05.000Z"
},
{
"trackingNumber": "1Z999AA10123456785",
"carrier": "UPS",
"status": "in_transit",
"statusText": "On the Way",
"terminal": false,
"delivered": false,
"delayed": false,
"estimatedDelivery": "Friday, October 23",
"lastEvent": { "text": "Departed from Facility", "location": "Louisville, KY, United States" },
"deliveredTo": "Denver, CO",
"receivedBy": null,
"sourceUrl": "https://www.ups.com/track?loc=en_US&tracknum=1Z999AA10123456785&requester=ST%2Ftrackdetails",
"scrapedAt": "2026-10-22T07:30:41.000Z"
}
]

How much does UPS tracking cost? Pricing

You pay per delivered tracking result plus a start fee. Apify platform usage is included. Numbers that are not found, invalid, blocked or failed are not charged.

Event (USD)FREEBRONZESILVERGOLD, PLATINUM, DIAMOND
UPS tracking result0.0300.0300.0300.022
Actor start, per started GB of allocated memory0.0050.0050.0050.005

At the default 1,024 MB there is one start event per run; at 2,048 MB there are two.

Worked totals at default memory:

  • 25 results, FREE tier: USD 0.005 + 25 × 0.030 = USD 0.755.
  • 10 results, GOLD tier: USD 0.005 + 10 × 0.022 = USD 0.225.

What happens when UPS blocks a lookup or has no record?

The run keeps going, and only real UPS results become records. Each number is processed in order in one consistent browser session. If UPS shows a challenge or a page fails to load, the Actor retries that number up to three times with a fresh browser session; it never solves or bypasses a CAPTCHA. A number that stays challenged is reported as BLOCKED, a load problem as FAILED, an inactive or unknown number as EMPTY, and a malformed value as REJECTED. Results already found are kept.

The Actor captures UPS's own tracking response where possible and falls back to the rendered page. Images, fonts and analytics scripts are skipped to keep runs light. Apify's maximum-charge setting for the run caps what you pay. UPS keeps public tracking data for a limited time and can hide details by service or destination, so old valid numbers can truthfully return no result.

FAQ

Is this the official UPS Tracking API?

No. It reads the public UPS tracking page. For high-volume, contract-backed integration, UPS's authenticated Tracking API is the official route.

Does it return the full scan history?

No; it returns the latest update and delivery details. For UPS scan-by-scan history, use Multi-Carrier Package Tracking with tracking events turned on.

Can I export UPS tracking results to CSV or Google Sheets?

Yes. Export the dataset as CSV, Excel or JSON from Apify Console, or push it to Google Sheets with Make, Zapier or n8n.

Can it check UPS tracking every day automatically?

Yes. Attach an Apify schedule to your saved input, and use terminal to remove delivered or returned packages from the next run.

Does it work with UPS InfoNotice numbers?

Yes. InfoNotice numbers are accepted in the same list as 1Z tracking numbers.

Why are some fields null?

UPS does not show every detail for every package. receivedBy usually appears only after delivery, and only when UPS displays it; estimatedDelivery is null whenever UPS shows no estimate.

Track only shipments you own, handle or are authorized to monitor. receivedBy and delivery locations can be personal data, so keep datasets private and retain them only as long as needed. The Actor masks tracking numbers in warnings and never requests proof-of-delivery images or signatures. It is unofficial and not affiliated with UPS; UPS is a trademark of United Parcel Service of America, Inc., used only to identify the public source. When reporting a problem, share the run ID and only the first two and last four characters of a tracking number.

Last verified: 2026-10-26