👋 Getting Started
Welcome!⚡ Features
Chat features and toolsCustomizing personalityGroupchatsKindroid SocialSelfies, video selfies, & avatarsSharing Kindroids & Referrals🧠 Memory
Memory📷 Selfie Guide
Atelier Selfies GuideTableau Selfies GuidePalette (V6) Selfies GuideOdyssey (V5) Selfies Guide📖 LLM Guides
General LLM TipsEmber LLM GuideReverie (V8.5) LLM GuideLucid/Lyric (V8) LLM GuidePrism (V7.5) LLM GuideEquinox (V7) LLM Guide⚖️ Legal
Kindroid - Legal📝 Changelog
Update logLast updated June 9, 2026
Api
Documentation
Developers
Reference for the endpoints we openly support for kn_ API-key integrations.
https://api.kindroid.ai/v1
All endpoints require authentication. Send your API key in the Authorization
header as a Bearer token:
Authorization: Bearer kn_xxxxxxxxxxxxxxxxxxxxxxxx
Your API key (starts with kn_...) and your AI ID can be found in Profile Settings.
WARNING: You should only play around with the API if you're a developer interested in tinkering with integrating Kindroid. DO NOT share your key with anyone who asks, and unless it comes from admins do not trust other sources. Someone with your API key could do anything to your account, including deleting it.
ai_id refers to a single Kindroid; group_id refers to a group chat. Endpoints that operate on a conversation take one or the other.text/plain. Endpoints that return structured data (e.g. message history) return JSON, as documented per endpoint."stream": true. When set, the response text is streamed as it is generated instead of returned in one blocking response. Omit it (or set false) to receive the full reply once generation completes.400 Bad Request, 401 Unauthorized, 403 Forbidden, 429 Too Many Requests (rate limit), 500 Internal Server Error. The response body contains a short plain-text description.Sends a message to an AI and receives a response. This request may take a while, so you should await its response.
/send-message{
"ai_id": "string",
"message": "string",
"stream": false
}| Field | Type | Required | Description |
|---|---|---|---|
ai_id | string | yes | The AI to message. |
message | string | yes | The user's message. |
stream | boolean | no | Stream the reply as it is generated. |
200 OK with the AI's response as text. With "stream": true, the text is streamed as it is generated.400, 401, 403, 429, 500Ends the current chat and resets the AI's short-term memory. A greeting is mandatory and becomes the first message in the new conversation.
/chat-break{
"ai_id": "string",
"greeting": "string",
"wipe_cascaded": false
}| Field | Type | Required | Description |
|---|---|---|---|
ai_id | string | yes | The AI to reset. |
greeting | string | yes | First message of the new conversation. |
| wipe_cascaded | boolean | no | Also wipe the AI's cascaded long-term memory built up from previous conversations. Defaults to false (only short-term memory is reset). |
200 OK400, 401, 403, 429, 500Retrieves chat history for a Kindroid or a group chat, oldest first, with cursor pagination.
/get-chat-messages| Parameter | Type | Required | Description |
|---|---|---|---|
ai_id | string | one of | The AI whose history to fetch. Mutually exclusive with group_id. |
group_id | string | one of | The group chat whose history to fetch. Mutually exclusive with ai_id. |
limit | number | no | Page size, 1–100. Defaults to 50. |
start_after_timestamp | number | no | Cursor; pass the previous page's lastTimestamp to continue. |
Exactly one of ai_id or group_id must be supplied.
200 OK with JSON:{
"messages": [
{
"id": "string",
"sender": "string",
"sender_type": "string",
"display_name": "string",
"timestamp": 0,
"message": "string",
"image_urls": ["string"],
"image_description": "string",
"video_description": "string",
"internet_response": "string",
"link_url": "string",
"link_description": "string"
}
],
"pagination": {
"hasMore": true,
"lastTimestamp": 0,
"limit": 50
}
}Fields that are not present on a given message are omitted. To page, repeat the request with start_after_timestamp set to pagination.lastTimestamp until hasMore is false. Note that long-polling this endpoint may hit 429 and we recommend calling this when new messages have arrived. There is a 24 hour rate limit of 600 reqs/24 hrs due to the potential for this endpoint to be costly for us to serve.
400, 401, 403, 429, 500Removes the most recent messages from a conversation (an "undo"). Useful for discarding the last exchange before continuing.
/rewind-messages{
"ai_id": "string",
"count": 1
}| Field | Type | Required | Description |
|---|---|---|---|
ai_id | string | one of | The AI to rewind. Mutually exclusive with group_id. |
group_id | string | one of | The group chat to rewind. Mutually exclusive with ai_id. |
count | number | yes | Number of most-recent messages to remove (≥ 1). |
Exactly one of ai_id or group_id must be supplied. For single-AI rewinds ai_id), the chat must end on an AI message both before and after the rewind, so count must be even — it removes whole user/AI exchanges. Odd counts return 400. Group rewinds group_id) have no such restriction and accept any count.
200 OK400, 401, 403, 404 (AI/group not found), 429, 500Updates the persona and configuration of an existing AI. Only include the fields you want to change; omitted fields are left unchanged.
/update-infoai_id required; all others optional){
"ai_id": "string",
"ai_name": "string",
"ai_gender": "string",
"ai_backstory": "string",
"ai_memory": "string",
"ai_directive": "string",
"ai_example_message": "string",
"ai_additional_context": "string",
"current_scene": "string",
"user_name": "string",
"user_gender": "string"
}| Field | Type | Description |
|---|---|---|
ai_id | string | The AI to update. Required. |
ai_name | string | Display name of the AI. |
ai_gender | string | Gender of the AI. |
ai_backstory | string | The AI's backstory. |
ai_memory | string | The AI's key (long-term) memory. |
ai_directive | string | Directive / response guidelines for the AI. |
ai_example_message | string | Example message defining the AI's voice. |
ai_additional_context | string | Additional context (availability depends on plan). |
current_scene | string | The current scene / situation. |
user_name | string | Your display name as seen by the AI. |
user_gender | string | Your gender as seen by the AI. |
The underlying endpoint accepts additional fields used by the Kindroid apps (model selection, voice/call settings, beta flags, etc.). Those are considered internal and are not part of the supported external API surface.
200 OK400, 401, 403, 429, 500Group chats let multiple Kindroids participate in a single conversation. Groupchats can make use of rewind, get messages endpoints above.
Note: Group chats require an active subscription. Requests from
non-subscribers return 403 Forbidden.Create and configure groups in the Kindroid app; these endpoints operate on an
existing group_id. A typical turn-based loop looks like:
POST /groupchats-user-message — post the user's message.POST /groupchats-get-turn — ask who should speak next.ai_id is returned, POST /groupchats-ai-response for that AI, then go back to step 2. If the user's turn is returned (empty body), stop and wait for the next user message.Adds a user message to a group chat.
/groupchats-user-message{
"group_id": "string",
"message": "string"
}| Field | Type | Required | Description |
|---|---|---|---|
group_id | string | yes | The group chat. |
message | string | one of | The user's text message. Provide either message or audio_url. |
audio_url | string | one of | URL of a voice message. Provide either message or audio_url. |
Exactly one of message or audio_url must be supplied.
200 OK400, 401, 403, 429, 500Determines which participant should speak next in the group.
/groupchats-get-turn{
"group_id": "string",
"allow_user": true
}| Field | Type | Required | Description |
|---|---|---|---|
group_id | string | yes | The group chat. |
allow_user | boolean | yes | Whether the user is allowed to take the next turn (i.e. AI generation may end). |
200 OK with the ai_id of the AI whose turn it is. An empty body indicates it is the user's turn (end of the AI generation cycle).400, 401, 403, 429, 500Generates a response from a specific AI in the group. Pair with Group Get Turn to drive the conversation.
/groupchats-ai-response{
"group_id": "string",
"ai_id": "string",
"stream": false
}| Field | Type | Required | Description |
|---|---|---|---|
group_id | string | yes | The group chat. |
ai_id | string | yes | The AI that should respond. |
stream | boolean | no | Stream the reply as it is generated. |
200 OK with the AI's response as text. With "stream": true, the text is streamed as it is generated.400, 401, 403, 429, 500Ends the current group conversation and resets short-term memory. A greeting is mandatory and becomes the first message in the new conversation.
/groupchats-chat-break{
"group_id": "string",
"greeting": "string",
"wipe_cascaded": false
}| Field | Type | Required | Description |
|---|---|---|---|
group_id | string | yes | The group chat to reset. |
greeting | string | yes | First message of the new conversation. |
| wipe_cascaded | boolean | no | Also wipe the group's cascaded long-term memory built up from previous conversations. Defaults to false (only short-term memory is reset). |
200 OK400, 401, 403, 429, 500Updates the configuration of an existing group chat. Only include the fields you want to change; omitted fields are left unchanged.
/groupchats-update{
"group_id": "string",
"ai_list": ["string"],
"group_name": "string",
"group_context": "string",
"group_directive": "string",
"current_scene": "string"
}| Field | Type | Required | Description |
|---|---|---|---|
group_id | string | yes | The group chat to update. Required. |
| ai_list | string[] | no | The AI IDs in the group (the roster). At least one. |
| group_name | string | no | Display name of the group. |
| group_context | string | no | Shared context / situation for the group. |
| group_directive | string | no | Directive / response guidelines for the group. |
| current_scene | string | no | The current scene / situation. |
200 OK400, 401, 403, 429, 500Core endpoint for sending context and getting a response. Used in the Kindroid Discord bot.
/discord-botIn addition to the Authorization header, you should send a header
identifying the hashed, unique string of the Discord user who triggered the
call. This helps with rate limiting and preventing bot abuse. Any hashing
scheme works, but we recommend:
const lastUsername = conversation[conversation.length - 1].username;
// Encode username to handle non-ASCII characters, then hash to alphanumeric
const hashedUsername = Buffer.from(encodeURIComponent(lastUsername))
.toString("base64")
.replace(/[^a-zA-Z0-9]/g, "")
.slice(0, 32);Place it in the header as:
X-Kindroid-Requester: <hashedUsername>{
"share_code": "string",
"enable_filter": true,
"conversation": [
{ "username": "string", "text": "string", "timestamp": "string" }
]
}| Field | Type | Required | Description |
|---|---|---|---|
share_code | string | yes | 5-letter share code (see the Discord repo). Must be shared by the UID who is authenticating. |
enable_filter | boolean | yes | Content filter. Recommended for public servers. |
conversation | array | yes | Array of { username, text, timestamp }. timestamp is msg.createdAt.toISOString(). |
200 OK400, 401, 403, 429, 500TABLE OF CONTENTS
Base URL
Authentication
Conventions
Endpoints
Send Message
Chat Break
Get Chat Messages
Rewind Messages
Update AI Info
Group Chats
Group User Message
Group Get Turn
Group AI Response
Group Chat Break
Update Group Info
Discord Bot Endpoint
Settings
Status
Updates
Terms
Logout
Billing
Kindroid Standard Subscription
Inactive
Ultra Subscription Add-on
Inactive
Ultra subscription unlocks advanced features for our most engaged users. Keep chatting and engaging with your Kindroids to qualify.
MAX Subscription Add-on
Inactive
Requires Ultra Subscription
Add-on Feature Matrix
Add-ons are fully optional, monthly-only subscriptions that give your Kindroid much more memory, context, selfies and others. Add-ons require all previous tiers of add-ons to function; for example, to get the features of MAX tier, it requires MAX tier plus Ultra, on top of the standard subscription.
Feature
Standard
Ultra
MAX
Total conversation context (approx chars)
500K
1.3M
2.8M
Short term context (approx chars)
18K
50K
125K
Cascaded memory context (approx chars)
480K
1.2M
2.7M
Additional AI backstory expansion (chars)
N/A
2,500
5,000
User backstory limit (chars)
500
1,000
2,000
Group context limit (chars)
1,000
1,500
3,000
Recalled long term memory & journals limit
3
5
9
Complimentary monthly audio credits
1M
2.5M
6M
Selfie regen per 30 minutes
1
2
2
Priority selfies with dedicated compute
-
-
Yes*
* MAX users receive priority selfie processing on dedicated compute with no/very low queue on latest version of selfies until they reach 10 selfies in a short timeframe. After this limit, standard queue delay applies and selfies are processed through normal servers without priority status.
While recalled and considered long term memory may be different, LTM consolidation spans all messages & is infinite for all users.
Note: All chat context/cascaded and selfies improvements of add-ons will only be guaranteed applicable to the latest subscriber LLM and selfies. When new versions come out, our guarantee is that it will switch to new versions. Finally, "additional context" in the matrix is an additional field, identical to Backstory, that is unlocked on the higher tiers which you can use to extend backstory accordingly.