curl --request POST \
--url https://api.cloudhumans.com/claudia/v1/knowledge-bases \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"accountId": "<string>",
"instance": "<string>",
"name": "Support FAQ"
}
'import requests
url = "https://api.cloudhumans.com/claudia/v1/knowledge-bases"
payload = {
"accountId": "<string>",
"instance": "<string>",
"name": "Support FAQ"
}
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({accountId: '<string>', instance: '<string>', name: 'Support FAQ'})
};
fetch('https://api.cloudhumans.com/claudia/v1/knowledge-bases', 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.cloudhumans.com/claudia/v1/knowledge-bases",
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([
'accountId' => '<string>',
'instance' => '<string>',
'name' => 'Support FAQ'
]),
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.cloudhumans.com/claudia/v1/knowledge-bases"
payload := strings.NewReader("{\n \"accountId\": \"<string>\",\n \"instance\": \"<string>\",\n \"name\": \"Support FAQ\"\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.cloudhumans.com/claudia/v1/knowledge-bases")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"accountId\": \"<string>\",\n \"instance\": \"<string>\",\n \"name\": \"Support FAQ\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudhumans.com/claudia/v1/knowledge-bases")
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 \"accountId\": \"<string>\",\n \"instance\": \"<string>\",\n \"name\": \"Support FAQ\"\n}"
response = http.request(request)
puts response.read_body{
"name": "Support FAQ",
"accountId": "<string>",
"instance": "<string>",
"createdAt": "2026-08-10T14:32:05",
"updatedAt": "2026-08-10T18:20:41",
"id": "6683f1c2a4b19e0012ab34cd"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}Create a knowledge base
Create an empty knowledge base under one of your accounts. Name the account by its accountId + instance pair — the pair, not accountId alone, identifies an account. Knowledge-base reach follows the accounts provisioned to your tenants, carried in the token, NOT your CloudChat memberships: discover the pairs you can create under with an unfiltered listMyKnowledgeBases, where every row carries them. An account that holds no knowledge base yet does not appear there; take its pair from listMyCloudChatAccounts then, knowing that listing is CloudChat membership and an account from it may still be refused here with 403 — nothing is created when that happens. The new base starts with no entries and is not linked to any project; add content with createEntry or importEntries, or configure a crawl with upsertContentSource.
curl --request POST \
--url https://api.cloudhumans.com/claudia/v1/knowledge-bases \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"accountId": "<string>",
"instance": "<string>",
"name": "Support FAQ"
}
'import requests
url = "https://api.cloudhumans.com/claudia/v1/knowledge-bases"
payload = {
"accountId": "<string>",
"instance": "<string>",
"name": "Support FAQ"
}
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({accountId: '<string>', instance: '<string>', name: 'Support FAQ'})
};
fetch('https://api.cloudhumans.com/claudia/v1/knowledge-bases', 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.cloudhumans.com/claudia/v1/knowledge-bases",
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([
'accountId' => '<string>',
'instance' => '<string>',
'name' => 'Support FAQ'
]),
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.cloudhumans.com/claudia/v1/knowledge-bases"
payload := strings.NewReader("{\n \"accountId\": \"<string>\",\n \"instance\": \"<string>\",\n \"name\": \"Support FAQ\"\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.cloudhumans.com/claudia/v1/knowledge-bases")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"accountId\": \"<string>\",\n \"instance\": \"<string>\",\n \"name\": \"Support FAQ\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudhumans.com/claudia/v1/knowledge-bases")
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 \"accountId\": \"<string>\",\n \"instance\": \"<string>\",\n \"name\": \"Support FAQ\"\n}"
response = http.request(request)
puts response.read_body{
"name": "Support FAQ",
"accountId": "<string>",
"instance": "<string>",
"createdAt": "2026-08-10T14:32:05",
"updatedAt": "2026-08-10T18:20:41",
"id": "6683f1c2a4b19e0012ab34cd"
}{
"error": "Forbidden: token holds no claim for the requested account"
}{
"error": "Forbidden: token holds no claim for the requested account"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
The knowledge base to create.
Account the knowledge base belongs to, e.g. 7. Not an account on its own: accountId is only unique within an instance, so always send instance with it — the pair is what names the account. The account must be provisioned to your tenants — the reach an unfiltered listMyKnowledgeBases shows — not merely a CloudChat membership: an account outside that reach is refused with 403 and nothing is created.
CloudChat instance the account lives in, e.g. 4. Together with accountId it names exactly one account, which accountId alone does not. Take the pair from a listMyKnowledgeBases row, or from listMyCloudChatAccounts for an account that holds no knowledge base yet.
Display name, as shown in the knowledge base list. Must not be blank.
"Support FAQ"
Response
The knowledge base as created. Its id is what every content endpoint takes.
A knowledge base you can manage.
Display name.
"Support FAQ"
Account this knowledge base belongs to, e.g. 7. Only unique within instance: read the two together — the pair is what identifies the account, and accountId on its own does not.
CloudChat instance the account lives in, e.g. 4. With accountId it forms the pair that identifies this row's account, which is what tells rows apart when one listing spans several accounts.
When it was created (ISO-8601).
"2026-08-10T14:32:05"
When it last changed (ISO-8601).
"2026-08-10T18:20:41"
Use this id in the content endpoints.
"6683f1c2a4b19e0012ab34cd"