elevenlabs.providers.sgit.ai / The ledger — every claim, and how we know it
The ledger — every claim, and how we know it
Almost everything written about this API here was written by a machine that could not reach the API. A small, specific set of things was verified in a real browser on 5 September 2026. The distinction between the two is the most useful thing this site has, so it is a table rather than a disclaimer.
Prose from the video vault at commit 7d1916aca5f3, 7 September 2026. Assembled from the source vault's own materials inventory. When the vault moves ahead, this page is behind — and says so rather than guessing.
The six states
| Chip | Means | What you may do with it |
|---|---|---|
| verified | We ran it and watched it work, on that date, in a named place | Treat as fact for that date and that setup |
| measured | Our own pipeline produced this number on a named workload | Treat as fact about our workload; yours will differ |
| vendor docs | Read in the vendor's documentation on that date; never executed by us | Check it against the vendor before you rely on it — and tell us if it moved |
| specified, not shipped | A written specification for something that does not exist | Never plan around it. Future tense only |
| written, not run | Code we wrote and have never executed | Read it, then run it and find out. Expect it to be wrong somewhere |
| projected | Arithmetic, with its workings shown | Re-do the arithmetic with your own numbers |
Every chip on this site links here. Every claim below names where it is said, so a claim cannot appear on a page without appearing in this table — the join is done at build time.
Verified in a browser, 5 September 2026
| Claim | State | How we know | Where it is said |
|---|---|---|---|
api.elevenlabs.io answers CORS for browser origins directly. GET /user/subscription, /voices, /models and POST /text-to-speech/{id}/with-timestamps all returned 200 from a null-origin srcdoc iframe. No proxy is needed for a browser-side lab. | verified 5 Sep 2026 | The project lead's browser, SG/Vault app frame | the report, bench, comparison, voices |
Three with-timestamps generations of a 187-character sample on voice pNInz6obpgDQGcFmaJgB (premade "Adam"), model eleven_v3, returned audio plus a per-character alignment. | verified 5 Sep 2026 | The bench, three samples | bench, captions, text-handling, voices, video |
| Those three generations took 5.0–5.8 s each, wall clock, from a residential connection. Three samples is not a latency distribution; it is three samples. | verified 5 Sep 2026 | The bench's own timer | the report, bench, models, grant |
Inside the SG/App host, every app frame is served connect-src blob: data:, so the bench's first fetch was refused before it left the frame. "permissions": {"network": true} in app.json omits that meta and the host's HUD then shows a standing "direct network access" chip. | verified 5 Sep 2026 | Console error, then the fix, on the same afternoon | the report, bench, concurrency, pattern-three |
api.elevenlabs.io:443 is refused to the authoring container by the agent proxy (connect_rejected, organization policy) — from curl and from Node, on the regional hosts too. Nothing written in that container could be executed there. | verified 4–5 Sep 2026 | curl and node, both refused | the report, examples, experiments, video |
A key typed into any lab on this site is kept in this browser's localStorage (or sg.state inside a vault app) and is sent to exactly one host, api.elevenlabs.io, in the xi-api-key header. There is no other network origin in the built site. | verified 7 Sep 2026 | Enforced by tools/check_site.py, a required CI check, over the built HTML and JS | the report, ask, experiments, voices, patterns, video |
The eleven_v3 path ran for the first time on 8 September 2026: nine scenes, 1,821 characters, 2:08 of speech, mean round trip 4,703 ms (3,070–5,843 ms, sequential), two cuts assembled at 1920×1080 and 1080×1920, and 28 subtitle cues built from the same responses as the audio. Zero re-renders. | verified 8 Sep 2026 | A Claude Code session with a key supplied by the project lead for that run; materials in a vault, not in this repository | the report, ask, grant, pricing, video |
output_format=pcm_44100 is refused on a free-tier key: 403, subscription_required, "Output format 'pcm_44100' is only available on the Pro tier and above." The render shim asks for PCM to skip a decoder; the documented fallback — request MP3 and decode in the page — is the right one. | verified 8 Sep 2026 | The first run. This was the failure the first-run guide called most likely, and it was | the report, grant, pricing, video |
eleven_v3 is available to a free-tier key: it is listed by GET /v1/models and generated all nine scenes, with stability: 0.5 accepted without a 422. The prediction that v3 might not be enabled for API use was wrong for this account. | verified 8 Sep 2026 | The first run | video |
Request stitching is not available on eleven_v3. Sending previous_text/next_text returns 400 unsupported_model: "Providing previous_text or next_text is not yet supported with the 'eleven_v3' model." Nobody predicted this, and the video pipeline passes neighbouring scenes by default — so the first render failed before it made a sound. | verified 8 Sep 2026 | The first run, on the first request | the report, text-handling, grant, video |
| The alignment's last end time equals the decoded audio duration exactly — 0.0 ms difference on nine scenes out of nine. Decoded every MP3 to PCM and compared. So the 100–500 ms of drift this estate has reported since September is not in the speech: a render that advances by the alignment is correct, and drift comes from the compositor, the recorder or the encoder. | verified 8 Sep 2026 | Nine MP3s decoded to 44.1 kHz mono PCM and measured against their alignments | the report, briefs, video |
And this render produced drift of its own, from the encoder: ffmpeg's -shortest with a looped still let the video flush past the end of the audio, adding up to 1.8 s of silent video per scene, 14 s over ten scenes. Replacing it with an explicit -t <alignment end> fixed it exactly. Two lesser traps: an MP3 container's Duration: is a bitrate estimate and read 30–50 ms long on every file, and Chromium's --window-size is a window rather than a viewport — at 1920×1080 the page saw 993 px and every slide was silently cropped. | verified 8 Sep 2026 | The first run, and the three bugs it took to get a correct file | the report, video |
Scoped, not bounded, observed in one response body: creating a pronunciation dictionary returned 401 — "The API key you used is missing the permission pronunciation_dictionaries_write". The platform names the missing permission precisely. It has nothing equivalent to say about spend, because there is nothing to say. | verified 8 Sep 2026 | The first run. The only ceiling on that key was the free tier's 10,000 characters a month | the report, grant, video |
Measured on our own workloads
| Claim | State | How we know | Where it is said |
|---|---|---|---|
The whole bench session cost about 750 characters ≈ $0.075 at list price on eleven_v3 — four generations of a 187-character sample. | measured 5 Sep 2026 | Character count × list rate; the subscription counter is the audit | the report, bench, sound |
At $4.79 used against a $5.00 provisioned limit, OpenRouter refused every audio request with 402 — this request requires at least $0.50 in balance for audio output, limit_source: openrouter_key_limit. The bound worked. Raising the limit in the dashboard resumed the work. | verified 3 Sep 2026 | The render log of two blocked re-renders | the report, concurrency, key-scope, patterns, openrouter |
A 3:46 landscape reel — 599 words, 16 requests, openai/gpt-audio — cost $0.2997; its 2:09 portrait cut, 318 words in 10 requests, cost $0.1708. About $0.08 per minute of speech. | measured 3 Sep 2026 | Priced per generation id from the provider's own endpoint | the report, align-verify, cost, openrouter |
openai/gpt-audio takes no pace parameter, so a portrait cut that had to fit under YouTube's three-minute Shorts rule lost a third of its script instead of 15% of its pace. ElevenLabs exposes voice_settings.speed; that is the reason this page exists at all. | measured 2 Sep 2026 | Two renders of the same script | the report, voice-settings, openrouter, video |
| Across 61 OpenRouter generations, transcript mismatches: 0. The provider returns a transcript of what it spoke and it matched the script every time. | measured 3 Sep 2026 | `transcriptMismatches` in the render log | align-verify, openrouter |
| The video pipeline this site would use is real and has shipped four reels, six cuts — two landscape, two portrait — with three narration providers: a local model, an OpenRouter-hosted one, and none with this vendor. Every number in its documentation was observed rather than estimated. | measured 2–3 Sep 2026 | The pipeline's own render logs and per-reel findings, handed over 7 Sep 2026 | video |
| 2.1 words per second is the length rule those renders produced: ten scenes want 200–260 words including intro and outro. It is counted before any audio exists, because a script that is too long is cheaper to fix than a render that is. | measured 7 Sep 2026 | Six cuts, measured against their scripts | video |
| Those renders drifted 100–500 ms over two minutes between the audio and the recording, and the cause has never been attributed. Character-level alignment makes the attribution possible for the first time — sum the alignments' last end times and compare with the recorder's own duration — and it has not been done. | measured 3 Sep 2026 | Render logs across four reels; the comparison is ten minutes of work nobody has spent | video |
For the same two minutes of video the MP4 was 3.7 MB against 10.1 MB for the WebM. MP4 also plays natively on iOS Safari and is accepted by messaging apps that refuse WebM, so the delivered file is H.264 + AAC with +faststart. | measured 7 Sep 2026 | The pipeline's own encodes | video |
Read from the vendor's documentation
| Claim | State | How we know | Where it is said |
|---|---|---|---|
| An ElevenLabs key can be scoped to endpoints in the dashboard. There is no per-key spend limit for the text-to-speech API: the only bound is the plan's monthly character quota, which belongs to the whole account. Scoping is not bounding. | vendor docs 5 Sep 2026 | ElevenLabs dashboard and API reference, read 5 Sep 2026 | the report, bench, comparison, key-scope, sound, pattern-three, patterns, pricing, openrouter |
| "Never expose your ElevenLabs API key client-side", the 15-minute signed URL and the exact-hostname allowlist are Agents (conversational) features. The text-to-speech REST API has no signed-URL and no allowlist mechanism at all. | vendor docs 5 Sep 2026 | elevenlabs.io/docs/eleven-agents/customization/authentication, read 5 Sep 2026 | the report, comparison, ledger |
List price, September 2026: eleven_v3 and eleven_multilingual_v2 $0.10 per 1,000 characters; eleven_flash_v2_5 and eleven_turbo_v2_5 $0.05. Speech-to-text and forced alignment $0.22 per hour of audio; sound effects $0.12/min; music $0.15/min; dubbing $0.33 (v1) / $2.20 (v2) per minute. | vendor docs 5 Sep 2026 | elevenlabs.io/pricing/api, read 5 Sep 2026. Prices move; this one has a date on it | the report, ask, bench, cost, dialogue, models, pronunciation, sound, text-handling, voice-settings, voices, ledger, pricing, video |
Monthly character quotas: Starter $6 — 10k · Creator $22 — 220k · Pro $99 — 990k, with pay-as-you-go above quota. GET /v1/user/subscription reports character_count, character_limit and the reset date. | vendor docs 5 Sep 2026 | elevenlabs.io/pricing/api and the API reference, read 5 Sep 2026 | the report, key-scope |
Characters per request: eleven_v3 5,000 · eleven_multilingual_v2 10,000 · eleven_flash_v2_5 and eleven_turbo_v2_5 40,000. | vendor docs 5 Sep 2026 | elevenlabs.io/docs/overview/models, read 5 Sep 2026 | cost, models |
voice_settings.speed accepts 0.7–1.2, default 1.0; values at the extremes cost quality. A speed outside that range is a 422, not a clamp. | vendor docs 5 Sep 2026 | Text-to-speech best practices, read 5 Sep 2026 | the report, voice-settings, openrouter |
Pronunciation dictionaries take two rule types: alias rules work on every model; phoneme rules (IPA or CMU Arpabet) are honoured only by eleven_flash_v2 and eleven_v3 — other models ignore them silently. Up to 3 dictionary locators per request. | vendor docs 5 Sep 2026 | Pronunciation dictionary guide, read 5 Sep 2026 | the report, examples, pronunciation |
POST /v1/forced-alignment takes audio (up to 3 GB / 10 hours) plus the transcript as plain text (max 675,000 characters, not JSON-wrapped) and returns per-character and per-word timing, priced at the speech-to-text rate of $0.22 per hour of audio. | vendor docs 5 Sep 2026 | Forced alignment capability page, read 5 Sep 2026 | the report, align-verify, ledger, pricing |
POST /v1/text-to-dialogue (and /with-timestamps) takes inputs: [{text, voice_id}, …] and renders a multi-speaker exchange in one call with consistent pacing. | vendor docs 5 Sep 2026 | API reference, read 5 Sep 2026 | dialogue |
Auth is the header xi-api-key: <key> — not Authorization. Keys are sk_ followed by 48 hex characters, which is why that shape is in this repository's secret scan. | vendor docs 5 Sep 2026 | API reference, read 5 Sep 2026 | the report, experiments, key-scope |
401 bad or missing key · 402 quota exhausted or feature not on this plan · 422 validation (unknown model_id, speed out of range, bad dictionary locator, text over the model's limit) · 429 concurrency or rate limit · 5xx theirs. The detail object in the body says which field. | vendor docs 5 Sep 2026 | API reference, read 5 Sep 2026 | concurrency, dialogue |
| The ElevenLabs Grants Program gives an accepted startup 33,000,000 characters over 12 months — the page calls it "over 680 hours of Agents usage" and "more than $5,500+ in value" — plus access to founder events. Applications are rolling, with a decision inside a week. When the 12 months end, or when 10,000 credits remain, the plan converts to Free. | vendor docs 8 Sep 2026 | elevenlabs.io/startup-grants, read 8 September 2026 | grant |
| Eligibility, verbatim in substance: a monetized product use case with a business or monetization strategy, from a business email; no short-term or one-off projects; no projects for under-18s; startups and companies under 25 employees; no agencies or consulting firms; one application per company; and existing enterprise customers are not eligible. | vendor docs 8 Sep 2026 | elevenlabs.io/startup-grants FAQ, read 8 September 2026 | grant |
| Granted characters cannot be resold or exchanged. "You cannot exchange or resell your text characters. Reselling your text characters would be a violation of the ElevenLabs Grant program conditions and your grant plan will be terminated immediately." This is the sentence that decides what a pricing page on this estate may say. | vendor docs 8 Sep 2026 | elevenlabs.io/startup-grants FAQ, read 8 September 2026 | grant, pricing |
Specified, or written and never run
| Claim | State | How we know | Where it is said |
|---|---|---|---|
sg.tts.speak() does not exist. It is a written specification for a verb the SG/Vault host would gain, so that a vault app could generate speech without ever holding the key. The terms file .vault/elevenlabs/config.json is real; the host verb is not. | specified, not shipped | elevenlabs/docs/10-pattern-three-sg-tts.md in the source vault | the report, bench, comparison, experiments, concurrency, ledger, pattern-three, patterns, pricing |
The render shim (TTS=elevenlabs in the video pipeline's 02-render.mjs) is written and has never been executed — the container that wrote it could not reach the API. | written, not run | See the egress claim | the report, ledger, video |
Every file in examples/ — 00-smoke.sh, voices.sh, tts.sh, tts-timestamps.mjs, align.sh, stt.sh — is written from the vendor's reference and has never been run against the API by us. | written, not run | Same block | the report, bench, examples, ledger |
| Every lab on this site is unrun by us. They were written against the vendor's published request and response shapes by a session with no access to the API and no key. The first person to press a button will know more about whether they work than the people who wrote them. | written, not run | Built 7 Sep 2026 with no API key present at any point | the report, experiments, align-verify, dialogue, models, pronunciation, sound, text-handling, voice-settings, voices, ledger |
The names-pronunciation test has not been run. The bench has had the button since 5 September and nobody has pressed it, so this site cannot say which names eleven_v3 gets wrong. | written, not run | Nobody has pressed it | the report, bench, experiments, pronunciation, grant, ledger, video |
pronunciations.pls is a hypothesis. It has never been uploaded, and no alias in it has ever been heard. Publish it as a starting point, not as a lexicon that is known to work. | written, not run | Written from the PLS spec; never uploaded | the report, bench, examples, experiments, pronunciation, grant, video |
| The plan's concurrency limit is unknown to us. Our render fires 10–16 requests at once, and a 429 mid-render is the likely first failure on a small plan — but we have never provoked one. | written, not run | Never tested; the concurrency lab exists to test it | the report, experiments, concurrency, cost, models, grant, ledger, pattern-three, video |
| The characters→words→cues grouping rule — break at 84 characters, or a gap over 0.6 s, or 6 s of running time; wrap at the last space before 42 — is ours, not the vendor's. It is arithmetic over the alignment array, and no cue it produced has yet been checked against a human reading of the finished video. | written, not run | Implemented in the bench, the captions lab and tts-timestamps.mjs | the report, bench, experiments, captions, ledger, video |
| Per-reel ElevenLabs costs for our existing scripts are projected: measured word counts × 6 characters per word × the list rate. $0.18–0.36 per landscape reel on v3, half of that on flash. No such render has been paid for. | projected | Arithmetic on measured word counts; the workings are on the page | the report, cost, models, grant |
| At about 4,000 characters per video, a Creator plan's 220k monthly characters is roughly 50 videos a month. Arithmetic, not experience — we have never run a month of it. | projected | 220,000 ÷ 4,000, against measured script sizes | the report, cost |
Four predictions about where the unrun ElevenLabs render path breaks first: pcm_44100 output is gated to higher plans and is the most likely failure; eleven_v3 may not be enabled for API use, and treats stability as three discrete modes rather than a continuum, so an arbitrary value can 422; the alignment may not come back in the shape the shim expects, or at all on some models; and the render's default pool fires two generations at once against an untested concurrency limit. | written, not run | Reasoned from the vendor's reference by the pipeline's author, who could not reach the API. Predictions, not findings | video |
A two-minute landscape reel is about 1,600 characters ≈ $0.16 on eleven_v3; a four-minute one about 3,600 ≈ $0.36; half those on flash. Budget about $1.50 for a first video including the three or four re-renders a first script needs. Arithmetic on measured word counts at list price, not an invoice. | projected | Characters × the rate in the pricing claim, against measured scripts | pricing, video |
| The prices on this site's pricing page are proposed, not sold. No customer has paid them, no engagement has run to completion under them, and they are published in the open so that the first customer argues with a number rather than with a silence. | specified, not shipped | Written 8 September 2026; nothing has been invoiced | pricing |
Open items
The honest list of what is unfinished, so that nothing here is presented as done. It matches the handover brief this site was built from, and it is the first thing to fix.
The names-pronunciation test has not been run
The bench has had the button since 5 September 2026. Nobody has pressed it. Until somebody does, this site cannot say which names eleven_v3 mispronounces, and pronunciations.pls is a hypothesis rather than a lexicon. written, not run
Cost to close it: about 120 characters, roughly $0.012, and two minutes of listening. The lab is here.
sg.tts is unimplemented
It needs host-side work in SG/Vault, which is not in this repository. Until it lands, ElevenLabs cannot reach pattern 3 and the labs on this site cannot drop their key boxes. specified, not shipped
Pattern 2 has no server
For text to speech the vendor offers no short-lived credential, so a minter would be ours to run. Nobody has written one, and this site is not the place for it. vendor docs 5 Sep 2026
The render shim and every example file are unrun
Written by a container with no egress to the API. written, not run written, not run The same is true of every lab on this site. written, not run
Concurrency is unknown
The plan's concurrent-request limit against a render that fires 16 requests at once has never been tested. written, not run The probe exists; it costs a few cents to run.
These pages will move
Long term, the patterns, comparison, ledger and disclosures belong at providers.sgit.ai, shared by every provider site. Version 1 carries them here, and the templates are built so that the move is a redirect rather than a rewrite.
What we would need a human with API access to check
Handed back rather than guessed at. This is the list in HANDBACK.md in the repository, kept short enough to work through in an afternoon:
- The smoke test —
examples/00-smoke.sh. Does the key work, what is the quota, does one sentence come back? Everything else depends on it. - Which names v3 gets wrong — the pronunciation lab, the "names to test" sample, and two minutes of listening.
- Whether the alias rules in
pronunciations.plsfix them — the same lab, with the dictionary attached. - Where the concurrency wall is on the plan in use — the concurrency probe, which is the only lab here that can cost more than pennies if you set the numbers high.
- Whether the cue rule produces readable subtitles on a real reel rather than on a 187-character sample — the captions studio written, not run.
- Whether forced alignment matches the Kokoro-rendered cuts to their scripts, which would give subtitles to six already-published videos for about two cents vendor docs 5 Sep 2026.
- Whether the list prices in the tables here still hold. They carry the date they were read; they are the fastest-staling thing on the site vendor docs 5 Sep 2026.
None of these needs a key from anyone; each needs somebody's own key, in their own browser, for a few minutes. Results paste back as markdown from every lab.