You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by cw...@apache.org on 2025/12/05 11:20:20 UTC
(druid-website-src) branch master updated: 35 release (#564)
This is an automated email from the ASF dual-hosted git repository.
cwylie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid-website-src.git
The following commit(s) were added to refs/heads/master by this push:
new ab981ec82 35 release (#564)
ab981ec82 is described below
commit ab981ec82c1f28fd1430809202bfaa2ad9631691
Author: Clint Wylie <cw...@apache.org>
AuthorDate: Fri Dec 5 03:20:15 2025 -0800
35 release (#564)
* 35 release
---
docs/35.0.0/api-reference/api-reference.md | 44 +
.../api-reference/automatic-compaction-api.md | 1592 ++++++++++++++++++
docs/35.0.0/api-reference/data-management-api.md | 607 +++++++
.../api-reference/dynamic-configuration-api.md | 665 ++++++++
docs/35.0.0/api-reference/json-querying-api.md | 925 +++++++++++
docs/35.0.0/api-reference/legacy-metadata-api.md | 344 ++++
docs/35.0.0/api-reference/lookups-api.md | 279 ++++
docs/35.0.0/api-reference/retention-rules-api.md | 562 +++++++
docs/35.0.0/api-reference/service-status-api.md | 1469 +++++++++++++++++
docs/35.0.0/api-reference/sql-api.md | 1727 ++++++++++++++++++++
docs/35.0.0/api-reference/sql-ingestion-api.md | 850 ++++++++++
docs/35.0.0/api-reference/sql-jdbc.md | 251 +++
.../api-reference/supervisor-api.md | 32 +-
docs/35.0.0/api-reference/tasks-api.md | 1663 +++++++++++++++++++
docs/35.0.0/assets/compaction-config.png | Bin 0 -> 103224 bytes
docs/35.0.0/assets/datasources-action-button.png | Bin 0 -> 800 bytes
docs/35.0.0/assets/druid-architecture.png | Bin 0 -> 134117 bytes
docs/35.0.0/assets/druid-architecture.svg | 19 +
docs/35.0.0/assets/druid-column-types.png | Bin 0 -> 93363 bytes
docs/35.0.0/assets/druid-dataflow-2x.png | Bin 0 -> 130160 bytes
docs/35.0.0/assets/druid-dataflow-3.png | Bin 0 -> 71425 bytes
docs/35.0.0/assets/druid-manage-1.png | Bin 0 -> 80415 bytes
docs/35.0.0/assets/druid-timeline.png | Bin 0 -> 24160 bytes
.../35.0.0/assets/files/kttm-kafka-supervisor.json | 66 +
docs/35.0.0/assets/indexing_service.png | Bin 0 -> 22490 bytes
.../msq-ui-download-query-results.png | Bin 0 -> 62538 bytes
.../multi-stage-query/tutorial-msq-convert.png | Bin 0 -> 80379 bytes
.../assets/multi-stage-query/ui-annotated.png | Bin 0 -> 227968 bytes
docs/35.0.0/assets/multi-stage-query/ui-empty.png | Bin 0 -> 77306 bytes
docs/35.0.0/assets/native-queries-01.png | Bin 0 -> 259507 bytes
docs/35.0.0/assets/nested-combined-json.png | Bin 0 -> 272858 bytes
docs/35.0.0/assets/nested-display-data-types.png | Bin 0 -> 254224 bytes
docs/35.0.0/assets/nested-examine-schema.png | Bin 0 -> 251706 bytes
docs/35.0.0/assets/nested-extract-as-type.png | Bin 0 -> 288918 bytes
docs/35.0.0/assets/nested-extract-elements.png | Bin 0 -> 317905 bytes
docs/35.0.0/assets/nested-group-aggregate.png | Bin 0 -> 249178 bytes
.../assets/nested-msq-ingestion-transform.png | Bin 0 -> 370419 bytes
docs/35.0.0/assets/nested-msq-ingestion.png | Bin 0 -> 302033 bytes
docs/35.0.0/assets/nested-parse-deserialize.png | Bin 0 -> 213791 bytes
docs/35.0.0/assets/nested-retrieve-json.png | Bin 0 -> 295566 bytes
docs/35.0.0/assets/nested-return-json.png | Bin 0 -> 349144 bytes
docs/35.0.0/assets/retention-rules.png | Bin 0 -> 148273 bytes
docs/35.0.0/assets/security-model-1.png | Bin 0 -> 85098 bytes
docs/35.0.0/assets/security-model-2.png | Bin 0 -> 29613 bytes
docs/35.0.0/assets/segmentPropagation.png | Bin 0 -> 30569 bytes
docs/35.0.0/assets/services-overview.png | Bin 0 -> 112702 bytes
.../assets/set-query-context-insert-query.png | Bin 0 -> 51618 bytes
.../set-query-context-open-context-dialog.png | Bin 0 -> 75005 bytes
.../35.0.0/assets/set-query-context-query-view.png | Bin 0 -> 66028 bytes
.../assets/set-query-context-run-the-query.png | Bin 0 -> 50538 bytes
.../set-query-context-set-context-parameters.png | Bin 0 -> 54655 bytes
.../assets/spectator-histogram-size-comparison.png | Bin 0 -> 45331 bytes
docs/35.0.0/assets/supervisor-actions.png | Bin 0 -> 77894 bytes
docs/35.0.0/assets/supervisor-info-dialog.png | Bin 0 -> 107805 bytes
docs/35.0.0/assets/supervisor-view.png | Bin 0 -> 63532 bytes
.../assets/tutorial-batch-data-loader-00.png | Bin 0 -> 2904 bytes
.../assets/tutorial-batch-data-loader-01.png | Bin 0 -> 227941 bytes
.../assets/tutorial-batch-data-loader-015.png | Bin 0 -> 206331 bytes
.../assets/tutorial-batch-data-loader-02.png | Bin 0 -> 1193472 bytes
.../assets/tutorial-batch-data-loader-03.png | Bin 0 -> 405035 bytes
.../assets/tutorial-batch-data-loader-04.png | Bin 0 -> 488906 bytes
.../assets/tutorial-batch-data-loader-05.png | Bin 0 -> 447046 bytes
.../assets/tutorial-batch-data-loader-06.png | Bin 0 -> 191383 bytes
.../assets/tutorial-batch-data-loader-07.png | Bin 0 -> 173618 bytes
.../assets/tutorial-batch-data-loader-08.png | Bin 0 -> 325806 bytes
.../assets/tutorial-batch-data-loader-09.png | Bin 0 -> 187695 bytes
.../assets/tutorial-batch-data-loader-10.png | Bin 0 -> 219732 bytes
.../assets/tutorial-batch-data-loader-11.png | Bin 0 -> 316540 bytes
.../assets/tutorial-batch-data-loader-12.png | Bin 0 -> 31752 bytes
.../assets/tutorial-batch-submit-task-01.png | Bin 0 -> 170537 bytes
.../assets/tutorial-batch-submit-task-02.png | Bin 0 -> 207377 bytes
docs/35.0.0/assets/tutorial-compaction-01.png | Bin 0 -> 35710 bytes
docs/35.0.0/assets/tutorial-compaction-02.png | Bin 0 -> 166571 bytes
docs/35.0.0/assets/tutorial-compaction-03.png | Bin 0 -> 26755 bytes
docs/35.0.0/assets/tutorial-compaction-04.png | Bin 0 -> 184365 bytes
docs/35.0.0/assets/tutorial-compaction-05.png | Bin 0 -> 26588 bytes
docs/35.0.0/assets/tutorial-compaction-06.png | Bin 0 -> 206717 bytes
docs/35.0.0/assets/tutorial-compaction-07.png | Bin 0 -> 26683 bytes
docs/35.0.0/assets/tutorial-compaction-08.png | Bin 0 -> 28751 bytes
docs/35.0.0/assets/tutorial-deletion-01.png | Bin 0 -> 163245 bytes
docs/35.0.0/assets/tutorial-deletion-02.png | Bin 0 -> 159346 bytes
docs/35.0.0/assets/tutorial-deletion-03.png | Bin 0 -> 153770 bytes
.../assets/tutorial-kafka-data-loader-01.png | Bin 0 -> 75787 bytes
.../assets/tutorial-kafka-data-loader-02.png | Bin 0 -> 420744 bytes
.../assets/tutorial-kafka-data-loader-03.png | Bin 0 -> 192051 bytes
.../assets/tutorial-kafka-data-loader-04.png | Bin 0 -> 244021 bytes
.../assets/tutorial-kafka-data-loader-05.png | Bin 0 -> 506701 bytes
.../assets/tutorial-kafka-data-loader-06.png | Bin 0 -> 95274 bytes
.../assets/tutorial-kafka-data-loader-07.png | Bin 0 -> 114038 bytes
.../assets/tutorial-kafka-data-loader-08.png | Bin 0 -> 81750 bytes
.../assets/tutorial-kafka-data-loader-09.png | Bin 0 -> 141501 bytes
.../assets/tutorial-kafka-data-loader-10.png | Bin 0 -> 80127 bytes
.../assets/tutorial-kafka-data-loader-11.png | Bin 0 -> 74913 bytes
.../assets/tutorial-kafka-data-loader-12.png | Bin 0 -> 134001 bytes
.../assets/tutorial-kafka-submit-supervisor-01.png | Bin 0 -> 130690 bytes
docs/35.0.0/assets/tutorial-query-01.png | Bin 0 -> 78666 bytes
docs/35.0.0/assets/tutorial-query-02.png | Bin 0 -> 90958 bytes
docs/35.0.0/assets/tutorial-query-03.png | Bin 0 -> 118994 bytes
docs/35.0.0/assets/tutorial-query-04.png | Bin 0 -> 136945 bytes
docs/35.0.0/assets/tutorial-query-05.png | Bin 0 -> 135626 bytes
docs/35.0.0/assets/tutorial-query-06.png | Bin 0 -> 135743 bytes
docs/35.0.0/assets/tutorial-query-07.png | Bin 0 -> 148492 bytes
.../tutorial-query-deepstorage-retention-rule.png | Bin 0 -> 99106 bytes
docs/35.0.0/assets/tutorial-quickstart-01.png | Bin 0 -> 68216 bytes
docs/35.0.0/assets/tutorial-quickstart-02.png | Bin 0 -> 115511 bytes
docs/35.0.0/assets/tutorial-quickstart-03.png | Bin 0 -> 171269 bytes
docs/35.0.0/assets/tutorial-quickstart-04.png | Bin 0 -> 129369 bytes
docs/35.0.0/assets/tutorial-quickstart-05.png | Bin 0 -> 110367 bytes
docs/35.0.0/assets/tutorial-retention-00.png | Bin 0 -> 77704 bytes
docs/35.0.0/assets/tutorial-retention-01.png | Bin 0 -> 35171 bytes
docs/35.0.0/assets/tutorial-retention-02.png | Bin 0 -> 240310 bytes
docs/35.0.0/assets/tutorial-retention-03.png | Bin 0 -> 30029 bytes
docs/35.0.0/assets/tutorial-retention-04.png | Bin 0 -> 44617 bytes
docs/35.0.0/assets/tutorial-retention-05.png | Bin 0 -> 38992 bytes
docs/35.0.0/assets/tutorial-retention-06.png | Bin 0 -> 137570 bytes
.../35.0.0/assets/tutorial-sql-aggregate-query.png | Bin 0 -> 99042 bytes
docs/35.0.0/assets/tutorial-sql-auto-queries.png | Bin 0 -> 178642 bytes
.../assets/tutorial-sql-count-distinct-help.png | Bin 0 -> 190668 bytes
docs/35.0.0/assets/tutorial-sql-count-distinct.png | Bin 0 -> 109726 bytes
docs/35.0.0/assets/tutorial-sql-demo-queries.png | Bin 0 -> 158884 bytes
docs/35.0.0/assets/tutorial-sql-query-plan.png | Bin 0 -> 152371 bytes
.../assets/tutorial-sql-result-column-actions.png | Bin 0 -> 113313 bytes
docs/35.0.0/assets/tutorial-theta-01.png | Bin 0 -> 160923 bytes
docs/35.0.0/assets/tutorial-theta-02.png | Bin 0 -> 149124 bytes
docs/35.0.0/assets/tutorial-theta-03.png | Bin 0 -> 164755 bytes
docs/35.0.0/assets/tutorial-theta-04.png | Bin 0 -> 141568 bytes
docs/35.0.0/assets/tutorial-theta-05.png | Bin 0 -> 88165 bytes
docs/35.0.0/assets/tutorial-theta-06.png | Bin 0 -> 105328 bytes
docs/35.0.0/assets/tutorial-theta-07.png | Bin 0 -> 105225 bytes
docs/35.0.0/assets/tutorial-theta-08.png | Bin 0 -> 104913 bytes
docs/35.0.0/assets/web-console-0.7-tasks.png | Bin 0 -> 83141 bytes
docs/35.0.0/assets/web-console-01-home-view.png | Bin 0 -> 87581 bytes
.../35.0.0/assets/web-console-02-data-loader-1.png | Bin 0 -> 80007 bytes
.../35.0.0/assets/web-console-03-data-loader-2.png | Bin 0 -> 268671 bytes
docs/35.0.0/assets/web-console-04-datasources.png | Bin 0 -> 97639 bytes
docs/35.0.0/assets/web-console-05-retention.png | Bin 0 -> 86941 bytes
docs/35.0.0/assets/web-console-06-segments.png | Bin 0 -> 103333 bytes
docs/35.0.0/assets/web-console-07-supervisors.png | Bin 0 -> 51193 bytes
.../assets/web-console-08-supervisor-status.png | Bin 0 -> 89501 bytes
docs/35.0.0/assets/web-console-09-task-status.png | Bin 0 -> 201632 bytes
docs/35.0.0/assets/web-console-10-servers.png | Bin 0 -> 87782 bytes
docs/35.0.0/assets/web-console-11-query-sql.png | Bin 0 -> 131799 bytes
docs/35.0.0/assets/web-console-12-query-rune.png | Bin 0 -> 106246 bytes
docs/35.0.0/assets/web-console-13-lookups.png | Bin 0 -> 66934 bytes
docs/35.0.0/comparisons/druid-vs-elasticsearch.md | 39 +
docs/35.0.0/comparisons/druid-vs-key-value.md | 46 +
docs/35.0.0/comparisons/druid-vs-kudu.md | 39 +
docs/35.0.0/comparisons/druid-vs-redshift.md | 62 +
docs/35.0.0/comparisons/druid-vs-spark.md | 42 +
docs/35.0.0/comparisons/druid-vs-sql-on-hadoop.md | 82 +
.../{latest => 35.0.0}/configuration/extensions.md | 1 +
docs/35.0.0/configuration/human-readable-byte.md | 98 ++
docs/{latest => 35.0.0}/configuration/index.md | 52 +-
docs/35.0.0/configuration/logging.md | 170 ++
.../data-management/automatic-compaction.md | 1 -
docs/35.0.0/data-management/compaction.md | 113 ++
docs/35.0.0/data-management/delete.md | 148 ++
docs/35.0.0/data-management/index.md | 34 +
docs/35.0.0/data-management/manual-compaction.md | 167 ++
docs/35.0.0/data-management/schema-changes.md | 39 +
docs/35.0.0/data-management/update.md | 78 +
docs/35.0.0/design/architecture.md | 185 +++
docs/35.0.0/design/broker.md | 54 +
docs/35.0.0/design/coordinator.md | 176 ++
docs/35.0.0/design/deep-storage.md | 88 +
.../design/extensions-contrib/dropwizard.md | 1 +
docs/35.0.0/design/historical.md | 73 +
docs/35.0.0/design/index.md | 104 ++
docs/{latest => 35.0.0}/design/indexer.md | 1 +
docs/35.0.0/design/indexing-service.md | 51 +
docs/35.0.0/design/metadata-storage.md | 175 ++
docs/35.0.0/design/middlemanager.md | 43 +
docs/35.0.0/design/overlord.md | 59 +
docs/35.0.0/design/peons.md | 48 +
docs/35.0.0/design/router.md | 230 +++
docs/35.0.0/design/segments.md | 217 +++
docs/35.0.0/design/storage.md | 140 ++
docs/35.0.0/design/zookeeper.md | 76 +
docs/35.0.0/development/build.md | 110 ++
docs/35.0.0/development/docs-contribute.md | 227 +++
docs/35.0.0/development/experimental.md | 37 +
.../extensions-contrib/aliyun-oss-extensions.md | 236 +++
.../extensions-contrib/ambari-metrics-emitter.md | 98 ++
.../development/extensions-contrib/cassandra.md | 30 +
.../development/extensions-contrib/cloudfiles.md | 42 +
.../extensions-contrib/compressed-big-decimal.md | 280 ++++
.../extensions-contrib/ddsketch-quantiles.md | 139 ++
.../development/extensions-contrib/delta-lake.md | 54 +
.../extensions-contrib/distinctcount.md | 99 ++
.../extensions-contrib/druid-exact-count-bitmap.md | 452 +++++
.../extensions-contrib/druid-ranger-security.md | 130 ++
.../extensions-contrib/gce-extensions.md | 103 ++
.../development/extensions-contrib/graphite.md | 117 ++
.../development/extensions-contrib/iceberg.md | 149 ++
.../development/extensions-contrib/influx.md | 67 +
.../extensions-contrib/influxdb-emitter.md | 78 +
.../extensions-contrib/kafka-emitter.md | 1 +
.../extensions-contrib/materialized-view.md | 136 ++
.../extensions-contrib/momentsketch-quantiles.md | 121 ++
.../extensions-contrib/moving-average-query.md | 364 +++++
.../extensions-contrib/opentsdb-emitter.md | 62 +
.../development/extensions-contrib/prometheus.md | 2 +-
.../extensions-contrib/rabbit-stream-ingestion.md | 238 +++
.../development/extensions-contrib/redis-cache.md | 111 ++
.../extensions-contrib/spectator-histogram.md | 457 ++++++
.../development/extensions-contrib/sqlserver.md | 56 +
.../development/extensions-contrib/statsd.md | 75 +
.../extensions-contrib/tdigestsketch-quantiles.md | 175 ++
.../development/extensions-contrib/thrift.md | 87 +
.../development/extensions-contrib/time-min-max.md | 104 ++
.../extensions-core/approximate-histograms.md | 315 ++++
docs/35.0.0/development/extensions-core/avro.md | 64 +
docs/35.0.0/development/extensions-core/azure.md | 96 ++
.../development/extensions-core/bloom-filter.md | 175 ++
docs/35.0.0/development/extensions-core/catalog.md | 456 ++++++
.../extensions-core/datasketches-extension.md | 40 +
.../extensions-core/datasketches-hll.md | 155 ++
.../extensions-core/datasketches-kll.md | 140 ++
.../extensions-core/datasketches-quantiles.md | 141 ++
.../extensions-core/datasketches-theta.md | 333 ++++
.../extensions-core/datasketches-tuple.md | 252 +++
.../development/extensions-core/druid-aws-rds.md | 38 +
.../extensions-core/druid-basic-security.md | 735 +++++++++
.../development/extensions-core/druid-kerberos.md | 10 +-
.../development/extensions-core/druid-lookups.md | 223 +++
.../development/extensions-core/druid-pac4j.md | 63 +
.../35.0.0/development/extensions-core/examples.md | 26 +
docs/35.0.0/development/extensions-core/google.md | 56 +
docs/35.0.0/development/extensions-core/hdfs.md | 166 ++
.../development/extensions-core/k8s-jobs.md | 58 +-
.../development/extensions-core/kubernetes.md | 86 +
docs/35.0.0/development/extensions-core/mysql.md | 213 +++
docs/35.0.0/development/extensions-core/orc.md | 84 +
docs/35.0.0/development/extensions-core/parquet.md | 36 +
.../development/extensions-core/postgresql.md | 155 ++
.../35.0.0/development/extensions-core/protobuf.md | 321 ++++
.../development/extensions-core/s3.md | 1 +
.../extensions-core/simple-client-sslcontext.md | 6 +-
docs/35.0.0/development/extensions-core/stats.md | 236 +++
.../development/extensions-core/test-stats.md | 122 ++
docs/35.0.0/development/javascript.md | 75 +
docs/35.0.0/development/modules.md | 409 +++++
docs/35.0.0/development/overview.md | 85 +
docs/35.0.0/development/versioning.md | 46 +
docs/35.0.0/ingestion/concurrent-append-replace.md | 153 ++
docs/{latest => 35.0.0}/ingestion/data-formats.md | 49 +-
docs/35.0.0/ingestion/faq.md | 80 +
docs/{latest => 35.0.0}/ingestion/hadoop.md | 7 +-
docs/35.0.0/ingestion/index.md | 80 +
docs/35.0.0/ingestion/ingestion-spec.md | 565 +++++++
docs/{latest => 35.0.0}/ingestion/input-sources.md | 37 +-
docs/35.0.0/ingestion/kafka-ingestion.md | 467 ++++++
docs/35.0.0/ingestion/kinesis-ingestion.md | 335 ++++
docs/35.0.0/ingestion/native-batch-firehose.md | 28 +
docs/35.0.0/ingestion/native-batch-simple-task.md | 185 +++
docs/35.0.0/ingestion/native-batch.md | 771 +++++++++
docs/35.0.0/ingestion/partitioning.md | 107 ++
docs/35.0.0/ingestion/rollup.md | 97 ++
docs/35.0.0/ingestion/schema-design.md | 316 ++++
docs/35.0.0/ingestion/schema-model.md | 58 +
docs/35.0.0/ingestion/standalone-realtime.md | 45 +
docs/35.0.0/ingestion/streaming.md | 35 +
docs/{latest => 35.0.0}/ingestion/supervisor.md | 1 +
docs/35.0.0/ingestion/tasks.md | 547 +++++++
docs/35.0.0/ingestion/tranquility.md | 30 +
docs/35.0.0/misc/papers-and-talks.md | 43 +
.../multi-stage-query/concepts.md | 15 +-
.../multi-stage-query/examples.md | 7 +-
docs/{latest => 35.0.0}/multi-stage-query/index.md | 16 +-
.../multi-stage-query/known-issues.md | 6 -
.../multi-stage-query/reference.md | 10 +-
.../multi-stage-query/security.md | 6 -
docs/35.0.0/operations/alerts.md | 37 +
docs/35.0.0/operations/auth-ldap.md | 313 ++++
docs/35.0.0/operations/auth.md | 200 +++
docs/35.0.0/operations/basic-cluster-tuning.md | 469 ++++++
docs/35.0.0/operations/clean-metadata-store.md | 233 +++
docs/35.0.0/operations/deep-storage-migration.md | 66 +
docs/{latest => 35.0.0}/operations/dump-segment.md | 2 +-
docs/35.0.0/operations/durable-storage.md | 122 ++
docs/35.0.0/operations/dynamic-config-provider.md | 78 +
docs/35.0.0/operations/export-metadata.md | 202 +++
docs/35.0.0/operations/high-availability.md | 38 +
docs/35.0.0/operations/http-compression.md | 31 +
docs/35.0.0/operations/insert-segment-to-db.md | 48 +
docs/{latest => 35.0.0}/operations/java.md | 14 +-
docs/35.0.0/operations/kubernetes.md | 34 +
docs/35.0.0/operations/metadata-migration.md | 97 ++
docs/{latest => 35.0.0}/operations/metrics.md | 23 +-
.../operations/migrate-from-firehose-ingestion.md | 207 +++
docs/35.0.0/operations/mixed-workloads.md | 214 +++
docs/{latest => 35.0.0}/operations/other-hadoop.md | 7 +-
docs/35.0.0/operations/password-provider.md | 55 +
docs/{latest => 35.0.0}/operations/pull-deps.md | 12 +-
docs/35.0.0/operations/request-logging.md | 249 +++
docs/35.0.0/operations/reset-cluster.md | 29 +
docs/35.0.0/operations/rolling-updates.md | 103 ++
docs/35.0.0/operations/rule-configuration.md | 357 ++++
docs/35.0.0/operations/security-overview.md | 304 ++++
docs/35.0.0/operations/security-user-auth.md | 174 ++
docs/35.0.0/operations/segment-optimization.md | 106 ++
docs/35.0.0/operations/single-server.md | 57 +
docs/{latest => 35.0.0}/operations/tls-support.md | 9 +-
docs/35.0.0/operations/use_sbt_to_build_fat_jar.md | 127 ++
docs/35.0.0/operations/web-console.md | 182 +++
docs/35.0.0/querying/aggregations.md | 647 ++++++++
docs/35.0.0/querying/arrays.md | 292 ++++
docs/35.0.0/querying/caching.md | 119 ++
docs/35.0.0/querying/dart.md | 145 ++
docs/35.0.0/querying/datasource.md | 501 ++++++
docs/35.0.0/querying/datasourcemetadataquery.md | 62 +
docs/{latest => 35.0.0}/querying/dimensionspecs.md | 2 +-
docs/{latest => 35.0.0}/querying/filters.md | 2 +-
docs/35.0.0/querying/geo.md | 156 ++
docs/35.0.0/querying/granularities.md | 468 ++++++
docs/35.0.0/querying/groupbyquery.md | 404 +++++
docs/35.0.0/querying/having.md | 266 +++
docs/35.0.0/querying/hll-old.md | 141 ++
docs/35.0.0/querying/joins.md | 42 +
docs/35.0.0/querying/kafka-extraction-namespace.md | 96 ++
docs/35.0.0/querying/limitspec.md | 72 +
docs/35.0.0/querying/lookups-cached-global.md | 387 +++++
docs/35.0.0/querying/lookups.md | 340 ++++
docs/{latest => 35.0.0}/querying/math-expr.md | 2 +-
docs/35.0.0/querying/multi-value-dimensions.md | 522 ++++++
docs/35.0.0/querying/multitenancy.md | 91 ++
docs/35.0.0/querying/nested-columns.md | 692 ++++++++
docs/35.0.0/querying/post-aggregations.md | 297 ++++
.../querying/query-context-reference.md | 2 +
docs/35.0.0/querying/query-context.md | 297 ++++
.../{latest => 35.0.0}/querying/query-execution.md | 3 +-
.../querying/query-from-deep-storage.md | 2 -
docs/35.0.0/querying/query-processing.md | 48 +
docs/35.0.0/querying/querying.md | 158 ++
docs/35.0.0/querying/scan-query.md | 214 +++
docs/35.0.0/querying/searchquery.md | 191 +++
docs/35.0.0/querying/segmentmetadataquery.md | 223 +++
docs/35.0.0/querying/select-query.md | 27 +
docs/35.0.0/querying/sorting-orders.md | 59 +
docs/35.0.0/querying/sql-aggregations.md | 159 ++
docs/35.0.0/querying/sql-array-functions.md | 66 +
docs/35.0.0/querying/sql-data-types.md | 162 ++
docs/{latest => 35.0.0}/querying/sql-functions.md | 64 +
docs/35.0.0/querying/sql-json-functions.md | 75 +
.../querying/sql-metadata-tables.md | 2 +
.../querying/sql-multivalue-string-functions.md | 2 +
docs/35.0.0/querying/sql-operators.md | 117 ++
.../querying/sql-query-context.md | 1 +
docs/{latest => 35.0.0}/querying/sql-scalar.md | 2 +-
docs/35.0.0/querying/sql-translation.md | 838 ++++++++++
docs/35.0.0/querying/sql-window-functions.md | 423 +++++
docs/35.0.0/querying/sql.md | 482 ++++++
docs/35.0.0/querying/timeboundaryquery.md | 63 +
docs/35.0.0/querying/timeseriesquery.md | 171 ++
docs/35.0.0/querying/tips-good-queries.md | 203 +++
docs/35.0.0/querying/topnmetricspec.md | 91 ++
docs/35.0.0/querying/topnquery.md | 264 +++
docs/35.0.0/querying/troubleshooting.md | 68 +
docs/35.0.0/querying/using-caching.md | 96 ++
docs/35.0.0/querying/virtual-columns.md | 193 +++
docs/35.0.0/release-info/migr-ansi-sql-null.md | 376 +++++
docs/35.0.0/release-info/migr-front-coded-dict.md | 122 ++
docs/35.0.0/release-info/migr-mvd-array.md | 260 +++
docs/35.0.0/release-info/migr-subquery-limit.md | 64 +
docs/35.0.0/release-info/migration-guide.md | 47 +
docs/35.0.0/release-info/release-notes.md | 450 +++++
.../release-info/upgrade-notes.md | 54 +-
docs/{latest => 35.0.0}/tutorials/cluster.md | 10 +-
docs/{latest => 35.0.0}/tutorials/docker.md | 8 +-
docs/{latest => 35.0.0}/tutorials/index.md | 26 +-
docs/35.0.0/tutorials/tutorial-append-data.md | 133 ++
.../tutorials/tutorial-batch-hadoop.md | 7 +-
docs/35.0.0/tutorials/tutorial-batch-native.md | 159 ++
.../{latest => 35.0.0}/tutorials/tutorial-batch.md | 2 +-
docs/35.0.0/tutorials/tutorial-compaction.md | 190 +++
docs/35.0.0/tutorials/tutorial-delete-data.md | 187 +++
docs/35.0.0/tutorials/tutorial-extern.md | 206 +++
.../tutorials/tutorial-ingestion-spec.md | 2 +-
docs/35.0.0/tutorials/tutorial-jdbc.md | 34 +
docs/35.0.0/tutorials/tutorial-kafka.md | 289 ++++
.../tutorials/tutorial-kerberos-hadoop.md | 4 +-
docs/35.0.0/tutorials/tutorial-latest-by.md | 233 +++
docs/35.0.0/tutorials/tutorial-msq-convert-spec.md | 176 ++
docs/35.0.0/tutorials/tutorial-msq-extern.md | 151 ++
.../tutorials/tutorial-query-deep-storage.md | 287 ++++
docs/35.0.0/tutorials/tutorial-query.md | 245 +++
docs/35.0.0/tutorials/tutorial-retention.md | 115 ++
docs/35.0.0/tutorials/tutorial-rollup.md | 162 ++
docs/35.0.0/tutorials/tutorial-sketches-theta.md | 262 +++
docs/35.0.0/tutorials/tutorial-sql-null.md | 216 +++
docs/35.0.0/tutorials/tutorial-sql-query-view.md | 197 +++
docs/35.0.0/tutorials/tutorial-transform.md | 103 ++
docs/35.0.0/tutorials/tutorial-unnest-arrays.md | 655 ++++++++
docs/35.0.0/tutorials/tutorial-update-data.md | 248 +++
docs/latest/api-reference/supervisor-api.md | 32 +-
docs/latest/configuration/extensions.md | 1 +
docs/latest/configuration/index.md | 52 +-
.../latest/data-management/automatic-compaction.md | 1 -
.../latest/design/extensions-contrib/dropwizard.md | 1 +
docs/latest/design/indexer.md | 1 +
.../extensions-contrib/druid-exact-count-bitmap.md | 452 +++++
.../extensions-contrib/kafka-emitter.md | 1 +
.../development/extensions-contrib/prometheus.md | 2 +-
.../development/extensions-core/druid-kerberos.md | 10 +-
.../latest/development/extensions-core/k8s-jobs.md | 58 +-
docs/latest/development/extensions-core/s3.md | 1 +
.../extensions-core/simple-client-sslcontext.md | 6 +-
docs/latest/ingestion/data-formats.md | 49 +-
docs/latest/ingestion/hadoop.md | 7 +-
docs/latest/ingestion/input-sources.md | 37 +-
docs/latest/ingestion/supervisor.md | 1 +
docs/latest/multi-stage-query/concepts.md | 15 +-
docs/latest/multi-stage-query/examples.md | 7 +-
docs/latest/multi-stage-query/index.md | 16 +-
docs/latest/multi-stage-query/known-issues.md | 6 -
docs/latest/multi-stage-query/reference.md | 10 +-
docs/latest/multi-stage-query/security.md | 6 -
docs/latest/operations/dump-segment.md | 2 +-
docs/latest/operations/java.md | 14 +-
docs/latest/operations/metrics.md | 23 +-
docs/latest/operations/other-hadoop.md | 7 +-
docs/latest/operations/pull-deps.md | 12 +-
docs/latest/operations/reset-cluster.md | 58 +-
docs/latest/operations/tls-support.md | 9 +-
docs/latest/querying/dimensionspecs.md | 2 +-
docs/latest/querying/filters.md | 2 +-
docs/latest/querying/math-expr.md | 2 +-
docs/latest/querying/query-context-reference.md | 2 +
docs/latest/querying/query-execution.md | 3 +-
docs/latest/querying/query-from-deep-storage.md | 2 -
docs/latest/querying/sql-functions.md | 64 +
docs/latest/querying/sql-metadata-tables.md | 2 +
.../querying/sql-multivalue-string-functions.md | 2 +
docs/latest/querying/sql-query-context.md | 1 +
docs/latest/querying/sql-scalar.md | 2 +-
docs/latest/release-info/release-notes.md | 506 +++---
docs/latest/release-info/upgrade-notes.md | 54 +-
docs/latest/tutorials/cluster.md | 10 +-
docs/latest/tutorials/docker.md | 8 +-
docs/latest/tutorials/index.md | 26 +-
docs/latest/tutorials/tutorial-batch-hadoop.md | 7 +-
docs/latest/tutorials/tutorial-batch.md | 2 +-
docs/latest/tutorials/tutorial-ingestion-spec.md | 2 +-
docs/latest/tutorials/tutorial-kerberos-hadoop.md | 4 +-
static/js/version.js | 4 +
yarn.lock | 16 +-
446 files changed, 49294 insertions(+), 694 deletions(-)
diff --git a/docs/35.0.0/api-reference/api-reference.md b/docs/35.0.0/api-reference/api-reference.md
new file mode 100644
index 000000000..dd4a4ab63
--- /dev/null
+++ b/docs/35.0.0/api-reference/api-reference.md
@@ -0,0 +1,44 @@
+---
+id: api-reference
+title: API reference
+sidebar_label: Overview
+---
+
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+
+This topic is an index to the Apache Druid API documentation.
+
+## HTTP APIs
+* [Druid SQL queries](./sql-api.md) to submit SQL queries using the Druid SQL API.
+* [SQL-based ingestion](./sql-ingestion-api.md) to submit SQL-based batch ingestion requests.
+* [JSON querying](./json-querying-api.md) to submit JSON-based native queries.
+* [Tasks](./tasks-api.md) to manage data ingestion operations.
+* [Supervisors](./supervisor-api.md) to manage supervisors for data ingestion lifecycle and data processing.
+* [Retention rules](./retention-rules-api.md) to define and manage data retention rules across datasources.
+* [Data management](./data-management-api.md) to manage data segments.
+* [Automatic compaction](./automatic-compaction-api.md) to optimize segment sizes after ingestion.
+* [Lookups](./lookups-api.md) to manage and modify key-value datasources.
+* [Service status](./service-status-api.md) to monitor components within the Druid cluster.
+* [Dynamic configuration](./dynamic-configuration-api.md) to configure the behavior of the Coordinator and Overlord processes.
+* [Legacy metadata](./legacy-metadata-api.md) to retrieve datasource metadata.
+
+## Java APIs
+* [SQL JDBC driver](./sql-jdbc.md) to connect to Druid and make Druid SQL queries using the Avatica JDBC driver.
\ No newline at end of file
diff --git a/docs/35.0.0/api-reference/automatic-compaction-api.md b/docs/35.0.0/api-reference/automatic-compaction-api.md
new file mode 100644
index 000000000..f3744a45f
--- /dev/null
+++ b/docs/35.0.0/api-reference/automatic-compaction-api.md
@@ -0,0 +1,1592 @@
+---
+id: automatic-compaction-api
+title: Automatic compaction API
+sidebar_label: Automatic compaction
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+<!--
+
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+This topic describes the status and configuration API endpoints for [automatic compaction using Coordinator duties](../data-management/automatic-compaction.md#auto-compaction-using-coordinator-duties) in Apache Druid. You can configure automatic compaction in the Druid web console or API.
+
+:::info[Experimental]
+
+Instead of the automatic compaction API, you can use the supervisor API to submit auto-compaction jobs using compaction supervisors. For more information, see [Auto-compaction using compaction supervisors](../data-management/automatic-compaction.md#auto-compaction-using-compaction-supervisors).
+
+:::
+
+In this topic, `http://ROUTER_IP:ROUTER_PORT` is a placeholder for your Router service address and port. Replace it with the information for your deployment. For example, use `http://localhost:8888` for quickstart deployments.
+
+## Manage automatic compaction
+
+### Create or update automatic compaction configuration
+
+Creates or updates the automatic compaction configuration for a datasource. Pass the automatic compaction as a JSON object in the request body.
+
+The automatic compaction configuration requires only the `dataSource` property. Druid fills all other properties with default values if not specified. See [Automatic compaction dynamic configuration](../configuration/index.md#automatic-compaction-dynamic-configuration) for configuration details.
+
+Note that this endpoint returns an HTTP `200 OK` message code even if the datasource name does not exist.
+
+#### URL
+
+`POST` `/druid/coordinator/v1/config/compaction`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully submitted auto compaction configuration*
+
+</TabItem>
+</Tabs>
+
+---
+#### Sample request
+
+The following example creates an automatic compaction configuration for the datasource `wikipedia_hour`, which was ingested with `HOUR` segment granularity. This automatic compaction configuration performs compaction on `wikipedia_hour`, resulting in compacted segments that represent a day interval of data.
+
+In this example:
+
+* `wikipedia_hour` is a datasource with `HOUR` segment granularity.
+* `skipOffsetFromLatest` is set to `PT0S`, meaning that no data is skipped.
+* `partitionsSpec` is set to the default `dynamic`, allowing Druid to dynamically determine the optimal partitioning strategy.
+* `type` is set to `index_parallel`, meaning that parallel indexing is used.
+* `segmentGranularity` is set to `DAY`, meaning that each compacted segment is a day of data.
+
+<Tabs>
+
+<TabItem value="2" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction"\
+--header 'Content-Type: application/json' \
+--data '{
+ "dataSource": "wikipedia_hour",
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "partitionsSpec": {
+ "type": "dynamic"
+ },
+ "type": "index_parallel"
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY"
+ }
+}'
+```
+
+</TabItem>
+<TabItem value="3" label="HTTP">
+
+
+```HTTP
+POST /druid/coordinator/v1/config/compaction HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 281
+
+{
+ "dataSource": "wikipedia_hour",
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "partitionsSpec": {
+ "type": "dynamic"
+ },
+ "type": "index_parallel"
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY"
+ }
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+
+### Remove automatic compaction configuration
+
+Removes the automatic compaction configuration for a datasource. This updates the compaction status of the datasource to "Not enabled."
+
+#### URL
+
+`DELETE` `/druid/coordinator/v1/config/compaction/{dataSource}`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="4" label="200 SUCCESS">
+
+
+*Successfully deleted automatic compaction configuration*
+
+</TabItem>
+<TabItem value="5" label="404 NOT FOUND">
+
+
+*Datasource does not have automatic compaction or invalid datasource name*
+
+</TabItem>
+</Tabs>
+
+---
+
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="6" label="cURL">
+
+
+```shell
+curl --request DELETE "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction/wikipedia_hour"
+```
+
+</TabItem>
+<TabItem value="7" label="HTTP">
+
+
+```HTTP
+DELETE /druid/coordinator/v1/config/compaction/wikipedia_hour HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+### Update capacity for compaction tasks
+
+:::info
+This API is now deprecated. Use [Update cluster-level compaction config](#update-cluster-level-compaction-config) instead.
+:::
+
+Updates the capacity for compaction tasks. The minimum number of compaction tasks is 1 and the maximum is 2147483647.
+
+Note that while the max compaction tasks can theoretically be set to 2147483647, the practical limit is determined by the available cluster capacity and is capped at 10% of the cluster's total capacity.
+
+#### URL
+
+`POST` `/druid/coordinator/v1/config/compaction/taskslots`
+
+#### Query parameters
+
+To limit the maximum number of compaction tasks, use the optional query parameters `ratio` and `max`:
+
+* `ratio` (optional)
+ * Type: Float
+ * Default: 0.1
+ * Limits the ratio of the total task slots to compaction task slots.
+* `max` (optional)
+ * Type: Int
+ * Default: 2147483647
+ * Limits the maximum number of task slots for compaction tasks.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="8" label="200 SUCCESS">
+
+
+*Successfully updated compaction configuration*
+
+</TabItem>
+<TabItem value="9" label="404 NOT FOUND">
+
+
+*Invalid `max` value*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="10" label="cURL">
+
+
+```shell
+curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction/taskslots?ratio=0.2&max=250000"
+```
+
+</TabItem>
+<TabItem value="11" label="HTTP">
+
+
+```HTTP
+POST /druid/coordinator/v1/config/compaction/taskslots?ratio=0.2&max=250000 HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+## View automatic compaction configuration
+
+### Get all automatic compaction configurations
+
+Retrieves all automatic compaction configurations. Returns a `compactionConfigs` object containing the active automatic compaction configurations of all datasources.
+
+You can use this endpoint to retrieve `compactionTaskSlotRatio` and `maxCompactionTaskSlots` values for managing resource allocation of compaction tasks.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/config/compaction`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="12" label="200 SUCCESS">
+
+
+*Successfully retrieved automatic compaction configurations*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="13" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction"
+```
+
+</TabItem>
+<TabItem value="14" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/config/compaction HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "compactionConfigs": [
+ {
+ "dataSource": "wikipedia_hour",
+ "taskPriority": 25,
+ "inputSegmentSizeBytes": 100000000000000,
+ "maxRowsPerSegment": null,
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "maxRowsInMemory": null,
+ "appendableIndexSpec": null,
+ "maxBytesInMemory": null,
+ "maxTotalRows": null,
+ "splitHintSpec": null,
+ "partitionsSpec": {
+ "type": "dynamic",
+ "maxRowsPerSegment": 5000000,
+ "maxTotalRows": null
+ },
+ "indexSpec": null,
+ "indexSpecForIntermediatePersists": null,
+ "maxPendingPersists": null,
+ "pushTimeout": null,
+ "segmentWriteOutMediumFactory": null,
+ "maxNumConcurrentSubTasks": null,
+ "maxRetry": null,
+ "taskStatusCheckPeriodMs": null,
+ "chatHandlerTimeout": null,
+ "chatHandlerNumRetries": null,
+ "maxNumSegmentsToMerge": null,
+ "totalNumMergeTasks": null,
+ "maxColumnsToMerge": null,
+ "type": "index_parallel",
+ "forceGuaranteedRollup": false
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY",
+ "queryGranularity": null,
+ "rollup": null
+ },
+ "dimensionsSpec": null,
+ "metricsSpec": null,
+ "transformSpec": null,
+ "ioConfig": null,
+ "taskContext": null
+ },
+ {
+ "dataSource": "wikipedia",
+ "taskPriority": 25,
+ "inputSegmentSizeBytes": 100000000000000,
+ "maxRowsPerSegment": null,
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "maxRowsInMemory": null,
+ "appendableIndexSpec": null,
+ "maxBytesInMemory": null,
+ "maxTotalRows": null,
+ "splitHintSpec": null,
+ "partitionsSpec": {
+ "type": "dynamic",
+ "maxRowsPerSegment": 5000000,
+ "maxTotalRows": null
+ },
+ "indexSpec": null,
+ "indexSpecForIntermediatePersists": null,
+ "maxPendingPersists": null,
+ "pushTimeout": null,
+ "segmentWriteOutMediumFactory": null,
+ "maxNumConcurrentSubTasks": null,
+ "maxRetry": null,
+ "taskStatusCheckPeriodMs": null,
+ "chatHandlerTimeout": null,
+ "chatHandlerNumRetries": null,
+ "maxNumSegmentsToMerge": null,
+ "totalNumMergeTasks": null,
+ "maxColumnsToMerge": null,
+ "type": "index_parallel",
+ "forceGuaranteedRollup": false
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY",
+ "queryGranularity": null,
+ "rollup": null
+ },
+ "dimensionsSpec": null,
+ "metricsSpec": null,
+ "transformSpec": null,
+ "ioConfig": null,
+ "taskContext": null
+ }
+ ],
+ "compactionTaskSlotRatio": 0.1,
+ "maxCompactionTaskSlots": 2147483647,
+
+}
+```
+</details>
+
+### Get automatic compaction configuration
+
+Retrieves the automatic compaction configuration for a datasource.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/config/compaction/{dataSource}`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="15" label="200 SUCCESS">
+
+
+*Successfully retrieved configuration for datasource*
+
+</TabItem>
+<TabItem value="16" label="404 NOT FOUND">
+
+
+*Invalid datasource or datasource does not have automatic compaction enabled*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example retrieves the automatic compaction configuration for datasource `wikipedia_hour`.
+
+<Tabs>
+
+<TabItem value="17" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction/wikipedia_hour"
+```
+
+</TabItem>
+<TabItem value="18" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/config/compaction/wikipedia_hour HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "dataSource": "wikipedia_hour",
+ "taskPriority": 25,
+ "inputSegmentSizeBytes": 100000000000000,
+ "maxRowsPerSegment": null,
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "maxRowsInMemory": null,
+ "appendableIndexSpec": null,
+ "maxBytesInMemory": null,
+ "maxTotalRows": null,
+ "splitHintSpec": null,
+ "partitionsSpec": {
+ "type": "dynamic",
+ "maxRowsPerSegment": 5000000,
+ "maxTotalRows": null
+ },
+ "indexSpec": null,
+ "indexSpecForIntermediatePersists": null,
+ "maxPendingPersists": null,
+ "pushTimeout": null,
+ "segmentWriteOutMediumFactory": null,
+ "maxNumConcurrentSubTasks": null,
+ "maxRetry": null,
+ "taskStatusCheckPeriodMs": null,
+ "chatHandlerTimeout": null,
+ "chatHandlerNumRetries": null,
+ "maxNumSegmentsToMerge": null,
+ "totalNumMergeTasks": null,
+ "maxColumnsToMerge": null,
+ "type": "index_parallel",
+ "forceGuaranteedRollup": false
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY",
+ "queryGranularity": null,
+ "rollup": null
+ },
+ "dimensionsSpec": null,
+ "metricsSpec": null,
+ "transformSpec": null,
+ "ioConfig": null,
+ "taskContext": null
+}
+```
+</details>
+
+### Get automatic compaction configuration history
+
+Retrieves the history of the automatic compaction configuration for a datasource. Returns an empty list if the datasource does not exist or there is no compaction history for the datasource.
+
+The response contains a list of objects with the following keys:
+* `globalConfig`: A JSON object containing automatic compaction configuration that applies to the entire cluster.
+* `compactionConfig`: A JSON object containing the automatic compaction configuration for the datasource.
+* `auditInfo`: A JSON object containing information about the change made, such as `author`, `comment` or `ip`.
+* `auditTime`: The date and time when the change was made.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/config/compaction/{dataSource}/history`
+
+#### Query parameters
+* `interval` (optional)
+ * Type: ISO-8601
+ * Limits the results within a specified interval. Use `/` as the delimiter for the interval string.
+* `count` (optional)
+ * Type: Int
+ * Limits the number of results.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="19" label="200 SUCCESS">
+
+
+*Successfully retrieved configuration history*
+
+</TabItem>
+<TabItem value="20" label="400 BAD REQUEST">
+
+
+*Invalid `count` value*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="21" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction/wikipedia_hour/history"
+```
+
+</TabItem>
+<TabItem value="22" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/config/compaction/wikipedia_hour/history HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+[
+ {
+ "globalConfig": {
+ "compactionTaskSlotRatio": 0.1,
+ "maxCompactionTaskSlots": 2147483647,
+ "compactionPolicy": {
+ "type": "newestSegmentFirst",
+ "priorityDatasource": "wikipedia"
+ },
+ "useSupervisors": true,
+ "engine": "native"
+ },
+ "compactionConfig": {
+ "dataSource": "wikipedia_hour",
+ "taskPriority": 25,
+ "inputSegmentSizeBytes": 100000000000000,
+ "maxRowsPerSegment": null,
+ "skipOffsetFromLatest": "P1D",
+ "tuningConfig": null,
+ "granularitySpec": {
+ "segmentGranularity": "DAY",
+ "queryGranularity": null,
+ "rollup": null
+ },
+ "dimensionsSpec": null,
+ "metricsSpec": null,
+ "transformSpec": null,
+ "ioConfig": null,
+ "taskContext": null
+ },
+ "auditInfo": {
+ "author": "",
+ "comment": "",
+ "ip": "127.0.0.1"
+ },
+ "auditTime": "2023-07-31T18:15:19.302Z"
+ },
+ {
+ "globalConfig": {
+ "compactionTaskSlotRatio": 0.1,
+ "maxCompactionTaskSlots": 2147483647,
+ "compactionPolicy": {
+ "type": "newestSegmentFirst"
+ },
+ "useSupervisors": false,
+ "engine": "native"
+ },
+ "compactionConfig": {
+ "dataSource": "wikipedia_hour",
+ "taskPriority": 25,
+ "inputSegmentSizeBytes": 100000000000000,
+ "maxRowsPerSegment": null,
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "maxRowsInMemory": null,
+ "appendableIndexSpec": null,
+ "maxBytesInMemory": null,
+ "maxTotalRows": null,
+ "splitHintSpec": null,
+ "partitionsSpec": {
+ "type": "dynamic",
+ "maxRowsPerSegment": 5000000,
+ "maxTotalRows": null
+ },
+ "indexSpec": null,
+ "indexSpecForIntermediatePersists": null,
+ "maxPendingPersists": null,
+ "pushTimeout": null,
+ "segmentWriteOutMediumFactory": null,
+ "maxNumConcurrentSubTasks": null,
+ "maxRetry": null,
+ "taskStatusCheckPeriodMs": null,
+ "chatHandlerTimeout": null,
+ "chatHandlerNumRetries": null,
+ "maxNumSegmentsToMerge": null,
+ "totalNumMergeTasks": null,
+ "maxColumnsToMerge": null,
+ "type": "index_parallel",
+ "forceGuaranteedRollup": false
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY",
+ "queryGranularity": null,
+ "rollup": null
+ },
+ "dimensionsSpec": null,
+ "metricsSpec": null,
+ "transformSpec": null,
+ "ioConfig": null,
+ "taskContext": null
+ },
+ "auditInfo": {
+ "author": "",
+ "comment": "",
+ "ip": "127.0.0.1"
+ },
+ "auditTime": "2023-07-31T18:16:16.362Z"
+ }
+]
+```
+</details>
+
+## View automatic compaction status
+
+### Get segments awaiting compaction
+
+Returns the total size of segments awaiting compaction for a given datasource. Returns a 404 response if a datasource does not have automatic compaction enabled.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/compaction/progress?dataSource={dataSource}`
+
+#### Query parameter
+* `dataSource` (required)
+ * Type: String
+ * Name of the datasource for this status information.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="23" label="200 SUCCESS">
+
+
+*Successfully retrieved segment size awaiting compaction*
+
+</TabItem>
+<TabItem value="24" label="404 NOT FOUND">
+
+
+*Unknown datasource name or datasource does not have automatic compaction enabled*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example retrieves the remaining segments to be compacted for datasource `wikipedia_hour`.
+
+<Tabs>
+
+<TabItem value="25" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/compaction/progress?dataSource=wikipedia_hour"
+```
+
+</TabItem>
+<TabItem value="26" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/compaction/progress?dataSource=wikipedia_hour HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "remainingSegmentSize": 7615837
+}
+```
+</details>
+
+
+### Get compaction status and statistics
+
+Retrieves an array of `latestStatus` objects representing the status and statistics from the latest automatic compaction run for all datasources with automatic compaction enabled.
+
+#### Compaction status response
+
+The `latestStatus` object has the following properties:
+* `dataSource`: Name of the datasource for this status information.
+* `scheduleStatus`: Automatic compaction scheduling status. Possible values are `NOT_ENABLED` and `RUNNING`. Returns `RUNNING ` if the datasource has an active automatic compaction configuration submitted. Otherwise, returns `NOT_ENABLED`.
+* `bytesAwaitingCompaction`: Total bytes of this datasource waiting to be compacted by the automatic compaction (only consider intervals/segments that are eligible for automatic compaction).
+* `bytesCompacted`: Total bytes of this datasource that are already compacted with the spec set in the automatic compaction configuration.
+* `bytesSkipped`: Total bytes of this datasource that are skipped (not eligible for automatic compaction) by the automatic compaction.
+* `segmentCountAwaitingCompaction`: Total number of segments of this datasource waiting to be compacted by the automatic compaction (only consider intervals/segments that are eligible for automatic compaction).
+* `segmentCountCompacted`: Total number of segments of this datasource that are already compacted with the spec set in the automatic compaction configuration.
+* `segmentCountSkipped`: Total number of segments of this datasource that are skipped (not eligible for automatic compaction) by the automatic compaction.
+* `intervalCountAwaitingCompaction`: Total number of intervals of this datasource waiting to be compacted by the automatic compaction (only consider intervals/segments that are eligible for automatic compaction).
+* `intervalCountCompacted`: Total number of intervals of this datasource that are already compacted with the spec set in the automatic compaction configuration.
+* `intervalCountSkipped`: Total number of intervals of this datasource that are skipped (not eligible for automatic compaction) by the automatic compaction.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/compaction/status`
+
+#### Query parameters
+* `dataSource` (optional)
+ * Type: String
+ * Filter the result by name of a specific datasource.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="27" label="200 SUCCESS">
+
+
+*Successfully retrieved `latestStatus` object*
+
+</TabItem>
+</Tabs>
+
+---
+#### Sample request
+
+<Tabs>
+
+<TabItem value="28" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/compaction/status"
+```
+
+</TabItem>
+<TabItem value="29" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/compaction/status HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "latestStatus": [
+ {
+ "dataSource": "wikipedia_api",
+ "scheduleStatus": "RUNNING",
+ "bytesAwaitingCompaction": 0,
+ "bytesCompacted": 0,
+ "bytesSkipped": 64133616,
+ "segmentCountAwaitingCompaction": 0,
+ "segmentCountCompacted": 0,
+ "segmentCountSkipped": 8,
+ "intervalCountAwaitingCompaction": 0,
+ "intervalCountCompacted": 0,
+ "intervalCountSkipped": 1
+ },
+ {
+ "dataSource": "wikipedia_hour",
+ "scheduleStatus": "RUNNING",
+ "bytesAwaitingCompaction": 0,
+ "bytesCompacted": 5998634,
+ "bytesSkipped": 0,
+ "segmentCountAwaitingCompaction": 0,
+ "segmentCountCompacted": 1,
+ "segmentCountSkipped": 0,
+ "intervalCountAwaitingCompaction": 0,
+ "intervalCountCompacted": 1,
+ "intervalCountSkipped": 0
+ }
+ ]
+}
+```
+</details>
+
+## [Experimental] Unified Compaction APIs
+
+This section describes the new unified compaction APIs which can be used regardless of whether compaction supervisors are enabled (i.e. `useSupervisors` is `true`) or not in the compaction dynamic config.
+
+- If compaction supervisors are disabled, the APIs read or write the compaction dynamic config, same as the Coordinator-based compaction APIs above.
+- If compaction supervisors are enabled, the APIs read or write the corresponding compaction supervisors. In conjunction with the APIs described below, the supervisor APIs may also be used to read or write the compaction supervisors as they offer greater flexibility and also serve information related to supervisor and task statuses.
+
+### Update cluster-level compaction config
+
+Updates cluster-level configuration for compaction tasks which applies to all datasources, unless explicitly overridden in the datasource compaction config.
+This includes the following fields:
+
+|Config|Description|Default value|
+|------|-----------|-------------|
+|`compactionTaskSlotRatio`|Ratio of number of slots taken up by compaction tasks to the number of total task slots across all workers.|0.1|
+|`maxCompactionTaskSlots`|Maximum number of task slots that can be taken up by compaction tasks and sub-tasks. Minimum number of task slots available for compaction is 1. When using MSQ engine or Native engine with range partitioning, a single compaction job occupies more than one task slot. In this case, the minimum is 2 so that at least one compaction job can always run in the cluster.|2147483647 (i.e. total task slots)|
+|`compactionPolicy`|Policy to choose intervals for compaction. Currently, the only supported policy is [Newest segment first](#compaction-policy-newestsegmentfirst).|Newest segment first|
+|`useSupervisors`|Whether compaction should be run on Overlord using supervisors instead of Coordinator duties.|false|
+|`engine`|Engine used for running compaction tasks, unless overridden in the datasource-level compaction config. Possible values are `native` and `msq`. `msq` engine can be used for compaction only if `useSupervisors` is `true`.|`native`|
+
+#### Compaction policy `newestSegmentFirst`
+
+|Field|Description|Default value|
+|-----|-----------|-------------|
+|`type`|This must always be `newestSegmentFirst`||
+|`priorityDatasource`|Datasource to prioritize for compaction. The intervals of this datasource are chosen for compaction before the intervals of any other datasource. Within this datasource, the intervals are prioritized based on the chosen compaction policy.|None|
+
+
+#### URL
+
+`POST` `/druid/indexer/v1/compaction/config/cluster`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="8" label="200 SUCCESS">
+
+
+*Successfully updated compaction configuration*
+
+</TabItem>
+<TabItem value="9" label="404 NOT FOUND">
+
+
+*Invalid `max` value*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="10" label="cURL">
+
+
+```shell
+curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/compaction/cluster" \
+--header 'Content-Type: application/json' \
+--data '{
+ "compactionTaskSlotRatio": 0.5,
+ "maxCompactionTaskSlots": 1500,
+ "compactionPolicy": {
+ "type": "newestSegmentFirst",
+ "priorityDatasource": "wikipedia"
+ },
+ "useSupervisors": true,
+ "engine": "msq"
+}'
+
+```
+
+</TabItem>
+<TabItem value="11" label="HTTP">
+
+
+```HTTP
+POST /druid/indexer/v1/compaction/config/cluster HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+
+{
+ "compactionTaskSlotRatio": 0.5,
+ "maxCompactionTaskSlots": 1500,
+ "compactionPolicy": {
+ "type": "newestSegmentFirst",
+ "priorityDatasource": "wikipedia"
+ },
+ "useSupervisors": true,
+ "engine": "msq"
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+### Get cluster-level compaction config
+
+Retrieves cluster-level configuration for compaction tasks which applies to all datasources, unless explicitly overridden in the datasource compaction config.
+This includes all the fields listed in [Update cluster-level compaction config](#update-cluster-level-compaction-config).
+
+#### URL
+
+`GET` `/druid/indexer/v1/compaction/config/cluster`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="8" label="200 SUCCESS">
+
+*Successfully retrieved cluster compaction configuration*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="10" label="cURL">
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/compaction/config/cluster"
+```
+</TabItem>
+
+<TabItem value="11" label="HTTP">
+
+```HTTP
+GET /druid/indexer/v1/compaction/config/cluster HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "compactionTaskSlotRatio": 0.5,
+ "maxCompactionTaskSlots": 1500,
+ "compactionPolicy": {
+ "type": "newestSegmentFirst",
+ "priorityDatasource": "wikipedia"
+ },
+ "useSupervisors": true,
+ "engine": "msq"
+}
+```
+
+</details>
+
+### Get automatic compaction configurations for all datasources
+
+Retrieves all datasource compaction configurations.
+
+#### URL
+
+`GET` `/druid/indexer/v1/compaction/config/datasources`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="12" label="200 SUCCESS">
+
+
+*Successfully retrieved automatic compaction configurations*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="13" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/compaction/config/datasources"
+```
+
+</TabItem>
+<TabItem value="14" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/compaction/config/datasources HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "compactionConfigs": [
+ {
+ "dataSource": "wikipedia_hour",
+ "taskPriority": 25,
+ "inputSegmentSizeBytes": 100000000000000,
+ "maxRowsPerSegment": null,
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "maxRowsInMemory": null,
+ "appendableIndexSpec": null,
+ "maxBytesInMemory": null,
+ "maxTotalRows": null,
+ "splitHintSpec": null,
+ "partitionsSpec": {
+ "type": "dynamic",
+ "maxRowsPerSegment": 5000000,
+ "maxTotalRows": null
+ },
+ "indexSpec": null,
+ "indexSpecForIntermediatePersists": null,
+ "maxPendingPersists": null,
+ "pushTimeout": null,
+ "segmentWriteOutMediumFactory": null,
+ "maxNumConcurrentSubTasks": null,
+ "maxRetry": null,
+ "taskStatusCheckPeriodMs": null,
+ "chatHandlerTimeout": null,
+ "chatHandlerNumRetries": null,
+ "maxNumSegmentsToMerge": null,
+ "totalNumMergeTasks": null,
+ "maxColumnsToMerge": null,
+ "type": "index_parallel",
+ "forceGuaranteedRollup": false
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY",
+ "queryGranularity": null,
+ "rollup": null
+ },
+ "dimensionsSpec": null,
+ "metricsSpec": null,
+ "transformSpec": null,
+ "ioConfig": null,
+ "taskContext": null
+ },
+ {
+ "dataSource": "wikipedia",
+ "taskPriority": 25,
+ "inputSegmentSizeBytes": 100000000000000,
+ "maxRowsPerSegment": null,
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "maxRowsInMemory": null,
+ "appendableIndexSpec": null,
+ "maxBytesInMemory": null,
+ "maxTotalRows": null,
+ "splitHintSpec": null,
+ "partitionsSpec": {
+ "type": "dynamic",
+ "maxRowsPerSegment": 5000000,
+ "maxTotalRows": null
+ },
+ "indexSpec": null,
+ "indexSpecForIntermediatePersists": null,
+ "maxPendingPersists": null,
+ "pushTimeout": null,
+ "segmentWriteOutMediumFactory": null,
+ "maxNumConcurrentSubTasks": null,
+ "maxRetry": null,
+ "taskStatusCheckPeriodMs": null,
+ "chatHandlerTimeout": null,
+ "chatHandlerNumRetries": null,
+ "maxNumSegmentsToMerge": null,
+ "totalNumMergeTasks": null,
+ "maxColumnsToMerge": null,
+ "type": "index_parallel",
+ "forceGuaranteedRollup": false
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY",
+ "queryGranularity": null,
+ "rollup": null
+ },
+ "dimensionsSpec": null,
+ "metricsSpec": null,
+ "transformSpec": null,
+ "ioConfig": null,
+ "taskContext": null
+ }
+ ]
+}
+```
+</details>
+
+### Get automatic compaction configuration for a datasource
+
+Retrieves the automatic compaction configuration for a datasource.
+
+#### URL
+
+`GET` `/druid/indexer/v1/compaction/config/datasources/{dataSource}`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="15" label="200 SUCCESS">
+
+
+*Successfully retrieved configuration for datasource*
+
+</TabItem>
+<TabItem value="16" label="404 NOT FOUND">
+
+
+*Invalid datasource or datasource does not have automatic compaction enabled*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example retrieves the automatic compaction configuration for datasource `wikipedia_hour`.
+
+<Tabs>
+
+<TabItem value="17" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/compaction/config/datasources/wikipedia_hour"
+```
+
+</TabItem>
+<TabItem value="18" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/compaction/config/datasources/wikipedia_hour HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "dataSource": "wikipedia_hour",
+ "taskPriority": 25,
+ "inputSegmentSizeBytes": 100000000000000,
+ "maxRowsPerSegment": null,
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "maxRowsInMemory": null,
+ "appendableIndexSpec": null,
+ "maxBytesInMemory": null,
+ "maxTotalRows": null,
+ "splitHintSpec": null,
+ "partitionsSpec": {
+ "type": "dynamic",
+ "maxRowsPerSegment": 5000000,
+ "maxTotalRows": null
+ },
+ "indexSpec": null,
+ "indexSpecForIntermediatePersists": null,
+ "maxPendingPersists": null,
+ "pushTimeout": null,
+ "segmentWriteOutMediumFactory": null,
+ "maxNumConcurrentSubTasks": null,
+ "maxRetry": null,
+ "taskStatusCheckPeriodMs": null,
+ "chatHandlerTimeout": null,
+ "chatHandlerNumRetries": null,
+ "maxNumSegmentsToMerge": null,
+ "totalNumMergeTasks": null,
+ "maxColumnsToMerge": null,
+ "type": "index_parallel",
+ "forceGuaranteedRollup": false
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY",
+ "queryGranularity": null,
+ "rollup": null
+ },
+ "dimensionsSpec": null,
+ "metricsSpec": null,
+ "transformSpec": null,
+ "ioConfig": null,
+ "taskContext": null
+}
+```
+</details>
+
+### Create or update automatic compaction configuration for a datasource
+
+Creates or updates the automatic compaction configuration for a datasource. Pass the automatic compaction as a JSON object in the request body.
+
+The automatic compaction configuration requires only the `dataSource` property. Druid fills all other properties with default values if not specified. See [Automatic compaction dynamic configuration](../configuration/index.md#automatic-compaction-dynamic-configuration) for configuration details.
+
+Note that this endpoint returns an HTTP `200 OK` message code even if the datasource name does not exist.
+
+#### URL
+
+`POST` `/druid/indexer/v1/compaction/config/datasources/wikipedia_hour`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully submitted auto compaction configuration*
+
+</TabItem>
+</Tabs>
+
+---
+#### Sample request
+
+The following example creates an automatic compaction configuration for the datasource `wikipedia_hour`, which was ingested with `HOUR` segment granularity. This automatic compaction configuration performs compaction on `wikipedia_hour`, resulting in compacted segments that represent a day interval of data.
+
+In this example:
+
+* `wikipedia_hour` is a datasource with `HOUR` segment granularity.
+* `skipOffsetFromLatest` is set to `PT0S`, meaning that no data is skipped.
+* `partitionsSpec` is set to the default `dynamic`, allowing Druid to dynamically determine the optimal partitioning strategy.
+* `type` is set to `index_parallel`, meaning that parallel indexing is used.
+* `segmentGranularity` is set to `DAY`, meaning that each compacted segment is a day of data.
+
+<Tabs>
+
+<TabItem value="2" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/compaction/config/datasources/wikipedia_hour"\
+--header 'Content-Type: application/json' \
+--data '{
+ "dataSource": "wikipedia_hour",
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "partitionsSpec": {
+ "type": "dynamic"
+ },
+ "type": "index_parallel"
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY"
+ }
+}'
+```
+
+</TabItem>
+<TabItem value="3" label="HTTP">
+
+
+```HTTP
+POST /druid/indexer/v1/compaction/config/datasources/wikipedia_hour HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 281
+
+{
+ "dataSource": "wikipedia_hour",
+ "skipOffsetFromLatest": "PT0S",
+ "tuningConfig": {
+ "partitionsSpec": {
+ "type": "dynamic"
+ },
+ "type": "index_parallel"
+ },
+ "granularitySpec": {
+ "segmentGranularity": "DAY"
+ }
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+
+### Delete automatic compaction configuration for a datasource
+
+Removes the automatic compaction configuration for a datasource. This updates the compaction status of the datasource to "Not enabled."
+
+#### URL
+
+`DELETE` `/druid/indexer/v1/compaction/config/datasources/{dataSource}`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="4" label="200 SUCCESS">
+
+
+*Successfully deleted automatic compaction configuration*
+
+</TabItem>
+<TabItem value="5" label="404 NOT FOUND">
+
+
+*Datasource does not have automatic compaction or invalid datasource name*
+
+</TabItem>
+</Tabs>
+
+---
+
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="6" label="cURL">
+
+
+```shell
+curl --request DELETE "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/compaction/config/datasources/wikipedia_hour"
+```
+
+</TabItem>
+<TabItem value="7" label="HTTP">
+
+
+```HTTP
+DELETE /druid/indexer/v1/compaction/config/wikipedia_hour HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+### Get compaction status for all datasources
+
+Retrieves an array of `latestStatus` objects representing the status and statistics from the latest automatic compaction run for all the datasources to which the user has read access.
+The response payload is in the same format as [Compaction status response](#compaction-status-response).
+
+#### URL
+
+`GET` `/druid/indexer/v1/compaction/status/datasources`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="27" label="200 SUCCESS">
+
+
+*Successfully retrieved `latestStatus` object*
+
+</TabItem>
+</Tabs>
+
+---
+#### Sample request
+
+<Tabs>
+
+<TabItem value="28" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/compaction/status/datasources"
+```
+
+</TabItem>
+<TabItem value="29" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/compaction/status/datasources HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "latestStatus": [
+ {
+ "dataSource": "wikipedia_api",
+ "scheduleStatus": "RUNNING",
+ "bytesAwaitingCompaction": 0,
+ "bytesCompacted": 0,
+ "bytesSkipped": 64133616,
+ "segmentCountAwaitingCompaction": 0,
+ "segmentCountCompacted": 0,
+ "segmentCountSkipped": 8,
+ "intervalCountAwaitingCompaction": 0,
+ "intervalCountCompacted": 0,
+ "intervalCountSkipped": 1
+ },
+ {
+ "dataSource": "wikipedia_hour",
+ "scheduleStatus": "RUNNING",
+ "bytesAwaitingCompaction": 0,
+ "bytesCompacted": 5998634,
+ "bytesSkipped": 0,
+ "segmentCountAwaitingCompaction": 0,
+ "segmentCountCompacted": 1,
+ "segmentCountSkipped": 0,
+ "intervalCountAwaitingCompaction": 0,
+ "intervalCountCompacted": 1,
+ "intervalCountSkipped": 0
+ }
+ ]
+}
+```
+</details>
+
+### Get compaction status for a single datasource
+
+Retrieves the latest status from the latest automatic compaction run for a datasource. The response payload is in the same format as [Compaction status response](#compaction-status-response) with zero or one entry.
+
+#### URL
+
+`GET` `/druid/indexer/v1/compaction/status/datasources/{dataSource}`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="27" label="200 SUCCESS">
+
+
+*Successfully retrieved `latestStatus` object*
+
+</TabItem>
+</Tabs>
+
+---
+#### Sample request
+
+<Tabs>
+
+<TabItem value="28" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/compaction/status/datasources/wikipedia_hour"
+```
+
+</TabItem>
+<TabItem value="29" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/compaction/status/datasources/wikipedia_hour HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "latestStatus": [
+ {
+ "dataSource": "wikipedia_hour",
+ "scheduleStatus": "RUNNING",
+ "bytesAwaitingCompaction": 0,
+ "bytesCompacted": 5998634,
+ "bytesSkipped": 0,
+ "segmentCountAwaitingCompaction": 0,
+ "segmentCountCompacted": 1,
+ "segmentCountSkipped": 0,
+ "intervalCountAwaitingCompaction": 0,
+ "intervalCountCompacted": 1,
+ "intervalCountSkipped": 0
+ }
+ ]
+}
+```
+</details>
diff --git a/docs/35.0.0/api-reference/data-management-api.md b/docs/35.0.0/api-reference/data-management-api.md
new file mode 100644
index 000000000..fe37c6a81
--- /dev/null
+++ b/docs/35.0.0/api-reference/data-management-api.md
@@ -0,0 +1,607 @@
+---
+id: data-management-api
+title: Data management API
+sidebar_label: Data management
+---
+
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+This topic describes the data management API endpoints for Apache Druid.
+This includes information on how to mark segments as used or unused and delete them from Druid.
+
+In this topic, `http://ROUTER_IP:ROUTER_PORT` is a placeholder for your Router service address and port.
+Replace it with the information for your deployment.
+For example, use `http://localhost:8888` for quickstart deployments.
+
+:::info
+- Coordinator APIs for data management are now deprecated. Use new APIs served by the Overlord instead.
+- Do not use these APIs while an indexing task or kill task is in progress for the same datasource and interval.
+:::
+
+## Segment management
+
+You can mark segments as used by sending POST requests to the datasource, but the Coordinator may subsequently mark segments as unused if they meet any configured [drop rules](../operations/rule-configuration.md#drop-rules).
+Even if these API requests update segments to used, you still need to configure a [load rule](../operations/rule-configuration.md#load-rules) to load them onto Historical processes.
+
+When you use these APIs concurrently with an indexing task or a kill task, the behavior is undefined.
+Druid terminates some segments and marks others as used.
+Furthermore, it is possible that all segments could be unused, yet an indexing task might still be able to read data from these segments and complete successfully.
+
+All of the following APIs, except [Segment deletion](#segment-deletion) are served by the Overlord as it is the service responsible for performing actions on segment metadata on behalf of indexing tasks.
+This makes it the single source of truth for segment metadata, thus ensuring a consistent view across the Druid cluster and allowing the Overlord to cache metadata to improve performance.
+
+### Segment IDs
+
+You must provide segment IDs when using many of the endpoints described in this topic.
+For information on segment IDs, see [Segment identification](../design/segments.md#segment-identification).
+For information on finding segment IDs in the web console, see [Segments](../operations/web-console.md#segments).
+
+### Mark a single segment unused
+
+Marks the state of a segment as unused, using the segment ID.
+This is a "soft delete" of the segment from Historicals.
+To undo this action, [mark the segment used](#mark-a-single-segment-as-used).
+
+Note that this endpoint returns an HTTP `200 OK` response code even if the segment ID or datasource doesn't exist.
+Check the response payload to confirm if any segment was actually updated.
+
+#### URL
+
+`DELETE` `/druid/indexer/v1/datasources/{datasource}/segments/{segmentId}`
+
+#### Header
+
+The following headers are required for this request:
+
+```json
+Content-Type: application/json
+Accept: application/json, text/plain
+```
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully updated segment*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example updates the segment `wikipedia_hour_2015-09-12T16:00:00.000Z_2015-09-12T17:00:00.000Z_2023-08-10T04:12:03.860Z` from datasource `wikipedia_hour` as `unused`.
+
+<Tabs>
+
+<TabItem value="2" label="cURL">
+
+
+```shell
+curl --request DELETE "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/datasources/wikipedia_hour/segments/wikipedia_hour_2015-09-12T16:00:00.000Z_2015-09-12T17:00:00.000Z_2023-08-10T04:12:03.860Z" \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json, text/plain'
+```
+
+</TabItem>
+<TabItem value="3" label="HTTP">
+
+
+```HTTP
+DELETE /druid/indexer/v1/datasources/wikipedia_hour/segments/wikipedia_hour_2015-09-12T16:00:00.000Z_2015-09-12T17:00:00.000Z_2023-08-10T04:12:03.860Z HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Accept: application/json, text/plain
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "segmentStateChanged": true,
+ "numChangedSegments": 1
+}
+```
+</details>
+
+### Mark a single segment as used
+
+Marks the state of a segment as used, using the segment ID.
+
+#### URL
+
+`POST` `/druid/indexer/v1/datasources/{datasource}/segments/{segmentId}`
+
+#### Header
+
+The following headers are required for this request:
+
+```json
+Content-Type: application/json
+Accept: application/json, text/plain
+```
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="4" label="200 SUCCESS">
+
+
+*Successfully updated segments*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example updates the segment with ID `wikipedia_hour_2015-09-12T18:00:00.000Z_2015-09-12T19:00:00.000Z_2023-08-10T04:12:03.860Z` to used.
+
+<Tabs>
+
+<TabItem value="5" label="cURL">
+
+
+```shell
+curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/datasources/wikipedia_hour/segments/wikipedia_hour_2015-09-12T18:00:00.000Z_2015-09-12T19:00:00.000Z_2023-08-10T04:12:03.860Z" \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json, text/plain'
+```
+
+</TabItem>
+<TabItem value="6" label="HTTP">
+
+
+```HTTP
+POST /druid/indexer/v1/datasources/wikipedia_hour/segments/wikipedia_hour_2015-09-12T18:00:00.000Z_2015-09-12T19:00:00.000Z_2023-08-10T04:12:03.860Z HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Accept: application/json, text/plain
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "segmentStateChanged": true,
+ "numChangedSegments": 1
+}
+```
+</details>
+
+### Mark a group of segments unused
+
+Marks the state of a group of segments as unused, using an array of segment IDs or an interval.
+Pass the array of segment IDs or interval as a JSON object in the request body.
+
+For the interval, specify the start and end times as ISO 8601 strings to identify segments inclusive of the start time and exclusive of the end time.
+Optionally, specify an array of segment versions with interval. Druid updates only the segments completely contained
+within the specified interval that match the optional list of versions; partially overlapping segments are not affected.
+
+#### URL
+
+`POST` `/druid/indexer/v1/datasources/{datasource}/markUnused`
+
+#### Request body
+
+The group of segments is sent as a JSON request payload that accepts the following properties:
+
+|Property|Description|Required|Example|
+|--------|-----------|--------|-------|
+|`interval`|ISO 8601 segments interval.|Yes, if `segmentIds` is not specified.|`"2015-09-12T03:00:00.000Z/2015-09-12T05:00:00.000Z"`|
+|`segmentIds`|List of segment IDs.|Yes, if `interval` is not specified.|`["segmentId1", "segmentId2"]`|
+|`versions`|List of segment versions. Must be provided with `interval`.|No.|`["2024-03-14T16:00:04.086Z", ""2024-03-12T16:00:04.086Z"]`|
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="7" label="200 SUCCESS">
+
+
+*Successfully updated segments*
+
+</TabItem>
+<TabItem value="8" label="204 NO CONTENT">
+
+
+*Invalid datasource name*
+
+</TabItem>
+<TabItem value="9" label="400 BAD REQUEST">
+
+
+*Invalid request payload*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example marks two segments from the `wikipedia_hour` datasource unused based on their segment IDs.
+
+<Tabs>
+
+<TabItem value="10" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/datasources/wikipedia_hour/markUnused" \
+--header 'Content-Type: application/json' \
+--data '{
+ "segmentIds": [
+ "wikipedia_hour_2015-09-12T14:00:00.000Z_2015-09-12T15:00:00.000Z_2023-08-10T04:12:03.860Z",
+ "wikipedia_hour_2015-09-12T04:00:00.000Z_2015-09-12T05:00:00.000Z_2023-08-10T04:12:03.860Z"
+ ]
+}'
+```
+
+</TabItem>
+<TabItem value="11" label="HTTP">
+
+
+```HTTP
+POST /druid/indexer/v1/datasources/wikipedia_hour/markUnused HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 230
+
+{
+ "segmentIds": [
+ "wikipedia_hour_2015-09-12T14:00:00.000Z_2015-09-12T15:00:00.000Z_2023-08-10T04:12:03.860Z",
+ "wikipedia_hour_2015-09-12T04:00:00.000Z_2015-09-12T05:00:00.000Z_2023-08-10T04:12:03.860Z"
+ ]
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "numChangedSegments": 2
+}
+```
+</details>
+
+### Mark a group of segments used
+
+Marks the state of a group of segments as used, using an array of segment IDs or an interval.
+Pass the array of segment IDs or interval as a JSON object in the request body.
+
+For the interval, specify the start and end times as ISO 8601 strings to identify segments inclusive of the start time and exclusive of the end time.
+Optionally, specify an array of segment versions with interval. Druid updates only the segments completely contained
+within the specified interval that match the optional list of versions; partially overlapping segments are not affected.
+
+#### URL
+
+`POST` `/druid/indexer/v1/datasources/{datasource}/markUsed`
+
+#### Request body
+
+The group of segments is sent as a JSON request payload that accepts the following properties:
+
+|Property|Description|Required|Example|
+|--------|-----------|--------|-------|
+|`interval`|ISO 8601 segments interval.|Yes, if `segmentIds` is not specified.|`"2015-09-12T03:00:00.000Z/2015-09-12T05:00:00.000Z"`|
+|`segmentIds`|List of segment IDs.|Yes, if `interval` is not specified.|`["segmentId1", "segmentId2"]`|
+|`versions`|List of segment versions. Must be provided with `interval`.|No.|`["2024-03-14T16:00:04.086Z", ""2024-03-12T16:00:04.086Z"]`|
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="12" label="200 SUCCESS">
+
+
+*Successfully updated segments*
+
+</TabItem>
+<TabItem value="13" label="204 NO CONTENT">
+
+
+*Invalid datasource name*
+
+</TabItem>
+<TabItem value="14" label="400 BAD REQUEST">
+
+
+*Invalid request payload*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example marks two segments from the `wikipedia_hour` datasource used based on their segment IDs.
+
+<Tabs>
+
+<TabItem value="15" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/datasources/wikipedia_hour/markUsed" \
+--header 'Content-Type: application/json' \
+--data '{
+ "segmentIds": [
+ "wikipedia_hour_2015-09-12T14:00:00.000Z_2015-09-12T15:00:00.000Z_2023-08-10T04:12:03.860Z",
+ "wikipedia_hour_2015-09-12T04:00:00.000Z_2015-09-12T05:00:00.000Z_2023-08-10T04:12:03.860Z"
+ ]
+}'
+```
+
+</TabItem>
+<TabItem value="16" label="HTTP">
+
+
+```HTTP
+POST /druid/indexer/v1/datasources/wikipedia_hour/markUsed HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 230
+
+{
+ "segmentIds": [
+ "wikipedia_hour_2015-09-12T14:00:00.000Z_2015-09-12T15:00:00.000Z_2023-08-10T04:12:03.860Z",
+ "wikipedia_hour_2015-09-12T04:00:00.000Z_2015-09-12T05:00:00.000Z_2023-08-10T04:12:03.860Z"
+ ]
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "numChangedSegments": 2
+}
+```
+</details>
+
+### Mark all segments unused
+
+Marks the state of all segments of a datasource as unused.
+This action performs a "soft delete" of the segments from Historicals.
+
+Note that this endpoint returns an HTTP `200 OK` response code even if the datasource doesn't exist.
+Check the response payload to confirm if any segment was actually updated.
+
+#### URL
+
+`DELETE` `/druid/indexer/v1/datasources/{datasource}`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="17" label="200 SUCCESS">
+
+
+*Successfully updated segments*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="18" label="cURL">
+
+
+```shell
+curl --request DELETE "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/datasources/wikipedia_hour"
+```
+
+</TabItem>
+<TabItem value="19" label="HTTP">
+
+
+```HTTP
+DELETE /druid/indexer/v1/datasources/wikipedia_hour HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "numChangedSegments": 24
+}
+```
+</details>
+
+### Mark all non-overshadowed segments used
+
+Marks the state of all unused segments of a datasource as used given that they are not already overshadowed by other segments.
+The endpoint returns the number of changed segments.
+
+Note that this endpoint returns an HTTP `200 OK` response code even if the datasource doesn't exist.
+Check the response payload to get the number of segments actually updated.
+
+#### URL
+
+`POST` `/druid/indexer/v1/datasources/{datasource}`
+
+#### Header
+
+The following headers are required for this request:
+
+```json
+Content-Type: application/json
+Accept: application/json, text/plain
+```
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="20" label="200 SUCCESS">
+
+
+*Successfully updated segments*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example updates all unused segments of `wikipedia_hour` to used.
+`wikipedia_hour` contains one unused segment eligible to be marked as used.
+
+<Tabs>
+
+<TabItem value="21" label="cURL">
+
+
+```shell
+curl --request POST "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/datasources/wikipedia_hour" \
+--header 'Content-Type: application/json' \
+--header 'Accept: application/json, text/plain'
+```
+
+</TabItem>
+<TabItem value="22" label="HTTP">
+
+
+```HTTP
+POST /druid/indexer/v1/datasources/wikipedia_hour HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Accept: application/json, text/plain
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "numChangedSegments": 1
+}
+```
+</details>
+
+## Segment deletion
+
+### Permanently delete segments
+
+The DELETE endpoint sends a [kill task](../ingestion/tasks.md) for a given interval and datasource. The interval value is an ISO 8601 string delimited by `_`. This request permanently deletes all metadata for unused segments and removes them from deep storage.
+
+Note that this endpoint returns an HTTP `200 OK` response code even if the datasource doesn't exist.
+
+This endpoint supersedes the deprecated endpoint: `DELETE /druid/coordinator/v1/datasources/{datasource}?kill=true&interval={interval}`
+
+#### URL
+
+`DELETE` `/druid/coordinator/v1/datasources/{datasource}/intervals/{interval}`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="23" label="200 SUCCESS">
+
+
+*Successfully sent kill task*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example sends a kill task to permanently delete segments in the datasource `wikipedia_hour` from the interval `2015-09-12` to `2015-09-13`.
+
+<Tabs>
+
+<TabItem value="24" label="cURL">
+
+
+```shell
+curl --request DELETE "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/datasources/wikipedia_hour/intervals/2015-09-12_2015-09-13"
+```
+
+</TabItem>
+<TabItem value="25" label="HTTP">
+
+
+```HTTP
+DELETE /druid/coordinator/v1/datasources/wikipedia_hour/intervals/2015-09-12_2015-09-13 HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `200 OK` and an empty response body.
diff --git a/docs/35.0.0/api-reference/dynamic-configuration-api.md b/docs/35.0.0/api-reference/dynamic-configuration-api.md
new file mode 100644
index 000000000..cad61e4b8
--- /dev/null
+++ b/docs/35.0.0/api-reference/dynamic-configuration-api.md
@@ -0,0 +1,665 @@
+---
+id: dynamic-configuration-api
+title: Dynamic configuration API
+sidebar_label: Dynamic configuration
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+<!--
+
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+This document describes the API endpoints to retrieve and manage dynamic configurations for the [Coordinator](../design/coordinator.md) and [Overlord](../design/overlord.md) in Apache Druid.
+
+In this topic, `http://ROUTER_IP:ROUTER_PORT` is a placeholder for your Router service address and port.
+Replace it with the information for your deployment.
+For example, use `http://localhost:8888` for quickstart deployments.
+
+## Coordinator dynamic configuration
+
+The Coordinator has dynamic configurations to tune certain behavior on the fly, without requiring a service restart.
+For information on the supported properties, see [Coordinator dynamic configuration](../configuration/index.md#dynamic-configuration).
+
+### Get dynamic configuration
+
+Retrieves the current Coordinator dynamic configuration. Returns a JSON object with the dynamic configuration properties.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/config`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully retrieved dynamic configuration*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="2" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config"
+```
+
+</TabItem>
+<TabItem value="3" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/config HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+<summary>View the response</summary>
+
+```json
+{
+ "millisToWaitBeforeDeleting": 900000,
+ "maxSegmentsToMove": 100,
+ "replicantLifetime": 15,
+ "replicationThrottleLimit": 500,
+ "balancerComputeThreads": 1,
+ "killDataSourceWhitelist": [],
+ "killPendingSegmentsSkipList": [],
+ "maxSegmentsInNodeLoadingQueue": 500,
+ "decommissioningNodes": [],
+ "decommissioningMaxPercentOfMaxSegmentsToMove": 70,
+ "pauseCoordination": false,
+ "replicateAfterLoadTimeout": false,
+ "maxNonPrimaryReplicantsToLoad": 2147483647,
+ "useRoundRobinSegmentAssignment": true,
+ "smartSegmentLoading": true,
+ "debugDimensions": null,
+ "turboLoadingNodes": [],
+ "cloneServers": {}
+
+}
+```
+
+</details>
+
+### Update dynamic configuration
+
+Submits a JSON-based dynamic configuration spec to the Coordinator.
+For information on the supported properties, see [Dynamic configuration](../configuration/index.md#dynamic-configuration).
+
+#### URL
+
+`POST` `/druid/coordinator/v1/config`
+
+#### Header parameters
+
+The endpoint supports a set of optional header parameters to populate the `author` and `comment` fields in the configuration history.
+
+* `X-Druid-Author`
+ * Type: String
+ * Author of the configuration change.
+* `X-Druid-Comment`
+ * Type: String
+ * Description for the update.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="4" label="200 SUCCESS">
+
+
+*Successfully updated dynamic configuration*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="5" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config" \
+--header 'Content-Type: application/json' \
+--data '{
+ "millisToWaitBeforeDeleting": 900000,
+ "maxSegmentsToMove": 5,
+ "percentOfSegmentsToConsiderPerMove": 100,
+ "useBatchedSegmentSampler": true,
+ "replicantLifetime": 15,
+ "replicationThrottleLimit": 10,
+ "balancerComputeThreads": 1,
+ "emitBalancingStats": true,
+ "killDataSourceWhitelist": [],
+ "killPendingSegmentsSkipList": [],
+ "maxSegmentsInNodeLoadingQueue": 100,
+ "decommissioningNodes": [],
+ "decommissioningMaxPercentOfMaxSegmentsToMove": 70,
+ "pauseCoordination": false,
+ "replicateAfterLoadTimeout": false,
+ "maxNonPrimaryReplicantsToLoad": 2147483647,
+ "useRoundRobinSegmentAssignment": true,
+ "turboLoadingNodes": [],
+ "cloneServers": {}
+}'
+```
+
+</TabItem>
+<TabItem value="6" label="HTTP">
+
+
+```HTTP
+POST /druid/coordinator/v1/config HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 683
+
+{
+ "millisToWaitBeforeDeleting": 900000,
+ "maxSegmentsToMove": 5,
+ "percentOfSegmentsToConsiderPerMove": 100,
+ "useBatchedSegmentSampler": true,
+ "replicantLifetime": 15,
+ "replicationThrottleLimit": 10,
+ "balancerComputeThreads": 1,
+ "emitBalancingStats": true,
+ "killDataSourceWhitelist": [],
+ "killPendingSegmentsSkipList": [],
+ "maxSegmentsInNodeLoadingQueue": 100,
+ "decommissioningNodes": [],
+ "decommissioningMaxPercentOfMaxSegmentsToMove": 70,
+ "pauseCoordination": false,
+ "replicateAfterLoadTimeout": false,
+ "maxNonPrimaryReplicantsToLoad": 2147483647,
+ "useRoundRobinSegmentAssignment": true,
+ "turboLoadingNodes": [],
+ "cloneServers": {}
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+### Get dynamic configuration history
+
+Retrieves the history of changes to Coordinator dynamic configuration over an interval of time. Returns an empty array if there are no history records available.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/config/history`
+
+#### Query parameters
+
+The endpoint supports a set of optional query parameters to filter results.
+
+* `interval`
+ * Type: String
+ * Limit the results to the specified time interval in ISO 8601 format delimited with `/`. For example, `2023-07-13/2023-07-19`. The default interval is one week. You can change this period by setting `druid.audit.manager.auditHistoryMillis` in the `runtime.properties` file for the Coordinator.
+
+* `count`
+ * Type: Integer
+ * Limit the number of results to the last `n` entries.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="7" label="200 SUCCESS">
+
+
+*Successfully retrieved history*
+
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example retrieves the dynamic configuration history between `2022-07-13` and `2024-07-19`. The response is limited to 10 entries.
+
+<Tabs>
+
+<TabItem value="8" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/config/history?interval=2022-07-13%2F2024-07-19&count=10"
+```
+
+</TabItem>
+<TabItem value="9" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/config/history?interval=2022-07-13/2024-07-19&count=10 HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+[
+ {
+ "key": "coordinator.config",
+ "type": "coordinator.config",
+ "auditInfo": {
+ "author": "",
+ "comment": "",
+ "ip": "127.0.0.1"
+ },
+ "payload": "{\"millisToWaitBeforeDeleting\":900000,\"maxSegmentsToMove\":5,\"replicantLifetime\":15,\"replicationThrottleLimit\":10,\"balancerComputeThreads\":1,\"killDataSourceWhitelist\":[],\"killPendingSegmentsSkipList\":[],\"maxSegmentsInNodeLoadingQueue\":100,\"decommissioningNodes\":[],\"decommissioningMaxPercentOfMaxSegmentsToMove\":70,\"pauseCoordination\":false,\"replicateAfterLoadTimeout\":false,\"maxNonPrimaryReplicantsToLoad\":2147483647,\"useRoundRobinSegmentAssignme [...]
+ "auditTime": "2023-10-03T20:59:51.622Z"
+ }
+]
+```
+</details>
+
+## Overlord dynamic configuration
+
+The Overlord has dynamic configurations to tune how Druid assigns tasks to workers.
+For information on the supported properties, see [Overlord dynamic configuration](../configuration/index.md#overlord-dynamic-configuration).
+
+### Get dynamic configuration
+
+Retrieves the current Overlord dynamic configuration.
+Returns a JSON object with the dynamic configuration properties.
+Returns an empty response body if there is no current Overlord dynamic configuration.
+
+#### URL
+
+`GET` `/druid/indexer/v1/worker`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="10" label="200 SUCCESS">
+
+
+*Successfully retrieved dynamic configuration*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="11" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/worker"
+```
+
+</TabItem>
+<TabItem value="12" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/worker HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "type": "default",
+ "selectStrategy": {
+ "type": "fillCapacityWithCategorySpec",
+ "workerCategorySpec": {
+ "categoryMap": {},
+ "strong": true
+ }
+ },
+ "autoScaler": null
+}
+```
+
+</details>
+
+### Update dynamic configuration
+
+Submits a JSON-based dynamic configuration spec to the Overlord.
+For information on the supported properties, see [Overlord dynamic configuration](../configuration/index.md#overlord-dynamic-configuration).
+
+#### URL
+
+`POST` `/druid/indexer/v1/worker`
+
+#### Header parameters
+
+The endpoint supports a set of optional header parameters to populate the `author` and `comment` fields in the configuration history.
+
+* `X-Druid-Author`
+ * Type: String
+ * Author of the configuration change.
+* `X-Druid-Comment`
+ * Type: String
+ * Description for the update.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="13" label="200 SUCCESS">
+
+
+*Successfully updated dynamic configuration*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="14" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/worker" \
+--header 'Content-Type: application/json' \
+--data '{
+ "type": "default",
+ "selectStrategy": {
+ "type": "fillCapacityWithCategorySpec",
+ "workerCategorySpec": {
+ "categoryMap": {},
+ "strong": true
+ }
+ },
+ "autoScaler": null
+}'
+```
+
+</TabItem>
+<TabItem value="15" label="HTTP">
+
+
+```HTTP
+POST /druid/indexer/v1/worker HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 196
+
+{
+ "type": "default",
+ "selectStrategy": {
+ "type": "fillCapacityWithCategorySpec",
+ "workerCategorySpec": {
+ "categoryMap": {},
+ "strong": true
+ }
+ },
+ "autoScaler": null
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+### Get dynamic configuration history
+
+Retrieves the history of changes to Overlord dynamic configuration over an interval of time. Returns an empty array if there are no history records available.
+
+#### URL
+
+`GET` `/druid/indexer/v1/worker/history`
+
+#### Query parameters
+
+The endpoint supports a set of optional query parameters to filter results.
+
+* `interval`
+ * Type: String
+ * Limit the results to the specified time interval in ISO 8601 format delimited with `/`. For example, `2023-07-13/2023-07-19`. The default interval is one week. You can change this period by setting `druid.audit.manager.auditHistoryMillis` in the `runtime.properties` file for the Overlord.
+
+* `count`
+ * Type: Integer
+ * Limit the number of results to the last `n` entries.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="16" label="200 SUCCESS">
+
+
+*Successfully retrieved history*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example retrieves the dynamic configuration history between `2022-07-13` and `2024-07-19`. The response is limited to 10 entries.
+
+<Tabs>
+
+<TabItem value="17" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/worker/history?interval=2022-07-13%2F2024-07-19&count=10"
+```
+
+</TabItem>
+<TabItem value="18" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/worker/history?interval=2022-07-13%2F2024-07-19&count=10 HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+[
+ {
+ "key": "worker.config",
+ "type": "worker.config",
+ "auditInfo": {
+ "author": "",
+ "comment": "",
+ "ip": "127.0.0.1"
+ },
+ "payload": "{\"type\":\"default\",\"selectStrategy\":{\"type\":\"fillCapacityWithCategorySpec\",\"workerCategorySpec\":{\"categoryMap\":{},\"strong\":true}},\"autoScaler\":null}",
+ "auditTime": "2023-10-03T21:49:49.991Z"
+ }
+]
+```
+
+</details>
+
+### Get an array of worker nodes in the cluster
+
+Returns an array of all the worker nodes in the cluster along with its corresponding metadata.
+
+`GET` `/druid/indexer/v1/workers`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="19" label="200 SUCCESS">
+
+
+*Successfully retrieved worker nodes*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="20" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/workers"
+```
+
+</TabItem>
+<TabItem value="21" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/workers HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+[
+ {
+ "worker": {
+ "scheme": "http",
+ "host": "localhost:8091",
+ "ip": "198.51.100.0",
+ "capacity": 2,
+ "version": "0",
+ "category": "_default_worker_category"
+ },
+ "currCapacityUsed": 0,
+ "currParallelIndexCapacityUsed": 0,
+ "availabilityGroups": [],
+ "runningTasks": [],
+ "lastCompletedTaskTime": "2023-09-29T19:13:05.505Z",
+ "blacklistedUntil": null
+ }
+]
+```
+
+</details>
+
+### Get scaling events
+
+Returns Overlord scaling events if autoscaling runners are in use.
+Returns an empty response body if there are no Overlord scaling events.
+
+#### URL
+
+`GET` `/druid/indexer/v1/scaling`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="22" label="200 SUCCESS">
+
+
+*Successfully retrieved scaling events*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="23" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/scaling"
+```
+
+</TabItem>
+<TabItem value="24" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/scaling HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns a `200 OK` response and an array of scaling events.
diff --git a/docs/35.0.0/api-reference/json-querying-api.md b/docs/35.0.0/api-reference/json-querying-api.md
new file mode 100644
index 000000000..5d03ec8b3
--- /dev/null
+++ b/docs/35.0.0/api-reference/json-querying-api.md
@@ -0,0 +1,925 @@
+---
+id: json-querying-api
+title: JSON querying API
+sidebar_label: JSON querying
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+<!--
+
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+This topic describes the API endpoints to submit JSON-based [native queries](../querying/querying.md) to Apache Druid.
+
+In this topic, `http://SERVICE_IP:SERVICE_PORT` is a placeholder for the server address of deployment and the service port. For example, on the quickstart configuration, replace `http://ROUTER_IP:ROUTER_PORT` with `http://localhost:8888`.
+
+
+## Submit a query
+
+Submits a JSON-based native query. The body of the request is the native query itself.
+
+Druid supports different types of queries for different use cases. All queries require the following properties:
+* `queryType`: A string representing the type of query. Druid supports the following native query types: `timeseries`, `topN`, `groupBy`, `timeBoundaries`, `segmentMetadata`, `datasourceMetadata`, `scan`, and `search`.
+* `dataSource`: A string or object defining the source of data to query. The most common value is the name of the datasource to query. For more information, see [Datasources](../querying/datasource.md).
+
+For additional properties based on your query type or use case, see [available native queries](../querying/querying.md#available-queries).
+
+### URL
+
+`POST` `/druid/v2`
+
+### Query parameters
+
+* `pretty` (optional)
+ * Druid returns the response in a pretty-printed format using indentation and line breaks.
+
+### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully submitted query*
+
+</TabItem>
+<TabItem value="2" label="400 BAD REQUEST">
+
+
+*Error thrown due to bad query. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "A well-defined error code.",
+ "errorMessage": "A message with additional details about the error.",
+ "errorClass": "Class of exception that caused this error.",
+ "host": "The host on which the error occurred."
+}
+```
+For more information on possible error messages, see [query execution failures](../querying/querying.md#query-execution-failures).
+
+</TabItem>
+</Tabs>
+
+---
+
+### Example query: `topN`
+
+The following example shows a `topN` query. The query analyzes the `social_media` datasource to return the top five users from the `username` dimension with the highest number of views from the `views` metric.
+
+<Tabs>
+
+<TabItem value="3" label="cURL">
+
+
+```shell
+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"
+ ]
+}'
+```
+</TabItem>
+<TabItem value="4" label="HTTP">
+
+
+```HTTP
+POST /druid/v2?pretty=null HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 336
+
+{
+ "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"
+ ]
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Example response: `topN`
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+[
+ {
+ "timestamp": "2023-07-03T18:49:54.848Z",
+ "result": [
+ {
+ "views": 11591218026,
+ "username": "gus"
+ },
+ {
+ "views": 11578638578,
+ "username": "miette"
+ },
+ {
+ "views": 11561618880,
+ "username": "leon"
+ },
+ {
+ "views": 11552609824,
+ "username": "mia"
+ },
+ {
+ "views": 11551537517,
+ "username": "milton"
+ }
+ ]
+ }
+]
+ ```
+</details>
+
+### Example query: `groupBy`
+
+The following example submits a JSON query of the `groupBy` type to retrieve the `username` with the highest votes to posts ratio from the `social_media` datasource.
+
+In this query:
+* The `upvoteSum` aggregation calculates the sum of the `upvotes` for each user.
+* The `postCount` aggregation calculates the sum of posts for each user.
+* The `upvoteToPostRatio` is a post-aggregation of the `upvoteSum` and the `postCount`, divided to calculate the ratio.
+* The result is sorted based on the `upvoteToPostRatio` in descending order.
+
+<Tabs>
+
+<TabItem value="5" label="cURL">
+
+
+```shell
+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" }
+ ]
+ }
+}'
+```
+
+</TabItem>
+
+<TabItem value="6" label="HTTP">
+
+```HTTP
+POST /druid/v2?pretty=null HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 817
+
+{
+ "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" }
+ ]
+ }
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Example response: `groupBy`
+
+<details>
+ <summary>View the response</summary>
+
+```json
+[
+ {
+ "version": "v1",
+ "timestamp": "2022-01-01T00:00:00.000Z",
+ "event": {
+ "upvoteSum": 8.0419541E7,
+ "upvoteToPostRatio": 69.53014661762697,
+ "postCount": 1156614,
+ "username": "miette"
+ }
+ }
+]
+```
+</details>
+
+## Get segment information for query
+
+Retrieves an array that contains objects with segment information, including the server locations associated with the query provided in the request body.
+
+### URL
+
+`POST` `/druid/v2/candidates`
+
+### Query parameters
+
+* `pretty` (optional)
+ * Druid returns the response in a pretty-printed format using indentation and line breaks.
+
+### Responses
+
+<Tabs>
+
+<TabItem value="7" label="200 SUCCESS">
+
+
+*Successfully retrieved segment information*
+
+</TabItem>
+<TabItem value="8" label="400 BAD REQUEST">
+
+
+*Error thrown due to bad query. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "A well-defined error code.",
+ "errorMessage": "A message with additional details about the error.",
+ "errorClass": "Class of exception that caused this error.",
+ "host": "The host on which the error occurred."
+}
+```
+
+For more information on possible error messages, see [query execution failures](../querying/querying.md#query-execution-failures).
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+<Tabs>
+
+<TabItem value="9" label="cURL">
+
+
+```shell
+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"
+ ]
+}'
+```
+
+</TabItem>
+<TabItem value="10" label="HTTP">
+
+
+```HTTP
+POST /druid/v2/candidates HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 336
+
+{
+ "queryType": "topN",
+ "dataSource": "social_media",
+ "dimension": "username",
+ "threshold": 5,
+ "metric": "views",
+ "granularity": "all",
+
+ "aggregations": [
+ {
+ "type": "longSum",
+ "name": "views",
+ "fieldName": "views"
+ }
+ ],
+ "intervals": [
+ "2020-01-01T00:00:00.000/2024-01-01T00:00:00.000"
+ ]
+}
+```
+
+</TabItem>
+</Tabs>
+
+### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+[
+ {
+ "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",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-03T19:00:00.000Z/2023-07-03T20:00:00.000Z",
+ "version": "2023-07-03T19:00:00.657Z",
+ "partitionNumber": 0,
+ "size": 6057236,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-05T21:00:00.000Z/2023-07-05T22:00:00.000Z",
+ "version": "2023-07-05T21:09:58.102Z",
+ "partitionNumber": 0,
+ "size": 223926186,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-05T21:00:00.000Z/2023-07-05T22:00:00.000Z",
+ "version": "2023-07-05T21:09:58.102Z",
+ "partitionNumber": 1,
+ "size": 20244827,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-05T22:00:00.000Z/2023-07-05T23:00:00.000Z",
+ "version": "2023-07-05T22:00:00.524Z",
+ "partitionNumber": 0,
+ "size": 104628051,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-05T22:00:00.000Z/2023-07-05T23:00:00.000Z",
+ "version": "2023-07-05T22:00:00.524Z",
+ "partitionNumber": 1,
+ "size": 1603995,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-05T23:00:00.000Z/2023-07-06T00:00:00.000Z",
+ "version": "2023-07-05T23:21:55.242Z",
+ "partitionNumber": 0,
+ "size": 181506843,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T00:00:00.000Z/2023-07-06T01:00:00.000Z",
+ "version": "2023-07-06T00:02:08.498Z",
+ "partitionNumber": 0,
+ "size": 9170974,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T00:00:00.000Z/2023-07-06T01:00:00.000Z",
+ "version": "2023-07-06T00:02:08.498Z",
+ "partitionNumber": 1,
+ "size": 23969632,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T01:00:00.000Z/2023-07-06T02:00:00.000Z",
+ "version": "2023-07-06T01:13:53.982Z",
+ "partitionNumber": 0,
+ "size": 599895,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T01:00:00.000Z/2023-07-06T02:00:00.000Z",
+ "version": "2023-07-06T01:13:53.982Z",
+ "partitionNumber": 1,
+ "size": 1627041,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T02:00:00.000Z/2023-07-06T03:00:00.000Z",
+ "version": "2023-07-06T02:55:50.701Z",
+ "partitionNumber": 0,
+ "size": 629753,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T02:00:00.000Z/2023-07-06T03:00:00.000Z",
+ "version": "2023-07-06T02:55:50.701Z",
+ "partitionNumber": 1,
+ "size": 1342360,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T04:00:00.000Z/2023-07-06T05:00:00.000Z",
+ "version": "2023-07-06T04:02:36.562Z",
+ "partitionNumber": 0,
+ "size": 2131434,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T05:00:00.000Z/2023-07-06T06:00:00.000Z",
+ "version": "2023-07-06T05:23:27.856Z",
+ "partitionNumber": 0,
+ "size": 797161,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T05:00:00.000Z/2023-07-06T06:00:00.000Z",
+ "version": "2023-07-06T05:23:27.856Z",
+ "partitionNumber": 1,
+ "size": 1176858,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T06:00:00.000Z/2023-07-06T07:00:00.000Z",
+ "version": "2023-07-06T06:46:34.638Z",
+ "partitionNumber": 0,
+ "size": 2148760,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T07:00:00.000Z/2023-07-06T08:00:00.000Z",
+ "version": "2023-07-06T07:38:28.050Z",
+ "partitionNumber": 0,
+ "size": 2040748,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T08:00:00.000Z/2023-07-06T09:00:00.000Z",
+ "version": "2023-07-06T08:27:31.407Z",
+ "partitionNumber": 0,
+ "size": 678723,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T08:00:00.000Z/2023-07-06T09:00:00.000Z",
+ "version": "2023-07-06T08:27:31.407Z",
+ "partitionNumber": 1,
+ "size": 1437866,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T10:00:00.000Z/2023-07-06T11:00:00.000Z",
+ "version": "2023-07-06T10:02:42.079Z",
+ "partitionNumber": 0,
+ "size": 1671296,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T11:00:00.000Z/2023-07-06T12:00:00.000Z",
+ "version": "2023-07-06T11:27:23.902Z",
+ "partitionNumber": 0,
+ "size": 574893,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T11:00:00.000Z/2023-07-06T12:00:00.000Z",
+ "version": "2023-07-06T11:27:23.902Z",
+ "partitionNumber": 1,
+ "size": 1427384,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T12:00:00.000Z/2023-07-06T13:00:00.000Z",
+ "version": "2023-07-06T12:52:00.846Z",
+ "partitionNumber": 0,
+ "size": 2115172,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T14:00:00.000Z/2023-07-06T15:00:00.000Z",
+ "version": "2023-07-06T14:32:33.926Z",
+ "partitionNumber": 0,
+ "size": 589108,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T14:00:00.000Z/2023-07-06T15:00:00.000Z",
+ "version": "2023-07-06T14:32:33.926Z",
+ "partitionNumber": 1,
+ "size": 1392649,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T15:00:00.000Z/2023-07-06T16:00:00.000Z",
+ "version": "2023-07-06T15:53:25.467Z",
+ "partitionNumber": 0,
+ "size": 2037851,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T16:00:00.000Z/2023-07-06T17:00:00.000Z",
+ "version": "2023-07-06T16:02:26.568Z",
+ "partitionNumber": 0,
+ "size": 230400650,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T16:00:00.000Z/2023-07-06T17:00:00.000Z",
+ "version": "2023-07-06T16:02:26.568Z",
+ "partitionNumber": 1,
+ "size": 38209056,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ },
+ {
+ "interval": "2023-07-06T17:00:00.000Z/2023-07-06T18:00:00.000Z",
+ "version": "2023-07-06T17:00:02.391Z",
+ "partitionNumber": 0,
+ "size": 211099463,
+ "locations": [
+ {
+ "name": "localhost:8083",
+ "host": "localhost:8083",
+ "hostAndTlsPort": null,
+ "maxSize": 300000000000,
+ "type": "historical",
+ "tier": "_default_tier",
+ "priority": 0
+ }
+ ]
+ }
+]
+ ```
+</details>
diff --git a/docs/35.0.0/api-reference/legacy-metadata-api.md b/docs/35.0.0/api-reference/legacy-metadata-api.md
new file mode 100644
index 000000000..d22be18a7
--- /dev/null
+++ b/docs/35.0.0/api-reference/legacy-metadata-api.md
@@ -0,0 +1,344 @@
+---
+id: legacy-metadata-api
+title: Legacy metadata API
+sidebar_label: Legacy metadata
+---
+
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+This document describes the legacy API endpoints to retrieve datasource metadata from Apache Druid. Use the [SQL metadata tables](../querying/sql-metadata-tables.md) to retrieve datasource metadata instead.
+
+## Segment loading
+
+`GET /druid/coordinator/v1/loadstatus`
+
+Returns the percentage of segments actually loaded in the cluster versus segments that should be loaded in the cluster.
+
+`GET /druid/coordinator/v1/loadstatus?simple`
+
+Returns the number of segments left to load until segments that should be loaded in the cluster are available for queries. This does not include segment replication counts.
+
+`GET /druid/coordinator/v1/loadstatus?full`
+
+Returns the number of segments left to load in each tier until segments that should be loaded in the cluster are all available. This includes segment replication counts.
+
+`GET /druid/coordinator/v1/loadstatus?full&computeUsingClusterView`
+
+Returns the number of segments not yet loaded for each tier until all segments loading in the cluster are available.
+The result includes segment replication counts. It also factors in the number of available nodes that are of a service type that can load the segment when computing the number of segments remaining to load.
+A segment is considered fully loaded when:
+- Druid has replicated it the number of times configured in the corresponding load rule.
+- Or the number of replicas for the segment in each tier where it is configured to be replicated equals the available nodes of a service type that are currently allowed to load the segment in the tier.
+
+`GET /druid/coordinator/v1/loadqueue`
+
+Returns the ids of segments to load and drop for each Historical process.
+
+`GET /druid/coordinator/v1/loadqueue?simple`
+
+Returns the number of segments to load and drop, as well as the total segment load and drop size in bytes for each Historical process.
+
+`GET /druid/coordinator/v1/loadqueue?full`
+
+Returns the serialized JSON of segments to load and drop for each Historical process.
+
+## Segment loading by datasource
+
+Note that all _interval_ query parameters are ISO 8601 strings—for example, 2016-06-27/2016-06-28.
+Also note that these APIs only guarantees that the segments are available at the time of the call.
+Segments can still become missing because of historical process failures or any other reasons afterward.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/loadstatus?forceMetadataRefresh={boolean}&interval={myInterval}`
+
+Returns the percentage of segments actually loaded in the cluster versus segments that should be loaded in the cluster for the given
+datasource over the given interval (or last 2 weeks if interval is not given). `forceMetadataRefresh` is required to be set.
+* Setting `forceMetadataRefresh` to true will force the coordinator to poll latest segment metadata from the metadata store
+(Note: `forceMetadataRefresh=true` refreshes Coordinator's metadata cache of all datasources. This can be a heavy operation in terms
+of the load on the metadata store but can be necessary to make sure that we verify all the latest segments' load status)
+* Setting `forceMetadataRefresh` to false will use the metadata cached on the coordinator from the last force/periodic refresh.
+If no used segments are found for the given inputs, this API returns `204 No Content`
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/loadstatus?simple&forceMetadataRefresh={boolean}&interval={myInterval}`
+
+Returns the number of segments left to load until segments that should be loaded in the cluster are available for the given datasource
+over the given interval (or last 2 weeks if interval is not given). This does not include segment replication counts. `forceMetadataRefresh` is required to be set.
+* Setting `forceMetadataRefresh` to true will force the coordinator to poll latest segment metadata from the metadata store
+(Note: `forceMetadataRefresh=true` refreshes Coordinator's metadata cache of all datasources. This can be a heavy operation in terms
+of the load on the metadata store but can be necessary to make sure that we verify all the latest segments' load status)
+* Setting `forceMetadataRefresh` to false will use the metadata cached on the coordinator from the last force/periodic refresh.
+If no used segments are found for the given inputs, this API returns `204 No Content`
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/loadstatus?full&forceMetadataRefresh={boolean}&interval={myInterval}`
+
+Returns the number of segments left to load in each tier until segments that should be loaded in the cluster are all available for the given datasource over the given interval (or last 2 weeks if interval is not given). This includes segment replication counts. `forceMetadataRefresh` is required to be set.
+* Setting `forceMetadataRefresh` to true will force the coordinator to poll latest segment metadata from the metadata store
+(Note: `forceMetadataRefresh=true` refreshes Coordinator's metadata cache of all datasources. This can be a heavy operation in terms
+of the load on the metadata store but can be necessary to make sure that we verify all the latest segments' load status)
+* Setting `forceMetadataRefresh` to false will use the metadata cached on the coordinator from the last force/periodic refresh.
+
+You can pass the optional query parameter `computeUsingClusterView` to factor in the available cluster services when calculating
+the segments left to load. See [Coordinator Segment Loading](#segment-loading) for details.
+If no used segments are found for the given inputs, this API returns `204 No Content`
+
+## Metadata store information
+
+:::info
+ Note: Much of this information is available in a simpler, easier-to-use form through the Druid SQL
+ [`sys.segments`](../querying/sql-metadata-tables.md#segments-table) table.
+:::
+
+`GET /druid/coordinator/v1/metadata/segments`
+
+Returns a list of all segments for each datasource enabled in the cluster.
+
+`GET /druid/coordinator/v1/metadata/segments?datasources={dataSourceName1}&datasources={dataSourceName2}`
+
+Returns a list of all segments for one or more specific datasources enabled in the cluster.
+
+`GET /druid/coordinator/v1/metadata/segments?includeOvershadowedStatus`
+
+Returns a list of all segments for each datasource with the full segment metadata and an extra field `overshadowed`.
+
+`GET /druid/coordinator/v1/metadata/segments?includeOvershadowedStatus&includeRealtimeSegments`
+
+Returns a list of all published and realtime segments for each datasource with the full segment metadata and extra fields `overshadowed`,`realtime` & `numRows`. Realtime segments are returned only when `druid.centralizedDatasourceSchema.enabled` is set on the Coordinator.
+
+`GET /druid/coordinator/v1/metadata/segments?includeOvershadowedStatus&datasources={dataSourceName1}&datasources={dataSourceName2}`
+
+Returns a list of all segments for one or more specific datasources with the full segment metadata and an extra field `overshadowed`.
+
+`GET /druid/coordinator/v1/metadata/segments?includeOvershadowedStatus&includeRealtimeSegments&datasources={dataSourceName1}&datasources={dataSourceName2}`
+
+Returns a list of all published and realtime segments for the specified datasources with the full segment metadata and extra fields `overshadwed`,`realtime` & `numRows`. Realtime segments are returned only when `druid.centralizedDatasourceSchema.enabled` is set on the Coordinator.
+
+`GET /druid/coordinator/v1/metadata/datasources`
+
+Returns a list of the names of datasources with at least one used segment in the cluster, retrieved from the metadata database. Users should call this API to get the eventual state that the system will be in.
+
+`GET /druid/coordinator/v1/metadata/datasources?includeUnused`
+
+Returns a list of the names of datasources, regardless of whether there are used segments belonging to those datasources in the cluster or not.
+
+`GET /druid/coordinator/v1/metadata/datasources?includeDisabled`
+
+Returns a list of the names of datasources, regardless of whether the datasource is disabled or not.
+
+`GET /druid/coordinator/v1/metadata/datasources?full`
+
+Returns a list of all datasources with at least one used segment in the cluster. Returns all metadata about those datasources as stored in the metadata store.
+
+`GET /druid/coordinator/v1/metadata/datasources/{dataSourceName}`
+
+Returns full metadata for a datasource as stored in the metadata store.
+
+`GET /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments`
+
+Returns a list of all segments for a datasource as stored in the metadata store.
+
+`GET /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments?full`
+
+Returns a list of all segments for a datasource with the full segment metadata as stored in the metadata store.
+
+`GET /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments/{segmentId}`
+
+Returns full segment metadata for a specific segment as stored in the metadata store, if the segment is used. If the
+segment is unused, or is unknown, a 404 response is returned.
+
+`GET /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments/{segmentId}?includeUnused=true`
+
+Returns full segment metadata for a specific segment as stored in the metadata store. If it is unknown, a 404 response
+is returned.
+
+`GET /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments`
+
+Returns a list of all segments, overlapping with any of given intervals, for a datasource as stored in the metadata store. Request body is array of string IS0 8601 intervals like `[interval1, interval2,...]`—for example, `["2012-01-01T00:00:00.000/2012-01-03T00:00:00.000", "2012-01-05T00:00:00.000/2012-01-07T00:00:00.000"]`.
+
+`GET /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments?full`
+
+Returns a list of all segments, overlapping with any of given intervals, for a datasource with the full segment metadata as stored in the metadata store. Request body is array of string ISO 8601 intervals like `[interval1, interval2,...]`—for example, `["2012-01-01T00:00:00.000/2012-01-03T00:00:00.000", "2012-01-05T00:00:00.000/2012-01-07T00:00:00.000"]`.
+
+`POST /druid/coordinator/v1/metadata/dataSourceInformation`
+
+Returns information about the specified datasources, including the datasource schema.
+
+`POST /druid/coordinator/v1/metadata/bootstrapSegments`
+
+Returns information about bootstrap segments for all datasources. The returned set includes all broadcast segments if broadcast rules are configured.
+
+<a name="coordinator-datasources"></a>
+
+## Datasources
+
+Note that all _interval_ URL parameters are ISO 8601 strings delimited by a `_` instead of a `/`—for example, `2016-06-27_2016-06-28`.
+
+`GET /druid/coordinator/v1/datasources`
+
+Returns a list of datasource names found in the cluster as seen by the coordinator. This view is updated every [`druid.coordinator.period`](../configuration/index.md#coordinator-operation).
+
+`GET /druid/coordinator/v1/datasources?simple`
+
+Returns a list of JSON objects containing the name and properties of datasources found in the cluster. Properties include segment count, total segment byte size, replicated total segment byte size, minTime, and maxTime.
+
+`GET /druid/coordinator/v1/datasources?full`
+
+Returns a list of datasource names found in the cluster with all metadata about those datasources.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}`
+
+Returns a JSON object containing the name and properties of a datasource. Properties include segment count, total segment byte size, replicated total segment byte size, minTime, and maxTime.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}?full`
+
+Returns full metadata for a datasource.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/intervals`
+
+Returns a set of segment intervals.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/intervals?simple`
+
+Returns a map of an interval to a JSON object containing the total byte size of segments and number of segments for that interval.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/intervals?full`
+
+Returns a map of an interval to a map of segment metadata to a set of server names that contain the segment for that interval.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/intervals/{interval}`
+
+Returns a set of segment ids for an interval.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/intervals/{interval}?simple`
+
+Returns a map of segment intervals contained within the specified interval to a JSON object containing the total byte size of segments and number of segments for an interval.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/intervals/{interval}?full`
+
+Returns a map of segment intervals contained within the specified interval to a map of segment metadata to a set of server names that contain the segment for an interval.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/intervals/{interval}/serverview`
+
+Returns a map of segment intervals contained within the specified interval to information about the servers that contain the segment for an interval.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/segments`
+
+Returns a list of all segments for a datasource in the cluster.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/segments?full`
+
+Returns a list of all segments for a datasource in the cluster with the full segment metadata.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/segments/{segmentId}`
+
+Returns full segment metadata for a specific segment in the cluster.
+
+`GET /druid/coordinator/v1/datasources/{dataSourceName}/tiers`
+
+Return the tiers that a datasource exists in.
+
+## Intervals
+
+Note that all _interval_ URL parameters are ISO 8601 strings delimited by a `_` instead of a `/` as in `2016-06-27_2016-06-28`.
+
+`GET /druid/coordinator/v1/intervals`
+
+Returns all intervals for all datasources with total size and count.
+
+`GET /druid/coordinator/v1/intervals/{interval}`
+
+Returns aggregated total size and count for all intervals that intersect given ISO interval.
+
+`GET /druid/coordinator/v1/intervals/{interval}?simple`
+
+Returns total size and count for each interval within given ISO interval.
+
+`GET /druid/coordinator/v1/intervals/{interval}?full`
+
+Returns total size and count for each datasource for each interval within given ISO interval.
+
+## Server information
+
+`GET /druid/coordinator/v1/servers`
+
+Returns a list of servers URLs using the format `{hostname}:{port}`. Note that
+processes that run with different types will appear multiple times with different
+ports.
+
+`GET /druid/coordinator/v1/servers?simple`
+
+Returns a list of server data objects in which each object has the following keys:
+* `host`: host URL include (`{hostname}:{port}`)
+* `type`: process type (`indexer-executor`, `historical`)
+* `currSize`: storage size currently used
+* `maxSize`: maximum storage size
+* `priority`
+* `tier`
+
+
+## Query server
+
+This section documents the API endpoints for the services that reside on Query servers (Brokers) in the suggested [three-server configuration](../design/architecture.md#druid-servers).
+
+### Broker
+
+#### Datasource information
+
+Note that all _interval_ URL parameters are ISO 8601 strings delimited by a `_` instead of a `/`
+as in `2016-06-27_2016-06-28`.
+
+:::info
+ Note: Much of this information is available in a simpler, easier-to-use form through the Druid SQL
+ [`INFORMATION_SCHEMA.TABLES`](../querying/sql-metadata-tables.md#tables-table),
+ [`INFORMATION_SCHEMA.COLUMNS`](../querying/sql-metadata-tables.md#columns-table), and
+ [`sys.segments`](../querying/sql-metadata-tables.md#segments-table) tables.
+:::
+
+`GET /druid/v2/datasources`
+
+Returns a list of queryable datasources.
+
+`GET /druid/v2/datasources/{dataSourceName}`
+
+Returns the dimensions and metrics of the datasource. Optionally, you can provide request parameter "full" to get list of served intervals with dimensions and metrics being served for those intervals. You can also provide request param "interval" explicitly to refer to a particular interval.
+
+If no interval is specified, a default interval spanning a configurable period before the current time will be used. The default duration of this interval is specified in ISO 8601 duration format via: `druid.query.segmentMetadata.defaultHistory`
+
+`GET /druid/v2/datasources/{dataSourceName}/dimensions`
+
+:::info
+ This API is deprecated and will be removed in future releases. Please use [SegmentMetadataQuery](../querying/segmentmetadataquery.md) instead
+ which provides more comprehensive information and supports all dataSource types including streaming dataSources. It's also encouraged to use [INFORMATION_SCHEMA tables](../querying/sql-metadata-tables.md)
+ if you're using SQL.
+:::
+
+Returns the dimensions of the datasource.
+
+`GET /druid/v2/datasources/{dataSourceName}/metrics`
+
+:::info
+ This API is deprecated and will be removed in future releases. Please use [SegmentMetadataQuery](../querying/segmentmetadataquery.md) instead
+ which provides more comprehensive information and supports all dataSource types including streaming dataSources. It's also encouraged to use [INFORMATION_SCHEMA tables](../querying/sql-metadata-tables.md)
+ if you're using SQL.
+:::
+
+Returns the metrics of the datasource.
+
+`GET /druid/v2/datasources/{dataSourceName}/candidates?intervals={comma-separated-intervals}&numCandidates={numCandidates}`
+
+Returns segment information lists including server locations for the given datasource and intervals. If "numCandidates" is not specified, it will return all servers for each interval.
diff --git a/docs/35.0.0/api-reference/lookups-api.md b/docs/35.0.0/api-reference/lookups-api.md
new file mode 100644
index 000000000..4a122917b
--- /dev/null
+++ b/docs/35.0.0/api-reference/lookups-api.md
@@ -0,0 +1,279 @@
+---
+id: lookups-api
+title: Lookups API
+sidebar_label: Lookups
+---
+
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+This document describes the API endpoints to configure, update, retrieve, and manage lookups for Apache Druid.
+
+## Configure lookups
+
+### Bulk update
+
+Lookups can be updated in bulk by posting a JSON object to `/druid/coordinator/v1/lookups/config`. The format of the json object is as follows:
+
+```json
+{
+ "<tierName>": {
+ "<lookupName>": {
+ "version": "<version>",
+ "lookupExtractorFactory": {
+ "type": "<someExtractorFactoryType>",
+ "<someExtractorField>": "<someExtractorValue>"
+ }
+ }
+ }
+}
+```
+
+Note that "version" is an arbitrary string assigned by the user, when making updates to existing lookup then user would need to specify a lexicographically higher version.
+
+For example, a config might look something like:
+
+```json
+{
+ "__default": {
+ "country_code": {
+ "version": "v0",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "77483": "United States"
+ }
+ }
+ },
+ "site_id": {
+ "version": "v0",
+ "lookupExtractorFactory": {
+ "type": "cachedNamespace",
+ "extractionNamespace": {
+ "type": "jdbc",
+ "connectorConfig": {
+ "createTables": true,
+ "connectURI": "jdbc:mysql:\/\/localhost:3306\/druid",
+ "user": "druid",
+ "password": "diurd"
+ },
+ "table": "lookupTable",
+ "keyColumn": "country_id",
+ "valueColumn": "country_name",
+ "tsColumn": "timeColumn"
+ },
+ "firstCacheTimeout": 120000,
+ "injective": true
+ }
+ },
+ "site_id_customer1": {
+ "version": "v0",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "847632": "Internal Use Only"
+ }
+ }
+ },
+ "site_id_customer2": {
+ "version": "v0",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "AHF77": "Home"
+ }
+ }
+ }
+ },
+ "realtime_customer1": {
+ "country_code": {
+ "version": "v0",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "77483": "United States"
+ }
+ }
+ },
+ "site_id_customer1": {
+ "version": "v0",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "847632": "Internal Use Only"
+ }
+ }
+ }
+ },
+ "realtime_customer2": {
+ "country_code": {
+ "version": "v0",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "77483": "United States"
+ }
+ }
+ },
+ "site_id_customer2": {
+ "version": "v0",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "AHF77": "Home"
+ }
+ }
+ }
+ }
+}
+```
+
+All entries in the map will UPDATE existing entries. No entries will be deleted.
+
+### Update lookup
+
+A `POST` to a particular lookup extractor factory via `/druid/coordinator/v1/lookups/config/{tier}/{id}` creates or updates that specific extractor factory.
+
+For example, a post to `/druid/coordinator/v1/lookups/config/realtime_customer1/site_id_customer1` might contain the following:
+
+```json
+{
+ "version": "v1",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "847632": "Internal Use Only"
+ }
+ }
+}
+```
+
+This will replace the `site_id_customer1` lookup in the `realtime_customer1` with the definition above.
+
+Assign a unique version identifier each time you update a lookup extractor factory. Otherwise the call will fail.
+
+### Get all lookups
+
+A `GET` to `/druid/coordinator/v1/lookups/config/all` will return all known lookup specs for all tiers.
+
+### Get lookup
+
+A `GET` to a particular lookup extractor factory is accomplished via `/druid/coordinator/v1/lookups/config/{tier}/{id}`
+
+Using the prior example, a `GET` to `/druid/coordinator/v1/lookups/config/realtime_customer2/site_id_customer2` should return
+
+```json
+{
+ "version": "v1",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "AHF77": "Home"
+ }
+ }
+}
+```
+
+### Delete lookup
+
+A `DELETE` to `/druid/coordinator/v1/lookups/config/{tier}/{id}` will remove that lookup from the cluster. If it was last lookup in the tier, then tier is deleted as well.
+
+### Delete tier
+
+A `DELETE` to `/druid/coordinator/v1/lookups/config/{tier}` will remove that tier from the cluster.
+
+### List tier names
+
+A `GET` to `/druid/coordinator/v1/lookups/config` will return a list of known tier names in the dynamic configuration.
+To discover a list of tiers currently active in the cluster in addition to ones known in the dynamic configuration, the parameter `discover=true` can be added as per `/druid/coordinator/v1/lookups/config?discover=true`.
+
+### List lookup names
+
+A `GET` to `/druid/coordinator/v1/lookups/config/{tier}` will return a list of known lookup names for that tier.
+
+These end points can be used to get the propagation status of configured lookups to processes using lookups such as Historicals.
+
+## Lookup status
+
+### List load status of all lookups
+
+`GET` `/druid/coordinator/v1/lookups/status` with optional query parameter `detailed`.
+
+### List load status of lookups in a tier
+
+`GET` `/druid/coordinator/v1/lookups/status/{tier}` with optional query parameter `detailed`.
+
+### List load status of single lookup
+
+`GET` `/druid/coordinator/v1/lookups/status/{tier}/{lookup}` with optional query parameter `detailed`.
+
+### List lookup state of all processes
+
+`GET` `/druid/coordinator/v1/lookups/nodeStatus` with optional query parameter `discover` to discover tiers advertised by other Druid nodes, or by default, returning all configured lookup tiers. The default response will also include the lookups which are loaded, being loaded, or being dropped on each node, for each tier, including the complete lookup spec. Add the optional query parameter `detailed=false` to only include the 'version' of the lookup instead of the complete spec.
+
+### List lookup state of processes in a tier
+
+`GET` `/druid/coordinator/v1/lookups/nodeStatus/{tier}`
+
+### List lookup state of single process
+
+`GET` `/druid/coordinator/v1/lookups/nodeStatus/{tier}/{host:port}`
+
+## Internal API
+
+The Peon, Router, Broker, and Historical processes all have the ability to consume lookup configuration.
+There is an internal API these processes use to list/load/drop their lookups starting at `/druid/listen/v1/lookups`.
+These follow the same convention for return values as the cluster wide dynamic configuration. Following endpoints
+can be used for debugging purposes but not otherwise.
+
+### Get lookups
+
+A `GET` to the process at `/druid/listen/v1/lookups` will return a json map of all the lookups currently active on the process.
+The return value will be a json map of the lookups to their extractor factories.
+
+```json
+{
+ "site_id_customer2": {
+ "version": "v1",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "AHF77": "Home"
+ }
+ }
+ }
+}
+```
+
+### Get lookup
+
+A `GET` to the process at `/druid/listen/v1/lookups/some_lookup_name` will return the LookupExtractorFactory for the lookup identified by `some_lookup_name`.
+The return value will be the json representation of the factory.
+
+```json
+{
+ "version": "v1",
+ "lookupExtractorFactory": {
+ "type": "map",
+ "map": {
+ "AHF77": "Home"
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/35.0.0/api-reference/retention-rules-api.md b/docs/35.0.0/api-reference/retention-rules-api.md
new file mode 100644
index 000000000..c21e546ab
--- /dev/null
+++ b/docs/35.0.0/api-reference/retention-rules-api.md
@@ -0,0 +1,562 @@
+---
+id: retention-rules-api
+title: Retention rules API
+sidebar_label: Retention rules
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+<!--
+
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+This topic describes the API endpoints for managing retention rules in Apache Druid. You can configure retention rules in the Druid web console or API.
+
+Druid uses retention rules to determine what data is retained in the cluster. Druid supports load, drop, and broadcast rules. For more information, see [Using rules to drop and retain data](../operations/rule-configuration.md).
+
+In this topic, `http://ROUTER_IP:ROUTER_PORT` is a placeholder for your Router service address and port. Replace it with the information for your deployment. For example, use `http://localhost:8888` for quickstart deployments.
+
+## Update retention rules for a datasource
+
+Updates one or more retention rules for a datasource. The request body takes an array of retention rule objects. For details on defining retention rules, see the following sources:
+
+* [Load rules](../operations/rule-configuration.md#load-rules)
+* [Drop rules](../operations/rule-configuration.md#drop-rules)
+* [Broadcast rules](../operations/rule-configuration.md#broadcast-rules)
+
+This request overwrites any existing rules for the datasource.
+Druid reads rules in the order in which they appear; for more information, see [rule structure](../operations/rule-configuration.md).
+
+Note that this endpoint returns an HTTP `200 OK` even if the datasource does not exist.
+
+### URL
+
+`POST` `/druid/coordinator/v1/rules/{dataSource}`
+
+### Header parameters
+
+The endpoint supports a set of optional header parameters to populate the `author` and `comment` fields in the `auditInfo` property for audit history.
+
+* `X-Druid-Author` (optional)
+ * Type: String
+ * A string representing the author making the configuration change.
+* `X-Druid-Comment` (optional)
+ * Type: String
+ * A string describing the update.
+
+### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully updated retention rules for specified datasource*
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+The following example sets a set of broadcast, load, and drop retention rules for the `kttm1` datasource.
+
+<Tabs>
+
+<TabItem value="2" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/rules/kttm1" \
+--header 'X-Druid-Author: doc intern' \
+--header 'X-Druid-Comment: submitted via api' \
+--header 'Content-Type: application/json' \
+--data '[
+ {
+ "type": "broadcastForever"
+ },
+ {
+ "type": "loadForever",
+ "tieredReplicants": {
+ "_default_tier": 2
+ },
+ "useDefaultTierForNull": true
+ },
+ {
+ "type": "dropByPeriod",
+ "period": "P1M"
+ }
+]'
+```
+
+</TabItem>
+<TabItem value="3" label="HTTP">
+
+
+```HTTP
+POST /druid/coordinator/v1/rules/kttm1 HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+X-Druid-Author: doc intern
+X-Druid-Comment: submitted via api
+Content-Type: application/json
+Content-Length: 273
+
+[
+ {
+ "type": "broadcastForever"
+ },
+ {
+ "type": "loadForever",
+ "tieredReplicants": {
+ "_default_tier": 1
+ },
+ "useDefaultTierForNull": true
+ },
+ {
+ "type": "dropByPeriod",
+ "period": "P1M"
+ }
+]
+```
+
+</TabItem>
+</Tabs>
+
+### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+## Update default retention rules for all datasources
+
+Updates one or more default retention rules for all datasources. Submit retention rules as an array of objects in the request body. For details on defining retention rules, see the following sources:
+
+* [Load rules](../operations/rule-configuration.md#load-rules)
+* [Drop rules](../operations/rule-configuration.md#drop-rules)
+* [Broadcast rules](../operations/rule-configuration.md#broadcast-rules)
+
+This request overwrites any existing rules for all datasources. To remove default retention rules for all datasources, submit an empty rule array in the request body. Rules are read in the order in which they appear; for more information, see [rule structure](../operations/rule-configuration.md).
+
+### URL
+
+`POST` `/druid/coordinator/v1/rules/_default`
+
+### Header parameters
+
+The endpoint supports a set of optional header parameters to populate the `author` and `comment` fields in the `auditInfo` property for audit history.
+
+* `X-Druid-Author` (optional)
+ * Type: String
+ * A string representing the author making the configuration change.
+* `X-Druid-Comment` (optional)
+ * Type: String
+ * A string describing the update.
+
+### Responses
+
+<Tabs>
+
+<TabItem value="4" label="200 SUCCESS">
+
+
+*Successfully updated default retention rules*
+
+</TabItem>
+<TabItem value="5" label="500 SERVER ERROR">
+
+
+*Error with request body*
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+The following example updates the default retention rule for all datasources with a `loadByInterval` rule.
+
+<Tabs>
+
+<TabItem value="6" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/rules/_default" \
+--header 'Content-Type: application/json' \
+--data '[
+ {
+ "type": "loadByInterval",
+ "tieredReplicants": {},
+ "useDefaultTierForNull": false,
+ "interval": "2010-01-01/2020-01-01"
+ }
+]'
+```
+
+</TabItem>
+<TabItem value="7" label="HTTP">
+
+
+```HTTP
+POST /druid/coordinator/v1/rules/_default HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 205
+
+[
+ {
+ "type": "loadByInterval",
+ "tieredReplicants": {},
+ "useDefaultTierForNull": false,
+ "interval": "2010-01-01/2020-01-01"
+ }
+]
+```
+
+</TabItem>
+</Tabs>
+
+### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty response body.
+
+## Get an array of all retention rules
+
+Retrieves all current retention rules in the cluster including the default retention rule. Returns an array of objects for each datasource and their associated retention rules.
+
+### URL
+
+`GET` `/druid/coordinator/v1/rules`
+
+### Responses
+
+<Tabs>
+
+<TabItem value="8" label="200 SUCCESS">
+
+
+*Successfully retrieved retention rules*
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+<Tabs>
+
+<TabItem value="9" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/rules"
+```
+
+</TabItem>
+<TabItem value="10" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/rules HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+{
+ "_default": [
+ {
+ "tieredReplicants": {
+ "_default_tier": 2
+ },
+ "type": "loadForever"
+ }
+ ],
+ "social_media": [
+ {
+ "interval": "2023-01-01T00:00:00.000Z/2023-02-01T00:00:00.000Z",
+ "type": "dropByInterval"
+ }
+ ],
+ "wikipedia_api": [],
+}
+ ```
+</details>
+
+## Get an array of retention rules for a datasource
+
+Retrieves an array of rule objects for a single datasource. Returns an empty array if there are no retention rules.
+
+Note that this endpoint returns an HTTP `200 OK` message code even if the datasource doesn't exist.
+
+### URL
+
+`GET` `/druid/coordinator/v1/rules/{dataSource}`
+
+### Query parameters
+
+* `full` (optional)
+ * Includes the default retention rule for the datasource in the response.
+
+### Responses
+
+<Tabs>
+
+<TabItem value="11" label="200 SUCCESS">
+
+
+*Successfully retrieved retention rules*
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+The following example retrieves the custom retention rules and default retention rules for datasource with the name `social_media`.
+
+<Tabs>
+
+<TabItem value="12" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/rules/social_media?full=null"
+```
+
+</TabItem>
+<TabItem value="13" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/rules/social_media?full=null HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+[
+ {
+ "interval": "2020-01-01T00:00:00.000Z/2022-02-01T00:00:00.000Z",
+ "type": "dropByInterval"
+ },
+ {
+ "interval": "2010-01-01T00:00:00.000Z/2020-01-01T00:00:00.000Z",
+ "tieredReplicants": {
+ "_default_tier": 2
+ },
+ "type": "loadByInterval"
+ },
+ {
+ "tieredReplicants": {
+ "_default_tier": 2
+ },
+ "type": "loadForever"
+ }
+]
+ ```
+
+</details>
+
+## Get audit history for all datasources
+
+Retrieves the audit history of rules for all datasources over an interval of time. The default interval is 1 week. You can change this period by setting `druid.audit.manager.auditHistoryMillis` in the `runtime.properties` file for the Coordinator.
+
+### URL
+
+`GET` `/druid/coordinator/v1/rules/history`
+
+### Query parameters
+
+Note that the following query parameters cannot be chained.
+
+* `interval` (optional)
+ * Type: ISO 8601.
+ * Limits the number of results to the specified time interval. Delimit with `/`. For example, `2023-07-13/2023-07-19`.
+* `count` (optional)
+ * Type: Int
+ * Limits the number of results to the last `n` entries.
+
+### Responses
+
+<Tabs>
+
+<TabItem value="14" label="200 SUCCESS">
+
+
+*Successfully retrieved audit history*
+
+</TabItem>
+<TabItem value="15" label="400 BAD REQUEST">
+
+
+*Request in the incorrect format*
+
+</TabItem>
+<TabItem value="16" label="404 NOT FOUND">
+
+
+*`count` query parameter too large*
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+The following example retrieves the audit history for all datasources from `2023-07-13` to `2023-07-19`.
+
+<Tabs>
+
+<TabItem value="17" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/rules/history?interval=2023-07-13%2F2023-07-19"
+```
+
+</TabItem>
+<TabItem value="18" label="HTTP">
+
+
+```HTTP
+GET /druid/coordinator/v1/rules/history?interval=2023-07-13/2023-07-19 HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+[
+ {
+ "key": "social_media",
+ "type": "rules",
+ "auditInfo": {
+ "author": "console",
+ "comment": "test",
+ "ip": "127.0.0.1"
+ },
+ "payload": "[{\"interval\":\"2023-01-01T00:00:00.000Z/2023-02-01T00:00:00.000Z\",\"type\":\"dropByInterval\"}]",
+ "auditTime": "2023-07-13T18:05:33.066Z"
+ },
+ {
+ "key": "social_media",
+ "type": "rules",
+ "auditInfo": {
+ "author": "console",
+ "comment": "test",
+ "ip": "127.0.0.1"
+ },
+ "payload": "[]",
+ "auditTime": "2023-07-18T18:10:21.203Z"
+ },
+ {
+ "key": "wikipedia_api",
+ "type": "rules",
+ "auditInfo": {
+ "author": "console",
+ "comment": "test",
+ "ip": "127.0.0.1"
+ },
+ "payload": "[{\"tieredReplicants\":{\"_default_tier\":2},\"type\":\"loadForever\"}]",
+ "auditTime": "2023-07-18T18:10:44.519Z"
+ },
+ {
+ "key": "wikipedia_api",
+ "type": "rules",
+ "auditInfo": {
+ "author": "console",
+ "comment": "test",
+ "ip": "127.0.0.1"
+ },
+ "payload": "[]",
+ "auditTime": "2023-07-18T18:11:02.110Z"
+ },
+ {
+ "key": "social_media",
+ "type": "rules",
+ "auditInfo": {
+ "author": "console",
+ "comment": "test",
+ "ip": "127.0.0.1"
+ },
+ "payload": "[{\"interval\":\"2023-07-03T18:49:54.848Z/2023-07-03T18:49:55.861Z\",\"type\":\"dropByInterval\"}]",
+ "auditTime": "2023-07-18T18:32:50.060Z"
+ },
+ {
+ "key": "social_media",
+ "type": "rules",
+ "auditInfo": {
+ "author": "console",
+ "comment": "test",
+ "ip": "127.0.0.1"
+ },
+ "payload": "[{\"interval\":\"2020-01-01T00:00:00.000Z/2022-02-01T00:00:00.000Z\",\"type\":\"dropByInterval\"}]",
+ "auditTime": "2023-07-18T18:34:09.657Z"
+ },
+ {
+ "key": "social_media",
+ "type": "rules",
+ "auditInfo": {
+ "author": "console",
+ "comment": "test",
+ "ip": "127.0.0.1"
+ },
+ "payload": "[{\"interval\":\"2020-01-01T00:00:00.000Z/2022-02-01T00:00:00.000Z\",\"type\":\"dropByInterval\"},{\"tieredReplicants\":{\"_default_tier\":2},\"type\":\"loadForever\"}]",
+ "auditTime": "2023-07-18T18:38:37.223Z"
+ },
+ {
+ "key": "social_media",
+ "type": "rules",
+ "auditInfo": {
+ "author": "console",
+ "comment": "test",
+ "ip": "127.0.0.1"
+ },
+ "payload": "[{\"interval\":\"2020-01-01T00:00:00.000Z/2022-02-01T00:00:00.000Z\",\"type\":\"dropByInterval\"},{\"interval\":\"2010-01-01T00:00:00.000Z/2020-01-01T00:00:00.000Z\",\"tieredReplicants\":{\"_default_tier\":2},\"type\":\"loadByInterval\"}]",
+ "auditTime": "2023-07-18T18:49:43.964Z"
+ }
+]
+ ```
+</details>
diff --git a/docs/35.0.0/api-reference/service-status-api.md b/docs/35.0.0/api-reference/service-status-api.md
new file mode 100644
index 000000000..47d2a5a6d
--- /dev/null
+++ b/docs/35.0.0/api-reference/service-status-api.md
@@ -0,0 +1,1469 @@
+---
+id: service-status-api
+title: Service status API
+sidebar_label: Service status
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+<!--
+
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+
+This document describes the API endpoints to retrieve service status, cluster information for Apache Druid.
+
+In this document, `http://SERVICE_IP:SERVICE_PORT` is a placeholder for the server address of deployment and the service port. For example, on the quickstart configuration, replace `http://ROUTER_IP:ROUTER_PORT` with `http://localhost:8888`.
+
+## Common
+
+All services support the following endpoints.
+
+You can use each endpoint with the ports for each type of service. The following table contains port addresses for a local configuration:
+
+|Service|Port address|
+| ------ | ------------ |
+| Coordinator|8081|
+| Overlord|8081|
+| Router|8888|
+| Broker|8082|
+| Historical|8083|
+| Middle Manager|8091|
+
+### Get service information
+
+Retrieves the Druid version, loaded extensions, memory used, total memory, and other useful information about the individual service.
+
+Modify the host and port for the endpoint to match the service to query. Refer to the [default service ports](#common) for the port numbers.
+
+#### URL
+
+`GET` `/status`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved service information*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="2" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/status"
+```
+
+</TabItem>
+<TabItem value="3" label="HTTP">
+
+
+```http
+GET /status HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "version": "26.0.0",
+ "modules": [
+ {
+ "name": "org.apache.druid.common.aws.AWSModule",
+ "artifact": "druid-aws-common",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.common.gcp.GcpModule",
+ "artifact": "druid-gcp-common",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.storage.hdfs.HdfsStorageDruidModule",
+ "artifact": "druid-hdfs-storage",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.indexing.kafka.KafkaIndexTaskModule",
+ "artifact": "druid-kafka-indexing-service",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.query.aggregation.datasketches.theta.SketchModule",
+ "artifact": "druid-datasketches",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.query.aggregation.datasketches.theta.oldapi.OldApiSketchModule",
+ "artifact": "druid-datasketches",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.query.aggregation.datasketches.quantiles.DoublesSketchModule",
+ "artifact": "druid-datasketches",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.query.aggregation.datasketches.tuple.ArrayOfDoublesSketchModule",
+ "artifact": "druid-datasketches",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.query.aggregation.datasketches.hll.HllSketchModule",
+ "artifact": "druid-datasketches",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.query.aggregation.datasketches.kll.KllSketchModule",
+ "artifact": "druid-datasketches",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.msq.guice.MSQExternalDataSourceModule",
+ "artifact": "druid-multi-stage-query",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.msq.guice.MSQIndexingModule",
+ "artifact": "druid-multi-stage-query",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.msq.guice.MSQDurableStorageModule",
+ "artifact": "druid-multi-stage-query",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.msq.guice.MSQServiceClientModule",
+ "artifact": "druid-multi-stage-query",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.msq.guice.MSQSqlModule",
+ "artifact": "druid-multi-stage-query",
+ "version": "26.0.0"
+ },
+ {
+ "name": "org.apache.druid.msq.guice.SqlTaskModule",
+ "artifact": "druid-multi-stage-query",
+ "version": "26.0.0"
+ }
+ ],
+ "memory": {
+ "maxMemory": 268435456,
+ "totalMemory": 268435456,
+ "freeMemory": 139060688,
+ "usedMemory": 129374768,
+ "directMemory": 134217728
+ }
+ }
+ ```
+</details>
+
+### Get service health
+
+Retrieves the online status of the individual Druid service. It is a simple health check to determine if the service is running and accessible. If online, it will always return a boolean `true` value, indicating that the service can receive API calls. This endpoint is suitable for automated health checks.
+
+Modify the host and port for the endpoint to match the service to query. Refer to the [default service ports](#common) for the port numbers.
+
+Additional checks for readiness should use the [Historical segment readiness](#get-segment-readiness) and [Broker query readiness](#get-broker-query-readiness) endpoints.
+
+#### URL
+
+`GET` `/status/health`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="4" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved service health*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="5" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/status/health"
+```
+
+</TabItem>
+<TabItem value="6" label="HTTP">
+
+
+```http
+GET /status/health HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ true
+ ```
+
+</details>
+
+
+### Get configuration properties
+
+Retrieves the current configuration properties of the individual service queried.
+
+Modify the host and port for the endpoint to match the service to query. Refer to the [default service ports](#common) for the port numbers.
+
+#### URL
+
+`GET` `/status/properties`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="7" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved service configuration properties*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="8" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/status/properties"
+```
+
+</TabItem>
+<TabItem value="9" label="HTTP">
+
+
+```http
+GET /status/properties HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+{
+ "gopherProxySet": "false",
+ "awt.toolkit": "sun.lwawt.macosx.LWCToolkit",
+ "druid.monitoring.monitors": "[\"org.apache.druid.java.util.metrics.JvmMonitor\"]",
+ "java.specification.version": "11",
+ "sun.cpu.isalist": "",
+ "druid.plaintextPort": "8888",
+ "sun.jnu.encoding": "UTF-8",
+ "druid.indexing.doubleStorage": "double",
+ "druid.metadata.storage.connector.port": "1527",
+ "java.class.path": "/Users/genericUserPath",
+ "log4j.shutdownHookEnabled": "true",
+ "java.vm.vendor": "Homebrew",
+ "sun.arch.data.model": "64",
+ "druid.extensions.loadList": "[\"druid-hdfs-storage\", \"druid-kafka-indexing-service\", \"druid-datasketches\", \"druid-multi-stage-query\"]",
+ "java.vendor.url": "https://github.com/Homebrew/homebrew-core/issues",
+ "druid.router.coordinatorServiceName": "druid/coordinator",
+ "user.timezone": "UTC",
+ "druid.global.http.eagerInitialization": "false",
+ "os.name": "Mac OS X",
+ "java.vm.specification.version": "11",
+ "sun.java.launcher": "SUN_STANDARD",
+ "user.country": "US",
+ "sun.boot.library.path": "/opt/homebrew/Cellar/openjdk@11/11.0.19/libexec/openjdk.jdk/Contents/Home/lib",
+ "sun.java.command": "org.apache.druid.cli.Main server router",
+ "http.nonProxyHosts": "local|*.local|169.254/16|*.169.254/16",
+ "jdk.debug": "release",
+ "druid.metadata.storage.connector.host": "localhost",
+ "sun.cpu.endian": "little",
+ "druid.zk.paths.base": "/druid",
+ "user.home": "/Users/genericUser",
+ "user.language": "en",
+ "java.specification.vendor": "Oracle Corporation",
+ "java.version.date": "2023-04-18",
+ "java.home": "/opt/homebrew/Cellar/openjdk@11/11.0.19/libexec/openjdk.jdk/Contents/Home",
+ "druid.service": "druid/router",
+ "druid.selectors.coordinator.serviceName": "druid/coordinator",
+ "druid.metadata.storage.connector.connectURI": "jdbc:derby://localhost:1527/var/druid/metadata.db;create=true",
+ "file.separator": "/",
+ "druid.selectors.indexing.serviceName": "druid/overlord",
+ "java.vm.compressedOopsMode": "Zero based",
+ "druid.metadata.storage.type": "derby",
+ "line.separator": "\n",
+ "druid.log.path": "/Users/genericUserPath",
+ "java.vm.specification.vendor": "Oracle Corporation",
+ "java.specification.name": "Java Platform API Specification",
+ "druid.indexer.logs.directory": "var/druid/indexing-logs",
+ "java.awt.graphicsenv": "sun.awt.CGraphicsEnvironment",
+ "druid.router.defaultBrokerServiceName": "druid/broker",
+ "druid.storage.storageDirectory": "var/druid/segments",
+ "sun.management.compiler": "HotSpot 64-Bit Tiered Compilers",
+ "ftp.nonProxyHosts": "local|*.local|169.254/16|*.169.254/16",
+ "java.runtime.version": "11.0.19+0",
+ "user.name": "genericUser",
+ "druid.indexer.logs.type": "file",
+ "druid.host": "localhost",
+ "log4j2.is.webapp": "false",
+ "path.separator": ":",
+ "os.version": "12.6.5",
+ "druid.lookup.enableLookupSyncOnStartup": "false",
+ "java.runtime.name": "OpenJDK Runtime Environment",
+ "druid.zk.service.host": "localhost",
+ "file.encoding": "UTF-8",
+ "druid.sql.planner.useGroupingSetForExactDistinct": "true",
+ "druid.router.managementProxy.enabled": "true",
+ "java.vm.name": "OpenJDK 64-Bit Server VM",
+ "java.vendor.version": "Homebrew",
+ "druid.startup.logging.logProperties": "true",
+ "java.vendor.url.bug": "https://github.com/Homebrew/homebrew-core/issues",
+ "log4j.shutdownCallbackRegistry": "org.apache.druid.common.config.Log4jShutdown",
+ "java.io.tmpdir": "var/tmp",
+ "druid.sql.enable": "true",
+ "druid.emitter.logging.logLevel": "info",
+ "java.version": "11.0.19",
+ "user.dir": "/Users/genericUser/Downloads/apache-druid-26.0.0",
+ "os.arch": "aarch64",
+ "java.vm.specification.name": "Java Virtual Machine Specification",
+ "druid.node.type": "router",
+ "java.awt.printerjob": "sun.lwawt.macosx.CPrinterJob",
+ "sun.os.patch.level": "unknown",
+ "java.util.logging.manager": "org.apache.logging.log4j.jul.LogManager",
+ "java.library.path": "/Users/genericUserPath",
+ "java.vendor": "Homebrew",
+ "java.vm.info": "mixed mode",
+ "java.vm.version": "11.0.19+0",
+ "druid.emitter": "noop",
+ "sun.io.unicode.encoding": "UnicodeBig",
+ "druid.storage.type": "local",
+ "java.class.version": "55.0",
+ "socksNonProxyHosts": "local|*.local|169.254/16|*.169.254/16",
+ "druid.server.hiddenProperties": "[\"druid.s3.accessKey\",\"druid.s3.secretKey\",\"druid.metadata.storage.connector.password\", \"password\", \"key\", \"token\", \"pwd\"]"
+}
+```
+
+</details>
+
+### Get node discovery status and cluster integration confirmation
+
+Retrieves a JSON map of the form `{"selfDiscovered": true/false}`, indicating whether the node has received a confirmation from the central node discovery mechanism (currently ZooKeeper) of the Druid cluster that the node has been added to the cluster.
+
+Only consider a Druid node "healthy" or "ready" in automated deployment/container management systems when this endpoint returns `{"selfDiscovered": true}`. Nodes experiencing network issues may become isolated and are not healthy.
+For nodes that use Zookeeper segment discovery, a response of `{"selfDiscovered": true}` indicates that the node's Zookeeper client has started receiving data from the Zookeeper cluster, enabling timely discovery of segments and other nodes.
+
+#### URL
+
+`GET` `/status/selfDiscovered/status`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="10" label="200 SUCCESS">
+
+
+<br/>
+
+*Node was successfully added to the cluster*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="11" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/status/selfDiscovered/status"
+```
+
+</TabItem>
+<TabItem value="12" label="HTTP">
+
+
+```http
+GET /status/selfDiscovered/status HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "selfDiscovered": true
+ }
+ ```
+
+</details>
+
+
+### Get node self-discovery status
+
+Returns an HTTP status code to indicate node discovery within the Druid cluster. This endpoint is similar to the `status/selfDiscovered/status` endpoint, but relies on HTTP status codes alone.
+Use this endpoint for monitoring checks that are unable to examine the response body. For example, AWS load balancer health checks.
+
+#### URL
+
+`GET` `/status/selfDiscovered`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="13" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved node status*
+
+</TabItem>
+<TabItem value="14" label="503 SERVICE UNAVAILABLE">
+
+
+<br/>
+
+*Unsuccessful node self-discovery*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="15" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/status/selfDiscovered"
+```
+
+</TabItem>
+<TabItem value="16" label="HTTP">
+
+
+```http
+GET /status/selfDiscovered HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful response to this endpoint results in an empty response body.
+
+## Coordinator
+
+### Get Coordinator leader address
+
+Retrieves the address of the current leader Coordinator of the cluster. If any request is sent to a non-leader Coordinator, the request is automatically redirected to the leader Coordinator.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/leader`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="17" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved leader Coordinator address*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="18" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/coordinator/v1/leader"
+```
+
+</TabItem>
+<TabItem value="19" label="HTTP">
+
+
+```http
+GET /druid/coordinator/v1/leader HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ http://localhost:8081
+ ```
+
+</details>
+
+### Get Coordinator leader status
+
+Retrieves a JSON object with a `leader` key. Returns `true` if this server is the current leader Coordinator of the cluster. To get the individual address of the leader Coordinator node, see the [leader endpoint](#get-coordinator-leader-address).
+
+Use this endpoint as a load balancer status check when you only want the active leader to be considered in-service at the load balancer.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/isLeader`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="20" label="200 SUCCESS">
+
+
+<br/>
+
+*Current server is the leader*
+
+</TabItem>
+<TabItem value="21" label="404 NOT FOUND">
+
+
+<br/>
+
+*Current server is not the leader*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="22" label="cURL">
+
+
+```shell
+curl "http://COORDINATOR_IP:COORDINATOR_PORT/druid/coordinator/v1/isLeader"
+```
+
+</TabItem>
+<TabItem value="23" label="HTTP">
+
+
+```http
+GET /druid/coordinator/v1/isLeader HTTP/1.1
+Host: http://COORDINATOR_IP:COORDINATOR_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "leader": true
+ }
+ ```
+
+</details>
+
+
+### Get Historical Cloning Status
+
+Retrieves the current status of Historical cloning from the Coordinator.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/config/cloneStatus`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="56" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved cloning status*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="58" label="cURL">
+
+
+```shell
+curl "http://COORDINATOR_IP:COORDINATOR_PORT/druid/coordinator/v1/config/cloneStatus"
+```
+
+</TabItem>
+<TabItem value="59" label="HTTP">
+
+
+```http
+GET /druid/coordinator/v1/config/cloneStatus HTTP/1.1
+Host: http://COORDINATOR_IP:COORDINATOR_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "cloneStatus": [
+ {
+ "sourceServer": "localhost:8089",
+ "targetServer": "localhost:8083",
+ "state": "IN_PROGRESS",
+ "segmentLoadsRemaining": 0,
+ "segmentDropsRemaining": 0,
+ "bytesToLoad": 0
+ }
+ ]
+}
+```
+
+</details>
+
+### Get Broker dynamic configuration view
+
+Retrieves the list of Brokers which have an up-to-date view of Coordinator dynamic configuration.
+
+#### URL
+
+`GET` `/druid/coordinator/v1/config/syncedBrokers`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="56" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved Broker Configuration view*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="58" label="cURL">
+
+
+```shell
+curl "http://COORDINATOR_IP:COORDINATOR_PORT/druid/coordinator/v1/config/syncedBrokers"
+```
+
+</TabItem>
+<TabItem value="59" label="HTTP">
+
+
+```http
+GET /druid/coordinator/v1/config/syncedBrokers HTTP/1.1
+Host: http://COORDINATOR_IP:COORDINATOR_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "syncedBrokers": [
+ {
+ "host": "localhost",
+ "port": 8082,
+ "lastSyncTimestampMillis": 1745756337472
+ }
+ ]
+}
+```
+
+</details>
+
+## Overlord
+
+### Get Overlord leader address
+
+Retrieves the address of the current leader Overlord of the cluster. In a cluster of multiple Overlords, only one Overlord assumes the leading role, while the remaining Overlords remain on standby.
+
+#### URL
+
+`GET` `/druid/indexer/v1/leader`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="24" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved leader Overlord address*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="25" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/leader"
+```
+
+</TabItem>
+<TabItem value="26" label="HTTP">
+
+
+```http
+GET /druid/indexer/v1/leader HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ http://localhost:8081
+ ```
+
+</details>
+
+
+### Get Overlord leader status
+
+Retrieves a JSON object with a `leader` property. The value can be `true` or `false`, indicating if this server is the current leader Overlord of the cluster. To get the individual address of the leader Overlord node, see the [leader endpoint](#get-overlord-leader-address).
+
+Use this endpoint as a load balancer status check when you only want the active leader to be considered in-service at the load balancer.
+
+#### URL
+
+`GET` `/druid/indexer/v1/isLeader`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="27" label="200 SUCCESS">
+
+
+<br/>
+
+*Current server is the leader*
+
+</TabItem>
+<TabItem value="28" label="404 NOT FOUND">
+
+
+<br/>
+
+*Current server is not the leader*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="29" label="cURL">
+
+
+```shell
+curl "http://OVERLORD_IP:OVERLORD_PORT/druid/indexer/v1/isLeader"
+```
+
+</TabItem>
+<TabItem value="30" label="HTTP">
+
+
+```http
+GET /druid/indexer/v1/isLeader HTTP/1.1
+Host: http://OVERLORD_IP:OVERLORD_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "leader": true
+ }
+ ```
+
+</details>
+
+
+## Middle Manager
+
+### Get Middle Manager state status
+
+Retrieves the enabled state of the Middle Manager process. Returns JSON object keyed by the combined `druid.host` and `druid.port` with a boolean `true` or `false` state as the value.
+
+#### URL
+
+`GET` `/druid/worker/v1/enabled`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="31" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved Middle Manager state*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="32" label="cURL">
+
+
+```shell
+curl "http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT/druid/worker/v1/enabled"
+```
+
+</TabItem>
+<TabItem value="33" label="HTTP">
+
+
+```http
+GET /druid/worker/v1/enabled HTTP/1.1
+Host: http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "localhost:8091": true
+ }
+ ```
+
+</details>
+
+### Get active tasks
+
+Retrieves a list of active tasks being run on the Middle Manager. Returns JSON list of task ID strings. Note that for normal usage, you should use the `/druid/indexer/v1/tasks` [Tasks API](./tasks-api.md) endpoint or one of the task state specific variants instead.
+
+#### URL
+
+`GET` `/druid/worker/v1/tasks`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="34" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved active tasks*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="35" label="cURL">
+
+
+```shell
+curl "http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT/druid/worker/v1/tasks"
+```
+
+</TabItem>
+<TabItem value="36" label="HTTP">
+
+
+```http
+GET /druid/worker/v1/tasks HTTP/1.1
+Host: http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ [
+ "index_parallel_wikipedia_mgchefio_2023-06-13T22:18:05.360Z"
+ ]
+ ```
+
+</details>
+
+### Get task log
+
+Retrieves task log output stream by task ID. For normal usage, you should use the `/druid/indexer/v1/task/{taskId}/log`
+[Tasks API](./tasks-api.md) endpoint instead.
+
+#### URL
+
+`GET` `/druid/worker/v1/task/{taskId}/log`
+
+### Shut down running task
+
+Shuts down a running task by ID. For normal usage, you should use the `/druid/indexer/v1/task/{taskId}/shutdown`
+[Tasks API](./tasks-api.md) endpoint instead.
+
+#### URL
+
+`POST` `/druid/worker/v1/task/{taskId}/shutdown`
+
+#### Responses
+<Tabs>
+
+<TabItem value="37" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully shut down a task*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example shuts down a task with specified ID `index_kafka_wikiticker_f7011f8ffba384b_fpeclode`.
+
+<Tabs>
+
+<TabItem value="38" label="cURL">
+
+
+```shell
+curl "http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT/druid/worker/v1/task/index_kafka_wikiticker_f7011f8ffba384b_fpeclode/shutdown"
+```
+
+</TabItem>
+<TabItem value="39" label="HTTP">
+
+
+```http
+POST /druid/worker/v1/task/index_kafka_wikiticker_f7011f8ffba384b_fpeclode/shutdown HTTP/1.1
+Host: http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "task":"index_kafka_wikiticker_f7011f8ffba384b_fpeclode"
+ }
+ ```
+
+</details>
+
+### Disable Middle Manager
+
+Disables a Middle Manager, causing it to stop accepting new tasks but complete all existing tasks. Returns a JSON object
+keyed by the combined `druid.host` and `druid.port`.
+
+#### URL
+
+`POST` `/druid/worker/v1/disable`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="40" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully disabled Middle Manager*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="41" label="cURL">
+
+
+```shell
+curl "http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT/druid/worker/v1/disable"
+```
+
+</TabItem>
+<TabItem value="42" label="HTTP">
+
+
+```http
+POST /druid/worker/v1/disable HTTP/1.1
+Host: http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "localhost:8091":"disabled"
+ }
+ ```
+
+</details>
+
+### Enable Middle Manager
+
+Enables a Middle Manager, allowing it to accept new tasks again if it was previously disabled. Returns a JSON object keyed by the combined `druid.host` and `druid.port`.
+
+#### URL
+
+`POST` `/druid/worker/v1/enable`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="43" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully enabled Middle Manager*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="44" label="cURL">
+
+
+```shell
+curl "http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT/druid/worker/v1/enable"
+```
+
+</TabItem>
+<TabItem value="45" label="HTTP">
+
+
+```http
+POST /druid/worker/v1/enable HTTP/1.1
+Host: http://MIDDLEMANAGER_IP:MIDDLEMANAGER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "localhost:8091":"enabled"
+ }
+ ```
+
+</details>
+
+## Historical
+
+### Get segment load status
+
+Retrieves a JSON object of the form `{"cacheInitialized":value}`, where value is either `true` or `false` indicating if all segments in the local cache have been loaded.
+
+Use this endpoint to know when a Broker service is ready to accept queries after a restart.
+
+#### URL
+
+`GET` `/druid/historical/v1/loadstatus`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="46" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved status*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="47" label="cURL">
+
+
+```shell
+curl "http://HISTORICAL_IP:HISTORICAL_PORT/druid/historical/v1/loadstatus"
+```
+
+</TabItem>
+<TabItem value="48" label="HTTP">
+
+
+```http
+GET /druid/historical/v1/loadstatus HTTP/1.1
+Host: http://HISTORICAL_IP:HISTORICAL_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "cacheInitialized": true
+ }
+ ```
+
+</details>
+
+### Get segment readiness
+
+Retrieves a status code to indicate if all segments in the local cache have been loaded. Similar to `/druid/historical/v1/loadstatus`, but instead of returning JSON with a flag, it returns status codes.
+
+#### URL
+
+`GET` `/druid/historical/v1/readiness`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="49" label="200 SUCCESS">
+
+
+<br/>
+
+*Segments in local cache successfully loaded*
+
+</TabItem>
+<TabItem value="50" label="503 SERVICE UNAVAILABLE">
+
+
+<br/>
+
+*Segments in local cache have not been loaded*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="51" label="cURL">
+
+
+```shell
+curl "http://HISTORICAL_IP:HISTORICAL_PORT/druid/historical/v1/readiness"
+```
+
+</TabItem>
+<TabItem value="52" label="HTTP">
+
+
+```http
+GET /druid/historical/v1/readiness HTTP/1.1
+Host: http://HISTORICAL_IP:HISTORICAL_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful response to this endpoint results in an empty response body.
+
+## Load Status
+
+### Get Broker query load status
+
+Retrieves a flag indicating if the Broker knows about all segments in the cluster. Use this endpoint to know when a Broker service is ready to accept queries after a restart.
+
+#### URL
+
+`GET` `/druid/broker/v1/loadstatus`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="53" label="200 SUCCESS">
+
+
+<br/>
+
+*Segments successfully loaded*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="54" label="cURL">
+
+
+```shell
+curl "http://BROKER_IP:BROKER_PORT/druid/broker/v1/loadstatus"
+```
+
+</TabItem>
+<TabItem value="55" label="HTTP">
+
+
+```http
+GET /druid/broker/v1/loadstatus HTTP/1.1
+Host: http://<BROKER_IP>:<BROKER_PORT>
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+ {
+ "inventoryInitialized": true
+ }
+ ```
+
+</details>
+
+### Get Broker query readiness
+
+Retrieves a status code to indicate Broker readiness. Readiness signifies the Broker knows about all segments in the cluster and is ready to accept queries after a restart. Similar to `/druid/broker/v1/loadstatus`, but instead of returning a JSON, it returns status codes.
+
+#### URL
+
+`GET` `/druid/broker/v1/readiness`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="56" label="200 SUCCESS">
+
+
+<br/>
+
+*Segments successfully loaded*
+
+</TabItem>
+<TabItem value="57" label="503 SERVICE UNAVAILABLE">
+
+
+<br/>
+
+*Segments have not been loaded*
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="58" label="cURL">
+
+
+```shell
+curl "http://BROKER_IP:BROKER_PORT/druid/broker/v1/readiness"
+```
+
+</TabItem>
+<TabItem value="59" label="HTTP">
+
+
+```http
+GET /druid/broker/v1/readiness HTTP/1.1
+Host: http://BROKER_IP:BROKER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful response to this endpoint results in an empty response body.
diff --git a/docs/35.0.0/api-reference/sql-api.md b/docs/35.0.0/api-reference/sql-api.md
new file mode 100644
index 000000000..af60cee4c
--- /dev/null
+++ b/docs/35.0.0/api-reference/sql-api.md
@@ -0,0 +1,1727 @@
+---
+id: sql-api
+title: Druid SQL API
+sidebar_label: Druid SQL
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+<!--
+
+
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+:::info
+ Apache Druid supports two query languages: Druid SQL and [native queries](../querying/querying.md).
+ This document describes the SQL language.
+:::
+
+In this topic, `http://ROUTER_IP:ROUTER_PORT` is a placeholder for your Router service address and port. Replace it with the information for your deployment. For example, use `http://localhost:8888` for quickstart deployments.
+
+## Query from Historicals
+
+### Submit a query
+
+Submits a SQL-based query in the JSON or text format request body.
+Returns a JSON object with the query results and optional metadata for the results. You can also use this endpoint to query [metadata tables](../querying/sql-metadata-tables.md).
+
+Each query has an associated SQL query ID. You can set this ID manually using the SQL context parameter `sqlQueryId`. If not set, Druid automatically generates `sqlQueryId` and returns it in the response header for `X-Druid-SQL-Query-Id`. Note that you need the `sqlQueryId` to [cancel a query](#cancel-a-query).
+
+#### URL
+
+`POST` `/druid/v2/sql`
+
+#### JSON Format Request body
+
+To send queries in JSON format, the `Content-Type` in the HTTP request MUST be `application/json`.
+If there are multiple `Content-Type` headers, the **first** one is used.
+
+The request body takes the following properties:
+
+* `query`: SQL query string. HTTP requests are permitted to include multiple `SET` statements to assign [SQL query context parameter](../querying/sql-query-context.md) values to apply to the query statement, see [SET](../querying/sql.md#set) for details. Context parameters set by `SET` statements take priority over values set in `context`.
+* `resultFormat`: String that indicates the format to return query results. Select one of the following formats:
+ * `object`: Returns a JSON array of JSON objects with the HTTP response header `Content-Type: application/json`.
+ Object field names match the columns returned by the SQL query in the same order as the SQL query.
+
+ * `array`: Returns a JSON array of JSON arrays with the HTTP response header `Content-Type: application/json`.
+ Each inner array has elements matching the columns returned by the SQL query, in order.
+
+ * `objectLines`: Returns newline-delimited JSON objects with the HTTP response header `Content-Type: text/plain`.
+ Newline separation facilitates parsing the entire response set as a stream if you don't have a streaming JSON parser.
+ This format includes a single trailing newline character so you can detect a truncated response.
+
+ * `arrayLines`: Returns newline-delimited JSON arrays with the HTTP response header `Content-Type: text/plain`.
+ Newline separation facilitates parsing the entire response set as a stream if you don't have a streaming JSON parser.
+ This format includes a single trailing newline character so you can detect a truncated response.
+
+ * `csv`: Returns comma-separated values with one row per line. Sent with the HTTP response header `Content-Type: text/csv`.
+ Druid uses double quotes to escape individual field values. For example, a value with a comma returns `"A,B"`.
+ If the field value contains a double quote character, Druid escapes it with a second double quote character.
+ For example, `foo"bar` becomes `foo""bar`.
+ This format includes a single trailing newline character so you can detect a truncated response.
+
+* `header`: Boolean value that determines whether to return information on column names. When set to `true`, Druid returns the column names as the first row of the results. To also get information on the column types, set `typesHeader` or `sqlTypesHeader` to `true`. For a comparative overview of data formats and configurations for the header, see the [Query output format](#query-output-format) table.
+
+* `typesHeader`: Adds Druid runtime type information in the header. Requires `header` to be set to `true`. Complex types, like sketches, will be reported as `COMPLEX<typeName>` if a particular complex type name is known for that field, or as `COMPLEX` if the particular type name is unknown or mixed.
+
+* `sqlTypesHeader`: Adds SQL type information in the header. Requires `header` to be set to `true`.
+
+ For compatibility, Druid returns the HTTP header `X-Druid-SQL-Header-Included: yes` when all of the following conditions are met:
+ * The `header` property is set to true.
+ * The version of Druid supports `typesHeader` and `sqlTypesHeader`, regardless of whether either property is set.
+
+* `context`: JSON object containing optional [SQL query context parameters](../querying/sql-query-context.md), such as to set the query ID, time zone, and whether to use an approximation algorithm for distinct count. You can also set the context through the SQL SET command. For more information, see [Druid SQL overview](../querying/sql.md#set).
+
+* `parameters`: List of query parameters for parameterized queries. Each parameter in the array should be a JSON object containing the parameter's SQL data type and parameter value. For more information on using dynamic parameters, see [Dynamic parameters](../querying/sql.md#dynamic-parameters). For a list of supported SQL types, see [Data types](../querying/sql-data-types.md).
+
+ For example:
+
+ ```json
+ {
+ "query": "SELECT \"arrayDouble\", \"stringColumn\" FROM \"array_example\" WHERE ARRAY_CONTAINS(\"arrayDouble\", ?) AND \"stringColumn\" = ?",
+ "parameters": [
+ {"type": "ARRAY", "value": [999.0, null, 5.5]},
+ {"type": "VARCHAR", "value": "bar"}
+ ]
+ }
+ ```
+
+##### Text Format Request body
+
+Druid also allows you to submit SQL queries in text format which is simpler than above JSON format.
+To do this, just set the `Content-Type` request header to `text/plain` or `application/x-www-form-urlencoded`, and pass SQL via the HTTP Body.
+
+If `application/x-www-form-urlencoded` is used, make sure the SQL query is URL-encoded.
+
+If there are multiple `Content-Type` headers, the **first** one is used.
+
+For response, the `resultFormat` is always `object` with the HTTP response header `Content-Type: application/json`.
+If you want more control over the query context or response format, use the above JSON format request body instead.
+
+The following example demonstrates how to submit a SQL query in text format:
+
+```commandline
+echo 'SELECT 1' | curl -H 'Content-Type: text/plain' http://ROUTER_IP:ROUTER_PORT/druid/v2/sql --data @-
+```
+
+We can also use `application/x-www-form-urlencoded` to submit URL-encoded SQL queries as shown by the following examples:
+
+```commandline
+echo 'SELECT%20%31' | curl http://ROUTER_IP:ROUTER_PORT/druid/v2/sql --data @-
+echo 'SELECT 1' | curl http://ROUTER_IP:ROUTER_PORT/druid/v2/sql --data-urlencode @-
+```
+
+The `curl` tool uses `application/x-www-form-urlencoded` as Content-Type header if the header is not given.
+
+The first example pass the URL-encoded query `SELECT%20%31`, which is `SELECT 1`, to the `curl` and `curl` will directly sends it to the server.
+While the second example passes the raw query `SELECT 1` to `curl` and the `curl` encodes the query to `SELECT%20%31` because of `--data-urlencode` option and sends the encoded text to the server.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully submitted query*
+
+</TabItem>
+<TabItem value="2" label="400 BAD REQUEST">
+
+
+*Error thrown due to bad query. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "A well-defined error code.",
+ "errorMessage": "A message with additional details about the error.",
+ "errorClass": "Class of exception that caused this error.",
+ "host": "The host on which the error occurred."
+}
+```
+</TabItem>
+<TabItem value="3" label="500 INTERNAL SERVER ERROR">
+
+
+*Request not sent due to unexpected conditions. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "A well-defined error code.",
+ "errorMessage": "A message with additional details about the error.",
+ "errorClass": "Class of exception that caused this error.",
+ "host": "The host on which the error occurred."
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Client-side error handling and truncated responses
+
+Druid reports errors that occur before the response body is sent as JSON with an HTTP 500 status code. The errors are reported using the same format as [native Druid query errors](../querying/querying.md#query-errors).
+If an error occurs while Druid is sending the response body, the server handling the request stops the response midstream and logs an error.
+
+This means that when you call the SQL API, you must properly handle response truncation.
+For `object` and `array` formats, truncated responses are invalid JSON.
+For line-oriented formats, Druid includes a newline character as the final character of every complete response. Absence of a final newline character indicates a truncated response.
+
+If you detect a truncated response, treat it as an error.
+
+---
+
+#### Sample request
+
+In the following example, this query demonstrates the following actions:
+- Retrieves all rows from the `wikipedia` datasource.
+- Filters the results where the `user` value is `BlueMoon2662`.
+- Applies the `sqlTimeZone` context parameter to set the time zone of results to `America/Los_Angeles`.
+- Returns descriptors for `header`, `typesHeader`, and `sqlTypesHeader`.
+
+
+<Tabs>
+
+<TabItem value="4" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/v2/sql" \
+--header 'Content-Type: application/json' \
+--data '{
+ "query": "SELECT * FROM wikipedia WHERE user='\''BlueMoon2662'\''",
+ "context" : {"sqlTimeZone" : "America/Los_Angeles"},
+ "header" : true,
+ "typesHeader" : true,
+ "sqlTypesHeader" : true
+}'
+```
+
+</TabItem>
+<TabItem value="5" label="HTTP">
+
+
+```HTTP
+POST /druid/v2/sql HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 201
+
+{
+ "query": "SELECT * FROM wikipedia WHERE user='BlueMoon2662'",
+ "context" : {"sqlTimeZone" : "America/Los_Angeles"},
+ "header" : true,
+ "typesHeader" : true,
+ "sqlTypesHeader" : true
+}
+```
+
+</TabItem>
+</Tabs>
+
+You can also specify query-level context parameters directly within the SQL query string using the `SET` command. For more details, see [SET](../querying/sql.md#set).
+
+The following request body is functionally equivalent to the previous example and uses SET instead of the `context` parameter:
+
+```JSON
+{
+ "query": "SET sqlTimeZone='America/Los_Angeles'; SELECT * FROM wikipedia WHERE user='BlueMoon2662'",
+ "header": true,
+ "typesHeader": true,
+ "sqlTypesHeader": true
+}
+```
+
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+[
+ {
+ "__time": {
+ "type": "LONG",
+ "sqlType": "TIMESTAMP"
+ },
+ "channel": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "cityName": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "comment": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "countryIsoCode": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "countryName": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "isAnonymous": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "isMinor": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "isNew": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "isRobot": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "isUnpatrolled": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "metroCode": {
+ "type": "LONG",
+ "sqlType": "BIGINT"
+ },
+ "namespace": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "page": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "regionIsoCode": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "regionName": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "user": {
+ "type": "STRING",
+ "sqlType": "VARCHAR"
+ },
+ "delta": {
+ "type": "LONG",
+ "sqlType": "BIGINT"
+ },
+ "added": {
+ "type": "LONG",
+ "sqlType": "BIGINT"
+ },
+ "deleted": {
+ "type": "LONG",
+ "sqlType": "BIGINT"
+ }
+ },
+ {
+ "__time": "2015-09-11T17:47:53.259-07:00",
+ "channel": "#ja.wikipedia",
+ "cityName": null,
+ "comment": "/* 対戦通算成績と得失点 */",
+ "countryIsoCode": null,
+ "countryName": null,
+ "isAnonymous": "false",
+ "isMinor": "true",
+ "isNew": "false",
+ "isRobot": "false",
+ "isUnpatrolled": "false",
+ "metroCode": null,
+ "namespace": "Main",
+ "page": "アルビレックス新潟の年度別成績一覧",
+ "regionIsoCode": null,
+ "regionName": null,
+ "user": "BlueMoon2662",
+ "delta": 14,
+ "added": 14,
+ "deleted": 0
+ }
+]
+```
+</details>
+
+### Cancel a query
+
+Cancels a query on the Router or the Broker with the associated `sqlQueryId`. The `sqlQueryId` can be manually set when the query is submitted in the query context parameter, or if not set, Druid will generate one and return it in the response header when the query is successfully submitted. Note that Druid does not enforce a unique `sqlQueryId` in the query context. If you've set the same `sqlQueryId` for multiple queries, Druid cancels all requests with that query ID.
+
+When you cancel a query, Druid handles the cancellation in a best-effort manner. Druid immediately marks the query as canceled and aborts the query execution as soon as possible. However, the query may continue running for a short time after you make the cancellation request.
+
+Cancellation requests require READ permission on all resources used in the SQL query.
+
+#### URL
+
+`DELETE` `/druid/v2/sql/{sqlQueryId}`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="6" label="202 SUCCESS">
+
+
+*Successfully deleted query*
+
+</TabItem>
+<TabItem value="7" label="403 FORBIDDEN">
+
+
+*Authorization failure*
+
+</TabItem>
+<TabItem value="8" label="404 NOT FOUND">
+
+
+*Invalid `sqlQueryId` or query was completed before cancellation request*
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example cancels a request with the set query ID `request01`.
+
+<Tabs>
+
+<TabItem value="9" label="cURL">
+
+
+```shell
+curl --request DELETE "http://ROUTER_IP:ROUTER_PORT/druid/v2/sql/request01"
+```
+
+</TabItem>
+<TabItem value="10" label="HTTP">
+
+
+```HTTP
+DELETE /druid/v2/sql/request01 HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful response results in an `HTTP 202` message code and an empty response body.
+
+### Query output format
+
+The following table shows examples of how Druid returns the column names and data types based on the result format and the type request.
+In all cases, `header` is true.
+The examples includes the first row of results, where the value of `user` is `BlueMoon2662`.
+
+```
+| Format | typesHeader | sqlTypesHeader | Example output |
+|--------|-------------|----------------|--------------------------------------------------------------------------------------------|
+| object | true | false | [ { "user" : { "type" : "STRING" } }, { "user" : "BlueMoon2662" } ] |
+| object | true | true | [ { "user" : { "type" : "STRING", "sqlType" : "VARCHAR" } }, { "user" : "BlueMoon2662" } ] |
+| object | false | true | [ { "user" : { "sqlType" : "VARCHAR" } }, { "user" : "BlueMoon2662" } ] |
+| object | false | false | [ { "user" : null }, { "user" : "BlueMoon2662" } ] |
+| array | true | false | [ [ "user" ], [ "STRING" ], [ "BlueMoon2662" ] ] |
+| array | true | true | [ [ "user" ], [ "STRING" ], [ "VARCHAR" ], [ "BlueMoon2662" ] ] |
+| array | false | true | [ [ "user" ], [ "VARCHAR" ], [ "BlueMoon2662" ] ] |
+| array | false | false | [ [ "user" ], [ "BlueMoon2662" ] ] |
+| csv | true | false | user STRING BlueMoon2662 |
+| csv | true | true | user STRING VARCHAR BlueMoon2662 |
+| csv | false | true | user VARCHAR BlueMoon2662 |
+| csv | false | false | user BlueMoon2662 |
+```
+
+## Query from deep storage
+
+You can use the `sql/statements` endpoint to query segments that exist only in deep storage and are not loaded onto your Historical processes as determined by your load rules.
+
+Note that at least one segment of a datasource must be available on a Historical process so that the Broker can plan your query. A quick way to check if this is true is whether or not a datasource is visible in the Druid console.
+
+
+For more information, see [Query from deep storage](../querying/query-from-deep-storage.md).
+
+### Submit a query
+
+Submit a query for data stored in deep storage. Any data ingested into Druid is placed into deep storage. The query is contained in the "query" field in the JSON object within the request payload.
+
+Note that at least part of a datasource must be available on a Historical process so that Druid can plan your query and only the user who submits a query can see the results.
+
+#### URL
+
+`POST` `/druid/v2/sql/statements`
+
+#### Request body
+
+Generally, the `sql` and `sql/statements` endpoints support the same response body fields with minor differences. For general information about the available fields, see [Submit a query to the `sql` endpoint](#submit-a-query).
+
+Keep the following in mind when submitting queries to the `sql/statements` endpoint:
+
+- Apart from the context parameters mentioned [here](../multi-stage-query/reference.md#context-parameters) there are additional context parameters for `sql/statements` specifically:
+
+ - `executionMode` determines how query results are fetched. Druid currently only supports `ASYNC`. You must manually retrieve your results after the query completes.
+ - `selectDestination` determines where final results get written. By default, results are written to task reports. Set this parameter to `durableStorage` to instruct Druid to write the results from SELECT queries to durable storage, which allows you to fetch larger result sets. For result sets with more than 3000 rows, it is highly recommended to use `durableStorage`. Note that this requires you to have [durable storage for MSQ](../operations/durable-storage.md) enabled.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully queried from deep storage*
+
+</TabItem>
+<TabItem value="2" label="400 BAD REQUEST">
+
+
+*Error thrown due to bad query. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "Summary of the encountered error.",
+ "errorClass": "Class of exception that caused this error.",
+ "host": "The host on which the error occurred.",
+ "errorCode": "Well-defined error code.",
+ "persona": "Role or persona associated with the error.",
+ "category": "Classification of the error.",
+ "errorMessage": "Summary of the encountered issue with expanded information.",
+ "context": "Additional context about the error."
+}
+```
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+<Tabs>
+
+<TabItem value="3" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/v2/sql/statements" \
+--header 'Content-Type: application/json' \
+--data '{
+ "query": "SELECT * FROM wikipedia WHERE user='\''BlueMoon2662'\''",
+ "context": {
+ "executionMode":"ASYNC"
+ }
+}'
+```
+
+</TabItem>
+<TabItem value="4" label="HTTP">
+
+
+```HTTP
+POST /druid/v2/sql/statements HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+Content-Length: 134
+
+{
+ "query": "SELECT * FROM wikipedia WHERE user='BlueMoon2662'",
+ "context": {
+ "executionMode":"ASYNC"
+ }
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+{
+ "queryId": "query-b82a7049-b94f-41f2-a230-7fef94768745",
+ "state": "ACCEPTED",
+ "createdAt": "2023-07-26T21:16:25.324Z",
+ "schema": [
+ {
+ "name": "__time",
+ "type": "TIMESTAMP",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "channel",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "cityName",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "comment",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "countryIsoCode",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "countryName",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "isAnonymous",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "isMinor",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "isNew",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "isRobot",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "isUnpatrolled",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "metroCode",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "namespace",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "page",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "regionIsoCode",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "regionName",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "user",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "delta",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "added",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "deleted",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ }
+ ],
+ "durationMs": -1
+}
+ ```
+</details>
+
+### Get query status
+
+Retrieves information about the query associated with the given query ID. The response matches the response from the POST API if the query is accepted or running and the execution mode is `ASYNC`. In addition to the fields that this endpoint shares with `POST /sql/statements`, a completed query's status includes the following:
+
+- A `result` object that summarizes information about your results, such as the total number of rows and sample records.
+- A `pages` object that includes the following information for each page of results:
+ - `numRows`: the number of rows in that page of results.
+ - `sizeInBytes`: the size of the page.
+ - `id`: the page number that you can use to reference a specific page when you get query results.
+
+If the optional query parameter `detail` is supplied, then the response also includes the following:
+- A `stages` object that summarizes information about the different stages being used for query execution, such as stage number, phase, start time, duration, input and output information, processing methods, and partitioning.
+- A `counters` object that provides details on the rows, bytes, and files processed at various stages for each worker across different channels, along with sort progress.
+- A `warnings` object that provides details about any warnings.
+
+#### URL
+
+`GET` `/druid/v2/sql/statements/{queryId}`
+
+#### Query parameters
+* `detail` (optional)
+ * Type: Boolean
+ * Default: false
+ * Fetch additional details about the query, which includes the information about different stages, counters for each stage, and any warnings.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="5" label="200 SUCCESS">
+
+
+*Successfully retrieved query status*
+
+</TabItem>
+<TabItem value="6" label="400 BAD REQUEST">
+
+
+*Error thrown due to bad query. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "Summary of the encountered error.",
+ "errorCode": "Well-defined error code.",
+ "persona": "Role or persona associated with the error.",
+ "category": "Classification of the error.",
+ "errorMessage": "Summary of the encountered issue with expanded information.",
+ "context": "Additional context about the error."
+}
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample request
+
+The following example retrieves the status of a query with specified ID `query-9b93f6f7-ab0e-48f5-986a-3520f84f0804`.
+
+<Tabs>
+
+<TabItem value="7" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/v2/sql/statements/query-9b93f6f7-ab0e-48f5-986a-3520f84f0804?detail=true"
+```
+
+</TabItem>
+<TabItem value="8" label="HTTP">
+
+
+```HTTP
+GET /druid/v2/sql/statements/query-9b93f6f7-ab0e-48f5-986a-3520f84f0804?detail=true HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+{
+ "queryId": "query-9b93f6f7-ab0e-48f5-986a-3520f84f0804",
+ "state": "SUCCESS",
+ "createdAt": "2023-07-26T22:57:46.620Z",
+ "schema": [
+ {
+ "name": "__time",
+ "type": "TIMESTAMP",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "channel",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "cityName",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "comment",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "countryIsoCode",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "countryName",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "isAnonymous",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "isMinor",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "isNew",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "isRobot",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "isUnpatrolled",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "metroCode",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "namespace",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "page",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "regionIsoCode",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "regionName",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "user",
+ "type": "VARCHAR",
+ "nativeType": "STRING"
+ },
+ {
+ "name": "delta",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "added",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ },
+ {
+ "name": "deleted",
+ "type": "BIGINT",
+ "nativeType": "LONG"
+ }
+ ],
+ "durationMs": 25591,
+ "result": {
+ "numTotalRows": 1,
+ "totalSizeInBytes": 375,
+ "dataSource": "__query_select",
+ "sampleRecords": [
+ [
+ 1442018873259,
+ "#ja.wikipedia",
+ "",
+ "/* 対戦通算成績と得失点 */",
+ "",
+ "",
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ "Main",
+ "アルビレックス新潟の年度別成績一覧",
+ "",
+ "",
+ "BlueMoon2662",
+ 14,
+ 14,
+ 0
+ ]
+ ],
+ "pages": [
+ {
+ "id": 0,
+ "numRows": 1,
+ "sizeInBytes": 375
+ }
+ ]
+ },
+ "stages": [
+ {
+ "stageNumber": 0,
+ "definition": {
+ "id": "query-9b93f6f7-ab0e-48f5-986a-3520f84f0804_0",
+ "input": [
+ {
+ "type": "table",
+ "dataSource": "wikipedia",
+ "intervals": [
+ "-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z"
+ ],
+ "filter": {
+ "type": "equals",
+ "column": "user",
+ "matchValueType": "STRING",
+ "matchValue": "BlueMoon2662"
+ },
+ "filterFields": [
+ "user"
+ ]
+ }
+ ],
+ "processor": {
+ "type": "scan",
+ "query": {
+ "queryType": "scan",
+ "dataSource": {
+ "type": "inputNumber",
+ "inputNumber": 0
+ },
+ "intervals": {
+ "type": "intervals",
+ "intervals": [
+ "-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z"
+ ]
+ },
+ "virtualColumns": [
+ {
+ "type": "expression",
+ "name": "v0",
+ "expression": "'BlueMoon2662'",
+ "outputType": "STRING"
+ }
+ ],
+ "resultFormat": "compactedList",
+ "limit": 1001,
+ "filter": {
+ "type": "equals",
+ "column": "user",
+ "matchValueType": "STRING",
+ "matchValue": "BlueMoon2662"
+ },
+ "columns": [
+ "__time",
+ "added",
+ "channel",
+ "cityName",
+ "comment",
+ "commentLength",
+ "countryIsoCode",
+ "countryName",
+ "deleted",
+ "delta",
+ "deltaBucket",
+ "diffUrl",
+ "flags",
+ "isAnonymous",
+ "isMinor",
+ "isNew",
+ "isRobot",
+ "isUnpatrolled",
+ "metroCode",
+ "namespace",
+ "page",
+ "regionIsoCode",
+ "regionName",
+ "v0"
+ ],
+ "context": {
+ "__resultFormat": "array",
+ "__user": "allowAll",
+ "executionMode": "async",
+ "finalize": true,
+ "maxNumTasks": 2,
+ "maxParseExceptions": 0,
+ "queryId": "33b53acb-7533-4880-a81b-51c16c489eab",
+ "scanSignature": "[{\"name\":\"__time\",\"type\":\"LONG\"},{\"name\":\"added\",\"type\":\"LONG\"},{\"name\":\"channel\",\"type\":\"STRING\"},{\"name\":\"cityName\",\"type\":\"STRING\"},{\"name\":\"comment\",\"type\":\"STRING\"},{\"name\":\"commentLength\",\"type\":\"LONG\"},{\"name\":\"countryIsoCode\",\"type\":\"STRING\"},{\"name\":\"countryName\",\"type\":\"STRING\"},{\"name\":\"deleted\",\"type\":\"LONG\"},{\"name\":\"delta\",\"type\":\"LONG\"},{\"name\":\" [...]
+ "sqlOuterLimit": 1001,
+ "sqlQueryId": "33b53acb-7533-4880-a81b-51c16c489eab",
+ "sqlStringifyArrays": false
+ },
+ "columnTypes": [
+ "LONG",
+ "LONG",
+ "STRING",
+ "STRING",
+ "STRING",
+ "LONG",
+ "STRING",
+ "STRING",
+ "LONG",
+ "LONG",
+ "LONG",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING",
+ "STRING"
+ ],
+ "granularity": {
+ "type": "all"
+ },
+ "legacy": false
+ }
+ },
+ "signature": [
+ {
+ "name": "__boost",
+ "type": "LONG"
+ },
+ {
+ "name": "__time",
+ "type": "LONG"
+ },
+ {
+ "name": "added",
+ "type": "LONG"
+ },
+ {
+ "name": "channel",
+ "type": "STRING"
+ },
+ {
+ "name": "cityName",
+ "type": "STRING"
+ },
+ {
+ "name": "comment",
+ "type": "STRING"
+ },
+ {
+ "name": "commentLength",
+ "type": "LONG"
+ },
+ {
+ "name": "countryIsoCode",
+ "type": "STRING"
+ },
+ {
+ "name": "countryName",
+ "type": "STRING"
+ },
+ {
+ "name": "deleted",
+ "type": "LONG"
+ },
+ {
+ "name": "delta",
+ "type": "LONG"
+ },
+ {
+ "name": "deltaBucket",
+ "type": "LONG"
+ },
+ {
+ "name": "diffUrl",
+ "type": "STRING"
+ },
+ {
+ "name": "flags",
+ "type": "STRING"
+ },
+ {
+ "name": "isAnonymous",
+ "type": "STRING"
+ },
+ {
+ "name": "isMinor",
+ "type": "STRING"
+ },
+ {
+ "name": "isNew",
+ "type": "STRING"
+ },
+ {
+ "name": "isRobot",
+ "type": "STRING"
+ },
+ {
+ "name": "isUnpatrolled",
+ "type": "STRING"
+ },
+ {
+ "name": "metroCode",
+ "type": "STRING"
+ },
+ {
+ "name": "namespace",
+ "type": "STRING"
+ },
+ {
+ "name": "page",
+ "type": "STRING"
+ },
+ {
+ "name": "regionIsoCode",
+ "type": "STRING"
+ },
+ {
+ "name": "regionName",
+ "type": "STRING"
+ },
+ {
+ "name": "v0",
+ "type": "STRING"
+ }
+ ],
+ "shuffleSpec": {
+ "type": "mix"
+ },
+ "maxWorkerCount": 1
+ },
+ "phase": "FINISHED",
+ "workerCount": 1,
+ "partitionCount": 1,
+ "shuffle": "mix",
+ "output": "localStorage",
+ "startTime": "2024-07-31T15:20:21.255Z",
+ "duration": 103
+ },
+ {
+ "stageNumber": 1,
+ "definition": {
+ "id": "query-9b93f6f7-ab0e-48f5-986a-3520f84f0804_1",
+ "input": [
+ {
+ "type": "stage",
+ "stage": 0
+ }
+ ],
+ "processor": {
+ "type": "limit",
+ "limit": 1001
+ },
+ "signature": [
+ {
+ "name": "__boost",
+ "type": "LONG"
+ },
+ {
+ "name": "__time",
+ "type": "LONG"
+ },
+ {
+ "name": "added",
+ "type": "LONG"
+ },
+ {
+ "name": "channel",
+ "type": "STRING"
+ },
+ {
+ "name": "cityName",
+ "type": "STRING"
+ },
+ {
+ "name": "comment",
+ "type": "STRING"
+ },
+ {
+ "name": "commentLength",
+ "type": "LONG"
+ },
+ {
+ "name": "countryIsoCode",
+ "type": "STRING"
+ },
+ {
+ "name": "countryName",
+ "type": "STRING"
+ },
+ {
+ "name": "deleted",
+ "type": "LONG"
+ },
+ {
+ "name": "delta",
+ "type": "LONG"
+ },
+ {
+ "name": "deltaBucket",
+ "type": "LONG"
+ },
+ {
+ "name": "diffUrl",
+ "type": "STRING"
+ },
+ {
+ "name": "flags",
+ "type": "STRING"
+ },
+ {
+ "name": "isAnonymous",
+ "type": "STRING"
+ },
+ {
+ "name": "isMinor",
+ "type": "STRING"
+ },
+ {
+ "name": "isNew",
+ "type": "STRING"
+ },
+ {
+ "name": "isRobot",
+ "type": "STRING"
+ },
+ {
+ "name": "isUnpatrolled",
+ "type": "STRING"
+ },
+ {
+ "name": "metroCode",
+ "type": "STRING"
+ },
+ {
+ "name": "namespace",
+ "type": "STRING"
+ },
+ {
+ "name": "page",
+ "type": "STRING"
+ },
+ {
+ "name": "regionIsoCode",
+ "type": "STRING"
+ },
+ {
+ "name": "regionName",
+ "type": "STRING"
+ },
+ {
+ "name": "v0",
+ "type": "STRING"
+ }
+ ],
+ "shuffleSpec": {
+ "type": "maxCount",
+ "clusterBy": {
+ "columns": [
+ {
+ "columnName": "__boost",
+ "order": "ASCENDING"
+ }
+ ]
+ },
+ "partitions": 1
+ },
+ "maxWorkerCount": 1
+ },
+ "phase": "FINISHED",
+ "workerCount": 1,
+ "partitionCount": 1,
+ "shuffle": "globalSort",
+ "output": "localStorage",
+ "startTime": "2024-07-31T15:20:21.355Z",
+ "duration": 10,
+ "sort": true
+ }
+ ],
+ "counters": {
+ "0": {
+ "0": {
+ "input0": {
+ "type": "channel",
+ "rows": [
+ 24433
+ ],
+ "bytes": [
+ 7393933
+ ],
+ "files": [
+ 22
+ ],
+ "totalFiles": [
+ 22
+ ]
+ }
+ }
+ },
+ "1": {
+ "0": {
+ "sortProgress": {
+ "type": "sortProgress",
+ "totalMergingLevels": -1,
+ "levelToTotalBatches": {},
+ "levelToMergedBatches": {},
+ "totalMergersForUltimateLevel": -1,
+ "triviallyComplete": true,
+ "progressDigest": 1
+ }
+ }
+ }
+ },
+ "warnings": []
+}
+ ```
+</details>
+
+
+### Get query results
+
+Retrieves results for completed queries. Results are separated into pages, so you can use the optional `page` parameter to refine the results you get. Druid returns information about the composition of each page and its page number (`id`). For information about pages, see [Get query status](#get-query-status).
+
+If a page number isn't passed, all results are returned sequentially in the same response. If you have large result sets, you may encounter timeouts based on the value configured for `druid.router.http.readTimeout`.
+
+Getting the query results for an ingestion query returns an empty response.
+
+#### URL
+
+`GET` `/druid/v2/sql/statements/{queryId}/results`
+
+#### Query parameters
+* `page` (optional)
+ * Type: Int
+ * Fetch results based on page numbers. If not specified, all results are returned sequentially starting from page 0 to N in the same response.
+* `resultFormat` (optional)
+ * Type: String
+ * Defines the format in which the results are presented. The following options are supported `arrayLines`,`objectLines`,`array`,`object`, and `csv`. The default is `object`.
+* `filename` (optional)
+ * Type: String
+ * If set, attaches a `Content-Disposition` header to the response with the value of `attachment; filename={filename}`. The filename must not be longer than 255 characters and must not contain the characters `/`, `\`, `:`, `*`, `?`, `"`, `<`, `>`, `|`, `\0`, `\n`, or `\r`.
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="9" label="200 SUCCESS">
+
+
+*Successfully retrieved query results*
+
+</TabItem>
+<TabItem value="10" label="400 BAD REQUEST">
+
+
+*Query in progress. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "Summary of the encountered error.",
+ "errorCode": "Well-defined error code.",
+ "persona": "Role or persona associated with the error.",
+ "category": "Classification of the error.",
+ "errorMessage": "Summary of the encountered issue with expanded information.",
+ "context": "Additional context about the error."
+}
+```
+
+</TabItem>
+<TabItem value="11" label="404 NOT FOUND">
+
+
+*Query not found, failed or canceled*
+
+</TabItem>
+<TabItem value="12" label="500 SERVER ERROR">
+
+
+*Error thrown due to bad query. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "Summary of the encountered error.",
+ "errorCode": "Well-defined error code.",
+ "persona": "Role or persona associated with the error.",
+ "category": "Classification of the error.",
+ "errorMessage": "Summary of the encountered issue with expanded information.",
+ "context": "Additional context about the error."
+}
+```
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example retrieves the status of a query with specified ID `query-f3bca219-173d-44d4-bdc7-5002e910352f`.
+
+<Tabs>
+
+<TabItem value="13" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/v2/sql/statements/query-f3bca219-173d-44d4-bdc7-5002e910352f/results"
+```
+
+</TabItem>
+<TabItem value="14" label="HTTP">
+
+
+```HTTP
+GET /druid/v2/sql/statements/query-f3bca219-173d-44d4-bdc7-5002e910352f/results HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+ ```json
+[
+ {
+ "__time": 1442018818771,
+ "channel": "#en.wikipedia",
+ "cityName": "",
+ "comment": "added project",
+ "countryIsoCode": "",
+ "countryName": "",
+ "isAnonymous": 0,
+ "isMinor": 0,
+ "isNew": 0,
+ "isRobot": 0,
+ "isUnpatrolled": 0,
+ "metroCode": 0,
+ "namespace": "Talk",
+ "page": "Talk:Oswald Tilghman",
+ "regionIsoCode": "",
+ "regionName": "",
+ "user": "GELongstreet",
+ "delta": 36,
+ "added": 36,
+ "deleted": 0
+ },
+ {
+ "__time": 1442018820496,
+ "channel": "#ca.wikipedia",
+ "cityName": "",
+ "comment": "Robot inserta {{Commonscat}} que enllaça amb [[commons:category:Rallicula]]",
+ "countryIsoCode": "",
+ "countryName": "",
+ "isAnonymous": 0,
+ "isMinor": 1,
+ "isNew": 0,
+ "isRobot": 1,
+ "isUnpatrolled": 0,
+ "metroCode": 0,
+ "namespace": "Main",
+ "page": "Rallicula",
+ "regionIsoCode": "",
+ "regionName": "",
+ "user": "PereBot",
+ "delta": 17,
+ "added": 17,
+ "deleted": 0
+ },
+ {
+ "__time": 1442018825474,
+ "channel": "#en.wikipedia",
+ "cityName": "Auburn",
+ "comment": "/* Status of peremptory norms under international law */ fixed spelling of 'Wimbledon'",
+ "countryIsoCode": "AU",
+ "countryName": "Australia",
+ "isAnonymous": 1,
+ "isMinor": 0,
+ "isNew": 0,
+ "isRobot": 0,
+ "isUnpatrolled": 0,
+ "metroCode": 0,
+ "namespace": "Main",
+ "page": "Peremptory norm",
+ "regionIsoCode": "NSW",
+ "regionName": "New South Wales",
+ "user": "60.225.66.142",
+ "delta": 0,
+ "added": 0,
+ "deleted": 0
+ },
+ {
+ "__time": 1442018828770,
+ "channel": "#vi.wikipedia",
+ "cityName": "",
+ "comment": "fix Lỗi CS1: ngày tháng",
+ "countryIsoCode": "",
+ "countryName": "",
+ "isAnonymous": 0,
+ "isMinor": 1,
+ "isNew": 0,
+ "isRobot": 1,
+ "isUnpatrolled": 0,
+ "metroCode": 0,
+ "namespace": "Main",
+ "page": "Apamea abruzzorum",
+ "regionIsoCode": "",
+ "regionName": "",
+ "user": "Cheers!-bot",
+ "delta": 18,
+ "added": 18,
+ "deleted": 0
+ },
+ {
+ "__time": 1442018831862,
+ "channel": "#vi.wikipedia",
+ "cityName": "",
+ "comment": "clean up using [[Project:AWB|AWB]]",
+ "countryIsoCode": "",
+ "countryName": "",
+ "isAnonymous": 0,
+ "isMinor": 0,
+ "isNew": 0,
+ "isRobot": 1,
+ "isUnpatrolled": 0,
+ "metroCode": 0,
+ "namespace": "Main",
+ "page": "Atractus flammigerus",
+ "regionIsoCode": "",
+ "regionName": "",
+ "user": "ThitxongkhoiAWB",
+ "delta": 18,
+ "added": 18,
+ "deleted": 0
+ },
+ {
+ "__time": 1442018833987,
+ "channel": "#vi.wikipedia",
+ "cityName": "",
+ "comment": "clean up using [[Project:AWB|AWB]]",
+ "countryIsoCode": "",
+ "countryName": "",
+ "isAnonymous": 0,
+ "isMinor": 0,
+ "isNew": 0,
+ "isRobot": 1,
+ "isUnpatrolled": 0,
+ "metroCode": 0,
+ "namespace": "Main",
+ "page": "Agama mossambica",
+ "regionIsoCode": "",
+ "regionName": "",
+ "user": "ThitxongkhoiAWB",
+ "delta": 18,
+ "added": 18,
+ "deleted": 0
+ },
+ {
+ "__time": 1442018837009,
+ "channel": "#ca.wikipedia",
+ "cityName": "",
+ "comment": "/* Imperi Austrohongarès */",
+ "countryIsoCode": "",
+ "countryName": "",
+ "isAnonymous": 0,
+ "isMinor": 0,
+ "isNew": 0,
+ "isRobot": 0,
+ "isUnpatrolled": 0,
+ "metroCode": 0,
+ "namespace": "Main",
+ "page": "Campanya dels Balcans (1914-1918)",
+ "regionIsoCode": "",
+ "regionName": "",
+ "user": "Jaumellecha",
+ "delta": -20,
+ "added": 0,
+ "deleted": 20
+ },
+ {
+ "__time": 1442018839591,
+ "channel": "#en.wikipedia",
+ "cityName": "",
+ "comment": "adding comment on notability and possible COI",
+ "countryIsoCode": "",
+ "countryName": "",
+ "isAnonymous": 0,
+ "isMinor": 0,
+ "isNew": 1,
+ "isRobot": 0,
+ "isUnpatrolled": 1,
+ "metroCode": 0,
+ "namespace": "Talk",
+ "page": "Talk:Dani Ploeger",
+ "regionIsoCode": "",
+ "regionName": "",
+ "user": "New Media Theorist",
+ "delta": 345,
+ "added": 345,
+ "deleted": 0
+ },
+ {
+ "__time": 1442018841578,
+ "channel": "#en.wikipedia",
+ "cityName": "",
+ "comment": "Copying assessment table to wiki",
+ "countryIsoCode": "",
+ "countryName": "",
+ "isAnonymous": 0,
+ "isMinor": 0,
+ "isNew": 0,
+ "isRobot": 1,
+ "isUnpatrolled": 0,
+ "metroCode": 0,
+ "namespace": "User",
+ "page": "User:WP 1.0 bot/Tables/Project/Pubs",
+ "regionIsoCode": "",
+ "regionName": "",
+ "user": "WP 1.0 bot",
+ "delta": 121,
+ "added": 121,
+ "deleted": 0
+ },
+ {
+ "__time": 1442018845821,
+ "channel": "#vi.wikipedia",
+ "cityName": "",
+ "comment": "clean up using [[Project:AWB|AWB]]",
+ "countryIsoCode": "",
+ "countryName": "",
+ "isAnonymous": 0,
+ "isMinor": 0,
+ "isNew": 0,
+ "isRobot": 1,
+ "isUnpatrolled": 0,
+ "metroCode": 0,
+ "namespace": "Main",
+ "page": "Agama persimilis",
+ "regionIsoCode": "",
+ "regionName": "",
+ "user": "ThitxongkhoiAWB",
+ "delta": 18,
+ "added": 18,
+ "deleted": 0
+ }
+]
+ ```
+</details>
+
+### Cancel a query
+
+Cancels a running or accepted query.
+
+#### URL
+
+`DELETE` `/druid/v2/sql/statements/{queryId}`
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="15" label="200 OK">
+
+
+*A no op operation since the query is not in a state to be cancelled*
+
+</TabItem>
+<TabItem value="16" label="202 ACCEPTED">
+
+
+*Successfully accepted query for cancellation*
+
+</TabItem>
+<TabItem value="17" label="404 SERVER ERROR">
+
+
+*Invalid query ID. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "Summary of the encountered error.",
+ "errorCode": "Well-defined error code.",
+ "persona": "Role or persona associated with the error.",
+ "category": "Classification of the error.",
+ "errorMessage": "Summary of the encountered issue with expanded information.",
+ "context": "Additional context about the error."
+}
+```
+
+</TabItem>
+</Tabs>
+
+---
+
+#### Sample request
+
+The following example cancels a query with specified ID `query-945c9633-2fa2-49ab-80ae-8221c38c024da`.
+
+<Tabs>
+
+<TabItem value="18" label="cURL">
+
+
+```shell
+curl --request DELETE "http://ROUTER_IP:ROUTER_PORT/druid/v2/sql/statements/query-945c9633-2fa2-49ab-80ae-8221c38c024da"
+```
+
+</TabItem>
+<TabItem value="19" label="HTTP">
+
+
+```HTTP
+DELETE /druid/v2/sql/statements/query-945c9633-2fa2-49ab-80ae-8221c38c024da HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+#### Sample response
+
+A successful request returns an HTTP `202 ACCEPTED` message code and an empty response body.
diff --git a/docs/35.0.0/api-reference/sql-ingestion-api.md b/docs/35.0.0/api-reference/sql-ingestion-api.md
new file mode 100644
index 000000000..59942aff8
--- /dev/null
+++ b/docs/35.0.0/api-reference/sql-ingestion-api.md
@@ -0,0 +1,850 @@
+---
+id: sql-ingestion-api
+title: SQL-based ingestion API
+sidebar_label: SQL-based ingestion
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+:::info
+ This page describes SQL-based batch ingestion using the [`druid-multi-stage-query`](../multi-stage-query/index.md)
+ extension, new in Druid 24.0. Refer to the [ingestion methods](../ingestion/index.md#batch) table to determine which
+ ingestion method is right for you.
+:::
+
+The **Query** view in the web console provides a friendly experience for the multi-stage query task engine (MSQ task engine) and multi-stage query architecture. We recommend using the web console if you don't need a programmatic interface.
+
+When using the API for the MSQ task engine, the action you want to take determines the endpoint you use:
+
+- `/druid/v2/sql/task`: Submit a query for ingestion.
+- `/druid/indexer/v1/task`: Interact with a query, including getting its status or details, or canceling the query. This page describes a few of the Overlord Task APIs that you can use with the MSQ task engine. For information about Druid APIs, see the [API reference for Druid](../ingestion/tasks.md).
+
+In this topic, `http://ROUTER_IP:ROUTER_PORT` is a placeholder for your Router service address and port. Replace it with the information for your deployment. For example, use `http://localhost:8888` for quickstart deployments.
+
+## Submit a query
+
+Submits queries to the MSQ task engine.
+
+The `/druid/v2/sql/task` endpoint accepts the following:
+
+- [SQL requests in the JSON-over-HTTP form](sql-api.md#request-body) using the
+`query`, `context`, and `parameters` fields. The endpoint ignores the `resultFormat`, `header`, `typesHeader`, and `sqlTypesHeader` fields.
+- [INSERT](../multi-stage-query/reference.md#insert) and [REPLACE](../multi-stage-query/reference.md#replace) statements.
+- SELECT queries (experimental feature). SELECT query results are collected from workers by the controller, and written into the [task report](#get-the-report-for-a-query-task) as an array of arrays. The behavior and result format of plain SELECT queries (without INSERT or REPLACE) is subject to change.
+
+### URL
+
+`POST` `/druid/v2/sql/task`
+
+### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully submitted query*
+
+</TabItem>
+<TabItem value="2" label="400 BAD REQUEST">
+
+
+*Error thrown due to bad query. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "A well-defined error code.",
+ "errorMessage": "A message with additional details about the error.",
+ "errorClass": "Class of exception that caused this error.",
+ "host": "The host on which the error occurred."
+}
+```
+</TabItem>
+<TabItem value="3" label="500 INTERNAL SERVER ERROR">
+
+
+*Request not sent due to unexpected conditions. Returns a JSON object detailing the error with the following format:*
+
+```json
+{
+ "error": "A well-defined error code.",
+ "errorMessage": "A message with additional details about the error.",
+ "errorClass": "Class of exception that caused this error.",
+ "host": "The host on which the error occurred."
+}
+```
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+The following example shows a query that fetches data from an external JSON source and inserts it into a table named `wikipedia`.
+The example specifies two query context parameters:
+
+- `maxNumTasks=3`: Limits the maximum number of parallel tasks to 3.
+- `finalizeAggregations=false`: Ensures that Druid saves the aggregation's intermediate type during ingestion. For more information, see [Rollup](../multi-stage-query/concepts.md#rollup).
+
+
+<Tabs>
+
+<TabItem value="4" label="HTTP">
+
+```HTTP
+POST /druid/v2/sql/task HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+
+{
+ "query": "SET maxNumTasks=3;\nSET finalizeAggregations=false;\nINSERT INTO wikipedia\nSELECT\n TIME_PARSE(\"timestamp\") AS __time,\n *\nFROM TABLE(\n EXTERN(\n '{\"type\": \"http\", \"uris\": [\"https://druid.apache.org/data/wikipedia.json.gz\"]}',\n '{\"type\": \"json\"}',\n '[{\"name\": \"added\", \"type\": \"long\"}, {\"name\": \"channel\", \"type\": \"string\"}, {\"name\": \"cityName\", \"type\": \"string\"}, {\"name\": \"comment\", \"type\": \"string\"}, {\"name\": \" [...]
+}
+```
+
+</TabItem>
+
+<TabItem value="5" label="cURL">
+
+
+```shell
+curl --location --request POST 'http://ROUTER_IP:ROUTER_PORT/druid/v2/sql/task' \
+ --header 'Content-Type: application/json' \
+ --data '{
+ "query": "SET maxNumTasks=3;\nSET finalizeAggregations=false;\nINSERT INTO wikipedia\nSELECT\n TIME_PARSE(\"timestamp\") AS __time,\n *\nFROM TABLE(\n EXTERN(\n '\''{\"type\": \"http\", \"uris\": [\"https://druid.apache.org/data/wikipedia.json.gz\"]}'\'',\n '\''{\"type\": \"json\"}'\'',\n '\''[{\"name\": \"added\", \"type\": \"long\"}, {\"name\": \"channel\", \"type\": \"string\"}, {\"name\": \"cityName\", \"type\": \"string\"}, {\"name\": \"comment\", \"type\": \"string\"} [...]
+}'
+```
+
+</TabItem>
+
+<TabItem value="6" label="Python">
+
+
+```python
+import json
+import requests
+
+url = "http://ROUTER_IP:ROUTER_PORT/druid/v2/sql/task"
+
+payload = json.dumps({
+ "query": "SET maxNumTasks=3;\nSET finalizeAggregations=false;\nINSERT INTO wikipedia\nSELECT\n TIME_PARSE(\"timestamp\") AS __time,\n *\nFROM TABLE(\n EXTERN(\n '{\"type\": \"http\", \"uris\": [\"https://druid.apache.org/data/wikipedia.json.gz\"]}',\n '{\"type\": \"json\"}',\n '[{\"name\": \"added\", \"type\": \"long\"}, {\"name\": \"channel\", \"type\": \"string\"}, {\"name\": \"cityName\", \"type\": \"string\"}, {\"name\": \"comment\", \"type\": \"string\"}, {\"name\": \" [...]
+})
+headers = {
+ 'Content-Type': 'application/json'
+}
+
+response = requests.post(url, headers=headers, data=payload)
+
+print(response.text)
+
+```
+
+</TabItem>
+
+</Tabs>
+
+### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "taskId": "query-431c4a18-9dde-4ec8-ab82-ec7fd17d5a4e",
+ "state": "RUNNING"
+}
+```
+</details>
+
+**Response fields**
+
+| Field | Description |
+|---|---|
+| `taskId` | Controller task ID. You can use Druid's standard [Tasks API](./tasks-api.md) to interact with this controller task. |
+| `state` | Initial state for the query. |
+
+## Get the status for a query task
+
+Retrieves the status of a query task. It returns a JSON object with the task's status code, runner status, task type, datasource, and other relevant metadata.
+
+### URL
+
+`GET` `/druid/indexer/v1/task/{taskId}/status`
+
+### Responses
+
+<Tabs>
+
+<TabItem value="7" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved task status*
+
+</TabItem>
+<TabItem value="8" label="404 NOT FOUND">
+
+
+<br/>
+
+*Cannot find task with ID*
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+The following example shows how to retrieve the status of a task with the ID `query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e`.
+
+<Tabs>
+
+<TabItem value="9" label="HTTP">
+
+```HTTP
+GET /druid/indexer/v1/task/query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e/status HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+
+<TabItem value="10" label="cURL">
+
+
+```shell
+curl --location --request GET 'http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/task/query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e/status'
+```
+
+</TabItem>
+
+<TabItem value="11" label="Python">
+
+
+```python
+import requests
+
+url = "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/task/query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e/status"
+
+payload={}
+headers = {}
+
+response = requests.post(url, headers=headers, data=payload)
+
+print(response.text)
+print(response.text)
+```
+
+</TabItem>
+
+</Tabs>
+
+### Sample response
+
+<details>
+ <summary>View the response</summary>
+
+```json
+{
+ "task": "query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e",
+ "status": {
+ "id": "query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e",
+ "groupId": "query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e",
+ "type": "query_controller",
+ "createdTime": "2022-09-14T22:12:00.183Z",
+ "queueInsertionTime": "1970-01-01T00:00:00.000Z",
+ "statusCode": "RUNNING",
+ "status": "RUNNING",
+ "runnerStatusCode": "RUNNING",
+ "duration": -1,
+ "location": {
+ "host": "localhost",
+ "port": 8100,
+ "tlsPort": -1
+ },
+ "dataSource": "kttm_simple",
+ "errorMsg": null
+ }
+}
+```
+</details>
+
+## Get the report for a query task
+
+Retrieves the task report for a query.
+The report provides detailed information about the query task, including things like the stages, warnings, and errors.
+
+Keep the following in mind when using the task API to view reports:
+
+- The task report for an entire job is associated with the `query_controller` task. The `query_worker` tasks don't have their own reports; their information is incorporated into the controller report.
+- The task report API may report `404 Not Found` temporarily while the task is in the process of starting up.
+- As an experimental feature, the MSQ task engine supports running SELECT queries. SELECT query results are written into
+the `multiStageQuery.payload.results.results` task report key as an array of arrays. The behavior and result format of plain
+SELECT queries (without INSERT or REPLACE) is subject to change.
+- `multiStageQuery.payload.results.resultsTruncated` denotes whether the results of the report have been truncated to prevent the reports from blowing up.
+
+For an explanation of the fields in a report, see [Report response fields](#report-response-fields).
+
+### URL
+
+
+`GET` `/druid/indexer/v1/task/{taskId}/reports`
+
+### Responses
+
+<Tabs>
+
+<TabItem value="12" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved task report*
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+The following example shows how to retrieve the report for a query with the task ID `query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e`.
+
+<Tabs>
+
+<TabItem value="13" label="HTTP">
+
+```HTTP
+GET /druid/indexer/v1/task/query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e/reports HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+
+<TabItem value="14" label="cURL">
+
+
+```shell
+curl --location --request GET 'http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/task/query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e/reports'
+```
+
+</TabItem>
+
+<TabItem value="15" label="Python">
+
+
+```python
+import requests
+
+url = "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/task/query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e/reports"
+
+headers = {}
+
+response = requests.post(url, headers=headers, data=payload)
+
+print(response.text)
+print(response.text)
+```
+
+</TabItem>
+
+</Tabs>
+
+### Sample response
+
+The response shows an example report for a query.
+
+<details>
+<summary>View the response</summary>
+
+```json
+{
+ "multiStageQuery": {
+ "type": "multiStageQuery",
+ "taskId": "query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e",
+ "payload": {
+ "status": {
+ "status": "SUCCESS",
+ "startTime": "2022-09-14T22:12:09.266Z",
+ "durationMs": 28227,
+ "workers": {
+ "0": [
+ {
+ "workerId": "query-3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e-worker0_0",
+ "state": "SUCCESS",
+ "durationMs": 15511,
+ "pendingMs": 137
+ }
+ ]
+ },
+ "pendingTasks": 0,
+ "runningTasks": 2,
+ "segmentLoadWaiterStatus": {
+ "state": "SUCCESS",
+ "dataSource": "kttm_simple",
+ "startTime": "2022-09-14T23:12:09.266Z",
+ "duration": 15,
+ "totalSegments": 1,
+ "usedSegments": 1,
+ "precachedSegments": 0,
+ "onDemandSegments": 0,
+ "pendingSegments": 0,
+ "unknownSegments": 0
+ },
+ "segmentReport": {
+ "shardSpec": "NumberedShardSpec",
+ "details": "Cannot use RangeShardSpec, RangedShardSpec only supports string CLUSTER BY keys. Using NumberedShardSpec instead."
+ }
+ },
+ "stages": [
+ {
+ "stageNumber": 0,
+ "definition": {
+ "id": "71ecb11e-09d7-42f8-9225-1662c8e7e121_0",
+ "input": [
+ {
+ "type": "external",
+ "inputSource": {
+ "type": "http",
+ "uris": [
+ "https://static.imply.io/example-data/kttm-v2/kttm-v2-2019-08-25.json.gz"
+ ],
+ "httpAuthenticationUsername": null,
+ "httpAuthenticationPassword": null
+ },
+ "inputFormat": {
+ "type": "json",
+ "flattenSpec": null,
+ "featureSpec": {},
+ "keepNullColumns": false
+ },
+ "signature": [
+ {
+ "name": "timestamp",
+ "type": "STRING"
+ },
+ {
+ "name": "agent_category",
+ "type": "STRING"
+ },
+ {
+ "name": "agent_type",
+ "type": "STRING"
+ }
+ ]
+ }
+ ],
+ "processor": {
+ "type": "scan",
+ "query": {
+ "queryType": "scan",
+ "dataSource": {
+ "type": "inputNumber",
+ "inputNumber": 0
+ },
+ "intervals": {
+ "type": "intervals",
+ "intervals": [
+ "-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z"
+ ]
+ },
+ "resultFormat": "compactedList",
+ "columns": [
+ "agent_category",
+ "agent_type",
+ "timestamp"
+ ],
+ "context": {
+ "finalize": false,
+ "finalizeAggregations": false,
+ "groupByEnableMultiValueUnnesting": false,
+ "scanSignature": "[{\"name\":\"agent_category\",\"type\":\"STRING\"},{\"name\":\"agent_type\",\"type\":\"STRING\"},{\"name\":\"timestamp\",\"type\":\"STRING\"}]",
+ "sqlInsertSegmentGranularity": "{\"type\":\"all\"}",
+ "sqlQueryId": "3dc0c45d-34d7-4b15-86c9-cdb2d3ebfc4e",
+ "sqlReplaceTimeChunks": "all"
+ },
+ "granularity": {
+ "type": "all"
+ }
+ }
+ },
+ "signature": [
+ {
+ "name": "__boost",
+ "type": "LONG"
+ },
+ {
+ "name": "agent_category",
+ "type": "STRING"
+ },
+ {
+ "name": "agent_type",
+ "type": "STRING"
+ },
+ {
+ "name": "timestamp",
+ "type": "STRING"
+ }
+ ],
+ "shuffleSpec": {
+ "type": "targetSize",
+ "clusterBy": {
+ "columns": [
+ {
+ "columnName": "__boost"
+ }
+ ]
+ },
+ "targetSize": 3000000
+ },
+ "maxWorkerCount": 1,
+ "shuffleCheckHasMultipleValues": true
+ },
+ "phase": "FINISHED",
+ "workerCount": 1,
+ "partitionCount": 1,
+ "startTime": "2022-09-14T22:12:11.663Z",
+ "duration": 19965,
+ "sort": true
+ },
+ {
+ "stageNumber": 1,
+ "definition": {
+ "id": "71ecb11e-09d7-42f8-9225-1662c8e7e121_1",
+ "input": [
+ {
+ "type": "stage",
+ "stage": 0
+ }
+ ],
+ "processor": {
+ "type": "segmentGenerator",
+ "dataSchema": {
+ "dataSource": "kttm_simple",
+ "timestampSpec": {
+ "column": "__time",
+ "format": "millis",
+ "missingValue": null
+ },
+ "dimensionsSpec": {
+ "dimensions": [
+ {
+ "type": "string",
+ "name": "timestamp",
+ "multiValueHandling": "SORTED_ARRAY",
+ "createBitmapIndex": true
+ },
+ {
+ "type": "string",
+ "name": "agent_category",
+ "multiValueHandling": "SORTED_ARRAY",
+ "createBitmapIndex": true
+ },
+ {
+ "type": "string",
+ "name": "agent_type",
+ "multiValueHandling": "SORTED_ARRAY",
+ "createBitmapIndex": true
+ }
+ ],
+ "dimensionExclusions": [
+ "__time"
+ ],
+ "includeAllDimensions": false
+ },
+ "metricsSpec": [],
+ "granularitySpec": {
+ "type": "arbitrary",
+ "queryGranularity": {
+ "type": "none"
+ },
+ "rollup": false,
+ "intervals": [
+ "-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z"
+ ]
+ },
+ "transformSpec": {
+ "filter": null,
+ "transforms": []
+ }
+ },
+ "columnMappings": [
+ {
+ "queryColumn": "timestamp",
+ "outputColumn": "timestamp"
+ },
+ {
+ "queryColumn": "agent_category",
+ "outputColumn": "agent_category"
+ },
+ {
+ "queryColumn": "agent_type",
+ "outputColumn": "agent_type"
+ }
+ ],
+ "tuningConfig": {
+ "maxNumWorkers": 1,
+ "maxRowsInMemory": 100000,
+ "rowsPerSegment": 3000000
+ }
+ },
+ "signature": [],
+ "maxWorkerCount": 1
+ },
+ "phase": "FINISHED",
+ "workerCount": 1,
+ "partitionCount": 1,
+ "startTime": "2022-09-14T22:12:31.602Z",
+ "duration": 5891
+ }
+ ],
+ "counters": {
+ "0": {
+ "0": {
+ "input0": {
+ "type": "channel",
+ "rows": [
+ 465346
+ ],
+ "files": [
+ 1
+ ],
+ "totalFiles": [
+ 1
+ ]
+ },
+ "output": {
+ "type": "channel",
+ "rows": [
+ 465346
+ ],
+ "bytes": [
+ 43694447
+ ],
+ "frames": [
+ 7
+ ]
+ },
+ "shuffle": {
+ "type": "channel",
+ "rows": [
+ 465346
+ ],
+ "bytes": [
+ 41835307
+ ],
+ "frames": [
+ 73
+ ]
+ },
+ "sortProgress": {
+ "type": "sortProgress",
+ "totalMergingLevels": 3,
+ "levelToTotalBatches": {
+ "0": 1,
+ "1": 1,
+ "2": 1
+ },
+ "levelToMergedBatches": {
+ "0": 1,
+ "1": 1,
+ "2": 1
+ },
+ "totalMergersForUltimateLevel": 1,
+ "progressDigest": 1
+ }
+ }
+ },
+ "1": {
+ "0": {
+ "input0": {
+ "type": "channel",
+ "rows": [
+ 465346
+ ],
+ "bytes": [
+ 41835307
+ ],
+ "frames": [
+ 73
+ ]
+ },
+ "segmentGenerationProgress": {
+ "type": "segmentGenerationProgress",
+ "rowsProcessed": 465346,
+ "rowsPersisted": 465346,
+ "rowsMerged": 465346
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+</details>
+
+<a name="report-response-fields"></a>
+
+The following table describes the response fields when you retrieve a report for a MSQ task engine using the `/druid/indexer/v1/task/{taskId}/reports` endpoint:
+
+| Field | Description |
+|---|---|
+| `multiStageQuery.taskId` | Controller task ID. |
+| `multiStageQuery.payload.status` | Query status container. |
+| `multiStageQuery.payload.status.status` | RUNNING, SUCCESS, or FAILED. |
+| `multiStageQuery.payload.status.startTime` | Start time of the query in ISO format. Only present if the query has started running. |
+| `multiStageQuery.payload.status.durationMs` | Milliseconds elapsed after the query has started running. -1 denotes that the query hasn't started running yet. |
+| `multiStageQuery.payload.status.workers` | Workers for the controller task.|
+| `multiStageQuery.payload.status.workers.<workerNumber>` | Array of worker tasks including retries. |
+| `multiStageQuery.payload.status.workers.<workerNumber>[].workerId` | Id of the worker task.| |
+| `multiStageQuery.payload.status.workers.<workerNumber>[].status` | RUNNING, SUCCESS, or FAILED.|
+| `multiStageQuery.payload.status.workers.<workerNumber>[].durationMs` | Milliseconds elapsed between when the worker task was first requested and when it finished. It is -1 for worker tasks with status RUNNING.|
+| `multiStageQuery.payload.status.workers.<workerNumber>[].pendingMs` | Milliseconds elapsed between when the worker task was first requested and when it fully started RUNNING. Actual work time can be calculated using `actualWorkTimeMS = durationMs - pendingMs`.|
+| `multiStageQuery.payload.status.pendingTasks` | Number of tasks that are not fully started. -1 denotes that the number is currently unknown. |
+| `multiStageQuery.payload.status.runningTasks` | Number of currently running tasks. Should be at least 1 since the controller is included. |
+| `multiStageQuery.payload.status.segmentLoadStatus` | Segment loading container. Only present after the segments have been published. |
+| `multiStageQuery.payload.status.segmentLoadStatus.state` | Either INIT, WAITING, SUCCESS, FAILED or TIMED_OUT. |
+| `multiStageQuery.payload.status.segmentLoadStatus.startTime` | Time since which the controller has been waiting for the segments to finish loading. |
+| `multiStageQuery.payload.status.segmentLoadStatus.duration` | The duration in milliseconds that the controller has been waiting for the segments to load. |
+| `multiStageQuery.payload.status.segmentLoadStatus.totalSegments` | The total number of segments generated by the job. This includes tombstone segments (if any). |
+| `multiStageQuery.payload.status.segmentLoadStatus.usedSegments` | The number of segments which are marked as used based on the load rules. Unused segments can be cleaned up at any time. |
+| `multiStageQuery.payload.status.segmentLoadStatus.precachedSegments` | The number of segments which are marked as precached and served by historicals, as per the load rules. |
+| `multiStageQuery.payload.status.segmentLoadStatus.onDemandSegments` | The number of segments which are not loaded on any historical, as per the load rules. |
+| `multiStageQuery.payload.status.segmentLoadStatus.pendingSegments` | The number of segments remaining to be loaded. |
+| `multiStageQuery.payload.status.segmentLoadStatus.unknownSegments` | The number of segments whose status is unknown. |
+| `multiStageQuery.payload.status.segmentReport` | Segment report. Only present if the query is an ingestion. |
+| `multiStageQuery.payload.status.segmentReport.shardSpec` | Contains the shard spec chosen. |
+| `multiStageQuery.payload.status.segmentReport.details` | Contains further reasoning about the shard spec chosen. |
+| `multiStageQuery.payload.status.errorReport` | Error object. Only present if there was an error. |
+| `multiStageQuery.payload.status.errorReport.taskId` | The task that reported the error, if known. May be a controller task or a worker task. |
+| `multiStageQuery.payload.status.errorReport.host` | The hostname and port of the task that reported the error, if known. |
+| `multiStageQuery.payload.status.errorReport.stageNumber` | The stage number that reported the error, if it happened during execution of a specific stage. |
+| `multiStageQuery.payload.status.errorReport.error` | Error object. Contains `errorCode` at a minimum, and may contain other fields as described in the [error code table](../multi-stage-query/reference.md#error-codes). Always present if there is an error. |
+| `multiStageQuery.payload.status.errorReport.error.errorCode` | One of the error codes from the [error code table](../multi-stage-query/reference.md#error-codes). Always present if there is an error. |
+| `multiStageQuery.payload.status.errorReport.error.errorMessage` | User-friendly error message. Not always present, even if there is an error. |
+| `multiStageQuery.payload.status.errorReport.exceptionStackTrace` | Java stack trace in string form, if the error was due to a server-side exception. |
+| `multiStageQuery.payload.stages` | Array of query stages. |
+| `multiStageQuery.payload.stages[].stageNumber` | Each stage has a number that differentiates it from other stages. |
+| `multiStageQuery.payload.stages[].phase` | Either NEW, READING_INPUT, POST_READING, RESULTS_COMPLETE, or FAILED. Only present if the stage has started. |
+| `multiStageQuery.payload.stages[].workerCount` | Number of parallel tasks that this stage is running on. Only present if the stage has started. |
+| `multiStageQuery.payload.stages[].partitionCount` | Number of output partitions generated by this stage. Only present if the stage has started and has computed its number of output partitions. |
+| `multiStageQuery.payload.stages[].startTime` | Start time of this stage. Only present if the stage has started. |
+| `multiStageQuery.payload.stages[].duration` | The number of milliseconds that the stage has been running. Only present if the stage has started. |
+| `multiStageQuery.payload.stages[].sort` | A boolean that is set to `true` if the stage does a sort as part of its execution. |
+| `multiStageQuery.payload.stages[].definition` | The object defining what the stage does. |
+| `multiStageQuery.payload.stages[].definition.id` | The unique identifier of the stage. |
+| `multiStageQuery.payload.stages[].definition.input` | Array of inputs that the stage has. |
+| `multiStageQuery.payload.stages[].definition.broadcast` | Array of input indexes that get broadcasted. Only present if there are inputs that get broadcasted. |
+| `multiStageQuery.payload.stages[].definition.processor` | An object defining the processor logic. |
+| `multiStageQuery.payload.stages[].definition.signature` | The output signature of the stage. |
+
+## Cancel a query task
+
+Cancels a query task.
+Returns a JSON object with the ID of the task that was canceled successfully.
+
+### URL
+
+`POST` `/druid/indexer/v1/task/{taskId}/shutdown`
+
+### Responses
+
+<Tabs>
+
+<TabItem value="16" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully shut down task*
+
+</TabItem>
+<TabItem value="17" label="404 NOT FOUND">
+
+
+<br/>
+
+*Cannot find task with ID or task is no longer running*
+
+</TabItem>
+</Tabs>
+
+---
+
+### Sample request
+
+The following example shows how to cancel a query task with the ID `query-655efe33-781a-4c50-ae84-c2911b42d63c`.
+
+<Tabs>
+
+<TabItem value="18" label="HTTP">
+
+
+```HTTP
+POST /druid/indexer/v1/task/query-655efe33-781a-4c50-ae84-c2911b42d63c/shutdown HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+
+<TabItem value="19" label="cURL">
+
+
+```shell
+curl --location --request POST 'http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/task/query-655efe33-781a-4c50-ae84-c2911b42d63c/shutdown'
+```
+
+</TabItem>
+
+<TabItem value="20" label="Python">
+
+
+```python
+import requests
+
+url = "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/task/query-655efe33-781a-4c50-ae84-c2911b42d63c/shutdown"
+
+payload = {}
+headers = {}
+
+response = requests.post(url, headers=headers, data=payload)
+
+print(response.text)
+print(response.text)
+```
+
+</TabItem>
+
+</Tabs>
+
+### Sample response
+
+The response shows the ID of the task that was canceled.
+
+```json
+{
+ "task": "query-655efe33-781a-4c50-ae84-c2911b42d63c"
+}
+```
\ No newline at end of file
diff --git a/docs/35.0.0/api-reference/sql-jdbc.md b/docs/35.0.0/api-reference/sql-jdbc.md
new file mode 100644
index 000000000..affe9ea73
--- /dev/null
+++ b/docs/35.0.0/api-reference/sql-jdbc.md
@@ -0,0 +1,251 @@
+---
+id: sql-jdbc
+title: SQL JDBC driver API
+sidebar_label: SQL JDBC driver
+---
+
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+:::info
+ Apache Druid supports two query languages: Druid SQL and [native queries](../querying/querying.md).
+ This document describes the SQL language.
+:::
+
+You can make [Druid SQL](../querying/sql.md) queries using the [Avatica JDBC driver](https://calcite.apache.org/avatica/downloads/).
+We recommend using Avatica JDBC driver version 1.23.0 or later. Note that starting with Avatica 1.21.0, you may need to set the [`transparent_reconnection`](https://calcite.apache.org/avatica/docs/client_reference.html#transparent_reconnection) property to `true` if you notice intermittent query failures.
+
+Once you've downloaded the Avatica client jar, add it to your classpath.
+
+Example connection string:
+
+```
+jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica/;transparent_reconnection=true
+```
+
+Or, to use the protobuf protocol instead of JSON:
+
+```
+jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica-protobuf/;transparent_reconnection=true;serialization=protobuf
+```
+
+The `url` is the `/druid/v2/sql/avatica/` endpoint on the Router, which routes JDBC connections to a consistent Broker.
+For more information, see [Connection stickiness](#connection-stickiness).
+
+Set `transparent_reconnection` to `true` so your connection is not interrupted if the pool of Brokers changes membership,
+or if a Broker is restarted.
+
+Set `serialization` to `protobuf` if using the protobuf endpoint.
+
+Note that as of the time of this writing, Avatica 1.23.0, the latest version, does not support passing
+[connection context parameters](../querying/sql-query-context.md) from the JDBC connection string to Druid. These context parameters
+must be passed using a `Properties` object instead. Refer to the Java code below for an example.
+
+Example Java code:
+
+```java
+// Connect to /druid/v2/sql/avatica/ on your Broker.
+String url = "jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica/;transparent_reconnection=true";
+
+// Set any connection context parameters you need here.
+// Any property from https://druid.apache.org/docs/latest/querying/sql-query-context.html can go here.
+Properties connectionProperties = new Properties();
+connectionProperties.setProperty("sqlTimeZone", "Etc/UTC");
+//To connect to a Druid deployment protected by basic authentication,
+//you can incorporate authentication details from https://druid.apache.org/docs/latest/operations/security-overview
+connectionProperties.setProperty("user", "admin");
+connectionProperties.setProperty("password", "password1");
+
+try (Connection connection = DriverManager.getConnection(url, connectionProperties)) {
+ try (
+ final Statement statement = connection.createStatement();
+ final ResultSet resultSet = statement.executeQuery(query)
+ ) {
+ while (resultSet.next()) {
+ // process result set
+ }
+ }
+}
+```
+
+For a runnable example that includes a query that you might run, see [Examples](#examples).
+
+It is also possible to use a protocol buffers JDBC connection with Druid, this offer reduced bloat and potential performance
+improvements for larger result sets. To use it apply the following connection URL instead, everything else remains the same
+
+```
+String url = "jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica-protobuf/;transparent_reconnection=true;serialization=protobuf";
+```
+
+:::info
+ The protobuf endpoint is also known to work with the official [Golang Avatica driver](https://github.com/apache/calcite-avatica-go)
+:::
+
+Table metadata is available over JDBC using `connection.getMetaData()` or by querying the
+[INFORMATION_SCHEMA tables](../querying/sql-metadata-tables.md). For an example of this, see [Get the metadata for a datasource](#get-the-metadata-for-a-datasource).
+
+## Connection stickiness
+
+Druid's JDBC server does not share connection state between Brokers. This means that if you're using JDBC and have
+multiple Druid Brokers, you should either connect to a specific Broker or use a load balancer with sticky sessions
+enabled. The Druid Router process provides connection stickiness when balancing JDBC requests, and can be used to achieve
+the necessary stickiness even with a normal non-sticky load balancer. Please see the
+[Router](../design/router.md) documentation for more details.
+
+Note that the non-JDBC [JSON over HTTP](sql-api.md#submit-a-query) API is stateless and does not require stickiness.
+
+## Dynamic parameters
+
+You can use [parameterized queries](../querying/sql.md#dynamic-parameters) in JDBC code, as in this example:
+
+```java
+PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) AS cnt FROM druid.foo WHERE dim1 = ? OR dim1 = ?");
+statement.setString(1, "abc");
+statement.setString(2, "def");
+final ResultSet resultSet = statement.executeQuery();
+```
+
+Sample code where dynamic parameters replace arrays using STRING_TO_ARRAY:
+```java
+PreparedStatement statement = connection.prepareStatement("select l1 from numfoo where SCALAR_IN_ARRAY(l1, STRING_TO_ARRAY(CAST(? as varchar),','))");
+List<Integer> li = ImmutableList.of(0, 7);
+String sqlArg = Joiner.on(",").join(li);
+statement.setString(1, sqlArg);
+statement.executeQuery();
+```
+
+Sample code using native array:
+```java
+PreparedStatement statement = connection.prepareStatement("select l1 from numfoo where SCALAR_IN_ARRAY(l1, ?)");
+Iterable<Object> list = ImmutableList.of(0, 7);
+ArrayFactoryImpl arrayFactoryImpl = new ArrayFactoryImpl(TimeZone.getDefault());
+AvaticaType type = ColumnMetaData.scalar(Types.INTEGER, SqlType.INTEGER.name(), Rep.INTEGER);
+Array array = arrayFactoryImpl.createArray(type, list);
+statement.setArray(1, array);
+statement.executeQuery();
+```
+
+## Examples
+
+<!-- docs/tutorial-jdbc.md redirects here -->
+
+The following section contains two complete samples that use the JDBC connector:
+
+- [Get the metadata for a datasource](#get-the-metadata-for-a-datasource) shows you how to query the `INFORMATION_SCHEMA` to get metadata like column names.
+- [Query data](#query-data) runs a select query against the datasource.
+
+You can try out these examples after verifying that you meet the [prerequisites](#prerequisites).
+
+For more information about the connection options, see [Client Reference](https://calcite.apache.org/avatica/docs/client_reference.html).
+
+### Prerequisites
+
+Make sure you meet the following requirements before trying these examples:
+
+- A supported [Java version](../operations/java.md)
+
+- [Avatica JDBC driver](https://calcite.apache.org/avatica/downloads/). You can add the JAR to your `CLASSPATH` directly or manage it externally, such as through Maven and a `pom.xml` file.
+
+- An available Druid instance. You can use the `micro-quickstart` configuration described in [Quickstart (local)](../tutorials/index.md). The examples assume that you are using the quickstart, so no authentication or authorization is expected unless explicitly mentioned.
+
+- The example `wikipedia` datasource from the quickstart is loaded on your Druid instance. If you have a different datasource loaded, you can still try these examples. You'll have to update the table name and column names to match your datasource.
+
+### Get the metadata for a datasource
+
+Metadata, such as column names, is available either through the [`INFORMATION_SCHEMA`](../querying/sql-metadata-tables.md) table or through `connection.getMetaData()`. The following example uses the `INFORMATION_SCHEMA` table to retrieve and print the list of column names for the `wikipedia` datasource that you loaded during a previous tutorial.
+
+```java
+import java.sql.*;
+import java.util.Properties;
+
+public class JdbcListColumns {
+
+ public static void main(String[] args)
+ {
+ // Connect to /druid/v2/sql/avatica/ on your Router.
+ // You can connect to a Broker but must configure connection stickiness if you do.
+ String url = "jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica/;transparent_reconnection=true";
+
+ String query = "SELECT COLUMN_NAME,* FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'wikipedia' and TABLE_SCHEMA='druid'";
+
+ // Set any connection context parameters you need here.
+ // Any property from https://druid.apache.org/docs/latest/querying/sql-query-context.html can go here.
+ Properties connectionProperties = new Properties();
+
+ try (Connection connection = DriverManager.getConnection(url, connectionProperties)) {
+ try (
+ final Statement statement = connection.createStatement();
+ final ResultSet rs = statement.executeQuery(query)
+ ) {
+ while (rs.next()) {
+ String columnName = rs.getString("COLUMN_NAME");
+ System.out.println(columnName);
+ }
+ }
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+}
+```
+
+### Query data
+
+Now that you know what columns are available, you can start querying the data. The following example queries the datasource named `wikipedia` for the timestamps and comments from Japan. It also sets the [query context parameter](../querying/sql-query-context.md) `sqlTimeZone`. Optionally, you can also parameterize queries by using [dynamic parameters](#dynamic-parameters).
+
+```java
+import java.sql.*;
+import java.util.Properties;
+
+public class JdbcCountryAndTime {
+
+ public static void main(String[] args)
+ {
+ // Connect to /druid/v2/sql/avatica/ on your Router.
+ // You can connect to a Broker but must configure connection stickiness if you do.
+ String url = "jdbc:avatica:remote:url=http://localhost:8888/druid/v2/sql/avatica/;transparent_reconnection=true";
+
+ //The query you want to run.
+ String query = "SELECT __time, isRobot, countryName, comment FROM wikipedia WHERE countryName='Japan'";
+
+ // Set any connection context parameters you need here.
+ // Any property from https://druid.apache.org/docs/latest/querying/sql-query-context.html can go here.
+ Properties connectionProperties = new Properties();
+ connectionProperties.setProperty("sqlTimeZone", "America/Los_Angeles");
+
+ try (Connection connection = DriverManager.getConnection(url, connectionProperties)) {
+ try (
+ final Statement statement = connection.createStatement();
+ final ResultSet rs = statement.executeQuery(query)
+ ) {
+ while (rs.next()) {
+ Timestamp timeStamp = rs.getTimestamp("__time");
+ String comment = rs.getString("comment");
+ System.out.println(timeStamp);
+ System.out.println(comment);
+ }
+ }
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+}
+```
diff --git a/docs/latest/api-reference/supervisor-api.md b/docs/35.0.0/api-reference/supervisor-api.md
similarity index 99%
copy from docs/latest/api-reference/supervisor-api.md
copy to docs/35.0.0/api-reference/supervisor-api.md
index e43470f0e..38e68d4e1 100644
--- a/docs/latest/api-reference/supervisor-api.md
+++ b/docs/35.0.0/api-reference/supervisor-api.md
@@ -1827,6 +1827,11 @@ Retrieves an audit history of specs for a single supervisor.
`GET` `/druid/indexer/v1/supervisor/{supervisorId}/history`
+#### Query parameters
+
+* `count` (optional)
+ * Type: Integer
+ * Limit the number of results to the last `n` entries. Must be greater than 0 if specified.
#### Responses
@@ -1850,7 +1855,9 @@ Retrieves an audit history of specs for a single supervisor.
#### Sample request
-The following example shows how to retrieve the audit history of a supervisor with the name `wikipedia_stream`.
+The following examples show how to retrieve the audit history of a supervisor with the name `wikipedia_stream`.
+
+**Get all history entries:**
<Tabs>
@@ -1873,6 +1880,29 @@ Host: http://ROUTER_IP:ROUTER_PORT
</TabItem>
</Tabs>
+**Get last 10 history entries:**
+
+<Tabs>
+
+<TabItem value="33" label="cURL">
+
+
+```shell
+curl "http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/supervisor/wikipedia_stream/history?count=10"
+```
+
+</TabItem>
+<TabItem value="34" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/supervisor/wikipedia_stream/history?count=10 HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
#### Sample response
<details>
diff --git a/docs/35.0.0/api-reference/tasks-api.md b/docs/35.0.0/api-reference/tasks-api.md
new file mode 100644
index 000000000..f53037f84
--- /dev/null
+++ b/docs/35.0.0/api-reference/tasks-api.md
@@ -0,0 +1,1663 @@
+---
+id: tasks-api
+title: Tasks API
+sidebar_label: Tasks
+---
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+<!--
+
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements. See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership. The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied. See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+ -->
+
+This document describes the API endpoints for task retrieval, submission, and deletion for Apache Druid. Tasks are individual jobs performed by Druid to complete operations such as ingestion, querying, and compaction.
+
+In this topic, `http://ROUTER_IP:ROUTER_PORT` is a placeholder for the Router service address and port. For example, on the quickstart configuration, use `http://localhost:8888`.
+
+## Task information and retrieval
+
+### Get an array of tasks
+
+Retrieves an array of all tasks in the Druid cluster. Each task object includes information on its ID, status, associated datasource, and other metadata. For definitions of the response properties, see the [Tasks table](../querying/sql-metadata-tables.md#tasks-table).
+
+#### URL
+
+`GET` `/druid/indexer/v1/tasks`
+
+#### Query parameters
+
+The endpoint supports a set of optional query parameters to filter results.
+
+|Parameter|Type|Description|
+|---|---|---|
+|`state`|String|Filter list of tasks by task state, valid options are `running`, `complete`, `waiting`, and `pending`.|
+| `datasource`|String| Return tasks filtered by Druid datasource.|
+| `createdTimeInterval`|String (ISO-8601)| Return tasks created within the specified interval. Use `_` as the delimiter for the interval string. Do not use `/`. For example, `2023-06-27_2023-06-28`.|
+| `max`|Integer|Maximum number of `complete` tasks to return. Only applies when `state` is set to `complete`.|
+| `type`|String|Filter tasks by task type. See [task documentation](../ingestion/tasks.md) for more details.|
+
+#### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+<br/>
+
+*Successfully retrieved list of tasks*
+
+</TabItem>
+<TabItem value="2" label="400 BAD REQUEST">
+
+
+<br/>
+
+*Invalid `state` query parameter value*
+
+</TabItem>
+<TabItem value="3" label="500 SERVER ERROR">
+
+
+<br/>
+
+*Invalid query parameter*
+
+</TabItem>
+</Tabs>
... 44848 lines suppressed ...
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org