Restore dashboard revision
curl --request POST \
--url https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'idempotency-key: <idempotency-key>' \
--header 'if-match: <if-match>' \
--data '
{
"summary": "<string>"
}
'import requests
url = "https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore"
payload = { "summary": "<string>" }
headers = {
"if-match": "<if-match>",
"idempotency-key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'if-match': '<if-match>',
'idempotency-key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({summary: '<string>'})
};
fetch('https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'summary' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"idempotency-key: <idempotency-key>",
"if-match: <if-match>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore"
payload := strings.NewReader("{\n \"summary\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("if-match", "<if-match>")
req.Header.Add("idempotency-key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore")
.header("if-match", "<if-match>")
.header("idempotency-key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"summary\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["if-match"] = '<if-match>'
request["idempotency-key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"summary\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"dashboard_id": "<string>",
"workspace_id": "<string>",
"parent_revision_id": "<string>",
"restored_from_revision_id": "<string>",
"source": "manual",
"author_id": "<string>",
"summary": "<string>",
"name": "<string>",
"description": "<string>",
"purpose": "workspace_overview",
"filter_definitions": [
{
"kind": "time",
"key": "time",
"label": "<string>"
}
],
"default_filter_values": {},
"widgets": [
{
"widget_id": "<string>",
"position": 1,
"title": "<string>",
"col_span": 1,
"height": "compact",
"drill_down": "<string>",
"visualization_options": {},
"freshness_policy": {
"mode": "provider_default"
},
"widget_type": "snippet",
"snippet_id": "<string>",
"snippet_etag": "<string>",
"input_bindings": {},
"visualization": "stat",
"refresh_policy": {
"mode": "on_load"
},
"display_type": "table"
}
],
"structural_diff": {
"version": 1,
"dashboard_fields": [
"name"
],
"widgets": {
"added": {
"count": 1,
"widget_ids": [
"<string>"
]
},
"removed": {
"count": 1,
"widget_ids": [
"<string>"
]
},
"changed": {
"count": 1,
"widgets": [
{
"widget_id": "<string>",
"fields": [
"position"
]
}
]
}
}
},
"snippet_etag_drift": [
{
"widget_id": "<string>",
"snippet_id": "<string>",
"snapshot_etag": "<string>",
"current_etag": "<string>",
"current_state": "active",
"restore_action": "none"
}
],
"created_at": 1,
"dashboard_etag": "<string>"
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}Dashboards
Restore dashboard revision
Restores an immutable snapshot by creating and activating a new dashboard revision.
POST
/
dashboards
/
{id}
/
revisions
/
{revision_id}
:restore
Restore dashboard revision
curl --request POST \
--url https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'idempotency-key: <idempotency-key>' \
--header 'if-match: <if-match>' \
--data '
{
"summary": "<string>"
}
'import requests
url = "https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore"
payload = { "summary": "<string>" }
headers = {
"if-match": "<if-match>",
"idempotency-key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'if-match': '<if-match>',
'idempotency-key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({summary: '<string>'})
};
fetch('https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'summary' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"idempotency-key: <idempotency-key>",
"if-match: <if-match>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore"
payload := strings.NewReader("{\n \"summary\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("if-match", "<if-match>")
req.Header.Add("idempotency-key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore")
.header("if-match", "<if-match>")
.header("idempotency-key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"summary\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.akua.dev/v1/dashboards/{id}/revisions/{revision_id}:restore")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["if-match"] = '<if-match>'
request["idempotency-key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"summary\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"dashboard_id": "<string>",
"workspace_id": "<string>",
"parent_revision_id": "<string>",
"restored_from_revision_id": "<string>",
"source": "manual",
"author_id": "<string>",
"summary": "<string>",
"name": "<string>",
"description": "<string>",
"purpose": "workspace_overview",
"filter_definitions": [
{
"kind": "time",
"key": "time",
"label": "<string>"
}
],
"default_filter_values": {},
"widgets": [
{
"widget_id": "<string>",
"position": 1,
"title": "<string>",
"col_span": 1,
"height": "compact",
"drill_down": "<string>",
"visualization_options": {},
"freshness_policy": {
"mode": "provider_default"
},
"widget_type": "snippet",
"snippet_id": "<string>",
"snippet_etag": "<string>",
"input_bindings": {},
"visualization": "stat",
"refresh_policy": {
"mode": "on_load"
},
"display_type": "table"
}
],
"structural_diff": {
"version": 1,
"dashboard_fields": [
"name"
],
"widgets": {
"added": {
"count": 1,
"widget_ids": [
"<string>"
]
},
"removed": {
"count": 1,
"widget_ids": [
"<string>"
]
},
"changed": {
"count": 1,
"widgets": [
{
"widget_id": "<string>",
"fields": [
"position"
]
}
]
}
}
},
"snippet_etag_drift": [
{
"widget_id": "<string>",
"snippet_id": "<string>",
"snapshot_etag": "<string>",
"current_etag": "<string>",
"current_state": "active",
"restore_action": "none"
}
],
"created_at": 1,
"dashboard_etag": "<string>"
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": 7002,
"message": "Resource not found",
"path": [
"body",
"name"
],
"metadata": {}
}
],
"result": {}
}Authorizations
workspace API token (sk_akua_...) or OAuth2 JWT. Create tokens at https://akua.dev/developers/api-tokens
Headers
The etag of the resource version the client last read. Required on writes when the resource exposes an etag field. Mismatch returns 409 ABORTED with the current etag in the error metadata.
Required string length:
1 - 256Example:
"42"
Required caller-supplied idempotency key. Any non-empty key up to 64 characters is accepted. Endpoint-specific documentation describes how the key is used.
Required string length:
1 - 64Example:
"create-prod-2026-05-07"
Path Parameters
Required string length:
1 - 55Required string length:
1 - 55Body
application/json
Maximum string length:
500Response
Dashboard revision restored into a new active revision
Required string length:
1 - 55Required string length:
1 - 55Required string length:
1 - 53Required string length:
1 - 55Required string length:
1 - 55Available options:
manual, automatic, restore, reset, backfill Available options:
workspace_overview, custom Maximum array length:
24- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
Show child attributes
Show child attributes
Show child attributes
Show child attributes
- Option 1
- Option 2
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Unix timestamp (seconds)
Required range:
x >= 0⌘I