Skip to main content

Ingest tracking data

Scoring needs two things: the shipments you want graded (their promise and lane) and the tracking events that arrive against them. Both are pushed through org-scoped ingest routes; every row is stamped with your X-Organization-Id server-side, so an upload can only write into your own data.

Upload shipments

POST /v1/ingest/shipments accepts an array of shipment master records (max 500 per request). These establish the promise and lane each shipment is graded against before its events arrive.

curl -X POST https://api.orderlycore.com/v1/ingest/shipments \
-H "Authorization: Bearer $ORDERLY_INTEL_KEY" \
-H "X-Organization-Id: $ORG_ID" \
-H "Content-Type: application/json" \
-d '[
{
"tracking_number": "1Z999AA10123456784",
"carrier": "ups",
"shipped_at": "2026-07-20T15:00:00Z",
"promised_at": "2026-07-23T23:59:00Z",
"origin_zip": "07001",
"dest_zip": "94107",
"service_level": "ground"
}
]'

Push tracking events

POST /v1/ingest/events accepts an array of raw tracking events (max 500 per request). The Hub API forwards carrier webhooks here automatically; use this route to push events from your own systems.

curl -X POST https://api.orderlycore.com/v1/ingest/events \
-H "Authorization: Bearer $ORDERLY_INTEL_KEY" \
-H "X-Organization-Id: $ORG_ID" \
-H "Content-Type: application/json" \
-d '[
{
"tracking_number": "1Z999AA10123456784",
"carrier": "ups",
"status": "in_transit",
"description": "Departed facility",
"occurred_at": "2026-07-21T08:12:00Z"
}
]'

Both routes return { "ok": true, "data": { "accepted": <n> } }. Ingestion is asynchronous; track progress with GET /v1/jobs/:id using the job id returned.

See the Ingest reference to try these live.