Skip to main content

Quickstart

From nothing to a rendered video in seven requests. Every sample here runs as written once you set BOTLOBBY_API_KEY.

1. Create a key

In the web app, go to Settings → API Keys and create one. Two things to know:

  • The key is shown exactly once. Only a SHA-256 hash is stored, so a lost key cannot be recovered — mint a new one and revoke the old.
  • API access is a top-tier plan feature. If the button sends you to pricing, that is why.

Leave the default scopes (read and generate) selected — they cover everything on this page.

export BOTLOBBY_API_KEY="bl_live_..."

2. Check the key works

Cheapest possible request, and it needs no scope at all:

curl -s https://api.botlobby.ai/v1/api-keys/introspect \
-H "Authorization: Bearer $BOTLOBBY_API_KEY"
{
"active": true,
"subject": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"scopes": ["read", "generate"]
}

A 401 here means the key is wrong — see Errors.

3. Check your balance

Generation spends credits, so know what you have:

curl -s https://api.botlobby.ai/v1/users/credits \
-H "Authorization: Bearer $BOTLOBBY_API_KEY"

Spend against total_credits.

4. Pick a persona

A persona is the voice and models a video is generated with. Every content item needs one.

curl -s https://api.botlobby.ai/v1/personas \
-H "Authorization: Bearer $BOTLOBBY_API_KEY"

Take an id from items. If the list is empty, create one in the web app or see Working with personas.

5. Create the content

This generates the script, so it costs credits.

curl -s -X POST https://api.botlobby.ai/v1/contents \
-H "Authorization: Bearer $BOTLOBBY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"full_text": "The James Webb telescope found water vapour on K2-18b",
"persona_id": "PERSONA_ID_FROM_STEP_4",
"title": "Water on a distant world"
}'
The id is nested

The response is {"message": ..., "item": {"id": ..., "title": ...}} — read item.id, not id.

{
"message": "Content generated successfully",
"item": { "id": "22222222-2222-4222-8222-222222222222", "title": "Water on a distant world" }
}

Keep item.id — call it CONTENT_ID. Everything below uses it.

6. Generate the voiceover

curl -s -X POST https://api.botlobby.ai/v1/gen/tts \
-H "Authorization: Bearer $BOTLOBBY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"creation_id": "CONTENT_ID"}'

Asynchronous. Poll until the status reaches AUDIO_PROCESSED:

curl -s https://api.botlobby.ai/v1/gen/task-status/CONTENT_ID \
-H "Authorization: Bearer $BOTLOBBY_API_KEY"

7. Render the video

Pick a background first:

curl -s https://api.botlobby.ai/v1/gen/static-videos \
-H "Authorization: Bearer $BOTLOBBY_API_KEY"
No id field

The response has name, not id. name is the video_id the renderer wants — "1" means static-videos/1.mp4.

You can also skip the list entirely and pass a visual-source sentinel: stock, web_search, generate or custom.

curl -s -X POST https://api.botlobby.ai/v1/gen/video \
-H "Authorization: Bearer $BOTLOBBY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"creation_id": "CONTENT_ID",
"video_id": "stock",
"orientation": "vertical"
}'

Poll task-status again until VIDEO_PROCESSED. Then fetch the content item to get a signed video_url:

curl -s https://api.botlobby.ai/v1/contents/CONTENT_ID \
-H "Authorization: Bearer $BOTLOBBY_API_KEY"

That URL is time-limited — fetch it fresh rather than storing it.

Where to go next