@reeloop/sdk
v0.1.0
Published
Official TypeScript client for the Reeloop API - generate videos, poll status, publish, verify webhooks.
Maintainers
Readme
@reeloop/sdk
Official TypeScript client for the Reeloop API - generate faceless/UGC videos, poll renders, publish to connected social accounts, and verify webhooks.
Install
npm install @reeloop/sdkQuickstart
import { ReeloopClient } from "@reeloop/sdk";
const reeloop = new ReeloopClient(process.env.REELOOP_API_KEY!); // fl_...
// Instant mode: charge credits and render immediately.
const { jobId } = await reeloop.generate({
topic: "5 facts about the ocean nobody knows",
style: "documentary",
voice: "charlotte",
duration: "30",
mode: "instant",
});
const done = await reeloop.waitForCompletion(jobId);
console.log(done.finalVideoUrl);Test mode (sandbox)
Mint a test key (fl_test_...) in Dashboard > Settings by ticking "Test key (sandbox)". Test keys run the full request path - auth, rate limits, validation, idempotency, webhooks - but every render is simulated: no provider calls, no credits consumed, and the job completes immediately with a sample video. Build and exercise your polling/webhook flow end-to-end for free, then swap in a live key.
const sandbox = new ReeloopClient("fl_test_...");
const res = await sandbox.generate({ topic: "anything", mode: "instant" });
// => { jobId, status: "completed", sandbox: true }Webhooks
Pass webhookUrl to generate() and verify the signature on receipt:
import { verifyWebhookSignature } from "@reeloop/sdk";
// rawBody must be the RAW request body string, not re-serialized JSON.
const payload = verifyWebhookSignature(rawBody, headers["x-reeloop-signature"], process.env.REELOOP_WEBHOOK_SECRET!);
if (!payload) return new Response("bad signature", { status: 401 });Idempotency
generate() sends a fresh Idempotency-Key per call, so a network retry replays the original response instead of double-charging. Pass your own key (opts.idempotencyKey) to dedupe across separate calls.
Notes
- Director mode (default) creates a free draft parked at
awaiting_approval; approving it currently requires the dashboard session. API integrations should usemode: "instant". - Always check
renderStatus/finalVideoUrlon status responses - a job can readstatus: "completed"with a failed (refunded) render.waitForCompletion()handles this for you. - Full REST reference: https://reeloop.ai/docs/api
