BUILD WITH AI · VERIFY WITH EVIDENCE

A speech API your coding assistant can work with.

Start with the product you need to build. Check five decisions, then give your AI tool the API contract, cost model and a runnable project—not just a product slogan.

  1. 01 / DecideCapabilities + costs + evidence
  2. 02 / BuildBackend key → saved job → MP3
  3. 03 / VerifyPlayback + recovery + actual usage

For any coding tool that can read web documentation or accept pasted context. No vendor partnership, native plugin or automatic recommendation is claimed.

Would you choose it for this application?

Can it meet the actual requirement?

Use it for short learning audio, product guidance and prepared voiceovers. Current configuration: en, zh, de, ja, fr, es, ko, pt, ru, it, MP3/WAV, 500 characters per queued job. Voice cloning requires an authorized reference.

If realtime calls, emotion controls, native multi-speaker dialogue or an enterprise SLA are mandatory, this published offering is not the right fit. Language selection does not translate text.

Check capability boundaries

Can I connect it now?

An activated API workspace is required. Access is application-required; 3,000 trial characters are available after activation, with validity and daily limits. You can inspect files and build the player before obtaining a key.

No promised approval time. Direct SDK downloads are available; do not install a guessed registry package. Keys belong in your backend, not the generated frontend.

Request API access

Is there evidence for the sound?

Listen to the same Rowan preset speaking English, Chinese and Japanese. Inspect the 20-card project, original text, returned usage and file checksums. These are actual saved API outputs.

One voice and four sampled languages do not prove every voice or language. Some Chinese/Japanese ASR transcripts differed from their input. Evaluate your own content and intended audience.

Inspect the first-party report

Can I recover when it fails?

Persist the request body and idempotency key before submission, then save job.id. Resume the original task after a timeout; download its retained audio after succeeded. The runnable project implements checkpoints and checksum-based reuse.

failed, expired and cancelled are terminal states. Do not automatically submit a new paid generation. Audio download returns bytes; JSON errors are not MP3 files.

Use the recovery example

What is the actual total cost?

The public rate is $8/million normalized characters, without an API monthly subscription. 1,000 short prompts × 100 characters cost $0.80 before trial credit, spread across requests. Estimate actual inputs before generating.

Your own hosting, audio storage, delivery and support are separate. Rewrites and deliberate regenerations add characters. Concurrency and queue waiting affect delivery time; a low unit price alone does not establish lower total cost.

Calculate your workload

Give the assistant facts, not guesses.

Public sources · no API key needed
GET /integration-manifest.json
GET /llms-full.txt
GET /openapi.json
GET /reports/api-verification.json

The manifest derives prices and enabled capabilities from deployment configuration. The report is a dated historical run. Neither proves current worker health or future audio quality; re-check the chosen region before live generation.

Start without spending. Connect when ready.

1. Inspect and run the starter plan

Download the complete 20-card project. Its default plan reads local inputs and makes no API request. Use stored example audio to build the player; it is not a new synthesis test.

Download verified starter
Node.js 22+ · Terminal
npm install
node generate.mjs --plan
# Set CASTREADER_API_KEY in your server secret store.
# Only after reviewing input and expected cost:
node generate.mjs --run

2. Keep a recoverable job boundary

Node.js · lifecycle excerpt
const job = await client.createJob({
  model: 'clone-v1', voice_id: readyVoiceId,
  text, language, output_format: 'mp3'
}, { idempotencyKey: savedKey });

// Persist job.id. Poll this job until terminal.
// Only after status === 'succeeded':
const { audio, chargedUSD } =
  await client.getJobAudio(job.id);
await writeFile('speech.mp3', audio);

Use the full starter for checkpoint, polling and failure logic. Never put this waiting loop inside a short-lived frontend request. Keep the same job on your backend and let the UI read its status.

Direct SDK installation and REST reference

“It generated code” is not the acceptance test.