Files
grafana/docs/sources/developer-resources/api-reference/cloud-api.md
2025-11-13 14:04:57 +00:00

2102 lines
80 KiB
Markdown

---
title: Grafana Cloud API
labels:
products:
- cloud
weight: 125
canonical: https://grafana.com/docs/grafana/latest/developer-resources/api-reference/cloud-api/
---
# Grafana Cloud API
The Grafana Cloud API, sometimes referred to as the Grafana.com API or GCOM API, allows you to interact with resources from your [Grafana Cloud Stack](/docs/grafana-cloud/account-management/cloud-stacks/) programmatically.
Below is the list of approved, static endpoints and calls for general use. Any other paths are subject to change and are not maintained for general user consumption.
{{< admonition type="note" >}}
If you need to manage or access resources from your Grafana instance—such as dashboards, alerts, data sources, users, and more—refer to the [HTTP API](../http-api/) instead.
{{< /admonition >}}
## Authentication
You must create a Cloud Access Policy and token to use the Cloud API.
To create a Grafana Cloud Access Policy, refer to [Create an access policy](https://grafana.com/docs/grafana-cloud/security-and-account-management/authentication-and-permissions/access-policies/create-access-policies/).
Requests to the API are authenticated using the `Authorization` header:
```http
Authorization: Bearer <CLOUD ACCESS POLICY TOKEN>
```
## Access policies and tokens
{{< admonition type="note" >}}
The rate limit on the Grafana Cloud API endpoint for access policies is 600 per hour.
{{< /admonition >}}
Access policies and tokens use `access policy`, `token`, `scope`, `realm`, `labelselector` and `conditions` resources.
For more information about these resources, refer to [Grafana Cloud Access Policies](https://grafana.com/docs/grafana-cloud/security-and-account-management/authentication-and-permissions/access-policies/).
{{< admonition type="note" >}}
Access policies and tokens must have a unique combination of name, org ID, and region.
{{< /admonition >}}
All API requests must specify a token in the request's `Authorization` header.
This API relies on stack and org IDs, and region:
- Stack ID: get from the `https://grafana.com/api/orgs/{org}/instances` endpoint
- Org ID: get from the `https://grafana.com/api/orgs/{org}` endpoint
- Region: get the region of your stack from the `https://grafana.com/api/orgs/{org}/instances` endpoint or get a list of all the available regions from the `https://grafana.com/api/stack-regions` endpoint
Paginated endpoints optionally accept both `pageSize` and `pageCursor` query parameters.
If you omit the `pageCursor` parameter, or provide an empty `pageCursor` value, you receive the first page.
You can get the next page's URL the current page's `metadata.pagination.nextPage` property.
If that field is `null`, you've reached the last page and there are no records left.
### Create an access policy
Create an access policy with the `POST` method.
```http
POST https://www.grafana.com/api/v1/accesspolicies
```
#### Parameters
| Name | Type | Description | Required |
| -------- | ------ | -------------------------------------------------------------------- | -------- |
| `region` | String | Region for the Access Policy. Generally where the stack is deployed. | Yes |
#### Request body
| Name | Type | Description | Required |
| ------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | --- | --- |
| `name` | String | Name of the access policy. It must be 1-255 characters long. Characters can only include lowercase letters from the English alphabet (a-z), numbers (0-9), hyphens (-) and underscores (\_). | Yes |
| `displayName` | String | Display name of the access policy, visible in the UI. Set to `name` if not provided. It must be 1-255 characters long. | No | | No |
| `scopes` | List[String] | List of [**scopes**](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#scopes). | Yes |
| `realms` | List[Realm] | List of [**realms**](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#realms). | Yes |
| `conditions` | Conditions | A set of criteria that is used to restrict access of the access policy and tokens. | No |
**Realm**
| Name | Type | Description | Required |
| --------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |
| `type` | String | Type of realm. Can be `org` or `stack`. | Yes |
| `identifier` | String | The unique identifier of a realm (ID of the org or stack depending on the realm type). | Yes |
| `labelPolicies` | List[LabelPolicy] | List of [label policies](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#labelpolicy-or-label-selectors). Available only with read permissions for metrics and logs. | No |
**LabelPolicy**
| Name | Type | Description | Required |
| ---------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `selector` | String | [Label selector](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#labelpolicy-or-label-selectors). | Yes |
**Conditions**
| Name | Type | Description | Required |
| ---------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `allowedSubnets` | List[String] | An array of IP addresses with subnet masks in CIDR notation (both IPv4 or IPv6 are supported) for [IP range based access control](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#ip-range-based-access-control). | Yes |
Example request:
```json
{
"name": "stack-readers",
"displayName": "Stack Readers",
"scopes": ["metrics:read", "logs:read", "traces:read", "alerts:read"],
"realms": [
{
"type": "stack",
"identifier": "123",
"labelPolicies": [
{
"selector": "{env != \"dev\"}"
}
]
}
],
"conditions": {
"allowedSubnets": ["192.168.0.0/24", "10.1.2.99/32"]
}
}
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------- |
| `200` | Successful operation |
Example response:
```json
{
"id": "c45485b6-8321-4cf2-bcec-12006df755ff",
"orgId": "1",
"name": "stack-readers",
"displayName": "Stack Readers",
"scopes": ["metrics:read", "logs:read", "traces:read", "alerts:read"],
"realms": [
{
"type": "stack",
"identifier": "123",
"labelPolicies": [
{
"selector": "{env != \"dev\"}"
}
]
}
],
"conditions": {
"allowedSubnets": ["192.168.0.0/24", "10.1.2.99/32"]
},
"createdAt": "2022-06-08T20:07:21.223Z",
"updatedAt": "2022-06-08T20:07:21.223Z"
}
```
| Code | Description |
| ----- | -------------------------------- |
| `400` | Bad request |
| `401` | API token is missing or invalid. |
| `409` | Conflict |
### List access policies
List specified access policies with the `GET` method.
```http
GET https://www.grafana.com/api/v1/accesspolicies
```
#### Parameters
| Name | Type | Description | Required |
| ----------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `name` | Query | Name of the access policy to filter by. | No |
| `realmType` | String | Query. Available values are `org` and `stack`. | No |
| `realmIdentifier` | String | Requires `realmType`. Identifier of the realm. | No |
| `pageSize` | String | The number of records to be returned per page. The default value is 500; the maximum value is 500. | No |
| `pageCursor` | String | Query. A cursor used for paging through the results. If you omit the `pageCursor` parameter, or provide an empty `pageCursor` value, you receive the first page. | No |
| `region` | String | Query. Region of the Access Policy, as defined in the Access Policy. Some example values are `us`, `eu`, `au`, and `prod-eu-west-3`. For more information, refer to [List regions](#list-regions). | Yes |
| `status` | String | Query. A status that can be used to filter the final list of Access Policies. Available values are `active` and `inactive`. | No |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------- |
| `200` | Successful operation |
Example response:
```json
{
"items": [
{
"id": "c45485b6-8321-4cf2-bcec-12006df755ff",
"orgId": "1",
"name": "stack-readers",
"displayName": "Stack Readers",
"scopes": ["metrics:read", "logs:read", "traces:read", "alerts:read"],
"realms": [
{
"type": "stack",
"identifier": "123",
"labelPolicies": [
{
"selector": "{env != \"dev\"}"
}
]
}
],
"conditions": {
"allowedSubnets": ["192.168.0.0/24", "10.1.2.99/32"]
},
"createdAt": "2022-06-08T16:47:46.151Z",
"updatedAt": "2022-06-08T16:47:46.151Z",
"status": "active"
}
],
"metadata": {
"pagination": {
"pageSize": 500,
"pageCursor": "ZDMyYzZhODktZjU1ZC00NGViLWJmYWEtMTEyYmE2NTFlNDJifDIwMjItMDQtMTFUMTI6NTQ6MDBa",
"nextPage": "/v1/accesspolicies?pageCursor=ZDMyYzZhODktZjU1ZC00NGViLWJmYWEtMTEyYmE2NTFlNDJifDIwMjItMDQtMTFUMTI6NTQ6MDBa"
}
}
}
```
| Code | Description |
| ----- | -------------------------------- |
| `400` | Bad request |
| `401` | API token is missing or invalid. |
### List one access policy
List one access policy with the `GET` method.
```http
GET https://www.grafana.com/api/v1/accesspolicies/{accessPolicyID}
```
#### Parameters
| Name | Type | Description | Required |
| ---------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `region` | String | Query. Region of the Access Policy, as defined in the Access Policy. Some example values are `us`, `eu`, `au`, and `prod-eu-west-3`. For more information, refer to [List regions](#list-regions). | Yes |
| `accessPolicyId` | String | UUID. Path. ID of the access policy. | Yes |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------- |
| `200` | Successful operation |
Example response:
```json
{
"id": "c45485b6-8321-4cf2-bcec-12006df755ff",
"orgId": "1",
"name": "stack-readers",
"displayName": "Stack Readers",
"scopes": ["metrics:read", "logs:read", "traces:read", "alerts:read"],
"realms": [
{
"type": "stack",
"identifier": "123",
"labelPolicies": [
{
"selector": "{env != \"dev\"}"
}
]
}
],
"conditions": {
"allowedSubnets": ["192.168.0.0/24", "10.1.2.99/32"]
},
"createdAt": "2022-06-08T21:06:27.853Z",
"updatedAt": "2022-06-08T21:06:27.853Z",
"status": "active"
}
```
| Code | Description |
| ----- | -------------------------------- |
| `400` | Bad request |
| `401` | API token is missing or invalid. |
### Update an access policy
Update an existing access policy with the `POST` method.
{{< admonition type="note" >}}
To remove [IP ranges](/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/ip-ranges-access-policies/) do one of the following:
- set `allowedSubnets` to an empty array (`[]`)
- set `conditions` to `null` or to an empty object (`{}`).
{{< /admonition >}}
```http
POST https://www.grafana.com/api/v1/accesspolicies/{accessPolicyId}
```
#### Parameters
| Name | Type | Description | Required |
| ---------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `region` | String | Query. Region of the Access Policy, as defined in the Access Policy. Some example values are `us`, `eu`, `au`, and `prod-eu-west-3`. For more information, refer to [List regions](#list-regions). | Yes |
| `accessPolicyId` | String | (`UUID`). Path. ID of the access policy. | Yes |
#### Request body
The request body specifies the revised access policy.
| Name | Type | Description | Required |
| ------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | --- | --- |
| `displayName` | String | Display name of the access policy, visible in the UI. It must be 1-255 characters long. | No | | No |
| `scopes` | List[String] | List of [**scopes**](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#scopes). | Yes |
| `realms` | List[Realm] | List of [**realms**](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#realms). | Yes |
| `conditions` | Conditions | A set of criteria that is used to restrict access of the access policy and tokens. Providing an empty object `{}` results in the complete removal of `conditions`. | No |
| `status` | String | The status of the access policy. Must be `active` or `inactive`. | No |
**Realm**
| Name | Type | Description | Required |
| --------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |
| `type` | String | Type of realm. Can be `org` or `stack`. | Yes |
| `identifier` | String | The unique identifier of a realm (ID of the org or stack depending on the realm type). | Yes |
| `labelPolicies` | List[LabelPolicy] | List of [label policies](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#labelpolicy-or-label-selectors). Available only with read permissions for metrics and logs. | No |
**LabelPolicy**
| Name | Type | Description | Required |
| ---------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `selector` | String | [Label selector](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#labelpolicy-or-label-selectors). | Yes |
**Conditions**
| Name | Type | Description | Required |
| ---------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `allowedSubnets` | List[String] | An array of IP addresses with subnet masks in CIDR notation (both IPv4 or IPv6 are supported) for [IP range based access control](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/#ip-range-based-access-control). | Yes |
Example request:
```json
{
"displayName": "Stack Readers",
"scopes": ["metrics:read", "logs:read", "traces:read", "alerts:read"],
"realms": [
{
"type": "stack",
"identifier": "123",
"labelPolicies": [
{
"selector": "{env != \"dev\"}"
}
]
}
],
"conditions": {
"allowedSubnets": ["192.168.99.100/32"]
},
"status": "active"
}
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------- |
| `200` | Successful operation |
Example response:
```json
{
"id": "c45485b6-8321-4cf2-bcec-12006df755ff",
"orgId": "1",
"name": "stack-readers",
"displayName": "Stack Readers",
"scopes": ["metrics:read", "logs:read", "traces:read", "alerts:read"],
"realms": [
{
"type": "stack",
"identifier": "123",
"labelPolicies": [
{
"selector": "{env != \"dev\"}"
}
]
}
],
"conditions": {
"allowedSubnets": ["192.168.99.100/32"]
},
"createdAt": "2022-06-08T21:10:37.011Z",
"updatedAt": "2022-06-08T21:10:37.011Z",
"status": "active"
}
```
| Code | Description |
| ----- | -------------------------------- |
| `400` | Bad request |
| `401` | API token is missing or invalid. |
### Delete an access policy
Remove an access policy with the `DELETE` method.
```http
DELETE https://www.grafana.com/api/v1/accesspolicies/{accessPolicyId}
```
#### Parameters
| Name | Type | Description | Required |
| ---------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `region` | String | Query. Region of the Access Policy, as defined in the Access Policy. Some example values are `us`, `eu`, `au`, and `prod-eu-west-3`. For more information, refer to [List regions](#list-regions). | Yes |
| `accessPolicyId` | String | (`UUID`). Path. ID of the access policy. | Yes |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | ----------------------------------- |
| `204` | Access policy deleted successfully. |
| `400` | Bad request |
| `401` | API token is missing or invalid |
### Create a token
Create a token with the `POST` method.
```http
POST https://www.grafana.com/api/v1/tokens
```
#### Parameters
| Name | Type | Description | Required |
| -------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `region` | String | Query. Region of the Access Policy, as defined in the Access Policy. Some example values are `us`, `eu`, `au`, and `prod-eu-west-3`. For more information, refer to [List regions](#list-regions). | Yes |
#### Request body
The request body contains details about the token being created.
| Name | Type | Description | Required |
| ---------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `name` | String | Name of the access policy. It must be 1-255 characters long. Characters can only include lowercase letters from the English alphabet (a-z), numbers (0-9), hyphens (-) and underscores (\_). | Yes |
| `displayName` | String | Display name of the token, visible in the UI. Set to `name` if not provided. It must be 1-255 characters long. | No |
| `accessPolicyId` | String | ID of the access policy to create the token for. | Yes |
| `expiresAt` | String | Token expiration date. The token does not expire if this is not provided. | No |
Example request:
```json
{
"accessPolicyId": "c45485b6-8321-4cf2-bcec-12006df755ff",
"name": "mytoken",
"displayName": "My Token",
"expiresAt": "2022-06-08T22:05:46.958Z"
}
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------- |
| `200` | Successful operation |
Example response:
```json
{
"id": "c45485b6-8321-4cf2-bcec-12006df755ff",
"accessPolicyId": "c45485b6-8321-4cf2-bcec-12006df755ff",
"name": "mytoken",
"displayName": "My Token",
"expiresAt": "2022-06-08T22:05:46.959Z",
"firstUsedAt": "2022-06-08T22:05:46.959Z",
"lastUsedAt": "2022-06-08T22:05:46.959Z",
"createdAt": "2022-06-08T22:05:46.959Z",
"updatedAt": "2022-06-08T22:05:46.959Z",
"token": "glc_eyJrIjoiZjI0YzZkNGEwZDBmZmZjMmUzNTU2ODcxMmY0ZWZlNTQ1NTljMDFjOCIsIm4iOiJteXRva2VuIiwiaWQiOjF9"
}
```
| Code | Description |
| ----- | ------------------------------- |
| `400` | Bad request |
| `401` | API token is missing or invalid |
| `409` | Conflict |
### List a set of tokens
List a set of tokens with the `GET` method.
```http
GET https://www.grafana.com/api/v1/tokens
```
#### Parameters
| Name | Type | Description | Required |
| ----------------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `accessPolicyId ` | String | Query. ID of the access policy to filter by. | No |
| `accessPolicyName` | String | Query. Name of the access policy to filter by. | No |
| `accessPolicyRealmType` | String | Query. Type of the access policy realm. Available values are `org` and `stack`. | No |
| `accessPolicyRealmIdentifier` | String | Query. Identifier of the access policy realm. Requires `accessPolicyRealmType.` | No |
| `name` | String | Query. Name of the Token to filter by. | No |
| `expiresBefore` | String | Query. Time (in ISO8601 UTC format) to filter tokens that have `expiresAt` set before the given time. | No |
| `expiresAfter` | String | Query. Time (in ISO8601 UTC format) to filter tokens that have `expiresAt` set after the given time. | No |
| `pageSize` | String | Query. The number of records to be returned per page. Default value is `500`; the maximum value is `500`. | No |
| `pageCursor` | String | Query. A cursor used for paging through the results. If you omit the `pageCursor` parameter, or provide an empty `pageCursor` value, you receive the first page. | No |
| `region` | String | Query. Region of the Access Policy, as defined in the Access Policy. Some example values are `us`, `eu`, `au`, and `prod-eu-west-3`. For more information, refer to [List regions](#list-regions). | Yes |
| `accessPolicyStatus` | String | Query. A filter to only list tokens which Access Policies are in the given status. Available values are `active` and `inactive`. | No |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------- |
| `200` | Successful operation |
Example response:
```json
{
"items": [
{
"id": "c45485b6-8321-4cf2-bcec-12006df755ff",
"accessPolicyId": "c45485b6-8321-4cf2-bcec-12006df755ff",
"name": "mytoken",
"displayName": "My Token",
"expiresAt": "2022-06-08T22:11:05.614Z",
"firstUsedAt": "2022-06-08T22:11:05.614Z",
"lastUsedAt": "2022-06-08T22:11:05.614Z",
"createdAt": "2022-06-08T22:11:05.614Z",
"updatedAt": "2022-06-08T22:11:05.614Z"
}
],
"metadata": {
"pagination": {
"pageSize": 500,
"pageCursor": "ZDMyYzZhODktZjU1ZC00NGViLWJmYWEtMTEyYmE2NTFlNDJifDIwMjItMDQtMTFUMTI6NTQ6MDBa",
"nextPage": "/v1/accesspolicies?pageCursor=ZDMyYzZhODktZjU1ZC00NGViLWJmYWEtMTEyYmE2NTFlNDJifDIwMjItMDQtMTFUMTI6NTQ6MDBa"
}
}
}
```
| Code | Description |
| ----- | ------------------------------- |
| `400` | Bad request |
| `401` | API token is missing or invalid |
### List a single token
List a specified token with the `GET` method.
```http
GET https://www.grafana.com/api/v1/tokens/{tokenId}
```
#### Parameters
| Name | Type | Description | Required |
| --------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `region` | String | Query. Region of the Access Policy, as defined in the Access Policy. Some example values are `us`, `eu`, `au`, and `prod-eu-west-3`. For more information, refer to [List regions](#list-regions). | Yes |
| `tokenId` | String | (`UUID`). Path. ID of the Token. | Yes |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------- |
| `200` | Successful operation |
Example response:
```json
{
"id": "c45485b6-8321-4cf2-bcec-12006df755ff",
"accessPolicyId": "c45485b6-8321-4cf2-bcec-12006df755ff",
"name": "mytoken",
"displayName": "My Token",
"expiresAt": "2022-06-09T04:31:23.559Z",
"firstUsedAt": "2022-06-09T04:31:23.559Z",
"lastUsedAt": "2022-06-09T04:31:23.559Z",
"createdAt": "2022-06-09T04:31:23.559Z",
"updatedAt": "2022-06-09T04:31:23.559Z"
}
```
| Code | Description |
| ----- | ------------------------------- |
| `400` | Bad request |
| `401` | API token is missing or invalid |
### Update a token
Update a specified token with the `POST` method.
```http
POST https://www.grafana.com/api/v1/tokens/{tokenId}
```
#### Parameters
| Name | Type | Description | Required |
| --------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `region` | String | Query. Region of the Access Policy, as defined in the Access Policy. Some example values are `us`, `eu`, `au`, and `prod-eu-west-3`. For more information, refer to [List regions](#list-regions). | Yes |
| `tokenId` | String | (`UUID`). Path. ID of the Token. | Yes |
#### Request body
The request body contains the updated values being applied to the token.
| Name | Type | Description | Required |
| ------------- | ------ | -------------------------------------------------------------------------------------------------------- | -------- |
| `displayName` | String | Display name of the token, visible in the UI. It must be 1-255 characters long. | No |
| `expiresAt` | String | Token expiration date (in ISO8601 UTC format). The token does not expire if this field is set to `null`. | No |
Example request:
```json
{
"displayName": "My token",
"expiresAt": "2022-06-09T04:43:16.296Z"
}
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------- |
| `200` | Successful operation |
Example response:
```json
{
"id": "c45485b6-8321-4cf2-bcec-12006df755ff",
"accessPolicyId": "c45485b6-8321-4cf2-bcec-12006df755ff",
"name": "mytoken",
"displayName": "My token",
"expiresAt": "2022-06-09T04:43:16.296Z",
"firstUsedAt": "2022-06-09T04:43:16.296Z",
"lastUsedAt": "2022-06-09T04:43:16.296Z",
"createdAt": "2022-06-09T04:43:16.296Z",
"updatedAt": "2022-06-09T04:43:16.296Z"
}
```
| Code | Description |
| ----- | ------------------------------- |
| `400` | Bad request |
| `401` | API token is missing or invalid |
| `409` | Conflict. |
### Delete a token
Remove a specified token with the `DELETE` method.
```http
DELETE https://www.grafana.com/api/v1/tokens/{tokenId}
```
#### Parameters
| Name | Type | Description | Required |
| --------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `region` | String | Query. Region of the Access Policy, as defined in the Access Policy. Some example values are `us`, `eu`, `au`, and `prod-eu-west-3`. For more information, refer to [List regions](#list-regions). | Yes |
| `tokenId` | String | (`UUID`). Path. ID of the Token. | Yes |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | ------------------------------- |
| `204` | Token deleted successfully |
| `400` | Bad request |
| `401` | API token is missing or invalid |
## Stacks
{{< admonition type="note" >}}
Grafana Cloud Free includes 1 stack and Grafana Cloud Pro includes up to 3 stacks.
[Reach out to support](/contact/) about a Grafana Cloud contracted plan if you would like to add additional stacks to your account.
{{< /admonition >}}
### List stacks
```http
GET https://grafana.com/api/orgs/<ORG_SLUG>/instances
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `403` | Forbidden. |
Example response:
```json
{
"items": [
{
"id": 007303,
"orgId": 052992,
"orgSlug": "grafanacom",
"orgName": "grafanacom",
"type": "grafana",
"name": "cloudapistack.grafana.net",
"url": "https://cloudapistack.grafana.net",
"slug": "cloudapistack",
"version": "stable",
"description": "",
"status": "active",
"gateway": "istio",
"createdAt": "2023-01-04T06:43:24.000Z",
"createdBy": "foobar",
"updatedAt": null,
"updatedBy": "",
"trial": 0,
"trialExpiresAt": null,
"clusterId": 69,
"clusterSlug": "prod-us-central-0",
"clusterName": "prod-us-central-0",
"plan": "gcloud",
"planName": "Grafana Cloud",
"billingStartDate": "2023-01-04T06:43:23.000Z",
"billingEndDate": null,
"billingActiveUsers": 0,
"billingGrafanaActiveUsers": 0,
"billingOnCallActiveUsers": 0,
"currentActiveUsers": 0,
"currentActiveAdminUsers": 0,
"currentActiveEditorUsers": 0,
"currentActiveViewerUsers": 0,
"dailyUserCnt": 0,
"dailyAdminCnt": 0,
"dailyEditorCnt": 0,
"dailyViewerCnt": 0,
"dashboardCnt": 8,
"datasourceCnts": {},
"userQuota": 10,
"dashboardQuota": -1,
"alertQuota": -1,
"alertCnt": 0,
"ssl": true,
"customAuth": true,
"customDomain": true,
"support": true,
"runningVersion": "9.3.2-45365 (commit: ef5286dd77, branch: v9.3.x)",
"machineLearning": 0,
"incident": 0,
"hmInstancePromId": 715391,
"hmInstancePromUrl": "https://prometheus-us-central1.grafana.net",
"hmInstancePromName": "cloudapistack-prom",
"hmInstancePromStatus": "active",
"hmInstancePromCurrentUsage": 0,
"hmInstancePromCurrentActiveSeries": 0,
"hmInstanceGraphiteId": 715392,
"hmInstanceGraphiteUrl": "https://graphite-prod-10-prod-us-central-0.grafana.net",
"hmInstanceGraphiteName": "cloudapistack-graphite",
"hmInstanceGraphiteType": "graphite-v5",
"hmInstanceGraphiteStatus": "active",
"hmInstanceGraphiteCurrentUsage": 0,
"hlInstanceId": 356665,
"hlInstanceUrl": "https://logs-prod-017.grafana.net",
"hlInstanceName": "cloudapistack-logs",
"hlInstanceStatus": "active",
"hlInstanceCurrentUsage": 0,
"amInstanceId": 355647,
"amInstanceName": "cloudapistack-alerts",
"amInstanceUrl": "https://alertmanager-us-central1.grafana.net",
"amInstanceStatus": "active",
"amInstanceGeneratorUrl": "https://cloudapistack.grafana.net",
"amInstanceGeneratorUrlDatasource": "",
"htInstanceId": 353178,
"htInstanceUrl": "https://tempo-us-central1.grafana.net",
"htInstanceName": "cloudapistack-traces",
"htInstanceStatus": "active",
"regionId": 1,
"regionSlug": "us",
"links": [
{
"rel": "self",
"href": "/instances/cloudapistack"
},
{
"rel": "org",
"href": "/orgs/grafanacom"
},
{
"rel": "plugins",
"href": "/instances/cloudapistack/plugins"
}
]
}
],
"orderBy": "name",
"direction": "asc",
"total": 1,
"pages": 1,
"pageSize": 1000000,
"page": 1,
"links": [
{
"rel": "self",
"href": "/instances"
}
]
}
```
### Get a stack's connectivity info
```http
GET https://grafana.com/api/instances/<STACK_SLUG>/connections
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `403` | Forbidden. |
Example response:
```json
{
"privateConnectivityInfo": {
"tenants": [
{
"type": "prometheus",
"id": 1899232,
"info": {
"privateDNS": "cortex-prod-13-cortex-gw.us-east-2.vpce.grafana.net",
"serviceName": "com.amazonaws.vpce.us-east-2.vpce-svc-0d13a270cd91a0a3a"
},
"ipAllowListCNAME": "src-ips.prometheus-prod-13-prod-us-east-0.grafana.net"
},
{
"type": "graphite",
"id": 1899233,
"info": {
"privateDNS": "cortex-prod-13-cortex-gw.us-east-2.vpce.grafana.net",
"serviceName": "com.amazonaws.vpce.us-east-2.vpce-svc-0d13a270cd91a0a3a"
},
"ipAllowListCNAME": "src-ips.prometheus-prod-13-prod-us-east-0.grafana.net"
},
{
"type": "logs",
"id": 1048899,
"info": {
"privateDNS": "loki-prod-006-cortex-gw.us-east-2.vpce.grafana.net",
"serviceName": "com.amazonaws.vpce.us-east-2.vpce-svc-071e7d98821c1698b"
},
"ipAllowListCNAME": "src-ips.logs-prod-006.grafana.net"
},
{
"type": "traces",
"id": 1043214,
"info": {
"privateDNS": "tempo-prod-04-cortex-gw.us-east-2.vpce.grafana.net",
"serviceName": "com.amazonaws.vpce.us-east-2.vpce-svc-0a830aaea99ecfc91"
},
"ipAllowListCNAME": "src-ips.tempo-prod-04-prod-us-east-0.grafana.net"
},
{
"type": "profiles",
"id": 1091120,
"info": {
"privateDNS": "profiles-prod-001-cortex-gw.us-east-2.vpce.grafana.net",
"serviceName": "com.amazonaws.vpce.us-east-2.vpce-svc-079d447d0143b24e7"
},
"ipAllowListCNAME": "src-ips.profiles-prod-001.grafana.net"
},
{
"type": "alerts",
"id": 947554,
"ipAllowListCNAME": "src-ips.alertmanager-prod-us-east-0.grafana.net"
},
{
"type": "grafana",
"id": 1091120,
"ipAllowListCNAME": null
}
],
"otlp": {
"privateDNS": "prod-us-east-0-otlp-gateway.us-east-2.vpce.grafana.net",
"serviceName": "com.amazonaws.vpce.us-east-2.vpce-svc-0d36af67949f874c4"
},
"pdc": {
"api": {
"privateDNS": "private-datasource-connect-api.us-east-2.vpce.grafana.net",
"serviceName": "com.amazonaws.vpce.us-east-2.vpce-svc-0078cfdaab047fc37"
},
"gateway": {
"privateDNS": "private-datasource-connect.us-east-2.vpce.grafana.net",
"serviceName": "com.amazonaws.vpce.us-east-2.vpce-svc-032570426402bc97e"
}
}
},
"influxUrl": "https://influx-prod-13-prod-us-east-0.grafana.net",
"otlpHttpUrl": "https://otlp-gateway-prod-us-east-0.grafana.net",
"oncallApiUrl": "https://oncall-prod-us-east-0.grafana.net/oncall",
"appPlatform": {
"url": "https://app-platform-apiserver-prod-us-east-0.grafana.net",
"caData": "<SOME-VERY-LONG-PUBLIC-KEY>"
}
}
```
That endpoint contains the way to connect to the various tenants the stack has,
including [AWS PrivateLink](/docs/grafana-cloud/send-data/aws-privatelink/) if the region is AWS.
### Create stack
{{< admonition type="note" >}}
This `POST` request accepts lowercase characters only.
{{< /admonition >}}
```http
POST https://grafana.com/api/instances
```
#### Request Body
| Name | Type | Description | Required |
| ------------------ | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `name` | String | Name of stack. Conventionally matches the URL of the instance. For example, `<STACK_SLUG>.grafana.net`. | Yes |
| `slug` | String | Subdomain that the Grafana instance to make the instance available at. For example, if you set the slug to `<STACK_SLUG>`, the full URL for the instance is `https://<STACK_SLUG>.grafana.net`. | Yes |
| `url` | String | If you use a custom domain for the instance, you must provide it here. For example, `"https://grafana.yourdoman.io"`. | No |
| `region` | String | Choose a region for your stack. For example, you can specify the United States (`us`) or Europe (`eu`). Use the `GET /api/stack-regions` endpoint to see a list of regions to choose from. For more information, refer to [List regions](#list-regions). If you don't specify a region, the default is `us`. | No |
| `description` | String | A short text that describes the purpose of the stack. | No |
| `labels` | map[String]String | Add labels to a stack if you want to add a visual way to distinguish them [in the UI](/docs/grafana-cloud/account-management/cloud-portal/#create-stack-labels). Labels are `key:value` pairs where the both the key and value can alphanumeric, `.`, `-` or `/`. Up to 10 labels are allowed. Example: `{"team":"platform", "environment":"dev"}` | No |
| `deleteProtection` | Boolean | Prevents the stack from being accidentally deleted. When set to true, delete operations on the stack are blocked until this protection is disabled. Recommended for production or critical environments. | No |
{{< admonition type="note" >}}
For the custom domain, you must set up a `CNAME` record that points to `<STACK_SLUG>.grafana.net` before you can specify the domain.
{{< /admonition >}}
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `403` | Forbidden. |
| `409` | Conflict. |
Example response:
```json
{
"id": 507363,
"orgId": 652992,
"orgSlug": "grafanacom",
"orgName": "grafanacom",
"type": "grafana",
"name": "createcloudstack",
"url": "https://createcloudstack.grafana.net",
"slug": "createcloudstack",
"version": "stable",
"labels": {
"key": "value"
},
"description": "",
"status": "active",
"gateway": "istio",
"createdAt": "2023-01-04T08:20:07.000Z",
"createdBy": "testengineer",
"updatedAt": null,
"updatedBy": "",
"trial": 0,
"trialExpiresAt": null,
"clusterId": 69,
"clusterSlug": "prod-us-central-0",
"clusterName": "prod-us-central-0",
"plan": "gcloud",
"planName": "Grafana Cloud",
"billingStartDate": "2023-01-04T08:20:06.000Z",
"billingEndDate": null,
"billingActiveUsers": 0,
"billingGrafanaActiveUsers": 0,
"billingOnCallActiveUsers": 0,
"currentActiveUsers": 0,
"currentActiveAdminUsers": 0,
"currentActiveEditorUsers": 0,
"currentActiveViewerUsers": 0,
"dailyUserCnt": 0,
"dailyAdminCnt": 0,
"dailyEditorCnt": 0,
"dailyViewerCnt": 0,
"dashboardCnt": 0,
"datasourceCnts": {},
"userQuota": 10,
"dashboardQuota": -1,
"alertQuota": -1,
"alertCnt": 0,
"ssl": true,
"customAuth": true,
"customDomain": true,
"support": true,
"runningVersion": "",
"machineLearning": 0,
"incident": 0,
"deleteProtection": true,
"hmInstancePromId": 715511,
"hmInstancePromUrl": "https://prometheus-us-central1.grafana.net",
"hmInstancePromName": "createcloudstack-prom",
"hmInstancePromStatus": "active",
"hmInstancePromCurrentUsage": 0,
"hmInstancePromCurrentActiveSeries": 0,
"hmInstanceGraphiteId": 715512,
"hmInstanceGraphiteUrl": "https://graphite-prod-10-prod-us-central-0.grafana.net",
"hmInstanceGraphiteName": "createcloudstack-graphite",
"hmInstanceGraphiteType": "graphite-v5",
"hmInstanceGraphiteStatus": "active",
"hmInstanceGraphiteCurrentUsage": 0,
"hlInstanceId": 356725,
"hlInstanceUrl": "https://logs-prod-017.grafana.net",
"hlInstanceName": "createcloudstack-logs",
"hlInstanceStatus": "active",
"hlInstanceCurrentUsage": 0,
"amInstanceId": 355707,
"amInstanceName": "createcloudstack-alerts",
"amInstanceUrl": "https://alertmanager-us-central1.grafana.net",
"amInstanceStatus": "active",
"amInstanceGeneratorUrl": "https://createcloudstack.grafana.net",
"amInstanceGeneratorUrlDatasource": "",
"htInstanceId": 353238,
"htInstanceUrl": "https://tempo-us-central1.grafana.net",
"htInstanceName": "createcloudstack-traces",
"htInstanceStatus": "active",
"regionId": 1,
"regionSlug": "us",
"links": [
{
"rel": "self",
"href": "/instances/createcloudstack"
},
{
"rel": "org",
"href": "/orgs/grafanacom"
},
{
"rel": "plugins",
"href": "/instances/createcloudstack/plugins"
}
]
}
```
### Update stack
{{< admonition type="note" >}}
This `POST` request accepts lowercase characters only.
{{< /admonition >}}
```http
POST https://grafana.com/api/instances/<STACK_SLUG>
```
#### Request Body
| Name | Type | Description | Required |
| ------------------ | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `description` | String | A short text that describes the purpose of the stack. | No |
| `labels` | map[String]String | Updates labels for a stack. Labels are `key:value` pairs where the both the key and value can alphanumeric, `.`, `-` or `/`. Up to 10 labels are allowed. To remove a label, just omit it in this request. To remove all labels send an empty object. Example: `{"team":"platform", "environment":"dev"}` | No |
| `name` | String | Name of stack. Conventionally matches the URL of the instance. For example, `<STACK_SLUG>.grafana.net`. | No |
| `deleteProtection` | Boolean | Enables or disables delete protection for the stack. When set to true, it prevents the stack from being accidentally deleted. To allow deletion, set this to false. | No |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `403` | Forbidden. |
| `409` | Conflict. |
Example response:
```json
{
"id": 507363,
"orgId": 652992,
"orgSlug": "grafanacom",
"orgName": "grafanacom",
"type": "grafana",
"name": "createcloudstack",
"url": "https://createcloudstack.grafana.net",
"slug": "createcloudstack",
"labels": {
"newkey": "newvalue"
},
"version": "stable",
"description": "",
"status": "active",
"gateway": "istio",
"createdAt": "2023-01-04T08:20:07.000Z",
"createdBy": "testengineer",
"updatedAt": null,
"updatedBy": "",
"trial": 0,
"trialExpiresAt": null,
"clusterId": 69,
"clusterSlug": "prod-us-central-0",
"clusterName": "prod-us-central-0",
"plan": "gcloud",
"planName": "Grafana Cloud",
"billingStartDate": "2023-01-04T08:20:06.000Z",
"billingEndDate": null,
"billingActiveUsers": 0,
"billingGrafanaActiveUsers": 0,
"billingOnCallActiveUsers": 0,
"currentActiveUsers": 0,
"currentActiveAdminUsers": 0,
"currentActiveEditorUsers": 0,
"currentActiveViewerUsers": 0,
"dailyUserCnt": 0,
"dailyAdminCnt": 0,
"dailyEditorCnt": 0,
"dailyViewerCnt": 0,
"dashboardCnt": 0,
"datasourceCnts": {},
"userQuota": 10,
"dashboardQuota": -1,
"alertQuota": -1,
"alertCnt": 0,
"ssl": true,
"customAuth": true,
"customDomain": true,
"support": true,
"runningVersion": "",
"machineLearning": 0,
"incident": 0,
"deleteProtection": true,
"hmInstancePromId": 715511,
"hmInstancePromUrl": "https://prometheus-us-central1.grafana.net",
"hmInstancePromName": "createcloudstack-prom",
"hmInstancePromStatus": "active",
"hmInstancePromCurrentUsage": 0,
"hmInstancePromCurrentActiveSeries": 0,
"hmInstanceGraphiteId": 715512,
"hmInstanceGraphiteUrl": "https://graphite-prod-10-prod-us-central-0.grafana.net",
"hmInstanceGraphiteName": "createcloudstack-graphite",
"hmInstanceGraphiteType": "graphite-v5",
"hmInstanceGraphiteStatus": "active",
"hmInstanceGraphiteCurrentUsage": 0,
"hlInstanceId": 356725,
"hlInstanceUrl": "https://logs-prod-017.grafana.net",
"hlInstanceName": "createcloudstack-logs",
"hlInstanceStatus": "active",
"hlInstanceCurrentUsage": 0,
"amInstanceId": 355707,
"amInstanceName": "createcloudstack-alerts",
"amInstanceUrl": "https://alertmanager-us-central1.grafana.net",
"amInstanceStatus": "active",
"amInstanceGeneratorUrl": "https://createcloudstack.grafana.net",
"amInstanceGeneratorUrlDatasource": "",
"htInstanceId": 353238,
"htInstanceUrl": "https://tempo-us-central1.grafana.net",
"htInstanceName": "createcloudstack-traces",
"htInstanceStatus": "active",
"regionId": 1,
"regionSlug": "us",
"links": [
{
"rel": "self",
"href": "/instances/createcloudstack"
},
{
"rel": "org",
"href": "/orgs/grafanacom"
},
{
"rel": "plugins",
"href": "/instances/createcloudstack/plugins"
}
]
}
```
### Delete stack
```http
DELETE https://grafana.com/api/instances/<STACK_SLUG>
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `404` | Cloud Stack not found. |
| `409` | Delete protection is enabled. |
{{< admonition type="caution" >}}
If you receive a `409` response code, it means the stack has delete protection enabled. You must first disable the `deleteProtection` flag for the stack before you can successfully delete it.
{{< /admonition >}}
Example response:
```json
{
"id": 507366,
"orgId": 652992,
"orgSlug": "grafanacom",
"orgName": "grafanacom",
"type": "grafana",
"name": "createcloudstack",
"url": "https://createcloudstack.grafana.net",
"slug": "createcloudstack",
"version": "stable",
"description": "",
"status": "deleted",
"gateway": "istio",
"createdAt": "2023-01-04T08:22:00.000Z",
"createdBy": "ishanjain",
"updatedAt": "2023-01-04T08:30:36.066Z",
"updatedBy": "ishanjain",
"trial": 0,
"trialExpiresAt": null,
"clusterId": 69,
"clusterSlug": "prod-us-central-0",
"clusterName": "prod-us-central-0",
"plan": "gcloud",
"planName": "Grafana Cloud",
"billingStartDate": "2023-01-04T08:21:59.000Z",
"billingEndDate": "2023-01-04T08:30:36.066Z",
"billingActiveUsers": 0,
"billingGrafanaActiveUsers": 0,
"billingOnCallActiveUsers": 0,
"currentActiveUsers": 0,
"currentActiveAdminUsers": 0,
"currentActiveEditorUsers": 0,
"currentActiveViewerUsers": 0,
"dailyUserCnt": 0,
"dailyAdminCnt": 0,
"dailyEditorCnt": 0,
"dailyViewerCnt": 0,
"dashboardCnt": 0,
"datasourceCnts": {},
"userQuota": 10,
"dashboardQuota": -1,
"alertQuota": -1,
"alertCnt": 0,
"ssl": true,
"customAuth": true,
"customDomain": true,
"support": true,
"runningVersion": "9.3.2-45365 (commit: ef5286dd77, branch: v9.3.x)",
"machineLearning": 0,
"incident": 0,
"deleteProtection": false,
"hmInstancePromId": 715517,
"hmInstancePromUrl": "https://prometheus-us-central1.grafana.net",
"hmInstancePromName": "createcloudstack-prom",
"hmInstancePromStatus": "active",
"hmInstancePromCurrentUsage": 0,
"hmInstancePromCurrentActiveSeries": 0,
"hmInstanceGraphiteId": 715518,
"hmInstanceGraphiteUrl": "https://graphite-prod-10-prod-us-central-0.grafana.net",
"hmInstanceGraphiteName": "createcloudstack-graphite",
"hmInstanceGraphiteType": "graphite-v5",
"hmInstanceGraphiteStatus": "active",
"hmInstanceGraphiteCurrentUsage": 0,
"hlInstanceId": 356728,
"hlInstanceUrl": "https://logs-prod-017.grafana.net",
"hlInstanceName": "createcloudstack-logs",
"hlInstanceStatus": "active",
"hlInstanceCurrentUsage": 0,
"amInstanceId": 355710,
"amInstanceName": "createcloudstack1-alerts",
"amInstanceUrl": "https://alertmanager-us-central1.grafana.net",
"amInstanceStatus": "active",
"amInstanceGeneratorUrl": "https://createcloudstack.grafana.net",
"amInstanceGeneratorUrlDatasource": "",
"htInstanceId": 353241,
"htInstanceUrl": "https://tempo-us-central1.grafana.net",
"htInstanceName": "createcloudstack-traces",
"htInstanceStatus": "active",
"regionId": 1,
"regionSlug": "us",
"links": [
{
"rel": "self",
"href": "/instances/507366"
},
{
"rel": "org",
"href": "/orgs/grafanacom"
},
{
"rel": "plugins",
"href": "/instances/507366/plugins"
}
]
}
```
### Restart Grafana
```http
POST https://grafana.com/api/instances/<STACK_SLUG>/restart
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation |
| `401` | API token is missing or invalid. |
| `404` | Cloud Stack not found |
Example response:
```json
true
```
### Create Hosted Grafana instance API keys
```http
POST https://grafana.com/api/instances/<STACK_SLUG>/api/auth/keys
```
This creates API keys specific to use for managing your hosted Grafana instance.
This is different from [Grafana Cloud API keys](#api-keys) created for Grafana Cloud operations.
This endpoint requires the Admin role.
#### Request Body
| Name | Type | Description | Required |
| --------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `name` | String | Name of the API key. | Yes |
| `role` | String | Access level/Grafana role for the key. Can be one of the following values: `Viewer`, `Editor`, or `Admin`. | Yes |
| `secondsToLive` | Number | Key expiration in seconds. If it's a positive number, an expiration date for the key is set. The key doesn't expire if it's `null`, `0`, or is omitted completely (unless `api_key_max_seconds_to_live` configuration option is set). | No |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `404` | Cloud Stack not found. |
| `409` | Conflict. |
Example response:
```json
{
"id": 1,
"name": "testkey",
"key": "eyJrIjoiMWpSRVhRUVJHZlc3NW1laklzV3htQUt0cUxtS3RuWFUiLCJuIjoidGVzdGtleSIsImlkIjoxf"
}
```
### List data sources
```http
GET https://grafana.com/api/instances/<STACK_SLUG>/datasources
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | ---------------------------------------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `404` | Cloud Stack not found. |
| `409` | Conflicting operation, another operation is already in progress. |
Example response:
```json
{
"items": [
{
"id": 25744816,
"instanceId": 2860016,
"name": "grafanacloud-usage",
"type": "prometheus",
"access": "proxy",
"grafanaOrgId": 1,
"url": "https://billing.grafana.net/api/prom",
"password": "",
"user": "",
"database": "",
"basicAuth": 1,
"basicAuthUser": "65299211",
"withCredentials": 0,
"isDefault": 0,
"jsonData": {
"timeInterval": "60s",
"timeout": "150",
"prometheusVersion": "2.3.0",
"prometheusType": "Mimir"
},
"version": 1,
"editable": 1,
"delete": 0,
"createdAt": "2023-01-04T08:20:13.484927Z",
"updatedAt": null
},
{
"id": 25744915,
"instanceId": 2860016,
"name": "grafanacloud-createcloudstack-logs",
"type": "loki",
"access": "proxy",
"grafanaOrgId": 1,
"url": "https://logs-prod-017.grafana.net",
"password": "",
"user": "",
"database": "",
"basicAuth": 1,
"basicAuthUser": "3567215",
"withCredentials": 0,
"isDefault": 0,
"jsonData": {
"timeout": "300"
},
"version": 1,
"editable": 1,
"delete": 0,
"createdAt": "2023-01-04T08:20:13.625323Z",
"updatedAt": null
}
]
}
```
## Grafana plugins
The API allows managing plugins installed on your hosted Grafana instances.
You can discover plugins in the [Grafana Plugins Directory](/grafana/plugins/).
### List plugins installed on an instance
```http
GET https://grafana.com/api/instances/<STACK_SLUG>/plugins
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | ---------------------------------------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `404` | Cloud Stack not found. |
| `409` | Conflicting operation, another operation is already in progress. |
Example response:
```json
{
"items": [
{
"id": 256529,
"instanceId": 507363,
"instanceUrl": "https://createcloudstack.grafana.net",
"pluginId": 663,
"pluginSlug": "grafana-github-datasource",
"pluginName": "GitHub",
"version": "1.3.1",
"latestVersion": "1.3.1",
"createdAt": "2023-01-04T09:33:55.000Z",
"updatedAt": null,
"links": [
{
"rel": "self",
"href": "/instances/507363/plugins/grafana-github-datasource"
},
{
"rel": "instance",
"href": "/instances/507363"
}
]
}
],
"orderBy": "pluginName",
"direction": "asc",
"links": [
{
"rel": "self",
"href": "/instances/createcloudstack/plugins"
}
]
}
```
### Add a plugin to instance
```http
POST https://grafana.com/api/instances/<STACK_SLUG>/plugins
```
#### Request Body
| Name | Type | Description | Required |
| --------- | ------ | ------------------------------------------------------------- | -------- |
| `plugin` | String | Name of the plugin, for example, `grafana-github-datasource`. | Yes |
| `version` | String | Version of the plugin to install. Defaults to `latest`. | No |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | ---------------------------------------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `404` | Plugin or Cloud Stack not found. |
| `409` | Conflicting operation, another operation is already in progress. |
Example response:
```json
{
"id": 256519,
"instanceId": 507363,
"instanceUrl": "https://createcloudstack.grafana.net",
"instanceSlug": "createcloudstack",
"pluginId": 663,
"pluginSlug": "grafana-github-datasource",
"pluginName": "GitHub",
"version": "1.3.1",
"latestVersion": "1.3.1",
"createdAt": "2023-01-04T08:50:42.000Z",
"updatedAt": null,
"links": [
{
"rel": "self",
"href": "/instances/createcloudstack/plugins/grafana-github-datasource"
},
{
"rel": "instance",
"href": "/instances/createcloudstack"
}
]
}
```
### Get installed plugin info
```http
GET https://grafana.com/api/instances/<STACK_SLUG>/plugins/<PLUGIN>
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | ---------------------------------------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `404` | Plugin or Cloud Stack not found. |
| `409` | Conflicting operation, another operation is already in progress. |
Example response:
```json
{
"id": 256519,
"instanceId": 507363,
"instanceUrl": "https://createcloudstack.grafana.net",
"instanceSlug": "createcloudstack",
"pluginId": 663,
"pluginSlug": "grafana-github-datasource",
"pluginName": "GitHub",
"version": "1.3.1",
"latestVersion": "1.3.1",
"createdAt": "2023-01-04T08:50:42.000Z",
"updatedAt": null,
"links": [
{
"rel": "self",
"href": "/instances/createcloudstack/plugins/grafana-github-datasource"
},
{
"rel": "instance",
"href": "/instances/createcloudstack"
}
]
}
```
### Update installed plugin version
```http
POST https://grafana.com/api/instances/<STACK_SLUG>/plugins/<PLUGIN>
```
#### Request Body
| Name | Type | Description | Required |
| --------- | ------ | ------------------------------ | -------- |
| `version` | String | Updated version of the plugin. | Yes |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | ---------------------------------------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `404` | Plugin or Cloud Stack not found. |
| `409` | Conflicting operation, another operation is already in progress. |
Example response:
```json
{
"id": 256519,
"instanceId": 507363,
"instanceUrl": "https://createcloudstack.grafana.net",
"instanceSlug": "createcloudstack",
"pluginId": 663,
"pluginSlug": "grafana-github-datasource",
"pluginName": "GitHub",
"version": "1.3.0",
"latestVersion": "1.3.1",
"createdAt": "2023-01-04T08:50:42.000Z",
"updatedAt": "2023-01-04T08:55:00.088Z",
"links": [
{
"rel": "self",
"href": "/instances/createcloudstack/plugins/grafana-github-datasource"
},
{
"rel": "instance",
"href": "/instances/createcloudstack"
}
]
}
```
### Delete an installed plugin
```http
DELETE https://grafana.com/api/instances/<STACK_SLUG>/plugins/<PLUGIN>
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | ---------------------------------------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `404` | Plugin or Cloud Stack not found. |
| `409` | Conflicting operation, another operation is already in progress. |
Example response:
```json
{
"id": 256519,
"instanceId": 507363,
"instanceUrl": "https://createcloudstack.grafana.net",
"instanceSlug": "createcloudstack",
"pluginId": 663,
"pluginSlug": "grafana-github-datasource",
"pluginName": "GitHub",
"version": "1.3.1",
"latestVersion": "1.3.1",
"createdAt": "2023-01-04T08:50:42.000Z",
"updatedAt": "2023-01-04T08:59:20.794Z",
"links": [
{
"rel": "self",
"href": "/instances/createcloudstack/plugins/grafana-github-datasource"
},
{
"rel": "instance",
"href": "/instances/createcloudstack"
}
]
}
```
## Regions
### List regions
Use the following call to retrieve a list of regions to specify when you create a stack.
```http
GET https://grafana.com/api/stack-regions
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | ---------------------------------------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `409` | Conflicting operation, another operation is already in progress. |
Example response:
```json
{
"items": [
{
"id": 1,
"status": "active",
"slug": "us",
"name": "GCP US Central",
"description": "United States",
"provider": "gcp",
"createdAt": "2021-08-20T20:00:27.000Z",
"updatedAt": "2022-12-12T12:29:37.000Z"
},
{
"id": 2,
"status": "active",
"slug": "us-azure",
"name": "Azure US Central",
"description": "United States (Azure)",
"provider": "azure",
"createdAt": "2021-08-20T20:08:03.000Z",
"updatedAt": "2022-11-29T12:04:00.000Z"
},
{
"id": 3,
"status": "active",
"slug": "eu",
"name": "GCP Belgium",
"description": "Europe",
"provider": "gcp",
"createdAt": "2021-08-20T20:28:52.000Z",
"updatedAt": "2022-12-05T18:05:33.000Z"
},
{
"id": 4,
"status": "active",
"slug": "au",
"name": "GCP Australia",
"description": "Australia",
"provider": "gcp",
"createdAt": "2021-11-16T22:03:18.000Z",
"updatedAt": "2022-09-22T09:27:47.000Z"
}
],
"orderBy": "id",
"direction": "asc",
"total": 9,
"pages": 1,
"pageSize": 1000000,
"page": 1,
"links": [
{
"rel": "self",
"href": "/stack-regions"
}
]
}
```
## API keys
{{< admonition type="caution" >}}
Cloud API keys are now deprecated. Use [Cloud Access Policies](#access-policies-and-tokens) instead.
{{< /admonition >}}
### List API keys
```http
GET https://grafana.com/api/orgs/<ORG_SLUG>/api-keys
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `403` | Forbidden. |
Example response:
```json
{
"items": [
{
"id": 5045812,
"orgId": 652945,
"orgSlug": "grafanacom",
"orgName": "grafanacom",
"instanceId": null,
"name": "SRE",
"role": "Admin",
"createdAt": "2023-01-04T06:43:51.000Z",
"updatedAt": null,
"firstUsed": "2023-01-04T06:44:26.000Z",
"links": [
{
"rel": "self",
"href": "/orgs/grafanacom/api-keys/SRE"
},
{
"rel": "org",
"href": "/orgs/grafanacom"
}
]
}
],
"orderBy": "name",
"direction": "asc",
"links": [
{
"rel": "self",
"href": "/orgs/grafanacom/api-keys"
}
]
}
```
### Create API key
```http
POST https://grafana.com/api/orgs/<ORG_SLUG>/api-keys
```
#### Request Body
| Name | Type | Description | Required |
| ------ | ------ | --------------------------------------------------------------------------------------- | -------- |
| `name` | String | API key name | Yes |
| `role` | String | Permission level of API key. One of `Viewer`, `Editor`, `Admin`, or `MetricsPublisher`. | Yes |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `409` | Conflict. |
Example response:
```json
{
"id": 5046212,
"orgId": 652945,
"orgSlug": "grafanacom",
"orgName": "grafanacom",
"instanceId": null,
"name": "createapikey",
"role": "Admin",
"createdAt": "2023-01-04T07:50:54.000Z",
"updatedAt": null,
"firstUsed": null,
"token": "eyJrIjoiZmU5ZDlmY2JkODkzNTg4ZGUyYTJhNmJiZGJiMWYwNjQyMGM0MzBkNiIsIm4iOiJjcmVhdGVhcGlrZXkiLCJpZCI6NjUyOTkyf",
"links": [
{
"rel": "self",
"href": "/orgs/grafanacom/api-keys/createapikey"
},
{
"rel": "org",
"href": "/orgs/grafanacom"
}
]
}
```
### Delete API key
```http
DELETE https://grafana.com/api/orgs/<ORG_SLUG>/api-keys/<API KEY NAME>
```
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `404` | API Key not found. |
Example response:
```json
true
```
## Billed usage
This API makes it possible to fetch billed usage broken down by stack for a specified year and month.
### Get billed usage
```http
GET https://grafana.com/api/orgs/<ORG_SLUG>/billed-usage?month=<MONTH>&year=<YEAR>
```
#### Parameters
| Name | Type | Description | Required |
| ------- | ----- | -------------------------------------------------------- | -------- |
| `month` | Query | numeric value for the month to retrieve billed usage for | yes |
| `year` | Query | numeric value for the year to retrieve billed usage for | yes |
#### Responses
The following responses may be returned.
| Code | Description |
| ----- | -------------------------------- |
| `200` | Successful operation. |
| `401` | API token is missing or invalid. |
| `403` | Forbidden. |
| `404` | Not found. |
| `409` | Wrong or missing parameters. |
Example response:
```json
{
"items": [
{
"id": 1111198068,
"dimensionId": "hl",
"dimensionName": "Logs",
"unit": "GB",
"includedUsage": 50,
"totalUsage": 251.02109133593612,
"overage": 201,
"orgRates": {
"tiers": [
{
"min": 50,
"rate": 0.5
}
]
},
"amountDue": 100.5,
"periodStart": "2024-09-01T00:00:00Z",
"periodEnd": "2024-09-30T23:59:59Z",
"description": "Hosted Logs Usage - September 2024",
"notes": "Per-instance Usage\n - example-logs - Usage: 251.021GB\n\nIncluded Usage: 50GB\nTotal Usage: 251.021GB\nUsage in excess of 50GB: 201GB @ $0.5/GB = $100.50\nTotal Usage Amount: $100.50",
"usages": [
{
"id": 1111163428,
"stackId": 111118,
"periodStart": "2024-09-01T00:00:00Z",
"periodEnd": "2024-09-30T23:59:59Z",
"totalUsage": 251.02109133593612,
"isProrated": false,
"ingestUsage": 251.02109133593612,
"queryUsage": 1255.8636820528654,
"stackName": "example.grafana.net",
"stackLabels": {}
}
]
},
{
"id": 2222297587,
"dimensionId": "hm",
"dimensionName": "Metrics",
"unit": "series",
"includedUsage": 10000,
"totalUsage": 129755.72,
"overage": 119756,
"orgRates": {
"tiers": [
{
"min": 10000,
"rate": 6.5
}
],
"includedDPM": 1
},
"amountDue": 778.41,
"periodStart": "2024-09-01T00:00:00Z",
"periodEnd": "2024-09-30T23:59:59Z",
"description": "Hosted Metrics Usage - September 2024",
"notes": "Per-instance Usage\n - example-prom - Series: 55937, DPM: 132364, Usage: 132364\n Usage pro-rated 2024-09-01 - 2024-09-30: 129756\n\nIncluded Usage: 10000\nTotal Usage: 129756\nUsage in excess of 10000: 119756 @ $6.50/1000 = $778.41\nTotal Usage Amount: $778.41",
"usages": [
{
"id": 1111162008,
"stackId": 111118,
"periodStart": "2024-09-01T00:00:00Z",
"periodEnd": "2024-09-30T23:59:59Z",
"totalUsage": 129755.72,
"isProrated": false,
"activeSeries": 55937,
"dpm": 132364,
"stackName": "example.grafana.net",
"stackLabels": {}
}
]
},
{
"id": 1111195084,
"dimensionId": "hg",
"dimensionName": "Grafana Users",
"unit": "user",
"includedUsage": 3,
"totalUsage": 14,
"overage": 11,
"orgRates": {
"tiers": [
{
"min": 3,
"rate": 8
}
]
},
"amountDue": 88,
"periodStart": "2024-09-01T00:00:00Z",
"periodEnd": "2024-09-30T23:59:59Z",
"description": "Hosted Grafana Usage - September 2024",
"notes": "Per-instance Usage\n - example.grafana.net - Total Unique Users: 14\n\nIncluded Users: 3\nTotal Unique Users: 14\nUsers in excess of 3: 11 @ $8/User = $88.00\nTotal Usage Amount: $88.00",
"usages": [
{
"id": 1111157272,
"stackId": 111118,
"periodStart": "2024-09-01T00:00:00Z",
"periodEnd": "2024-09-30T23:59:59Z",
"totalUsage": 14,
"isProrated": false,
"grafanaUsage": 14,
"onCallUsage": 0,
"stackName": "example.grafana.net",
"stackLabels": {}
}
]
}
]
}
```