# everyais API and public data reference
## Answer first
everyais is an AI API gateway run by BROZ Corp. in Korea. One API key calls Claude, GPT, Gemini, DeepSeek and the other models in its public catalog through OpenAI- and Anthropic-compatible endpoints. Every model has a public price, and each key can have its own spend limit.
Updated: 2026-10-28T07:25:33.035Z
## Key facts
- APIs: OpenAI Chat Completions (`/v1/chat/completions`) and Responses (`/v1/responses`), Anthropic Messages (`/v1/messages`), image generation and editing (`/v1/images/generations`, `/v1/images/edits`), and video generation (`/v1/videos/generations`). Existing OpenAI and Anthropic SDKs work by changing the base URL and API key.
- Billing: usage is deducted from prepaid credits at the public USD reference prices, with no subscription fee. New accounts get free credit to try the API.
- Coding tools: Claude Code, Cursor and opencode connect through the same API. The docs include settings for each.
- Fallback: when a model runs on several providers, a failed request moves to another one. Requests can also name up to 5 backup models.
- Cost controls: each API key can restrict allowed models and set request limits and daily or monthly spend limits.
- Training: routes where the provider trains on prompts are off unless the account opts in.
- Data handling: requests are sent to the inference route of the selected model; retention and provider terms are listed in the privacy policy.
- Policies: https://platform.everyais.com/en/privacy, https://platform.everyais.com/en/terms, https://platform.everyais.com/en/refund
- Contact: portal@everyais.com
## Definitions
- Reference price: the public catalog price, including model discounts, used for comparison; account and organization rates can change the final billed price.
## Model catalog
Browse the callable models and their reference prices on the public pages below.
- English: https://platform.everyais.com/en/models
- 한국어: https://platform.everyais.com/models
- [GPT-6.1 Terra](https://platform.everyais.com/en/models/everyais/gpt-6-1-terra): `everyais/gpt-6-1-terra`; Standard (≤272K): Input $1 · Output $5 /1M · Long context (>272K, full request): Input $2 · Output $7.5 /1M
- [Gemini 4 argon](https://platform.everyais.com/en/models/everyais/gemini-4-argon): `everyais/gemini-4-argon`; text, image, video → text; 1.0M context; Input $1.4 · Output $7 /1M
- [Claude Haiku 5.5](https://platform.everyais.com/en/models/everyais/claude-haiku-5-5): `everyais/claude-haiku-5-5`; 1.0M context; Input $0.1 · Output $0.5 /1M
- [Gemini nano banana 2.1](https://platform.everyais.com/en/models/everyais/gemini-nano-banana-2-1): `everyais/gemini-nano-banana-2-1`; text, image, video → text, image; Input $1.5 · Output $30 /1M
- [GPT-6.1 Sol](https://platform.everyais.com/en/models/everyais/gpt-6-1-sol): `everyais/gpt-6-1-sol`; text → text; 1.1M context; Standard (≤272K): Input $2 · Output $10 /1M · Long context (>272K, full request): Input $4 · Output $15 /1M
- [Grok 4.7](https://platform.everyais.com/en/models/everyais/grok-4-7): `everyais/grok-4-7`; Input $2 · Output $6 /1M
- [Claude Sonnet 5.5](https://platform.everyais.com/en/models/everyais/claude-sonnet-5-5): `everyais/claude-sonnet-5-5`; text, image → text; 1.0M context; Input $2 · Output $10 /1M
- [GPT-6 Luna](https://platform.everyais.com/en/models/everyais/gpt-6-luna): `everyais/gpt-6-luna`; text, image → text; 1.1M context; Standard (≤272K): Input $0.1 · Output $0.5 /1M · Long context (>272K, full request): Input $0.2 · Output $0.75 /1M
- [GPT-6 Sol](https://platform.everyais.com/en/models/everyais/gpt-6-sol): `everyais/gpt-6-sol`; text, image → text; 1.1M context; Standard (≤272K): Input $2 · Output $10 /1M · Long context (>272K, full request): Input $4 · Output $15 /1M
- [Claude Opus 5.5](https://platform.everyais.com/en/models/everyais/claude-opus-5-5): `everyais/claude-opus-5-5`; text, image → text; 1.0M context; Input $4 · Output $20 /1M
- [GPT-6 Astra](https://platform.everyais.com/en/models/everyais/gpt-6-astra): `everyais/gpt-6-astra`; text, image → text; 1.1M context; Standard (≤272K): Input $10 · Output $50 /1M · Long context (>272K, full request): Input $20 · Output $75 /1M
- [GPT Image 2.5 Sunburst](https://platform.everyais.com/en/models/everyais/gpt-image-2-5-sunburst): `everyais/gpt-image-2-5-sunburst`; text, image → image; Input $5 · Output $30 /1M
- [GPT Image 2.5 Flare](https://platform.everyais.com/en/models/everyais/gpt-image-2-5-flare): `everyais/gpt-image-2-5-flare`; text, image → image; Input $5 · Output $30 /1M
- [Gemini 3.8 Flash](https://platform.everyais.com/en/models/everyais/gemini-3-8-flash): `everyais/gemini-3-8-flash`; text, image → text; 1.0M context; Input $0.525 · Output $2.625 /1M
- [Claude Fable 5.1](https://platform.everyais.com/en/models/everyais/claude-fable-5-1): `everyais/claude-fable-5-1`; text, image → text; 1.0M context; Input $10 · Output $50 /1M
- [Kimi K3](https://platform.everyais.com/en/models/everyais/kimi-k3): `everyais/kimi-k3`; text → text; 1.0M context; Input $3 · Output $15 /1M
- [Gemini Omni 1.1 Flash](https://platform.everyais.com/en/models/everyais/gemini-omni-1-1-flash): `everyais/gemini-omni-1-1-flash`; text → video; Input $1.5 · Output $17.5 /1M
- [Nemotron 3.5 Lightning](https://platform.everyais.com/en/models/everyais/nemotron-3-5-lightning): `everyais/nemotron-3-5-lightning`; text → text; 1.0M context; Input $0.06 · Output $0.24 /1M
- [Gemini Omni Flash Preview](https://platform.everyais.com/en/models/everyais/gemini-omni-flash-preview): `everyais/gemini-omni-flash-preview`; text → video; Input $1.5 · Output $17.5 /1M
- [Gemini 3.1 Flash Lite Image](https://platform.everyais.com/en/models/everyais/gemini-3-1-flash-lite-image): `everyais/gemini-3-1-flash-lite-image`; text → image; Input $0.25 · Output $30 /1M
- [Claude Fable 5](https://platform.everyais.com/en/models/everyais/claude-fable-5): `everyais/claude-fable-5`; text, image → text; 1.0M context; Input $10 · Output $50 /1M
- [MiniMax M3](https://platform.everyais.com/en/models/everyais/minimax-m3): `everyais/minimax-m3`; text → text; 1.0M context; Input $0.3 · Output $1.2 /1M
- [Gemini 3.1 Flash Image](https://platform.everyais.com/en/models/everyais/gemini-3-1-flash-image): `everyais/gemini-3-1-flash-image`; text → image; Input $0.5 · Output $60 /1M
- [DeepSeek V4 Pro 0813](https://platform.everyais.com/en/models/everyais/deepseek-v4-pro-0813): `everyais/deepseek-v4-pro-0813`; text → text; 979K context; Input $1.32 · Output $3.96 /1M
- [DeepSeek V4 Flash 0731](https://platform.everyais.com/en/models/everyais/deepseek-v4-flash-0731): `everyais/deepseek-v4-flash-0731`; text → text; 1.0M context; Input $0.14 · Output $0.28 /1M
- [Gemini 3.1 Pro Preview](https://platform.everyais.com/en/models/everyais/gemini-3-1-pro-preview): `everyais/gemini-3-1-pro-preview`; text, image → text; 1.0M context; Standard (≤200K): Input $2 · Output $12 /1M · Long context (>200K, full request): Input $4 · Output $18 /1M
- [GLM-5.3](https://platform.everyais.com/en/models/everyais/glm-5-3): `everyais/glm-5-3`; text → text; 1.0M context; Input $1.4 · Output $4.4 /1M
- [GLM-5.3 Flash](https://platform.everyais.com/en/models/everyais/glm-5-3-flash): `everyais/glm-5-3-flash`; text, image → text; 1.0M context; Input $0.15 · Output $0.5 /1M
- [Gemini 3 Pro Image](https://platform.everyais.com/en/models/everyais/gemini-3-pro-image): `everyais/gemini-3-pro-image`; text → image; Input $2 · Output $120 /1M
- [Gemini 2.5 Flash Image](https://platform.everyais.com/en/models/everyais/gemini-2-5-flash-image): `everyais/gemini-2-5-flash-image`; text → image; Input $0.3 · Output $30 /1M
- [Qwen 3.8 27B](https://platform.everyais.com/en/models/everyais/qwen-3.8-27b): `everyais/qwen-3.8-27b`; text, image, video → text; 262K context; Input $0.45 · Output $3 /1M
- [MiniMax M3.1 Flash](https://platform.everyais.com/en/models/everyais/minimax-m3-1-flash): `everyais/minimax-m3-1-flash`; 1.0M context; Input $0.15 · Output $0.6 /1M
- [DeepSeek V4.1 Flash 1017](https://platform.everyais.com/en/models/everyais/deepseek-v4-1-flash-1017): `everyais/deepseek-v4-1-flash-1017`; text, image → text; 1.0M context; Input $0.075 · Output $0.3 /1M
- [Muse Spark Open](https://platform.everyais.com/en/models/everyais/muse-spark-open): `everyais/muse-spark-open`; Input $1.25 · Output $4.25 /1M
- [Nemotron 3.5 Super VL](https://platform.everyais.com/en/models/everyais/nemotron-3-5-super-vl): `everyais/nemotron-3-5-super-vl`; Input $0.3 · Output $0.8999999999999999 /1M
- [FLUX 3 Image Klein](https://platform.everyais.com/en/models/everyais/flux-3-image-klein): `everyais/flux-3-image-klein`; $0.009 /image (768 $0.008 · 1K $0.009 · 1.5K $0.011 · 2K $0.014)
- [MiniMax H3 Turbo](https://platform.everyais.com/en/models/everyais/minimax-h3-turbo): `everyais/minimax-h3-turbo`; text, image → video; $0.03 /sec
## API docs
- Base URL: https://api.everyais.com/v1
- Authentication: `Authorization: Bearer everyais_...`
- OpenAPI: https://api.everyais.com/openapi.json
- English: https://platform.everyais.com/en/docs
- 한국어: https://platform.everyais.com/docs
# Getting started
## Quickstart
_Send your first request with curl, Python, or Node.js._
Source: https://platform.everyais.com/en/docs/quickstart
Updated: 2026-10-22T12:28:27.013Z
## 1. Get an API key
[Create a key](https://platform.everyais.com/dashboard/keys) and [add credits](https://platform.everyais.com/dashboard/pricing). The key is shown only once, so save it as an environment variable.
```bash
export EVERYAIS_API_KEY="everyais_your_api_key"
```
## 2. Choose a model
```bash
export EVERYAIS_MODEL="everyais/gemini-3-8-flash"
```
Copy other IDs from the [model directory](https://platform.everyais.com/en/models). `GET /v1/models` lists the models your key can call; see [model selection](https://platform.everyais.com/en/docs/model-selection).
A key with scopes needs `models:read` to list models and `chat` to generate text.
## 3. Send your first request
### curl
```bash
curl https://api.everyais.com/v1/chat/completions \
-H "Authorization: Bearer $EVERYAIS_API_KEY" \
-H "Content-Type: application/json" \
-d @- <",
"prompt": "a beautiful sunset over mountains",
"aspect_ratio": "16:9",
"resolution": "2K"
}
```
## Response
```json
{
"created": 1709884800,
"data": [
{ "url": "https://..." }
]
}
```
`url` expires after 10 minutes. Within 24 hours you can get a new link from [`GET /v1/outputs/{requestId}`](https://platform.everyais.com/en/docs/output-retrieval) using this response's `x-request-id` header, so save it.
## Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `model` | string | Yes | `IMAGE` model ID |
| `prompt` | string | Yes | 1–16,000 characters. Providers with lower limits may reject longer prompts |
| `n` | integer | No | **1–10**. Default 1 |
| `size` | string | No | `WxH` pixels (such as `256x256`, `512x512`, `1024x1024`, `1792x1024`, `1024x1792`, `1536x1024`, `1024x1536`), `auto`, or a `resolution` tier. Pixels win; a conflicting `aspect_ratio` or `resolution` returns **400** |
| `aspect_ratio` | string | No | `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2`, `2:3`, `4:5`, `5:4`, `1:2`, `2:1`, `7:5`, `5:7`, `1:4`, `4:1`, `1:8`, `8:1`, `9:21`, `21:9`, `auto` (provider default) |
| `resolution` | string | No | `512`, `768`, `1K` (≈1 MP), `1.5K`, `2K` (≈4 MP), `4K` (the model's largest tier) |
| `quality` | string | No | `standard`, `hd`, `low`, `medium`, `high`, `xhigh`, `max`, `auto`. `xhigh` and `max`: GPT Image 2.5 only. See `limits.supported_qualities` |
| `response_format` | string | No | `url` (default) or `b64_json` |
| `output_format` | string | No | `png`, `jpeg`, `webp`. Only models with `output_format` in `parameter_profile`; others return **400** |
| `output_compression` | integer | No | 0–100 for `jpeg` and `webp`. GPT Image only |
| `background` | string | No | `transparent`, `opaque`, `auto`. GPT Image only. `transparent` needs `png` or `webp` |
| `moderation` | string | No | `low` or `auto`. GPT Image only |
| `user` | string | No | End-user identifier |
| `prompt_upsampling` | boolean | No | FLUX 3 Image Klein only. Default `true`. Other models return **400** |
| `extra_body.gpunode` | object | No | Open-weight models: `seed` (same seed, same image; image i of n uses seed + i) and `num_inference_steps` |
| `extra_body.google` | object | No | **deprecated**. `aspect_ratio` and `image_size` are old names for `aspect_ratio` and `resolution`. Conflicting values return **400** |
## Aspect ratio and resolution
Each model's accepted values are in `parameter_profile.tasks["image-generation"].parameters`.
Under the default `auto` policy, an unsupported ratio moves to the nearest supported one and a resolution to the nearest supported tier at or below it (or the smallest), with a note in `x_everyais.parameter_warnings`. `strict` returns **400**.
- Gemini: a pixel `size` maps to the nearest ratio and tier (`3840x2160` → `16:9`, `4K`).
- GPT Image 2.5: tiers become `WxH` on a 16 px grid (`1360x768`, `2720x1536` and `3840x2160` at 16:9). Custom sizes work with sides in multiples of 16 up to 3840, ratio 1:3–3:1 and 655,360–8,294,400 pixels.
- Models with a size list, such as FLUX 3 Image Klein, pick by ratio, then resolution. Prices by size are in `pricing.variants[].meta.sizes`.
Check `limits.supported_sizes`. Token-priced image models cost more at larger sizes and higher quality.
## FLUX 3 Image Klein
`everyais/flux-3-image-klein` is a 5.6B open-weight model from Black Forest Labs.
| Option | Value |
|---|---|
| `n` | 1–4 |
| Size | One of the 60 sizes below, or `aspect_ratio` + `resolution`. Default `1024x1024` (`1:1`, `1K`). `size: "auto"` equals omitting it |
| `output_format` | `png`, `jpeg`, `webp`. Default `jpeg` |
| `extra_body.gpunode.seed` | 0–2147483647 |
| `extra_body.gpunode.num_inference_steps` | 1–16. Default 16 |
| `prompt_upsampling` | Default `true`: BFL's upsampler rewrites the prompt into a detailed caption, as in BFL's API. `false` uses your prompt as written. `extra_body.gpunode.prompt_upsampling` is the same switch; don't send conflicting values |
| `guidance_scale`, `negative_prompt` | Not supported (**400**) |
With upsampling on, each response item includes the rewritten caption as `revised_prompt`.
### Supported sizes
Resolutions are `768`, `1K`, `1.5K` and `2K`. 4K is not supported: `auto` lowers it to `2K` and `strict` returns **400**.
Under `auto`, an unlisted `size` becomes the largest listed size of the nearest ratio that fits inside it (`1024x768` → `880x672`, `1920x1080` → `1360x768`), with a warning.
Sizes are never enlarged, so anything below `768x768` returns **400**, as does any unlisted size under `strict`. The response's top-level `size` is the actual output size.
| Aspect ratio | `768` | `1K` | `1.5K` | `2K` |
|---|---|---|---|---|
| `21:9` | 1168x496 | 1568x672 | 2352x1008 | 3136x1344 |
| `2:1` | 1088x544 | 1456x720 | 2176x1088 | 2896x1456 |
| `16:9` | 1024x576 | 1360x768 | 2048x1152 | 2736x1536 |
| `3:2` | 944x624 | 1248x832 | 1888x1248 | 2512x1680 |
| `7:5` | 912x656 | 1216x864 | 1824x1296 | 2416x1728 |
| `4:3` | 880x672 | 1184x880 | 1776x1328 | 2368x1776 |
| `5:4` | 864x688 | 1152x912 | 1712x1376 | 2288x1824 |
| `1:1` | 768x768 | 1024x1024 | 1536x1536 | 2048x2048 |
| `4:5` | 688x864 | 912x1152 | 1376x1712 | 1824x2288 |
| `3:4` | 672x880 | 880x1184 | 1328x1776 | 1776x2368 |
| `5:7` | 656x912 | 864x1216 | 1296x1824 | 1728x2416 |
| `2:3` | 624x944 | 832x1248 | 1248x1888 | 1680x2512 |
| `9:16` | 576x1024 | 768x1360 | 1152x2048 | 1536x2736 |
| `1:2` | 544x1088 | 720x1456 | 1088x2176 | 1456x2896 |
| `9:21` | 496x1168 | 672x1568 | 1008x2352 | 1344x3136 |
### Pricing (per image, USD)
| Output tier | Price |
|---|---|
| `768` | $0.008 |
| `1K` | $0.009 |
| `1.5K` | $0.011 |
| `2K` | $0.014 |
Editing costs the same. Multiply by `n`; your account rates apply.
### Bounding-box layout
Append a JSON list to the prompt to place elements: `{"id","bbox":[top,left,bottom,right],"desc"}` on a 0–1000 grid. Refer to each element in the caption as ``.
```json
{
"model": "everyais/flux-3-image-klein",
"prompt": "A cozy cafe window scene: a sleeps on the left windowsill and a stands on the right. [{\"id\":\"cat\",\"bbox\":[500,50,900,450],\"desc\":\"orange tabby cat curled up\"},{\"id\":\"plant\",\"bbox\":[300,600,900,900],\"desc\":\"potted monstera\"}]",
"aspect_ratio": "3:2",
"resolution": "1K",
"extra_body": { "gpunode": { "seed": 42 } }
}
```
### Tips
- Describe the whole scene. There is no negative prompt, so say what should be there.
- Put text you want rendered in quotes.
- License: FLUX Kommunity License (non-commercial, plus commercial use of outputs for qualifying users). Outputs pass an NSFW filter.
## Model options
Pick a model at the top of this page, or read `capabilities`, `limits` and `parameter_constraints` from `GET /v1/models`.
[Parameter policy](https://platform.everyais.com/en/docs/model-selection#doc-parameter-policy) decides whether unsupported values are adjusted or rejected with **400**. Omitted size, ratio, resolution and quality use the model's `defaults`.
---
## POST /v1/images/edits
_Edit images with a prompt and optional mask. Send multipart or JSON (base64)._
Source: https://platform.everyais.com/en/docs/images-edits
Updated: 2026-10-22T12:28:53.754Z
Edits an image from a prompt, with an optional mask or reference images. Send multipart form data, or JSON with base64 images.
## Request (JSON)
```json
{
"model": "",
"prompt": "change the sky to sunset",
"image": "",
"n": 1
}
```
## Response
```json
{
"created": 1709884800,
"data": [
{ "url": "https://..." }
]
}
```
## Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `model` | string | Yes | ID of a model that supports editing |
| `prompt` | string | Yes | 1–16,000 characters. Providers with lower limits may reject longer prompts |
| `image` | string \| file \| array | Yes | Base64 in JSON, a file part in multipart. FLUX 3 Image Klein takes 1–10 reference images |
| `mask` | string \| file | No | Area to edit. Needs `capabilities.image_mask: true` |
| `n` | integer | No | **1–4**. Default 1 |
| `size` | string | No | `WxH` pixels (such as `256x256`, `512x512`, `1024x1024`, `1792x1024`, `1024x1792`, `1536x1024`, `1024x1536`), `auto`, or a resolution tier. Same rules as generation |
| `aspect_ratio` | string | No | `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2`, `2:3`, `4:5`, `5:4`, `1:2`, `2:1`, `7:5`, `5:7`, `1:4`, `4:1`, `1:8`, `8:1`, `9:21`, `21:9`, `auto` |
| `resolution` | string | No | `512`, `768`, `1K`, `1.5K`, `2K`, `4K` |
| `response_format` | string | No | `url` (default) or `b64_json` |
| `quality` / `output_format` / `output_compression` / `background` | | No | Same as [generation](https://platform.everyais.com/en/docs/images-generations), where supported |
| `prompt_upsampling` | boolean | No | FLUX 3 Image Klein only. `true` or `false` in multipart |
| `extra_body.gpunode` | object | No | Open-weight models: `seed`, `num_inference_steps`, `prompt_upsampling`. A JSON string in multipart |
| `extra_body.google` | object | No | **deprecated** aliases of `aspect_ratio` and `resolution`. A JSON string in multipart |
| `user` | string | No | End-user identifier |
Multipart bodies can be up to **4 MiB** and JSON up to **5 MiB**. Files are converted to base64 and must still fit in 5 MiB.
Larger requests return 413 `request_too_large` or `invalid_request_error`, so check the encoded size.
## Model options
Pick a model at the top of this page, or read `capabilities`, `limits` and `parameter_constraints` from `GET /v1/models`.
[Parameter policy](https://platform.everyais.com/en/docs/model-selection#doc-parameter-policy) decides whether unsupported values are adjusted or rejected with **400**.
Ratio and resolution rules match [image generation](https://platform.everyais.com/en/docs/images-generations#doc-aspect-ratio-and-resolution). With no size, ratio or resolution, the output usually keeps the input's aspect ratio.
## FLUX 3 Image Klein editing
For `everyais/flux-3-image-klein`:
- Send 1–10 references (JPEG, PNG, WebP). In multipart, repeat the `image` or `image[]` part. Compress them to stay within the body limits.
- Other options and prices match [generation](https://platform.everyais.com/en/docs/images-generations#doc-flux-3-image-klein).
- Without `size`, the output follows the first reference: its aspect ratio up to 4 MP and 4096 px per side, or under 1 MP on a 16 px grid when there are several references. Billing uses the nearest tier, and the response's `size` is the actual size.
- `aspect_ratio` alone gives that ratio at `1K`. `resolution` alone gives the size at that tier closest to the first reference's ratio. Explicit sizes must be one of the 60 listed sizes.
- Refer to references by position ("the first image", or `` in box edits). There is no mask.
- Describe the full target image. For box edits, append `{"id","from":"ref_image_0"|null,"src_bbox","tgt_bbox","desc"}` items (0–1000 grid; `tgt_bbox: null` removes). Boxes guide placement and scale and are not exact masks.
```json
{
"model": "everyais/flux-3-image-klein",
"prompt": "Move the from the first image to the right side of the table. [{\"id\":\"mug\",\"from\":\"ref_image_0\",\"src_bbox\":[600,100,800,250],\"tgt_bbox\":[600,650,800,800],\"desc\":\"white ceramic mug\"}]",
"image": [""],
"n": 1
}
```
---
## POST /v1/videos/generations
_Generate video, billed per second. Submit a job, then poll for the result._
Source: https://platform.everyais.com/en/docs/videos-generations
Updated: 2026-10-24T22:58:02.756Z
Generates a video from a prompt and optional first or last frame. Submit a job, then poll it with the returned `id`.
## Request
```json
{
"model": "everyais/minimax-h3-turbo",
"prompt": "a timelapse of a blooming flower",
"duration": 5
}
```
## Response (submitted)
```json
{
"id": "cm...",
"object": "video.generation.job",
"created": 1709884800,
"model": "everyais/minimax-h3-turbo",
"status": "processing"
}
```
## Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `model` | string | Yes | `VIDEO` model ID, such as `everyais/minimax-h3-turbo` |
| `prompt` | string | Yes | 1–4000 characters |
| `duration` | integer | No | Seconds, 1–120. Supported lengths and the default vary by model (Gemini Omni 1.1: 3–10) |
| `image` | string | No | First frame: JPEG, PNG or WebP as a data URL or base64 (Veo: JPEG or PNG). Models that list `image` in `parameter_constraints` only; others return **400** |
| `last_image` | string | No | Last frame, same format. With `image`, the video goes first to last; alone, it sets only the ending (Veo and Omni require `image`). Models that list `last_image` only |
| `pricingVariant` | string | No | A `pricing.variants[].key` from `GET /v1/models`, exactly as returned |
| `user` | string | No | End-user identifier |
| `extra_body.google` | object | No | `aspectRatio` (`16:9` or `9:16`; Veo, Omni), `seed`, `enhancePrompt`, and Veo-only `negativePrompt` (up to 4000 characters) |
| `extra_body.gpunode` | object | No | Open-weight models: `size` (`WxH` from the model's list; with an image it sets only the pixel count), `seed`, `num_inference_steps` |
The request body, including images, can be up to 5 MiB.
## Model options
Pick a model at the top of this page, or read `capabilities`, `limits` and `parameter_constraints` from `GET /v1/models`.
[Parameter policy](https://platform.everyais.com/en/docs/model-selection#doc-parameter-policy) decides whether unsupported values are adjusted or rejected with **400**.
Check `limits.supported_durations` and `pricing.variants`, or omit them for the defaults. Duration and resolution must be a supported combination.
---
## GET /v1/videos/generations/{id}
Returns the job's status and result. Use the `id` from the submit response.
While the job runs, responses include `Retry-After: 5`. Poll every 5 seconds.
| `status` | Meaning |
|--------|---------|
| `processing` | In progress |
| `completed` | Done. Includes `durationSeconds` and `data` |
| `failed` | Failed or timed out. See `error` |
| `cancelled` | Cancelled |
```json
{
"id": "cm...",
"object": "video.generation.job",
"created": 1709884800,
"model": "everyais/minimax-h3-turbo",
"status": "completed",
"durationSeconds": 5,
"data": [{ "url": "https://..." }]
}
```
If the result can't be confirmed yet, `processing` comes with `outcome_unknown: true`, and with `requires_manual_review: true` when it needs a manual check.
Unknown jobs, jobs older than 24 hours and other keys' jobs return 404 `job_not_found`.
`data[].url` is valid for 10 minutes, and every poll returns a fresh link. A completed video is also available from `GET /v1/outputs/{requestId}` with the job ID and the same API key (24 hours).
## Billing
Price = `durationSeconds` × per-second price. Models priced by resolution or audio list variants in `pricing.variants`; pass the `key` as `pricingVariant` (for example Veo's `720p-with-audio`).
Only models with variants accept it.
## MiniMax H3 Turbo
`everyais/minimax-h3-turbo` makes 24 fps video with stereo audio from text, a first frame, a last frame, or both.
| Option | Value |
|---|---|
| `duration` | 4–15 seconds, whole numbers. Default 5 |
| `image`, `last_image` | Both: a first-to-last transition. `last_image` alone: only the ending. Aspect ratio 0.4–2.5, short side at least 256 px |
| `extra_body.gpunode.size` | Without an image: one of the model's 13 sizes. Default `960x544`. With an image: pixel count only |
| `extra_body.gpunode.seed` | 0–2147483647 |
| `extra_body.gpunode.num_inference_steps` | 1–5. Default 5 |
| `reference_images`, `fps`, `num_frames`, `negative_prompt` | Not supported (**400**) |
With an image, the output keeps the image's aspect ratio (first frame, else last frame) at no more pixels than `size`, on a 32 px grid.
A 4:3 photo with `960x544` gives `800x608`; a 9:16 portrait with `1344x768` gives `768x1344`. The image is resized without cropping, so crop it first for a different ratio.
The per-second price is the same at every size.
```json
{
"model": "everyais/minimax-h3-turbo",
"prompt": "the camera slowly pushes in as she turns toward the window",
"image": "data:image/jpeg;base64,/9j/4AAQ...",
"duration": 5,
"extra_body": { "gpunode": { "size": "960x544", "seed": 42 } }
}
```
Add `"last_image"` for first and last frames.
---
## GET /v1/models
_List models or get one model. Model IDs with slashes are supported._
Source: https://platform.everyais.com/en/docs/models
Updated: 2026-10-22T12:29:04.237Z
Lists the models your API key can call, with capabilities, limits and prices.
## Request
```http
GET /v1/models
```
## Response
```json
{
"object": "list",
"data": [
{
"id": "everyais/claude-sonnet-5-5",
"aliases": ["claude-sonnet-5-5"],
"object": "model",
"owned_by": "everyais",
"created": 1782008704,
"registered_at": "2026-06-21",
"released_at": "2026-06-21",
"updated_at": "2026-08-27T04:30:00.000Z",
"name": "Claude Sonnet 5.5",
"description": "(model summary, currently Korean only)",
"series": "claude",
"input_modalities": ["text", "image"],
"output_modalities": ["text"],
"knowledge_cutoff": null,
"price_search_per_query": null,
"supply": "first_party",
"training_use": "never",
"category": "LLM",
"type": "chat",
"supported_endpoints": ["/v1/chat/completions", "/v1/messages", "/v1/responses"],
"capabilities": {
"streaming": true,
"tool_use": true,
"vision": true,
"json_mode": true,
"structured_outputs": true,
"sampling": false,
"parallel_tool_calls": true,
"reasoning": true,
"web_search": false
},
"limits": { "context_window": 1000000, "reasoning_efforts": ["low", "medium", "high", "xhigh", "max", "none"] },
"parameter_profile": { "version": 1, "scope": "all-active-routes", "tasks": { "chat": { "status": "supported", "required": ["model", "messages"], "defaults": {}, "parameters": { "reasoning_effort": { "status": "supported", "type": "string", "allowed_values": ["low", "medium", "high", "xhigh", "max", "none"] } }, "combinations": [] } } },
"parameter_constraints": [{ "provider": "aws-bedrock", "parameters": { "chat": { "reasoning_effort": { "supported": true, "type": "string", "allowed_values": ["low", "medium", "high", "xhigh", "max", "none"] } } } }],
"pricing": {
"unit": "per_1m_tokens",
"is_free": false,
"input_per_1m": 3.159,
"output_per_1m": 15.795,
"list": { "input_per_1m": 3.51, "output_per_1m": 17.55 },
"discount_percent": 10
},
"discount_percent": 10,
"available": true
}
]
}
```
## Model fields
| Field | Description |
|-------|-------------|
| `id`, `aliases` | Model ID and other accepted names |
| `name`, `description`, `series` | Display name, description, model family |
| `category` | `LLM`, `IMAGE` or `VIDEO` |
| `supported_endpoints` | API endpoints the model works with |
| `available` | Whether the model can be called now |
| `input_modalities`, `output_modalities` | Input and output types |
| `created`, `registered_at`, `released_at` | OpenAI-compatible Unix timestamp, date added, release date |
| `knowledge_cutoff` | Knowledge cutoff, or null if unknown |
| `capabilities` | `true`: supported. `false`: not supported. Missing: not confirmed |
| `limits` | Supported values and limits |
| `parameter_profile.tasks` | Required inputs, defaults, supported values and combinations per task |
| `parameter_constraints` | Supported options per provider |
| `capabilities` key | Meaning |
|---|---|
| `streaming`, `tool_use`, `vision`, `json_mode` | Streaming, tools, image input, JSON output |
| `structured_outputs` | Strict JSON schemas |
| `json_mode_with_tools`, `web_search_with_tools` | JSON output with tools, web search with function tools |
| `web_search` | Web search in Chat |
| `sampling`, `parallel_tool_calls`, `image_mask` | Sampling options, parallel tool calls, edit masks |
`limits` includes `context_window`, `reasoning_efforts`, `supported_sizes`, `supported_qualities`, `supported_durations` and `max_images`; an empty array means nothing is supported.
Model limits can be lower than the gateway's general limits. Unsupported values return **400** `unsupported_parameter` with the field in `error.param`. See [parameter policy](https://platform.everyais.com/en/docs/model-selection#doc-parameter-policy).
## Pricing and access
| Field | Description |
|-------|-------------|
| `pricing` | Listed prices. Charges use your account rates; see the cost header and usage |
| `pricing.is_free === true` | Input, output and cache tokens are free. Web search is billed separately |
| `pricing.list`, `pricing.discount_percent` | Prices before discounts, and the smallest discount across all rates, including list-price discounts and all-customer promotions |
| `discount_percent` | The everyais promotion part, already in `pricing`. The largest value if it varies by provider |
| `pricing.variants` | Variant `key` and `price` |
| `pricing.long_context` | Prices when input exceeds `threshold_tokens`. `base_input_per_1m` and `base_output_per_1m` are aliases |
| `price_search_per_query` | Price per web search unit. See `capabilities.web_search` |
| `pricing.conditions` | Consent the listed price needs: `community_supply` or `training_use` |
| `supply`, `training_use` | Whether the model uses community supply or provider training. Off unless you opt in; organization keys follow organization settings |
Models that need a consent you haven't given are not listed.
## GET /v1/models/{model}
Gets one model by its full ID, slashes included.
```http
GET /v1/models/everyais/gemini-3-8-flash
```
Unknown or inaccessible models return 404 `model_not_found`.
---
## GET /v1/outputs/{requestId}
_Get a stored request and new output URLs, valid for 10 minutes._
Source: https://platform.everyais.com/en/docs/output-retrieval
Updated: 2026-10-24T22:58:15.337Z
Gets a completed request and new download links for its files. Requests are kept for **24 hours**.
Use an API key or a signed-in session; you can retrieve only your own requests.
## Find the requestId
Use the `x-request-id` header from an image generation or edit response (`x-everyais-operation-id` has the same value).
It isn't in the response body, so save the header. An `x-request-id` you send yourself is only for tracing and doesn't become the ID.
```http
HTTP/1.1 200 OK
content-type: application/json
x-request-id: V1StGXR8_Z5jdHi6B-myT
x-everyais-operation-id: V1StGXR8_Z5jdHi6B-myT
```
## Retrieve the result
```http
GET /v1/outputs/V1StGXR8_Z5jdHi6B-myT
```
`urls` are presigned links valid for 10 minutes.
```json
{
"id": "V1StGXR8_Z5jdHi6B-myT",
"model": "everyais/gemini-3-1-flash-image",
"endpoint": "/v1/images/generations",
"status": "COMPLETED",
"inputTokens": 0,
"outputTokens": 0,
"imageCount": 1,
"totalCost": 0.04,
"latencyMs": 1200,
"urls": ["https://..."],
"createdAt": "2026-07-30T01:23:45.000Z"
}
```
Requests outside your key's scopes return 403 `insufficient_scope`. For a completed video, use the job ID (the submit response's `id`) as `requestId`. Poll progress with `GET /v1/videos/generations/{id}`.
---
# Guides
## Streaming
_Show the answer as it is generated instead of waiting for the full response._
Source: https://platform.everyais.com/en/docs/streaming
Updated: 2026-10-22T12:30:26.550Z
Streaming sends the response as it is generated, so you can show the first tokens right away. Use it where a person is waiting, such as a chat screen.
## Try it
Use the environment variables from the [quickstart](https://platform.everyais.com/en/docs/quickstart). Add `stream: true`, plus `stream_options.include_usage: true` for token usage at the end.
### Python
```python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["EVERYAIS_API_KEY"],
base_url="https://api.everyais.com/v1",
timeout=240.0,
)
stream = client.chat.completions.create(
model=os.environ["EVERYAIS_MODEL"],
messages=[{"role": "user", "content": "Hello!"}],
stream=True,
stream_options={"include_usage": True},
)
try:
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="", flush=True)
if chunk.usage:
print("\nUsage:", chunk.usage.total_tokens)
finally:
stream.close()
```
### Node.js
```javascript
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.everyais.com/v1",
apiKey: process.env.EVERYAIS_API_KEY,
timeout: 240_000,
});
const stream = await client.chat.completions.create({
model: process.env.EVERYAIS_MODEL,
messages: [{ role: "user", content: "Hello!" }],
stream: true,
stream_options: { include_usage: true },
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
if (chunk.usage) console.log("\nUsage:", chunk.usage.total_tokens);
}
```
## Handle these cases
- The final usage chunk has an empty `choices` array. Check it before you read `choices[0]`.
- A Chat stream ends with `data: [DONE]`. If the connection closes without it, the response was cut off.
- An error can arrive as an event after the stream started with HTTP 200. Treat error events and SDK exceptions as failures.
- To stop generation, close the stream (`stream.close()` in Python, an `AbortController` in Node.js). The provider may not stop right away, and those tokens can still be billed.
## Parsing SSE yourself
- Events are `data: {...}` lines, and a blank line ends each event. Buffer network chunks until you reach one.
- Lines starting with a colon, such as `: ok`, are keep-alive comments. Skip them.
- Decode UTF-8 with a streaming decoder, since characters can be split across chunks.
## Messages and Responses streams
These use different events from Chat. Use each SDK's stream helpers instead of Chat `[DONE]` handling.
| API | Main events |
|-----|-------------|
| `/v1/messages` | `message_start`, `content_block_delta`, `message_delta`, `message_stop` |
| `/v1/responses` | `response.output_text.delta`, `response.completed` |
With `background: true`, Responses returns a job instead of a stream. See [async jobs](https://platform.everyais.com/en/docs/async-jobs).
## Retrying a stream
`Idempotency-Key` can't replay a finished stream; resending the same key returns 409. Before you retry, check the output you already received and your usage.
With web search, citations and the search count arrive at the end. See [web search](https://platform.everyais.com/en/docs/web-search#doc-streaming).
---
## Prompt caching
_Cache the prefix you send on every request to cut input cost. Check the math first._
Source: https://platform.everyais.com/en/docs/prompt-caching
Updated: 2026-10-24T22:58:32.113Z
Caching helps when every request starts with the same long prefix, such as a system prompt or tool definitions. Cached prefixes are read at about 10% of the input price.
If the prefix changes on every request, leave caching off: cache writes cost more than normal input.
## Turn it on
```json
{
"model": "everyais/claude-sonnet-5-5",
"messages": [
{"role": "system", "content": "(the long instructions you send every time)"},
{"role": "user", "content": "First question"}
],
"everyais": { "cache": "on", "cache_ttl": "5m" }
}
```
With the OpenAI SDK, pass it in `extra_body`.
```python
response = client.chat.completions.create(
model="everyais/claude-sonnet-5-5",
messages=messages,
extra_body={"everyais": {"cache": "on", "cache_ttl": "5m"}},
)
print(response.usage.prompt_tokens_details.cached_tokens)
```
| Option | Behavior |
|------|------|
| `cache: "on"` | Adds up to 4 cache points: tool definitions, system prompt, then the last user turn |
| `cache: "off"` | Removes automatic cache points and any `cache_control` you sent |
| `cache_ttl` | `"5m"` (default) or `"1h"`. One-hour writes cost more |
Gemini models cache automatically, with no setup and no write charge. On `/v1/messages`, `cache_control` on blocks is passed through unchanged.
## Cost example
A cache read costs about 10% of the input price. A write costs about 1.25 times input for 5 minutes, or 2 times for 1 hour.
For a 10,000-token prefix sent five times within five minutes, in input-token equivalents:
| Case | Input-token equivalent |
|------|-----------------|
| Caching off | 10,000 × 5 = 50,000 |
| Caching on, same prefix | 12,500 (first-request write) + 1,000 × 4 = 16,500 |
| Caching on, prefix changes every time | 12,500 × 5 = 62,500 |
Messages after the prefix are billed at the normal input price.
## Check for cache hits
`usage.prompt_tokens_details.cached_tokens` counts tokens read from cache, and `cache_creation_tokens` counts tokens written, when the provider reports them. Both are billed at the provider's cache prices.
`prompt_tokens` (`input_tokens` on Responses) is the total input including both. On `/v1/messages`, `input_tokens` excludes cache reads and writes, as in Anthropic's API.
If `cached_tokens` stays at 0:
- The prefix must match exactly. Keep changing values, such as dates or request IDs, out of the start of the system prompt.
- The cache expires after `cache_ttl`.
- Prefixes shorter than the model's minimum are not cached.
---
## Async jobs
_Submit long-running work, then fetch the result with the job ID._
Source: https://platform.everyais.com/en/docs/async-jobs
Updated: 2026-10-24T22:58:39.456Z
For work that takes too long for one HTTP request, submit a job, get an ID back, and poll until it finishes.
| Task | Submit | Get the result |
|-----------|------|-----------|
| Long text generation | `POST /v1/responses` with `background: true` | `GET /v1/responses/{id}` |
| Video generation | `POST /v1/videos/generations` (always async) | `GET /v1/videos/generations/{id}` |
The IDs are not interchangeable. A video job ID returns 404 from a Responses endpoint. A completed video is also available from `GET /v1/outputs/{requestId}` with the job ID.
## Responses background jobs
With `background: true`, the API returns `status: "queued"` right away. Create the client as in the [quickstart](https://platform.everyais.com/en/docs/quickstart).
```python
import time
job = client.responses.create(
model="everyais/gemini-3-8-flash",
input="A long research task...",
background=True,
)
while job.status in ("queued", "in_progress"):
time.sleep(5)
job = client.responses.retrieve(job.id)
print(job.status)
print(job.output_text)
```
The job ends as `completed`, `incomplete`, `failed` or `cancelled`. Cancel a `queued` or `in_progress` job with `POST /v1/responses/{id}/cancel` (`client.responses.cancel(id)`); its credit is refunded.
## Video jobs
Poll with the `id` from the submit response. Responses include `Retry-After: 5` while the job runs.
```python
import os
import time
import requests
BASE_URL = "https://api.everyais.com/v1"
headers = {"Authorization": f"Bearer {os.environ['EVERYAIS_API_KEY']}"}
job = requests.post(f"{BASE_URL}/videos/generations", headers=headers, json={
"model": "everyais/minimax-h3-turbo",
"prompt": "a timelapse of a blooming flower",
}).json()
while job["status"] == "processing":
time.sleep(5)
job = requests.get(f"{BASE_URL}/videos/generations/{job['id']}", headers=headers).json()
print(job["status"], job.get("data"))
```
The job ends as `completed`, `failed` or `cancelled`, and its record is kept for 24 hours. See [video generation](https://platform.everyais.com/en/docs/videos-generations#doc-get-v1videosgenerationsid) for status details.
## Avoid duplicate charges
- Don't resubmit a video because you missed the submit response. Video submission doesn't support `Idempotency-Key`, so a resubmit creates and bills a second job.
- Polling too often uses your key's rate limit. Follow `Retry-After`.
---
## Web search
_Let the model search the web for current information. Covers search billing and citations._
Source: https://platform.everyais.com/en/docs/web-search
Updated: 2026-10-25T17:27:49.330Z
Add `{"type": "web_search"}` to `tools`. The model searches when it needs to and answers from the results. The search runs server-side, so your client runs no tool.
```json
{
"model": "everyais/gemini-3-8-flash",
"messages": [{"role": "user", "content": "What's the weather in Seoul today?"}],
"tools": [{"type": "web_search"}]
}
```
## Supported models
Use models with `capabilities.web_search: true` in `GET /v1/models`. Support varies even within the Gemini family.
```bash
curl https://api.everyais.com/v1/models \
-H "Authorization: Bearer $EVERYAIS_API_KEY" \
| jq '.data[] | select(.capabilities.web_search) | .id'
```
Other models return 400 `web_search_unsupported_model` and are not charged.
- Only one `web_search` entry is allowed. Two or more return 400.
- You can combine it with function tools. `tool_choice: "none"` turns off both. With only the search tool, `required` or a named function returns 400.
- Only `/v1/chat/completions` supports web search.
## Billing
Search is billed on top of tokens: `billed_queries` × the model's search price.
| Model family | How searches are counted |
|-----------|-----------|
| Gemini | Each query run. Two searches count as 2; no search counts as 0 |
- Search is billed even when tokens are free. `pricing.is_free` covers only input, output and cache tokens.
- A stream you cut off still pays for the searches Google ran. Google reports the count at the end of the answer, so the gateway waits up to 10 seconds after the cut for it; if it doesn't arrive, the 10 searches reserved with the request are charged.
- Pages fetched by Google search are not billed as input tokens.
- `x_everyais.web_search.billed_queries` has the billed count. The `x-everyais-cost-usd` header on non-streaming responses includes search.
- You can't cap the number of searches. Use the key's monthly or daily spend limit instead.
## Citations
```json
{
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Seoul is clear today with a high of 28 degrees.",
"annotations": [
{
"type": "url_citation",
"url_citation": {
"url": "https://...",
"title": "Seoul weather",
"start_index": 0,
"end_index": 47
}
}
]
},
"finish_reason": "stop"
}],
"x_everyais": {
"web_search": {
"queries": ["Seoul weather today"],
"search_entry_point_html": "...
",
"billed_queries": 1
}
}
}
```
| Field | Description |
|------|------|
| `message.annotations[]` | OpenAI `url_citation` citations. `start_index` and `end_index` are character positions in `content` |
| `x_everyais.web_search.queries` | Queries the model ran |
| `x_everyais.web_search.billed_queries` | Searches billed |
| `x_everyais.web_search.search_entry_point_html` | Google search suggestions as HTML |
If you show search results, Google requires you to display `search_entry_point_html`. Render this third-party HTML isolated, for example in `