# GPT-5.6 Luna API

> GPT-5.6 — frontier reasoning and generation through one API.

- **Provider**: OpenAI
- **Model id**: `gpt-5-6-luna`
- **Modality**: text
- **Price**: 10.19–61.17 credits

## Overview

GPT-5.6 Luna 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: `gpt-5-6-luna` |
| 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: Here is a support ticket: "charged twice for the same order, second charge shows as pending, cannot find it in my history". Draft the reply. Open by stating… — 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: Medium) |
| stream | boolean | No | Send true to receive the reply as an event stream (Content-Type: text/event-stream). Omit it and you get a single JSON response — streaming is opt-in on this endpoint. (true/false) (example: true) |
| system | string | No | System instruction for the model. Defaults to "You are GPT-5.6 Luna, developed by OpenAI." 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": "gpt-5-6-luna",
  "input": {
    "prompt": "Here is a support ticket: \"charged twice for the same order, second charge shows as pending, cannot find it in my history\". Draft the reply. Open by stating what happened in one sentence, say exactly what we will do and by when, and close with the one thing we need from them. Warm but brief, no apologies stacked on apologies, under 100 words.",
    "memory": false,
    "reasoning_effort": "Medium",
    "stream": true
  }
}
```

### Response example

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

## Query Task

`GET https://you.bot/api/v1/task/{taskId}?model=gpt-5-6-luna`

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 |
