Getting started
The Faceless API turns a narration script into a finished faceless video (AI visuals, TTS voiceover, captions) and publishes it to connected YouTube, TikTok, Instagram, X, Facebook, LinkedIn and Threads accounts. This guide takes you from an empty terminal to a published video.
Base URL: https://faceless.so/api/v1. Every response uses one envelope: { "success": true, "data": ..., "pagination"? } on success, { "success": false, "error": { "type", "message" } } on failure.
1. Create an API key
Create a key in the dashboard, in your team settings at https://faceless.so/team. Pick the scopes the key needs; for this guide use catalog:read, videos:read, videos:write and posts:write. Keys look like fl_live_... and the full key is shown once at creation, so store it somewhere safe (an environment variable or secret manager).
export FACELESS_API_KEY=fl_live_...
2. Verify auth with /me
GET /me works with any valid key and returns your team, credit balance, plan and the scopes granted to the key.
curl -s https://faceless.so/api/v1/me \
-H "Authorization: Bearer $FACELESS_API_KEY"
Or with the CLI:
npm install -g faceless-cli
faceless login # or rely on the FACELESS_API_KEY env var
faceless whoami --json
3. Pick a voice
Every video needs a TTS voice for the narration. List the catalog and note a voice id:
curl -s https://faceless.so/api/v1/voices \
-H "Authorization: Bearer $FACELESS_API_KEY"
faceless voices --json
Other catalogs (visual styles, niches, models with their credit costs) live at GET /options?kind=...; see faceless options.
4. Create a video
POST /videos takes a finished script and starts generation. Credits are charged now, at creation: 20 for storyboard, 50 for motion_lite, 100 for motion_pro. The call returns immediately with the video id.
curl -s -X POST https://faceless.so/api/v1/videos \
-H "Authorization: Bearer $FACELESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"script": "Did you know the ocean has lakes and rivers of its own? ...", "voiceId": "EXAVITQu4vr4xnSDxMaL", "model": "storyboard"}'
faceless videos create --script "Did you know..." --voice-id EXAVITQu4vr4xnSDxMaL --model storyboard --wait --json
5. Poll until generation completes
Poll GET /videos/{id}/status every 10 to 30 seconds until status is completed (or failed; check errorMessages). The CLI's --wait flag in step 4 does this for you.
curl -s https://faceless.so/api/v1/videos/<videoId>/status \
-H "Authorization: Bearer $FACELESS_API_KEY"
6. Render the MP4
Rendering is a separate, free step. POST /videos/{id}/render returns a renderId; poll GET /renders/{renderId} every 5 to 15 seconds until status is done, which includes the final MP4 url.
curl -s -X POST https://faceless.so/api/v1/videos/<videoId>/render \
-H "Authorization: Bearer $FACELESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"codec": "h264"}'
curl -s https://faceless.so/api/v1/renders/<renderId> \
-H "Authorization: Bearer $FACELESS_API_KEY"
faceless videos render <videoId> --wait --json
7. Publish
Publishing is free. Post the rendered video to a connected platform now:
curl -s -X POST https://faceless.so/api/v1/posts \
-H "Authorization: Bearer $FACELESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"videoId": "<videoId>", "platform": "youtube", "title": "The ocean has rivers underwater"}'
faceless posts publish --video-id <videoId> --platform youtube --title "The ocean has rivers underwater" --json
Connecting accounts (OAuth) happens in the web app, not over the API; GET /accounts lists what is connected. For future-dated posting see publishing and scheduling.
Next steps
- Authentication and scopes
- Videos for the full lifecycle in detail
- Series to automate a whole channel
- CLI and MCP
- Full endpoint reference: /developers/reference or https://faceless.so/llms.txt for agents