The dashboard, public HTTP API and Python SDK do not accept or evaluate NQL1 queries, and do not list query fields. Capabilities and limits records this boundary.
Scans with an accepted Crack label
Intent. Scans where one label is a Crack and that same label is accepted.nql1
nql1
label(...). Labels are read only if their review state is in the envelope’s label policy. The default policy reads accepted labels only, so the reviewState:accepted filter changes nothing under it; it matters when the policy also reads corrected, draft or rejected labels. Crack is a display name, resolved to a class ID only when it is unambiguous in the pinned Taxonomy; writing the class ID, such as class:crack, avoids the question. Related records has the full rules.
Any of several defects, or all of them
Intent. Scans whose defect list, a multi-select Taxonomy Field, contains crack or porosity; then Scans whose list contains both.nql1
nql1
To exclude both defects, write
NOT taxonomy["defect-types"]:ANY(crack, porosity). It also selects Scans with no answer. A list field does not admit !=, and NOT is not a replacement for it. To require an answer as well, write has:taxonomy["defect-types"] AND NOT taxonomy["defect-types"]:ANY(crack, porosity). Whether an empty list counts as an answer is not fixed, so this cannot separate an empty answer from a missing one.
Where it stops. The values are option IDs, which are case-sensitive. The selector uses the Field’s ID as a bracketed key; your Taxonomy’s Field IDs decide the exact selector. Every value across every ANY and ALL in one query counts toward a limit of 32.
Records with no part number
Intent. Records where the part number is missing, and how that differs from “the part number is not blade-a”.nql1
!= needs a value to compare, so it never matches a missing field. NOT is the plain opposite of the filter after it, so it does. The two are different queries and neither is rewritten into the other.
Refused query
null_literal. NQL1 has no null; use NOT has:meta.partNumber.
Where it stops. meta.partNumber is a synthetic sidecar field that shows the grammar. Fields used in the examples says which names are real.
An exact numeric threshold
Intent. Scans whose Source has a slice spacing of at most 0.5 mm, and Scans whose Source spacing is between 0.25 mm and 0.5 mm, excluding 0.5.nql1
nql1
0.5 is never rounded through floating point on its way to evaluation. 0.50 is the same value and is written 0.5 in canonical form. The field’s units are millimetres, and the value carries no unit.
Refused query
invalid_value. Drop the unit.
Where it stops. A missing spacing matches no comparison, so a Scan whose Source has no recorded spacing is in neither result. Add OR NOT has:source.spacing.z if those Scans belong in the answer.
Registered in September
Intent. Scans whose Source was registered on any day of September 2026, in the envelope’s time zone.nql1
timeZone set to UTC, the window runs from 2026-09-01T00:00:00.000Z to before 2026-10-01T00:00:00.000Z. [2026-09-01 TO 2026-10-01} is the same window written half-open.
The zone moves the window. With timeZone set to Asia/Kolkata, the single day source.registered:2026-09-01 runs from 2026-08-31T18:30:00.000Z to before 2026-09-01T18:30:00.000Z.
Where it stops. NQL1 has no calendar months: now-1M is refused with unsupported_time_unit. Write the month’s dates.
The last seven days: rolling or calendar
Intent. Recent registrations, counted three ways: a rolling 168 hours, whole days through today, and whole days before today. All three are evaluated withtimeZone set to UTC and asOf at 2026-10-04T05:30:00.000Z.
nql1
nql1
nql1
Evaluated with timeZone UTC and asOf 2026-10-04T05:30:00.000Z. The whole-day window runs past asOf to the end of today. In another zone, /d takes the days in that zone.
now-7d is exactly seven 24-hour periods, whatever the clocks did. /d turns an instant into its calendar day in the envelope’s zone, and the offset is applied before the day is taken. Across a clock change near midnight, a window of whole days can hold one local day more or fewer.
Where it stops. The text is the intent; the envelope’s asOf pins one evaluation of it. Evaluating the same text tomorrow, with a new asOf, moves every window by a day. An envelope that keeps its asOf keeps its window, so its pages agree on what “today” means.
A metadata key that contains a dot
Intent. Records whose sidecar keymachine.name, a single key with a dot in it, is scanner-01.
nql1
nql1
machine.name under meta. The second is three segments, meta, machine and name: a key name inside a key machine. They are different fields, and only the bracketed one is the sidecar key here. A bracketed key that is a plain identifier is the same as the dotted form: meta["machine"] is meta.machine.
Where it stops. Keys use double quotes; meta['machine.name'] is refused with invalid_field.
A dotted study UID
Intent. Scans whose Source belongs to one study, identified by its DICOM study UID.nql1
Refused query
invalid_value. An unquoted text value may not contain dots or start with a digit, so a UID is always quoted. The same applies to text such as CT-2.5.
Where it stops. study.uid is a sensitive field: its values identify a study and are never summarised into facets. Use it to select a known study, not to list them.
Open Tasks in one Stage
Intent. Tasks that are queued or assigned in the review Stage, oldest first. The envelope’sresource is tasks, and its sort is task.created ascending.
nql1
queued, assigned or completed. task.stage takes the Stage ID from the Task’s workflow version.
Where it stops. Nitsor’s internal Task reader, the component that reads Tasks from their indexes, evaluates this shape: Task state equality, ANY over states, or an OR of state equalities, optionally with one Stage and a creation window, sorted by creation time. Other shapes, such as NOT task.state:completed, label(...) blocks or task.waited:>48h, come back unsupported rather than empty. Task facts are live, so the envelope’s branch commit fixes the branch context, not a snapshot of the Tasks. No public interface reaches this reader.
Next step
Query language for agents
Build the same queries as JSON trees and envelopes, and handle each outcome.
Query language (NQL1)
Every rule these recipes rely on.
| Plans | All plans |
|---|---|
| Last verified | 2026-10-25 |