# Get Account Info Source: https://developer.beeble.ai/docs/api-reference/account/get-account-info https://api-dev.modal.beeble.ai/developer-api-docs/openapi.json get /v1/account/info Get account metadata and rate limits (fast, no Stripe calls). # Get Billing Info Source: https://developer.beeble.ai/docs/api-reference/account/get-billing-info https://api-dev.modal.beeble.ai/developer-api-docs/openapi.json get /v1/account/billing Get billing data from Stripe (may be slow due to external API calls). # Get Job Status Source: https://developer.beeble.ai/docs/api-reference/switchx/get-job-status https://api-dev.modal.beeble.ai/developer-api-docs/openapi.json get /v1/switchx/generations/{job_id} Poll the status of a SwitchX job. # List Jobs Source: https://developer.beeble.ai/docs/api-reference/switchx/list-jobs https://api-dev.modal.beeble.ai/developer-api-docs/openapi.json get /v1/switchx/generations List your SwitchX jobs with cursor-based pagination. # Start Generation Source: https://developer.beeble.ai/docs/api-reference/switchx/start-generation https://api-dev.modal.beeble.ai/developer-api-docs/openapi.json post /v1/switchx/generations Start a SwitchX compositing job. # Create Upload URL Source: https://developer.beeble.ai/docs/api-reference/uploads/create-upload-url https://api-dev.modal.beeble.ai/developer-api-docs/openapi.json post /v1/uploads Create a presigned upload URL for a media file. # Authentication Source: https://developer.beeble.ai/docs/authentication How to obtain and use your Beeble API key The Beeble API uses API keys for authentication. Each request must include your API key in the request headers. ## Getting Your API Key Go to [app.beeble.ai](https://app.beeble.ai) and sign in to your account. Go to the [Developer Page](https://app.beeble.ai/developer). In the **API Key** section, click **Issue API Key** to generate a new key. Copy and securely store your API key immediately. For security reasons, you won't be able to view it again. Your API key will only be displayed once upon creation. Make sure to copy and store it in a secure location before closing the dialog. ## Using Your API Key Include your API key in the `x-api-key` header with every request: ```bash cURL theme={null} curl -X POST https://api.beeble.ai/v1/uploads \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"filename": "source.mp4"}' ``` ```python Python theme={null} import requests response = requests.post( "https://api.beeble.ai/v1/uploads", headers={ "x-api-key": "YOUR_API_KEY", "Content-Type": "application/json" }, json={"filename": "source.mp4"} ) ``` ```javascript JavaScript theme={null} const response = await fetch("https://api.beeble.ai/v1/uploads", { method: "POST", headers: { "x-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ filename: "source.mp4" }), }); ``` ## Revoking Your API Key If you need to revoke your API key: 1. Go to the [Developer Page](https://app.beeble.ai/developer) 2. In the **API Key** section, click the **Revoke** button 3. Confirm the revocation After revoking your API key, all requests using that key will be rejected. You can issue a new key at any time. # Errors Source: https://developer.beeble.ai/docs/errors Error codes and error response format The Beeble API uses conventional HTTP status codes and returns structured error responses with machine-readable error codes. ## Error Response Format All errors follow this format: ```json theme={null} { "error": { "message": "Human-readable error description", "code": "ERROR_CODE" } } ``` | Field | Type | Description | | --------- | ------ | --------------------------------------- | | `message` | string | Human-readable description of the error | | `code` | string | Machine-readable error code | *** ## Error Codes ### Validation Errors (400) Returned when request parameters are invalid or missing. | Code | Description | | ------------------------- | -------------------------------------------------------------------------------------- | | `INVALID_GENERATION_TYPE` | `generation_type` must be `"image"` or `"video"` | | `INVALID_ALPHA_MODE` | `alpha_mode` must be `"auto"`, `"fill"`, `"custom"`, or `"select"` | | `INVALID_MAX_RESOLUTION` | `max_resolution` must be `720` or `1080` | | `MISSING_STYLE_INPUT` | Neither `reference_image_uri` nor `prompt` was provided | | `MISSING_SOURCE` | `source_uri` is required | | `MISSING_ALPHA` | `alpha_uri` required when `alpha_mode` is `"custom"` or `"select"` | | `INVALID_FILE_FORMAT` | Source format doesn't match `generation_type` (e.g. video source for image generation) | | `ALPHA_TYPE_MISMATCH` | Alpha type doesn't match source (image vs video) when `alpha_mode` is `"custom"` | | `ALPHA_MUST_BE_IMAGE` | Alpha must be an image (PNG/JPG) when `alpha_mode` is `"select"` | | `SOURCE_TOO_LARGE` | Source resolution exceeds 2,770,000 total pixels (width × height) | | `VIDEO_TOO_MANY_FRAMES` | Video exceeds the maximum of 240 frames | | `INVALID_URI` | URI format invalid or file type could not be determined | | `SOURCE_UNREACHABLE` | Source, alpha, or reference URI is not reachable | | `INVALID_FILENAME` | Filename invalid or unsupported extension | | `INVALID_CALLBACK_URL` | Callback URL is not valid HTTPS or is unreachable | ### Authentication Errors (401) Returned when API key authentication fails. | Code | Description | | ----------------- | ----------------------------- | | `INVALID_API_KEY` | API key is missing or invalid | ### Billing Errors (402) Returned when there is a billing or payment issue with your account. | Code | Description | | ------------------------- | ------------------------------------------------ | | `CREDIT_DEDUCTION_FAILED` | No billing account or no active API subscription | ### Not Found Errors (404) Returned when the requested resource doesn't exist. | Code | Description | | --------------- | ---------------------------------------- | | `JOB_NOT_FOUND` | Job doesn't exist or is not owned by you | ### Rate Limiting (429) Returned when you exceed the request rate limit. | Code | Description | | --------------------- | ----------------- | | `RATE_LIMIT_EXCEEDED` | Too many requests | ### Server Errors (500) Returned when an internal error occurs. These are not caused by your request. | Code | Description | | ------------------------- | ---------------------------------- | | `INTERNAL_ERROR` | Unexpected server error | | `CREDIT_DEDUCTION_FAILED` | Failed to process credit deduction | | `UPLOAD_URL_FAILED` | Failed to generate upload URL | | `JOB_QUEUE_FAILED` | Failed to queue job for processing | # Overview Source: https://developer.beeble.ai/docs/index Beeble API for AI-powered visual effects ## SwitchX SwitchX is our flagship video-to-video model that lets you switch anything in a scene while perfectly keeping what matters. Unlike standard video generators, SwitchX uses the original pixels to drive the final output. By providing a Source Video, defining an Alpha Mask (to tell the AI what to keep), and providing a Reference Image (to dictate the new look), SwitchX seamlessly generates new elements and relights your original subject to match perfectly. ### How It Works Use the [Uploads API](/api-reference/uploads/create-upload-url) to securely upload your starting materials: The original video you want to transform. Your visual target. While not strictly required, we **always strongly recommend** providing one to achieve the highest quality and most accurate results. A custom mask file. Whether you need to upload this depends entirely on which **alpha\_mode** you choose in the next step. Call the [Generate endpoint](/api-reference/switchx/start-generation) to define your compositing job. Link your uploaded assets and configure the following parameters: Choose how SwitchX handles the scene: | Mode | Description | | :--------- | :-------------------------------------------------------------------------------------------------------- | | **Auto** | The AI automatically detects and masks the foreground subject. | | **Select** | Provide an alpha mask for the **first frame only**, and our AI will propagate it across the entire video. | | **Fill** | Keeps everything in the original scene exactly as it is (no masking applied). | | **Custom** | Provide a full custom video mask for exact **frame-by-frame** control. | *(Recommended)* A text description of the desired output video to further guide the AI on the specific style, lighting, or background details you want to generate. Video generation takes a little time. Check your job's progress by [polling our status endpoint](/api-reference/switchx/get-generation-status), or set up a [webhook callback](/api/webhooks) to get notified the second it finishes. Retrieve the URL from the completed job and download your seamlessly composited, fully relighted final video! *** ## Quick Reference | | | | ------------ | -------------------------- | | **Base URL** | `https://api.beeble.ai/v1` | | **Auth** | `x-api-key` header | *** ## Get Started Make your first API call in minutes Full SwitchX endpoint reference Upload files for SwitchX Get your API key Check your account info and rate limits *** ## LLM-Friendly Docs Build AI-powered integrations using our machine-readable documentation. Concise doc index for LLMs Full documentation content for LLMs # llms.txt Source: https://developer.beeble.ai/docs/llms-txt Machine-readable documentation for LLMs and AI-powered tools We provide [llms.txt](https://llmstxt.org/) files so AI tools and LLMs can easily consume our documentation. ## Available Files Concise index of all documentation pages with summaries. Use this for quick context and discovery. Full documentation content in a single file. Use this when you need complete API details. # Quickstart Source: https://developer.beeble.ai/docs/quickstart Generate a composited video with SwitchX in minutes ## Prerequisites To use the Beeble API, you need an API key. 1. [Sign up](https://app.beeble.ai) if you don't have an account 2. Go to [Developer Page](https://app.beeble.ai/developer) 3. Click **Issue API Key** See [Authentication](/api/authentication) for details on obtaining and using your API key. *** ## Sample Assets Use these sample files to follow along with the quickstart. **Input** Source Video The original video to transform Alpha Mask Custom mask defining what to keep Reference Image The visual target for the new look **Output** Output This example uses `alpha_mode: "custom"` with a custom alpha mask to keep the face and hair while changing the **background** and **clothes** at the same time. Whether you need to upload an alpha mask depends on the `alpha_mode` you choose: | Mode | Alpha Mask Required | | :--------- | :------------------------------------------------------------- | | **auto** | Not needed — the AI detects the foreground automatically | | **fill** | Not needed — keeps everything as-is | | **select** | First-frame alpha only — the AI propagates it across the video | | **custom** | Full video mask required for frame-by-frame control | See the [`alpha_mode` field in Start Generation](/api-reference/switchx/start-generation#body-alpha-mode) for details. *** Create upload URLs for your source video, alpha mask, and reference image. ```bash cURL theme={null} # Upload source video curl -X POST https://api.beeble.ai/v1/uploads \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"filename": "source.mp4"}' # Upload alpha mask curl -X POST https://api.beeble.ai/v1/uploads \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"filename": "alpha.mp4"}' # Upload reference image curl -X POST https://api.beeble.ai/v1/uploads \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"filename": "reference.png"}' ``` ```python Python theme={null} import requests API_KEY = "YOUR_API_KEY" HEADERS = { "x-api-key": API_KEY, "Content-Type": "application/json" } # Create upload URLs for all three assets source_upload = requests.post( "https://api.beeble.ai/v1/uploads", headers=HEADERS, json={"filename": "source.mp4"} ).json() alpha_upload = requests.post( "https://api.beeble.ai/v1/uploads", headers=HEADERS, json={"filename": "alpha.mp4"} ).json() reference_upload = requests.post( "https://api.beeble.ai/v1/uploads", headers=HEADERS, json={"filename": "reference.png"} ).json() ``` ```javascript JavaScript theme={null} const API_KEY = "YOUR_API_KEY"; const headers = { "x-api-key": API_KEY, "Content-Type": "application/json", }; // Create upload URLs for all three assets const [sourceUpload, alphaUpload, referenceUpload] = await Promise.all([ fetch("https://api.beeble.ai/v1/uploads", { method: "POST", headers, body: JSON.stringify({ filename: "source.mp4" }), }).then((r) => r.json()), fetch("https://api.beeble.ai/v1/uploads", { method: "POST", headers, body: JSON.stringify({ filename: "alpha.mp4" }), }).then((r) => r.json()), fetch("https://api.beeble.ai/v1/uploads", { method: "POST", headers, body: JSON.stringify({ filename: "reference.png" }), }).then((r) => r.json()), ]); ``` Then upload each file to its upload URL: ```bash cURL theme={null} curl -X PUT "${SOURCE_UPLOAD_URL}" \ -H "Content-Type: video/mp4" \ --data-binary @source.mp4 curl -X PUT "${ALPHA_UPLOAD_URL}" \ -H "Content-Type: video/mp4" \ --data-binary @alpha.mp4 curl -X PUT "${REFERENCE_UPLOAD_URL}" \ -H "Content-Type: image/png" \ --data-binary @reference.png ``` ```python Python theme={null} # Upload source video with open("source.mp4", "rb") as f: requests.put( source_upload["upload_url"], headers={"Content-Type": "video/mp4"}, data=f ) # Upload alpha mask with open("alpha.mp4", "rb") as f: requests.put( alpha_upload["upload_url"], headers={"Content-Type": "video/mp4"}, data=f ) # Upload reference image with open("reference.png", "rb") as f: requests.put( reference_upload["upload_url"], headers={"Content-Type": "image/png"}, data=f ) ``` ```javascript JavaScript theme={null} const fs = require("fs"); await Promise.all([ fetch(sourceUpload.upload_url, { method: "PUT", headers: { "Content-Type": "video/mp4" }, body: fs.readFileSync("source.mp4"), }), fetch(alphaUpload.upload_url, { method: "PUT", headers: { "Content-Type": "video/mp4" }, body: fs.readFileSync("alpha.mp4"), }), fetch(referenceUpload.upload_url, { method: "PUT", headers: { "Content-Type": "image/png" }, body: fs.readFileSync("reference.png"), }), ]); ``` Start a compositing job with your uploaded assets, a custom alpha mask, and a detailed prompt describing the desired output video. ```bash cURL theme={null} curl -X POST https://api.beeble.ai/v1/switchx/generations \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "generation_type": "video", "source_uri": "'"${SOURCE_BEEBLE_URI}"'", "reference_image_uri": "'"${REFERENCE_BEEBLE_URI}"'", "alpha_uri": "'"${ALPHA_BEEBLE_URI}"'", "alpha_mode": "custom", "prompt": "Subject: A young female racing driver with long, wavy red hair and light skin. She is wearing a red, black, and white racing suit featuring prominent sponsor logos like Red Bull, Ferrari, and Mercedes-Benz. She stands with her arms crossed, facing the camera with a confident, pleasant smile. Lighting: The lighting in this image is defined by a dramatic, warm golden sunset, emanating from the upper left behind the subject. This powerful backlighting creates a striking rim light that catches the subject'"'"'s vibrant red hair, making it appear almost fiery and glowing around her head. Her face is softly shadowed, with a beautiful, natural gradient from the bright, warm highlights on her left cheekbone, nose, and forehead to the deeper, softer shadows across her right side, emphasizing her features. The light source casts long, warm shadows across the pit lane, highlighting the texture of the asphalt and the metallic surfaces of the race car and equipment in the background, which are also bathed in this warm, golden glow. The overall atmosphere is warm, dramatic, and rich with deep golden and orange tones. Mood: Extremely high-energy, adrenaline-fueled, and intense, capturing the raw speed and danger of professional motorsports. The atmosphere is cinematic and dramatic. Background: The background is a high-speed blur of a Formula 1 race track straight. Multiple F1 cars are visible only as streaks of color and motion, hurtling past at speeds exceeding 400 km/h. The entire background, including the track surface, barriers, and distant grandstands, is heavily motion-blurred horizontally, creating a powerful sense of extreme velocity. Colors: A warm palette dominated by the vibrant red of the subject'"'"'s hair and racing suit, contrasting with the black of the uniform. The lighting adds golden/ivory hues. The overall color grading is cinematic and gritty, like a scene from the movie F1, with rich saturation, high contrast, and a sense of dust and heat. Composition: She is positioned off-center to the right and remains in sharp focus. The perspective and the intense motion blur in the background create a dynamic, high-stakes environment, emphasized by the implied slow shutter speed of 1/60th of a second." }' ``` ```python Python theme={null} prompt = """Subject: A young female racing driver with long, wavy red hair \ and light skin. She is wearing a red, black, and white racing suit featuring \ prominent sponsor logos like Red Bull, Ferrari, and Mercedes-Benz. She stands \ with her arms crossed, facing the camera with a confident, pleasant smile. Lighting: The lighting in this image is defined by a dramatic, warm golden \ sunset, emanating from the upper left behind the subject. This powerful \ backlighting creates a striking rim light that catches the subject's vibrant \ red hair, making it appear almost fiery and glowing around her head. Her face \ is softly shadowed, with a beautiful, natural gradient from the bright, warm \ highlights on her left cheekbone, nose, and forehead to the deeper, softer \ shadows across her right side, emphasizing her features. The light source \ casts long, warm shadows across the pit lane, highlighting the texture of \ the asphalt and the metallic surfaces of the race car and equipment in the \ background, which are also bathed in this warm, golden glow. The overall \ atmosphere is warm, dramatic, and rich with deep golden and orange tones. Mood: Extremely high-energy, adrenaline-fueled, and intense, capturing the \ raw speed and danger of professional motorsports. The atmosphere is cinematic \ and dramatic. Background: The background is a high-speed blur of a Formula 1 race track \ straight. Multiple F1 cars are visible only as streaks of color and motion, \ hurtling past at speeds exceeding 400 km/h. The entire background, including \ the track surface, barriers, and distant grandstands, is heavily \ motion-blurred horizontally, creating a powerful sense of extreme velocity. Colors: A warm palette dominated by the vibrant red of the subject's hair \ and racing suit, contrasting with the black of the uniform. The lighting \ adds golden/ivory hues. The overall color grading is cinematic and gritty, \ like a scene from the movie 'F1', with rich saturation, high contrast, and \ a sense of dust and heat. Composition: She is positioned off-center to the right and remains in sharp \ focus. The perspective and the intense motion blur in the background create \ a dynamic, high-stakes environment, emphasized by the implied slow shutter \ speed of 1/60th of a second.""" response = requests.post( "https://api.beeble.ai/v1/switchx/generations", headers=HEADERS, json={ "generation_type": "video", "source_uri": source_upload["beeble_uri"], "reference_image_uri": reference_upload["beeble_uri"], "alpha_uri": alpha_upload["beeble_uri"], "alpha_mode": "custom", "prompt": prompt, } ) job_id = response.json()["id"] ``` ```javascript JavaScript theme={null} const prompt = `Subject: A young female racing driver with long, wavy red \ hair and light skin. She is wearing a red, black, and white racing suit \ featuring prominent sponsor logos like Red Bull, Ferrari, and Mercedes-Benz. \ She stands with her arms crossed, facing the camera with a confident, \ pleasant smile. Lighting: The lighting in this image is defined by a dramatic, warm golden \ sunset, emanating from the upper left behind the subject. This powerful \ backlighting creates a striking rim light that catches the subject's vibrant \ red hair, making it appear almost fiery and glowing around her head. Her face \ is softly shadowed, with a beautiful, natural gradient from the bright, warm \ highlights on her left cheekbone, nose, and forehead to the deeper, softer \ shadows across her right side, emphasizing her features. The light source \ casts long, warm shadows across the pit lane, highlighting the texture of \ the asphalt and the metallic surfaces of the race car and equipment in the \ background, which are also bathed in this warm, golden glow. The overall \ atmosphere is warm, dramatic, and rich with deep golden and orange tones. Mood: Extremely high-energy, adrenaline-fueled, and intense, capturing the \ raw speed and danger of professional motorsports. The atmosphere is cinematic \ and dramatic. Background: The background is a high-speed blur of a Formula 1 race track \ straight. Multiple F1 cars are visible only as streaks of color and motion, \ hurtling past at speeds exceeding 400 km/h. The entire background, including \ the track surface, barriers, and distant grandstands, is heavily \ motion-blurred horizontally, creating a powerful sense of extreme velocity. Colors: A warm palette dominated by the vibrant red of the subject's hair \ and racing suit, contrasting with the black of the uniform. The lighting \ adds golden/ivory hues. The overall color grading is cinematic and gritty, \ like a scene from the movie 'F1', with rich saturation, high contrast, and \ a sense of dust and heat. Composition: She is positioned off-center to the right and remains in sharp \ focus. The perspective and the intense motion blur in the background create \ a dynamic, high-stakes environment, emphasized by the implied slow shutter \ speed of 1/60th of a second.`; const res = await fetch( "https://api.beeble.ai/v1/switchx/generations", { method: "POST", headers, body: JSON.stringify({ generation_type: "video", source_uri: sourceUpload.beeble_uri, reference_image_uri: referenceUpload.beeble_uri, alpha_uri: alphaUpload.beeble_uri, alpha_mode: "custom", prompt, }), } ); const { id: jobId } = await res.json(); ``` **Response (201):** ```json theme={null} { "id": "swx_abc123...", "status": "in_queue", "progress": 0, "generation_type": "video", "alpha_mode": "custom", "output": null, "error": null, "created_at": "2026-02-23T10:00:00Z", "modified_at": "2026-02-23T10:00:00Z", "completed_at": null } ``` Poll the job status until it completes. ```bash cURL theme={null} curl https://api.beeble.ai/v1/switchx/generations/swx_abc123 \ -H "x-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import time while True: result = requests.get( f"https://api.beeble.ai/v1/switchx/generations/{job_id}", headers={"x-api-key": API_KEY} ).json() if result["status"] == "completed": output = result["output"] break if result["status"] == "failed": raise Exception(result.get("error")) time.sleep(5) ``` ```javascript JavaScript theme={null} const sleep = (ms) => new Promise(r => setTimeout(r, ms)); let output; while (true) { const res = await fetch( `https://api.beeble.ai/v1/switchx/generations/${jobId}`, { headers: { "x-api-key": API_KEY } } ); const status = await res.json(); if (status.status === "completed") { output = status.output; break; } if (status.status === "failed") throw new Error(status.error); await sleep(5000); } ``` **Response (completed):** ```json theme={null} { "id": "swx_abc123", "status": "completed", "progress": 100, "generation_type": "video", "alpha_mode": "custom", "output": { "render": "https://cdn.beeble.ai/.../render.mp4", "source": "https://cdn.beeble.ai/.../source.mp4", "alpha": "https://cdn.beeble.ai/.../alpha.mp4" }, "created_at": "2026-02-23T10:00:00Z", "modified_at": "2026-02-23T10:05:00Z", "completed_at": "2026-02-23T10:05:00Z" } ``` Download the composited output. ```bash cURL theme={null} curl -o render.mp4 "https://cdn.beeble.ai/.../render.mp4" ``` ```python Python theme={null} with open("render.mp4", "wb") as f: f.write(requests.get(output["render"]).content) ``` ```javascript JavaScript theme={null} const res = await fetch(output.render); fs.writeFileSync("render.mp4", Buffer.from(await res.arrayBuffer())); ``` Output URLs expire after a limited time. Download results promptly. *** ## Next Steps Full endpoint reference Upload endpoint reference # Webhooks Source: https://developer.beeble.ai/docs/webhooks Receive notifications when jobs complete or fail Instead of polling for job status, provide a `callback_url` when starting a generation to receive a webhook notification when the job completes or fails. ## Using Webhooks Include the `callback_url` parameter in your generation request: ```bash cURL theme={null} curl -X POST https://api.beeble.ai/v1/switchx/generations \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "generation_type": "video", "source_uri": "beeble://uploads/upload_xxx/source.mp4", "reference_image_uri": "https://example.com/ref.png", "alpha_mode": "auto", "callback_url": "https://your-server.com/webhook" }' ``` ```python Python theme={null} import requests response = requests.post( "https://api.beeble.ai/v1/switchx/generations", headers={ "x-api-key": "YOUR_API_KEY", "Content-Type": "application/json" }, json={ "generation_type": "video", "source_uri": "beeble://uploads/upload_xxx/source.mp4", "reference_image_uri": "https://example.com/ref.png", "alpha_mode": "auto", "callback_url": "https://your-server.com/webhook", } ) ``` ```javascript JavaScript theme={null} const response = await fetch("https://api.beeble.ai/v1/switchx/generations", { method: "POST", headers: { "x-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ generation_type: "video", source_uri: "beeble://uploads/upload_xxx/source.mp4", reference_image_uri: "https://example.com/ref.png", alpha_mode: "auto", callback_url: "https://your-server.com/webhook", }), }); ``` ## Webhook Payload When the job completes or fails, a `POST` request will be sent to your `callback_url`. **Success:** ```json theme={null} { "id": "swx_abc123", "status": "completed", "output": { "render": "https://cdn.beeble.ai/.../render.mp4", "source": "https://cdn.beeble.ai/.../source.mp4", "alpha": "https://cdn.beeble.ai/.../alpha.mp4" }, "completed_at": "2026-02-23T10:05:00Z" } ``` **Failure:** ```json theme={null} { "id": "swx_abc123", "status": "failed", "completed_at": "2026-02-23T10:05:00Z", "error": "Processing failed" } ``` Your webhook endpoint should return a `2xx` status code to acknowledge receipt.