Documentação / CLI e SDK

Ferramentas

CLI e SDK

Duas camadas finas e tipadas sobre a API. O SDK para o código que faz vídeos; a CLI chasca para o seu terminal, seus scripts e a sua CI.

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

Configuração

Instale a CLI e o SDK pelo npm (Node 20 ou mais recente):

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

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

A CLI e o SDK leem as mesmas duas variáveis de ambiente:

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

CHASCA_API_URL é opcional; o padrão é https://app.trychasca.com/api. As chaves são criadas no app, em Settings → API keys (a partir do plano Plus).

A 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 aceita M:SS em incrementos de 30 segundos, até 30:00.
  • --aspect aceita 16:9, 9:16 ou 1:1.
  • --wait mantém o comando em execução até o vídeo (ou a nova versão) ficar pronto.
  • chasca change <id> <what> <value> muda só uma coisa: subtitles, style, reveal, music, watermark, logo, credit, voice ou format. Uma voz ou um formato novos geram um vídeo separado, cobrado como um vídeo novo.
  • --json imprime a resposta bruta da API, útil para passar ao jq via pipe.

O SDK para TypeScript

O @chasca/sdk roda em qualquer ambiente que tenha fetch (Bun, Node 20+). Toda resposta é validada com os mesmos contratos que a API usa, e as falhas lançam um único tipo de erro, ChascaError, com um code estável. Sua chave é mantida privada e nunca aparece em mensagens de erro.

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);
}

Você também pode editar o grafo de cenas diretamente e salvá-lo como uma nova versão:

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 do ChascaClient
Método O que faz
createExplainer(params) POST /v1/explainer. Coloca um vídeo na fila e retorna o registro enfileirado.
waitForExplainer(id, options?) Faz polling até o vídeo ficar pronto (resolve) ou falhar (lança um erro). Opções: intervalMs, timeoutMs, onUpdate.
getExplainer(id) GET /v1/explainer/:id, com o grafo de cenas, as cenas e as versões.
listExplainers({ limit }) GET /v1/explainer, do mais recente ao mais antigo (limit de 1 a 100).
changeExplainer(id, change) POST …/change com uma única mudança. Retorna { made: "version", version } ou, para uma voz ou um formato novos, { made: "video", explainer }.
editExplainerGraph(id, sceneGraph) POST …/edit com um grafo de cenas editado; retorna a versão enfileirada.
waitForVersion(id, versionId, options?) Faz polling até essa versão ficar pronta; resolve com o vídeo explicativo atualizado.
revertExplainer(id, versionId) POST …/revert. Torna atual uma versão anterior já concluída.
duplicateExplainer(id) POST …/duplicate. Retorna a cópia.
deleteExplainer(id) DELETE /v1/explainer/:id.
listVoices({ language }) GET /v1/voices. Todos os narradores, cada um com uma prévia.
listLanguages() GET /v1/languages.

O construtor é new ChascaClient({ apiKey, baseUrl }). Todos os métodos aceitam um { signal } opcional, para que você possa cancelar com um AbortController.