Biklo for developersTESTsandbox-api.biklo.comchange

One order

GET/v1/orders/{id}

scope orders.read

Adds the delivery details you need to ship, the fee breakdown and the courier.

Response#

FieldTypeDescription
idintegerOUR order id, and what goes in the path of every other order endpoint.
referencestring|nullThe human-readable order reference, as the buyer sees it. Quote this to support, not the id.
statusstringWhere the order is. Only pending can be accepted or rejected; accepted is the only one that can take a waybill.

Accepts pending · accepted · rejected · expired · ship_to_courier · picked_up · in_delivery · lost · delivered · confirmed · not_confirmed · returned · cancelled

can_acceptbooleanWhether POST /v1/orders/{id}/accept would succeed right now. Branch on this rather than learning our status model — it stays right if the model changes.
has_awbbooleanWhether a waybill already exists. Requesting one again returns the existing AWB rather than booking a second shipment, but this lets you skip the call.
totalobjectWhat the buyer paid, in total.
total.amountinteger|nullMinor units.
total.currencystring|nullThe order currency, decided by the listing. This is the balance it settles into.
refundedobjectWhat has been refunded to the buyer so far (short shipment, return, cancellation). total stays what the buyer PAID; this is the part that went back.
refunded.amountintegerMinor units. 0 when nothing was refunded.
refunded.currencystring|nullThe order currency.
itemsarrayThe order lines.
items[].idintegerThe order LINE id. This is what a parcel plan references, so you cannot pack an order without reading these first.
items[].product_idintegerOur product id.
items[].external_idstring|nullYOUR product id, carried onto the line so you can match it to your catalogue without a lookup.
items[].skustring|nullYour SKU, for the same reason.
items[].titlestringThe product title at the time of sale.
items[].quantityintegerHow many pieces of this line ship. Equal to quantity_ordered unless the seller short-shipped.
items[].quantity_orderedintegerHow many pieces the buyer ordered.
items[].quantity_shortintegerPieces the seller did not have (short shipment), refunded to the buyer. 0 normally. total_price covers only the pieces that ship.
items[].unit_priceobjectPrice for ONE unit.
items[].unit_price.amountinteger|nullMinor units. This is what the buyer actually paid, so it reflects an accepted price offer rather than the listed price.
items[].unit_price.currencystring|nullCurrency of the unit price.
items[].total_priceobjectPrice for the whole line.
items[].total_price.amountinteger|nullMinor units — unit price times quantity.
items[].total_price.currencystring|nullCurrency of the line total.
awbobject|nullThe waybill, once one exists; null before that.
awb.numberstringThe AWB number, for the courier.
awb.tracking_urlstring|nullWhere the buyer can follow the parcel.
is_dropshippingbooleanWhether this order ships from a pickup point rather than your own address. The return address stays your seller address either way.
created_atstringISO-8601 UTC. When the buyer paid.
updated_atstringISO-8601 UTC. What ?updated_since= compares against.
accepted_atstring|nullISO-8601 UTC, or null if not accepted yet.
delivered_atstring|nullISO-8601 UTC, when the courier recorded delivery; null until then. status stays accepted through delivery, so read this (or GET /v1/orders/{id}/tracking) to know the parcel arrived.
expires_atstring|nullWhen an unaccepted order is auto-rejected. Accept before this or it goes away on its own.
notes_from_buyerstring|nullAnything the buyer wrote at checkout. Read it before you pack — it is where "please call before delivery" lives.
courier_idinteger|nullWhich courier carries it. Chosen at checkout, not by you.
seller_invoicestring|nullYour own invoice, once uploaded through POST /v1/orders/{id}/invoice — a stored path or the URL you gave us.
feesobjectWhat this order costs YOU. Both are amounts we take, not amounts the buyer paid.
fees.platform_feeinteger|nullOur commission, in minor units. 0 when your company absorbs it or the listing is fee-free.
fees.shippinginteger|nullThe courier charge, in minor units. 0 when the buyer paid it at checkout.
fees.currencystring|nullCurrency of both figures.
deliveryobjectWhere it goes. Present on the detail endpoint only.
refundsarrayEvery refund on this order, oldest first: {id, reason, type, amount, currency, status, items: [{id, quantity}], created_at}. reason is short_shipped (the seller had fewer pieces — items says which line and how many), buyer_returned, seller_rejected, cancellation, …; status is succeeded, pending or requires_manual_review.
delivery.recipientstring|nullWho receives it.
delivery.phonestring|nullTheir phone, for the courier.
delivery.citystring|nullDestination city.
delivery.countystring|nullDestination county.
delivery.postcodestring|nullDestination postal code.
delivery.countrystring|nullISO-2 of the destination.
delivery.is_lockerbooleanWhether it goes to a parcel locker rather than a door. Locker parcels have size limits a door delivery does not.
parcelsarrayHow many BOXES this order ships in, and what is in each. The courier is priced per parcel, so without this you cannot reconcile a waybill against what you packed. An EMPTY list means no plan was ever stored — every order accepted before packing plans existed. Those still ship: the default plan is applied when the waybill is requested.
parcels[].idintegerThe parcel id.
parcels[].sequence_nointegerBox 1, 2, 3 — the order they were declared in.
parcels[].weight_kgnumber|nullWeight of the packed box. Stored in grams and published in kilograms, matching the units you send.
parcels[].length_cmnumber|nullCentimetres.
parcels[].width_cmnumber|nullCentimetres.
parcels[].height_cmnumber|nullCentimetres.
parcels[].is_seller_declaredbooleantrue means YOU said so when accepting; false means we assumed one box per line. Worth distinguishing — an assumed plan is a guess the courier may price differently.
parcels[].itemsarrayWhat is inside this box.
parcels[].items[].order_item_idintegerWhich order line, matching items[].id.
parcels[].items[].quantityintegerHow many units of that line are in this box.

Example

{
    "id": 711,
    "reference": "SBXORD-SJP6NHXY",
    "status": "accepted",
    "can_accept": false,
    "has_awb": true,
    "total": {
        "amount": 359800,
        "currency": "RON"
    },
    "refunded": {
        "amount": 0,
        "currency": "RON"
    },
    "items": [
        {
            "id": 1123,
            "product_id": 237224,
            "external_id": "ERP-1001",
            "sku": "MTB-29-001",
            "title": "Bicicleta MTB Hardtail 29 inch",
            "quantity": 2,
            "quantity_ordered": 2,
            "quantity_short": 0,
            "unit_price": {
                "amount": 179900,
                "currency": "RON"
            },
            "total_price": {
                "amount": 359800,
                "currency": "RON"
            }
        }
    ],
    "awb": {
        "number": "SBX0000000711",
        "tracking_url": "https://sandbox-api.biklo.com/track/SBX0000000711"
    },
    "is_dropshipping": false,
    "created_at": "2026-09-11T09:20:14Z",
    "updated_at": "2026-09-11T10:02:47Z",
    "accepted_at": "2026-09-11T10:02:47Z",
    "delivered_at": null,
    "expires_at": "2026-09-13T09:20:14Z",
    "notes_from_buyer": "Please call before delivery.",
    "courier_id": 1,
    "seller_invoice": null,
    "fees": {
        "platform_fee": 17990,
        "shipping": 2500,
        "currency": "RON"
    },
    "delivery": {
        "recipient": "John Doe",
        "phone": "07xxxxxxxx",
        "city": "Craiova",
        "county": "Dolj",
        "postcode": "200000",
        "country": "RO",
        "is_locker": false
    },
    "refunds": [],
    "parcels": [
        {
            "id": 4012,
            "sequence_no": 1,
            "weight_kg": 2.4,
            "length_cm": 40,
            "width_cm": 30,
            "height_cm": 20,
            "is_seller_declared": true,
            "items": [
                {
                    "order_item_id": 1123,
                    "quantity": 2
                }
            ]
        }
    ]
}

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" \
  -H "Authorization: Bearer bk_test_YOUR_KEY"
<?php

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

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");

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",
    headers={"Authorization": "Bearer bk_test_YOUR_KEY"},
)

data = response.json()
const response = await fetch("https://sandbox-api.biklo.com/v1/orders/711", {
  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"))
    .header("Authorization", "Bearer bk_test_YOUR_KEY")
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();

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