Skip to main content
POST /nql/run is deprecated. Its replacement, POST /v1/nql/execute, takes the same request body and returns the same errors — but it hands back a workflow and a run instead of a job, so anything holding onto the job id has to change.
Deprecated does not mean removed. /nql/run continues to work; the removal timeline will be announced separately.

Why the change

NQL execution now runs on the same workflow engine as the rest of the platform, so an execution is a durable run you can track, schedule, and cancel like any other. /v1/nql/execute is the single-statement case of that model, and the same task composes into larger multi-step workflows without changing transport. One execution model instead of two.

Make the call

The request does not change. Same body, same parameters — only the path:
data_plane_id, compute_pool_id, and create_as_view are honored identically. The response does change. Before, a 201 carrying a job — the job id in id, and the whole created dataset inline in input.dataset:
After, a 200 carrying the workflow and the run that just started. No job id, no dataset:

What to change

1

Accept 200 instead of 201

Success is now 200. A client asserting on 201 fails on every call.
2

Read the workflow id, not a job id

id is the workflow id and run_id is the run id. Poll GET /workflows/{workflow_id}/runs for running, completed, or failed — for most callers that is the whole replacement for polling the job.
3

Fetch the job only if you need failure detail

Call GET /jobs?workflow_run_id={run_id}. The job is created seconds after the run starts, so poll until it appears.
The field is job_id, not id. A straight port that reads id gets undefined rather than an error — the most likely silent bug in this migration.
4

Resolve the created dataset after the run

input.dataset is gone, because the dataset does not exist yet when the response is sent. Once the run completes, look it up by the name you gave the view, or read result.dataset_id off the completed job. An optimistic “here is your new dataset” render now has nothing to draw until the run finishes.
5

Delete execution_cluster if you still send it

Placement runs on compute pools now. execution_cluster no longer decides where work runs and is not in the request schema for either endpoint — that code is dead.
Everything else is unchanged. The same statements are supported, REFRESH_SCHEDULE still works (it becomes a workflow schedule), and error bodies are identical apart from instanceexisting RFC 7807 handling needs no changes. One addition rather than a change: runs are cancellable with POST /workflows/{workflow_id}/runs/{run_id}/cancel, where /nql/run only had request-cancellation.

Worked example

A complete sequence, trimmed to the interesting fields:

Executing NQL via the API

Full guide to /v1/nql/execute — parameters, tracking, and errors

POST /nql/run Deprecation

The deprecation notice and its support window

Tracking Job Status

Polling patterns, backoff, and job result handling

Troubleshooting NQL

Reading RFC 7807 error responses