Cadmus collects intra-oral scan orders from IOS portals and exposes them through a single, normalised REST API. This guide walks you through authentication, retrieving orders, and downloading scan files.
All endpoints are relative to the base URL for your environment. Use HTTPS in all environments.
https://api.staging.cadmuslabs.nl
Shared sandbox environment. Requires a valid user account.
https://api.cadmuslabs.nl
Live environment. Requires a valid user account.
https://api.cadmuslabs.nl as the base URL.
Replace it with https://api.staging.cadmuslabs.nl when working against the staging environment.
Every API call requires a JSON Web Token (JWT). Obtain one by posting your credentials
to /auth/login. The token is valid for 8 hours.
https://api.cadmuslabs.nl/auth/login
{
"email": "you@example.com",
"password": "your-password"
}
curl -s -X POST https://api.cadmuslabs.nl/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com","password":"your-password"}'
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expiresAt": "2026-03-09T18:30:00Z"
}
Copy the token value. You will pass it as
Authorization: Bearer <token> on every subsequent request.
Orders are exposed through the /unified-cases resource. Every order is mapped to a single consistent schema — scan files, dentist, worktypes, and patient data always appear in the same place regardless of which IOS portal the order came from.
https://api.cadmuslabs.nl/unified-cases
curl -s https://api.cadmuslabs.nl/unified-cases \
-H "Authorization: Bearer <token>"
{
"items": [
{
"guid": "16ad2e12-fb26-4931-ba16-321285d74550",
"organizationGuid": "8f3d2c1a-9b4e-4f7d-b2e8-1a5c6d7e8f90",
"status": "new",
"acceptedData": {
"uid": "16ad2e12-fb26-4931-ba16-321285d74550",
"source": "DSCore",
"externalId": "abc-123",
"receivedDate": "2026-03-08T09:14:00Z",
"deliveryDate": "2026-03-10",
"sentTo": "Cadmus Lab",
"customer": {
"clinic": { "name": "SmileCo Dental", "city": "Amsterdam" },
"dentist": { "fullName": "Dr. A. Smith" }
},
"patient": { "fullName": "J. Doe", "referenceNo": "P-001" },
"remark": "",
"scanFiles": [
{ "type": "preparationScan", "filename": "upper.stl", "jaw": "upper", "fileType": "stl", "fileLink": "gs://..." }
],
"worktypes": [
{ "categoryId": "Fixed", "restorationTypeId": "Crown", "materialId": "Zirconia", "fdi": "16", "jaw": "Upper" }
],
"administrative": { "priority": false, "remake": false, "contactRequired": false, "additionalInfo": false }
}
}
],
"page": 1,
"pageSize": 20,
"total": 183
}
Supported query parameters: page, pageSize,
from (YYYY-MM-DD), to (YYYY-MM-DD),
status (new | accepted).
All files (scan files and the order form PDF) are stored in cloud object storage
(Google Cloud Storage) — they are not served directly from the
database. The fileLink fields in acceptedData are internal
storage paths, not public URLs.
Request a pre-authenticated signed URL from the API. Signed URLs are valid for 15 minutes and can be used directly in a browser, a 3D viewer, or a download client — no extra headers needed.
upper.stlstl, ply, previewupper, lower, nonepreparationScan, biteScan, prePreparationScan, abutmentScan, dentureScanhttps://api.cadmuslabs.nl/unified-cases/{guid}/files/{filename}?fileType=stl
curl -s "https://api.cadmuslabs.nl/unified-cases/16ad2e12-fb26-4931-ba16-321285d74550/files/upper.stl?fileType=stl" \
-H "Authorization: Bearer <token>"
{
"url": "https://storage.googleapis.com/cadmus_collector_bucket/...&X-Goog-Signature=...",
"filename": "upper.stl",
"fileType": "stl",
"expiresAt": "2026-03-09T10:45:00Z"
}
The order form is a single PDF attached to the case
(acceptedData.orderForm). Use the dedicated endpoint to get a signed URL
for it — no fileType parameter needed.
https://api.cadmuslabs.nl/unified-cases/{guid}/order-form
curl -s "https://api.cadmuslabs.nl/unified-cases/16ad2e12-fb26-4931-ba16-321285d74550/order-form" \
-H "Authorization: Bearer <token>"
{
"url": "https://storage.googleapis.com/cadmus_collector_bucket/...&X-Goog-Signature=...",
"filename": "DS Core_orderform.pdf",
"expiresAt": "2026-03-09T10:45:00Z"
}
Miscellaneous files are additional non-scan attachments —
photos, X-rays, shade or margin-line images, implant reports, and similar
supporting files (acceptedData.miscellaneousFiles). Match by the
filename at the end of the path, same as scan files.
https://api.cadmuslabs.nl/unified-cases/{guid}/miscellaneous-files/{filename}
curl -s "https://api.cadmuslabs.nl/unified-cases/16ad2e12-fb26-4931-ba16-321285d74550/miscellaneous-files/Measurement%201.png" \
-H "Authorization: Bearer <token>"
{
"url": "https://storage.googleapis.com/cadmus_collector_bucket/...&X-Goog-Signature=...",
"filename": "Measurement 1.png",
"expiresAt": "2026-03-09T10:45:00Z"
}
Pass the url directly to a PDF viewer or trigger a download.
Request a fresh URL if the link has expired.
Use these endpoints to resolve portals to human-readable names.
/portals/ios
All active IOS portal types. Returns id, name, className, url, axisMaping, quantizationBits.
/portals/configured
Configured portal connections for your organisation. Returns guid, organizationGuid, iosPortalId, displayName, username, region, lastFetch, portalName.
Each case has top-level fields guid (case identifier), organizationGuid,
and status (new | accepted).
The acceptedData object contains the normalised case fields below.
Fields may be null or absent when not provided by the originating portal.
Dental | OrthodonticsDSCore, MyiTero)new | acceptedM or F"" if none)
Each item in worktypes[] describes a single clinical work item.
The units[] array within a worktype lists individual tooth-level units
that share the same field set (minus jaw, from, to).
Fixed | Removable | Appliance | OrthodonticsCrown, Bridge, Aligners)Full, Partial, Veneer)Zirconia, PMMA, Acrylic)Monolithic, Layered)Upper | Lower | Both | Nonetype, value)jaw, from, toDSCore_orderform.pdf)GET /unified-cases/{guid}/order-form for a 15-min signed URLnull)GET /unified-cases/{guid}/miscellaneous-files/{filename} for a 15-min signed URL. Omitted when the case has none.
Valid string values for typed fields. Worktype fields marked
Dental apply when
categoryId is Fixed, Removable, or Appliance.
Orthodontics applies when
categoryId is Orthodontics.
CommunicatePortalMyiTeroDSCore
MeditLinkCSConnectDexisISConnect
Shining3DDentalCloudFreqtyCloud
StraumannAXSAiditeRunyes
FixedRemovableApplianceOrthodontics
UpperLowerBothNone
CrownBridgeImplantCrownImplantBridge
DentureImplantDentureWireRetainerClearOverlay
SplintBleachingTrayMouthguardSurgicalGuide
AlignersMandibularRepositioningApplianceModel
ImpressionTrayBiteRegistrationWaxUp
OrthodonticApplianceNone
ActivatorAlignersBleachingTray
ExpansionPlateFixedApplianceIndirectBondingTray
ModelMouthguardMandibularRepositioningAppliance
RetentionPlateSplintSurgicalGuide
OrthodonticInvisibleRetainerWireRetainer
BiteRegistrationNone
FullPartialVeneerTemporary
TelescopePostPonticNone
BionatorDucovatorEVAAFrankel
HalfOpenActivatorLRMMonoBlock
NewTApplianceOpenActivatorTAppliance
TwinBlockUApplianceVanBeek
BertoniPlateDistalizerMesializerHerbst
HerbstRPERMELLATPAMARPENance
RPERMEBandedRPERMEBondedRPERMEHybrid
SpaceMaintainerQuadHelixStudyModel
WorkModelVirtualModelDamonSplintNone
ZirconiaLithiumDisilicatePMMA
CompositeFeldspathicMetalFlexible
PEEKThermoformAcrylicDigitalNone
DigitalMetalPEEKNone
MonolithicLayeredHardSoft
HardSoftNone
The interactive API reference lets you authenticate and call every endpoint directly in the browser. The OpenAPI JSON spec can be imported into Postman, Insomnia, or any compatible tooling.