1--- 2layout: api 3page_title: ACL Tokens - HTTP API 4description: The /acl/token endpoints manage Consul's ACL Tokens. 5--- 6 7# ACL Token HTTP API 8 9-> **1.4.0+:** The APIs are available in Consul versions 1.4.0 and later. The documentation for the legacy ACL API is [here](/api/acl/legacy). 10 11The `/acl/token` endpoints [create](#create-a-token), [read](#read-a-token), 12[update](#update-a-token), [list](#list-tokens), [clone](#clone-a-token) and [delete](#delete-a-token) ACL tokens in Consul. 13 14For more information on how to setup ACLs, please check 15the [ACL tutorial](https://learn.hashicorp.com/tutorials/consul/access-control-setup-production). 16 17## Create a Token 18 19This endpoint creates a new ACL token. 20 21| Method | Path | Produces | 22| ------ | ------------ | ------------------ | 23| `PUT` | `/acl/token` | `application/json` | 24 25The table below shows this endpoint's support for 26[blocking queries](/api/features/blocking), 27[consistency modes](/api/features/consistency), 28[agent caching](/api/features/caching), and 29[required ACLs](/api#authentication). 30 31| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | 32| ---------------- | ----------------- | ------------- | ------------ | 33| `NO` | `none` | `none` | `acl:write` | 34 35### Parameters 36 37- `AccessorID` `(string: "")` - Specifies a UUID to use as the token's Accessor ID. 38 If not specified a UUID will be generated for this field. Added in v1.5.0. 39 40- `SecretID` `(string: "")` - Specifies a UUID to use as the token's Secret ID. 41 If not specified a UUID will be generated for this field. Added in v1.5.0. 42 **Note**: The SecretID is used to authorize operations against Consul and should 43 be generated from an appropriate cryptographic source. 44 45- `Description` `(string: "")` - Free form human readable description of the token. 46 47- `Policies` `(array<PolicyLink>)` - The list of policies that should be 48 applied to the token. A PolicyLink is an object with an "ID" and/or "Name" 49 field to specify a policy. With the PolicyLink, tokens can be linked to 50 policies either by the policy name or by the policy ID. When policies are 51 linked by name they will be internally resolved to the policy ID. With 52 linking tokens internally by IDs, Consul enables policy renaming without 53 breaking tokens. 54 55- `Roles` `(array<RoleLink>)` - The list of roles that should be applied to the 56 token. A RoleLink is an object with an "ID" and/or "Name" field to specify a 57 role. With the RoleLink, tokens can be linked to roles either by the role 58 name or by the role ID. When roles are linked by name they will be internally 59 resolved to the role ID. With linking tokens internally by IDs, Consul 60 enables role renaming without breaking tokens. Added in Consul 1.5.0. 61 62- `ServiceIdentities` `(array<ServiceIdentity>)` - The list of [service 63 identities](/docs/acl/acl-system#acl-service-identities) that should be 64 applied to the token. Added in Consul 1.5.0. 65 66 - `ServiceName` `(string: <required>)` - The name of the service. The name 67 must be no longer than 256 characters, must start and end with a lowercase 68 alphanumeric character, and can only contain lowercase alphanumeric 69 characters as well as `-` and `_`. 70 71 - `Datacenters` `(array<string>)` - Specifies the datacenters the effective 72 policy is valid within. When no datacenters are provided the effective 73 policy is valid in all datacenters including those which do not yet exist 74 but may in the future. 75 76- `NodeIdentities` `(array<NodeIdentity>)` - The list of [node 77 identities](/docs/acl/acl-system#acl-node-identities) that should be 78 applied to the token. Added in Consul 1.8.1. 79 80 - `NodeName` `(string: <required>)` - The name of the node. The name 81 must be no longer than 256 characters, must start and end with a lowercase 82 alphanumeric character, and can only contain lowercase alphanumeric 83 characters as well as `-` and `_`. 84 85 - `Datacenter` `(string: <required>)` - Specifies the nodes datacenter. This 86 will result in effective policy only being valid in that datacenter. 87 88- `Local` `(bool: false)` - If true, indicates that the token should not be 89 replicated globally and instead be local to the current datacenter. 90 91- `ExpirationTime` `(time: "")`- If set this represents the point after which a 92 token should be considered revoked and is eligible for destruction. The 93 default unset value represents NO expiration. This value must be between 1 94 minute and 24 hours in the future. Added in Consul 1.5.0. 95 96- `ExpirationTTL` `(duration: 0s)` - This is a convenience field and if set 97 will initialize the `ExpirationTime` field to a value of `CreateTime + ExpirationTTL`. This field is not persisted beyond its initial use. Can be 98 specified in the form of `"60s"` or `"5m"` (i.e., 60 seconds or 5 minutes, 99 respectively). This value must be no smaller than 1 minute and no longer than 100 24 hours. Added in Consul 1.5.0. 101 102- `Namespace` `(string: "")` <EnterpriseAlert inline /> - Specifies the namespace to 103 create the token. If not provided in the JSON body, the value of 104 the `ns` URL query parameter or in the `X-Consul-Namespace` header will be used. 105 If not provided, the namespace will be inherited from the request's ACL 106 token or will default to the `default` namespace. Added in Consul 1.7.0. 107 108### Sample Payload 109 110```json 111{ 112 "Description": "Agent token for 'node1'", 113 "Policies": [ 114 { 115 "ID": "165d4317-e379-f732-ce70-86278c4558f7" 116 }, 117 { 118 "Name": "node-read" 119 } 120 ], 121 "Local": false 122} 123``` 124 125### Sample Request 126 127```shell-session 128$ curl -X PUT \ 129 --data @payload.json \ 130 http://127.0.0.1:8500/v1/acl/token 131``` 132 133### Sample Response 134 135```json 136{ 137 "AccessorID": "6a1253d2-1785-24fd-91c2-f8e78c745511", 138 "SecretID": "45a3bd52-07c7-47a4-52fd-0745e0cfe967", 139 "Description": "Agent token for 'node1'", 140 "Policies": [ 141 { 142 "ID": "165d4317-e379-f732-ce70-86278c4558f7", 143 "Name": "node1-write" 144 }, 145 { 146 "ID": "e359bd81-baca-903e-7e64-1ccd9fdc78f5", 147 "Name": "node-read" 148 } 149 ], 150 "Local": false, 151 "CreateTime": "2018-10-24T12:25:06.921933-04:00", 152 "Hash": "UuiRkOQPRCvoRZHRtUxxbrmwZ5crYrOdZ0Z1FTFbTbA=", 153 "CreateIndex": 59, 154 "ModifyIndex": 59 155} 156``` 157 158## Read a Token 159 160This endpoint reads an ACL token with the given Accessor ID. 161 162| Method | Path | Produces | 163| ------ | ------------------------ | ------------------ | 164| `GET` | `/acl/token/:AccessorID` | `application/json` | 165 166The table below shows this endpoint's support for 167[blocking queries](/api/features/blocking), 168[consistency modes](/api/features/consistency), 169[agent caching](/api/features/caching), and 170[required ACLs](/api#authentication). 171 172| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | 173| ---------------- | ----------------- | ------------- | ------------ | 174| `YES` | `all` | `none` | `acl:read` | 175 176### Parameters 177 178- `AccessorID` `(string: <required>)` - Specifies the accessor ID of the ACL token to 179 read. This is required and is specified as part of the URL path. 180 181- `ns` `(string: "")` <EnterpriseAlert inline /> - Specifies the namespace to lookup 182 the token. This value can be specified as the `ns` URL query 183 parameter or the `X-Consul-Namespace` header. If not provided by either, 184 the namespace will be inherited from the request's ACL token or will default 185 to the `default` namespace. Added in Consul 1.7.0. 186 187### Sample Request 188 189```shell-session 190$ curl -X GET http://127.0.0.1:8500/v1/acl/token/6a1253d2-1785-24fd-91c2-f8e78c745511 191``` 192 193### Sample Response 194 195-> **Note** If the token used for accessing the API has `acl:write` permissions, 196then the `SecretID` will contain the tokens real value. Only when accessed with 197a token with only `acl:read` permissions will the `SecretID` be redacted. This 198is to prevent privilege escalation whereby having `acl:read` privileges allows 199for reading other secrets which given even more permissions. 200 201```json 202{ 203 "AccessorID": "6a1253d2-1785-24fd-91c2-f8e78c745511", 204 "SecretID": "<hidden>", 205 "Description": "Agent token for 'node1'", 206 "Policies": [ 207 { 208 "ID": "165d4317-e379-f732-ce70-86278c4558f7", 209 "Name": "node1-write" 210 }, 211 { 212 "ID": "e359bd81-baca-903e-7e64-1ccd9fdc78f5", 213 "Name": "node-read" 214 } 215 ], 216 "Local": false, 217 "CreateTime": "2018-10-24T12:25:06.921933-04:00", 218 "Hash": "UuiRkOQPRCvoRZHRtUxxbrmwZ5crYrOdZ0Z1FTFbTbA=", 219 "CreateIndex": 59, 220 "ModifyIndex": 59 221} 222``` 223 224## Read Self Token 225 226This endpoint returns the ACL token details that matches the secret ID 227specified with the `X-Consul-Token` header or the `token` query parameter. 228 229| Method | Path | Produces | 230| ------ | ----------------- | ------------------ | 231| `GET` | `/acl/token/self` | `application/json` | 232 233The table below shows this endpoint's support for 234[blocking queries](/api/features/blocking), 235[consistency modes](/api/features/consistency), 236[agent caching](/api/features/caching), and 237[required ACLs](/api#authentication). 238 239| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | 240| ---------------- | ----------------- | ------------- | ------------ | 241| `YES` | `all` | `none` | `none` | 242 243-> **Note** - This endpoint requires no specific privileges as it is just 244retrieving the data for a token that you must already possess its secret. 245 246### Sample Request 247 248```shell-session 249$ curl -H "X-Consul-Token: 6a1253d2-1785-24fd-91c2-f8e78c745511" \ 250 http://127.0.0.1:8500/v1/acl/token/self 251``` 252 253### Sample Response 254 255```json 256{ 257 "AccessorID": "6a1253d2-1785-24fd-91c2-f8e78c745511", 258 "SecretID": "45a3bd52-07c7-47a4-52fd-0745e0cfe967", 259 "Description": "Agent token for 'node1'", 260 "Policies": [ 261 { 262 "ID": "165d4317-e379-f732-ce70-86278c4558f7", 263 "Name": "node1-write" 264 }, 265 { 266 "ID": "e359bd81-baca-903e-7e64-1ccd9fdc78f5", 267 "Name": "node-read" 268 } 269 ], 270 "Local": false, 271 "CreateTime": "2018-10-24T12:25:06.921933-04:00", 272 "Hash": "UuiRkOQPRCvoRZHRtUxxbrmwZ5crYrOdZ0Z1FTFbTbA=", 273 "CreateIndex": 59, 274 "ModifyIndex": 59 275} 276``` 277 278## Update a Token 279 280This endpoint updates an existing ACL token. 281 282| Method | Path | Produces | 283| ------ | ------------------------ | ------------------ | 284| `PUT` | `/acl/token/:AccessorID` | `application/json` | 285 286The table below shows this endpoint's support for 287[blocking queries](/api/features/blocking), 288[consistency modes](/api/features/consistency), 289[agent caching](/api/features/caching), and 290[required ACLs](/api#authentication). 291 292| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | 293| ---------------- | ----------------- | ------------- | ------------ | 294| `NO` | `none` | `none` | `acl:write` | 295 296### Parameters 297 298- `AccessorID` `(string: "")` - Specifies the accessor ID of the token being updated. This is 299 required in the URL path but may also be specified in the JSON body. If specified 300 in both places then they must match exactly. This field is immutable. If not present in 301 the body and only in the URL then it will be filled in by Consul. 302 303- `SecretID` `(string: "")` - Specifies the secret ID of the token being updated. This field is 304 immutable so if present in the body then it must match the existing value. If not present 305 then the value will be filled in by Consul. 306 307- `Description` `(string: "")` - Free form human readable description of this token. 308 309- `Policies` `(array<PolicyLink>)` - This is the list of policies that should 310 be applied to this token. A PolicyLink is an object with an "ID" and/or 311 "Name" field to specify a policy. With the PolicyLink tokens can be linked to policies 312 either by the policy name or by the policy ID. When policies are linked by 313 name they will internally be resolved to the policy ID. With linking tokens 314 internally by IDs, Consul enables policy renaming without breaking tokens. 315 316- `Roles` `(array<RoleLink>)` - The list of roles that should be applied to the 317 token. A RoleLink is an object with an "ID" and/or "Name" field to specify a 318 role. With the RoleLink, tokens can be linked to roles either by the role 319 name or by the role ID. When roles are linked by name they will be internally 320 resolved to the role ID. With linking tokens internally by IDs, Consul 321 enables role renaming without breaking tokens. 322 323- `ServiceIdentities` `(array<ServiceIdentity>)` - The list of [service 324 identities](/docs/acl/acl-system#acl-service-identities) that should be 325 applied to the token. Added in Consul 1.5.0. 326 327 - `ServiceName` `(string: <required>)` - The name of the service. The name 328 must be no longer than 256 characters, must start and end with a lowercase 329 alphanumeric character, and can only contain lowercase alphanumeric 330 characters as well as `-` and `_`. 331 332 - `Datacenters` `(array<string>)` - Specifies the datacenters the effective 333 policy is valid within. When no datacenters are provided the effective 334 policy is valid in all datacenters including those which do not yet exist 335 but may in the future. 336 337- `NodeIdentities` `(array<NodeIdentity>)` - The list of [node 338 identities](/docs/acl/acl-system#acl-node-identities) that should be 339 applied to the token. Added in Consul 1.8.1. 340 341 - `NodeName` `(string: <required>)` - The name of the node. The name 342 must be no longer than 256 characters, must start and end with a lowercase 343 alphanumeric character, and can only contain lowercase alphanumeric 344 characters as well as `-` and `_`. 345 346 - `Datacenter` `(string: <required>)` - Specifies the nodes datacenter. This 347 will result in effective policy only being valid in that datacenter. 348 349- `Local` `(bool: false)` - If true, indicates that this token should not be 350 replicated globally and instead be local to the current datacenter. This 351 value must match the existing value or the request will return an error. 352 353- `AuthMethod` `(string: "")` - Specifies the name of the auth method that 354 created this token. This field is immutable so if present in the body then it 355 must match the existing value. If not present then the value will be filled 356 in by Consul. 357 358- `ExpirationTime` `(time: "")` - Specifies the expiration time for the token 359 being updated. This field is immutable so if present in the body then it must 360 match the existing value. If not present then the value will be filled in by 361 Consul. 362 363- `Namespace` `(string: "")` <EnterpriseAlert inline /> - Specifies the namespace of 364 the token to update. If not provided in the JSON body, the value of 365 the `ns` URL query parameter or in the `X-Consul-Namespace` header will be used. 366 If not provided, the namespace will be inherited from the request's ACL 367 token or will default to the `default` namespace. Added in Consul 1.7.0. 368 369### Sample Payload 370 371```json 372{ 373 "Description": "Agent token for 'node1'", 374 "Policies": [ 375 { 376 "ID": "165d4317-e379-f732-ce70-86278c4558f7" 377 }, 378 { 379 "Name": "node-read" 380 }, 381 { 382 "Name": "service-read" 383 } 384 ], 385 "Local": false 386} 387``` 388 389### Sample Request 390 391```shell-session 392$ curl -X PUT \ 393 --data @payload.json \ 394 http://127.0.0.1:8500/v1/acl/token/6a1253d2-1785-24fd-91c2-f8e78c745511 395``` 396 397### Sample Response 398 399```json 400{ 401 "AccessorID": "6a1253d2-1785-24fd-91c2-f8e78c745511", 402 "SecretID": "45a3bd52-07c7-47a4-52fd-0745e0cfe967", 403 "Description": "Agent token for 'node1'", 404 "Policies": [ 405 { 406 "ID": "165d4317-e379-f732-ce70-86278c4558f7", 407 "Name": "node1-write" 408 }, 409 { 410 "ID": "e359bd81-baca-903e-7e64-1ccd9fdc78f5", 411 "Name": "node-read" 412 }, 413 { 414 "ID": "93d2226b-2046-4db1-993b-c0581b5d2391", 415 "Name": "service-read" 416 } 417 ], 418 "Local": false, 419 "CreateTime": "2018-10-24T12:25:06.921933-04:00", 420 "Hash": "UuiRkOQPRCvoRZHRtUxxbrmwZ5crYrOdZ0Z1FTFbTbA=", 421 "CreateIndex": 59, 422 "ModifyIndex": 100 423} 424``` 425 426## Clone a Token 427 428This endpoint clones an existing ACL token. 429 430| Method | Path | Produces | 431| ------ | ------------------------------ | ------------------ | 432| `PUT` | `/acl/token/:AccessorID/clone` | `application/json` | 433 434The table below shows this endpoint's support for 435[blocking queries](/api/features/blocking), 436[consistency modes](/api/features/consistency), 437[agent caching](/api/features/caching), and 438[required ACLs](/api#authentication). 439 440| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | 441| ---------------- | ----------------- | ------------- | ------------ | 442| `NO` | `none` | `none` | `acl:write` | 443 444### Parameters 445 446- `AccessorID` `(string: <required>)` - The accessor ID of the token to clone. This is required 447 in the URL path 448 449- `Description` `(string: "")` - Free form human readable description for the cloned token. 450 451- `Namespace` `(string: "")` <EnterpriseAlert inline /> - Specifies the namespace of 452 the token to be cloned. If not provided in the JSON body, the value of 453 the `ns` URL query parameter or in the `X-Consul-Namespace` header will be used. 454 If not provided, the namespace will be inherited from the request's ACL 455 token or will default to the `default` namespace. Added in Consul 1.7.0. 456 457### Sample Payload 458 459```json 460{ 461 "Description": "Clone of Agent token for 'node1'" 462} 463``` 464 465### Sample Request 466 467```shell-session 468$ curl -X PUT \ 469 --data @payload.json \ 470 http://127.0.0.1:8500/v1/acl/token/6a1253d2-1785-24fd-91c2-f8e78c745511/clone 471``` 472 473### Sample Response 474 475```json 476{ 477 "AccessorID": "773efe2a-1f6f-451f-878c-71be10712bae", 478 "SecretID": "8b1247ef-d172-4f99-b050-4dbe5d3df0cb", 479 "Description": "Clone of Agent token for 'node1'", 480 "Policies": [ 481 { 482 "ID": "165d4317-e379-f732-ce70-86278c4558f7", 483 "Name": "node1-write" 484 }, 485 { 486 "ID": "e359bd81-baca-903e-7e64-1ccd9fdc78f5", 487 "Name": "node-read" 488 }, 489 { 490 "ID": "93d2226b-2046-4db1-993b-c0581b5d2391", 491 "Name": "service-read" 492 } 493 ], 494 "Local": false, 495 "CreateTime": "2018-10-24T12:25:06.921933-04:00", 496 "Hash": "UuiRkOQPRCvoRZHRtUxxbrmwZ5crYrOdZ0Z1FTFbTbA=", 497 "CreateIndex": 128, 498 "ModifyIndex": 128 499} 500``` 501 502## Delete a Token 503 504This endpoint deletes an ACL token. 505 506| Method | Path | Produces | 507| -------- | ------------------------ | ------------------ | 508| `DELETE` | `/acl/token/:AccessorID` | `application/json` | 509 510Even though the return type is application/json, the value is either true or 511false, indicating whether the delete succeeded. 512 513The table below shows this endpoint's support for 514[blocking queries](/api/features/blocking), 515[consistency modes](/api/features/consistency), 516[agent caching](/api/features/caching), and 517[required ACLs](/api#authentication). 518 519| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | 520| ---------------- | ----------------- | ------------- | ------------ | 521| `NO` | `none` | `none` | `acl:write` | 522 523### Parameters 524 525- `AccessorID` `(string: <required>)` - Specifies the accessor ID of the ACL token to 526 delete. This is required and is specified as part of the URL path. 527 528- `ns` `(string: "")` <EnterpriseAlert inline /> - Specifies the namespace of the 529 token to delete. This value can be specified as the `ns` URL query 530 parameter or the `X-Consul-Namespace` header. If not provided by either, 531 the namespace will be inherited from the request's ACL token or will default 532 to the `default` namespace. Added in Consul 1.7.0. 533 534### Sample Request 535 536```shell-session 537$ curl -X DELETE \ 538 http://127.0.0.1:8500/v1/acl/token/8f246b77-f3e1-ff88-5b48-8ec93abf3e05 539``` 540 541### Sample Response 542 543```json 544true 545``` 546 547## List Tokens 548 549This endpoint lists all the ACL tokens. 550 551| Method | Path | Produces | 552| ------ | ------------- | ------------------ | 553| `GET` | `/acl/tokens` | `application/json` | 554 555The table below shows this endpoint's support for 556[blocking queries](/api/features/blocking), 557[consistency modes](/api/features/consistency), 558[agent caching](/api/features/caching), and 559[required ACLs](/api#authentication). 560 561| Blocking Queries | Consistency Modes | Agent Caching | ACL Required | 562| ---------------- | ----------------- | ------------- | ------------ | 563| `YES` | `all` | `none` | `acl:read` | 564 565## Parameters 566 567- `policy` `(string: "")` - Filters the token list to those tokens that are 568 linked with the specific policy ID. 569 570- `role` `(string: "")` - Filters the token list to those tokens that are 571 linked with the specific role ID. 572 573- `authmethod` `(string: "")` - Filters the token list to those tokens that are 574 linked with the specific named auth method. 575 576- `authmethod-ns` `(string: "")` <EnterpriseAlert inline /> - Specifics the namespace 577 of the `authmethod` being used for token lookup. If not provided, the namespace 578 provided by the `ns` parameter will be used. If neither of those is provided 579 then the namespace will be inherited from the request's ACL token. Added in 580 Consul 1.7.0. 581 582- `ns` `(string: "")` <EnterpriseAlert inline /> - Specifies the namespace to list 583 the tokens for. This value can be specified as the `ns` URL query 584 parameter or the `X-Consul-Namespace` header. If not provided by either, 585 the namespace will be inherited from the request's ACL token or will default 586 to the `default` namespace. The namespace may be specified as '\*' and then 587 results will be returned for all namespaces. Added in Consul 1.7.0. 588 589## Sample Request 590 591```shell-session 592$ curl -X GET http://127.0.0.1:8500/v1/acl/tokens 593``` 594 595### Sample Response 596 597-> **Note** If the token used for accessing the API has `acl:write` permissions, 598then the `SecretID` will contain the tokens real value. Only when accessed with 599a token with only `acl:read` permissions will the `SecretID` be redacted. This 600is to prevent privilege escalation whereby having `acl:read` privileges allows 601for reading other secrets which given even more permissions. 602 603```json 604[ 605 { 606 "AccessorID": "6a1253d2-1785-24fd-91c2-f8e78c745511", 607 "SecretID": "<hidden>", 608 "Description": "Agent token for 'my-agent'", 609 "Policies": [ 610 { 611 "ID": "165d4317-e379-f732-ce70-86278c4558f7", 612 "Name": "node1-write" 613 }, 614 { 615 "ID": "e359bd81-baca-903e-7e64-1ccd9fdc78f5", 616 "Name": "node-read" 617 } 618 ], 619 "Local": false, 620 "CreateTime": "2018-10-24T12:25:06.921933-04:00", 621 "Hash": "UuiRkOQPRCvoRZHRtUxxbrmwZ5crYrOdZ0Z1FTFbTbA=", 622 "CreateIndex": 59, 623 "ModifyIndex": 59 624 }, 625 { 626 "AccessorID": "00000000-0000-0000-0000-000000000002", 627 "SecretID": "<hidden>", 628 "Description": "Anonymous Token", 629 "Policies": null, 630 "Local": false, 631 "CreateTime": "0001-01-01T00:00:00Z", 632 "Hash": "RNVFSWnfd5DUOuB8vplp+imivlIna3fKQVnkUHh21cA=", 633 "CreateIndex": 5, 634 "ModifyIndex": 5 635 }, 636 { 637 "AccessorID": "3328f9a6-433c-02d0-6649-7d07268dfec7", 638 "SecretID": "<hidden>", 639 "Description": "Bootstrap Token (Global Management)", 640 "Policies": [ 641 { 642 "ID": "00000000-0000-0000-0000-000000000001", 643 "Name": "global-management" 644 } 645 ], 646 "Local": false, 647 "CreateTime": "2018-10-24T11:42:02.6427-04:00", 648 "Hash": "oyrov6+GFLjo/KZAfqgxF/X4J/3LX0435DOBy9V22I0=", 649 "CreateIndex": 12, 650 "ModifyIndex": 12 651 } 652] 653``` 654