Get Order Timeline
curl --request GET \
--url https://api.zinc.com/orders/{order_id}/timeline \
--header 'Authorization: <api-key>'import requests
url = "https://api.zinc.com/orders/{order_id}/timeline"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.zinc.com/orders/{order_id}/timeline', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zinc.com/orders/{order_id}/timeline",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zinc.com/orders/{order_id}/timeline"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.zinc.com/orders/{order_id}/timeline")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/orders/{order_id}/timeline")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"current_status": "pending",
"milestones": [
{
"type": "order_created",
"label": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"source": "<string>",
"detail": {}
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Orders
Get Order Timeline
Retrieve the customer-facing lifecycle timeline of events for a Zinc order.
GET
/
orders
/
{order_id}
/
timeline
Get Order Timeline
curl --request GET \
--url https://api.zinc.com/orders/{order_id}/timeline \
--header 'Authorization: <api-key>'import requests
url = "https://api.zinc.com/orders/{order_id}/timeline"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.zinc.com/orders/{order_id}/timeline', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zinc.com/orders/{order_id}/timeline",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zinc.com/orders/{order_id}/timeline"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.zinc.com/orders/{order_id}/timeline")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/orders/{order_id}/timeline")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"current_status": "pending",
"milestones": [
{
"type": "order_created",
"label": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"source": "<string>",
"detail": {}
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Retrieve the customer-facing lifecycle timeline for an order. The timeline merges the order’s placement outcome with carrier tracking state into an ordered list of milestones.
The timeline is derived from existing order and tracking data on every
request, so it is available for all orders — including orders placed before
this endpoint was introduced.
Milestones
Milestones are sorted byoccurred_at, oldest first. Each one has a type, a human-readable label, the source it was derived from, and an optional detail object.
type | Label | When it appears | detail |
|---|---|---|---|
order_created | Order placed | Always, as the first milestone. Marks when you submitted the order. | — |
order_placed | Order confirmed | The retailer accepted the order. Shown even if earlier attempts failed and a retry succeeded. | merchant_order_ids, when known |
order_failed | Order failed | The order ended failed. Takes the place of order_placed. | — |
cancelled | Cancelled / Cancelled by retailer | The order was cancelled. | — |
tracking_acquired | Tracking received | The first tracking number was recorded. | carrier, tracking_number, count (number of tracking numbers on the order) |
shipped | Shipped | The first carrier scan showing a package moving. | carrier, message, location |
available_for_pickup | Ready for pickup | A package is waiting at a carrier facility. One per package, at its first pickup scan. | carrier, tracking_number, message, location |
undeliverable | The carrier’s own wording, e.g. “Delivery on hold” | The carrier couldn’t deliver a package. One per affected package, so a multi-package order shows which one is missing. | carrier, tracking_number |
delivered | Delivered | Every package on the order has been delivered. | location |
An
available_for_pickup milestone stays on the timeline after the package
is collected, so the history shows it waited at a carrier facility. Use
tracking for each
package’s current state.Authorizations
Zinc API key (Bearer zn_...)
Headers
Path Parameters
Response
Successful Response
Customer-facing lifecycle timeline for an order.
Derived on read by merging placement logs (OrderLog) with carrier tracking state (TrackingNumber / TrackingCheckpoint). No dedicated storage — works retroactively on every historical order.

