faucet
Request access
Reference

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/models stays exactly OpenAI-shaped for clients that only enumerate.
  • An alias is echoed as the canonical slug. Ask for claude-opus-5 and id comes back anthropic/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"

FieldMeaning
response_formatsThe response_format values served and billable — narrower than what the model produces
supports_streamingWhether stream=true is accepted
max_file_bytesThe upload ceiling for this model
surcharged_parametersParameters 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"

FieldMeaning
default_dimensionsThe width you get if you send no dimensions
supported_dimensionsThe 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"

FieldMeaning
sizesExact size spellings accepted through the OpenAI field
min_edgePresent instead of sizes where width and height are free
qualitiesAccepted quality values
max_nThe largest n accepted
output_formatsAccepted output_format values, where the gateway narrows them
max_input_imagesHow 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.