Referencia
Referencia de la API
API v1 de Chasca: JSON sobre HTTPS con claves de API de tipo Bearer. El trabajo que lleva tiempo (la generación, los cambios y las ediciones) devuelve un 202 con un registro en cola que puedes consultar con polling o seguir por streaming.
https://app.trychasca.com/api Autenticación
Todos los endpoints de /v1, excepto los de voces e idiomas, necesitan una clave de API, que se envía como
Authorization: Bearer chk_live_…. Crea las claves en la app, en Settings → API keys.
El acceso a la API empieza en Plus, y los videos generados por API consumen el doble de minutos del plan (2x).
Convenciones
- Los cuerpos son JSON (
Content-Type: application/json). Las marcas de tiempo están en ISO 8601, en UTC. - Las operaciones que quedan en cola devuelven 202; crear una copia devuelve 201, y eliminar, 204.
-
El estado de un video explicativo avanza por
queued → generating → rendering → ready, o termina enfailedcon unerrorlegible.stageyprogress(de 0 a 1) describen el paso en curso entre un estado y el siguiente. - Las URL de los archivos multimedia están firmadas y expiran después de aproximadamente una semana. Vuelve a solicitar el video explicativo para obtener enlaces nuevos.
Endpoints
POST /v1/explainer
Pone en cola un nuevo video explicativo. Devuelve 202 con el registro en cola.
| Campo | Tipo | Descripción |
|---|---|---|
input | string | Qué explicar: un tema, una pregunta o el texto completo de un documento (hasta 200,000 caracteres). Alias: prompt. Es obligatorio enviar input, source o sceneGraph. |
length | string | number | "M:SS" (como "1:30") o segundos, en múltiplos de 30 hasta 1800 (30 minutos). Por encima de 360, el video se cuenta en capítulos. Omítelo para que la duración sea automática. Alias: lengthSeconds. |
aspect | string | 16:9 (predeterminado), 9:16 o 1:1. |
voice | string | El id de un narrador, como chasca:sulafat (predeterminado) o chasca:kore. Todos los narradores hablan todos los idiomas. Consulta Voces. |
language | string | Código del idioma de la narración, por ejemplo, en, es-419 o ja. Consulta Idiomas. |
source | string | Texto de origen en el que se basa la explicación (hasta 400,000 caracteres). El guion se mantiene fiel a ese texto. |
preset | string | Estilo de dibujo: marker (predeterminado), chalkboard, pencil, blueprint, crayon o clean. |
fillMode | string | Cómo entra el color después de cada contorno: A fundido, B barrido, C relleno por zonas (predeterminado), D garabato. |
hand | string | Una mano que dibuja la pizarra, con el lápiz en cada línea mientras aparece: marker-light, marker-medium, marker-dark, pencil o sketch, off, o auto (predeterminado: una mano solo cuando la petición pide verla). |
pace | string | relaxed, balanced (predeterminado) o brisk. |
music | boolean | Agrega música de fondo suave bajo la narración. Valor predeterminado: false. |
sceneGraph | object | Omite el paso de escritura y renderiza tu propio grafo de escenas (escenas con narración, título y elementos). |
curl -X POST https://app.trychasca.com/api/v1/explainer \
-H "Authorization: Bearer $CHASCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "How does compound interest snowball?",
"length": "1:30",
"aspect": "9:16",
"voice": "chasca:sulafat",
"language": "en",
"preset": "chalkboard",
"pace": "balanced"
}' {
"id": "0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60",
"status": "queued",
"stage": null,
"progress": 0,
"title": null,
"prompt": "How does compound interest snowball?",
"lengthSeconds": 90,
"voice": "chasca:sulafat",
"language": "en",
"aspect": "9:16",
"preset": "chalkboard",
"fillMode": "C",
"pace": "balanced",
"music": false,
"videoUrl": null,
"posterUrl": null,
"subtitlesUrl": null,
"durationSeconds": null,
"watermarked": false,
"sceneGraph": null,
"headVersionId": null,
"source": null,
"error": null,
"createdVia": "api",
"createdAt": "2026-09-23T09:14:02.118Z",
"updatedAt": "2026-09-23T09:14:02.118Z"
} GET /v1/explainer/:id
Un video explicativo con todo: el estado, videoUrl, posterUrl, subtitlesUrl, el
sceneGraph editable, los tiempos de cada escena en scenes y todas las entradas de
versions.
curl https://app.trychasca.com/api/v1/explainer/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60 \
-H "Authorization: Bearer $CHASCA_API_KEY" {
"id": "0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60",
"status": "ready",
"stage": null,
"progress": 1,
"title": "How compound interest snowballs",
"lengthSeconds": 90,
"durationSeconds": 88.4,
"videoUrl": "https://app.trychasca.com/media/explainers/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60/v1/video.mp4?exp=1790000000&sig=…",
"posterUrl": "https://app.trychasca.com/media/explainers/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60/v1/poster.jpg?exp=1790000000&sig=…",
"subtitlesUrl": "https://app.trychasca.com/media/explainers/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60/v1/subtitles.vtt?exp=1790000000&sig=…",
"sceneGraph": {
"title": "How compound interest snowballs",
"language": "en",
"scenes": [
{
"id": "s1",
"heading": "THE MONEY THAT GROWS ITSELF",
"narration": "Picture planting a tiny seed…",
"elements": [
{ "id": "seed", "type": "icon", "icon": "seedling", "label": "SEED", "revealWord": "seed" }
]
}
]
},
"scenes": [
{ "id": "s1", "index": 0, "heading": "THE MONEY THAT GROWS ITSELF", "start": 0, "duration": 19.3 }
],
"versions": [
{
"id": "5f1d…",
"number": 1,
"status": "ready",
"note": null,
"changedScenes": [],
"videoUrl": "https://app.trychasca.com/media/…",
"durationSeconds": 88.4,
"minutesCharged": 2.947,
"createdAt": "2026-09-23T09:14:02.301Z",
"readyAt": "2026-09-23T09:14:49.870Z",
"error": null
}
],
"shareUrl": null,
"error": null
} GET /v1/explainer?limit=50
Tus videos explicativos, del más reciente al más antiguo. limit va de 1 a 100 y su valor predeterminado es 50. Los resúmenes no incluyen el grafo de escenas ni las versiones.
curl "https://app.trychasca.com/api/v1/explainer?limit=20" \
-H "Authorization: Bearer $CHASCA_API_KEY" {
"explainers": [
{ "id": "0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60", "status": "ready", "title": "How compound interest snowballs", "durationSeconds": 88.4, "createdAt": "2026-09-23T09:14:02.118Z" }
]
} POST /v1/explainer/:id/change
Un solo cambio en un video explicativo terminado; todo lo demás queda exactamente como estaba. El cuerpo es un único cambio, que se elige con kind:
captions:captions(true o false) y, opcionalmente,captionStyle(pop,bold,clean,marker,typewriterostory).style:preset,fillModeo ambos.hand:hand, el id de una mano uoff.music:music(true o false).logoocredit:position, comotop-right(una línea de créditos también puede ir entop-centerobottom-center), uoff. A partir de Pro.voice:voicey, opcionalmente,pace.aspect:aspect,16:9,9:16o1:1.
Devuelve 202. Los subtítulos, el estilo, la música, el logo y la línea de créditos crean una nueva
versión gratuita de este video, { "made": "version", "version": { ... } }: conserva la narración y no
consume minutos, y cuando su status llega a ready, el videoUrl del video
explicativo apunta a ella. Una voz o un formato nuevos crean un video explicativo aparte a partir del mismo guion y
los mismos dibujos, que se cobra como un video nuevo: { "made": "video", "explainer": { ... } }.
curl -X POST https://app.trychasca.com/api/v1/explainer/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60/change \
-H "Authorization: Bearer $CHASCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "kind": "style", "preset": "chalkboard" }' {
"made": "version",
"version": {
"id": "5d0e93b4-…",
"number": 2,
"status": "queued",
"note": "Board style: Chalkboard",
"changedScenes": [],
"videoUrl": null,
"posterUrl": null,
"durationSeconds": null,
"minutesCharged": 0,
"createdAt": "2026-09-23T09:20:11.004Z",
"readyAt": null,
"error": null
}
} POST /v1/explainer/:id/edit
Cambia tú mismo las palabras o los dibujos: obtén el video explicativo, edita su sceneGraph y envíalo de
vuelta como { "sceneGraph": { ... } }. Devuelve 202 con la versión en cola. Solo se
vuelven a dibujar las escenas que cambiaron, y la primera vez que vuelves a renderizar cada video es gratis. Espera a
que el status de la versión llegue a ready; a partir de ese momento, el
videoUrl del video explicativo apunta a ella.
# graph.json: { "sceneGraph": { ... } }, the explainer's sceneGraph with your changes
curl -X POST https://app.trychasca.com/api/v1/explainer/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60/edit \
-H "Authorization: Bearer $CHASCA_API_KEY" \
-H "Content-Type: application/json" \
-d @graph.json {
"id": "8a2c7e10-…",
"number": 3,
"status": "queued",
"note": null,
"changedScenes": [],
"videoUrl": null,
"posterUrl": null,
"durationSeconds": null,
"minutesCharged": 0,
"createdAt": "2026-09-23T09:24:37.512Z",
"readyAt": null,
"error": null
} POST /v1/explainer/:id/revert
Restaura como actual una versión anterior ya terminada. Cuerpo: { "versionId": "..." }. Devuelve el video explicativo.
curl -X POST https://app.trychasca.com/api/v1/explainer/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60/revert \
-H "Authorization: Bearer $CHASCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "versionId": "5f1d…" }' POST /v1/explainer/:id/duplicate
Copia un video explicativo, con su grafo de escenas y todo lo demás, para que puedas llevarlo por otro camino. Devuelve 201 con la copia.
curl -X POST https://app.trychasca.com/api/v1/explainer/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60/duplicate \
-H "Authorization: Bearer $CHASCA_API_KEY" DELETE /v1/explainer/:id
Elimina un video explicativo. Devuelve 204 sin cuerpo.
curl -X DELETE https://app.trychasca.com/api/v1/explainer/0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60 \
-H "Authorization: Bearer $CHASCA_API_KEY" GET /v1/explainer/events
Un flujo de Server-Sent Events
con un mensaje event: status por cada cambio de estado de cualquiera de tus videos explicativos. Mantén
una conexión abierta en lugar de hacer polling.
curl -N https://app.trychasca.com/api/v1/explainer/events \
-H "Authorization: Bearer $CHASCA_API_KEY" event: status
data: {"type":"status","explainerId":"0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60","status":"generating","stage":"storyboard","progress":0.3}
event: status
data: {"type":"status","explainerId":"0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60","status":"rendering","stage":"drawing","progress":0.72}
event: status
data: {"type":"status","explainerId":"0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60","status":"ready","stage":null,"progress":1} GET /v1/voices No requiere clave
El catálogo de voces. Todos los narradores hablan todos los idiomas, así que la lista es la misma en cualquier idioma.
Cada voz tiene un tone, un group y una preview_url. Más información en la página
Voces.
curl "https://app.trychasca.com/api/v1/voices" {
"default": "chasca:sulafat",
"voices": [
{
"id": "chasca:sulafat",
"name": "Sulafat",
"description": "Warm and natural, like a favorite teacher. The all-purpose default.",
"tone": "Warm",
"group": "warm",
"language": "en",
"gender": "female",
"isDefault": true,
"multilingual": true,
"kind": "narrator",
"preview_url": "https://app.trychasca.com/api/v1/voices/chasca%3Anova/preview.mp3"
},
{
"id": "edge:es-MX-DaliaNeural",
"name": "Dalia",
"description": "Friendly, Positive. Native es-MX speaker.",
"language": "es-MX",
"gender": "female",
"isDefault": false,
"multilingual": false,
"kind": "native",
"preview_url": "https://app.trychasca.com/api/v1/voices/edge%3Aes-MX-DaliaNeural/preview.mp3"
}
]
} GET /v1/languages No requiere clave
Todos los idiomas de narración. Los idiomas beta llevan menos tiempo en el modelo de voz, así que la calidad de la narración puede variar.
curl https://app.trychasca.com/api/v1/languages {
"languages": [
{ "code": "en", "label": "English", "native": "English", "beta": false },
{ "code": "es-419", "label": "Spanish (Latin America)", "native": "Español (Latinoamérica)", "beta": false },
{ "code": "pa", "label": "Punjabi", "native": "ਪੰਜਾਬੀ", "beta": true }
]
} GET /v1/account/state
A quién pertenece la clave y cuántos videos ha creado su titular.
curl https://app.trychasca.com/api/v1/account/state \
-H "Authorization: Bearer $CHASCA_API_KEY" { "videosGenerated": 14, "image": null, "isAdmin": false, "name": "Ada Lovelace" } GET /v1/billing/status
El plan asociado a la clave y en qué punto del periodo estás: minutos usados y restantes y lo que incluye
el plan. Las cuentas gratuitas reciben en su lugar videoAllowance, videosUsed y
videosRemaining.
curl https://app.trychasca.com/api/v1/billing/status \
-H "Authorization: Bearer $CHASCA_API_KEY" {
"plan": "pro",
"planLabel": "Pro",
"billingInterval": "monthly",
"status": "active",
"trialStatus": null,
"quotaMinutes": 200,
"bonusMinutes": 0,
"minutesUsedThisPeriod": 41.5,
"minutesRemaining": 158.5,
"periodStart": "2026-09-01T00:00:00.000Z",
"periodEnd": "2026-10-01T00:00:00.000Z",
"cancelAtPeriodEnd": false,
"overageEnabled": false,
"overagePerMinute": 0.5,
"pricePerMonth": 49.99,
"maxLengthSeconds": 1800,
"entitlements": { "api": true, "branding": true, "voiceClone": true, "priority": false, "watermark": false, "maxLength": 1800, "videoAllowance": null }
} GET /config No requiere clave
Configuración pública para clientes: dónde están el sitio, la app y la API.
curl https://app.trychasca.com/api/config {
"authEnforced": true,
"googleEnabled": false,
"requireEmailVerification": false,
"siteUrl": "https://trychasca.com",
"appUrl": "https://app.trychasca.com",
"apiUrl": "https://app.trychasca.com/api",
"devMail": false
} GET /health No requiere clave
Comprobación de que el servicio está activo, para balanceadores de carga y monitores de disponibilidad.
curl https://app.trychasca.com/api/health { "status": "ok", "service": "chasca-api", "time": "2026-09-23T09:14:00.000Z", "db": "postgres", "tts": "edge", "llmConfigured": true } Errores
Todos los errores tienen la misma forma, con un code estable y legible por máquinas, y un mensaje que puedes mostrar a tus usuarios:
{
"error": true,
"code": "api_requires_plan",
"message": "API and MCP access start on the Plus plan.",
"status": 402
} | Estado | Código | Significado |
|---|---|---|
| 400 | bad_request, empty_input, bad_voice | La solicitud está mal formada o no indica qué explicar. |
| 400 | instruction_edits_retired | Una edición envió una instrucción en lenguaje natural. Envía un solo cambio o un grafo de escenas editado. |
| 401 | unauthenticated | Falta la clave, o es incorrecta o fue revocada. |
| 402 | api_requires_plan, branding_requires_plan | El acceso a la API y a MCP empieza en Plus; los cambios de logo y de línea de créditos, en Pro. |
| 402 | minutes_exhausted, minutes_short | No quedan minutos en este periodo, o no alcanzan para la duración que pediste. |
| 404 | not_found | No hay ningún video explicativo con ese id en tu cuenta. |
| 409 | still_rendering, no_changes | El video se está renderizando, o el cambio o la edición no modifican nada. |
| 409 | no_logo, no_credit_line | Todavía no hay un logo o una línea de créditos que colocar. Agrega el que falte en la app, en Settings → Branding. |
| 429 | rate_limited | Demasiadas solicitudes. Espera el tiempo que indica el encabezado Retry-After y vuelve a intentarlo. |
| 500 | internal | Es un error nuestro. Los detalles quedan registrados en nuestros sistemas y nunca se exponen. |
Límites de frecuencia
- Generación, cambios y ediciones (
POST /v1/explainer,…/change,…/edit): 20 solicitudes por minuto. - Todo lo demás: 200 solicitudes por minuto.
-
Si superas el límite, recibes 429
rate_limitedcon un encabezadoRetry-Afterque indica los segundos de espera. El SDK reintenta las solicitudes de lectura una vez, tras esa espera, y la expone en los errores comoretryAfter.