Track packages via the 17track universal API. Supports FedEx, UPS, DHL, CTT, China Post, Royal Mail, USPS, and 2000+ other carriers with automatic carrier detection.
Run once from the skill directory:
bash
cd /root/.openclaw/workspace/skills/package-tracker
bash scripts/setup.sh
Then edit scripts/.env to add your API key:
text
SEVENTEEN_TRACK_API_KEY=your_key_here
Get a free key at https://admin.17track.net (100 registrations/month, unlimited status checks).
All commands run from the skill directory. Activate the venv first:
bash
cd /root/.openclaw/workspace/skills/package-tracker
source scripts/venv/bin/activate
bash
python scripts/cli.py add "TRACKING_NUMBER" -d "Description of contents"
-c "FedEx" if neededbash
python scripts/cli.py check
bash
python scripts/cli.py list # Active only
python scripts/cli.py list --all # Include delivered/inactive
bash
python scripts/cli.py details "TRACKING_NUMBER"
Shows full tracking history with all events, locations, and timestamps.
bash
python scripts/cli.py remove "TRACKING_NUMBER"
Deactivates tracking (does not delete history).
bash
python scripts/cli.py quota
Shows registrations used this month vs. the 100/month free limit.
Set up periodic checks with cron or OpenClaw heartbeats.
bash
# Add to crontab:
0 */3 * * * cd /root/.openclaw/workspace/skills/package-tracker && scripts/venv/bin/python scripts/check_updates.py --quiet
In your heartbeat logic, include:
bash
cd /root/.openclaw/workspace/skills/package-tracker
source scripts/venv/bin/activate
python scripts/check_updates.py
The check_updates.py script:
--quiet to suppress output when there are no updatesWhen updates are detected, the tracker outputs formatted notifications to stdout. OpenClaw reads this output and relays it via its native message tool — which works on Telegram, Signal, Discord, WhatsApp, or whatever channel the user has configured.
Every package gets a carrier-specific tracking URL:
CarrierURL PatternFedExfedex.com/fedextrack/?trknbr={tn}UPSups.com/track?tracknum={tn}DHLdhl.com/en/express/tracking.html?AWB={tn}CTTctt.pt/.../objectSearch.jspx?objects={tn}USPStools.usps.com/go/TrackConfirmAction?tLabels={tn}Fallbackt.17track.net/en#nums={tn}
The get_tracking_url(tracking_number, carrier) function in tracker.py generates these.
StatusEmojiMeaningpending⏳Just added, not yet checkedNot Found❓17track has no data yetIn Transit🚚Package is movingPick Up📬Ready for pickupDelivered✅Delivered (auto-deactivated)Undelivered⚠️Delivery attempt failedExpired⌛Tracking data expiredAlert🚨Exception or issue
Delivered packages are automatically deactivated.
scripts/data/tracker.db (SQLite)packages, tracking_events, api_usageVariableRequiredDescriptionSEVENTEEN_TRACK_API_KEYYes17track API key from admin.17track.net
scripts/.env and add your 17track key-c "CarrierName" when adding, or let 17track auto-detect (carrier code 0)references/carriers.md — Full list of supported carriers with patterns and URLsreferences/17track-api.md — API endpoint reference, status codes, rate limits