Creating Orders
You place an order when a customer buys on your webshop. GlycanAge drop-ships the kit to them and invoices you the wholesale amount — no end-customer billing details are involved, and your customer never pays us.
1. Look up the catalogue
Product variation IDs are stable, but fetch them rather than hard-coding so new products appear without a deploy:
GET /products
Authorization: Basic {base64(":" + token)}
{
"data": [
{
"variation_id": "3f9a2b1c-...",
"product": "GlycanAge Test",
"variation": "Single kit",
"price": 12900,
"currency": "GBP",
"kits": 1,
"requires_shipping": true
}
]
}
priceis your wholesale price in minor units (12900 = £129.00), in your account currency.kitsis how many physical kits the customer receives. A kit bundled with an interpretation still counts as one; a pure add-on such as a standalone consultation reports0.- Subscription products are not orderable through this API and are not listed.
2. Place the order
POST /orders
Content-Type: application/json
{
"email": "customer@example.com",
"reference": "SHOP-10231",
"customerName": "Jane Doe",
"items": [
{ "variation_id": "3f9a2b1c-...", "quantity": 1 }
],
"shipping": {
"country": "GB",
"city": "London",
"address": "10 Downing Street",
"zip": "SW1A 2AA",
"state": null,
"phone": "+44 20 7925 0918"
}
}
{
"id": "4f3c2a4e-1d2b-4f6a-9c8e-2b1a3c4d5e6f",
"reference": "SHOP-10231",
"status": "Paid",
"amount": 12900,
"currency": "GBP",
"created_on": "2026-07-06T09:20:31.402Z"
}
Required: email, items, and shipping with country, city, address and zip. country must be an ISO 3166-1 alpha-2 code. Quantities are integers from 1 to 1000.
reference is your own order identifier. It is echoed back on orders, kits, reports and every webhook, so it is the simplest way to tie our records to yours — set it.
status is already PaidPaid means the order has entered fulfilment, not that money moved. You are billed by invoice, so the order goes straight into the warehouse queue rather than waiting on a payment.
3. Track fulfilment
Poll, or better, subscribe to webhooks.
Per order:
GET /orders?cursor=&limit=50
GET /orders/{id}
{
"id": "4f3c2a4e-...",
"reference": "SHOP-10231",
"status": "Paid",
"currency": "GBP",
"amount": 12900,
"shipped": true,
"shipped_on": "2026-07-07T11:02:00.000Z",
"registered": true,
"results_ready": false,
"created_on": "2026-07-06T09:20:31.402Z",
"items": [{ "variation_id": "3f9a2b1c-...", "quantity": 1 }]
}
registered— at least one kit on the order has been claimed by the customer via QR.results_ready— at least one report has been released.
Per kit, which is finer-grained and usually what you want to show a customer:
GET /units?order_id={id}
GET /units/kit/{kitCode}
{
"kit_code": "GA-AB-123456",
"order_id": "4f3c2a4e-...",
"reference": "SHOP-10231",
"status": "Shipped",
"shipped": true,
"shipped_on": "2026-07-07T11:02:00.000Z",
"date_of_sampling": null,
"tracking_code": "TRK123456",
"tracking_link": "https://tracking.example.com/TRK123456",
"registered": false,
"results_ready": false,
"created_on": "2026-07-06T09:20:31.402Z"
}
status moves through: In stock → Shipped → Awaiting analysis → In analysis → Results released, with Cancelled and Missing info as exceptions.
4. Registration is the customer's job
We ship the kit with a QR code. The customer scans it and enters their date of birth, gender, ethnicity and sampling date on a GlycanAge page. There is no account and no dashboard for them, and no API call for you to make — you cannot register a kit on their behalf.
Until a kit is registered it cannot be analysed, so if registered stays false for a long time, that is your cue to nudge the customer.
5. Retrieve the result
GET /reports?cursor=&limit=50
GET /reports/{result_id}
GET /reports/kit/{kitCode}
Returns the full result as JSON, including the headline figures and every glycan-peak column:
{
"id": "8c1e...",
"kit_code": "GA-AB-123456",
"order_id": "4f3c2a4e-...",
"reference": "SHOP-10231",
"glycan_age": 48,
"chronological_age": 44,
"gender": "F",
"ethnicity": "White - Any other White background",
"date_of_birth": "1982-03-14",
"date_of_sampling": "2026-07-12",
"created_on": "2026-07-20T08:11:04.221Z"
}
For the rendered PDF report instead, ask for it with an Accept header on the same endpoint:
curl -u ":$GLYCANAGE_TOKEN" \
-H "Accept: application/pdf" \
-o report.pdf \
https://reseller.api.glycanage.com/reports/kit/GA-AB-123456
Only released results are returned. A kit whose result is not ready yet is simply absent from /reports.
Results are personal health data about your customer. They are shared with you under your data-processing agreement with GlycanAge — handle them accordingly, and do not expose these endpoints directly to a browser.
Billing
You are invoiced for the wholesale amount of each order to your registered billing email. Nothing is charged to your customer by GlycanAge. Sandbox orders are never invoiced.