Text, images, video, speech, transcription and music with vocals - behind one base_url and one Bearer key. The interface is OpenAI-compatible: swap the base_url and the client you already wrote keeps working.
Chat, tools, streaming. The model is picked by one line in the model field.
/chat/completionsGenerate and edit pictures. Its own wallet, the very same key.
/images/generationsClips from a prompt. Async start: you get an id and collect the result.
/media/generateText to speech. ElevenLabs and Minimax voice engines under the same key.
/media/generateSpeech to text with timings - ready for subtitles and markup.
/audio/transcriptionsTracks from a description - songs with vocals, not just instrumentals.
/media/generateThe interface is OpenAI-compatible. Change base_url and the key - chat.completions, streaming and tool calls keep working as before. No forks, no wrappers.
Charges happen on the fact, off the balance, after the model replies. Every generation type has its own wallet: they never mix. Nothing produced - nothing charged.
If a provider goes down, the router swaps the route for the same model itself. You do not touch the client, you write no manual retries, you pay nothing extra.
Same SDK, same response parsing, same request fields.
base_url = "https://api.<your-old-gateway>/v1"base_url = "https://api.brorouter.com/v1"api_key = "tba-YOUR_KEY"the rest of the code stays: chat.completions, stream, tool_calls - as they wereOne base_url, one Bearer key, familiar endpoints.
Dozens of models across all six types - in one catalog.
Pay on the fact, a separate wallet for every generation type.
You send a request, BroRouter picks the route itself, watches the job and brings back the file. Start with the model catalog, or go straight to the API reference.