UPS Package Tracking Scraper avatar

UPS Package Tracking Scraper

Pricing

from $20.00 / 1,000 ups tracking results

Go to Apify Store
UPS Package Tracking Scraper

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

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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.

FieldMeaning
trackingNumberNormalized UPS package or InfoNotice number
statusStable category such as in_transit, out_for_delivery, or delivered
statusTextCurrent status or latest update shown by UPS
terminalWhether the shipment is delivered or returned
delivered / delayedAutomation-friendly state flags
estimatedDeliveryUPS delivery estimate when publicly displayed
lastEventLatest visible update plus location when available
deliveredToDelivery location text when UPS exposes it
receivedByRecipient text when UPS exposes it; may contain personal data
sourceUrl / scrapedAtSource 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

FieldRequiredDefaultNotes
trackingNumbersYesPublic inactive sample1–25 values; whitespace, hyphens, and duplicates are removed
localeNoen_USUPS language/country locale such as en_US
requestTimeoutSecsNo4520–90 seconds per tracking number
proxyConfigurationNoApify Residential, USRecommended 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

EventPriceTrigger
Actor start$0.005Once when a run starts
UPS tracking result$0.020Each 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.

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.