curl --request PATCH \
--url https://api.atako.ai/projects/{projectId}/wiki/{pageId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"content": "<string>",
"message": "<string>",
"autosave": true,
"sessionId": "<string>",
"baseSha": "<string>"
}
'import requests
url = "https://api.atako.ai/projects/{projectId}/wiki/{pageId}"
payload = {
"title": "<string>",
"content": "<string>",
"message": "<string>",
"autosave": True,
"sessionId": "<string>",
"baseSha": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
content: '<string>',
message: '<string>',
autosave: true,
sessionId: '<string>',
baseSha: '<string>'
})
};
fetch('https://api.atako.ai/projects/{projectId}/wiki/{pageId}', 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.atako.ai/projects/{projectId}/wiki/{pageId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'content' => '<string>',
'message' => '<string>',
'autosave' => true,
'sessionId' => '<string>',
'baseSha' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.atako.ai/projects/{projectId}/wiki/{pageId}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"content\": \"<string>\",\n \"message\": \"<string>\",\n \"autosave\": true,\n \"sessionId\": \"<string>\",\n \"baseSha\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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.patch("https://api.atako.ai/projects/{projectId}/wiki/{pageId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"content\": \"<string>\",\n \"message\": \"<string>\",\n \"autosave\": true,\n \"sessionId\": \"<string>\",\n \"baseSha\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atako.ai/projects/{projectId}/wiki/{pageId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"content\": \"<string>\",\n \"message\": \"<string>\",\n \"autosave\": true,\n \"sessionId\": \"<string>\",\n \"baseSha\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"page": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"position": 123,
"parentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"content": "<string>",
"history": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sha": "<string>",
"at": "2023-11-07T05:31:56Z",
"author": "<string>",
"message": "<string>",
"content": "<string>"
}
],
"historyTotal": 123,
"children": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"position": 123,
"revisionCount": 123,
"children": "<array>",
"content": "<string>"
}
]
}
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "WIKI_CONFLICT",
"page": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"position": 123,
"parentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"content": "<string>",
"history": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sha": "<string>",
"at": "2023-11-07T05:31:56Z",
"author": "<string>",
"message": "<string>",
"content": "<string>"
}
],
"historyTotal": 123,
"children": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"position": 123,
"revisionCount": 123,
"children": "<array>",
"content": "<string>"
}
]
}
}Rename a wiki page and/or write a new revision
Send title, content, or both — a patch asking for neither would be a 200 that wrote nothing. Rewriting the text exactly as it already stands is refused for the same reason: it would look like a revision that was never recorded. message is the note left on the revision, like a commit message.
curl --request PATCH \
--url https://api.atako.ai/projects/{projectId}/wiki/{pageId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"content": "<string>",
"message": "<string>",
"autosave": true,
"sessionId": "<string>",
"baseSha": "<string>"
}
'import requests
url = "https://api.atako.ai/projects/{projectId}/wiki/{pageId}"
payload = {
"title": "<string>",
"content": "<string>",
"message": "<string>",
"autosave": True,
"sessionId": "<string>",
"baseSha": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
content: '<string>',
message: '<string>',
autosave: true,
sessionId: '<string>',
baseSha: '<string>'
})
};
fetch('https://api.atako.ai/projects/{projectId}/wiki/{pageId}', 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.atako.ai/projects/{projectId}/wiki/{pageId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'content' => '<string>',
'message' => '<string>',
'autosave' => true,
'sessionId' => '<string>',
'baseSha' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.atako.ai/projects/{projectId}/wiki/{pageId}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"content\": \"<string>\",\n \"message\": \"<string>\",\n \"autosave\": true,\n \"sessionId\": \"<string>\",\n \"baseSha\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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.patch("https://api.atako.ai/projects/{projectId}/wiki/{pageId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"content\": \"<string>\",\n \"message\": \"<string>\",\n \"autosave\": true,\n \"sessionId\": \"<string>\",\n \"baseSha\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atako.ai/projects/{projectId}/wiki/{pageId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"content\": \"<string>\",\n \"message\": \"<string>\",\n \"autosave\": true,\n \"sessionId\": \"<string>\",\n \"baseSha\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"page": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"position": 123,
"parentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"content": "<string>",
"history": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sha": "<string>",
"at": "2023-11-07T05:31:56Z",
"author": "<string>",
"message": "<string>",
"content": "<string>"
}
],
"historyTotal": 123,
"children": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"position": 123,
"revisionCount": 123,
"children": "<array>",
"content": "<string>"
}
]
}
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "WIKI_CONFLICT",
"page": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"position": 123,
"parentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"content": "<string>",
"history": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sha": "<string>",
"at": "2023-11-07T05:31:56Z",
"author": "<string>",
"message": "<string>",
"content": "<string>"
}
],
"historyTotal": 123,
"children": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"position": 123,
"revisionCount": 123,
"children": "<array>",
"content": "<string>"
}
]
}
}Authorizations
An aik_… programmatic API key (app.atako.ai → Settings → API keys) or a Supabase session JWT.
Body
1 - 200200000500Editor autosave: extends the newest revision when it belongs to the same author and the same sessionId, carries no message and is less than 10 minutes old.
The editor writing (one per browser tab). Two sessions never share a revision.
1 - 100The sha of the head revision the caller edited on. If the page changed since, nothing is written and the answer is 409 WIKI_CONFLICT.
1 - 64Response
An open page: its current text, a page of its history (newest first) and its sub-pages as table-of-contents entries. Every wiki write returns this same shape, so an editor never has to re-read the page it just saved.
Show child attributes
Show child attributes