KumkuatKumkuat
API REFERENCE · v1.0.0

Kumkuat API

Kumkuat - Document Management and AI Analysis Platform

GETTING STARTED
Every request goes to https://gw.apidirectory.com/kumkuat/ with your key in the X-API-Key header. What's left of your allowance rides back on every response in X-Gw-Remaining.
Get a key → · Sign in →
curl "https://gw.apidirectory.com/kumkuat/api/chat/sessions/{session_id}/attachments" \
  -H "X-API-Key: YOUR_KEY"
FROM AN AI AGENT
This API is also an MCP server. Add https://mcp.kumkuat.ai/ to Claude Code, Cursor or any MCP client with your key as a bearer token and every operation below becomes a tool — same key, same metering, same allowance. In a connector that only takes a URL, use the connector URL instead.
claude mcp add --transport http kumkuat https://mcp.kumkuat.ai/ \
  --header "Authorization: Bearer YOUR_KEY"

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
NAMEINTYPEDESCRIPTION
session_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/chat/sessions/string/attachments" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

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
NAMEINTYPEDESCRIPTION
session_idREQUIRED path string
e.g. string
document_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/chat/sessions/string/attachments/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/api/v1/communications

Get communications with auto tags

Get documents for communications page with auto tags

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/communications" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/api/v1/communications/tag-filters

Get Communications tag-value filters

Get available tag-value filter options for the Communications page.

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/communications/tag-filters" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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": []
}'
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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"
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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"
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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"
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/documents" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/bulk-delete" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
draft_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
draft_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/drafts/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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": []
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/knowledgebases" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents/upload" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
document_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/content-creation/source-documents/string/attach" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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"
}'
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/api/v1/documents/count

Get document count

Get total document count

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents/count" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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"
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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"
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/documents/upload" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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

Get a document by ID

PARAMETERS
NAMEINTYPEDESCRIPTION
doc_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
doc_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/documents/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

DELETE/api/v1/documents/{doc_id}

Delete a document

Delete a document by ID

PARAMETERS
NAMEINTYPEDESCRIPTION
doc_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/documents/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
doc_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents/string/auto-tags" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
doc_idREQUIRED path string
e.g. string
applied_tag_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/documents/string/auto-tags/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
doc_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/documents/string/content" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/executives-for-theme" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
executive_nameREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/executives/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

POST/api/v1/extract-text

Extract text from an uploaded file without saving

Extract text from an uploaded file and return it. Nothing is saved.<br/>Supports PDF, DOCX, PPTX, and text-based formats.

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/extract-text" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/ingest/auto-detect" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/ingest/youtube" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/insights" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/insights" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/insights/refresh-summaries" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/theme-filters" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/themes" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/themes-for-executives" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/themes/debug" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/themes/test" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
workspace_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/workspaces/string/members" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
workspace_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/workspaces/string/pull_through_priorities" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
workspace_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/workspaces/string/pull_through_priorities" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/ensure-user-workspace" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/ensure-workspace-key" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/get-user-api-key" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/get-user-workspaces" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/get-workspace-api-key" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/public/sso/discover" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/public/user/api-key" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/api/v1/auth/keys

List API keys

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/auth/keys" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

POST/api/v1/auth/keys

Create API key

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auth/keys" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
key_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/auth/keys/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
key_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auth/keys/string/rotate" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/ensure" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/status" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/user/workspaces" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace/company-tags" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace/content-type-tags" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/docs

Backward-compatible docs URLs.

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/docs" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/openapi.json

Backward-compatible OpenAPI JSON URL.

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/openapi.json" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/redoc

Backward-compatible ReDoc URL.

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/redoc" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/swagger

Backward-compatible docs URLs.

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/swagger" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/alerts/autocomplete" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/audience-groups" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/audience-groups" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/audience-groups" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries/grades" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/audience-summaries/refresh" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/executives/voice" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/executives/voices" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/persona-summaries" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/avatar/generate" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/avatar/upload" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/build" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/bulk" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/bulk-update" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/categories" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/chat-onboarding" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/event-checks" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/generate-draft" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/grade-timeline" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/interact" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/interactions" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
interaction_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/interactions/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/preview-compiled-prompt" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights/async" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/reaction-insights/history" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/why-it-matters" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/why-it-matters/config" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/personas/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/analyze-voice" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/auto-test" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/discover-linkedin" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-check" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
check_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-checks/string/confirm" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
check_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-checks/string/tune" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-policy" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/drift-policy" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/feedback" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/generate" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/candidates" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
golden_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
golden_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/golden-responses/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/health" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/intelligence" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-external-source" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-file" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/link-linkedin" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/quick-link" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
refinement_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
refinement_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refinements/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-intelligence" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-policy" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/refresh-policy" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/relink-marketplace" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/self-heal-policy" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/self-heal-policy" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/unlink-file" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
persona_idREQUIRED path string
e.g. string
profile_idREQUIRED path —
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/personas/string/voice-profiles/profile_id/set-default" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/translate" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/validation/runs" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/validation/runs/latest" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace/health-check-families" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/workspace/health-check-families" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/workspace/persona-refresh-default" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/workspace/persona-refresh-default" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/apply-normalization" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/suggestions" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/auto-tag-aliases/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

POST/api/v1/auto-tags

Create auto tag

Create a new auto tag

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/generate-draft" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/test" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

DELETE/api/v1/auto-tags/{id}

Delete auto tag

Delete an auto tag

PARAMETERS
NAMEINTYPEDESCRIPTION
idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/auto-tags/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
doc_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/documents/string/retag" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/reports" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

POST/api/v1/reports

Create a custom report

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/reports/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/reports/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/reports/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/customize-style" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/generate" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/pdf" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/schedule" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
section_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PATCH "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
section_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
section_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/sections/string/generate" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
report_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/reports/string/send-email" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/bulk" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/generate-draft" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
template_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X PUT "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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

Delete a signal template

PARAMETERS
NAMEINTYPEDESCRIPTION
template_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/signal-templates/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
document_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/document/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
document_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X DELETE "https://gw.apidirectory.com/kumkuat/api/v1/signals/document/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
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
}'
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signals/generate" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/api/v1/signals/runs

Get all signal runs

Get all signal runs

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/runs" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
run_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/runs/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.

GET/api/v1/signals/templates

Get all signal templates

Get all signal templates

RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/templates" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
template_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/templates/string" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
template_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/signals/templates/string/signals" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
NAMEINTYPEDESCRIPTION
signal_idREQUIRED path string
e.g. string
RESPONSES
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl -X POST "https://gw.apidirectory.com/kumkuat/api/v1/signals/string/feedback" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/test" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
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
422Unprocessable Entity
[
  {
    "ctx": null,
    "input": null,
    "loc": [],
    "msg": "string",
    "type": "string",
    "url": null
  }
]
CODE
curl "https://gw.apidirectory.com/kumkuat/api/v1/test-theme-filters" \
  -H "X-API-Key: YOUR_KEY"
Try it — sign in first
Runs on a sandbox key: 2000 requests a month. Your real key is for production.