Creating Orders
When a customer buys on your webshop, you place an order with us. We drop-ship the kit to them and invoice you the wholesale amount. We never see your customer's billing details, and they never pay us anything.
1. Look up the catalogue
Product variation IDs don't change, but it's still worth fetching them instead of hard-coding them, so new products show up without you having to 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 actually receives. A kit bundled with an interpretation still counts as one. A pure add-on, like a standalone consultation, reports0.- Subscription products can't be ordered through this API, so they aren't 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"
}
You must send email, items, and a shipping object with at least country, city, address and zip. country has to be an ISO 3166-1 alpha-2 code, and quantities are whole numbers from 1 to 1000.
reference is your own order identifier. We echo it back on orders, kits, reports and every webhook, which makes it by far the easiest way to match our records to yours. Set it.
status is already PaidPaid means the order has gone into fulfilment, not that money changed hands. Since we bill you by invoice, there's no payment to wait on and the order joins the warehouse queue right away.
3. Track fulfilment
You can poll for this, but subscribing to webhooks is the better option.
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 }]
}
registeredmeans at least one kit on the order has been claimed by the customer via QR.results_readymeans at least one report has been released.
Per kit gives you finer detail, and it's 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. Cancelled and Missing info sit outside that path.
4. Registration is the customer's job
We ship the kit with a QR code on it. The customer scans it and enters their date of birth, gender, ethnicity and sampling date on a GlycanAge page. They don't get an account or a dashboard, and there's no API call for you to make. You can't register a kit on someone's behalf.
A kit can't be analysed until it's registered, so if registered stays false for a long time, that's your cue to nudge the customer.
5. Retrieve the result
GET /reports?cursor=&limit=50
GET /reports/{result_id}
GET /reports/kit/{kitCode}
These return the full result as JSON, with 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"
}
Want 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 come back. A kit whose result isn't ready yet simply won't appear in /reports.
Results are personal health data about your customer. We share them with you under your data-processing agreement with GlycanAge, so handle them accordingly, and don't expose these endpoints directly to a browser.
Billing
We invoice you for the wholesale amount of each order, to your registered billing email. GlycanAge never charges your customer for anything, and sandbox orders are never invoiced.