Floe Inference — keyless LLM & voice
Call LLMs, embeddings, and voice models through one OpenAI-compatible endpoint and pay per call from your Floe balance — no provider account, no provider key, no wallet. Point any OpenAI SDK at Floe with your Floe agent key and use a model id like openai/gpt-4o; Floe routes the call to the cheapest available source, meters the exact usage, and debits your balance.
Base URL: https://credit-api.floelabs.xyz/v1
Auth: Authorization: Bearer <your floe agent key> (prefix floe_…)Use an agent key (
floe_…), not a publishable key (floe_live_…). Mint one in the Developer Dashboard or viaPOST /v1/developer/agents/:agentId/keys.
Floe Inference spans many providers behind a single catalog and a single bill — OpenAI, Anthropic, Google, Meta, DeepSeek, Mistral, Cohere, z.ai (GLM), Moonshot (Kimi), Perplexity, Qwen, xAI (Grok), plus open-weight self-hosts, keyless x402 routers, Venice (open-source & uncensored models), and Sarvam (sovereign Indic models across 22+ Indian languages). You never hold an account or key with any of them — Floe fronts the upstream relationship from a pooled wallet and bills you the metered cost per call.
How it works
Every request is priced, gated, forwarded, and metered:
Gate — your agent's balance is the hard ceiling. Floe checks it (and any spend controls) before forwarding. No balance, no call.
Route — Floe picks the cheapest source that can serve the model, across its rails (see below), and forwards an OpenAI-compatible request.
Meter — the response's usage block (tokens, characters, or audio seconds) is priced from the model's rate card plus a small Floe margin (5% default). You're billed the metered cost, never a provider minimum.
Fall back — on an upstream 5xx / 429 / network error, Floe transparently retries the next source; deterministic 4xx errors pass through unchanged.
The exact charge is returned on every response:
X-Floe-Cost-USDC
This call's cost in raw USDC (6 decimals)
X-Floe-Payment-Amount
Same cost as a decimal USDC string
X-Floe-Payment
gateway (metered) · byok (your key, fee only) · passthrough (upstream error, not charged)
X-Floe-Model
The resolved model id
X-Floe-Rail
Which rail served the call (see below)
X-Floe-Attempts
Present when a fallback occurred (number of sources tried)
X-Floe-RateLimit-Advisory
Normalized upstream rate-limit headroom (when enabled) — see below
Rate-Limit Advisory (cross-provider backpressure)
When enabled by the operator, gateway responses carry an X-Floe-RateLimit-Advisory header: the serving provider's own rate-limit headers (OpenAI x-ratelimit-*, Anthropic anthropic-ratelimit-*, generic Retry-After), normalized into one shape — so an agent nearing OpenAI RPM or Anthropic TPM reads a single near_limit / headroom signal regardless of provider, and can back off before hitting the 429 wall.
Notes:
Passive signal only — Floe already retries the next source on a 429; this header just lets you smooth your own request rate proactively.
Sent on successful responses, on error passthroughs, and on an all-sources-unavailable
502(where aretry_after_secondsfrom the last 429 tells you when to try again).Some providers expose less: Gemini's OpenAI-compatible surface only sends
Retry-Afteron a 429 — in that casetightestis absent andretry_after_secondscarries the signal. Nothing is ever fabricated.Off by default (
RATELIMIT_ADVISORY_ENABLED); responses are byte-identical when disabled. The optionalRATELIMIT_ADVISORY_NEAR_LIMIT_BPSthreshold drivesnear_limit.Only calls routed through this gateway carry the signal — own-key calls made directly to a provider never touch Floe and can't be observed.
Rails
A model can be served by one or more rails. Floe picks the cheapest available; you don't choose:
direct-account
Floe's account with a closed provider (OpenAI, Google, …)
metered cost + margin
self-host
Open-weight model on a serverless host (Together, DeepInfra, …)
metered cost + margin
venice
Venice via Floe's pooled wallet
metered cost + margin
x402-router
Keyless pay-per-call router (no account anywhere)
router receipt + margin
byok
Your provider key — sent per request or stored (encrypted)
Floe fee only
free
Promotional / zero-rated models
nothing
BYOK — bring your own provider key. You pay the upstream vendor with your own key; on this gateway's byok rail Floe adds only a small fixed per-call service fee (never the token cost — you paid that) and marks the call X-Floe-Payment: byok. There are two ways to supply the key:
Per request (ephemeral) — send it in the
X-Floe-Provider-Keyheader. It is used for that one call and never persisted or logged. A request header always wins — it overrides a stored key for that call.Stored (once) — save the key and every gateway call for that provider routes BYOK automatically, no header needed. Stored keys are AES-256-GCM encrypted at rest, scoped per developer + provider, and writable by admins only. Manage them from any surface:
Dashboard → Keys → Provider keys (add, relabel, disable, remove)
CLI —
floe providers list·floe providers set <provider>(pipe the key so it never lands in shell history:printf '%s' "$KEY" | floe providers set openai)API —
GET/PUT/PATCH/DELETE /v1/developer/provider-keys/{provider}(GET /v1/developer/provider-keyslists your keys and thesupportedProviders)
A key record never includes key material — only a masked prefix, label, and enabled state. (The collection response additionally lists supportedProviders.)
Endpoints
All are drop-in OpenAI-compatible:
Chat Completions
POST /v1/chat/completions
chat.completions.create
Embeddings
POST /v1/embeddings
embeddings.create
Text-to-Speech
POST /v1/audio/speech
audio.speech.create
Transcription (batch)
POST /v1/audio/transcriptions
audio.transcriptions.create
Transcription (streaming)
WS /v1/audio/transcriptions/stream?model=…
— (Floe extension)
Realtime voice
WS /v1/realtime?model=…
Realtime API
List models
GET /v1/models
models.list
Cost estimate
POST /v1/estimate
— (Floe extension)
Models
Every id on this keyless gateway is fully qualified as provider/model — copy them exactly as written; on POST /v1/chat/completions (and the other /v1/* gateway surfaces) a bare name (e.g. gpt-4o without the openai/ prefix) is rejected. The live catalog is GET /v1/models (no provider key needed — call it with your Floe agent key) — always resolve ids there at runtime; for the full, current set see GET /v1/models for the live list rather than a hard-coded count. The tables below enumerate what's live today.
Two endpoints, two id rules — don't confuse them. The keyless gateway (
POST /v1/chat/completions,/v1/embeddings,/v1/audio/*) resolves an exact catalog id — the fully-qualifiedprovider/modelused throughout this page (a baregpt-4ois rejected). The legacy, flag-gated BYOK metered proxyPOST /v1/llm/chat/completionsis a different endpoint: it takes your ownX-Floe-Provider-Key, prices the call from Floe's maintained LiteLLM cost map (no catalog allowlist), and accepts the model id with or without aprovider/prefix —gpt-4ooropenai/gpt-4oboth work, since Floe strips the prefix before pricing. Prefer the keyless gateway for new work; the BYOK proxy is documented in Unified Ledger.
Text / reasoning
OpenAI
openai/gpt-4o · openai/gpt-4o-mini · openai/gpt-5.5 · openai/gpt-5.4 · openai/gpt-5.4-mini · openai/gpt-5.4-nano · openai/gpt-5.3-codex · openai/gpt-5.6-luna · openai/gpt-5.6-sol · openai/gpt-5.6-terra · openai/gpt-oss-120b · openai/gpt-oss-20b
Anthropic
anthropic/claude-sonnet-5 · anthropic/claude-sonnet-4-6 · anthropic/claude-haiku-4-5 · anthropic/claude-opus-4-8 · anthropic/claude-opus-4-7 · anthropic/claude-opus-4-6 · anthropic/claude-fable-5
google/gemini-3.5-flash · google/gemini-3.1-pro-preview · google/gemini-3.1-flash-lite · google/gemini-2.5-pro · google/gemini-2.5-flash · google/gemma-4-31b · google/gemma-3-27b · google/gemma-3-12b
Meta
meta/llama-3.3-70b · meta/llama-4-maverick · meta/llama-4-scout · meta/llama-3.1-8b
DeepSeek
deepseek/deepseek-v4-pro · deepseek/deepseek-v4-flash · deepseek/deepseek-v3.2 · deepseek/deepseek-v3.1-terminus · deepseek/deepseek-v3.1 · deepseek/deepseek-v3 · deepseek/deepseek-r1-0528
Qwen
qwen/qwen3.6-35b-a3b · qwen/qwen3.5-397b · qwen/qwen3.5-9b · qwen/qwen3-coder-480b · qwen/qwen3-next-80b · qwen/qwen3-235b-a22b-thinking · qwen/qwen3-235b-a22b-instruct · qwen/qwen3-32b · qwen/qwen-2.5-72b
Mistral
mistral/mistral-large · mistral/mistral-medium · mistral/mistral-small · mistral/mistral-small-3.2-24b · mistral/mistral-nemo · mistral/magistral-medium · mistral/codestral
Moonshot (Kimi)
moonshot/kimi-k3 · moonshot/kimi-k2.7-code · moonshot/kimi-k2.6 · moonshot/kimi-k2.5 · moonshot/moonshot-v1-8k
z.ai (GLM)
zai/glm-5.2 · zai/glm-4.7-flash · zai/glm-4.6 · zai/glm-4.5-air
xAI
xai/grok-4.5 · xai/grok-4.3 · xai/grok-build-0.1
Cohere
cohere/command-a · cohere/command-r · cohere/command-r7b
Perplexity (web-search)
perplexity/sonar-reasoning-pro · perplexity/sonar-pro · perplexity/sonar
Venice (uncensored)
venice/llama-3.3-70b · venice/qwen3-235b
Sarvam (Indic, 22+ languages)
sarvam/sarvam-105b · sarvam/sarvam-30b
NVIDIA
nvidia/nemotron-3-ultra
MiniMax
minimax/minimax-m3
Microsoft
microsoft/phi-4
Embeddings
openai/text-embedding-3-large · openai/text-embedding-3-small · baai/bge-m3 · intfloat/multilingual-e5-large · qwen/qwen3-embedding-8b
Text-to-Speech
openai/tts-1 · openai/tts-1-hd · openai/gpt-4o-mini-tts · google/gemini-3.1-flash-tts · google/gemini-2.5-flash-tts · cartesia/sonic-3 · resemble/chatterbox-multilingual · resemble/chatterbox-turbo · xiaomi/mimo-v2.5-tts · xiaomi/mimo-v2.5-tts-voiceclone · xiaomi/mimo-v2.5-tts-voicedesign · canopy/orpheus-3b · canopy/orpheus-v1-english · kokoro/kokoro-82m · inworld/realtime-tts-2 · boson/higgs-audio-v2.5 · sesame/csm-1b · qwen/qwen3-tts
elevenlabs/eleven-turbo-v2-5is in the catalog for pricing/attribution but is served only by the orchestrator's custom-voice surface (POST /v1/orchestrator/voice), not the OpenAI-compatible/v1/audio/speechabove — so it's omitted from this list. ElevenLabs TTS is reachable through the Vendor Marketplace (a marketplace-shim route) and the orchestrator's custom-voice surface — neither is the OpenAI-compatible/v1/audio/speech.
Speech-to-Text
Batch (POST /v1/audio/transcriptions): openai/whisper-1 · openai/whisper-large-v3 · openai/whisper-large-v3-turbo · openai/gpt-4o-transcribe · openai/gpt-4o-mini-transcribe · mistral/voxtral-small · mistral/voxtral-mini-transcribe · nvidia/parakeet-tdt-0.6b-v3 · nvidia/nemotron-3.5-asr
Streaming (WS /v1/audio/transcriptions/stream): deepgram/nova-3
STT on Floe has two surfaces: batch (
POST /v1/audio/transcriptions— file in, transcript out) and live streaming (WS /v1/audio/transcriptions/stream— PCM frames in,interim/finaltranscript events out, the feed a LiveKit/Pipecat STT plugin consumes). Every id above — batch and streaming alike — resolves viaGET /v1/models. See Streaming transcription (live STT) below. The separate/v1/realtimeWebSocket is speech-to-speech, not a streaming-STT source.
Realtime voice models
openai/gpt-realtime · openai/gpt-realtime-2.1 · openai/gpt-realtime-2.1-mini · openai/gpt-realtime-translate · openai/gpt-realtime-whisper · google/gemini-live · google/gemini-live-3.1 · xai/grok-voice · amazon/nova-2-sonic
The live catalog is
GET /v1/models(no provider key needed — call it with your Floe agent key); it grows over time, so resolve ids there rather than pinning this list. Venice and Sarvam are reachable here as first-class inference providers in the gateway (the ids above) — the same vendors also expose x402 endpoints — Venice image and TTS, Sarvam voice and language — reached via/v1/proxy/fetch. Third-party voice vendors with proprietary APIs (ElevenLabs, Cartesia, Deepgram, Google Cloud TTS, AssemblyAI, Hume, Rime, …) also live in the Vendor Marketplace, reached via/v1/proxy/fetch.
Chat completions
Estimate before you spend
POST /v1/estimate prices a usage vector without making the call or touching your balance — use it to gate expensive work. Provide only the units the model bills: text (input_tokens/output_tokens, plus cached_input_tokens), TTS (characters), STT (audio_seconds), or realtime voice (audio_input_tokens/audio_output_tokens).
Agents can call the same estimate through the MCP tool estimate_inference_cost or the AgentKit action estimate_inference_cost, and browse the catalog with list_models / list_inference_models.
Voice
The gateway serves TTS and STT from multiple providers on the same OpenAI-compatible endpoints — OpenAI, DeepInfra, Together, Groq, and Mistral, plus Google Gemini TTS in preview. Text-to-speech meters per character of input (Gemini TTS per audio output token); transcription meters per audio second. As everywhere on this gateway, you're billed the upstream rate plus a small Floe margin (5% default); prices below are upstream list.
OpenAI
tts-1, tts-1-hd, gpt-4o-mini-tts (preview)
whisper-1, gpt-4o-transcribe, gpt-4o-mini-transcribe
DeepInfra
Kokoro ($0.62/1M chars), Chatterbox, Orpheus, Qwen3-TTS
Whisper large-v3-turbo ($0.0002/min), Voxtral
Together
Kokoro, Orpheus, Cartesia sonic-3
Whisper large-v3, Parakeet ($0.0015/min)
Groq
Orpheus TTS
whisper-large-v3-turbo ($0.04/hr — cheapest batch STT)
Mistral
—
Voxtral transcribe ($0.003/min)
Gemini 2.5 / 3.1 Flash TTS (preview)
—
Open-weight models available on more than one host (Kokoro, Orpheus, Whisper) are a single catalog id — Floe routes to the cheapest available source.
Third-party voice vendors (ElevenLabs, Cartesia, Google Cloud for TTS; Deepgram, AssemblyAI for STT) are not on this OpenAI-compatible surface — they run through the Vendor Marketplace via
POST /v1/proxy/fetch, which still bills your Floe balance keyless. See the x402 Voice directory.
audio.transcriptions.createhere is batch — you send a file, you get one transcript back. For a live transcript stream (theinterim/finalfeed a LiveKit/Pipecat STT plugin consumes), use the streaming surface below.
Streaming transcription (live STT)
Open a WebSocket to:
Authenticate with the Authorization: Bearer <floe key> header — keyless, Floe fronts the Deepgram key. Browser clients that can't set headers on a WebSocket handshake pass the key via the floe-stt subprotocol instead: open the socket with two WebSocket subprotocols — floe-stt and your key, in either order (JS: new WebSocket(url, ['floe-stt', '<floe key>'])). The query string is not accepted — keys there leak into proxy, load-balancer, and access logs. Query params:
model
e.g. deepgram/nova-3
fully-qualified provider/model
encoding
linear16 · mulaw · alaw
raw PCM frame encoding
sample_rate
8000–48000
rejected outside this range
language
e.g. en
optional
Client → server: raw PCM binary frames in the declared encoding/sample_rate.
Server → client: JSON transcript events, and an error event on budget exhaustion or failure (the socket then closes):
Map these to your STT plugin's event types: is_final: false is an interim hypothesis, is_final: true is a final transcript, and speech_final: true marks the end of an utterance (endpointing). Every event is a type: "transcript" object — there is no separate interim/final event name on the wire; the boolean carries the finality.
Metered per audio-second on your Floe balance; because your balance is the ceiling, the session is cut off mid-stream the instant a charge would exhaust it. This is the standalone streaming-STT feed a LiveKit or Pipecat STT plugin can consume — see The Voice Stack — live voice with your own stack.
Realtime voice
Open a WebSocket to wss://credit-api.floelabs.xyz/v1/realtime?model=openai/gpt-realtime-2.1, authenticating with Authorization: Bearer <floe key> or ?api_key=. Floe relays events verbatim in both directions and meters each completed turn from the provider's usage block — per token for conversational models, per minute for duration-billed ones. Because your balance is the ceiling, the session is cut off the instant a turn would exhaust it.
Available realtime models: openai/gpt-realtime-2.1 and openai/gpt-realtime-2.1-mini (plus the original openai/gpt-realtime), the duration-billed openai/gpt-realtime-whisper (realtime transcription within the OpenAI Realtime session) and openai/gpt-realtime-translate (live translation), google/gemini-live-3.1 (plus the earlier google/gemini-live, Gemini Live 2.5 Flash), and xai/grok-voice ($0.05/min upstream). amazon/nova-2-sonic is beta — it's in the catalog but requires the dedicated Bedrock bridge (SigV4 credentials) to serve; treat it as not-yet-general until the bridge is provisioned on your deployment.
This WebSocket is speech-to-speech — audio in, audio (or, for the transcription/translation variants, text) out over one OpenAI-Realtime connection. It is not a general streaming-STT feed you can plug into a LiveKit or Pipecat STT service expecting
interim/finaltranscript events. For that, use the keyless streaming transcription endpoint above.
Errors
Successful calls return the provider's response verbatim. Upstream errors pass through unchanged and not charged (X-Floe-Payment: passthrough). Floe-originated refusals use OpenAI-shaped error bodies:
400
Invalid JSON body, or a modality mismatch (e.g. a text model on /audio/speech)
401
A publishable key (floe_live_…) was used instead of an agent key
402
Balance / spend ceiling reached (budget_exhausted)
404
Unknown or disabled model id
422
No source can price the requested usage (no_priceable_source, from /estimate)
429
Per-agent rate limit exceeded. Keyless calls default to 300 requests/min (they ride Floe's pooled upstream quota); BYOK calls — your own provider key, per-request or stored — default to 3,000 requests/min. A BYOK call whose key fails upstream and falls back onto a pooled rail re-qualifies under the keyless window (rate_limited with retry_after_seconds in the body). Limits can be raised per account on request.
503
Floe Inference isn't enabled on this deployment, or no source is available for the model
See the full Error Codes reference for the rest of the Floe API.
Last updated
