Biklo for developersTESTsandbox-api.biklo.comchange

Tracking events

GET/v1/orders/{id}/tracking

scope orders.read

The courier's own history where we have it; before an AWB exists it falls back to the order's own milestones so you always have something to render.

Response#

FieldTypeDescription
order_idintegerThe order.
statusstring|nullWhere the parcel is: the status of the latest COURIER event, in the courier's own wording (the same text as that event's status). null until the courier has reported anything. Use events[].is_final rather than matching on the text to know the parcel arrived.
internal_statusstringThe order status, same vocabulary as status on GET /v1/orders/{id}. It stays accepted while the parcel travels and after it is delivered — delivery is recorded in delivered_at on the order, not here.
awbobject|nullThe waybill, or null before one exists.
awb.numberstringThe AWB number.
awb.tracking_urlstring|nullWhere the parcel can be followed.
eventsarrayWhat has happened to the parcel, oldest first. Before an AWB exists there is no courier history at all, so this FALLS BACK to the order's own milestones — you always get something to render, and source tells you which you are looking at.
events[].statusstringWhat happened. From the courier this is their own wording, not our status vocabulary, so do not match on it.
events[].atstringISO-8601 UTC.
events[].locationstring|nullWhere it was scanned, on courier events.
events[].is_finalbooleanWhether this is a terminal event for the parcel.
events[].sourcestringcourier is a real scan; order is one of our own milestones, used when there is no courier history yet.

Accepts courier · order

Example

{
    "order_id": 711,
    "status": "Livrat",
    "internal_status": "accepted",
    "awb": {
        "number": "SBX0000007112",
        "tracking_url": "https://sandbox-api.biklo.com/track/SBX0000007112"
    },
    "events": [
        {
            "status": "accepted",
            "at": "2026-09-09T19:40:19Z",
            "location": null,
            "source": "order",
            "is_final": false
        },
        {
            "status": "Livrat",
            "at": "2026-09-11T14:22:05Z",
            "location": "Craiova",
            "source": "courier",
            "is_final": true
        }
    ]
}

Failures use the shared error envelope — a machine-readable code and a request_id to quote to support. Error handling.

curl -X GET "https://sandbox-api.biklo.com/v1/orders/711/tracking" \
  -H "Authorization: Bearer bk_test_YOUR_KEY"
<?php

$ch = curl_init('https://sandbox-api.biklo.com/v1/orders/711/tracking');

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'GET',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer bk_test_YOUR_KEY',
    ],
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);
using System.Net.Http;
using System.Net.Http.Headers;

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "bk_test_YOUR_KEY");

var request = new HttpRequestMessage(
    new HttpMethod("GET"),
    "https://sandbox-api.biklo.com/v1/orders/711/tracking");

var response = await client.SendAsync(request);
var json = await response.Content.ReadAsStringAsync();
import requests

response = requests.get(
    "https://sandbox-api.biklo.com/v1/orders/711/tracking",
    headers={"Authorization": "Bearer bk_test_YOUR_KEY"},
)

data = response.json()
const response = await fetch("https://sandbox-api.biklo.com/v1/orders/711/tracking", {
  method: "GET",
  headers: {
    Authorization: "Bearer bk_test_YOUR_KEY"
  }
});

const data = await response.json();
import java.net.http.*;
import java.net.URI;

var client = HttpClient.newHttpClient();

var request = HttpRequest.newBuilder()
    .uri(URI.create("https://sandbox-api.biklo.com/v1/orders/711/tracking"))
    .header("Authorization", "Bearer bk_test_YOUR_KEY")
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();

var response = client.send(request, HttpResponse.BodyHandlers.ofString());