Labs
The Labs API manages the full lifecycle of dental lab work — from order creation through production tracking to quality control sign-off. Dentists create lab orders, labs receive and fulfill them, and quality checks are logged at each stage.
The Lab Order Object
| Field | Type | Description |
|---|---|---|
| id | string | Unique order ID (lab_*) |
| order_number | string | Human-readable order number |
| patient_id | string | Patient ID (pat_*) |
| dentist_id | string | Ordering dentist ID (usr_*) |
| lab_id | string | Lab ID (org_*) |
| product_type | enum | crown, bridge, denture, implant, aligner, night_guard, other |
| status | enum | pending, accepted, in_production, quality_check, shipped, delivered, rejected |
| teeth | array | FDI tooth numbers involved (e.g., [16, 17]) |
| material | string | Material specification (e.g., zirconia, PFM) |
| shade | string | Shade/mold specification (e.g., A2) |
| due_date | string | ISO 8601 date — lab delivery deadline |
| instructions | string | Special instructions from the dentist |
| created_at | string | ISO 8601 timestamp (UTC) |
/labs/ordersList lab orders
Returns a paginated list of lab orders. Filter by status, lab, dentist, or patient.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | string | Optional | Filter by status: pending, accepted, in_production, quality_check, shipped, delivered |
| lab_id | string | Optional | Filter by lab ID |
| dentist_id | string | Optional | Filter by ordering dentist |
| patient_id | string | Optional | Filter by patient |
| limit | integer | Optional | Results per page (1-100). Default: 20 |
| cursor | string | Optional | Pagination cursor |
Example Request
curl -X GET "https://api.odento.app/api/v1/labs/orders?status=in_production&limit=10" \
-H "X-API-Key-ID: ok_live_abc123def456ghi789jkl012" \
-H "X-API-Key-Secret: os_abc123def456ghi789jkl012mno345pqr678stu901vwx234yzab567"Example Response
{
"success": true,
"data": {
"items": [
{
"id": "lab_9c2d4e7f1a3b6c8d",
"order_number": "LAB-2025-0156",
"patient_id": "pat_5f8d3a2b1c9e4a7b",
"dentist_id": "usr_abc123",
"lab_id": "org_xyz789",
"product_type": "crown",
"status": "in_production",
"teeth": [16],
"material": "zirconia",
"shade": "A2",
"due_date": "2025-01-28",
"instructions": "Full contour zirconia crown. Margin on gingiva.",
"created_at": "2025-01-15T10:00:00Z"
}
],
"pagination": {
"has_more": false,
"next_cursor": null,
"per_page": 10
}
}
}Try It Out
/labs/ordersCreate a lab order
Creates a new lab order. The specified lab receives a notification and can accept or reject the order. Digital impressions or physical impressions can be attached via the media API.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| patient_id | string | Required | Patient ID (pat_*) |
| lab_id | string | Required | Lab ID (org_*) |
| product_type | string | Required | Product type: crown, bridge, denture, implant, aligner, night_guard, other |
| teeth | array | Required | FDI tooth numbers involved |
| material | string | Optional | Material specification |
| shade | string | Optional | Shade specification (e.g., A2, B1) |
| due_date | string | Required | Delivery deadline (YYYY-MM-DD) |
| instructions | string | Optional | Special instructions for the lab |
| impression_media_ids | array | Optional | Media IDs of digital impressions |
Example Request
curl -X POST https://api.odento.app/api/v1/labs/orders \
-H "X-API-Key-ID: ok_live_abc123def456ghi789jkl012" \
-H "X-API-Key-Secret: os_abc123def456ghi789jkl012mno345pqr678stu901vwx234yzab567" \
-H "Content-Type: application/json" \
-d '{
"patient_id": "pat_5f8d3a2b1c9e4a7b",
"lab_id": "org_xyz789",
"product_type": "crown",
"teeth": [16],
"material": "zirconia",
"shade": "A2",
"due_date": "2025-01-28",
"instructions": "Full contour zirconia crown. Margin on gingiva.",
"impression_media_ids": ["med_imp_abc123"]
}'Example Response
{
"success": true,
"data": {
"id": "lab_9c2d4e7f1a3b6c8d",
"order_number": "LAB-2025-0156",
"patient_id": "pat_5f8d3a2b1c9e4a7b",
"dentist_id": "usr_abc123",
"lab_id": "org_xyz789",
"product_type": "crown",
"status": "pending",
"teeth": [16],
"material": "zirconia",
"shade": "A2",
"due_date": "2025-01-28",
"instructions": "Full contour zirconia crown. Margin on gingiva.",
"created_at": "2025-01-15T10:00:00Z"
}
}/labs/orders/{id}Retrieve a lab order
Retrieves a single lab order by ID, including production timeline and quality control records.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | The lab order ID (lab_*) |
Example Request
curl -X GET https://api.odento.app/api/v1/labs/orders/lab_9c2d4e7f1a3b6c8d \
-H "X-API-Key-ID: ok_live_abc123def456ghi789jkl012" \
-H "X-API-Key-Secret: os_abc123def456ghi789jkl012mno345pqr678stu901vwx234yzab567"Example Response
{
"success": true,
"data": {
"id": "lab_9c2d4e7f1a3b6c8d",
"order_number": "LAB-2025-0156",
"patient_id": "pat_5f8d3a2b1c9e4a7b",
"dentist_id": "usr_abc123",
"lab_id": "org_xyz789",
"product_type": "crown",
"status": "in_production",
"teeth": [16],
"material": "zirconia",
"shade": "A2",
"due_date": "2025-01-28",
"instructions": "Full contour zirconia crown. Margin on gingiva.",
"production": {
"stages": [
{ "name": "model_preparation", "status": "completed", "completed_at": "2025-01-16T10:00:00Z" },
{ "name": "cad_design", "status": "completed", "completed_at": "2025-01-18T14:00:00Z" },
{ "name": "milling", "status": "in_progress", "started_at": "2025-01-19T09:00:00Z" },
{ "name": "sintering", "status": "pending" },
{ "name": "finishing", "status": "pending" }
]
},
"quality_checks": [],
"created_at": "2025-01-15T10:00:00Z"
}
}/labs/orders/{id}/productionUpdate production status
Updates the production stage of a lab order. Each stage transition is logged with a timestamp for full traceability. Only lab staff associated with the order can update production status.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | The lab order ID (lab_*) |
| stage | string | Required | Production stage: model_preparation, cad_design, milling, sintering, finishing, quality_check |
| status | string | Required | Stage status: started, completed, failed |
| notes | string | Optional | Production notes |
Example Request
curl -X POST https://api.odento.app/api/v1/labs/orders/lab_9c2d4e7f1a3b6c8d/production \
-H "X-API-Key-ID: ok_live_abc123def456ghi789jkl012" \
-H "X-API-Key-Secret: os_abc123def456ghi789jkl012mno345pqr678stu901vwx234yzab567" \
-H "Content-Type: application/json" \
-d '{
"stage": "milling",
"status": "completed",
"notes": "Milling completed on 5-axis machine. No anomalies detected."
}'Example Response
{
"success": true,
"data": {
"id": "lab_9c2d4e7f1a3b6c8d",
"stage": "milling",
"status": "completed",
"completed_at": "2025-01-20T16:30:00Z",
"notes": "Milling completed on 5-axis machine. No anomalies detected."
}
}/labs/orders/{id}/quality-checkRecord quality control check
Records a quality control (QC) check for a lab order. QC checks can pass or fail. A failed check requires a reason and triggers rework. Multiple QC checks can be recorded per order.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | The lab order ID (lab_*) |
| result | string | Required | QC result: pass or fail |
| check_type | string | Required | Type of check: fit, shade_match, occlusion, margin, aesthetics, final_inspection |
| inspector_id | string | Required | QC inspector user ID (usr_*) |
| notes | string | Optional | QC notes |
| failure_reason | string | Optional | Required if result is fail |
Example Request
curl -X POST https://api.odento.app/api/v1/labs/orders/lab_9c2d4e7f1a3b6c8d/quality-check \
-H "X-API-Key-ID: ok_live_abc123def456ghi789jkl012" \
-H "X-API-Key-Secret: os_abc123def456ghi789jkl012mno345pqr678stu901vwx234yzab567" \
-H "Content-Type: application/json" \
-d '{
"result": "pass",
"check_type": "final_inspection",
"inspector_id": "usr_qc456",
"notes": "Crown meets all specifications. Shade match confirmed against A2 tab."
}'Example Response
{
"success": true,
"data": {
"id": "qc_abc123def456",
"order_id": "lab_9c2d4e7f1a3b6c8d",
"result": "pass",
"check_type": "final_inspection",
"inspector_id": "usr_qc456",
"notes": "Crown meets all specifications. Shade match confirmed against A2 tab.",
"checked_at": "2025-01-24T11:00:00Z"
}
}/labs/orders/{id}/shipShip a lab order
Marks a lab order as shipped. Requires at least one passing final_inspection QC check. Includes tracking information for the dentist to monitor delivery.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | The lab order ID (lab_*) |
| carrier | string | Optional | Shipping carrier (e.g., Blue Dart, DTDC) |
| tracking_number | string | Optional | Tracking number |
Example Request
curl -X POST https://api.odento.app/api/v1/labs/orders/lab_9c2d4e7f1a3b6c8d/ship \
-H "X-API-Key-ID: ok_live_abc123def456ghi789jkl012" \
-H "X-API-Key-Secret: os_abc123def456ghi789jkl012mno345pqr678stu901vwx234yzab567" \
-H "Content-Type: application/json" \
-d '{
"carrier": "Blue Dart",
"tracking_number": "BD1234567890"
}'Example Response
{
"success": true,
"data": {
"id": "lab_9c2d4e7f1a3b6c8d",
"status": "shipped",
"shipped_at": "2025-01-25T15:00:00Z",
"carrier": "Blue Dart",
"tracking_number": "BD1234567890"
}
}Was this page helpful?
Help us improve our documentation