GET /v1/models
Read the models your key can use, what each one does and its list price, at run time from GET /v1/models, instead of hard-coding them.
GET /v1/models lists every model id your key can use. On top of the usual OpenAI-compatible fields, each row says what the model does (capability), whether your key can use it (entitlement) and, for ability models, its list price. Read it at run time rather than copying ids or prices into your code: it is the same feed the Flux site reads.
| Endpoint | GET https://api.fluxrouter.ai/v1/models (also /models) |
| Auth | Authorization: Bearer sk-flux... (or x-api-key). Any valid key, free or paid. |
| Filtered | Only the models this key's allowlist can use |
curl https://api.fluxrouter.ai/v1/models \
-H "Authorization: Bearer $FLUX_API_KEY"
Row fields
{
"object": "list",
"data": [
{
"id": "flux-image",
"object": "model",
"capability": "image",
"display_name": "Flux Image (default)",
"list_price_microcents": 40000,
"price_unit": "image",
"min_billed_units": 1,
"entitlement": "paid_cleared"
}
]
}
The numbers in the example are made up; read your own. Rows also carry the standard fields (created, owned_by) that OpenAI-compatible clients expect.
| Field | On | Meaning |
|---|---|---|
id | every row | The model id to send as model. |
capability | every row | What the model does: chat, image (image generation), audio (speech to text) or speech (text to speech). Skip rows with a value you do not recognise. |
entitlement | every row | Whether this key can use paid abilities: paid_cleared (yes), premium_locked (not until the plan is paid and cleared) or open (no plan check applies). |
display_name | ability rows | A readable name. |
list_price_microcents | ability rows | The list price of one unit, in millionths of a US dollar. null means the price is not published; show it as unavailable, never guess. |
price_unit | ability rows | What one unit is: image, audio_second or character. |
min_billed_units | ability rows | The fewest units one call is billed for. For speech to text this is a minimum clip length. |
Chat rows carry capability and entitlement only. Chat is priced per token by tier; see Pricing and How billing works.
Page reading, search, apps and the second-opinion ceiling have no row yet. Their prices are on Pricing.
Convert a price
list_price_microcents is in millionths of a dollar, so divide by 1,000,000 for US dollars. Multiply by min_billed_units to get the smallest possible charge.
import requests
rows = requests.get(
"https://api.fluxrouter.ai/v1/models",
headers={"Authorization": f"Bearer {FLUX_API_KEY}"},
).json()["data"]
for row in rows:
if row.get("capability") != "image":
continue
micro = row.get("list_price_microcents")
price = "unavailable" if micro is None else f"${micro / 1_000_000:.4f} per {row['price_unit']}"
print(row["id"], row.get("display_name"), price)
const resp = await fetch('https://api.fluxrouter.ai/v1/models', {
headers: { Authorization: `Bearer ${process.env.FLUX_API_KEY}` },
});
const { data } = await resp.json();
for (const row of data.filter((r: any) => r.capability === 'audio')) {
const micro = row.list_price_microcents;
const perSecond = micro == null ? null : micro / 1_000_000;
const minimum = perSecond == null ? null : perSecond * row.min_billed_units;
console.log(row.id, perSecond, 'per audio second, at least', minimum);
}
List price and what you pay
list_price_microcents is the plan price. On pay as you go, a markup is added once on top; the rate is on Pricing. What each call actually cost is on your usage page. Some responses also say so directly: the x-flux-cost-usd header on transcription and speech, cost_usd in a search response, and usage.cost in an image edit response.
The current prices, read from this same feed:
- Images: from $0.01 per image. The price depends on the image model and quality you pick.
These are plan prices. Pay as you go adds 12%, applied once.
- Speak: from $26 per 1M characters.
- Transcribe: $0.10 per minute heard.
Each file is billed for at least 10 seconds.
These are plan prices. Pay as you go adds 12%, applied once.