GPT Image 2.5 is live — OpenAI's newest image model, targeted edits that leave the rest of the frame alone
rreAPI Docs

gpt-6-luna

Call GPT-6 Luna, OpenAI's most efficient GPT-6 model, through reAPI's Chat Completions endpoint with text or image input, reasoning effort control, structured outputs and function calling, billed per token.

OpenAI's GPT-6 Luna — its most efficient GPT-6 model, built for focused, high-volume tasks — exposed through reAPI as an OpenAI-compatible Chat Completions endpoint. A 1,050,000-token context window (up to 922,000 input tokens), 128,000 max output tokens, reasoning_effort from none to max with medium as the default, text and image input, structured outputs and streaming. The wire model id is gpt-6-luna. Current rates live on the model page.

Quick example

curl https://reapi.ai/api/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6-luna",
    "messages": [
      { "role": "user", "content": "Classify this support ticket as billing, bug, feature request or account access: I was charged twice this month." }
    ],
    "reasoning_effort": "low",
    "max_completion_tokens": 1000,
    "stream": true
  }'
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://reapi.ai/api/v1",
)

stream = client.chat.completions.create(
    model="gpt-6-luna",
    messages=[{"role": "user", "content": "Classify this support ticket as billing, bug, feature request or account access: I was charged twice this month."}],
    reasoning_effort="low",
    max_completion_tokens=1000,
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content if chunk.choices else None
    if delta:
        print(delta, end="")
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "YOUR_API_KEY",
  baseURL: "https://reapi.ai/api/v1",
});

const stream = await client.chat.completions.create({
  model: "gpt-6-luna",
  messages: [{ role: "user", content: "Classify this support ticket as billing, bug, feature request or account access: I was charged twice this month." }],
  reasoning_effort: "low",
  max_completion_tokens: 1000,
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func main() {
    body, _ := json.Marshal(map[string]any{
        "model": "gpt-6-luna",
        "messages": []map[string]string{
            {"role": "user", "content": "Classify this support ticket as billing, bug, feature request or account access: I was charged twice this month."},
        },
        "reasoning_effort":      "low",
        "max_completion_tokens": 1000,
    })
    req, _ := http.NewRequest("POST",
        "https://reapi.ai/api/v1/chat/completions", bytes.NewReader(body))
    req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
    req.Header.Set("Content-Type", "application/json")

    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    out, _ := io.ReadAll(resp.Body)
    fmt.Println(string(out))
}

Authentication

Use your reAPI API key — the same key that calls the image, video and audio endpoints — as a bearer token:

Authorization: Bearer YOUR_API_KEY

Create one under API keys in your reAPI dashboard. Chat requests are billed from the same credit balance as every other model on the platform.


Endpoint

POST /api/v1/chat/completions

Base URL https://reapi.ai/api/v1. The wire format is OpenAI-compatible, so the same SDKs work once you swap the base URL, the key and the model string.

OpenAI's model page lists both v1/responses and v1/chat/completions for GPT-6 Luna and recommends the Responses API for built-in tools and function calling. reAPI serves this model through Chat Completions; see Tool calling for how function calling behaves here.

Parameter support on this model

Measured on this endpoint on 2026-09-24. Fields not listed below behave as documented by OpenAI.

FieldResult
reasoning_effortAccepts none, low, medium, high, xhigh, max; medium when omitted
max_completion_tokensApplied, up to 128,000
max_tokensAccepted. max_completion_tokens is the field OpenAI documents — prefer it in new code
tools, tool_choiceReturns tool_calls, at medium effort as well as none — see Tool calling
response_formatApplied, including json_schema with strict
streamServer-sent events ending with data: [DONE]; the last data chunk carries usage
nOnly 1; a larger value returns 400
temperature, top_p, frequency_penalty, presence_penaltyNot supported by this model — sending any of them returns 400. Leave them out of the request
seed, stop, logprobs, verbosityAccepted (200) but have no effect — for example stop does not cut the answer and no logprobs come back. Do not rely on them

The playground on the model page offers every field above that works; stream starts off and the output cap starts blank, matching OpenAI's defaults. Any other Chat Completions field can be added as JSON under "other fields".

Request body

model — string, required

Must be gpt-6-luna exactly. It is a different model from gpt-5.6-luna and from gpt-6-sol.

messages — array, required

Conversation history, each entry an object with role and content. Roles are system, user, assistant and tool. Text and image parts are supported — see Image input.

max_completion_tokens — integer

Upper bound on generated tokens for this response, reasoning tokens included. The documented maximum output is 128,000 tokens.

Reasoning tokens bill as output tokens and occupy the context window. A budget sized only for the visible answer can truncate on a harder prompt.

reasoning_effort — string, default medium

How much the model thinks before answering. See Reasoning effort.

stream — boolean, default false

When true, tokens arrive as server-sent events terminated by data: [DONE].

response_format — object, optional

Constrains the answer's shape, including a JSON schema with strict: true for machine-consumed output. Structured outputs are supported on GPT-6 Luna.


Reasoning effort

OpenAI's model page: "reasoning.effort supports none, low, medium (default), high, xhigh, and max." On Chat Completions the same values go in the top-level reasoning_effort field. All six are accepted by this endpoint.

EffortWhen to use it
noneNo reasoning pass. The fastest choice for simple function-calling routes and plain classification
lowExtraction and tagging where a short reasoning pass is enough
mediumThe default — a balance of accuracy and cost
highHarder judgement calls where accuracy matters more than cost
xhighHard cases where a longer reasoning pass pays for itself
maxThe most reasoning the model offers — rarely worth it for high-volume work

For high-volume work, measure accuracy on a labelled sample at each setting and pick the lowest one that holds your target — reasoning tokens bill as output.


Tool calling

OpenAI's model page: "Use the Responses API for built-in tools and function calling. Chat Completions supports function calling only with reasoning_effort set to none."

That restriction describes OpenAI's own Chat Completions endpoint. On this endpoint, requests with tools returned tool_calls at medium effort as well as at none (measured 2026-09-24), so choose the effort the task needs. Your application executes the returned tool_calls and sends each result back as a tool message in the next request. This pattern suits routing: give GPT-6 Luna a short list of functions and let it pick one — none keeps each decision fastest.


Image input

ModalitySupported
Text in✅
Image in✅
Text out✅
Audio in / out❌
Video in❌

Images go in as image_url content parts with a public HTTP(S) URL. Output is text only.


Pricing dimensions

Billing is per token, from your reAPI credit balance:

  • Input, output, cache read and cache write each have their own rate.
  • Reasoning tokens bill as output. Effort is the first lever on cost.
  • Prompts over 272K input tokens re-price the whole request at the long-context rates — OpenAI's own rule for this model, mirrored here.

Every standard-context rate sits below OpenAI's published per-token rate. Current numbers are on the model page — that table is the canonical source, not this page. The platform constants are 1 credit = $0.001 and $1 = 1,000 credits.


Response shape

Non-streaming (stream: false)

{
  "id": "chatcmpl-...",
  "object": "chat.completion",
  "created": 1790230000,
  "model": "gpt-6-luna",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "..." },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 45,
    "completion_tokens": 30,
    "total_tokens": 75,
    "prompt_tokens_details": { "cached_tokens": 0 },
    "completion_tokens_details": { "reasoning_tokens": 9 }
  }
}

usage.completion_tokens includes reasoning tokens, and usage.prompt_tokens_details.cached_tokens is the part of the prompt billed at the cache-read rate.

Streaming (stream: true)

Server-sent events, each data: line carrying a chat.completion.chunk with the incremental text in choices[0].delta.content. The last chunk before data: [DONE] carries usage; a chunk with an empty choices array is normal and should be skipped.


Errors

Failures use the standard envelope: error.code, error.message and error.request_id. See the errors catalog for the full code list. Common cases:

TriggerWhat to do
Missing or invalid API keyCreate a key under API keys in the reAPI dashboard
Unknown model valueSend gpt-6-luna exactly
n greater than 1Send one request per completion
temperature, top_p, frequency_penalty or presence_penalty in the requestRemove the field — this model returns 400 for it
max_completion_tokens above the ceilingLower it; the documented maximum output is 128,000
Truncated answer on a hard promptThe reasoning pass consumed the allowance — raise max_completion_tokens
Insufficient balanceTop up your reAPI credits

Table of Contents