Skip to main content
POST /v1/workspaces/{workspace_id}/je-testing returns a job whose result is a je_testing. Python: client.search.je_testing. TypeScript: client.search.jeTesting. MCP: je_testing. CLI: ndi je-testing. A sibling of deep search, not a preset of it. Deep search retrieves and cites; this route performs a test. The run orients itself in the workspace’s ledger package, writes SQL over the ingested tables itself, and answers with sql_receipts: every statement it ran, the tables each one registered, and a bounded result. A figure in the answer is meant to be readable out of one of those receipts, and a receipt carries everything needed to re-run it. figures is the checkable half of the answer — one entry per criterion, with the definition it was tested under, the population it ran over, the count that met it, and the result_ids of the statements behind it. exception_listing_result_id names the receipt worth opening: an unfiltered count points at every row, an exception listing points at the rows that failed. A criterion the workspace holds no material for comes back cannot_be_performed, with result_ids naming the probes that establish the absence. binding is the definitional layer the whole run rests on: which column is the period, which values mean posted, which clock a timing test used. Two runs that disagree usually disagree here first.

Scope

paths names the files of the package under test — each entry is an uploaded file, never a folder. path_prefix scopes to a folder, and the two compose as an intersection. Omit both to test the whole workspace: the run orients over every queryable file the caller can see and finds the ledger package itself, the same way deep search behaves when unscoped.

Reasoning budget

reasoning_effort controls the thinking budget without changing the JET engine. Its accepted values are none, minimal, low, medium, and high. Omit it for the route default; an explicit null uses the model catalogue’s prescription. The internal exact-model header can still pin an engine for evaluation. The reverted effort selector and tier are rejected by the strict body. New jobs have effort: null; previously stored jobs retain their recorded level. There is no top_k (the run authors its own citation list) or allow_clarification (a run that cannot proceed says so in its answer).

Partial and degraded runs

exhausted: true means the step budget ran out before the procedure finished — a successful, partial response, not a failure. execution_status says whether the run tested what it was asked to test; quality grades how well a performed test went. degraded is set when the run broke before finalizing an answer but had already computed real working: sql_receipts and binding are published, figures is empty, and answer says so. A run keeps its conversation: pass the result’s session_id on a later request to ask a follow-up in the same thread. Only the API key that started a thread may continue it, and a thread whose turn is still running returns 409 session_busy. See Search methods, ledger understanding, and Jobs.