Référence
Référence de l’API
L’API Chasca v1 : du JSON sur HTTPS, avec des clés API envoyées en Bearer. Les opérations qui prennent du temps (génération, changements et modifications) renvoient un 202 avec un enregistrement en file d’attente, que vous pouvez suivre par polling ou en streaming.
https://app.trychasca.com/api Authentification
Tous les endpoints /v1, sauf ceux des voix et des langues, exigent une clé API, envoyée sous la forme
Authorization: Bearer chk_live_…. Créez vos clés dans l’application, sous Settings → API keys.
L’accès à l’API commence avec l’offre Plus, et les générations via l’API comptent double sur les minutes de l’offre.
Conventions
- Les corps sont en JSON (
Content-Type: application/json). Les horodatages sont au format ISO 8601, en UTC. - Un traitement mis en file d’attente renvoie 202 ; la création d’une copie renvoie 201 ; une suppression renvoie 204.
-
Le statut d’une vidéo explicative passe par
queued → generating → rendering → ready, ou se termine parfailedavec un message lisible danserror.stageetprogress(de 0 à 1) indiquent où en est le traitement entre deux statuts. - Les URL des médias sont signées et expirent au bout d’une semaine environ. Récupérez de nouveau la vidéo explicative pour obtenir des liens à jour.
Endpoints
POST /v1/explainer
Met en file d’attente une nouvelle vidéo explicative. Renvoie 202 avec l’enregistrement en file d’attente.
| Champ | Type | Description |
|---|---|---|
input | string | Ce qu’il faut expliquer : un sujet, une question ou le texte intégral d’un document (jusqu’à 200 000 caractères). Alias : prompt. L’un des champs input, source ou sceneGraph est obligatoire. |
length | string | number | "M:SS" (par exemple "1:30") ou un nombre de secondes, multiple de 30, jusqu’à 1800 (30 minutes). Au-delà de 360, la vidéo est racontée en chapitres. Omettez ce champ pour une durée automatique. Alias : lengthSeconds. |
aspect | string | 16:9 (par défaut), 9:16 ou 1:1. |
voice | string | Un identifiant de narrateur, comme chasca:sulafat (par défaut) ou chasca:kore. Chaque narrateur parle toutes les langues. Voir Voix. |
language | string | Code de la langue de narration, par exemple en, es-419, ja. Voir Langues. |
source | string | Texte source sur lequel s’appuie l’explication (jusqu’à 400 000 caractères). Le script lui reste fidèle. |
preset | string | Style de dessin : marker (par défaut), chalkboard, pencil, blueprint, crayon ou clean. |
fillMode | string | Manière dont la couleur s’applique après chaque contour : A fondu, B balayage, C lavis par zone (par défaut), D gribouillis. |
hand | string | Une main qui dessine le tableau, le crayon sur chaque trait à mesure qu’il apparaît : marker-light, marker-medium, marker-dark, pencil ou sketch, off, ou auto (par défaut : une main seulement quand la demande veut la voir). |
pace | string | relaxed, balanced (par défaut) ou brisk. |
music | boolean | Ajoute un fond musical discret sous la narration. Valeur par défaut : false. |
sceneGraph | object | Permet de sauter l’étape d’écriture et de générer la vidéo à partir de votre propre graphe de scènes (des scènes avec narration, titre et éléments). |
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
Une vidéo explicative avec toutes ses données : statut, videoUrl, posterUrl,
subtitlesUrl, le sceneGraph modifiable, le minutage de chaque scène dans scenes,
et toutes les entrées 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
Vos vidéos explicatives, de la plus récente à la plus ancienne. limit va de 1 à 100 (50 par défaut). Les résumés n’incluent ni le graphe de scènes ni les versions.
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
Applique un seul changement à une vidéo explicative terminée ; tout le reste demeure exactement tel quel. Le corps décrit ce changement, dont le type est donné par kind :
captions:captions(true ou false), et éventuellementcaptionStyle(pop,bold,clean,marker,typewriteroustory).style:preset,fillMode, ou les deux.hand:hand, l’id d’une main ouoff.music:music(true ou false).logooucredit:position, par exempletop-right(une mention de crédit peut aussi se placer entop-centerou enbottom-center), ouoff. Dès l’offre Pro.voice:voice, et éventuellementpace.aspect:aspect, soit16:9,9:16ou1:1.
Renvoie 202. Les sous-titres, le style, la musique, le logo et la mention de crédit créent gratuitement une
nouvelle version de cette vidéo, { "made": "version", "version": { ... } } : elle garde la narration et ne
consomme aucune minute, et dès que son status passe à ready, le videoUrl de la vidéo
explicative pointe vers elle. Une nouvelle voix ou un nouveau format crée une vidéo explicative distincte à partir du même
script et des mêmes dessins, facturée comme une nouvelle vidéo : { "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
Changez vous-même les mots ou les dessins : récupérez la vidéo explicative, modifiez son sceneGraph et
renvoyez-le sous la forme { "sceneGraph": { ... } }. Renvoie 202 avec la version en file
d’attente. Seules les scènes modifiées sont redessinées, et la première régénération de chaque vidéo est gratuite. Attendez
que le status de la version passe à ready ; le videoUrl de la vidéo explicative pointe
alors vers cette version.
# 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
Rétablit une version antérieure terminée comme version courante. Corps : { "versionId": "..." }. Renvoie la vidéo explicative.
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
Copie une vidéo explicative, graphe de scènes compris, pour la faire évoluer dans une autre direction. Renvoie 201 avec la copie.
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
Supprime une vidéo explicative. Renvoie 204 sans corps.
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 flux Server-Sent Events
qui envoie un message event: status à chaque changement de statut de l’une de vos vidéos explicatives.
Gardez une seule connexion ouverte plutôt que de faire du 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 Aucune clé requise
Le catalogue des voix. Chaque narrateur parle toutes les langues : la liste est donc la même pour chacune d’elles.
Chaque voix a un tone, un group et une preview_url. Plus de détails sur la page
Voix.
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 Aucune clé requise
Toutes les langues de narration. Les langues beta ont été ajoutées plus récemment au modèle de synthèse vocale : la qualité de la narration peut donc varier.
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
Le titulaire de la clé et le nombre de vidéos qu’il a créées.
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
L’offre associée à la clé et où vous en êtes sur la période : minutes utilisées et restantes et
fonctionnalités incluses. Les comptes gratuits reçoivent à la place videoAllowance,
videosUsed et 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 Aucune clé requise
La configuration publique destinée aux clients : où se trouvent le site, l’application et l’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 Aucune clé requise
Contrôle de disponibilité pour les répartiteurs de charge et les outils de surveillance.
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 } Erreurs
Toutes les erreurs ont la même forme, avec un code stable, exploitable par programme, et un message que vous pouvez afficher à vos utilisateurs :
{
"error": true,
"code": "api_requires_plan",
"message": "API and MCP access start on the Plus plan.",
"status": 402
} | Statut | Code | Signification |
|---|---|---|
| 400 | bad_request, empty_input, bad_voice | La requête est mal formée ou n’indique pas quoi expliquer. |
| 400 | instruction_edits_retired | Une modification a été envoyée sous forme d’instruction en langage naturel. Envoyez un changement, ou un graphe de scènes modifié. |
| 401 | unauthenticated | Aucune clé, ou une clé incorrecte ou révoquée. |
| 402 | api_requires_plan, branding_requires_plan | L’accès à l’API et au serveur MCP commence avec l’offre Plus ; les changements de logo et de mention de crédit, avec l’offre Pro. |
| 402 | minutes_exhausted, minutes_short | Plus aucune minute disponible sur la période en cours, ou pas assez pour la durée demandée. |
| 404 | not_found | Aucune vidéo explicative avec cet identifiant sur votre compte. |
| 409 | still_rendering, no_changes | La vidéo est en cours de génération, ou le changement ou la modification n’a aucun effet. |
| 409 | no_logo, no_credit_line | Il n’y a pas encore de logo ou de mention de crédit à placer. Ajoutez ce qu’il manque dans l’application, sous Settings → Branding. |
| 429 | rate_limited | Trop de requêtes. Attendez le délai indiqué par l’en-tête Retry-After, puis réessayez. |
| 500 | internal | Erreur de notre côté. Les détails sont consignés dans nos journaux, jamais divulgués. |
Limites de débit
- Générations, changements et modifications (
POST /v1/explainer,…/change,…/edit) : 20 requêtes par minute. - Tout le reste : 200 requêtes par minute.
-
Au-delà de la limite, vous recevez une erreur 429
rate_limitedavec un en-têteRetry-Afterexprimé en secondes. Le SDK relance une fois les requêtes de lecture après ce délai, et l’expose dans les erreurs sous le nomretryAfter.