About cartesia-api
cartesia-api is a skill for integrating Cartesia speech APIs in applications and agent-assisted coding. It covers Sonic text-to-speech, Ink transcription, voice handling and API conventions, while distinguishing these APIs from the separate Cartesia Line product.
Key features
- 01Guidance for Sonic text-to-speech
- 02Guidance for Ink speech transcription
- 03Voice library, cloning and localization
- 04HTTPS and WebSocket API conventions
- 05Python and JavaScript/TypeScript SDK guidance
Use cases
- 01Adding generated speech to an application
- 02Transcribing audio through Ink
- 03Building clients with Cartesia SDKs or APIs
- 04Choosing between API integration and Cartesia Line
MCP support
The skill documents Cartesia's hosted MCP server and local stdio option. The hosted server offers voice listing, TTS/STT, voice cloning and pronunciation-dictionary management to MCP clients.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ cartesia-ai/ skills --skill cartesia-apiAfter installing, type/cartesia-apiin Claude Code to confirm it loaded.
Bundled filesreferences/resources.md
Details
From the project READMECartesia Voice & Speech APIs
Cartesia provides text-to-speech (Sonic), speech-to-text (Ink), voices (library, clone, localize), and related HTTPS and WebSocket APIs. This skill covers application integration and agent-assisted coding. For Cartesia Line (managed voice agents, cartesia CLI, telephony, Line SDK), use cartesia-line.
Core directives
- HTTPS only: All HTTP endpoints use
https://api.cartesia.ai. WebSockets usewss://- HTTP may be unsupported; keys used over HTTP can be auto-rotated
- API version: Cartesia's API is dated (
Cartesia-Version: YYYY-MM-DD). Pin one version across your services and treat bumping it like a major dependency upgrade — a new version can carry breaking changes — so it's a fixed choice, not a runtime/per-call variable.- With an SDK (recommended): the SDK already pins a
Cartesia-Versionit was built and tested against. Let it manage that — do not override it (e.g. viadefault_headers) with your own date, since the SDK may not work against an arbitrary version. To move to a newer API version, upgrade the SDK. - Calling the API directly (no SDK): you must send
Cartesia-Versionyourself. Browser WebSockets can't set handshake headers, so pass it as?cartesia_version=...(query wins if both are present). - Optional:
GET https://api.cartesia.ai/returns{"ok":true,"version":"..."}(the gateway's current default), useful when wiring a new client.
- With an SDK (recommended): the SDK already pins a
- Server-side auth: Use
Authorization: Bearer <api_key>with your Cartesia API key (sk_car_...). - Client apps (browser / mobile): Never embed API keys. Have your backend mint a short-lived access token and use
Authorization: Bearer <access_token>- For WebSockets from browsers, pass the token as
?access_token=<token>(headers are not available on WS handshake) - The JS/TS SDK (v3+) runs in the browser with an access token — prefer it over hand-rolling the WebSocket (see its Browser Examples below); don't assume the SDK is server-only
- See Access Token API
- For WebSockets from browsers, pass the token as
- Errors: For
Cartesia-Version2026-03-01 and newer, errors are structured JSON (error_code,title,message,request_id, optionaldoc_url)- Older versions may return legacy plain-text or legacy JSON structures
- See API Errors and API conventions
- Source of truth: Prefer docs since they are updated first before SDKs / plugins / integrations
- Fetch docs as Markdown: append
.mdto anydocs.cartesia.aipage to get the agent-readable Markdown (e.g.https://docs.cartesia.ai/api-reference/stt/transcribe.md); the bare URL is the human HTML page. Prefer the.mdform when fetching docs programmatically - For machine index:
llms.txtandllms-full.txt
- Fetch docs as Markdown: append
- Optional MCP: hosted server
https://mcp.cartesia.ai/mcp(OAuth via the Playground) lists voices, runs TTS/STT, clones, and manages pronunciation dictionaries in Cursor / Claude- MCP does not replace API / SDKs for production
- Local stdio (
uvx cartesia-mcp) is for development; see MCP docs
Text-to-speech with Sonic (generating audio)
- Choosing a TTS model: See TTS models for current model IDs, supported languages, and features. Don't trust a model ID from memory — training data goes stale (e.g.
sonic-2is no longer current) - Voice IDs: Don't invent a voice ID — a made-up UUID won't resolve. Real voice IDs are stable, so hardcoding a real one as a constant is fine and common; copy one from the playground or List Voices. Use List Voices to discover/choose a voice, not as a required call on every request
- Choosing an endpoint — bytes vs WebSocket: if the text is known up front (a fixed string, a button press), use
POST /tts/bytes— it streams audio back as it's generated and is simpler. Reach for the WebSocket only when the input text arrives incrementally (e.g. piping an LLM's token stream) — the continuations case. Don't default to WebSockets; compare them in TTS endpoints - Output audio format: See TTS output audio format for containers/encodings/sample rates (
wav+pcm_s16le@ 44.1 kHz is a safe, self-contained default;mp3carries no separateencoding)
Speech-to-text with Ink (transcribing audio)
- Choosing an STT model: see STT models for current models and supported languages
- Choosing an API endpoint: see Compare STT Endpoints
- Input audio: see STT input encodings for supported formats (self-contained files like
.wavcarry their own header) - Before you write any STT code: read Common STT Pitfalls
- Don't assume model or API behavior without grounding it in the docs — small client-side mistakes cause obscure but severe accuracy degradation
- Common client-side errors:
- Stripping or inserting whitespace in transcripts (read the model's text verbatim — no
.strip(), no normalization) - Improperly concatenating transcript pieces
- Not following the API spec
- Stripping or inserting whitespace in transcripts (read the model's text verbatim — no
Cartesia Python SDK
pip install cartesia
Replace /heads/main/ with /tags/vX.X.X/ (e.g. /tags/v3.2.0/) to source code specific to your SDK version.
Cartesia TypeScript / JavaScript SDK
npm i @cartesia/cartesia-js
Replace /heads/main/ with /tags/vX.X.X/ (e.g. /tags/v3.2.0/) to source code specific to your SDK version.
When to use which path
| Goal | Path |
|---|---|
| App or backend calling REST/WebSocket | Python SDK, JS/TS SDK, or native API requests / fetch |
| IDE agent with MCP | Hosted https://mcp.cartesia.ai/mcp + docs fallback |
| Deployed voice agent, Line, telephony | cartesia-line |
| OpenClaw bootstrap | https://cartesia.sh/openclaw.md then docs / llms.txt |
Quick start (HTTP TTS, one-shot)
Shape only: confirm field names and enums against the API reference for your Cartesia-Version:
curl -X POST "https://api.cartesia.ai/tts/bytes" \
-H "Authorization: Bearer $CARTESIA_API_KEY" \
-H "Cartesia-Version: 2026-03-01" \
-H "Content-Type: application/json" \
-d '{
"model_id": "sonic-3",
"transcript": "Hello from Cartesia.",
"voice": { "id": "f786b574-daa5-4673-aa0c-cbe3e8534c02" },
"output_format": {
"container": "wav",
"encoding": "pcm_s16le",
"sample_rate": 44100
},
"language": "en"
}' \
--output /tmp/out.wav
Mental model (for LLMs)
- Sonic = TTS model used to generate speech
- Ink = STT model used to transcribe audio
- Line = separate product: you deploy your Python agent; Cartesia runs STT/TTS/telephony around it, different from "call TTS API from my server."
- Concurrency / quota: Handle
429-class and structuredconcurrency_limited/quota_exceededper API errors.
Language vs locale vs accent
Do not collapse these:
- language — coarse code (
en,es) - locale — language-region bucket (
en-US,en-GB) - accent — a specific voice identity inside a locale
One locale can have many accents. en-US includes General American and Southern American. Country cannot pick a unique accent. Prefer catalog IDs from the API over display names when the client will persist or send a value back.
Related material in this repo
- Line voice agents: cartesia-line
- Link hub: references/resources.md
Common mistakes
- Overriding the SDK's
Cartesia-Version: with an SDK, don't set or override the version — it pins one it's tested against; upgrade the SDK to move versions. Only raw HTTP/WS callers send the date themselves, and then keep one date everywhere (wrong date → subtle breakage or legacy error shapes). - API keys in frontend code: use short-lived access tokens minted by your backend.
- Wrong auth header style: examples use
Authorization: Bearer; match current docs, not old snippets. - Stale SDK / model code from memory: training data lags the API. Model IDs drift (e.g.
sonic-2), and the JS SDK's namedimport { CartesiaClient }is deprecated and won't run in browsers — useimport Cartesia from "@cartesia/cartesia-js"(or the default import). Confirm models against the models docs and SDK usage against the linked README / examples. - Using this skill for
cartesia deploy/ Line: switch to cartesia-line.