2017-10-26 06:53:27 -07:00
---
title: HTTP API
sort_rank: 7
---
# HTTP API
The current stable HTTP API is reachable under `/api/v1` on a Prometheus
server. Any non-breaking additions will be added under that endpoint.
## Format overview
The API response format is JSON. Every successful API request returns a `2xx`
status code.
Invalid requests that reach the API handlers return a JSON error object
and one of the following HTTP response codes:
- `400 Bad Request` when parameters are missing or incorrect.
- `422 Unprocessable Entity` when an expression can't be executed
([RFC4918](http://tools.ietf.org/html/rfc4918#page-78)).
- `503 Service Unavailable` when queries time out or abort.
Other non-`2xx` codes may be returned for errors occurring before the API
endpoint is reached.
The JSON response envelope format is as follows:
```
{
"status": "success" | "error",
"data": < data > ,
// Only set if status is "error". The data field may still hold
// additional data.
"errorType": "< string > ",
"error": "< string > "
}
```
Input timestamps may be provided either in
[RFC3339 ](https://www.ietf.org/rfc/rfc3339.txt ) format or as a Unix timestamp
in seconds, with optional decimal places for sub-second precision. Output
timestamps are always represented as Unix timestamps in seconds.
Names of query parameters that may be repeated end with `[]` .
`<series_selector>` placeholders refer to Prometheus [time series
selectors](basics.md#time-series-selectors) like `http_requests_total` or
2017-11-22 04:11:21 -08:00
`http_requests_total{method=~"(GET|POST)"}` and need to be URL-encoded.
2017-10-26 06:53:27 -07:00
`<duration>` placeholders refer to Prometheus duration strings of the form
`[0-9]+[smhdwy]` . For example, `5m` refers to a duration of 5 minutes.
2018-08-04 12:30:53 -07:00
`<bool>` placeholders refer to boolean values (strings `true` and `false` ).
2017-10-26 06:53:27 -07:00
## Expression queries
Query language expressions may be evaluated at a single instant or over a range
of time. The sections below describe the API endpoints for each type of
expression query.
### Instant queries
The following endpoint evaluates an instant query at a single point in time:
```
GET /api/v1/query
```
URL query parameters:
- `query=<string>` : Prometheus expression query string.
- `time=<rfc3339 | unix_timestamp>` : Evaluation timestamp. Optional.
- `timeout=<duration>` : Evaluation timeout. Optional. Defaults to and
is capped by the value of the `-query.timeout` flag.
The current server time is used if the `time` parameter is omitted.
The `data` section of the query result has the following format:
```
{
"resultType": "matrix" | "vector" | "scalar" | "string",
"result": < value >
}
```
`<value>` refers to the query result data, which has varying formats
depending on the `resultType` . See the [expression query result
formats](#expression-query-result-formats).
The following example evaluates the expression `up` at the time
`2015-07-01T20:10:51.781Z` :
```json
$ curl 'http://localhost:9090/api/v1/query?query=up& time=2015-07-01T20:10:51.781Z'
{
"status" : "success",
"data" : {
"resultType" : "vector",
"result" : [
{
"metric" : {
"__name__" : "up",
"job" : "prometheus",
"instance" : "localhost:9090"
},
"value": [ 1435781451.781, "1" ]
},
{
"metric" : {
"__name__" : "up",
"job" : "node",
"instance" : "localhost:9100"
},
"value" : [ 1435781451.781, "0" ]
}
]
}
}
```
### Range queries
The following endpoint evaluates an expression query over a range of time:
```
GET /api/v1/query_range
```
URL query parameters:
- `query=<string>` : Prometheus expression query string.
- `start=<rfc3339 | unix_timestamp>` : Start timestamp.
- `end=<rfc3339 | unix_timestamp>` : End timestamp.
2018-07-07 01:20:18 -07:00
- `step=<duration | float>` : Query resolution step width in `duration` format or float number of seconds.
2017-10-26 06:53:27 -07:00
- `timeout=<duration>` : Evaluation timeout. Optional. Defaults to and
is capped by the value of the `-query.timeout` flag.
The `data` section of the query result has the following format:
```
{
"resultType": "matrix",
"result": < value >
}
```
For the format of the `<value>` placeholder, see the [range-vector result
format](#range-vectors).
The following example evaluates the expression `up` over a 30-second range with
a query resolution of 15 seconds.
```json
$ curl 'http://localhost:9090/api/v1/query_range?query=up& start=2015-07-01T20:10:30.781Z& end=2015-07-01T20:11:00.781Z& step=15s'
{
"status" : "success",
"data" : {
"resultType" : "matrix",
"result" : [
{
"metric" : {
"__name__" : "up",
"job" : "prometheus",
"instance" : "localhost:9090"
},
"values" : [
[ 1435781430.781, "1" ],
[ 1435781445.781, "1" ],
[ 1435781460.781, "1" ]
]
},
{
"metric" : {
"__name__" : "up",
"job" : "node",
"instance" : "localhost:9091"
},
"values" : [
[ 1435781430.781, "0" ],
[ 1435781445.781, "0" ],
[ 1435781460.781, "1" ]
]
}
]
}
}
```
## Querying metadata
### Finding series by label matchers
The following endpoint returns the list of time series that match a certain label set.
```
GET /api/v1/series
```
URL query parameters:
- `match[]=<series_selector>` : Repeated series selector argument that selects the
series to return. At least one `match[]` argument must be provided.
- `start=<rfc3339 | unix_timestamp>` : Start timestamp.
- `end=<rfc3339 | unix_timestamp>` : End timestamp.
The `data` section of the query result consists of a list of objects that
contain the label name/value pairs which identify each series.
The following example returns all series that match either of the selectors
`up` or `process_start_time_seconds{job="prometheus"}` :
```json
$ curl -g 'http://localhost:9090/api/v1/series?match[]=up& match[]=process_start_time_seconds{job="prometheus"}'
{
"status" : "success",
"data" : [
{
"__name__" : "up",
"job" : "prometheus",
"instance" : "localhost:9090"
},
{
"__name__" : "up",
"job" : "node",
"instance" : "localhost:9091"
},
{
"__name__" : "process_start_time_seconds",
"job" : "prometheus",
"instance" : "localhost:9090"
}
]
}
```
### Querying label values
The following endpoint returns a list of label values for a provided label name:
```
GET /api/v1/label/< label_name > /values
```
The `data` section of the JSON response is a list of string label names.
This example queries for all label values for the `job` label:
```json
$ curl http://localhost:9090/api/v1/label/job/values
{
"status" : "success",
"data" : [
"node",
"prometheus"
]
}
```
## Expression query result formats
Expression queries may return the following response values in the `result`
property of the `data` section. `<sample_value>` placeholders are numeric
sample values. JSON does not support special float values such as `NaN` , `Inf` ,
and `-Inf` , so sample values are transferred as quoted JSON strings rather than
raw numbers.
### Range vectors
Range vectors are returned as result type `matrix` . The corresponding
`result` property has the following format:
```
[
{
"metric": { "< label_name > ": "< label_value > ", ... },
"values": [ [ < unix_time > , "< sample_value > " ], ... ]
},
...
]
```
### Instant vectors
Instant vectors are returned as result type `vector` . The corresponding
`result` property has the following format:
```
[
{
"metric": { "< label_name > ": "< label_value > ", ... },
"value": [ < unix_time > , "< sample_value > " ]
},
...
]
```
### Scalars
Scalar results are returned as result type `scalar` . The corresponding
`result` property has the following format:
```
[ < unix_time > , "< scalar_value > " ]
```
### Strings
String results are returned as result type `string` . The corresponding
`result` property has the following format:
```
[ < unix_time > , "< string_value > " ]
```
## Targets
The following endpoint returns an overview of the current state of the
Prometheus target discovery:
```
GET /api/v1/targets
```
2018-02-21 09:26:18 -08:00
Both the active and dropped targets are part of the response.
`labels` represents the label set after relabelling has occurred.
`discoveredLabels` represent the unmodified labels retrieved during service discovery before relabelling has occurred.
2017-10-26 06:53:27 -07:00
```json
$ curl http://localhost:9090/api/v1/targets
{
2018-05-18 00:32:11 -07:00
"status": "success",
2017-10-26 06:53:27 -07:00
"data": {
"activeTargets": [
{
"discoveredLabels": {
"__address__": "127.0.0.1:9090",
"__metrics_path__": "/metrics",
"__scheme__": "http",
"job": "prometheus"
},
"labels": {
"instance": "127.0.0.1:9090",
"job": "prometheus"
},
"scrapeUrl": "http://127.0.0.1:9090/metrics",
"lastError": "",
"lastScrape": "2017-01-17T15:07:44.723715405+01:00",
"health": "up"
}
2018-02-21 09:26:18 -08:00
],
"droppedTargets": [
{
"discoveredLabels": {
"__address__": "127.0.0.1:9100",
"__metrics_path__": "/metrics",
"__scheme__": "http",
"job": "node"
},
}
2017-10-26 06:53:27 -07:00
]
}
}
```
2018-06-27 00:15:17 -07:00
## Rules
The `/rules` API endpoint returns a list of alerting and recording rules that
are currently loaded. In addition it returns the currently active alerts fired
by the Prometheus instance of each alerting rule.
As the `/rules` endpoint is fairly new, it does not have the same stability
guarantees as the overarching API v1.
```
GET /api/v1/rules
```
```json
$ curl http://localhost:9090/api/v1/rules
{
"data": {
"groups": [
{
"rules": [
{
"alerts": [
{
"activeAt": "2018-07-04T20:27:12.60602144+02:00",
"annotations": {
"summary": "High request latency"
},
"labels": {
"alertname": "HighRequestLatency",
"severity": "page"
},
"state": "firing",
"value": 1
}
],
"annotations": {
"summary": "High request latency"
},
"duration": 600,
2018-08-23 06:00:10 -07:00
"health": "ok",
2018-06-27 00:15:17 -07:00
"labels": {
"severity": "page"
},
"name": "HighRequestLatency",
"query": "job:request_latency_seconds:mean5m{job=\"myjob\"} > 0.5",
"type": "alerting"
},
{
2018-08-23 06:00:10 -07:00
"health": "ok",
2018-06-27 00:15:17 -07:00
"name": "job:http_inprogress_requests:sum",
"query": "sum(http_inprogress_requests) by (job)",
"type": "recording"
}
],
"file": "/rules.yaml",
"interval": 60,
"name": "example"
}
]
},
"status": "success"
}
```
## Alerts
The `/alerts` endpoint returns a list of all active alerts.
As the `/alerts` endpoint is fairly new, it does not have the same stability
guarantees as the overarching API v1.
```
GET /api/v1/alerts
```
```json
$ curl http://localhost:9090/api/v1/alerts
{
"data": {
"alerts": [
{
"activeAt": "2018-07-04T20:27:12.60602144+02:00",
"annotations": {},
"labels": {
"alertname": "my-alert"
},
"state": "firing",
"value": 1
}
]
},
"status": "success"
}
```
2018-06-05 03:30:19 -07:00
## Querying target metadata
2018-05-18 00:32:11 -07:00
The following endpoint returns metadata about metrics currently scraped by targets.
2018-06-05 03:30:19 -07:00
This is **experimental** and might change in the future.
2018-05-18 00:32:11 -07:00
```
GET /api/v1/targets/metadata
```
URL query parameters:
2018-06-05 03:30:19 -07:00
- `match_target=<label_selectors>` : Label selectors that match targets by their label sets. All targets are selected if left empty.
- `metric=<string>` : A metric name to retrieve metadata for. All metric metadata is retrieved if left empty.
2018-05-18 00:32:11 -07:00
- `limit=<number>` : Maximum number of targets to match.
The `data` section of the query result consists of a list of objects that
contain metric metadata and the target label set.
The following example returns all metadata entries for the `go_goroutines` metric
from the first two targets with label `job="prometheus"` .
```json
curl -G http://localhost:9091/api/v1/targets/metadata \
2018-06-05 03:30:19 -07:00
--data-urlencode 'metric=go_goroutines' \
--data-urlencode 'match_target={job="prometheus"}' \
2018-05-18 00:32:11 -07:00
--data-urlencode 'limit=2'
{
"status": "success",
"data": [
{
"target": {
"instance": "127.0.0.1:9090",
"job": "prometheus"
},
"type": "gauge",
2018-10-05 09:11:16 -07:00
"help": "Number of goroutines that currently exist.",
"unit": ""
2018-05-18 00:32:11 -07:00
},
{
"target": {
"instance": "127.0.0.1:9091",
"job": "prometheus"
},
"type": "gauge",
2018-10-05 09:11:16 -07:00
"help": "Number of goroutines that currently exist.",
"unit": ""
2018-05-18 00:32:11 -07:00
}
]
}
```
2018-06-05 03:30:19 -07:00
The following example returns metadata for all metrics for all targets with
2018-05-18 00:32:11 -07:00
label `instance="127.0.0.1:9090` .
```json
curl -G http://localhost:9091/api/v1/targets/metadata \
2018-06-05 03:30:19 -07:00
--data-urlencode 'match_target={instance="127.0.0.1:9090"}'
2018-05-18 00:32:11 -07:00
{
"status": "success",
"data": [
// ...
{
"target": {
"instance": "127.0.0.1:9090",
"job": "prometheus"
},
"metric": "prometheus_treecache_zookeeper_failures_total",
"type": "counter",
2018-10-05 09:11:16 -07:00
"help": "The total number of ZooKeeper failures.",
"unit": ""
2018-05-18 00:32:11 -07:00
},
{
"target": {
"instance": "127.0.0.1:9090",
"job": "prometheus"
},
"metric": "prometheus_tsdb_reloads_total",
"type": "counter",
2018-10-05 09:11:16 -07:00
"help": "Number of times the database reloaded block data from disk.",
"unit": ""
2018-05-18 00:32:11 -07:00
},
// ...
]
}
```
2017-10-26 06:53:27 -07:00
## Alertmanagers
The following endpoint returns an overview of the current state of the
Prometheus alertmanager discovery:
```
GET /api/v1/alertmanagers
```
2018-02-21 01:00:07 -08:00
Both the active and dropped Alertmanagers are part of the response.
2017-10-26 06:53:27 -07:00
```json
$ curl http://localhost:9090/api/v1/alertmanagers
{
"status": "success",
"data": {
"activeAlertmanagers": [
{
"url": "http://127.0.0.1:9090/api/v1/alerts"
}
2018-02-21 01:00:07 -08:00
],
"droppedAlertmanagers": [
{
"url": "http://127.0.0.1:9093/api/v1/alerts"
}
2017-10-26 06:53:27 -07:00
]
}
}
```
2017-11-30 08:16:04 -08:00
api: Added v1/status/flags endpoint. (#3864)
Endpoint URL: /api/v1/status/flags
Example Output:
```json
{
"status": "success",
"data": {
"alertmanager.notification-queue-capacity": "10000",
"alertmanager.timeout": "10s",
"completion-bash": "false",
"completion-script-bash": "false",
"completion-script-zsh": "false",
"config.file": "my_cool_prometheus.yaml",
"help": "false",
"help-long": "false",
"help-man": "false",
"log.level": "info",
"query.lookback-delta": "5m",
"query.max-concurrency": "20",
"query.timeout": "2m",
"storage.tsdb.max-block-duration": "36h",
"storage.tsdb.min-block-duration": "2h",
"storage.tsdb.no-lockfile": "false",
"storage.tsdb.path": "data/",
"storage.tsdb.retention": "15d",
"version": "false",
"web.console.libraries": "console_libraries",
"web.console.templates": "consoles",
"web.enable-admin-api": "false",
"web.enable-lifecycle": "false",
"web.external-url": "",
"web.listen-address": "0.0.0.0:9090",
"web.max-connections": "512",
"web.read-timeout": "5m",
"web.route-prefix": "/",
"web.user-assets": ""
}
}
```
Signed-off-by: Bartek Plotka <bwplotka@gmail.com>
2018-02-21 00:49:02 -08:00
## Status
Following status endpoints expose current Prometheus configuration.
### Config
The following endpoint returns currently loaded configuration file:
```
GET /api/v1/status/config
```
The config is returned as dumped YAML file. Due to limitation of the YAML
library, YAML comments are not included.
```json
$ curl http://localhost:9090/api/v1/status/config
{
"status": "success",
"data": {
"yaml": "< content of the loaded config file in YAML > ",
}
}
```
### Flags
The following endpoint returns flag values that Prometheus was configured with:
```
GET /api/v1/status/flags
```
All values are in a form of "string".
```json
$ curl http://localhost:9090/api/v1/status/flags
{
"status": "success",
"data": {
"alertmanager.notification-queue-capacity": "10000",
"alertmanager.timeout": "10s",
"log.level": "info",
"query.lookback-delta": "5m",
"query.max-concurrency": "20",
...
}
}
```
*New in v2.2*
2017-11-30 08:16:04 -08:00
## TSDB Admin APIs
2017-12-02 21:07:05 -08:00
These are APIs that expose database functionalities for the advanced user. These APIs are not enabled unless the `--web.enable-admin-api` is set.
2017-11-30 08:16:04 -08:00
2017-12-02 21:07:05 -08:00
We also expose a gRPC API whose definition can be found [here ](https://github.com/prometheus/prometheus/blob/master/prompb/rpc.proto ). This is experimental and might change in the future.
2017-11-30 08:16:04 -08:00
### Snapshot
Snapshot creates a snapshot of all current data into `snapshots/<datetime>-<rand>` under the TSDB's data directory and returns the directory as response.
2018-03-08 02:43:41 -08:00
It will optionally skip snapshotting data that is only present in the head block, and which has not yet been compacted to disk.
2017-11-30 08:16:04 -08:00
```
2018-03-08 02:43:41 -08:00
POST /api/v1/admin/tsdb/snapshot?skip_head=< bool >
2017-11-30 08:16:04 -08:00
```
```json
2017-12-02 21:07:05 -08:00
$ curl -XPOST http://localhost:9090/api/v1/admin/tsdb/snapshot
2017-11-30 08:16:04 -08:00
{
2017-12-05 08:26:06 -08:00
"status": "success",
"data": {
2017-12-10 11:19:34 -08:00
"name": "20171210T211224Z-2be650b6d019eb54"
2017-12-05 08:26:06 -08:00
}
2017-11-30 08:16:04 -08:00
}
```
2017-12-10 11:19:34 -08:00
The snapshot now exists at `<data-dir>/snapshots/20171210T211224Z-2be650b6d019eb54`
2017-11-30 08:16:04 -08:00
2017-12-05 08:26:06 -08:00
*New in v2.1*
2017-11-30 08:16:04 -08:00
### Delete Series
DeleteSeries deletes data for a selection of series in a time range. The actual data still exists on disk and is cleaned up in future compactions or can be explicitly cleaned up by hitting the Clean Tombstones endpoint.
2017-12-05 08:26:06 -08:00
If successful, a `204` is returned.
2017-11-30 08:16:04 -08:00
```
2017-12-05 08:26:06 -08:00
POST /api/v1/admin/tsdb/delete_series
2017-11-30 08:16:04 -08:00
```
2017-12-02 21:07:05 -08:00
URL query parameters:
2017-11-30 08:16:04 -08:00
2017-12-02 21:07:05 -08:00
- `match[]=<series_selector>` : Repeated label matcher argument that selects the series to delete. At least one `match[]` argument must be provided.
2017-12-05 08:26:06 -08:00
- `start=<rfc3339 | unix_timestamp>` : Start timestamp. Optional and defaults to minimum possible time.
- `end=<rfc3339 | unix_timestamp>` : End timestamp. Optional and defaults to maximum possible time.
Not mentioning both start and end times would clear all the data for the matched series in the database.
2017-11-30 08:16:04 -08:00
Example:
```json
2018-04-05 05:06:18 -07:00
$ curl -X POST \
-g 'http://localhost:9090/api/v1/admin/tsdb/delete_series?match[]=up& match[]=process_start_time_seconds{job="prometheus"}'
2017-11-30 08:16:04 -08:00
```
2017-12-05 08:26:06 -08:00
*New in v2.1*
2017-11-30 08:16:04 -08:00
### Clean Tombstones
CleanTombstones removes the deleted data from disk and cleans up the existing tombstones. This can be used after deleting series to free up space.
2017-12-05 08:26:06 -08:00
If successful, a `204` is returned.
2017-11-30 08:16:04 -08:00
```
2017-12-02 21:07:05 -08:00
POST /api/v1/admin/tsdb/clean_tombstones
2017-11-30 08:16:04 -08:00
```
This takes no parameters or body.
```json
2017-12-02 21:07:05 -08:00
$ curl -XPOST http://localhost:9090/api/v1/admin/tsdb/clean_tombstones
2017-12-05 08:26:06 -08:00
```
*New in v2.1*