You already route your text through one gateway. One key, one call shape, one bill, one trace view.
Then you need a picture. So you open an account with an image vendor, put a second key somewhere, learn a second request shape, and reconcile a second invoice at the end of the month. Then you need a voiceover, and you do it again.
I got tired of that. SpiderGate now takes images, video, speech, transcription and embeddings on the same Bearer token as chat.
What is actually live
Six endpoints, all under https://spideriq.ai/api/gate/v1, all authenticated with the same client_id:api_key:api_secret triple you already use for chat:
POST /media/generations— schema-aware generation: image, video, text-to-speechGET /media/models— discovery: which models are live, and what each one acceptsPOST /images/generations— OpenAI-shaped image generationPOST /audio/speech— text-to-speechPOST /audio/transcriptions— transcription, multipart uploadPOST /embeddings— vectors
The number, stated honestly: 33 of the 81 media models in the catalogue are active today. That splits into 16 of 34 image models, 15 of 36 video, and 2 of 11 audio. The other 48 are registered as coming_soon, each with a recorded reason — a provider-side error, a field mismatch, or a generation slower than our poll ceiling. I would rather show you the fraction than the headline.

One more thing to be straight about before you plan around this: every one of those 33 is a paid-tier model, and none of them run on our shared key pool. Media is bring-your-own-key. You register a kie.ai, fal.ai, Google, xAI or OpenAI key in the vault and the gateway routes through it. What you get from us is the routing, the schema, the guards, the metering and the storage — not the inference credits.
Two doors into the same pipeline
There are two ways in, and they are for two different people.

The OpenAI-shaped door is for code you have already written. Point the openai SDK at https://spideriq.ai/api/gate/v1, pass the real model name — gpt-image-1, tts-1, whisper-1 — and it works. Nothing else changes.
from openai import OpenAI
client = OpenAI(
base_url="https://spideriq.ai/api/gate/v1",
api_key=f"{CLIENT_ID}:{API_KEY}:{API_SECRET}",
)
speech = client.audio.speech.create(
model="tts-1", voice="nova", input="Welcome to SpiderGate.",
)The schema-aware door is for agents. It is the one I actually care about, and it is the reason this is a launch rather than a changelog line.
An agent should not have to guess what a model accepts
Here is the problem with a generic media endpoint. Every model takes different parameters. Veo wants an aspect ratio from a fixed set. An image-to-image model needs a source image. A lipsync model needs audio. If your API pretends they are all the same, an agent has to guess — and a guess that is wrong costs a generation.
So we published the parameters as data.

GET /media/models returns every active model together with its declared inputs. Ask it about kie/veo-3-fast and you get exactly this:
{
"prompt": { "type": "string", "required": true, "control": "textarea" },
"aspect_ratio": { "type": "enum", "default": "16:9",
"enum": ["16:9", "9:16", "1:1"], "control": "segmented" }
}That is the whole contract. Two fields, one required, one with a stated default and three legal values. An agent reads it, fills it, and sends it:
curl -X POST "https://spideriq.ai/api/gate/v1/media/generations" \
-H "Authorization: Bearer $CLIENT_ID:$API_KEY:$API_SECRET" \
-H "Content-Type: application/json" \
-d '{ "model": "kie/veo-3-fast",
"params": { "prompt": "a slow pan across an empty server room",
"aspect_ratio": "16:9" } }'You get back a stored URL, not a stream of bytes to babysit.
The same schema drives the settings panel in the Studio, which is the point — the controls a human sees and the fields an agent sends come from one row in one table. Nobody maintains a second copy.
A wrong value fails before it costs you anything
The obvious failure mode of "just forward the parameters" is that a typo reaches the provider, the provider returns a bare 502, and you are left staring at it.

Two rules handle it, and both run before a key is selected:
A parameter the model never declared is dropped, not forwarded.
A declared parameter with an illegal value is rejected with
422 invalid_param, naming the field and listing the values it will accept.
Send "output_format": "jpeg" to a model whose enum reads jpg and you get a message that says so. You do not get a 502, and you do not spend a generation finding out.
There is a clock on it too. Generation runs under a wall-clock cap — 600 seconds for image and speech, 900 for video — and a run that exceeds it returns 504 generation_timeout instead of hanging. Every dispatch failure now writes a typed row, so a model that has quietly started failing shows up as a number instead of as silence.
Embeddings stopped being the exception
Chat has had task aliases for a long time: you ask for spideriq/coding and the gateway picks the model. Embeddings did not have that, so anything doing retrieval had to name an OpenAI model directly — the one place a vendor name stayed hard-coded in otherwise vendor-neutral code.
That is fixed. Three aliases now resolve server-side:
agent/embed-small→text-embedding-3-small, 1536 dimensionsagent/embed-large→text-embedding-3-large, 3072 dimensionsagent/embed→ small
Raw OpenAI model names still pass through unchanged, so nothing you have already written breaks. Key selection filters to keys that actually support embeddings, and the calls are metered and traced exactly like chat.
It lands in the bill you already read
Media spend goes to the same place as everything else. Each request is tagged with its kind — image, video, audio_tts, audio_stt, embedding — and shows up in Usage and Traces next to your chat traffic. When the generation runs on a key we own, you are billed the provider cost plus a markup. When it runs on your own paid key, you are billed nothing per request, because you are already paying the provider directly.
Where to start
If you have code today, point the openai SDK at the gateway and change nothing else.
If you are building an agent, install the skill — @spideriq/gateway-skills on the OPVS marketplace ships generate-media, which wraps both endpoints and validates parameters against the declared schema before it spends a call. Or tell your agent, in as many words: "list the SpiderGate media models, pick one that does text-to-video, and generate a 16:9 clip."
Full reference: the Media API in the developer reference. The human version, with screenshots: Images, audio and embeddings.
One last note, since it is the honest test of any tool. Every illustration in this post was generated through this API — same endpoint, same schema, same guards. It is also where I would point you first if you asked me what still needs work: 48 of the 81 registered models are not serving yet, and getting that fraction up is the next job.
