Submit SQL Query

Use the POST /api/v3/query endpoint of the Data 360 Query API to execute a SQL query against your Data 360 data. Submit a query in ASYNC mode to receive a queryId for polling, or use ADAPTIVE mode to receive results immediately when the query completes quickly. Both modes support JSON and Apache Arrow response formats.

This API is the recommended interface for new integrations. See Migrate from Query API V1 and V2 for guidance on updating existing code.

  • HTTP Method: POST
  • Format: REST
  • URI: /api/v3/query
HeaderValue
AuthorizationBearer {accessToken}
Content-Typeapplication/json (default) or application/vnd.apache.arrow.stream
Acceptapplication/json (default) or application/vnd.apache.arrow.stream
FieldTypeRequiredDescription
sqlstringYesSQL query to execute. Uses Data 360 SQL syntax.
transferModestringNoExecution mode. Accepted values: ASYNC, ADAPTIVE (default).
paramStylestringNoParameter binding style. Accepted values: QUESTION_MARK (default), NAMED, DOLLARED. See Parameterized Queries.
parametersarrayNoArray of parameter objects for parameterized queries. Each object requires type (string) and value (string).
settingsobjectNoQuery settings. Supported keys: timezone (for example, "Etc/UTC"), language (for example, "de_DE").
resultRangeobjectNoControls what is returned within the REST response. ADAPTIVE mode only. Supported keys: rowLimit (integer), byteLimit (integer, default and maximum 20 MB).
queryRowLimitintegerNoMaximum number of rows to produce by the query. Acts as an implicit LIMIT clause — the query will not produce more rows than this value. Set to 0 to retrieve only the schema without producing any rows.

The paramStyle request field controls how parameters are bound in your SQL:

  • QUESTION_MARK (default) — Use ? placeholders
  • NAMED — Use named placeholders (:paramName)
  • DOLLARED — Use positional placeholders ($1, $2, …)

Both ASYNC and ADAPTIVE modes share a common response structure.

Both ASYNC and ADAPTIVE modes return these response headers.

HeaderDescription
DateTimestamp when the response was generated.
Content-Typeapplication/json or application/vnd.apache.arrow.stream depending on the Accept request header.
statusJSON-serialized string containing the full query status. Fields: queryId, completionStatus, chunkCount, rowCount, progress, expirationTime, and executionStats. Use the queryId from this header to poll for results.

In ASYNC mode, the response body always has "data": null and "returnedRows": 0. Use the queryId from the status response header to poll GET /api/v3/query/{queryId} for completion.

FieldDescription
metadataObject containing column schema
dataAlways null in ASYNC mode
returnedRowsAlways 0 in ASYNC mode

If the query completes within the adaptive timeout, data contains the result rows. If the query exceeds the adaptive timeout without producing rows, the response mimics ASYNC mode: data is null and returnedRows is 0. Use the queryId from the status response header to poll GET /api/v3/query/{queryId} for completion.

FieldDescription
metadataObject containing column schema
dataArray of result rows (each row is an array), or null if timed out
returnedRowsNumber of rows returned (0 if adaptive timeout reached)

These examples show ASYNC and ADAPTIVE requests and responses.

Response headers (excerpt):

Response body:

Set Accept: application/vnd.apache.arrow.stream to request a binary Arrow IPC stream instead of JSON. Use an Arrow-compatible client library (such as PyArrow or the Apache Arrow Java library) to read the stream.

In ASYNC mode, the response body always contains only schema metadata with no data rows, regardless of the Accept header. Retrieve the queryId from the status response header and poll GET /api/v3/query/{queryId} for completion, then use GET /api/v3/query/{queryId}/rows or /chunks/{chunkId} with Accept: application/vnd.apache.arrow.stream to retrieve results.

Set Accept: application/vnd.apache.arrow.stream to receive an inline ADAPTIVE result as a binary Arrow IPC stream. If the query exceeds the adaptive timeout and falls back to ASYNC mode, the response body contains only schema metadata with no data rows. Retrieve the queryId from the status response header and poll GET /api/v3/query/{queryId} for completion.

V3 returns structured error objects with HTTP status codes.

StatusMeaning
400Invalid SQL or request payload
401Missing or invalid authentication
408Request timed out
429Rate limit exceeded
500Internal server error

Error responses include a rich error model with SQLSTATE codes and human-readable detail.

The position field is included for syntax errors. errorSource indicates whether the error originated from user input ("User") or the system. See Query Services Status Codes for the full reference.