Controller API Reference
All user APIs available in Pinot
The full up-to-date list of APIs can be viewed on Swagger.
Cluster
GET /cluster/configs
List all the cluster configs. These are fetched from Zookeeper from the CONFIGS/CLUSTER/<clusterName> znode.
Request
curl -X GET "http://localhost:9000/cluster/configs" -H "accept: application/json"Response
{
"allowParticipantAutoJoin": "true",
"enable.case.insensitive": "false",
"pinot.broker.enable.query.limit.override": "false",
"default.hyperloglog.log2m": "8"
}POST /cluster/configs
Post new configs to cluster. These will get stored in the same znode as above i.e. CONFIGS/CLUSTER/<clusterName>. These properties are appended to the existing properties if keys are new, else they will be updated if key already exists.
Request
Response
DELETE /cluster/configs
Delete a cluster config.
Request
Response
GET /cluster/info
Gets cluster related info, such as cluster name
Request
Response
Health
GET /health
Check controller health. Status are OK or WebApplicationException with ServiceUnavailable and message
Request
Response
Leader
GET /leader/tables
Gets the leader resource map, which shows the tables that are mapped to each leader.
Request
Response
GET /leader/tables/<tableName>
Gets the leaders for the specific table
Request
Response
Table
GET /debug/tables/<tableName>
Debug information for the table, which includes metadata and error status about segments, ingestion, servers and brokers of the table
Request
Response
Application Quotas
Application-level query quotas allow you to limit the queries per second (QPS) issued by different applications connecting to Pinot, regardless of which tables or databases they query. Applications are identified by the applicationName query option. For more details on how application quotas interact with table and database quotas, see Query Quotas.
GET /applicationQuotas
Get all application QPS quotas. Returns a map of application names to their configured QPS quota values. Returns an empty map if no application quotas have been configured.
Request
Response
GET /applicationQuotas/{appName}
Get the QPS quota for a specific application. If a quota has been explicitly set for the given application, that value is returned. Otherwise, the cluster-level default application quota (applicationMaxQueriesPerSecond) is returned. Returns null if neither is configured.
Request
Response
POST /applicationQuotas/{appName}
Create or update the QPS quota for a specific application. The maxQueriesPerSecond query parameter specifies the new quota value. To remove a previously configured quota for an application (falling back to the cluster default), omit the maxQueriesPerSecond parameter or leave it empty.
Request
Response
To remove an application-specific quota:
DELETE /tables/<tableName>
Deletes a table from the cluster. By default, deleted segments are moved to a Deleted Segments area and retained for a configurable period (controlled by controller.deleted.segments.retentionInDays, default 7 days) before being permanently removed. This allows recovery if the deletion was accidental.
You can override this behavior by passing the retention query parameter to specify a custom retention period for the deleted segments. Setting retention=0d deletes segments immediately, bypassing the default retention period entirely.
Query Parameters
type
string
No
Table type (OFFLINE or REALTIME). If not specified, both types are deleted if they exist.
retention
string
No
Retention period for deleted segments (e.g., 0d for immediate deletion, 1d for one day). Overrides the cluster default.
Request (default behavior)
Request (immediate deletion)
Response
Setting retention=0d permanently deletes all segments immediately with no possibility of recovery. Use this option only when you are certain the data is no longer needed, such as during development, testing, or cleaning up temporary tables.
For large tables, the default delete operation may time out because it copies segments to the deleted-segments area. Using retention=0d bypasses this copy step, which can help avoid timeouts.
DELETE /schemas/<schemaName>
Deletes a schema from the cluster. A schema can only be deleted if no tables are currently using it. If a table still references the schema, the delete request will fail.
To delete both a table and its schema in a single workflow, first delete the table using DELETE /tables/<tableName>, then delete the schema using this endpoint.
Request
Response
In the Pinot Data Explorer UI, you can delete both the table and its schema together by checking the Delete Schema option in the delete table dialog. The UI will delete the table first and then automatically delete the associated schema.
Table Config Validation
Enhanced in Pinot 1.4.0 with cluster-aware validations (see PR #16675)
POST /tableConfigs/validate
Validates a table configuration before you create or update a table. This endpoint now performs cluster-aware validations by default, catching errors like missing tenant tags or unavailable minion instances that previously only surfaced during table creation.
The endpoint checks:
Schema and table config consistency
Tenant assignment validity (do instances with the required tags exist?)
Minion instance availability (if task configs reference minion)
Active task conflicts
Request
Parameters
validationTypesToSkip
query
Comma-separated list of validation types to skip (e.g., TENANT,MINION_INSTANCES)
The supported validation types that can be skipped are: TENANT, MINION_INSTANCES, ACTIVE_TASKS.
Response
On success, returns the validated config. On failure, returns an error message describing the validation issue.
Logical Table Management
Added in Pinot 1.4.0
Logical tables provide a unified view over multiple physical tables (REALTIME and OFFLINE). A query against a logical table internally scans all of its underlying physical tables, similar to a SQL VIEW with UNION semantics. This is useful for scaling large tables, performing ALTER TABLE workflows like Kafka topic reconfiguration, and managing time-based data layouts.
GET /logicalTables
List all logical table names in the cluster.
Request
Response
GET /logicalTables/<tableName>
Get the configuration of a specific logical table.
Request
Response
POST /logicalTables
Create a new logical table. The physical tables referenced must already exist. All physical tables must share a compatible schema.
Request
Response
PUT /logicalTables/<tableName>
Update an existing logical table, for example to add or remove physical tables.
Request
Response
DELETE /logicalTables/<tableName>
Delete a logical table. This does not delete the underlying physical tables.
Request
Response
Rebalance
Enhanced in Pinot 1.4.0 with dry-run summary mode, pre-checks, and disk utilization info
POST /tables/<tableName>/rebalance
Trigger a rebalance for a table. In 1.4.0, this API gained several new capabilities:
Dry-run summary mode: Pass
dryRun=trueto get a summary of what the rebalance would do without making any changes.Pre-checks: Pass
preChecks=trueto run validation checks (replica group info, disk utilization) before executing the rebalance.Disk utilization threshold override: Use
diskUtilizationThresholdOverrideto customize the threshold for the disk utilization pre-check.Tenant info: The rebalance response now includes tenant information.
minimizeDataMovement: Pass
minimizeDataMovement=trueto reduce the amount of data moved during the rebalance.
Request
Ingestion
POST /tables/<tableName>/pauseConsumption
Pause real-time consumption for a table.
Request
POST /tables/<tableName>/resumeConsumption
Resume real-time consumption for a table.
Request
Other Notable APIs (1.4.0)
The following APIs were added or enhanced in Pinot 1.4.0. Refer to Swagger for complete request/response details.
/tables/{tableName}/badSegments
GET
Returns bad segments grouped by partition ID
/tables/{tableName}/removeIngestionMetrics
POST
Removes stale ingestion metrics for a table
/debug/serverRoutingStats
GET
Returns server routing stats as JSON (previously returned a string)
/tables/{tableName}/idealstate
GET
Now accepts optional segmentNames parameter to filter results
/tables/{tableName}/externalview
GET
Now accepts optional segmentNames parameter to filter results
/tenants/{tenantName}/tables
GET
Now supports withTableProperties parameter for richer tenant info
/query_range
GET/POST
Prometheus-compatible time series query endpoint (Beta)
For the complete and most current list of all controller APIs, always refer to the Swagger UI at http://<controller-host>:<port>/help.
Last updated
Was this helpful?

