Sandbox and production
| Sandbox | Production | |
|---|---|---|
| Base URL | https://sandbox-api.biklo.com |
https://api.biklo.com |
| Keys | bk_test_… |
bk_live_… |
| Data | Real categories, fields and geo. No real buyers or orders. | Live marketplace |
| Couriers | Simulated — fake AWBs and labels | Real carriers |
| Invoices | Simulated, stamped "NOT A FISCAL DOCUMENT" | Real fiscal documents |
| Money | None moves | Real |
The sandbox carries the same categories, attributes, geo and courier configuration as production, because a mapping is what integration time is spent on and mapping against invented data teaches you nothing.
Getting data to work with#
The sandbox has no buyers, so orders are fabricated on demand:
# create a test order against one of your own products
curl -X POST https://sandbox-api.biklo.com/v1/sandbox/orders \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"external_id": "ERP-1001", "quantity": 2}'
# then walk it through the lifecycle without waiting on a courier
curl -X POST https://sandbox-api.biklo.com/v1/sandbox/orders/711/advance \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"status": "delivered"}'
Both routes do not exist in production — they return 404 there, which is
deliberate: fabricating an order against a real marketplace must not be possible.
Going live#
Change two things: the base URL, and the key. Nothing else in your code should need to move — that is the point of the sandbox being the same application.
Before you switch, confirm you handle 429 with Retry-After, that you verify webhook
signatures, and that you send an Idempotency-Key on writes.
