By default the router tries our listings in routing order and fails over before the first byte — never mid-answer. Uptime is our own measurement; an hour stays grey until it has a sample. Open the row for the provider's specs and policies.
curl https://api.routerplus.com/v1/images/generations \
-H "Authorization: Bearer $TM_API_KEY" -H "content-type: application/json" \
-d '{"model":"gemini-3.1-flash-image","prompt":"a red dot","aspect_ratio":"1:1"}'# OpenAI SDK — only the base URL changes import base64, os from openai import OpenAI client = OpenAI(base_url="https://api.routerplus.com/v1", api_key=os.environ["TM_API_KEY"]) r = client.images.generate(model="gemini-3.1-flash-image", prompt="a red dot", extra_body={"aspect_ratio": "1:1"}) png = base64.b64decode(r.data[0].b64_json)
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://api.routerplus.com/v1", apiKey: process.env.TM_API_KEY }); const r = await client.images.generate({ model: "gemini-3.1-flash-image", prompt: "a red dot", aspect_ratio: "1:1" }); const png = Buffer.from(r.data[0].b64_json, "base64");
| output image | $60 / M image tokens |
| input | $0.5 / M input tokens |
Every billed response carries usage.cost — recompute your bill from the wire.
Values outside these are refused with a 400 that names the field.
An hour counts at the best provider's uptime: a request goes to another provider when one fails. Grey hours have no sample yet.