Documentación / CLI y SDK

Herramientas

CLI y SDK

Dos capas ligeras y tipadas sobre la API: el SDK, para el código que crea videos, y la CLI chasca, para tu terminal, tus scripts y tu CI.

URL base https://app.trychasca.com/api

Configuración

Instala la CLI y el SDK desde npm (Node 20 o posterior):

Terminal
# the chasca command
npm install -g @chasca/cli

# the SDK, in your project
npm install @chasca/sdk

La CLI y el SDK leen las mismas dos variables de entorno:

Terminal
export CHASCA_API_URL=https://app.trychasca.com/api
export CHASCA_API_KEY=chk_live_...

CHASCA_API_URL es opcional; por defecto es https://app.trychasca.com/api. Las claves se crean en la app, en Settings → API keys (Plus y planes superiores).

La CLI chasca

Terminal
# list voices (no key needed)
chasca voices

# create a 30-second vertical video and wait for it
chasca generate "How does a heat pump work?" --length 0:30 --aspect 9:16 --wait

# check on a video
chasca status 0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60

# change one thing and wait for it: subtitles, style, reveal, music, logo, credit, voice or format
chasca change 0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60 subtitles off --wait

# a new voice or format makes a separate video, charged like one
chasca change 0b9c6f2e-5d1a-4c3e-9a47-2f8e1c7d4b60 format 9:16 --wait

# your latest videos
chasca list --limit 20
  • --length acepta M:SS en tramos de 30 segundos, hasta 30:00.
  • --aspect puede ser 16:9, 9:16 o 1:1.
  • --wait mantiene el comando en ejecución hasta que el video (o la nueva versión) esté listo.
  • chasca change <id> <what> <value> cambia una sola cosa: subtitles, style, reveal, music, watermark, logo, credit, voice o format. Una voz o un formato nuevos crean un video aparte, que se cobra como uno nuevo.
  • --json imprime la respuesta de la API sin procesar, muy útil para pasarla a jq.

El SDK de TypeScript

@chasca/sdk funciona en cualquier entorno donde exista fetch (Bun, Node 20+). Cada respuesta se valida con los mismos contratos que usa la API, y los fallos se lanzan como un único tipo de error, ChascaError, con un code estable. Tu clave se mantiene privada y nunca aparece en los mensajes de error.

make-a-video.ts
import { ChascaClient, ChascaError } from '@chasca/sdk';

const chasca = new ChascaClient({
  apiKey: process.env.CHASCA_API_KEY!,
  baseUrl: process.env.CHASCA_API_URL ?? 'https://app.trychasca.com/api',
});

// 1. queue a video (202) and wait until it is ready
const job = await chasca.createExplainer({
  input: 'How vaccines train the immune system',
  length: '1:30',
  aspect: '16:9',
  preset: 'chalkboard',
});
const video = await chasca.waitForExplainer(job.id, {
  onUpdate: (e) => console.log(e.status, e.stage, Math.round(e.progress * 100) + '%'),
});
console.log(video.videoUrl);

// 2. change one thing: a free new version of the same video, with the same narration
const change = await chasca.changeExplainer(video.id, { kind: 'style', preset: 'pencil' });
if (change.made === 'version') {
  const updated = await chasca.waitForVersion(video.id, change.version.id);
  console.log(updated.videoUrl);
}

// 3. errors are typed
try {
  await chasca.getExplainer('not-a-real-id');
} catch (err) {
  if (err instanceof ChascaError) console.error(err.status, err.code, err.message);
}

También puedes editar el grafo de escenas directamente y guardarlo como una nueva versión:

edit-graph.ts
// edit the scene graph directly: rename a heading, then commit it as a new version
const current = await chasca.getExplainer(video.id);
const graph = structuredClone(current.sceneGraph!);
graph.scenes[0]!.heading = 'THE SNOWBALL EFFECT';
const v3 = await chasca.editExplainerGraph(video.id, graph);
await chasca.waitForVersion(video.id, v3.id);

Métodos

Métodos de ChascaClient
Método Qué hace
createExplainer(params) POST /v1/explainer. Pone en cola un video y devuelve el registro en cola.
waitForExplainer(id, options?) Hace polling hasta que el estado es ready (se resuelve) o failed (lanza un error). Opciones: intervalMs, timeoutMs, onUpdate.
getExplainer(id) GET /v1/explainer/:id con el grafo de escenas, las escenas y las versiones.
listExplainers({ limit }) GET /v1/explainer, del más reciente al más antiguo (limit de 1 a 100).
changeExplainer(id, change) POST …/change con un solo cambio. Devuelve { made: "version", version } o, para una voz o un formato nuevos, { made: "video", explainer }.
editExplainerGraph(id, sceneGraph) POST …/edit con un grafo de escenas editado; devuelve la versión en cola.
waitForVersion(id, versionId, options?) Hace polling hasta que esa versión está lista; se resuelve con el video explicativo actualizado.
revertExplainer(id, versionId) POST …/revert. Restaura como actual una versión anterior ya terminada.
duplicateExplainer(id) POST …/duplicate. Devuelve la copia.
deleteExplainer(id) DELETE /v1/explainer/:id.
listVoices({ language }) GET /v1/voices. Todos los narradores, cada uno con una muestra de audio.
listLanguages() GET /v1/languages.

El constructor es new ChascaClient({ apiKey, baseUrl }). Todos los métodos aceptan un { signal } opcional para que puedas cancelar con un AbortController.