# Kimi K3 API

> Frontier coding, native vision, and 1M-token agents from Moonshot AI.

- **Provider**: Moonshot AI
- **Model id**: `kimi-k3`
- **Modality**: text
- **Price**: 281–1405 credits

## Overview

Kimi K3 is called in ONE step: POST your request and the answer comes back in the same response, in `text`. There is no task to poll.

## Authentication

All requests require a Bearer Token in the request header:

```
Authorization: Bearer YOUR_API_KEY
```

## Create Task

`POST https://you.bot/api/v1/generate`

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| modelId | string | Yes | Model id: `kimi-k3` |
| input | object | Yes | Input parameters object (see below) |
| callbackUrl | string | No | https URL we POST the finished task to. Signed with `X-Webhook-Signature` once you create a webhook signing key in Dashboard → Settings |

### input object parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| prompt | string | Yes | Text value (example: Refactor this into an iterative version and explain the trade-off: a recursive directory walk that returns every file path under a root, currently blowing the… — full value in the request example) |
| memory | boolean | No | Automatically append previous messages to maintain multi-turn context. May increase token usage. (true/false) (default: false) |
| reasoning_effort | string | No | Control reasoning depth: Low for faster responses, High for deeper analysis (options: Low \| Medium \| High \| XHigh) (default: High) |
| thinking | boolean | No | Include the model's thinking process in the response (true/false) (default: false) |
| max_tokens | number | No | Maximum response length. Kimi K3 supports a 1M-token context; leave empty for the default. (range 1-128000) |
| system | string | No | System instruction for the model. Defaults to "You are Kimi K3, developed by Moonshot AI." when omitted. |
| messages | array | No | A conversation instead of a single `prompt`: up to 20 objects of { "role", "content" }, where role is user, assistant or system. Send `prompt` or `messages`, not both. Do not flatten a conversation into one prompt with "User:" / "Assistant:" labels — the model reads that as a single message, and a model using web search then searches for the whole block instead of your question. |

### Request example

```json
{
  "modelId": "kimi-k3",
  "input": {
    "prompt": "Refactor this into an iterative version and explain the trade-off: a recursive directory walk that returns every file path under a root, currently blowing the stack on deep trees. Give the rewritten function, then three sentences on what you gained, what you gave up, and the input size where the difference starts to matter.",
    "memory": false,
    "reasoning_effort": "High",
    "thinking": false,
    "max_tokens": 1
  }
}
```

### Response example

```json
{
  "taskId": "281e5b0…f39b9",
  "creditsCharged": 24
}
```

## Query Task

`GET https://you.bot/api/v1/task/{taskId}?model=kimi-k3`

When `state` is `success`, the output is in `resultUrls`: `{ "text": "…" }`. (Text models return inline in the create response.)

## Error Codes

| Code | Description |
|------|-------------|
| 200 | Request successful |
| 400 | Invalid request parameters |
| 401 | Authentication failed — check API Key |
| 402 | Insufficient account balance |
| 403 | IP not allowed for this key, or the key is restricted to other models |
| 404 | Task not found, or it has expired |
| 409 | Duplicate request — an identical submit arrived moments ago. Nothing was charged; retry is safe |
| 413 | Payload too large — see the character and file-size limits for this model |
| 429 | Rate limit exceeded — retry after the Retry-After header |
| 500 | Internal server error |
| 504 | Upstream timed out — nothing was delivered; retry is safe |
| 400 · capability_not_supported | A capability was requested (e.g. `web_search: true`) that this model does not offer — refused, nothing charged |
| 400 · unknown_image_field | Images were sent under a key this model has no parameter for (input_urls, image_urls, imageUrl …) — refused rather than answered without them |
| 400 · image_input_not_supported | This model accepts text only — a request with an image is refused, not answered without it |
