Skip to main content
The JSON querying API allows you to submit JSON-based native queries to Apache Druid. Native queries provide low-level control over query execution.

Submit a query

Submits a JSON-based native query. The body of the request is the native query itself. All native queries require:
  • queryType: Type of query (timeseries, topN, groupBy, scan, etc.)
  • dataSource: Name of the datasource to query
curl "http://ROUTER_IP:ROUTER_PORT/druid/v2?pretty=null" \
--header 'Content-Type: application/json' \
--data '{
  "queryType": "topN",
  "dataSource": "social_media",
  "dimension": "username",
  "threshold": 5,
  "metric": "views",
  "granularity": "all",
  "aggregations": [
    {
      "type": "longSum",
      "name": "views",
      "fieldName": "views"
    }
  ],
  "intervals": [
    "2022-01-01T00:00:00.000/2024-01-01T00:00:00.000"
  ]
}'
pretty
boolean
Returns the response in pretty-printed format with indentation and line breaks.
queryType
string
required
Type of query. Supported types: timeseries, topN, groupBy, timeBoundaries, segmentMetadata, datasourceMetadata, scan, search.
dataSource
string
required
Name of the datasource to query.
intervals
array
required
ISO-8601 time intervals to query.
granularity
string
required
Time granularity for the query (e.g., “all”, “day”, “hour”).
aggregations
array
Array of aggregation specifications.
[
    {
        "timestamp": "2023-07-03T18:49:54.848Z",
        "result": [
            {
                "views": 11591218026,
                "username": "gus"
            },
            {
                "views": 11578638578,
                "username": "miette"
            },
            {
                "views": 11561618880,
                "username": "leon"
            }
        ]
    }
]

Example: groupBy query

The following query calculates the upvote-to-post ratio and returns the user with the highest ratio:
curl "http://ROUTER_IP:ROUTER_PORT/druid/v2" \
--header 'Content-Type: application/json' \
--data '{
  "queryType": "groupBy",
  "dataSource": "social_media",
  "dimensions": ["username"],
  "granularity": "all",
  "aggregations": [
    { "type": "doubleSum", "name": "upvoteSum", "fieldName": "upvotes" },
    { "type": "count", "name": "postCount", "fieldName": "post_title" }
  ],
  "postAggregations": [
    {
      "type": "arithmetic",
      "name": "upvoteToPostRatio",
      "fn": "/",
      "fields": [
        { "type": "fieldAccess", "name": "upvoteSum", "fieldName": "upvoteSum" },
        { "type": "fieldAccess", "name": "postCount", "fieldName": "postCount" }
      ]
    }
  ],
  "intervals": ["2022-01-01T00:00:00.000/2024-01-01T00:00:00.000"],
  "limitSpec": {
    "type": "default",
    "limit": 1,
    "columns": [
      { "dimension": "upvoteToPostRatio", "direction": "descending" }
    ]
  }
}'
[
    {
        "version": "v1",
        "timestamp": "2022-01-01T00:00:00.000Z",
        "event": {
            "upvoteSum": 8.0419541E7,
            "upvoteToPostRatio": 69.53014661762697,
            "postCount": 1156614,
            "username": "miette"
        }
    }
]

Get segment information for query

Retrieves segment information and server locations for a given query.
curl "http://ROUTER_IP:ROUTER_PORT/druid/v2/candidates" \
--header 'Content-Type: application/json' \
--data '{
  "queryType": "topN",
  "dataSource": "social_media",
  "dimension": "username",
  "threshold": 5,
  "metric": "views",
  "granularity": "all",
  "aggregations": [
    {
      "type": "longSum",
      "name": "views",
      "fieldName": "views"
    }
  ],
  "intervals": [
    "2022-01-01T00:00:00.000/2024-01-01T00:00:00.000"
  ]
}'
pretty
boolean
Returns the response in pretty-printed format.
interval
string
Time interval covered by the segment.
version
string
Version identifier for the segment.
partitionNumber
integer
Partition number of the segment.
size
integer
Size of the segment in bytes.
locations
array
Array of server locations where the segment is available.
[
    {
        "interval": "2023-07-03T18:00:00.000Z/2023-07-03T19:00:00.000Z",
        "version": "2023-07-03T18:51:18.905Z",
        "partitionNumber": 0,
        "size": 21563693,
        "locations": [
            {
                "name": "localhost:8083",
                "host": "localhost:8083",
                "maxSize": 300000000000,
                "type": "historical",
                "tier": "_default_tier",
                "priority": 0
            }
        ]
    }
]

Build docs developers (and LLMs) love