GET / returns the catalog in the OpenAI API format, plus each model’s type and its prices in credits. The list follows the Moon AI catalog: read it instead of hard-coding IDs in your code.
GET https://api.realmoon.ai/v1/models
GET https://api.realmoon.ai/v1/models?type=image- Authentication: an
sk-moon-…key with theinferencescope (see Authentication). - Response: a
listobject whosedataholds the models, chat models first, sorted by ID, then media models. - Billing: none.
ParameterLink to the Parameter section
| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | no | Keeps only one type: chat, image, video, speech, transcription, embedding or ocr. An unknown type returns an empty list. |
ExampleLink to the Example section
curl https://api.realmoon.ai/v1/models \
-H "Authorization: Bearer $MOONAI_API_KEY"
curl "https://api.realmoon.ai/v1/models?type=image" \
-H "Authorization: Bearer $MOONAI_API_KEY"import os
from openai import OpenAI
client = OpenAI(base_url="https://api.realmoon.ai/v1", api_key=os.environ["MOONAI_API_KEY"])
for model in client.models.list():
info = model.model_dump()
print(info["id"], info.get("type"), info.get("pricing"))
images = client.models.list(extra_query={"type": "image"})
print([m.id for m in images])import OpenAI from 'openai';
const client = new OpenAI({ baseURL: 'https://api.realmoon.ai/v1', apiKey: process.env.MOONAI_API_KEY });
const all = await client.models.list();
for (const model of all.data) console.log(model.id, model.type, model.pricing);
const images = await client.models.list({ query: { type: 'image' } });
console.log(images.data.map((m) => m.id));ResponseLink to the Response section
{
"object": "list",
"data": [
{
"id": "anthropic/claude-haiku-4.5",
"object": "model",
"created": 1777593600,
"name": "Claude Haiku 4.5",
"owned_by": "moon-ai",
"pricing": {
"prompt_credits_per_1m": 7000,
"completion_credits_per_1m": 35000,
"unit": "credits",
"per": "1M_tokens"
},
"context_length": 200000,
"type": "chat",
"endpoints": ["/v1/chat/completions"],
"types": ["chat"]
},
{
"id": "google/gemini-3.1-flash-image",
"object": "model",
"created": 1793577600,
"name": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"owned_by": "moon-ai",
"type": "image",
"endpoints": ["/v1/images/generations", "/v1/images/edits"],
"hosting": "provider",
"pricing": {
"unit": "image",
"credits_per_unit": 469,
"max_credits_per_unit": 1155,
"billing": "real_cost",
"variants": [
{ "name": "1K", "credits_per_unit": 469, "max_credits_per_unit": 525 },
{ "name": "2K", "credits_per_unit": 707, "max_credits_per_unit": 770 },
{ "name": "4K", "credits_per_unit": 1057, "max_credits_per_unit": 1155 }
]
},
"aspect_ratios": ["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3", "21:9"],
"image_sizes": ["1K", "2K", "4K"],
"max_input_images": 8,
"output_format": "png",
"types": ["image"]
}
]
}The list objectLink to the The list object section
| Field | Type | Description |
|---|---|---|
object | string | Always list. |
data | array | The models. No pagination: the list is complete. |
Fields common to all modelsLink to the Fields common to all models section
| Field | Type | Description |
|---|---|---|
id | string | The ID to pass in model. |
object | string | Always model. |
created | integer | Timestamp in Unix seconds: the model’s date or, if there is none, a fixed date. |
name | string | Human-readable name. |
owned_by | string | Always moon-ai: the model is served by Moon AI. |
type | string | The model’s main type. |
types | array | All of its types: the same ID can serve several endpoints. |
endpoints | array | The endpoints to call for this model. |
pricing | object | Prices in credits, see below. |
media_pricing | object | For a model that serves several types: the price of each type other than the first, keyed by type. |
Chat models (chat)Link to the Chat models (chat) section
| Field | Type | Description |
|---|---|---|
pricing.prompt_credits_per_1m | integer | Credits per million input tokens. |
pricing.completion_credits_per_1m | integer | Credits per million output tokens, reasoning included. |
pricing.unit, pricing.per | string | credits and 1M_tokens. |
context_length | integer | Context window in tokens, when it is known. |
Models hosted by Moon AI have the same input and output price. A model that reads images, audio or files charges for them at its own rates; the exact cost of each request is available from /.
Media modelsLink to the Media models section
Every media model has:
| Field | Type | Description |
|---|---|---|
hosting | string | fr if the model runs on our servers in France, provider if its provider serves it. |
pricing.unit | string | The billed unit, see the next table. |
pricing.credits_per_unit | number | The price of one unit. For a video, the model’s lowest price per second. |
pricing.billing | string | real_cost (actual cost reported by the provider), per_character (per character) or flat (fixed price per unit). |
Fields specific to each type:
| Type | pricing.unit | Specific fields |
|---|---|---|
image | image | pricing.max_credits_per_unit (the most one image can cost, which is what the request holds), pricing.variants (price per size 1K, 2K, 4K), pricing.credits_per_input_image, aspect_ratios, image_sizes, max_input_images (0: no editing), output_format (png or svg) |
video | second | pricing.variants per resolution (with credits_per_unit_without_audio, credits_per_unit_from_image), pricing.credits_per_input_image, durations, resolutions, aspect_ratios, audio, first_frame, last_frame |
speech | 1M_characters | max_characters, response_formats, default_voice |
transcription | minute | max_file_mb. The price per minute can be a decimal. |
embedding | 1M_tokens | pricing.prompt_credits_per_1m (same value) and pricing.completion_credits_per_1m (0), dimensions, custom_dimensions, context_length |
ocr | page | max_pages, max_file_mb |
Each type is covered in detail in Images, Videos, Audio, Embeddings and OCR.
Which models are servedLink to the Which models are served section
- The models that are active and open to everyone in Moon AI: the major models on the market (OpenAI, Anthropic, Google, Mistral, Meta, DeepSeek, Qwen…) and Moon AI’s in-house models, such as Moon 6, when they are public.
- Never a model with restricted access, an agent, or a workspace’s private model.
- Never a model whose price is not known, or a model that runs paid web searches on every request: their cost cannot be capped in advance.
- In a managed organization, the models its rules refuse are removed from the list.
An ID that is not in the list returns 404 . Retrieving a single model (GET /) is not supported (404 ): filter the list instead.
PricesLink to the Prices section
Prices are in credits. They follow the model’s price at its provider and can change with it; read the list again rather than hard-coding them. The “Models” tab of the portal shows the same prices in euros, with search and sorting by price or by context size (open). How credits convert to euros is explained in Costs and wallet.
ErrorsLink to the Errors section
| HTTP | code | Meaning |
|---|---|---|
| 503 | org_policy_unavailable | Your organization’s rules are temporarily unreadable, so the list cannot be filtered. Try again in a moment. |
Key and rate errors, common to the whole API, are in Errors.
See alsoLink to the See also section
- Chat completions: call a
chatmodel. - Costs and wallet: how prices turn into an invoice.