Biklo for developersTESTsandbox-api.biklo.comchange

List your customers

GET/v1/customers

scope customers.read

Everyone who has ordered from you, keyed on the buyer rather than the order, with the billing details from their most recent order. This is what POST /v1/orders/{id}/invoice never gave you: the order payload carries a delivery block because a courier needs a city and a postcode, and an invoice needs a street — and, for a business buyer, a company name and a VAT number. You only ever see buyers you have actually sold to.

Query parameters#

NameExample
updated_since—ISO 8601. A customer counts as changed when any of their orders did — a status moving to delivered is usually what makes you want to invoice.
q—Match on name or email.
limit50Max 100
cursor—next_cursor from the previous page

Response#

FieldTypeDescription
countintegerCustomers on this page.
next_cursorinteger|nullPass as cursor for the next page. null on the last one.
dataarrayThe customers.
data[].idintegerThe buyer id. Stable — use it to keep one customer record across orders.
data[].namestringThe buyer's account name.
data[].emailstringTheir account email.
data[].phonestring|nullTheir account phone.
data[].orders_countintegerHow many orders they have placed WITH YOU.
data[].first_order_atstringISO-8601 UTC of their first order with you.
data[].last_order_atstringISO-8601 UTC of their most recent. The billing block below comes from that order.
data[].billingobject|nullThe address to invoice at. null when the order carries no address — old orders and a handful of edge cases.
data[].billing.address_linestring|nullStreet and number. null when the buyer has since deleted the address the order pointed at — see is_live. Everything else in this block still stands, because it was snapshotted at checkout.
data[].billing.citystringSnapshotted at checkout. This is the city the parcel was actually sent to.
data[].billing.countystringCounty, judet or equivalent. Snapshotted at checkout.
data[].billing.postal_codestring|nullSnapshotted at checkout, falling back to the address record for the few orders carrying none.
data[].billing.country_codestringISO 3166-1 alpha-2, e.g. RO.
data[].billing.countrystring|nullThe country name in Romanian, for printing. null alongside a null address_line.
data[].billing.is_companybooleanThe buyer ordered as a BUSINESS and must be invoiced as one — in Romania that means the invoice carries the company name and CUI, not the person's. Branch on this rather than on whether company happens to be populated.
data[].billing.companyobject|nullThe company to invoice, or null for a private buyer.
data[].billing.company.namestringRegistered company name.
data[].billing.company.vat_codestring|nullVAT number — the Romanian CUI/CIF, e.g. RO12345678.
data[].billing.company.registration_nostring|nullTrade register number, e.g. J16/123/2020.
data[].billing.is_livebooleanREAD THIS ONE. true means address_line was read from an address the buyer still controls and can edit, so it is their CURRENT street, not necessarily the one at the time of sale. Only the city, county, postcode and country are frozen. If your invoices must be reproducible, store the block when you issue the invoice rather than re-fetching it later. false means the address was deleted and address_line is null.
data[].billing.delivered_to_lockerbooleanThe parcel went to a locker. The address here is still the buyer's own — this is a delivery detail, not a billing one.

Example

{
    "count": 1,
    "next_cursor": 98853,
    "data": [
        {
            "id": 9000001,
            "name": "John Doe",
            "email": "[email protected]",
            "phone": "+40700000000",
            "orders_count": 3,
            "first_order_at": "2026-03-02T11:40:19Z",
            "last_order_at": "2026-09-08T14:08:52Z",
            "billing": {
                "address_line": "Str. Exemplu 12",
                "city": "Brasov",
                "county": "Brasov",
                "postal_code": "500002",
                "country_code": "RO",
                "country": "România",
                "is_company": true,
                "company": {
                    "name": "Example Bike Shop SRL",
                    "vat_code": "RO12345678",
                    "registration_no": "J16/123/2020"
                },
                "is_live": true,
                "delivered_to_locker": false
            }
        }
    ]
}

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/customers?limit=50" \
  -H "Authorization: Bearer bk_test_YOUR_KEY"
<?php

$ch = curl_init('https://sandbox-api.biklo.com/v1/customers?limit=50');

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/customers?limit=50");

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

response = requests.get(
    "https://sandbox-api.biklo.com/v1/customers?limit=50",
    headers={"Authorization": "Bearer bk_test_YOUR_KEY"},
)

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

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