UPS Package Tracking Scraper
Pricing
from $20.00 / 1,000 ups tracking results
UPS Package Tracking Scraper
Track current public UPS package status in a browser and return normalized tracking status, latest update, delivery estimate, and delivery details for up to 25 authorized tracking numbers.
Pricing
from $20.00 / 1,000 ups tracking results
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Track public UPS package status in a real browser and return normalized, agent-ready JSON for operations teams, ecommerce support, shipment monitoring, and workflow automation.
This Apify Actor opens UPS’s public tracking flow with each supplied tracking number. It uses a coherent browser and proxy session because ordinary HTTP requests to UPS are frequently rejected by Akamai before the tracking application loads. The Actor does not require a UPS developer account, does not solve CAPTCHAs, and does not request proof-of-delivery images or signatures.
What it extracts
Each tracking number with an active public UPS result produces one dataset item.
| Field | Meaning |
|---|---|
trackingNumber | Normalized UPS package or InfoNotice number |
status | Stable category such as in_transit, out_for_delivery, or delivered |
statusText | Current status or latest update shown by UPS |
terminal | Whether the shipment is delivered or returned |
delivered / delayed | Automation-friendly state flags |
estimatedDelivery | UPS delivery estimate when publicly displayed |
lastEvent | Latest visible update plus location when available |
deliveredTo | Delivery location text when UPS exposes it |
receivedBy | Recipient text when UPS exposes it; may contain personal data |
sourceUrl / scrapedAt | Source page and UTC extraction time |
Invalid, inactive, challenged, or failed lookups are not fabricated as shipment records. They are written as masked diagnostics in the OUTPUT key-value-store record, where outcome is one of DATA, EMPTY, BLOCKED, REJECTED, or FAILED.
When to use it
Use this Actor when you need current public UPS tracking status for up to 25 numbers per run, especially from Apify schedules, API calls, Make, Zapier, n8n, or an AI agent. It is suitable for customer-support triage, delivery exception monitoring, order operations, and periodic status checks.
Do not use it for creating shipments, rating, address validation, claims, delivery changes, proof-of-delivery signatures, or high-volume carrier integration. Those workflows belong on UPS’s authenticated developer APIs. UPS states that tracking data is normally retained for a limited period, so old valid numbers can truthfully return no result.
Input
| Field | Required | Default | Notes |
|---|---|---|---|
trackingNumbers | Yes | Public inactive sample | 1–25 values; whitespace, hyphens, and duplicates are removed |
locale | No | en_US | UPS language/country locale such as en_US |
requestTimeoutSecs | No | 45 | 20–90 seconds per tracking number |
proxyConfiguration | No | Apify Residential, US | Recommended because UPS rejects many datacenter/TLS clients |
The prefilled number is a widely published inactive sample and normally exercises the truthful EMPTY path without producing or charging for a result. Replace it with a current number you are authorized to track for live data.
Console input
{"trackingNumbers": ["1Z999AA10123456784","YOUR_SECOND_UPS_NUMBER"],"locale": "en_US","requestTimeoutSecs": 45,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
API call
curl -X POST \"https://api.apify.com/v2/acts/YOUR_USERNAME~ups-package-tracking-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"trackingNumbers":["YOUR_UPS_TRACKING_NUMBER"],"locale":"en_US"}'
Avoid putting API tokens or tracking numbers into public logs. For production integrations, send the Apify token in an authorization header or secret store rather than embedding it in source code.
Output example
{"trackingNumber": "1Z999AA10123456784","carrier": "UPS","status": "delivered","statusText": "Delivered","terminal": true,"delivered": true,"delayed": false,"estimatedDelivery": null,"lastEvent": {"text": "Delivered","location": "Austin, TX"},"deliveredTo": "Austin, TX","receivedBy": "FRONT DESK","sourceUrl": "https://www.ups.com/track?loc=en_US&tracknum=1Z999AA10123456784&requester=ST%2Ftrackdetails","scrapedAt": "2026-08-27T05:00:00.000Z"}
Fields that UPS does not expose are explicitly null; their absence is never replaced with guessed data.
Pay per event pricing
| Event | Price | Trigger |
|---|---|---|
| Actor start | $0.005 | Once when a run starts |
| UPS tracking result | $0.020 | Each schema-valid dataset record |
A run that checks one inactive number costs only the start event. One found package costs about $0.025; ten found packages cost about $0.205. These examples describe event charges and exclude any platform usage passed through by the account’s pricing configuration. The Actor checks the run’s maximum charge before crawling additional results and does not manually charge either synthetic event.
Reliability and failure behavior
The Actor uses the public UPS page as its source. It maintains one consistent browser fingerprint, cookie jar, locale, proxy geography, and residential session. Images, fonts, media, and common analytics requests are blocked to reduce bandwidth without removing the scripts required by tracking. Requests run sequentially to avoid hammering UPS.
If UPS presents an Akamai or CAPTCHA challenge, the Actor retires the session and makes one bounded retry with a fresh proxy session. It never solves or bypasses the challenge. A repeated challenge becomes a BLOCKED diagnostic with zero result events. Temporary HTTP or rendering problems become FAILED; invalid/inactive numbers become EMPTY; malformed numbers become REJECTED. Valid partial results are preserved even when another lookup fails.
UPS can change its public markup, restrict traffic, remove old tracking data, or hide some details based on shipment type and destination. The Actor therefore promises only fields visible on the public result page. For business-critical or very high-volume use, integrate the official OAuth-protected UPS Tracking API instead.
Privacy, legal use, and compliance
Tracking numbers and delivery details can be sensitive. Run this Actor only for shipments you own, administer, or are authorized to monitor. Keep runs, datasets, and integrations private; limit retention; and do not publish recipient information. The Actor masks tracking numbers in warnings, does not log them intentionally, and excludes proof-of-delivery images and signatures. You remain responsible for complying with UPS terms, privacy law, contractual duties, and applicable data-retention rules.
This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by UPS. UPS is a trademark of United Parcel Service of America, Inc., used descriptively to identify the public source.
Support
When reporting a problem, share the Apify run ID, outcome, and timestamp. Do not post a full tracking number or recipient data in a public issue. A redacted number with the first two and last four characters is enough for most diagnostics.