Kindroid

👋 Getting Started

Welcome!

🧠 Memory

Memory

🔧 Troubleshooting

Common issuesFAQs

🛠️ Developers

Official Discord bot integrationAPI Documentation

⚖️ Legal

Kindroid - Legal

📝 Changelog

Update log

Last updated June 9, 2026

Api

Documentation

Developers

Reference for the endpoints we openly support for kn_ API-key integrations.

Base URL

https://api.kindroid.ai/v1

Authentication

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.

Conventions

  • Identifiers. 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.
  • Responses. Unless otherwise noted, responses are returned as text/plain. Endpoints that return structured data (e.g. message history) return JSON, as documented per endpoint.
  • Streaming. Endpoints that generate an AI reply accept an optional "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.
  • Errors. Failures return one of: 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.

Endpoints

Send Message

Sends a message to an AI and receives a response. This request may take a while, so you should await its response.

  • URL: /send-message
  • Method: POST
  • Request Body:
    {
      "ai_id": "string",
      "message": "string",
      "stream": false
    }
    FieldTypeRequiredDescription
    ai_idstringyesThe AI to message.
    messagestringyesThe user's message.
    streambooleannoStream the reply as it is generated.
  • Response:
    • Success: 200 OK with the AI's response as text. With "stream": true, the text is streamed as it is generated.
    • Error: 400, 401, 403, 429, 500

Chat Break

Ends the current chat and resets the AI's short-term memory. A greeting is mandatory and becomes the first message in the new conversation.

  • URL: /chat-break
  • Method: POST
  • Request Body:
    {
      "ai_id": "string",
      "greeting": "string",
      "wipe_cascaded": false
    }
    FieldTypeRequiredDescription
    ai_idstringyesThe AI to reset.
    greetingstringyesFirst message of the new conversation.
    wipe_cascadedbooleannoAlso wipe the AI's cascaded long-term memory built up from previous conversations. Defaults to false (only short-term memory is reset).
  • Response:
    • Success: 200 OK
    • Error: 400, 401, 403, 429, 500

Get Chat Messages

Retrieves chat history for a Kindroid or a group chat, oldest first, with cursor pagination.

  • URL: /get-chat-messages
  • Method: GET
  • Query Parameters:
    ParameterTypeRequiredDescription
    ai_idstringone ofThe AI whose history to fetch. Mutually exclusive with group_id.
    group_idstringone ofThe group chat whose history to fetch. Mutually exclusive with ai_id.
    limitnumbernoPage size, 1–100. Defaults to 50.
    start_after_timestampnumbernoCursor; pass the previous page's lastTimestamp to continue.

    Exactly one of ai_id or group_id must be supplied.

  • Response:
    • Success: 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.

    • Error: 400, 401, 403, 429, 500

Rewind Messages

Removes the most recent messages from a conversation (an "undo"). Useful for discarding the last exchange before continuing.

  • URL: /rewind-messages
  • Method: POST
  • Request Body:
    {
      "ai_id": "string",
      "count": 1
    }
    FieldTypeRequiredDescription
    ai_idstringone ofThe AI to rewind. Mutually exclusive with group_id.
    group_idstringone ofThe group chat to rewind. Mutually exclusive with ai_id.
    countnumberyesNumber 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.

  • Response:
    • Success: 200 OK
    • Error: 400, 401, 403, 404 (AI/group not found), 429, 500

Update AI Info

Updates the persona and configuration of an existing AI. Only include the fields you want to change; omitted fields are left unchanged.

  • URL: /update-info
  • Method: POST
  • Request Body: (ai_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"
    }
    FieldTypeDescription
    ai_idstringThe AI to update. Required.
    ai_namestringDisplay name of the AI.
    ai_genderstringGender of the AI.
    ai_backstorystringThe AI's backstory.
    ai_memorystringThe AI's key (long-term) memory.
    ai_directivestringDirective / response guidelines for the AI.
    ai_example_messagestringExample message defining the AI's voice.
    ai_additional_contextstringAdditional context (availability depends on plan).
    current_scenestringThe current scene / situation.
    user_namestringYour display name as seen by the AI.
    user_genderstringYour 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.
  • Response:
    • Success: 200 OK
    • Error: 400, 401, 403, 429, 500

Group Chats

Group 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:

  1. POST /groupchats-user-message — post the user's message.
  2. POST /groupchats-get-turn — ask who should speak next.
  3. If an 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.

Group User Message

Adds a user message to a group chat.

  • URL: /groupchats-user-message
  • Method: POST
  • Request Body:
    {
      "group_id": "string",
      "message": "string"
    }
    FieldTypeRequiredDescription
    group_idstringyesThe group chat.
    messagestringone ofThe user's text message. Provide either message or audio_url.
    audio_urlstringone ofURL of a voice message. Provide either message or audio_url.

    Exactly one of message or audio_url must be supplied.

  • Response:
    • Success: 200 OK
    • Error: 400, 401, 403, 429, 500

Group Get Turn

Determines which participant should speak next in the group.

  • URL: /groupchats-get-turn
  • Method: POST
  • Request Body:
    {
      "group_id": "string",
      "allow_user": true
    }
    FieldTypeRequiredDescription
    group_idstringyesThe group chat.
    allow_userbooleanyesWhether the user is allowed to take the next turn (i.e. AI generation may end).
  • Response:
    • Success: 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).
    • Error: 400, 401, 403, 429, 500

Group AI Response

Generates a response from a specific AI in the group. Pair with Group Get Turn to drive the conversation.

  • URL: /groupchats-ai-response
  • Method: POST
  • Request Body:
    {
      "group_id": "string",
      "ai_id": "string",
      "stream": false
    }
    FieldTypeRequiredDescription
    group_idstringyesThe group chat.
    ai_idstringyesThe AI that should respond.
    streambooleannoStream the reply as it is generated.
  • Response:
    • Success: 200 OK with the AI's response as text. With "stream": true, the text is streamed as it is generated.
    • Error: 400, 401, 403, 429, 500

Group Chat Break

Ends the current group conversation and resets short-term memory. A greeting is mandatory and becomes the first message in the new conversation.

  • URL: /groupchats-chat-break
  • Method: POST
  • Request Body:
    {
      "group_id": "string",
      "greeting": "string",
      "wipe_cascaded": false
    }
    FieldTypeRequiredDescription
    group_idstringyesThe group chat to reset.
    greetingstringyesFirst message of the new conversation.
    wipe_cascadedbooleannoAlso wipe the group's cascaded long-term memory built up from previous conversations. Defaults to false (only short-term memory is reset).
  • Response:
    • Success: 200 OK
    • Error: 400, 401, 403, 429, 500

Update Group Info

Updates the configuration of an existing group chat. Only include the fields you want to change; omitted fields are left unchanged.

  • URL: /groupchats-update
  • Method: POST
  • Request Body:
    {
      "group_id": "string",
      "ai_list": ["string"],
      "group_name": "string",
      "group_context": "string",
      "group_directive": "string",
      "current_scene": "string"
    }
    FieldTypeRequiredDescription
    group_idstringyesThe group chat to update. Required.
    ai_liststring[]noThe AI IDs in the group (the roster). At least one.
    group_namestringnoDisplay name of the group.
    group_contextstringnoShared context / situation for the group.
    group_directivestringnoDirective / response guidelines for the group.
    current_scenestringnoThe current scene / situation.
  • Response:
    • Success: 200 OK
    • Error: 400, 401, 403, 429, 500

Discord Bot Endpoint

Core endpoint for sending context and getting a response. Used in the Kindroid Discord bot.

  • URL: /discord-bot
  • Method: POST
  • Request Headers:

    In 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>
  • Request Body:
    {
      "share_code": "string",
      "enable_filter": true,
      "conversation": [
        { "username": "string", "text": "string", "timestamp": "string" }
      ]
    }
    FieldTypeRequiredDescription
    share_codestringyes5-letter share code (see the Discord repo). Must be shared by the UID who is authenticating.
    enable_filterbooleanyesContent filter. Recommended for public servers.
    conversationarrayyesArray of { username, text, timestamp }. timestamp is msg.createdAt.toISOString().
  • Response:
    • Success: 200 OK
    • Error: 400, 401, 403, 429, 500

TABLE 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.