| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484 | [role="xpack"][[security-api-query-api-key]]=== Query API key information API++++<titleabbrev>Query API key information</titleabbrev>++++Retrieves information for API keys with <<query-dsl,Query DSL>>in a <<paginate-search-results,paginated>> fashion.[[security-api-query-api-key-request]]==== {api-request-title}`GET /_security/_query/api_key``POST /_security/_query/api_key`[[security-api-query-api-key-prereqs]]==== {api-prereq-title}* To use this API, you must have at least the `manage_own_api_key` or the `read_security`cluster privileges.* If you have only the `manage_own_api_key` privilege, this API returns onlythe API keys that you own. If you have the `read_security`, `manage_api_key` or greaterprivileges (including `manage_security`), this API returns all API keysregardless of ownership.[[security-api-query-api-key-desc]]==== {api-description-title}Use this API to retrieve the API keys created with the<<security-api-create-api-key,create API key API>> in a paginated manner.You can optionally filter the results with a query.[[security-api-query-api-key-query-params]]==== {api-path-parms-title}`with_limited_by`::(Optional, Boolean) A boolean flag to return the snapshot of the owner user's role descriptorsassociated with the API key. An API key's actual permission is the intersection ofits <<api-key-role-descriptors,assigned role descriptors>> and the owner user's role descriptors(effectively limited by it). An API key cannot retrieve any API key's limited-by role descriptors(including itself) unless it has `manage_api_key` or higher privileges.[[security-api-query-api-key-request-body]]==== {api-request-body-title}You can specify the following parameters in the request body:`query`::(Optional, string) A <<query-dsl,query>> to filter which API keys to return.The query supports a subset of query types, including<<query-dsl-match-all-query,`match_all`>>, <<query-dsl-bool-query,`bool`>>,<<query-dsl-term-query,`term`>>, <<query-dsl-terms-query,`terms`>>, <<query-dsl-ids-query,`ids`>>,<<query-dsl-prefix-query,`prefix`>>, <<query-dsl-wildcard-query,`wildcard`>>, <<query-dsl-exists-query,`exists`>>,and <<query-dsl-range-query,`range`>>.+You can query the following public values associated with an API key.+.Valid values for `query`[%collapsible%open]====`id`::ID of the API key. Note `id` must be queried with the <<query-dsl-ids-query,`ids`>> query.`type`::API keys can be of type `rest`, if created via the <<security-api-create-api-key, Create API key>> orthe <<security-api-grant-api-key, Grant API key>> APIs, or of type `cross_cluster` if created viathe <<security-api-create-cross-cluster-api-key, Create Cross-Cluster API key>> API.`name`::Name of the API key.`creation`::Creation time of the API key in milliseconds.`expiration`::Expiration time of the API key in milliseconds.`invalidated`::Indicates whether the API key is invalidated. If `true`, the key is invalidated.Defaults to `false`.`invalidation`::Invalidation time of the API key in milliseconds. This field is only set for invalidated API keys.`username`::Username of the API key owner.`realm`::Realm name of the API key owner.`metadata`::Metadata field associated with the API key, such as `metadata.my_field`. Becausemetadata is stored as a <<flattened,flattened>> field type, all fields act like`keyword` fields when querying and sorting.NOTE: You cannot query the role descriptors of an API key.====include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=from]+By default, you cannot page through more than 10,000 hits using the `from` and`size` parameters. To page through more hits, use the<<search-after,`search_after`>> parameter.`size`::(Optional, integer) The number of hits to return. Must not be negative and defaults to `10`.+By default, you cannot page through more than 10,000 hits using the `from` and`size` parameters. To page through more hits, use the<<search-after,`search_after`>> parameter.`sort`::(Optional, object) <<sort-search-results,Sort definition>>. Other than `id`,all public fields of an API key are eligible for sorting. In addition, sort canalso be applied to the `_doc` field to sort by index order.`search_after`::(Optional, array) <<search-after,Search after>> definition.[[security-api-query-api-key-response-body]]==== {api-response-body-title}This API returns the following top level fields:`total`::The total number of API keys found.`count`::The number of API keys returned in the response.`api_keys`::A list of API key information.[[security-api-query-api-key-example]]==== {api-examples-title}The following request lists all API keys, assuming you have the`manage_api_key` privilege:[source,console]----GET /_security/_query/api_key----A successful call returns a JSON structure that contains the informationretrieved from one or more API keys:[source,js]----{  "total": 3,  "count": 3,  "api_keys": [ <1>    {      "id": "nkvrGXsB8w290t56q3Rg",      "name": "my-api-key-1",      "creation": 1628227480421,      "expiration": 1629091480421,      "invalidated": false,      "username": "elastic",      "realm": "reserved",      "metadata": {        "letter": "a"      },      "role_descriptors": { <2>        "role-a": {          "cluster": [            "monitor"          ],          "indices": [            {              "names": [                "index-a"              ],              "privileges": [                "read"              ],              "allow_restricted_indices": false            }          ],          "applications": [ ],          "run_as": [ ],          "metadata": { },          "transient_metadata": {            "enabled": true          }        }      }    },    {      "id": "oEvrGXsB8w290t5683TI",      "name": "my-api-key-2",      "creation": 1628227498953,      "expiration": 1628313898953,      "invalidated": false,      "username": "elastic",      "realm": "reserved",      "metadata": {        "letter": "b"      },      "role_descriptors": { } <3>    }  ]}----// NOTCONSOLE<1> The list of API keys that were retrieved for this request<2> The role descriptors that are assigned to this API key when it was <<api-key-role-descriptors,created>>or last <<security-api-update-api-key-api-key-role-descriptors,updated>>. Note the API key'seffective permissions are an intersection of its assigned privileges and the point-in-time snapshot ofthe owner user's permissions.<3> An empty role descriptors means the API key inherits the owner user's permissions.If you create an API key with the following details:[source,console]----POST /_security/api_key{  "name": "application-key-1",  "metadata": { "application": "my-application"}}----A successful call returns a JSON structure that providesAPI key information. For example:[source,console-result]----{  "id": "VuaCfGcBCdbkQm-e5aOx",  "name": "application-key-1",  "api_key": "ui2lp2axTNmsyakw9tvNnw",  "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="}----// TESTRESPONSE[s/VuaCfGcBCdbkQm-e5aOx/$body.id/]// TESTRESPONSE[s/ui2lp2axTNmsyakw9tvNnw/$body.api_key/]// TESTRESPONSE[s/VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw==/$body.encoded/]Use the information from the response to retrieve the API key by ID:[source,console]----GET /_security/_query/api_key?with_limited_by=true{  "query": {    "ids": {      "values": [        "VuaCfGcBCdbkQm-e5aOx"      ]    }  }}----// TEST[s/VuaCfGcBCdbkQm-e5aOx/$body.id/]// TEST[continued]A successful call returns a JSON structure for API key information including its limited-by role descriptors:[source,js]--------------------------------------------------{  "api_keys": [    {      "id": "VuaCfGcBCdbkQm-e5aOx",      "name": "application-key-1",      "creation": 1548550550158,      "expiration": 1548551550158,      "invalidated": false,      "username": "myuser",      "realm": "native1",      "metadata": {        "application": "my-application"      },      "role_descriptors": { },      "limited_by": [ <1>        {          "role-power-user": {            "cluster": [              "monitor"            ],            "indices": [              {                "names": [                  "*"                ],                "privileges": [                  "read"                ],                "allow_restricted_indices": false              }            ],            "applications": [ ],            "run_as": [ ],            "metadata": { },            "transient_metadata": {              "enabled": true            }          }        }      ]    }  ]}--------------------------------------------------// NOTCONSOLE<1> The owner user's permissions associated with the API key.It is a point-in-time snapshot captured at <<security-api-create-api-key,creation>> andsubsequent <<security-api-update-api-key,updates>>. An API key'seffective permissions are an intersection of its assigned privileges andthe owner user's permissions.You can also retrieve the API key by name:[source,console]----GET /_security/_query/api_key{  "query": {    "term": {      "name": {        "value": "application-key-1"      }    }  }}----// TEST[continued]Use a `bool` query to issue complex logical conditions and use`from`, `size`, `sort` to help paginate the result:[source,js]----GET /_security/_query/api_key{  "query": {    "bool": {      "must": [        {          "prefix": {            "name": "app1-key-" <1>          }        },        {          "term": {            "invalidated": "false" <2>          }        }      ],      "must_not": [        {          "term": {            "name": "app1-key-01" <3>          }        }      ],      "filter": [        {          "wildcard": {            "username": "org-*-user" <4>          }        },        {          "term": {            "metadata.environment": "production" <5>          }        }      ]    }  },  "from": 20, <6>  "size": 10, <7>  "sort": [ <8>    { "creation": { "order": "desc", "format": "date_time" } },    "name"  ]}----// NOTCONSOLE<1> The API key name must begin with `app1-key-`<2> The API key must still be valid<3> The API key name must not be `app1-key-01`<4> The API key must be owned by a username of the <<query-dsl-wildcard-query,wildcard>> pattern `org-*-user`<5> The API key must have the metadata field `environment` that has the value of `production`<6> The offset to begin the search result is the 20th (zero-based index) API key<7> The page size of the response is 10 API keys<8> The result is first sorted by `creation` date in descending order, then by name in ascending orderThe response contains a list of matched API keys along with their sort values:[source,js]----{  "total": 100,  "count": 10,  "api_keys": [    {      "id": "CLXgVnsBOGkf8IyjcXU7",      "name": "app1-key-79",      "creation": 1629250154811,      "invalidated": false,      "username": "org-admin-user",      "realm": "native1",      "metadata": {        "environment": "production"      },      "role_descriptors": { },      "_sort": [        "2021-08-18T01:29:14.811Z",  <1>        "app1-key-79"  <2>      ]    },    {      "id": "BrXgVnsBOGkf8IyjbXVB",      "name": "app1-key-78",      "creation": 1629250153794,      "invalidated": false,      "username": "org-admin-user",      "realm": "native1",      "metadata": {        "environment": "production"      },      "role_descriptors": { },      "_sort": [        "2021-08-18T01:29:13.794Z",        "app1-key-78"      ]    },    ...  ]}----// NOTCONSOLE<1> The first sort value is creation time, which is displayed in `date_time` <<mapping-date-format,format>> as defined in the request<2> The second sort value is the API key nameYou can use the following request to retrieve all valid API keys, i.e. not invalidated and not expired:[source,js]----GET /_security/_query/api_key{  "query": {    "bool": {      "must": {        "term": {          "invalidated": false  <1>        }      },      "should": [  <2>        {          "range": {            "expiration": {              "gte": "now"            }          }        },        {          "bool": {            "must_not": {              "exists": {                "field": "expiration"              }            }          }        }      ],      "minimum_should_match": 1    }  }}----// NOTCONSOLE<1> Matching API keys must not be invalidated<2> Matching API keys must be either not expired or does not have an expiration date
 |