For: developers.
PlannedAuthorization
Your app signs the customer in with their Atlas account. There is no separate activation code and no key in the client.
01 Your app opens https://<partner>.atlasbiolabs.com/authorize?client_id=<partner>&redirect_uri=<your-uri>&state=<random> in a browser or web view.
02 The customer signs in with their email and a six-digit code, as described under Sign-in.
03 Atlas redirects back to your URI with ?code=<one-time>&state=<yours>.
04 Your backend exchanges the code at POST https://api.atlasbiolabs.com/v1/partner/token for an access token.
05 Your backend reads the customer and their entitlements.
GET https://api.atlasbiolabs.com/v1/partner/me
Authorization: Bearer <access token -- server-side only>
{
"atlas_user_id": "usr_...",
"entitlements": [
{ "product": "cooperation_kit", "order_ref": "ON-...",
"starts_at": "2026-10-01", "ends_at": "2027-09-30" }
]
}
Entitlements are per kit, not per account. A customer who has bought other Atlas products has no entitlement here. The twelve-month term runs from the kit, not from when the customer opens your app.
Read results as JSON
Once the embedded surface is live in your app, you can move to native screens at your own pace. Atlas will expose a read endpoint, called from your backend only, returning the same content as structured JSON. Interpretation text comes from Atlas; layout is yours.
GET https://api.atlasbiolabs.com/v1/partner/results/{order_ref}
Authorization: Bearer <partner key — server-side only>
{
"schema_version": "1.0",
"order_ref": "ON-…",
"layers": [
{ "id": "biology_age", "status": "ready",
"items": [
{ "id": "epigenetic_age", "title": "Biological age", "value": 34.2, "unit": "years", "band": "younger_than_chronological", "text": "…" },
{ "id": "pace", "title": "Pace of ageing", "value": 0.91, "band": "slower", "text": "…" } ] },
{ "id": "genetic_profile", "status": "physician_release_pending" },
{ "id": "blood_markers", "status": "not_ordered" }
],
"disclaimers": [ "…" ]
}
schema_version is fixed per major version. Atlas adds fields without breaking existing ones and announces removals in the changelog at least ninety days ahead.