> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rime.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrate from Arcana to Coda

> Cloud Arcana requests switch to Coda on August 15, 2026 at 12:00 UTC. The request shape does not change.

Cloud Arcana requests switch to [Coda](/docs/models#coda) on August 15, 2026 at 12:00 UTC. Before then, update cloud traffic that sets `modelId` to `arcana`, `arcanav2`, or `arcanav3`.

<Warning>**Check your voices before you plan anything else.** Coda serves 56 of Arcana's 64 featured voices, or 87%. If your voice is not on Coda, choose a replacement and compare it on your own text before switching. Start with [step 2](#step-2-check-every-voice-you-use). Rime's write-up on [how the Coda voices were chosen](https://www.rime.ai/resources/how-we-chose-the-voices-of-coda) explains how the lineup was curated.</Warning>

<Note>Plan your cutover against 12:00 UTC rather than against a local calendar date. If you operate outside the Americas, the switch lands in the middle of your working day on August 15, not at the end of it. Moving earlier gives you room to test on your own schedule. See the [sunset notice](/docs/arcana-sunset) for the summary.</Note>

<Note>This guide covers cloud API traffic. Existing Arcana on-prem images remain available and are not part of this cutover.</Note>

## The request does not change

Coda and Arcana share the same endpoints, parameters, and transports. Nothing about the shape of your request needs to change:

|                                                 | Arcana                                                                  | Coda      |
| :---------------------------------------------- | :---------------------------------------------------------------------- | :-------- |
| HTTP                                            | `POST https://users.rime.ai/v1/rime-tts`                                | identical |
| WebSocket, JSON framing                         | `wss://users-ws.rime.ai/ws3`                                            | identical |
| WebSocket, raw audio                            | `wss://users-ws.rime.ai/ws`                                             | identical |
| Request parameters                              | `text`, `speaker`, `modelId`, `lang`, `samplingRate`, `timeScaleFactor` | identical |
| Word timestamps                                 | English and Spanish only                                                | identical |
| Text normalization, `spell()`, speed adjustment | ✅                                                                       | ✅         |
| Pronunciation control, custom pauses            | ❌                                                                       | ❌         |

`speedAlpha` also behaves the same on both: above 1.0 is faster. Only Mist v2 inverts it, so that caveat does not apply here. See [Speed](/docs/speed).

So the only edit to your request body is the value of `modelId`, and possibly `speaker` and `lang`. Three things change, and all three are about the voice.

## What changes

Most featured Arcana speakers are also served by Coda. Check every speaker you use in the Coda catalog rather than assuming that a shared model API means a shared voice lineup.

Whichever voice you land on determines `lang`. Every Coda voice serves exactly one language and none crosses between them, so Coda covers eight languages but a Coda voice does not. Picking a language narrows which voices you can use; see [the language note on Voices](/docs/voices#languages).

Even where a name survives, the audio differs. Coda and Arcana are trained separately, so a shared name is a starting point rather than a guarantee, and you should compare before you switch.

## Step 1: find everywhere you set a model

Three identifiers resolve to Arcana and all three are affected: `arcana`, `arcanav2`, and `arcanav3`. Search your code, configuration files, environment variables, and per-environment deploys for all three.

Requests that omit `modelId` resolve to Mist v3 and are unaffected. This is a common false alarm, so confirm which of your call sites actually set the parameter before treating them as work.

<Warning>**No response header names the model that served a request, and the API returns no request or correlation ID.** You cannot confirm from a response that a call stopped using Arcana. Coverage is established by inventory and configuration review across every environment, language, and transport you use, not by inspecting a reply. Record which environments you checked, because that record is the only evidence you will have.</Warning>

## Step 2: check every voice you use

Search the [Coda catalog](/docs/voices-coda) for each Arcana speaker you use. Two outcomes:

**The name is there.** Keep it and go to [step 4](#step-4-hear-the-difference-before-you-switch). The name survives; the sound still changes.

**The name is not there.** Expect this for voices outside Arcana's featured set, since Coda's catalog was chosen for the styles customers ask for most rather than assembled by porting everything. Choose a replacement from the same language section, matching on the attributes the catalog publishes for every voice: gender, age, and country. Then compare candidates on your own text. Rime's write-up on [how the Coda voices were chosen](https://www.rime.ai/resources/how-we-chose-the-voices-of-coda) explains the four style categories the lineup is organized around.

The catalog's `dialect`, `demographic`, `genre`, and `styles` fields are populated for roughly a third to a half of Coda voices, so they cannot be relied on to narrow a search. To hear candidates rather than read about them, use the [Rime dashboard](https://app.rime.ai) or ask an assistant connected to the [hosted MCP server](/docs/mcp) to synthesize a line with each.

## Step 3: check your language has a destination

For cloud migrations, Coda serves the following Arcana languages:

| Language   | Coda voices |
| :--------- | ----------: |
| English    |         121 |
| Spanish    |          25 |
| Japanese   |          10 |
| Portuguese |           8 |
| German     |           7 |
| Arabic     |           6 |
| French     |           5 |
| Hindi      |           2 |

Hindi uses different voice names on Coda. Arcana serves `anaya`, `anil`, and `arya`, while Coda serves `nadi` and `taru`.

## Step 4: hear the difference before you switch

Synthesize the same sentence with both voices and listen before you commit. Set `RIME_API_KEY` in your shell; your key stays on the machine running these commands and is never placed in a URL.

```bash theme={null}
export RIME_API_KEY="your-key"
TEXT="Thanks for calling. Can I get your account number to pull that up?"

# The voice you use today
curl -sS -X POST https://users.rime.ai/v1/rime-tts \
  --fail \
  --show-error \
  -H "Authorization: Bearer $RIME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: audio/wav" \
  -d "$(jq -n --arg t "$TEXT" '{text:$t, speaker:"celeste", modelId:"arcana", lang:"eng"}')" \
  --output before.wav

# The candidate replacement
curl -sS -X POST https://users.rime.ai/v1/rime-tts \
  --fail \
  --show-error \
  -H "Authorization: Bearer $RIME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: audio/wav" \
  -d "$(jq -n --arg t "$TEXT" '{text:$t, speaker:"celeste", modelId:"coda", lang:"eng"}')" \
  --output after.wav
```

Play both and compare. Use text from your own product rather than a generic sentence: the differences that matter usually show up on your domain vocabulary, your numbers, and your longest utterances, not on a greeting.

Both requests must name a supported combination of `speaker`, `modelId`, and `lang`. An unsupported combination does not reliably return an error, so a file that plays does not by itself prove the pairing was valid. Check the voice against the [Coda catalog](/docs/voices-coda) first.

## Step 5: stage the cutover

Move a slice of traffic rather than all of it. Put the `modelId` value behind a flag or an environment variable so it can be changed and reverted without a deploy, then raise the share of Coda traffic while watching whatever quality signal you already collect: call completion, transfer or escalation rate, replay complaints, or your own evaluation set.

Do one environment at a time and keep the previous value revertible until the deadline. Because no response identifies the serving model, your flag state is the record of what is live.

## Step 6: verify before the deadline

Confirm, per environment:

1. No call site sets `arcana`, `arcanav2`, or `arcanav3`, including configuration and environment variables.
2. Every `speaker` you now send is listed on Coda for the `lang` you send with it.
3. Each language you use was exercised at least once, since behavior and voice availability differ by language.
4. Each transport you use was exercised, since HTTP and the two WebSocket endpoints are separate paths.

One request does not establish coverage across languages and transports. Treat the matrix of language times transport as the unit of verification.

## After August 15

An unrecognized `modelId` resolves to Mist v3 rather than returning an error, so a cloud call site you missed may keep working while producing a different voice than you intended. Nothing will alert you, which is why step 6 checks configuration instead of waiting for failures.

If you are not finished, contact [support@rime.ai](mailto:support@rime.ai) before the date rather than after.

## Related

* [Coda voices](/docs/voices-coda): the full catalog to choose replacements from, grouped by language.
* [Models](/docs/models#coda): what Coda supports and how cloud and on-prem availability differ.
* [Speed](/docs/speed): `timeScaleFactor` is the parameter Rime recommends going forward for Coda.
