<aside> ✨
What's New
Stay up-to-date with the latest features and improvements to our platform.
</aside>
No external API changes in this release. This version includes internal engineering improvements only.
POST /api/orders, POST /api/orders/activate, and DELETE /api/orders/{id} are unchanged.POST /api/registrations or POST /api/orders/registration request/response contracts.List Samples for a Kit
Endpoint: GET /api/kits/{id}/samples
Returns all samples associated with a kit. Scoped to your application's practice.
Response 200:
{
"object": "list",
"data": [
{
"id": "smp_1a2b3c4d5e6f...",
"object": "sample",
"status": "Completed",
"arrayType": "EPICv2Custom",
"beadchipId": "207134830027_R01C01",
"kit": "kit_a1b2c3d4e5f6...",
"createdAt": "2026-02-10T14:23:00Z"
}
],
"hasMore": false
}
Get Sample
Endpoint: GET /api/samples/{id}
Returns a single sample by its ID. Returns 404 if the sample does not exist or does not belong to your application.
Response 200:
{
"id": "smp_1a2b3c4d5e6f...",
"object": "sample",
"status": "Completed",
"arrayType": "EPICv2Custom",
"beadchipId": "207134830027_R01C01",
"kit": "kit_a1b2c3d4e5f6...",
"createdAt": "2026-02-10T14:23:00Z"
}
Sample field reference:
id — unique identifier for this samplestatus — current lab status (see values below)arrayType — diagnostic array technology used to process this sample (see values below)beadchipId — beadchip position assigned when the sample reaches the analysis stage (e.g. 207134830027_R01C01). null until that point.kit — ID of the kit this sample belongs tocreatedAt — UTC timestamp when the sample was createdSample status values:
NotAvailable — sample has not yet been createdReceived — sample received at the labExtractDna — DNA extraction in progressSubmitted — submitted for analysisDnaQuantification — DNA quantification underwayAnalysisRequested — analysis has been requestedBisulfiteConversion — bisulfite conversion underway (epigenetic products)DiagnosticFilesReceived — diagnostic data files receivedLabFailed — sample failed due to a lab-side issue; reprocessing or a kit replacement may followAnalysisFailed — analysis step failedAnalysisQcFailed — sample did not pass quality controlCompleted — sample processing is completearrayType values:
EPICv2Custom — Illumina EPIC v2 (TruDiagnostic custom configuration)EPICv2Regular — Illumina EPIC v2 (standard)EPICv1 — Illumina EPIC v1MSARegular — Illumina MSA (standard)MSACustom — Illumina MSA (custom)GSAv3 — Illumina GSA v3GSAv4 — Illumina GSA v4TruDx — TruDx arrayPGx — Pharmacogenomics arrayEnlighten — Enlighten arrayImprintome — Imprintome arrayXTRACoRSIV — XTRACoRSIV arraysamples field (an array of sample IDs). Call GET /api/kits/{id} first to retrieve the IDs, then use GET /api/samples/{id} to fetch individual sample details.List Available Material Units
Endpoint: GET /api/materialunits
Returns a paginated list of material units that have not yet been activated. Scoped to your application's practice.
Query parameters:
page (integer, default: 0) — page offsetlimit (integer, 1–100, default: 10) — results per pageResponse 200:
{
"object": "list",
"data": [
{
"id": "mu_a1b2c3d4e5f6...",
"object": "material_unit",
"barcode": "BARCODEABC123",
"order": "ord_a1b2c3d4e5f6...",
"sku": "sku_a1b2c3d4e5f6...",
"status": "available",
"createdAt": "2024-08-14T10:00:00Z",
"activatedAt": null
}
],
"hasMore": false
}
Material unit status values:
available — not yet activatedactivated — has been activated against a kitGet Material Unit
Endpoint: GET /api/materialunits/{id}
Returns a single material unit by its ID. Returns 404 if the material unit does not exist or does not belong to your application.
Response 200:
{
"id": "mu_a1b2c3d4e5f6...",
"object": "material_unit",
"barcode": "BARCODEABC123",
"order": "ord_a1b2c3d4e5f6...",
"sku": "sku_a1b2c3d4e5f6...",
"status": "available",
"createdAt": "2024-08-14T10:00:00Z",
"activatedAt": null
}
Create Order with Service Activation
Endpoint: POST /api/orders/activate
Places an order that activates one or more material units against their assigned products. Use this when you've pre-purchased services and need to activate them against specific material unit barcodes.
Request body:
{
"items": [
{
"productId": "42",
"materialUnitBarcode": "BARCODEABC123"
}
]
}
productId accepts a numeric ID, SKU name, or SKU uid. materialUnitBarcode must match an available material unit barcode in your practice. Returns an order object on success (200). Returns 400 for validation errors or 409 for conflicts (e.g., barcode already activated).
Order object — totalAmount and new discountAmount field
Affected endpoints: All endpoints returning an order object (GET /api/orders/{id}, GET /api/orders, etc.)
totalAmount now reflects the discount-adjusted amount — the discount is subtracted before this value is computed. A new discountAmount field has been added that exposes the discount applied to the order.
Before (v.1.46.x):
{
"totalAmount": 235.00
}
After (v.1.47.x):
{
"totalAmount": 225.00,
"discountAmount": 10.00
}
discountAmount is 0.00 when no discount was applied.
New kit.replacement.* event family
Three new webhook events are available for subscribing to the kit replacement lifecycle:
| --- | --- |
All three share the same kit_replacement payload shape: