);
}
```
**scanner.css** — click to expand
scanner.css
```css
.dust-scanner {
display: grid;
gap: 1rem;
max-width: 42rem;
}
.dust-scanner__modes {
display: inline-flex;
width: fit-content;
gap: 0.25rem;
border: 1px solid #d4d4d8;
border-radius: 8px;
padding: 0.25rem;
}
.dust-scanner__modes button {
border: 0;
border-radius: 6px;
background: transparent;
padding: 0.45rem 0.75rem;
cursor: pointer;
}
.dust-scanner__modes button[aria-pressed="true"] {
background: #111827;
color: white;
}
.dust-scanner__dropzone,
.dust-scanner__camera,
.dust-scanner__manual {
border: 1px solid #d4d4d8;
border-radius: 8px;
padding: 1rem;
}
.dust-scanner__dropzone {
display: grid;
gap: 0.75rem;
}
.dust-scanner__camera {
min-height: 320px;
}
.dust-scanner__manual {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.dust-scanner__manual input {
min-width: min(100%, 18rem);
flex: 1;
}
```
# Supported Devices
> iPhone compatibility for DUST Go scan accessories.
Depending on your mobile device, DUST offers scanner accessories that have been evaluated for compatibility with the [DUST Go](/integrate/dust-go/) mobile app. DUST capture always requires one of these optical accessories in addition to the phone camera; QR, barcode, Data Matrix, and NFC scanning work with the device hardware alone.
## Supported iPhone models
[Section titled “Supported iPhone models”](#supported-iphone-models)
The Loupe accessory is compatible with thin MagSafe cases on the following iPhone models.
| | Standard | Mini / Air / e | Plus | Pro | Pro Max |
| --------- | -------- | -------------- | ---- | --- | ------- |
| iPhone 13 | ✓ | ✕ | N/A | ✓ | ✓ |
| iPhone 14 | ✓ | N/A | ✓ | ✓ | ✓ |
| iPhone 15 | ✓ | N/A | ✓ | ✓ | ✓ |
| iPhone 16 | ✓ | N/A | ✓ | ✓ | ✓ |
| iPhone 17 | ✓ | ✕ | N/A | ✓ | ✓ |
✓ Supported with the DUST Identity Loupe accessory · ✕ Not supported · N/A — model not produced
## Baseline expectations
[Section titled “Baseline expectations”](#baseline-expectations)
* Current iPhone hardware supported by the DUST Go release you are deploying.
* A supported DUST optical accessory for scan capture (the Loupe).
* Network access to AuthD and APID (see [Environments](/reference/environments/) for hostnames).
* Camera permissions enabled for the app.
## Other scan types
[Section titled “Other scan types”](#other-scan-types)
QR, barcode, Data Matrix, and NFC scanning in DUST Go use the phone’s built-in camera and NFC reader — no DUST accessory is required for those Identifier types. The accessory matrix above applies only to DUST capture.
## Validation
[Section titled “Validation”](#validation)
Validate the full workflow on the exact device, accessory, lighting, and object surfaces used in production. DUST scan quality depends on the physical setup, not only the API integration.
When testing a web integration, serve your app over HTTPS on a URL the device can reach (a LAN address works for development) and add it as a custom app link in DUST Go — see [Test your integration](/integrate/dust-go-connect/#test-your-integration).
## Related
[Section titled “Related”](#related)
* [DUST Go](/integrate/dust-go/) — the mobile app these accessories pair with.
* [Integrate with DUST Go](/integrate/dust-go-connect/) — add scanning to your own web app.
* [Identifiers and Scanning](/use/identifiers-and-scanning/) — the scanning workflows these devices power.
# API Reference
> The full generated APID reference, live and as a raw OpenAPI spec.
The authoritative API reference is generated by APID and served live. Every endpoint, schema, and error shape documented there comes straight from the running server.
[Interactive reference](https://apid.dustid.io/api/docs)Scalar API reference, served live by APID.
[OpenAPI JSON (live)](https://apid.dustid.io/api/openapi.json)Raw OpenAPI 3 spec served by APID — pipe it into your tool of choice.
[OpenAPI JSON (this site)](/openapi.json)Build-time copy served at /openapi.json — matches the docs you are reading.
## Spec copies
[Section titled “Spec copies”](#spec-copies)
Two copies of the spec are available:
| Source | URL | Freshness |
| --------------- | ----------------------------------------- | ------------------------------------------------------------------- |
| DUST API (live) | `https://apid.dustid.io/api/openapi.json` | Always matches the deployed API. |
| This docs site | `/openapi.json` | Generated when this site is built, from the same source as the API. |
Prefer the live copy when generating clients or validating requests — it always matches the deployed API. The site copy is regenerated with every docs release and is convenient when you are already browsing here.
Tip
The [TypeScript client](/api/typescript-client/) is generated from this same spec, so its types always match what the reference documents.
## Where to start
[Section titled “Where to start”](#where-to-start)
* [Quickstart](/api/quickstart/) — first authenticated request in minutes.
* [Authentication](/api/authentication/) — API keys, token exchange, and context headers.
* [Conventions](/api/conventions/) — pagination, errors, and request context shared by every endpoint.
## Embedded reference
[Section titled “Embedded reference”](#embedded-reference)
[DUST API reference](https://apid.dustid.io/api/docs)
# Environments
> DUST service URLs, API paths, and health endpoints.
DUST runs as three deployed services. Most integrations only need the DUST API; AuthD is reached through the API’s `/api/auth/*` paths.
| Service | URL | Purpose |
| ------------ | ------------------------- | ---------------------------------------------------------- |
| DICE web app | `https://dice4.dustid.io` | First-party web UI for DUST workflows. |
| DUST API | `https://apid.dustid.io` | Core API. Scalar reference at `/api/docs`. |
| AuthD | `https://authd.dustid.io` | Accounts, Organizations, sessions, OIDC, Service Accounts. |
## API paths
[Section titled “API paths”](#api-paths)
The DUST API exposes the platform under these roots:
| Path | Use |
| ------------------- | --------------------------------------------- |
| `/api/auth/token` | Exchange an AuthD API key for a bearer token. |
| `/api/auth/jwks` | Fetch AuthD JWKS through the DUST API. |
| `/api/v1/*` | Core DUST API operations. |
| `/api/openapi.json` | Generated OpenAPI spec served by the API. |
| `/api/docs` | Interactive Scalar reference. |
See the [API Reference](/reference/api/) for the full generated endpoint catalog, and [Conventions](/api/conventions/) for the request context headers every call carries.
## Health endpoints
[Section titled “Health endpoints”](#health-endpoints)
The DUST API serves standard health probes at the server root (not under `/api`):
| Path | Check | Failure behavior |
| ---------- | ------------------------------------------- | ------------------------------------------------------------------ |
| `/livez` | Liveness — the process is up. | Always `200` while the server runs. |
| `/readyz` | Readiness — includes a database round-trip. | `503` if the database check fails or exceeds its 2-second timeout. |
| `/healthz` | Alias for the readiness check. | Same as `/readyz`. |
All three return `{ "status": "ok", "timestamp": "…" }` when healthy; the readiness checks return `{ "status": "error", … }` with a `503` when not. Point uptime monitors at `/readyz` (or `/healthz`).
# Glossary
> Definitions of the user-facing DUST platform vocabulary.
The DUST platform vocabulary, in alphabetical order. Docs prose uses these terms consistently; API endpoint paths and field names sometimes keep older implementation names (noted per term).
### Assembly
[Section titled “Assembly”](#assembly)
A [Thread](#thread) that aggregates other Threads as its attached parts, while remaining a fully first-class Thread itself — with its own name, Fields, Identifiers, and Certificate. An Assembly can be nested inside another Assembly. Every Thread reachable inside an Assembly belongs to the same owning Team.
### Bind
[Section titled “Bind”](#bind)
The act of associating an [Identifier](#identifier) with a [Thread](#thread), performed through the [Identifier endpoints](/api/identifiers/). Once bound, scanning the Identifier resolves back to that Thread.
### Category
[Section titled “Category”](#category)
A cross-cutting grouping that classifies [Threads](#thread). Unlike a [Folder](#folder), a Thread can belong to many Categories at once. Categories can nest under a parent Category (subcategories); membership is direct, not rolled up.
### Certificate
[Section titled “Certificate”](#certificate)
An immutable, point-in-time PDF generated from a [Thread](#thread)’s data and issued by the platform. It is stored as a [Resource](#resource) attached to the Thread, with a record carrying its trust status (issued or voided) and provenance. The Resource checksum is the certificate hash.
### Certificate Form
[Section titled “Certificate Form”](#certificate-form)
A reusable, Team-owned design that defines how a [Certificate](#certificate) is laid out and which [Thread](#thread) data fills it. A Certificate Form locates values by field name (with optional aliases), not by [Template](#template), so it can generate Certificates for owned, shared, and transferred Threads alike.
### Connection
[Section titled “Connection”](#connection)
The standing relationship between two [Teams](#team) in different [Organizations](#organization) — the channel for all cross-team exchange. Sharing and [Shipments](#shipment) are only initiated over a Connection, and its lifecycle (pending, connected, paused, deleted) and direction (send, receive, or both) govern what may flow between the pair. Teams within one Organization collaborate without a Connection.
### Design Version
[Section titled “Design Version”](#design-version)
An immutable, numbered version of a [Public Page Design](#public-page-design) — v1, v2, v3 — frozen when the design is published, and the only thing “version” names in the Public Pages module (a page’s own publications are identified by date, never numbered). Publishing a version does not change any live page; pages move onto it only through a rollout, which is forward-only: a Design Version is never restored, and a bad one is corrected by publishing a newer one.
### Disclosure
[Section titled “Disclosure”](#disclosure)
The explicit act by which a [Thread](#thread) owner makes selected data — Fields, Resources, Identifiers, or Certificates — visible downstream through [Fabric](#fabric). Transferred copies are snapshots: source edits propagate only when the owner explicitly discloses them, and a made disclosure is visible to every downstream consumer on the chain.
### DUST (identifier)
[Section titled “DUST (identifier)”](#dust-identifier)
The physical DUST mark applied to an object, scanned as an image capture and resolved server-side by identifying or verifying it against enrolled Identifiers. A DUST [Identifier](#identifier) represents a physical identity and is never copied between Threads. See [Identifiers and Scanning](/use/identifiers-and-scanning/).
### Fabric
[Section titled “Fabric”](#fabric)
The cross-team provenance graph of the platform. When a [Thread](#thread) is transferred or sliced, Fabric records the resulting links between source and derived Threads, and carries [Disclosures](#disclosure) along them — independent of live sharing or [Connection](#connection) state.
### Field
[Section titled “Field”](#field)
A named, typed value on a [Thread](#thread) — text, numbers, dates, images, and other attributes that describe the item the Thread represents. [Templates](#template) define reusable sets of Fields.
### Folder
[Section titled “Folder”](#folder)
A nestable container that organizes [Threads](#thread) and other Folders. A Thread lives in at most one Folder (single-home — contrast with [Category](#category)). Sharing a Folder cascades access to its contents.
### Identifier
[Section titled “Identifier”](#identifier)
A scannable physical or digital code associated with a [Thread](#thread): DUST, QR, barcode, Data Matrix, or NFC. The user-facing term for what the API calls a tag — endpoint paths and field names keep the legacy naming (`/api/v1/tags`, `tagType`). See [Identifiers](/api/identifiers/) and [Identifiers and Scanning](/use/identifiers-and-scanning/).
### Identify
[Section titled “Identify”](#identify)
The act of finding a [Thread](#thread) by scanning or entering an [Identifier](#identifier). The Teams searched are set per request (the API’s `searchGroupIds`). See [Identifiers](/api/identifiers/).
### Manifest
[Section titled “Manifest”](#manifest)
The draft contents of a [Shipment](#shipment) or other [Fabric](#fabric) operation: the selected [Threads](#thread), their selected assets, and any Assembly, Folder, or Category structure to carry along. The manifest freezes when the Shipment is sent.
### Organization
[Section titled “Organization”](#organization)
The top-level account boundary, containing [Teams](#team) and their members. API requests carry the active Organization in the `Dust-Ctx-Org-Id` header. See [Conventions](/api/conventions/).
### Part / Position
[Section titled “Part / Position”](#part--position)
A **Part** is a [Thread](#thread) attached to an [Assembly](#assembly) — each Thread is a part of at most one Assembly, and by default inherits the Assembly’s access. A **Position** is a named Thread-valued Field on an Assembly assigned to one of its attached Threads (for example “front wheel”).
### Public Page
[Section titled “Public Page”](#public-page)
The public, unauthenticated web view of a [Thread](#thread) — the digital product passport a consumer reaches by scanning an [Identifier](#identifier) or following a printed link. Its URL is permanent and can be reserved (and its QR code printed) before anything is published; until then it serves a “registered” notice. A Public Page carries no content configuration of its own: it shows exactly what its [Public Page Design](#public-page-design) pulls, pinning one [Design Version](#design-version) and one publication of its data. See [Public Pages](/use/public-pages/).
### Public Page Design
[Section titled “Public Page Design”](#public-page-design)
A reusable, [Team](#team)-owned design that determines the content and appearance of every [Public Page](#public-page) published through it — an ordered stack of blocks that pull [Thread](#thread) data by field name, in the same way a [Certificate Form](#certificate-form) does. One design serves a whole product line; editing it changes nothing public until a [Design Version](#design-version) is published and rolled out.
### Publish Wave
[Section titled “Publish Wave”](#publish-wave)
A scoped background run that publishes or republishes every [Public Page](#public-page) in a [Folder](#folder), [Category](#category), [Template](#template), or explicit selection through one [Design Version](#design-version), with per-Thread success and failure accounting. A wave can be retried for its failures, or cancelled — which stops the remaining pages without moving already-published ones back.
### Publisher
[Section titled “Publisher”](#publisher)
A grant on a [Team](#team) membership meaning “may make this Team’s data public”. It gates every change in the Public Pages module — authoring and publishing [Public Page Designs](#public-page-design), publishing and unpublishing pages, rollouts, and [Publish Waves](#publish-wave). Team admins always hold it; members without it have read-only access to the module. Service Accounts can hold it, for pipeline publishing.
### Relationship
[Section titled “Relationship”](#relationship)
A directional link type used to connect two [Threads](#thread) owned by the same [Team](#team) (for example “supplied by”). Relationship links are free-form annotations; unlike [Part](#part--position) attachment they do not grant access and do not nest.
### Resource
[Section titled “Resource”](#resource)
A file attached to a [Thread](#thread) — documents, images, and other uploads. Resources can be selected into [Manifests](#manifest), [Slices](#slice), and [Disclosures](#disclosure).
### Shipment
[Section titled “Shipment”](#shipment)
The user-facing name in DICE for a [Transfer](#transfer): an outbound or inbound package of Threads exchanged between connected [Teams](#team), moving through draft, sent, accepted, and processing states, with the recipient able to accept, reject, or request changes.
### Slice
[Section titled “Slice”](#slice)
Deriving new [Threads](#thread) from a source Thread by copying or linking selected Fields, files, and Identifiers, with [Fabric](#fabric) recording the lineage. DUST Identifiers represent a physical identity and are never copied into a slice.
### Team
[Section titled “Team”](#team)
The access and collaboration scope within an [Organization](#organization). Teams own Threads and Folders, and are the unit of sharing, [Connections](#connection), and request context. The request header is `Dust-Ctx-Team-Id`; some API names keep the legacy “group” naming (`searchGroupIds`, and `Dust-Ctx-Grp-Id` as a still-accepted header alias). See [Conventions](/api/conventions/).
### Tamper Analysis
[Section titled “Tamper Analysis”](#tamper-analysis)
A comparison of a fresh scan of a DUST [Identifier](#identifier) against the reference captured when it was [bound](#bind), producing marker coverage measurements and visual evidence layers — and no conclusion. The platform reports what it measured and shows the evidence; it never states whether the Identifier was tampered with, and offers no summary number, rating, or threshold. See [Tamper Analysis](/use/tamper-analysis/).
### Tamper Observation
[Section titled “Tamper Observation”](#tamper-observation)
A person’s own conclusion drawn from one [Tamper Analysis](#tamper-analysis) — the only conclusion the platform stores. Its result is one of **Consistent**, **Expected** (normal wear and tear for the identifier’s use case and substrate), **Inconsistent**, or **Unknown**, chosen actively with no default. Observations are attributed, immutable, and never replaced: an Analysis retains the whole series. The subject is the Identifier surface, not the [Thread](#thread) or the goods it represents.
### Template
[Section titled “Template”](#template)
A reusable definition of the [Fields](#field) a [Thread](#thread) carries, used when creating Threads individually or importing them in bulk (for example from CSV).
### Thread
[Section titled “Thread”](#thread)
The core record of the platform: a digital identity for a physical thing or item. A Thread holds [Fields](#field), [Resources](#resource), [Identifiers](#identifier), and [Certificates](#certificate), lives in a [Folder](#folder), and can be classified, shared, shipped, sliced, and disclosed.
### Transfer
[Section titled “Transfer”](#transfer)
Moving [Threads](#thread) from one [Team](#team) to another over a [Connection](#connection): the recipient receives new Threads it owns outright, the source Threads are closed out, and [Fabric](#fabric) links the two sides. Surfaced in DICE as [Shipments](#shipment); acceptance is the point of no return.
### Verification
[Section titled “Verification”](#verification)
Confirming that a scanned [Identifier](#identifier) matches an expected Identifier bound to a specific [Thread](#thread) — a yes/no check against a claimed identity, as opposed to [Identify](#identify)’s open-ended search. See [Identifiers](/api/identifiers/).
### Void (Identifier)
[Section titled “Void (Identifier)”](#void-identifier)
Marking an [Identifier](#identifier) as no longer the live marking for an item — the DUST was destroyed, re-applied, or the marked material was cut away. Void is a label: the Identifier stays bound to its [Thread](#thread) with its full history, stays visible in the Identifier list (in red, marked **Voided**), and can still be identified, verified, and unbound. It is reversible, and it does not change the underlying DUST record. Distinct from archiving, which hides an Identifier from the default view, and from a [Certificate](#certificate) void, which is permanent. See [Identifiers and Scanning](/use/identifiers-and-scanning/).
# Activity and transaction history
> Audit everything that happens in DICE — the Team-wide Activity feed, grouped activities, filters, CSV export, and per-Thread transaction history.
Every meaningful action in DICE — creating and editing Threads, binding and verifying identifiers, uploading files, sharing, shipments — is recorded as an event. Two surfaces expose this record:
* the **Activity** page, a Team-wide feed of all events, and
* **Transaction History** on each Thread’s detail page, scoped to that Thread.
## What an event records
[Section titled “What an event records”](#what-an-event-records)
Each event captures:
* **Action** — what happened (e.g. “Created Thread”, “Bound”, “Verified”, “Uploaded File”, “Shared Thread”).
* **Item** — the target: a Thread, folder, or shipment, linked so you can jump straight to it.
* **User** — who did it (some events are recorded by the system rather than a person).
* **Time** — when it occurred.
For changes, events also carry the diff — expandable **Previous value** / **New value** details (“View changes”) — and, where available, richer context you can surface via CSV export or advanced mode: IP address, user agent, approximate location, and comments.
## The Activity page
[Section titled “The Activity page”](#the-activity-page)
Open **Activity** in the navigation. Events are listed newest-first; click a row to open its target (a Thread row deep-links to that exact event in the Thread’s history). Page through with **Newer** / **Older**, and adjust the page size (10–100 per page).
### Two views: Events and Groups
[Section titled “Two views: Events and Groups”](#two-views-events-and-groups)
A toggle at the top switches between:
* **Events** — the flat event log, one row per event.
* **Groups** — the same feed grouped into logical operations. A multi-step operation — a shipment, a slice, a CSV import, an assembly install — collapses under one header such as **Shipment**, **Slice**, **Imported Thread**, or **Assembly Position**, with a roll-up of how many actions and people it involved (“N actions”, “N people”). Single events still render as normal rows.
Use Groups when you want “what happened”, Events when you want every individual record.
### Filtering
[Section titled “Filtering”](#filtering)
The filter bar narrows the feed:
* **Action Type** — a multiselect of action categories: Bound, Bind Failed, Verified, Verification Failed, Identified, Identification Failed, Created Thread, Updated Thread, Created Field, Updated Field, Uploaded File, Document Verified, Archived Thread, Unarchived Thread, Viewed Thread, Created Folder, Updated Folder, and Deleted Folder. With no selection, **All Actions** are shown.
* **From** / **To** — a date range.
* **Show Viewed** — view events (“Viewed Thread”) are hidden by default (**Hide viewed**); switch to **Show viewed** to include them. Selecting the Viewed Thread action type includes them automatically.
**Clear** resets all active filters. When filters are active, the page notes how many matching events are shown and whether older matching events are available.
### Exporting events to CSV
[Section titled “Exporting events to CSV”](#exporting-events-to-csv)
1. Select events with the row checkboxes (the header checkbox selects the whole page; shift-click selects a range).
2. Click **Download CSV** in the selection bar.
The CSV includes one row per selected event with full audit columns: event ID, action, title, occurred-at time, target type/ID/name, user ID/name/email, org and Team name, IP address, user agent, latitude/longitude, comment, and a summary of field changes.
### Advanced mode
[Section titled “Advanced mode”](#advanced-mode)
Inside the **Action Type** popover, an **Advanced mode** switch adds a copy button per row for the event’s UUID (**Copy event UUID**) — useful when referencing a specific event in a support request. The setting is remembered on your device.
## Transaction history on a Thread
[Section titled “Transaction history on a Thread”](#transaction-history-on-a-thread)
Each Thread’s detail page carries its own **Transaction History** — the same events, scoped to that Thread and its resources, shown as grouped activity blocks. A filter menu (**Filter Actions**) toggles between **Show All** and **Hide View Actions**. The history loads more as you scroll and ends with an explicit “End of transaction history” marker, so you always know you’ve seen everything.
Deep links work here too: copying a link from an event (or arriving from the Activity page) scrolls the history to that exact event.
## Events on shared and disclosed Threads
[Section titled “Events on shared and disclosed Threads”](#events-on-shared-and-disclosed-threads)
History follows the Thread’s access rules. On Threads you can see through [sharing](/use/sharing-and-access/) or a [disclosure](/use/disclosures/), events whose details were not disclosed to you appear with a **Redacted** badge instead of their full content — you can see that something happened without seeing withheld values. Events that only concern content entirely hidden from you are omitted rather than shown redacted.
Note
Some event sources — shipments and slices — belong to modules whose availability depends on your organization’s configuration; if you don’t see the module in navigation it isn’t enabled (see [FAQ](/use/faq/)).
## Related pages
[Section titled “Related pages”](#related-pages)
[Threads](/use/threads/)Where per-Thread Transaction History lives.
[Identifiers and scanning](/use/identifiers-and-scanning/)Bind, verify, and identify events explained.
[Disclosures](/use/disclosures/)How disclosed history reaches other organizations.
# Administrator guide
> How organization admins invite users, manage Teams, set up cross-organization collaboration, and control module availability and API access.
This guide is for **organization administrators** — the people responsible for who can sign in, which Teams exist, and how the organization collaborates with partners.
Administration spans two surfaces:
* **DICE** — the app itself, where day-to-day work happens and where Team admins manage [Connections](/use/connections/) and [sharing](/use/sharing-and-access/).
* **The DUST Account portal** — the account-management site where organization membership, Teams, invitations, and API keys live. Open it from DICE via the user menu (top right) → **Account Management**.
Note
Some organization-management surfaces depend on your organization’s configuration. If an area described here isn’t visible to you, see the [FAQ](/use/faq/) and contact [](mailto:support@dustidentity.com)