Sequencing Technology API
SeqDesk keeps a curated catalog of sequencing hardware: platforms, devices, flow cells, kits, barcode schemes, and control software. The catalog drives the technology selector on the order form, feeds compatibility hints to pipelines, and supplies the images shown next to each device.
There are two distinct use cases, and they use different endpoints:
| Goal | Endpoint |
|---|---|
| Read what your own instance currently offers users | GET /api/sequencing-tech on your host |
| Serve a catalog that a SeqDesk instance can sync from | GET /api/registry/sequencing-tech on seqdesk.org, or your own URL implementing the same contract |
The second is the interesting one. A facility that runs instruments the public catalog does not cover can host its own JSON document and point SeqDesk at it — this page is the contract that document must satisfy.
Base URL
- Public registry:
https://seqdesk.org/api - Your instance:
https://<your-host>/api
The registry a SeqDesk instance syncs from defaults to
https://seqdesk.org/api/registry/sequencing-tech, overridable per instance by
the syncUrl stored with the configuration, or globally by the SEQDESK_API_URL
environment variable.
Reading your instance’s catalog
GET /api/sequencing-tech
Returns the locally stored configuration after filtering. Unauthenticated —
the order form needs it before a session is fully established — and served
Cache-Control: no-store, because it must reflect an admin’s edits immediately.
curl -s https://<your-host>/api/sequencing-tech{
"technologies": [
{
"id": "ont-minion",
"name": "MinION",
"manufacturer": "Oxford Nanopore",
"shortDescription": "Portable nanopore sequencing platform",
"platformFamily": "oxford-nanopore",
"readLengthClass": "long",
"supportedReadLayouts": ["single"],
"specs": [{ "label": "Read length", "value": "up to 4 Mb" }],
"pros": [{ "text": "Portable" }],
"cons": [{ "text": "Lower per-run throughput than PromethION" }],
"bestFor": ["Rapid turnaround"],
"available": true,
"order": 10
}
],
"devices": [
{
"id": "ont-minion-mk1d",
"platformId": "ont-minion",
"name": "MinION Mk1D",
"manufacturer": "Oxford Nanopore",
"productOverview": "Portable nanopore sequencer",
"shortDescription": "Portable nanopore sequencing device",
"specs": [],
"compatibleFlowCells": ["flo-min114"],
"compatibleKits": ["sqk-lsk114"],
"compatibleSoftware": ["minknow"],
"available": true,
"order": 10
}
],
"flowCells": [],
"kits": [],
"software": [],
"barcodeSchemes": [],
"barcodeSets": []
}What the filter actually does
The filtering rules are not uniform across collections, which surprises people:
| Collection | Included when | Sorted by |
|---|---|---|
technologies | available and not comingSoon | order |
devices | available and not comingSoon | order |
flowCells | available | order |
kits | available | order |
software | available | order |
barcodeSchemes | always — passed through unfiltered | source order |
barcodeSets | always — passed through unfiltered | source order |
So comingSoon hides a platform or a device from users while leaving it visible
in the admin catalog, but it does not hide a flow cell or kit. Use
available: false for those.
The response deliberately carries no version and no syncUrl. Those
live on the stored configuration and are visible to admins under
Admin → Sequencing Technology, not on the public read.
If the catalog cannot be loaded at all, the endpoint returns
500 {"error":"Failed to fetch technologies"}.
On a fresh instance with no stored configuration, this endpoint fetches the default registry once, filters it, and serves the result. A first request on a brand-new install therefore depends on outbound network access to the registry host. If it is unavailable the endpoint returns empty collections rather than failing, and the admin can populate the catalog manually.
Serving a catalog: the sync contract
GET /api/registry/sequencing-tech
curl -s https://seqdesk.org/api/registry/sequencing-techThis returns the full, unfiltered dataset and is exactly the contract SeqDesk accepts when you configure a custom sync URL in Admin → Sequencing Technology.
SeqDesk accepts either a wrapped document:
{ "config": { "version": 6, "technologies": [] } }or the raw configuration object:
{
"version": 6,
"technologies": [],
"devices": [],
"flowCells": [],
"kits": [],
"software": [],
"barcodeSchemes": [],
"barcodeSets": []
}Anything that is not an object — an array, a string, null — is rejected with
“Registry returned invalid sequencing tech config”. Any collection that is not
an array is coerced to [] rather than failing, so a partial document is
tolerated.
Required fields
| Field | Type | Description |
|---|---|---|
version | integer | Monotonic version used for update detection. Non-numeric values are coerced to 0 |
technologies | array | Platform definitions. The only collection that must be present |
Optional collections
| Field | Type | Notes |
|---|---|---|
devices | array | Devices linked to a platform through platformId |
flowCells | array | Referenced from devices[].compatibleFlowCells |
kits | array | Referenced from devices[].compatibleKits |
software | array | Referenced from devices[].compatibleSoftware |
barcodeSchemes | array | Barcode scheme metadata |
barcodeSets | array | Barcode set metadata |
A platform entry
| Field | Type | Description |
|---|---|---|
id | string | Stable unique identifier; this is the merge key |
name | string | Display name |
manufacturer | string | Vendor or platform owner |
shortDescription | string | One-line summary used in the selector |
platformFamily | string | Compatibility family — matched against a pipeline’s sequencingCompatibility.platformFamilies |
readLengthClass | string | short, long, both, or unknown |
supportedReadLayouts | array | e.g. ["single"], ["paired"], ["single","paired"] |
specs | array | { label, value, unit? } |
pros | array | { text, tooltip? } |
cons | array | { text, tooltip? } |
bestFor | array | Short use-case labels |
icon | string | Optional asset path; see asset resolution below |
available | boolean | Whether it is selectable. A local instance can override this |
comingSoon | boolean | When true, excluded from GET /api/sequencing-tech — a teaser only |
order | integer | Display order |
A device entry
| Field | Type | Description |
|---|---|---|
id | string | Stable unique identifier |
platformId | string | Must match a technologies[].id |
name | string | Display name |
manufacturer | string | Vendor |
productOverview | string | Longer description |
shortDescription | string | One-line summary |
specs | array | Technical specs |
compatibleFlowCells | array | Flow-cell ids |
compatibleKits | array | Kit ids |
compatibleSoftware | array | Software ids |
image | string | Optional asset path |
available | boolean | Selectable by default |
comingSoon | boolean | Excluded from GET /api/sequencing-tech |
order | integer | Display order |
Kits may additionally carry barcoding metadata — kitKind, doradoKitName, and
a barcoding block with barcodeSetId, maxBarcodesPerRun, and
compatibleBarcodeKits. SeqDesk treats the appearance of this metadata on an
existing kit as an update, even without a version bump, so barcoding data can be
backfilled into a catalog that has already been synced.
Asset resolution
icon and image may be relative paths such as
/images/sequencers/devices/ont-minion-mk1d.png. SeqDesk resolves them against
the origin of the sync URL, so a custom registry can serve its own images
from its own host without rewriting the paths. Absolute URLs are passed through
unchanged.
Update detection and merging
When an admin checks a registry for updates, SeqDesk fetches the document and decides whether anything changed. It updates if any of these hold:
- the remote
versionis greater than the localversion; - the local catalog has no technologies and the remote one does;
- the remote contains an id that is missing locally, in any of
technologies,devices,flowCells,kits, orsoftware; - the remote adds barcoding metadata (
kitKind,doradoKitName,barcoding, or richerbarcodingfields) to a kit that already exists locally, or new barcode schemes or sets.
The last two matter: a registry that adds an entry without bumping version is
still picked up. Nothing is deleted — an item that exists locally but not
remotely is kept.
Merging is per item, by id:
| Local item | Result |
|---|---|
| Absent | The remote item is taken as-is |
Present, localOverrides: true | Local fields win field-by-field over the remote ones |
| Present, no overrides | The remote item wins, except available, which keeps the local value |
That exception is the important one. Turning a platform off in your instance
survives every future sync, without you having to mark the entry as locally
overridden. Set localOverrides: true only when you have edited more than
availability — a renamed device, corrected specs, your own image.
After a successful merge SeqDesk stores the remote version, the resolved
syncUrl, and lastSyncedAt, and reports how many new technologies arrived.
Custom registry checklist
Serve JSON over HTTP or HTTPS
Only http: and https: URLs are accepted; anything else is rejected with
“syncUrl must be a valid http(s) URL”. The fetch is a plain server-side GET
with Accept: application/json and no caching.
Do not expect authentication
SeqDesk sends no authentication headers to a custom registry URL. If your catalog must be private, restrict it by network or by an unguessable path — do not expect a token to be forwarded.
Give every item a stable id
id is the merge key. Changing an id creates a second entry and orphans the
first; both then appear in the catalog.
Bump version when you change anything
New ids are detected without it, but edits to existing entries are not. Treat
version as a monotonic integer and increment it on every publish.
Point the instance at it
Set the sync URL under Admin → Sequencing Technology, then run the update check. The response tells you the new version and how many technologies were added.
Errors
| Endpoint | Condition | Response |
|---|---|---|
GET /api/sequencing-tech | Catalog could not be loaded | 500 {"error":"Failed to fetch technologies"} |
| Admin sync | Registry returns a non-2xx status | The failure is surfaced as API returned <status> |
| Admin sync | Registry returns a non-object body | ”Registry returned invalid sequencing tech config” |
| Admin save | technologies is not an array | 400 {"error":"Technologies must be an array"} |
| Admin save | syncUrl is not an http(s) URL | 400 {"error":"syncUrl must be a valid http(s) URL"} |
Caching and CORS
- The public
seqdesk.orgregistry endpoints are CDN-cached withs-maxage=300, stale-while-revalidate=600. A change you publish can take up to five minutes to reach an instance. - Your instance’s
GET /api/sequencing-techis servedno-store. - Custom registry sync is a server-side fetch, so CORS headers on your registry are irrelevant to SeqDesk — but adding them lets you test the URL from a browser.
Related reading
- Administration → Sequencing Technologies — the admin screen that consumes this contract
- Pipeline Registry API — how
platformFamilygates pipelines - Data Model — where the synced catalog is stored