curl --request POST \
--url https://api.atako.ai/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "",
"space": "<string>",
"spaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participants": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
'import requests
url = "https://api.atako.ai/projects"
payload = {
"name": "<string>",
"description": "",
"space": "<string>",
"spaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participants": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '',
space: '<string>',
spaceId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
participants: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']
})
};
fetch('https://api.atako.ai/projects', 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",
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([
'name' => '<string>',
'description' => '',
'space' => '<string>',
'spaceId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'participants' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
]),
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"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"\",\n \"space\": \"<string>\",\n \"spaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"participants\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.atako.ai/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"\",\n \"space\": \"<string>\",\n \"spaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"participants\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atako.ai/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"\",\n \"space\": \"<string>\",\n \"spaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"participants\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>",
"tone": "amber",
"status": "active",
"spaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"space": "<string>",
"owner": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"archivedAt": "2023-11-07T05:31:56Z",
"participants": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"role": "<string>",
"kind": "human",
"photo": "<string>",
"memberRef": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"columns": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"kind": "backlog"
}
],
"cards": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"description": "<string>",
"assignee": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"column": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"priority": "low",
"labels": [
"<string>"
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"checklist": [
{
"text": "<string>",
"done": true
}
],
"comments": [
{
"author": "<string>",
"at": "2023-11-07T05:31:56Z",
"text": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"blocked": "<string>",
"due": "2023-11-07T05:31:56Z"
}
],
"wiki": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"content": "<string>",
"history": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sha": "<string>",
"at": "2023-11-07T05:31:56Z",
"author": "<string>",
"message": "<string>",
"size": 123
}
],
"children": "<array>"
}
]
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}Create a project
One transaction: the project, its members, the starting columns (a starting point only — from then on the columns belong to the project) and the wiki home page with its first revision. participants is the UI’s flat list of ids: each is resolved as either a company human or a company agent. An agent’s membership is checked through its owner’s live users.companyId, never the stale agents.companyId snapshot. Send starter to name that starting point in the user’s own language — the API has no translation catalogue and falls back to its French defaults when you omit it. Returns the full project.
curl --request POST \
--url https://api.atako.ai/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "",
"space": "<string>",
"spaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participants": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
'import requests
url = "https://api.atako.ai/projects"
payload = {
"name": "<string>",
"description": "",
"space": "<string>",
"spaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"participants": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '',
space: '<string>',
spaceId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
participants: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']
})
};
fetch('https://api.atako.ai/projects', 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",
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([
'name' => '<string>',
'description' => '',
'space' => '<string>',
'spaceId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'participants' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
]),
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"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"\",\n \"space\": \"<string>\",\n \"spaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"participants\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.atako.ai/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"\",\n \"space\": \"<string>\",\n \"spaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"participants\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atako.ai/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"\",\n \"space\": \"<string>\",\n \"spaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"participants\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>",
"tone": "amber",
"status": "active",
"spaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"space": "<string>",
"owner": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"archivedAt": "2023-11-07T05:31:56Z",
"participants": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"role": "<string>",
"kind": "human",
"photo": "<string>",
"memberRef": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"columns": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"kind": "backlog"
}
],
"cards": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"description": "<string>",
"assignee": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"column": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"priority": "low",
"labels": [
"<string>"
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"checklist": [
{
"text": "<string>",
"done": true
}
],
"comments": [
{
"author": "<string>",
"at": "2023-11-07T05:31:56Z",
"text": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"blocked": "<string>",
"due": "2023-11-07T05:31:56Z"
}
],
"wiki": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"path": "<string>",
"content": "<string>",
"history": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sha": "<string>",
"at": "2023-11-07T05:31:56Z",
"author": "<string>",
"message": "<string>",
"size": 123
}
],
"children": "<array>"
}
]
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}Authorizations
An aik_… programmatic API key (app.atako.ai → Settings → API keys) or a Supabase session JWT.
Body
1 - 20020000amber, mint, periwinkle, plum, blush Space by name: trimmed, inner whitespace collapsed, max 60 characters after that (400 beyond). An existing space of that name (case-insensitive) is reused, otherwise it is created. null or "" means no space. Exclusive with spaceId.
Id of an existing space of your company (400 INVALID_SPACE otherwise); null = no space. Exclusive with space.
Ids of company members or company agents, mixed — the server sorts them out.
100The labels a brand-new project starts with, written by the caller in the user's own language: the wiki home page and the board's first columns. Omit it entirely and the API writes its own French defaults (Backlog / À faire / En cours / Revue / Terminé, page « Overview ») — it holds no translations of its own. All-or-nothing on wikiTitle and columns: a starter carrying only the columns would leave the wiki in the other language. kind — not the translated name — stays the stable marker for "done".
Show child attributes
Show child attributes
Response
A project and everything on it, in one read. A card has no status — its state IS the column it stands in — and the wiki is a tree of pages, each carrying snapshots of its own past.
amber, mint, periwinkle, plum, blush active, paused, done The project's space (see GET /projects/spaces); null = no space.
Name of the space (joined from spaceId); null = no space.
60Show child attributes
Show child attributes
Ordered by position.
Show child attributes
Show child attributes
Non-archived cards, ordered by column then position, each with its labels, checklist and comments. The embedded comments carry no id here (only author/at/text) — the comment operations return the full ProjectCardComment.
Show child attributes
Show child attributes
Root pages of the wiki, each carrying its own children subtree and its history (newest revision first).
Show child attributes
Show child attributes