documents
POST /api/chat/sessions/{session_id}/attachments
Attach a file to a chat session
Upload a file into an audience chat session (KUM-499).<br/><br/>The file becomes a workspace document that is private to the uploader<br/>(KUM-433 private_to_user tag) and is linked to the session via<br/>chat_sessions.context.attachments, so the persona can ground replies<br/>on it without the file surfacing in shared workspace views.
PARAMETERS
NAME IN TYPE DESCRIPTION
session_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/chat/sessions/string/attachments" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/chat/sessions/string/attachments", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/chat/sessions/string/attachments", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
DELETE /api/chat/sessions/{session_id}/attachments/{document_id}
Remove a file from a chat session
Drop a file from a chat session's attachments (KUM-499).<br/><br/>With ?delete_document=true, the underlying private document is also<br/>deleted when the requesting user owns it.
PARAMETERS
NAME IN TYPE DESCRIPTION
session_idREQUIRED
path
string
e.g. string
document_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/chat/sessions/string/attachments/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/chat/sessions/string/attachments/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/chat/sessions/string/attachments/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
GET /api/v1/communications
Get communications with auto tags
Get documents for communications page with auto tags
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/communications" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/communications", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/communications", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
GET /api/v1/communications/tag-filters
Get Communications tag-value filters
Get available tag-value filter options for the Communications page.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/communications/tag-filters" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/communications/tag-filters", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/communications/tag-filters", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
POST /api/v1/content-creation/analyze-pull-through-coverage
Score each pull-through priority against a draft
Grade each pull-through priority as covered / partial / missing in the given draft.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"content": "string",
"model": "gemini/gemini-2.5-flash",
"pull_through_priorities": []
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/analyze-pull-through-coverage" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "string",
"model": "gemini/gemini-2.5-flash",
"pull_through_priorities": []
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/analyze-pull-through-coverage", headers={"X-API-Key": "YOUR_KEY"}, json={
"content": "string",
"model": "gemini/gemini-2.5-flash",
"pull_through_priorities": []
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/analyze-pull-through-coverage", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"content": "string",
"model": "gemini/gemini-2.5-flash",
"pull_through_priorities": []
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
POST /api/v1/content-creation/check-quality
Check text quality (grammar, spelling, AI detection)
Run grammar, spelling, and AI-detection checks via the configured text-quality provider.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"include_ai_detection": true,
"include_grammar": true,
"include_spelling": true,
"session_id": null,
"text": "string"
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/check-quality" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"include_ai_detection": true,
"include_grammar": true,
"include_spelling": true,
"session_id": null,
"text": "string"
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/check-quality", headers={"X-API-Key": "YOUR_KEY"}, json={
"include_ai_detection": True,
"include_grammar": True,
"include_spelling": True,
"session_id": None,
"text": "string"
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/check-quality", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"include_ai_detection": true,
"include_grammar": true,
"include_spelling": true,
"session_id": null,
"text": "string"
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"include_ai_detection": true,
"include_grammar": true,
"include_spelling": true,
"session_id": null,
"text": "string"
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/check-quality/accept
Accept a text-quality edit suggestion
Forward an accept signal to the text-quality provider for learning.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"edit_id": "string"
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/check-quality/accept" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"edit_id": "string"
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/check-quality/accept", headers={"X-API-Key": "YOUR_KEY"}, json={
"edit_id": "string"
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/check-quality/accept", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"edit_id": "string"
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"edit_id": "string"
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/check-quality/reject
Reject a text-quality edit suggestion
Forward a reject signal to the text-quality provider for learning.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"edit_id": "string"
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/check-quality/reject" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"edit_id": "string"
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/check-quality/reject", headers={"X-API-Key": "YOUR_KEY"}, json={
"edit_id": "string"
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/check-quality/reject", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"edit_id": "string"
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"edit_id": "string"
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/deaiify
Suggest edits to reduce AI-detection signals in content
LLM-powered analysis of AI-detection signals with span-anchored edit suggestions.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"content_type_label": null,
"model": "gemini/gemini-2.5-flash",
"selection_only": false,
"text": "string",
"tone_persona_helper": null,
"tone_persona_label": null
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/deaiify" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"content_type_label": null,
"model": "gemini/gemini-2.5-flash",
"selection_only": false,
"text": "string",
"tone_persona_helper": null,
"tone_persona_label": null
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/deaiify", headers={"X-API-Key": "YOUR_KEY"}, json={
"content_type_label": None,
"model": "gemini/gemini-2.5-flash",
"selection_only": False,
"text": "string",
"tone_persona_helper": None,
"tone_persona_label": None
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/deaiify", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"content_type_label": null,
"model": "gemini/gemini-2.5-flash",
"selection_only": false,
"text": "string",
"tone_persona_helper": null,
"tone_persona_label": null
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"content_type_label": null,
"model": "gemini/gemini-2.5-flash",
"selection_only": false,
"text": "string",
"tone_persona_helper": null,
"tone_persona_label": null
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/content-creation/documents
List content documents across multiple knowledgebases
List content-creation drafts from one or more knowledgebases.<br/><br/>Query params:<br/> kb_ids – comma-separated knowledgebase IDs to fetch from (required)<br/> limit – max documents to return (default 50, max 200)
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/documents" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/documents", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/documents", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/content-creation/drafts
List content creation drafts
List recent content drafts stored in the content-drafts knowledgebase.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/drafts
Create or update content creation draft
Save a draft in the content-drafts knowledgebase using document storage.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"audience_persona_ids": [],
"content": null,
"content_type": "text",
"content_type_value": null,
"draft_id": null,
"knowledgebase_id": null,
"project_id": null,
"prompt": null,
"pull_through_priorities": [],
"source_document_id": null,
"source_mode": "freeform",
"source_url": null,
"test_history": null,
"themes": [],
"title": null,
"tone_persona_id": null,
"voice_profile_id": null
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"audience_persona_ids": [],
"content": null,
"content_type": "text",
"content_type_value": null,
"draft_id": null,
"knowledgebase_id": null,
"project_id": null,
"prompt": null,
"pull_through_priorities": [],
"source_document_id": null,
"source_mode": "freeform",
"source_url": null,
"test_history": null,
"themes": [],
"title": null,
"tone_persona_id": null,
"voice_profile_id": null
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts", headers={"X-API-Key": "YOUR_KEY"}, json={
"audience_persona_ids": [],
"content": None,
"content_type": "text",
"content_type_value": None,
"draft_id": None,
"knowledgebase_id": None,
"project_id": None,
"prompt": None,
"pull_through_priorities": [],
"source_document_id": None,
"source_mode": "freeform",
"source_url": None,
"test_history": None,
"themes": [],
"title": None,
"tone_persona_id": None,
"voice_profile_id": None
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"audience_persona_ids": [],
"content": null,
"content_type": "text",
"content_type_value": null,
"draft_id": null,
"knowledgebase_id": null,
"project_id": null,
"prompt": null,
"pull_through_priorities": [],
"source_document_id": null,
"source_mode": "freeform",
"source_url": null,
"test_history": null,
"themes": [],
"title": null,
"tone_persona_id": null,
"voice_profile_id": null
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"audience_persona_ids": [],
"content": null,
"content_type": "text",
"content_type_value": null,
"draft_id": null,
"knowledgebase_id": null,
"project_id": null,
"prompt": null,
"pull_through_priorities": [],
"source_document_id": null,
"source_mode": "freeform",
"source_url": null,
"test_history": null,
"themes": [],
"title": null,
"tone_persona_id": null,
"voice_profile_id": null
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/drafts/bulk-delete
Bulk delete content creation drafts
Soft-delete multiple content creation drafts by ID.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/bulk-delete" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/bulk-delete", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/bulk-delete", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/content-creation/drafts/{draft_id}
Get content creation draft
Fetch a single content draft by document ID.
PARAMETERS
NAME IN TYPE DESCRIPTION
draft_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
draft_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/content-creation/drafts/{draft_id}
Delete a content creation draft
Soft-delete a content creation draft by ID.
PARAMETERS
NAME IN TYPE DESCRIPTION
draft_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
draft_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/enhance-pull-through
Rewrite a draft so unmet pull-through priorities are delivered
Re-prompt the generator with unmet priorities elevated to rewrite the current draft.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"audiences": [],
"content_type": "auto",
"content_type_label": null,
"current_draft": "string",
"model": "gemini/gemini-2.5-flash",
"prompt": null,
"themes": [],
"tone_persona_helper": null,
"tone_persona_label": null,
"unmet_priorities": []
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/enhance-pull-through" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"audiences": [],
"content_type": "auto",
"content_type_label": null,
"current_draft": "string",
"model": "gemini/gemini-2.5-flash",
"prompt": null,
"themes": [],
"tone_persona_helper": null,
"tone_persona_label": null,
"unmet_priorities": []
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/enhance-pull-through", headers={"X-API-Key": "YOUR_KEY"}, json={
"audiences": [],
"content_type": "auto",
"content_type_label": None,
"current_draft": "string",
"model": "gemini/gemini-2.5-flash",
"prompt": None,
"themes": [],
"tone_persona_helper": None,
"tone_persona_label": None,
"unmet_priorities": []
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/enhance-pull-through", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"audiences": [],
"content_type": "auto",
"content_type_label": null,
"current_draft": "string",
"model": "gemini/gemini-2.5-flash",
"prompt": null,
"themes": [],
"tone_persona_helper": null,
"tone_persona_label": null,
"unmet_priorities": []
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"audiences": [],
"content_type": "auto",
"content_type_label": null,
"current_draft": "string",
"model": "gemini/gemini-2.5-flash",
"prompt": null,
"themes": [],
"tone_persona_helper": null,
"tone_persona_label": null,
"unmet_priorities": []
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/export
Export content as PDF, DOCX, or TXT
Export content creation draft to the requested format (pdf, docx, txt).
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"content_html": "",
"content_text": "",
"content_type": null,
"format": "pdf",
"themes": [],
"title": "Untitled",
"tone_persona": null
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/export" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"content_html": "",
"content_text": "",
"content_type": null,
"format": "pdf",
"themes": [],
"title": "Untitled",
"tone_persona": null
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/export", headers={"X-API-Key": "YOUR_KEY"}, json={
"content_html": "",
"content_text": "",
"content_type": None,
"format": "pdf",
"themes": [],
"title": "Untitled",
"tone_persona": None
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/export", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"content_html": "",
"content_text": "",
"content_type": null,
"format": "pdf",
"themes": [],
"title": "Untitled",
"tone_persona": null
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"content_html": "",
"content_text": "",
"content_type": null,
"format": "pdf",
"themes": [],
"title": "Untitled",
"tone_persona": null
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/generate
Generate content draft text
Generate publication-ready content text from /content workspace context.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"audiences": [],
"content_type": "auto",
"content_type_label": null,
"model": "gemini/gemini-2.5-flash",
"preferred_title_length": null,
"prompt": null,
"pull_through_priorities": [],
"source_document_excerpt": null,
"source_document_id": null,
"source_document_title": null,
"source_mode": "freeform",
"template_instructions": null,
"template_reference_excerpt": null,
"themes": [],
"tone_persona_helper": null,
"tone_persona_id": null,
"tone_persona_label": null,
"voice_profile_id": null
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/generate" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"audiences": [],
"content_type": "auto",
"content_type_label": null,
"model": "gemini/gemini-2.5-flash",
"preferred_title_length": null,
"prompt": null,
"pull_through_priorities": [],
"source_document_excerpt": null,
"source_document_id": null,
"source_document_title": null,
"source_mode": "freeform",
"template_instructions": null,
"template_reference_excerpt": null,
"themes": [],
"tone_persona_helper": null,
"tone_persona_id": null,
"tone_persona_label": null,
"voice_profile_id": null
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/generate", headers={"X-API-Key": "YOUR_KEY"}, json={
"audiences": [],
"content_type": "auto",
"content_type_label": None,
"model": "gemini/gemini-2.5-flash",
"preferred_title_length": None,
"prompt": None,
"pull_through_priorities": [],
"source_document_excerpt": None,
"source_document_id": None,
"source_document_title": None,
"source_mode": "freeform",
"template_instructions": None,
"template_reference_excerpt": None,
"themes": [],
"tone_persona_helper": None,
"tone_persona_id": None,
"tone_persona_label": None,
"voice_profile_id": None
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/generate", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"audiences": [],
"content_type": "auto",
"content_type_label": null,
"model": "gemini/gemini-2.5-flash",
"preferred_title_length": null,
"prompt": null,
"pull_through_priorities": [],
"source_document_excerpt": null,
"source_document_id": null,
"source_document_title": null,
"source_mode": "freeform",
"template_instructions": null,
"template_reference_excerpt": null,
"themes": [],
"tone_persona_helper": null,
"tone_persona_id": null,
"tone_persona_label": null,
"voice_profile_id": null
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"audiences": [],
"content_type": "auto",
"content_type_label": null,
"model": "gemini/gemini-2.5-flash",
"preferred_title_length": null,
"prompt": null,
"pull_through_priorities": [],
"source_document_excerpt": null,
"source_document_id": null,
"source_document_title": null,
"source_mode": "freeform",
"template_instructions": null,
"template_reference_excerpt": null,
"themes": [],
"tone_persona_helper": null,
"tone_persona_id": null,
"tone_persona_label": null,
"voice_profile_id": null
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/content-creation/knowledgebases
List knowledgebases available for content drafts
Return all KBs visible to the user plus ensure the two default ones exist.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/knowledgebases" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/knowledgebases", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/knowledgebases", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/rewrite-phrases
Phrase-level edit suggestions driven by audience feedback
LLM-powered phrase-level edit suggestions based on audience test feedback.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"content_type_label": null,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": null,
"tone_persona_label": null
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/rewrite-phrases" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"content_type_label": null,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": null,
"tone_persona_label": null
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/rewrite-phrases", headers={"X-API-Key": "YOUR_KEY"}, json={
"content_type_label": None,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": None,
"tone_persona_label": None
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/rewrite-phrases", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"content_type_label": null,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": null,
"tone_persona_label": null
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"content_type_label": null,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": null,
"tone_persona_label": null
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/rewrite-segments
Rewrite specific draft segments to address audience feedback
LLM-powered rewrite of individual segments based on audience test feedback.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"content_type_label": null,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": null,
"tone_persona_label": null
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/rewrite-segments" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"content_type_label": null,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": null,
"tone_persona_label": null
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/rewrite-segments", headers={"X-API-Key": "YOUR_KEY"}, json={
"content_type_label": None,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": None,
"tone_persona_label": None
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/rewrite-segments", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"content_type_label": null,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": null,
"tone_persona_label": null
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"content_type_label": null,
"full_draft": "string",
"model": "gemini/gemini-2.5-flash",
"segments": [],
"tone_persona_helper": null,
"tone_persona_label": null
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/content-creation/source-documents
List content source documents
List workspace documents tagged for /content source generation.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/source-documents/upload
Upload content source document
Upload a source document for /content generation using the standard ingestion pipeline.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents/upload" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents/upload", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents/upload", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/content-creation/source-documents/{document_id}/attach
Attach existing document as content source
Tag an existing workspace document for /content source generation.
PARAMETERS
NAME IN TYPE DESCRIPTION
document_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents/string/attach" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents/string/attach", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents/string/attach", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
document_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/documents
Get all documents
Get all documents with pagination, filtering, and sorting
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/documents", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/documents
Create a new document
Create a new document (admin/owner only)
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"content": "string",
"content_type": "text",
"media_provenance": null,
"source_url": null,
"tags": [],
"title": "string"
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/documents" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "string",
"content_type": "text",
"media_provenance": null,
"source_url": null,
"tags": [],
"title": "string"
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/documents", headers={"X-API-Key": "YOUR_KEY"}, json={
"content": "string",
"content_type": "text",
"media_provenance": None,
"source_url": None,
"tags": [],
"title": "string"
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"content": "string",
"content_type": "text",
"media_provenance": null,
"source_url": null,
"tags": [],
"title": "string"
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"content": "string",
"content_type": "text",
"media_provenance": null,
"source_url": null,
"tags": [],
"title": "string"
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/documents/count
Get document count
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents/count" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/documents/count", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/count", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/documents/ingest
Ingest a document
Ingest a document from URL
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"audio_url": null,
"content_type": "string",
"media_provenance": null,
"source_url": "string"
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/documents/ingest" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"audio_url": null,
"content_type": "string",
"media_provenance": null,
"source_url": "string"
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/documents/ingest", headers={"X-API-Key": "YOUR_KEY"}, json={
"audio_url": None,
"content_type": "string",
"media_provenance": None,
"source_url": "string"
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/ingest", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"audio_url": null,
"content_type": "string",
"media_provenance": null,
"source_url": "string"
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"audio_url": null,
"content_type": "string",
"media_provenance": null,
"source_url": "string"
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/documents/query
Query a document
Query a document using a template
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"doc_id": "string",
"model": "gpt-3.5-turbo",
"query_template": "string"
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/documents/query" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"doc_id": "string",
"model": "gpt-3.5-turbo",
"query_template": "string"
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/documents/query", headers={"X-API-Key": "YOUR_KEY"}, json={
"doc_id": "string",
"model": "gpt-3.5-turbo",
"query_template": "string"
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/query", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"doc_id": "string",
"model": "gpt-3.5-turbo",
"query_template": "string"
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"doc_id": "string",
"model": "gpt-3.5-turbo",
"query_template": "string"
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/documents/upload
Upload and ingest a file
Upload and ingest a file with document enrichment and auto tags
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/documents/upload" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/documents/upload", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/upload", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/documents/{doc_id}
Get a specific document
PARAMETERS
NAME IN TYPE DESCRIPTION
doc_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/documents/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
doc_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PATCH /api/v1/documents/{doc_id}
Update a document
Update document fields (e.g. extracted_date, title).
PARAMETERS
NAME IN TYPE DESCRIPTION
doc_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/documents/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.patch("https://gw.apidirectory.com/kumkuat/api/v1/documents/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/string", {
method: "PATCH",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
doc_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/documents/{doc_id}
Delete a document
PARAMETERS
NAME IN TYPE DESCRIPTION
doc_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/documents/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/documents/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
doc_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/documents/{doc_id}/auto-tags
Get auto tags for a document
Get all auto tags applied to a specific document
PARAMETERS
NAME IN TYPE DESCRIPTION
doc_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents/string/auto-tags" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/documents/string/auto-tags", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/string/auto-tags", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
doc_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/documents/{doc_id}/auto-tags/{applied_tag_id}
Update an applied auto tag value
Update the extracted value of an applied auto tag for a specific document
PARAMETERS
NAME IN TYPE DESCRIPTION
doc_idREQUIRED
path
string
e.g. string
applied_tag_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/documents/string/auto-tags/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/documents/string/auto-tags/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/string/auto-tags/string", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
doc_id * (path)
applied_tag_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/documents/{doc_id}/content
Download a document's stored file
Stream the stored file for a document, authorized per request.<br/><br/>This is the authenticated replacement for handing out public bucket URLs<br/>(KUM-1315): the objects become private, and callers read them through here<br/>so that access is re-checked every time rather than living forever in a URL.
PARAMETERS
NAME IN TYPE DESCRIPTION
doc_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents/string/content" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/documents/string/content", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/string/content", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
doc_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/executives-for-theme
Get available executives for selected theme
Get available executives for selected theme
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/executives-for-theme" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/executives-for-theme", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/executives-for-theme", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/executives/{executive_name}
Get detailed information about a specific executive
Get detailed information about a specific executive
PARAMETERS
NAME IN TYPE DESCRIPTION
executive_nameREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/executives/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/executives/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/executives/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
executive_name * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/ingest/auto-detect
Auto-detect content type and ingest
Auto-detect content type and ingest document
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/ingest/auto-detect" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/ingest/auto-detect", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/ingest/auto-detect", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/ingest/youtube
Ingest YouTube video
Ingest YouTube video and extract transcript
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/ingest/youtube" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/ingest/youtube", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/ingest/youtube", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/insights
Get AI comparative analysis for executives or companies on a theme
Get AI comparative analysis for selected executives or companies on a specific theme
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/insights" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/insights", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/insights", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/insights
Get AI comparative analysis for executives or companies on a theme
POST variant of insights query for larger payloads.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/insights" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/insights", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/insights", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/insights/refresh-summaries
Refresh summary cache tables for insights
Refresh executive/company summary caches for the current workspace.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/insights/refresh-summaries" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/insights/refresh-summaries", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/insights/refresh-summaries", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/theme-filters
Get available themes and executives for insights
Get available themes and executives for insights analysis
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/theme-filters" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/theme-filters", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/theme-filters", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/themes
Get themes and extracted signals
Get themes and extracted signals with document links and metadata
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/themes" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/themes", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/themes", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/themes-for-executives
Get available themes for selected executives
Get available themes for selected executives
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/themes-for-executives" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/themes-for-executives", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/themes-for-executives", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/themes/debug
Debug themes data
Debug endpoint to check what signals exist
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/themes/debug" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/themes/debug", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/themes/debug", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/themes/test
Test themes endpoint
Test endpoint to verify signal_generator is working
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/themes/test" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/themes/test", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/themes/test", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/workspaces/{workspace_id}/members
List workspace members
Return workspace members for sharing UI.
PARAMETERS
NAME IN TYPE DESCRIPTION
workspace_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/workspaces/string/members" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/workspaces/string/members", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/workspaces/string/members", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
workspace_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/workspaces/{workspace_id}/pull_through_priorities
Get workspace pull-through priorities
Return the workspace-scoped pull-through priorities list.
PARAMETERS
NAME IN TYPE DESCRIPTION
workspace_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/workspaces/string/pull_through_priorities" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/workspaces/string/pull_through_priorities", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/workspaces/string/pull_through_priorities", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
workspace_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/workspaces/{workspace_id}/pull_through_priorities
Replace workspace pull-through priorities
Atomically replace the workspace-scoped pull-through priorities list.
PARAMETERS
NAME IN TYPE DESCRIPTION
workspace_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/workspaces/string/pull_through_priorities" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/workspaces/string/pull_through_priorities", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/workspaces/string/pull_through_priorities", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
workspace_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
default
POST /api/public/ensure-user-workspace
Optimized endpoint that creates user, workspace, and API key in a single transaction
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/ensure-user-workspace" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/public/ensure-user-workspace", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/public/ensure-user-workspace", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/public/ensure-workspace-key
Ensure a workspace exists and return an API key
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/ensure-workspace-key" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/public/ensure-workspace-key", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/public/ensure-workspace-key", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/public/get-user-api-key
Get a user's API key by Firebase UID or email (alias for /api/public/user/api-key)
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/get-user-api-key" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/public/get-user-api-key", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/public/get-user-api-key", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/public/get-user-workspaces
Get all workspaces for a user by Firebase UID or email
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/get-user-workspaces" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/public/get-user-workspaces", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/public/get-user-workspaces", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/public/get-workspace-api-key
Get API key for a specific workspace and user
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/get-workspace-api-key" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/public/get-workspace-api-key", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/public/get-workspace-api-key", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/public/sso/discover
Login-page lookup: does this email's domain (or this slug) use single sign-on?
<br/>Unauthenticated by design — it runs before anyone is signed in. It reveals<br/>only what every SSO login page reveals (that a domain has SSO and which<br/>provider id to start), never the workspace. See api/src/sso.py.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/public/sso/discover" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/public/sso/discover", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/public/sso/discover", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/public/user/api-key
Get a user's API key by Firebase UID or email
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/user/api-key" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/public/user/api-key", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/public/user/api-key", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/auth/keys
List API keys
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/auth/keys" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/auth/keys", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auth/keys", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/auth/keys
Create API key
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auth/keys" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/auth/keys", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auth/keys", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/auth/keys/{key_id}
Revoke API key
PARAMETERS
NAME IN TYPE DESCRIPTION
key_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/auth/keys/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/auth/keys/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auth/keys/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
key_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/auth/keys/{key_id}/rotate
Rotate API key
Revoke an existing key and mint a replacement with the same name and workspace binding.<br/><br/>Returns the new key value (shown exactly once) and the new key metadata.<br/>The old key is deactivated atomically before the new one is returned.
PARAMETERS
NAME IN TYPE DESCRIPTION
key_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auth/keys/string/rotate" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/auth/keys/string/rotate", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auth/keys/string/rotate", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
key_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/auto-tags/ensure
Ensure auto tags for all documents
Ensure all documents in the workspace have auto tags generated
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/ensure" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/ensure", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/ensure", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/auto-tags/status
Get auto tag status for workspace
Get the current auto tag status for the workspace
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/status" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/status", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/status", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/user/workspaces
Get all workspaces for the authenticated user
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/user/workspaces" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/user/workspaces", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/user/workspaces", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/workspace
Get the current workspace for the authenticated user
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/workspace", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/workspace", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/workspace/company-tags
Return distinct company names extracted by company auto tags for this workspace.
<br/>Admin key may pass ?workspace_id= to query another workspace.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace/company-tags" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/workspace/company-tags", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/workspace/company-tags", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/workspace/content-type-tags
Return distinct content/communication type values extracted by content-type auto tags.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace/content-type-tags" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/workspace/content-type-tags", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/workspace/content-type-tags", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /docs
Backward-compatible docs URLs.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/docs" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/docs", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/docs", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /openapi.json
Backward-compatible OpenAPI JSON URL.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/openapi.json" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/openapi.json", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/openapi.json", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /redoc
Backward-compatible ReDoc URL.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/redoc" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/redoc", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/redoc", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /swagger
Backward-compatible docs URLs.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/swagger" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/swagger", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/swagger", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
alerts
GET /api/v1/alerts/autocomplete
Workspace-scoped autocomplete for alert composer
Return audiences, companies, and commands for the alert composer autocomplete.<br/><br/>Query params:<br/>- q: optional search filter (case-insensitive substring match)<br/>- type: optional filter — 'audience', 'company', or 'command'
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/alerts/autocomplete" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/alerts/autocomplete", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/alerts/autocomplete", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
personas
GET /api/v1/audience-groups
Get audience group ordering
Return the workspace's audience groups with custom sort order.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/audience-groups" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/audience-groups", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/audience-groups", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/audience-groups
Add one audience category
Append a single audience category without touching the rest of the list.<br/><br/>Body: `{ "name": "...", "display_name": "..."? } → 201 {"group": {...}}`.<br/><br/>The bulk PUT above replaces the whole list (rows absent from its payload are<br/>deleted), which is the wrong tool for "add one" from a member-facing surface<br/>such as the Audience Library rail — a stale client would erase categories it<br/>never saw. This route only ever inserts; a name that already exists<br/>(case-insensitive) is a 409 carrying the existing row.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/audience-groups" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/audience-groups", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/audience-groups", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/audience-groups
Update audience group ordering
Bulk update audience groups (sort order + optional rename).<br/><br/>Body: `{ "groups": [ { "name": "...", "sort_order": 0, "display_name": "..." }, ... ] }`
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/audience-groups" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/audience-groups", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/audience-groups", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/audience-summaries
Get or generate audience category summary
Return a synthesized audience-level summary for a persona category.<br/>Aggregates persona reaction insights across recent documents and uses an LLM<br/>to produce an overall grade, themes, actions, and risks.<br/>Set force_refresh=true to bypass the cache and regenerate.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/audience-summaries/grades
Get cached grades for multiple audience categories
Return cached grade + trend for all (or specified) audience categories in one call.<br/>Reads from cache only — does NOT trigger LLM generation.<br/>Response: { grades: { "Regulators": { grade, trend, is_stale } | null, ... } }
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries/grades" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries/grades", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries/grades", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/audience-summaries/refresh
Queue audience cache refresh job
Queue a background job to proactively regenerate all audience category<br/>summaries for the workspace. This keeps the audience overview page fast<br/>by ensuring summaries are pre-computed rather than generated on demand.<br/><br/>Parameters (JSON body):<br/>- force_refresh: bool (default false) – regenerate even fresh summaries<br/>- days: int (default 30) – reaction lookback window<br/>- model: str (optional) – LLM model override<br/>- company_tag: str (optional) – scope to a specific company<br/>- pillar: str (optional) – scope to a specific narrative pillar
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries/refresh" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries/refresh", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries/refresh", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/executives/voice
Include or exclude an executive's voice in content creation
The per-executive voice toggle (KUM-1506). Body:<br/>`{"executive": "<name>", "enabled": true|false}.<br/><br/>Enabling creates the voice persona when missing and auto-tunes it from the<br/>executive's tracked statements (one LLM call — the response can take a few<br/>seconds on first enable). Disabling only clears include_in_voice_list;<br/>the tuned persona is kept so re-enabling is instant. The response reports<br/>values read back from the persona, not the request echo, because<br/>update_persona_template` silently drops unregistered keys.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/executives/voice" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/executives/voice", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/executives/voice", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/executives/voices
Executive content-creation voices for this workspace
State of every executive voice persona in the workspace (KUM-1506).<br/><br/>Also arms the lazy CEO auto-add: loading the executives page is a natural<br/>moment to make sure the CEO's voice exists, and the kick is throttled and<br/>runs off-request, so this read stays cheap.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/executives/voices" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/executives/voices", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/executives/voices", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/persona-summaries
Get or generate a single-persona reaction summary
Synthesized summary for ONE persona — the favorites-card analogue of the<br/>audience category summary (KUM-444). Reuses the category summary generator<br/>scoped to a single persona and caches under a `persona:<id> key. Reads<br/>cache by default; force_refresh=true` regenerates.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/persona-summaries" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/persona-summaries", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/persona-summaries", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas
Get all personas
Get persona templates for the current workspace, optionally filtered by category.<br/><br/>Supports pagination via `limit (default 200, max 500) and offset (default 0).<br/>Response includes total count before pagination so callers can detect truncation.<br/>Use ?summary=1` for the lightweight listing (no pagination cap applies there since<br/>summary objects are ~200B each).
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas
Create persona
Create a new persona template
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/avatar/generate
Generate persona avatar image
Disabled (KUM-1321). Avatar generation was the last un-US-pinnable LLM path.<br/><br/>Retired rather than repointed, on three findings that all pointed the same way:<br/><br/> * `litellm.image_generation is the one litellm entry point the Vertex<br/> failover wrapper cannot route, so with LLM_VERTEX_FAILOVER=1 every<br/> other call in the fleet moves to us-central1 and this one silently keeps<br/> egressing to Google's global endpoint. It was the only remaining hole in<br/> the US-region inference claim on KUM-1305.<br/> * Imagen is not reachable on Vertex for this project at all --<br/> imagen-4.0-generate-001, imagegeneration@006 and<br/> imagen-3.0-generate-002 all 404 in us-central1 -- so "route it to<br/> Vertex instead" is a Model Garden enablement project, not a one-liner.<br/> * Lifetime usage is six requests from one workspace in a single 109-second<br/> burst on 2026-08-12, four of which failed. Nothing has called it since.<br/><br/>Two working avatar paths remain and are untouched: upload<br/>(/api/v1/personas/avatar/upload`) and paste-an-image-URL. The "Generate<br/>With AI" card is removed from the editor so this returns for no one who did<br/>not call the API directly.<br/><br/>Re-enabling is deliberately a code change and not a flag, because a flag here<br/>silently reopens a customer-facing residency answer. It needs two things, and<br/>the second is not optional:<br/><br/> 1. a US-pinned image model enabled in
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/avatar/generate" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/avatar/generate", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/avatar/generate", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/avatar/upload
Upload persona avatar image
Upload an avatar image for personas and return a usable avatar URL.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/avatar/upload" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/avatar/upload", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/avatar/upload", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/build
Build personas in the background
Queue one PERSONA_BUILD job per requested audience and kick each at once.<br/><br/>Body: `{"personas": [{"name": "...", "organisation": "...", "context": "..."}, ...]}<br/>(1–100 rows) → 202 {"jobs": [{"job_id", "name"}], "requested": n}.<br/><br/>This is the asynchronous half of the Audience Library's "Add audiences":<br/>the foreground path ran two blocking LLM calls per row, chunked at five per<br/>request so a pasted list did not die at the proxy. Here each row is its own<br/>job — the job manager dedupes PERSONA_BUILD on the requested name, so the<br/>same name twice in one list (or one still queued) shares a job — and the<br/>requester gets a bell row per persona as it lands. Poll GET /api/v1/jobs/<id>`.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/build" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/build", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/build", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/bulk
Bulk create personas
Bulk create persona templates for the current workspace.<br/>Skips duplicate names by default.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/bulk" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/bulk", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/bulk", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/bulk-update
Apply a reviewed tuning proposal to many personas
Apply per-persona field updates in one batch, with a per-persona report.<br/><br/>Deliberately NOT "here is a proposal, here are 40 ids, fan it out": the<br/>caller sends one explicit entry per persona, so what gets written is what<br/>was reviewed. `dry_run` returns the identical before/after computation<br/>without writing, which is what the UI renders as its preview — a preview<br/>built by the same code path as the write cannot drift from it.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/bulk-update" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/bulk-update", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/bulk-update", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/categories
Get persona categories
Get all persona categories for the current workspace, sorted by custom order when available.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/categories" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/categories", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/categories", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/chat-onboarding
Persona chat onboarding and prompt coaching
Stateless chat endpoint for persona onboarding and prompt coaching.<br/>The client sends full conversation history and receives the next assistant turn plus structured suggestions.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/chat-onboarding" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/chat-onboarding", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/chat-onboarding", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/event-checks
Real-world event auto-test results across the workspace
Workspace-wide ledger of real-event persona auto-tests (KUM-1387).<br/><br/>Event checks are `persona_drift_checks rows with NULL<br/>golden_response_id — a persona reacting to an actually-ingested document,<br/>graded for in-character consistency. Golden-baseline drift checks are a<br/>different population and are excluded here.<br/><br/>Ungated at the API (mirrors GET .../health); the Validation Center UI<br/>gates on persona_health_enabled`. The summary reports counts , not<br/>percentages — the KUM-1345 evidence ruling applies to this surface too.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/event-checks" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/event-checks", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/event-checks", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/generate-draft
Generate persona draft fields
Generate persona fields from partial inputs.<br/>Name is required. By default, only missing fields are generated.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/generate-draft" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/generate-draft", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/generate-draft", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/grade-timeline
Get grade timeline for personas by period
Return grade per persona per time period for the breakdown chart.<br/>Groups reaction insights by persona and time period (monthly or quarterly).<br/>Response: { timeline: { personaId: { "2025-Q1": { grade, count, reactions } } }, granularity }
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/grade-timeline" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/grade-timeline", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/grade-timeline", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/interact
Interact with persona
Interact with a synthetic persona
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/interact" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/interact", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/interact", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/interactions
Get persona interactions
Get persona interactions, optionally filtered by persona
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/interactions" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/interactions", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/interactions", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/interactions/{interaction_id}
Get persona interaction
Get persona interaction results
PARAMETERS
NAME IN TYPE DESCRIPTION
interaction_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/interactions/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/interactions/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/interactions/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
interaction_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/preview-compiled-prompt
Preview compiled persona prompt payload
Return the exact system/user prompt payload that would be sent to the LLM.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/preview-compiled-prompt" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/preview-compiled-prompt", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/preview-compiled-prompt", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/reaction-insights
List cached persona reaction insights
List cached persona reaction insights for the current workspace.<br/><br/>Set latest_only=true to collapse each (persona, document) pair to its<br/>newest row. It is NOT one row per persona — a persona that reacted to ten<br/>documents still returns ten rows. That wording used to say "per persona",<br/>which read as "one row, total" and sent the persona profile page to<br/>latest_only=false, where superseded scorecards skewed its relationship<br/>grade (KUM-989). Leave it off only when you want run history.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/reaction-insights
Get or generate cached persona reaction insights
Return cached persona reaction insights for a document/persona set.<br/>If force_refresh=true, regenerate and overwrite cache rows.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/reaction-insights/async
Queue a background job to generate persona reaction insights
Queue a background job for generating persona reaction insights and return<br/>a job_id the client can poll. This unlocks batches of ≥10 audiences without<br/>tying them to a single-request gateway timeout and lets the UI append rows<br/>as they complete via polling the jobs + reaction-insights list endpoints.<br/><br/>The synchronous POST endpoint remains the right choice for small batches<br/>(see PERSONA_REACTION_SYNC_THRESHOLD); this route is for larger fan-outs.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights/async" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights/async", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights/async", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/reaction-insights/history
Get reaction history for a persona+document pair
Return chronological reaction entries for a single persona + document,<br/>ordered newest-first. Used by the reaction-history timeline in the UI.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights/history" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights/history", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights/history", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/why-it-matters
Generate/fetch grounded 'why this matters' for a persona+document
Grounded retrieval pass surfacing why a communication matters to a specific<br/>persona. Rides the grounded-context cache (`grounded_context_answer, 7-day<br/>TTL + citations): a fresh cached answer is returned as-is unless<br/>force_refresh` is set, otherwise one web-grounded LLM call is made<br/>synchronously and persisted. Click-to-generate keeps LLM/search spend bounded.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/why-it-matters" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/why-it-matters", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/why-it-matters", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/why-it-matters/config
Why-this-matters availability + auto setting
Return whether the grounded 'Why this matters to them' section is available<br/>for this workspace (feature toggle, super-admin bypassed) and whether it is<br/>configured to generate automatically (workspace setting).
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/why-it-matters/config" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/why-it-matters/config", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/why-it-matters/config", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}
Get persona by ID
Get a specific persona template
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/personas/{persona_id}
Update persona
Update an existing persona template
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/personas/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/personas/{persona_id}
Delete persona
Delete a persona template
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/personas/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/personas/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/analyze-voice
Analyze voice from writing samples
Analyze writing samples to extract a structured voice profile for a persona.<br/><br/>Accepts either raw text samples or knowledgebase document IDs.<br/>Uses the workspace system default model (audience_model) for analysis.<br/>Stores the resulting voice profile in the persona's persona_config.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/analyze-voice" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/analyze-voice", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/analyze-voice", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/personas/{persona_id}/auto-test
Enable/disable auto-testing this persona against real events
Set the per-persona real-event auto-test opt-in (KUM-1296). Body:<br/>`{"enabled": true|false}. Defaults to off; turning it on means every<br/>document ingested into the workspace costs this persona one generation plus<br/>one judge call, capped at EVENT_AUTO_TEST_PERSONA_CAP personas per event.<br/><br/>The response reports the value read back from the persona rather than the<br/>value that was posted: update_persona_template` silently drops config keys<br/>that are missing from its allow-list while still returning success, so<br/>echoing the request would report a write that never landed.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/auto-test" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/auto-test", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/auto-test", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/discover-linkedin
Discover LinkedIn profile for persona
Find LinkedIn profile candidates for a persona from real search results.<br/><br/>Search-engine backed, not LLM backed (KUM-1226). Grounded search cannot do<br/>this job on any transport: the query runs, but Google returns zero citable<br/>chunks for LinkedIn, so the model answers from memory with a name-shaped slug<br/>that nothing then verified. See `cloud_providers/linkedin_resolver for the<br/>measurement, including a wrong first diagnosis worth not repeating.<br/><br/>Every URL returned is one a search engine produced. When retrieval finds<br/>nothing the response is an empty list plus a reason` -- a guessed URL is<br/>worse than none, because applying a candidate writes a persona social link<br/>and points Bright Data at a profile that may not exist.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/discover-linkedin" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/discover-linkedin", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/discover-linkedin", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/drift-check
Trigger a persona drift check now
Enqueue a PERSONA_DRIFT_CHECK job for a single persona (re-run golden<br/>prompts, LLM-judge similarity, roll health state).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-check" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-check", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-check", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/drift-checks/{check_id}/confirm
Confirm a drift check (response fine)
Confirm-or-tune → CONFIRM: the current response is fine, so promote it to<br/>the golden baseline (text + verified_by/at) and mark the check resolved.<br/>Feeds the human-in-the-loop revalidation back into the set, which is what<br/>keeps the baseline current instead of ossifying around an older answer.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
check_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-checks/string/confirm" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-checks/string/confirm", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-checks/string/confirm", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
check_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/drift-checks/{check_id}/tune
Mark a drift check as being tuned
Confirm-or-tune → TUNE: the response has drifted; mark the check resolved<br/>as 'tuned' (the UI routes the user to the refinements/feedback flow).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
check_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-checks/string/tune" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-checks/string/tune", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-checks/string/tune", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
check_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/drift-policy
Get persona drift-check cadence
Return the effective drift-check cadence (override or workspace default).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-policy" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-policy", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-policy", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/personas/{persona_id}/drift-policy
Set persona drift-check cadence override
Set (or clear) the per-persona drift-check cadence override. Body:<br/>`{"frequency": "weekly|monthly|quarterly|manual"}` (empty/"default" clears).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-policy" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-policy", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-policy", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/feedback
Submit persona response feedback
Submit feedback for a persona response (thumbs up/down + description).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/feedback" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/feedback", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/feedback", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/generate
Generate content in persona voice
Generate multi-format content (press release, blog post, social media, email,<br/>product description) written in a persona's voice profile.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/generate" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/generate", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/generate", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/golden-responses
List persona golden responses
List golden-set entries (trusted prompt/response baselines) for a persona.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/golden-responses
Add a golden response
Add a golden-set entry.<br/><br/>Two modes:<br/>- Manual/real-world: provide prompt + golden_response (+ optional source).<br/>- Seed-from-feedback: provide feedback_id; the server hydrates prompt/response<br/> from the positive feedback row and stamps source='user_feedback'.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/golden-responses/candidates
List seed-from-feedback candidates
List positive feedback items eligible to seed the golden set.<br/><br/>Each candidate carries already_added so the picker can disable items that<br/>have already been promoted (deduped by source_feedback_id).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/candidates" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/candidates", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/candidates", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PATCH /api/v1/personas/{persona_id}/golden-responses/{golden_id}
Update a golden response
Edit prompt/response or activate/deactivate a golden-set entry.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
golden_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.patch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/string", {
method: "PATCH",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
golden_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/personas/{persona_id}/golden-responses/{golden_id}
Delete a golden response
Delete a golden-set entry.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
golden_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
persona_id * (path)
golden_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/health
Get persona health + latest drift checks
Return a persona's rolling health state, drift cadence, and the latest<br/>drift run's checks (failing ones first) for the confirm-or-tune panel.<br/><br/>Ungated at the API (mirrors golden-responses / refinements); the UI gates on<br/>`persona_health_enabled`.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/health" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/health", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/health", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/intelligence
Get a persona's intelligence snapshots
Return a persona's synthesized snapshots plus its measured corpus facts.<br/><br/>Read-only: this never triggers synthesis. The `sections snapshots are<br/>produced by the PERSONA_INTELLIGENCE job on the persona's refresh cadence or<br/>via the manual refresh endpoint below, so a page view costs no inference<br/>(KUM-681).<br/><br/>measured` (KUM-684) is different in kind and is computed here, per<br/>request: follower counts and a recent-activity feed are indexed reads over<br/>the persona's linked knowledgebases, not model output. Snapshotting them<br/>would gain nothing — there is no inference to amortize — and would cost<br/>accuracy, because the default refresh cadence is quarterly and a feed<br/>labelled "live activity" that is a quarter stale is the kind of thing<br/>KUM-680 removed from this page.<br/><br/>Both are workspace-scoped: stance is measured toward *this* workspace's<br/>company and so are mentions, which is why a marketplace install recomputes<br/>against the buyer's workspace rather than inheriting the seller's reading.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/intelligence" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/intelligence", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/intelligence", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/link-external-source
Link external source to persona
Link an external source (e.g. a journalist's column, a blog, or a publication URL)<br/>to a persona by creating a knowledgebase with a web/RSS watcher source.<br/>If the persona already has an external-source KB, the existing one is returned.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-external-source" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-external-source", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-external-source", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/link-file
Link an uploaded file to persona
Upload a file (deck, doc, notes) and link it to a persona as a grounding<br/>source. The file is ingested into a per-persona "Linked Files"<br/>knowledgebase that is attached via linked_knowledgebase_ids, so its<br/>content grounds the persona and feeds persona refresh like watched<br/>web/social sources do.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-file" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-file", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-file", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/link-linkedin
Link LinkedIn profile to persona
Link a LinkedIn profile to a persona by creating a knowledgebase with a<br/>LinkedIn watcher source. If the persona already has a LinkedIn KB, the<br/>existing one is returned instead of creating a duplicate.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-linkedin" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-linkedin", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-linkedin", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/quick-link
Quick-add a persona link
Append one pasted profile or website URL to a persona's links (KUM-779).<br/><br/>The personas listing's "+" control posts here rather than PUT /personas/<id>,<br/>because social_links on that route is a *replace*: a caller holding only the<br/>one link it just collected would wipe every other link on the persona. Doing<br/>the read-modify-write server-side makes the append atomic and reuses the bulk<br/>importer's de-dupe and cap rules.<br/><br/>A recognized social host lands in social_links; anything else lands in<br/>external_sources. That split is deliberate and load-bearing, not tidiness:<br/>a non-empty social_links is a signal several readers act on. It trips<br/>classify_persona_kind's "has-public-source" tiebreak, which would flip an<br/>archetype persona to organization (and switch its profile to the intelligence<br/>shell) just because someone pasted a magazine URL; and it satisfies the<br/>profile's "Live activity & reach" readiness row, which is measured only from<br/>x/bluesky/linkedin sources and so would sit permanently ready-but-empty.<br/>external_sources is inert for both.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/quick-link" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/quick-link", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/quick-link", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/refinements
List persona refinements
List all active refinements (tuning notes) for a persona.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/refinements
Add manual persona refinement
Manually add a refinement note to a persona profile.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PATCH /api/v1/personas/{persona_id}/refinements/{refinement_id}
Update persona refinement
Update content or active state of a refinement note.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
refinement_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.patch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements/string", {
method: "PATCH",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
refinement_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/personas/{persona_id}/refinements/{refinement_id}
Delete persona refinement
Delete a refinement note from a persona profile.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
refinement_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
persona_id * (path)
refinement_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/refresh
Trigger a persona refresh now
Enqueue a PERSONA_REFRESH job for a single persona (re-crawl linked KBs,<br/>regenerate the voice/position summary, stamp the cadence).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/refresh-intelligence
Trigger persona intelligence synthesis now
Enqueue a PERSONA_INTELLIGENCE job for a single persona.<br/><br/>The same job the refresh cadence chains, so the manual button and the<br/>schedule share exactly one synthesis path.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-intelligence" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-intelligence", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-intelligence", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/refresh-policy
Get persona refresh cadence policy
Return the effective refresh cadence for a persona (override or workspace default).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-policy" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-policy", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-policy", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/personas/{persona_id}/refresh-policy
Set persona refresh cadence override
Set (or clear) the per-persona refresh cadence override.<br/><br/>Body: `{"frequency": "weekly|monthly|quarterly|manual"}. Pass null /<br/>empty / "default" to clear the override and inherit the workspace default.<br/>Recomputes next_refresh_at` from the last refresh (or now) at the new cadence.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-policy" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-policy", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-policy", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/relink-marketplace
Adopt a marketplace source into an existing persona
Point an existing workspace persona at a marketplace catalog row (KUM-1303).<br/><br/>Body: `{"source_persona_id": "<catalog persona id>"}.<br/><br/>This backs the grid's Replace action. A workspace can hold a persona that<br/>shares a catalog persona's name but was hand-authored, or was installed before<br/>KUM-1231 taught the install route to record linkage — either way it carries no<br/>source_persona_id, so it is not managed and never receives catalog updates.<br/><br/>Relink happens in place . The obvious implementation — delete the local row<br/>and re-install from the catalog — mints a new persona id, and everything that<br/>references a persona by id (document auto-tags, signals, audiences, report<br/>inclusion) would silently point at a row that no longer exists. So this only<br/>ever UPDATEs, and the id is part of the contract asserted by the tests.<br/><br/>Two deliberate choices:<br/><br/>* The source id is validated through _resolve_marketplace_source_persona` —<br/> the same guard the install route applies — so a caller cannot name an<br/> arbitrary uuid and pull a persona out of a workspace they cannot read.<br/>* The managed fields (links, grounded prompts, voice details) are<br/> overwritten from the source, not gap-filled the way install does.<br/> Install is gap-filling because the caller is posting a persona and may<br/> have edited it in the modal first; here the caller is asking<br/> to *become* the catalog version. Being preci
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/relink-marketplace" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/relink-marketplace", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/relink-marketplace", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/self-heal-policy
Get persona self-healing auto-tune policy
Return the per-persona self-healing auto-tune policy (KUM-1297).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/self-heal-policy" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/self-heal-policy", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/self-heal-policy", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/personas/{persona_id}/self-heal-policy
Set persona self-healing auto-tune policy
Turn self-healing auto-tune on or off for one persona (KUM-1297).<br/><br/>Body: `{"enabled": true|false}. Off by default and off for every existing<br/>persona — auto-tune rewrites the customer's own persona instructions, so it<br/>only ever runs where someone opted in.<br/><br/>Returns the read-back policy rather than the requested one. New<br/>persona_config keys are dropped unless allow-listed in<br/>update_persona_template`, and that drop returns success, so echoing the<br/>request would report a write that did not happen.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/self-heal-policy" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/self-heal-policy", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/self-heal-policy", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/unlink-file
Unlink an uploaded file from persona
Remove a linked file from a persona: detach the document from the<br/>persona's linked-files KB and soft-delete it (linked-file uploads exist<br/>only to ground this persona).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/unlink-file" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/unlink-file", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/unlink-file", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/voice-profiles
List voice profiles for a persona
Return all voice profiles for a persona.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/personas/{persona_id}/voice-profiles/{profile_id}
Get a single voice profile
Return a single voice profile by ID.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/personas/{persona_id}/voice-profiles/{profile_id}
Update a voice profile
Update an existing voice profile (name, adjective_tags, tone_pillars, etc.).
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/personas/{persona_id}/voice-profiles/{profile_id}
Delete a voice profile
Delete a voice profile. Cannot delete the last remaining profile.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/personas/{persona_id}/voice-profiles/{profile_id}/set-default
Set default voice profile
Set a voice profile as the default for content generation.
PARAMETERS
NAME IN TYPE DESCRIPTION
persona_idREQUIRED
path
string
e.g. string
profile_idREQUIRED
path
—
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id/set-default" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id/set-default", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id/set-default", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
persona_id * (path)
profile_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/translate
Translate persona output into the operator language
Translate a persona reaction row, or a single string, for the operator.<br/><br/>Two modes, because the two surfaces have different storage:<br/><br/>- `{"reaction_insight_id": ...} — object-scoped. The translation is<br/> cached on the row at response_payload.translations.<tag>, so every<br/> repeat view is free. Audience Snapshot cards and narrative Stage A<br/> responses are both persona_reaction_insights rows, so both are served<br/> here.<br/>- {"text": ...} — stateless. Persona chat in the browser posts to<br/> /api/v1/personas/interact, which persists nothing, so there is no<br/> parent object to cache on. The caller caches for the session instead.<br/><br/>target_language resolves explicit payload value -> the caller's own<br/>preference ( user_settings.ui_preferences.language, global row) -><br/>the workspace operator language (workspace.settings.language`) -><br/>English (KUM-1447). An explicit value still wins, which is what lets a<br/>reader translate one message into something other than their default.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/translate" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/translate", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/translate", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/validation/runs
Validation study runs, summaries only, newest first
Summaries (no payload) of every run of `kind` — the trend strip.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/validation/runs" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/validation/runs", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/validation/runs", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/validation/runs/latest
Latest run of a pre-registered persona validation study
The Validation Center's study data (KUM-1387).<br/><br/>`kind is prediction_ledger (the retrospective Prediction Ledger:<br/>persona arms vs same-model baselines on real events, design/kum-1387-<br/>prediction-ledger) or voice_backtest` (the V1 pairwise voice-fidelity<br/>study). Rows are written only by the study harness's exporter, so what this<br/>serves is exactly what RESULTS.md was generated from. Fleet-level evidence<br/>about the marketplace catalog, not workspace data — any authenticated key<br/>with persona.read may read it; the polarys page keeps its own gate.<br/>Missing run => 404 with a body the page can tell apart from an empty ledger.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/validation/runs/latest" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/validation/runs/latest", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/validation/runs/latest", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/workspace/health-check-families
Get per-family health-check toggles + cost
Return every check family, its declared cost, and this workspace's opt-in.<br/><br/>Ungated at the API for the same reason `GET /personas/<id>/health is: the<br/>settings UI needs to know whether the feature is on in order to decide what<br/>to render, and a 403 is indistinguishable from "no families exist" at the<br/>fetch site. master_enabled` in the payload is the honest answer; the write<br/>below is what is gated.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace/health-check-families" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/workspace/health-check-families", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/workspace/health-check-families", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/workspace/health-check-families
Set per-family health-check toggles
Enable or disable individual check families for this workspace.<br/><br/>Body: `{"families": {"drift": true}}` — a partial map. Families the body<br/>does not name keep their stored state, so a UI that persists one switch<br/>cannot silently reset the others.<br/><br/>Returns the read-back resolved policy rather than the requested state<br/>(the KUM-1297 convention): a settings write that lands nowhere still returns<br/>200, so the client must render what persisted, not what it asked for.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/workspace/health-check-families" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/workspace/health-check-families", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/workspace/health-check-families", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/workspace/persona-refresh-default
Get workspace default persona refresh cadence
Return the workspace-level default refresh cadence (falls back to quarterly).
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace/persona-refresh-default" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/workspace/persona-refresh-default", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/workspace/persona-refresh-default", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/workspace/persona-refresh-default
Set workspace default persona refresh cadence
Set the workspace-level default refresh cadence (marquee/default personas<br/>inherit this when they have no per-persona override).
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/workspace/persona-refresh-default" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/workspace/persona-refresh-default", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/workspace/persona-refresh-default", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
auto_tags
GET /api/v1/auto-tag-aliases
Get auto tag alias rules
Get alias normalization rules visible in the current workspace.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/auto-tag-aliases
Create auto tag alias rule
Create an alias normalization rule for an auto tag.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/auto-tag-aliases/apply-normalization
Apply alias normalization to existing applied tags
Normalize existing applied auto tag values using current alias rules.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/apply-normalization" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/apply-normalization", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/apply-normalization", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/auto-tag-aliases/suggestions
Get alias suggestions from extracted values
Get extracted value suggestions to speed up alias rule creation.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/suggestions" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/suggestions", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/suggestions", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/auto-tag-aliases/{id}
Update auto tag alias rule
Update an existing auto tag alias rule.
PARAMETERS
NAME IN TYPE DESCRIPTION
idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/string", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/auto-tag-aliases/{id}
Delete auto tag alias rule
Delete an auto tag alias rule.
PARAMETERS
NAME IN TYPE DESCRIPTION
idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/auto-tags
Get all auto tags
Get all auto tags visible in the current workspace
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/auto-tags
Create auto tag
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/auto-tags/generate-draft
Generate auto tag draft fields
Generate auto tag fields from partial inputs.<br/>Name is required. By default, only missing fields are generated.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/generate-draft" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/generate-draft", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/generate-draft", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/auto-tags/test
Test auto tag extraction
Test an auto tag against text input or an onboarded document without saving results
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/test" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/test", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/test", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/auto-tags/{id}
Get auto tag by ID
Get a specific auto tag visible in the current workspace
PARAMETERS
NAME IN TYPE DESCRIPTION
idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/auto-tags/{id}
Update auto tag
Update an existing auto tag
PARAMETERS
NAME IN TYPE DESCRIPTION
idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/auto-tags/{id}
Delete auto tag
PARAMETERS
NAME IN TYPE DESCRIPTION
idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/documents/{doc_id}/retag
Retag a document
Retag a document by rerunning all auto tags
PARAMETERS
NAME IN TYPE DESCRIPTION
doc_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/documents/string/retag" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/documents/string/retag", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/documents/string/retag", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
doc_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
reports
GET /api/v1/reports
List custom reports for workspace
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/reports" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/reports", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/reports
Create a custom report
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/reports", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/reports/{report_id}
Get custom report with sections
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/reports/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/reports/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PATCH /api/v1/reports/{report_id}
Update a custom report
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/reports/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.patch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string", {
method: "PATCH",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/reports/{report_id}
Delete a custom report
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/reports/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/reports/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/reports/{report_id}/customize-style
Generate layout_config from natural language style description
Use LLM to translate a natural language style description into a layout_config JSON.
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/customize-style" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/customize-style", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/customize-style", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/reports/{report_id}/generate
Generate all stale sections
Regenerate all stale sections of a report. Returns cached output for fresh sections.
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/generate" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/generate", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/generate", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/reports/{report_id}/pdf
Download report as PDF
Generate and return a PDF of the report.
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/pdf" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/pdf", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/pdf", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/reports/{report_id}/schedule
Get report schedule
Get the current refresh schedule for a report (if any).
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/reports/{report_id}/schedule
Create report refresh schedule
Create a recurring refresh schedule for a report.
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PATCH /api/v1/reports/{report_id}/schedule
Update report schedule
Update the refresh schedule for a report.
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.patch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule", {
method: "PATCH",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/reports/{report_id}/schedule
Delete report schedule
Remove the refresh schedule for a report.
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/reports/{report_id}/sections
Add section to a report
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PATCH /api/v1/reports/{report_id}/sections/{section_id}
Update a report section
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
section_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.patch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string", {
method: "PATCH",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
section_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/reports/{report_id}/sections/{section_id}
Delete a report section
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
section_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
report_id * (path)
section_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/reports/{report_id}/sections/{section_id}/generate
Generate output for a single section
Force-generate (or regenerate) the LLM output for a single report section.
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
section_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string/generate" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string/generate", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string/generate", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
section_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/reports/{report_id}/send-email
Send report via email
Send the report as an HTML email with optional PDF attachment.
PARAMETERS
NAME IN TYPE DESCRIPTION
report_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/send-email" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/send-email", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/reports/string/send-email", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
report_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
signals
POST /api/v1/signal-templates
Create signal template
Create a new signal template
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/signal-templates/bulk
Bulk create signal templates
Bulk create signal templates for the current workspace.<br/>Supports optional row-level prompt/context guidance and optional draft autogeneration.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/bulk" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/bulk", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/bulk", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/signal-templates/generate-draft
Generate signal template draft fields
Generate signal template fields from partial inputs.<br/>Name is required. By default, only missing fields are generated.
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/generate-draft" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/generate-draft", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/generate-draft", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
PUT /api/v1/signal-templates/{template_id}
Update signal template
Update an existing signal template
PARAMETERS
NAME IN TYPE DESCRIPTION
template_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.put("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/string", {
method: "PUT",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
template_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/signal-templates/{template_id}
Delete signal template
PARAMETERS
NAME IN TYPE DESCRIPTION
template_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
template_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/signals
Get all signals
Get all signals with pagination
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/signals", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/signals/document/{document_id}
Get signals for a specific document
Get all signals for a specific document with filtering
PARAMETERS
NAME IN TYPE DESCRIPTION
document_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/document/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/signals/document/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/document/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
document_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
DELETE /api/v1/signals/document/{document_id}
Delete signals for a specific document
Soft-delete all non-deleted signals for a specific document in the current workspace.
PARAMETERS
NAME IN TYPE DESCRIPTION
document_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/signals/document/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.delete("https://gw.apidirectory.com/kumkuat/api/v1/signals/document/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.text)
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/document/string", {
method: "DELETE",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.text());
Try it — sign in first
document_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/signals/execute-workspace-signals
Execute all workspace signals on a document (async)
Execute all signal templates in the workspace against a specific document.<br/><br/>This endpoint is non-blocking - it immediately returns after queuing the signal<br/>execution to run in the background. Use this after document upload to automatically<br/>run all configured signals against the new document.
REQUEST BODY · APPLICATION/JSON · REQUIRED
{
"document_id": "string",
"user_id": null,
"workspace_id": null
}
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signals/execute-workspace-signals" \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"document_id": "string",
"user_id": null,
"workspace_id": null
}'
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/signals/execute-workspace-signals", headers={"X-API-Key": "YOUR_KEY"}, json={
"document_id": "string",
"user_id": None,
"workspace_id": None
})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/execute-workspace-signals", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"document_id": "string",
"user_id": null,
"workspace_id": null
})
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
body (application/json) {
"document_id": "string",
"user_id": null,
"workspace_id": null
}
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/signals/generate
Generate signals
Generate signals from input
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signals/generate" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/signals/generate", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/generate", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/signals/runs
Get all signal runs
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/runs" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/signals/runs", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/runs", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/signals/runs/{run_id}
Get signal run
Get signal run status and results
PARAMETERS
NAME IN TYPE DESCRIPTION
run_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/runs/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/signals/runs/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/runs/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
run_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/signals/templates
Get all signal templates
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/templates" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/signals/templates", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/templates", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/signals/templates/{template_id}
Get signal template by ID
Get a specific signal template
PARAMETERS
NAME IN TYPE DESCRIPTION
template_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/templates/string" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/signals/templates/string", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/templates/string", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
template_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/signals/templates/{template_id}/signals
Get signals by template
Get all signals from a specific template
PARAMETERS
NAME IN TYPE DESCRIPTION
template_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/templates/string/signals" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/signals/templates/string/signals", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/templates/string/signals", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
template_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
POST /api/v1/signals/{signal_id}/feedback
Submit signal feedback
Submit feedback for a signal (thumbs up/down)
PARAMETERS
NAME IN TYPE DESCRIPTION
signal_idREQUIRED
path
string
e.g. string
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signals/string/feedback" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.post("https://gw.apidirectory.com/kumkuat/api/v1/signals/string/feedback", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/signals/string/feedback", {
method: "POST",
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
signal_id * (path)
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
test
GET /api/v1/test
Test endpoint
Simple test endpoint that doesn't require authentication
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/test" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/test", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/test", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.
GET /api/v1/test-theme-filters
Test theme filters without auth
Test theme filters endpoint without authentication
RESPONSES
422 Unprocessable Entity
[
{
"ctx": null,
"input": null,
"loc": [],
"msg": "string",
"type": "string",
"url": null
}
]
CODE
CURL
PYTHON
JAVASCRIPT
COPY
curl "https://gw.apidirectory.com/kumkuat/api/v1/test-theme-filters" \
-H "X-API-Key: YOUR_KEY"
import requests
r = requests.get("https://gw.apidirectory.com/kumkuat/api/v1/test-theme-filters", headers={"X-API-Key": "YOUR_KEY"})
print(r.status_code, r.headers.get("X-Gw-Remaining"))
print(r.json())
const r = await fetch("https://gw.apidirectory.com/kumkuat/api/v1/test-theme-filters", {
headers: { "X-API-Key": "YOUR_KEY" }
});
console.log(r.status, r.headers.get("X-Gw-Remaining"));
console.log(await r.json());
Try it — sign in first
Send request →
Runs on a sandbox key: 2000 requests a month. Your real key is for production.