Model capabilities
The faucet block on GET /v1/models/{id} — what this gateway will actually serve for a model, which is narrower than what the model can do.
GET /v1/models/{id} returns OpenAI's four model fields plus a faucet block
describing what this gateway will serve for that model. That is not the same
as what the model can do, and the difference is the reason the block exists:
whisper-1 genuinely produces srt, and this gateway refuses it, because a bare
document has nowhere to report usage.
Branch on this rather than hard-coding anything from these pages. The block is produced by the same functions the routes enforce, so it cannot drift from behaviour — a capability document that can drift is worse than none, because clients believe it.
curl https://api.intfaucet.com/v1/models/elevenlabs/scribe-v2 \
-H "Authorization: Bearer $FAUCET_API_KEY"{
"id": "elevenlabs/scribe-v2",
"object": "model",
"created": 0,
"owned_by": "elevenlabs",
"faucet": {
"kind": "transcription",
"response_formats": ["json", "faucet_json"],
"supports_streaming": false,
"max_file_bytes": 26214400,
"surcharged_parameters": [
"entity_detection", "entity_redaction", "keyterms", "detect_speaker_roles"
]
}
}Two things about the envelope itself:
- The block is on the detail route only.
GET /v1/modelsstays exactly OpenAI-shaped for clients that only enumerate. - An alias is echoed as the canonical slug. Ask for
claude-opus-5andidcomes backanthropic/claude-opus-5, so a client that stores what it reads back stores the stable name.
created is always 0. OpenAI's field is a real publication timestamp Faucet
does not track, and a moving value would make every poll look like a brand-new
catalog.
kind: "transcription"
| Field | Meaning |
|---|---|
response_formats | The response_format values served and billable — narrower than what the model produces |
supports_streaming | Whether stream=true is accepted |
max_file_bytes | The upload ceiling for this model |
surcharged_parameters | Parameters that raise the rate, by name |
response_formats is the field to read before sending response_format. It is
the same function the audio route rejects with and the same one the
Models reference labels rows from, so the three cannot
disagree. faucet_json appears here when the gateway can normalize that model's
output — no model produces it, so no catalog entry lists it.
surcharged_parameters names parameters and publishes no rates, which is a
decision rather than an omission: the basis points behind them are not yet
confirmed against a real invoice, and a number here would be a machine-readable
promise about a bill that cannot be backed. See
Transcription for what they cost today and the
caveats on those figures.
kind: "embedding"
| Field | Meaning |
|---|---|
default_dimensions | The width you get if you send no dimensions |
supported_dimensions | The widths this gateway will accept, where it enforces a set |
The embeddings route runs the same derivation before it resolves a credential, so
asking for a width outside the published set is a local 400 rather than a
provider-dependent surprise.
kind: "image"
| Field | Meaning |
|---|---|
sizes | Exact size spellings accepted through the OpenAI field |
min_edge | Present instead of sizes where width and height are free |
qualities | Accepted quality values |
max_n | The largest n accepted |
output_formats | Accepted output_format values, where the gateway narrows them |
max_input_images | How many pictures /v1/images/edits accepts |
OpenAI image models publish no block
They are passthrough, so OpenAI stays authoritative about its own endpoint, and copying its descriptive lists here would promise gateway enforcement that does not exist. The block is published for the models Faucet itself narrows — the Gemini image models and FLUX.2.
Chat models publish no block
A chat model is reachable through two endpoints — /v1/chat/completions and,
for Anthropic models, /v1/messages — and the passthrough and translated
dialects refuse different things. A flat chat capability object would make claims
that are true on one route and false on the other.
Absence means "not published", never "supports nothing". What a chat model accepts is covered in Chat, including the parameters that work only on passthrough providers.
Reading it in practice
A client that wants to offer transcription options should ask this route rather than branch on a provider name:
const res = await fetch(`https://api.intfaucet.com/v1/models/${slug}`, {
headers: { Authorization: `Bearer ${process.env.FAUCET_API_KEY}` },
});
const model = await res.json();
if (model.faucet?.kind === 'transcription') {
// Only offer formats this gateway will actually bill for.
showFormats(model.faucet.response_formats);
// Warn before a parameter silently costs more.
markSurcharged(model.faucet.surcharged_parameters);
if (!model.faucet.supports_streaming) disableStreamToggle();
}A 404 here means the model is not carried, is outside your key's allowlist, or
has no usable credential — one answer for all three.