Skip to main content

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
}
]
}
  • price is your wholesale price in minor units (12900 = £129.00), in your account currency.
  • kits is 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 reports 0.
  • 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.

Why status is already Paid

Paid 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 stockShippedAwaiting analysisIn analysisResults 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.

Result data and your DPA

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.