elevenlabs.providers.sgit.ai / Comparison — provider × pattern
Comparison — provider × pattern
One row per provider and product, one column per pattern. This table is generated at build time from the patterns: front-matter on each provider page — the hand-written version of it drifted the moment a second provider appeared.
Prose from the video vault at commit 7d1916aca5f3, 7 September 2026. When the vault moves ahead, this page is behind — and says so rather than guessing.
| Provider | Product | 0 · key in the page | 1 · bounded key in the page | 2 · short-lived token | 3 · host holds the key | Needs a server for the safe pattern |
|---|---|---|---|---|---|---|
| ElevenLabs | Text to speech (REST) | ⚠CORS allows it; the account quota is the only bound | ×no per-key spend limit exists | ✓only with a server we run | ◖sg.tts specified; terms file in the vault | Yes — ours, until sg.tts ships |
| ElevenLabs | Agents (conversational) | ⚠the vendor forbids it explicitly | ×no bounded key to mint | ✓vendor signed URL, 15 min; or a hostname allowlist — not both | —not attempted | Yes — the vendor's minter holds your key |
| OpenRouter | Chat and audio models | ⚠possible; never acceptable | ✓provisioned key with a limit and a reset | ✓with a server, and not needed | ✓shipped: sg.llm.* in the SG/Vault host | No |
✓ available · × unavailable · ⚠ available and never acceptable · ◖ specified here, not shipped · — not applicable
Generated at build time from the patterns: front-matter of every provider page. Adding a provider is one Markdown file; this table follows.
Read down the columns
Column 0 is the same everywhere: possible, and never acceptable. It is in the table because "the browser can call it" is what people usually mean by "client-side", and CORS permitting a call says nothing about whether the credential is bounded verified 5 Sep 2026.
Column 1 is where the two providers part company. OpenRouter can mint a key with a spend limit and a reset window, so a key in a page has a blast radius you chose. ElevenLabs cannot: scoping restricts what a key may call, never how much it may spend vendor docs 5 Sep 2026. There is no product configuration that makes column 1 available for ElevenLabs text to speech, which is why the row says ✗ rather than "not recommended".
Column 2 needs a server, and the question is whose. For ElevenLabs Agents the vendor runs the minter — you hand it your key and it issues a 15-minute signed URL vendor docs 5 Sep 2026. For ElevenLabs text to speech there is no such endpoint, so the minter would be ours to build, host, secure and pay for. "Available with a server" and "available" are not the same claim, and the last column of the table says which.
Column 3 is the one this estate can extend to any provider by adding a verb to the host bridge and a terms file to .vault/. It is shipped for the model router and specified for the voice API specified, not shipped. It is the site's actual argument: a browser application can use a paid API without ever holding the key, because the host holds it and enforces the terms.
How to add a provider
Write one Markdown file in content/providers/ with a patterns: block in its front-matter, and this table grows a row. No template surgery, no edit to this page:
patterns:
- provider: Some Vendor
product: The specific product, because a vendor is not one auth story
server: "Yes — ours"
p0:
verdict: never
note: "why, in six words"
p1:
verdict: yes
note: "the bound, named"
p2:
verdict: no
note: "no vendor minter for this product"
p3:
verdict: spec
note: ""
verdict is one of yes · no · never · spec · na. The OpenRouter page on this site exists as the proof: it is a stub of the sibling site's content, carrying nothing but front-matter and a short body, and it is where the second and third rows of the table above come from.