curl -X POST "https://api.hooked.so/v1/render" \
-H "x-api-key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"projectId": "cm4x9k2p10001ab12cd34ef56",
"webhook": "https://example.com/hooked/webhook?token=YOUR_SECRET"
}'
const response = await fetch("https://api.hooked.so/v1/render", {
method: "POST",
headers: {
"x-api-key": process.env.HOOKED_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
projectId: "cm4x9k2p10001ab12cd34ef56",
webhook: "https://example.com/hooked/webhook?token=YOUR_SECRET",
}),
});
const { data } = await response.json();
console.log("Render started, video ID:", data.videoId);
import os
import requests
response = requests.post(
"https://api.hooked.so/v1/render",
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
json={
"projectId": "cm4x9k2p10001ab12cd34ef56",
"webhook": "https://example.com/hooked/webhook?token=YOUR_SECRET",
},
)
data = response.json()["data"]
print("Render started, video ID:", data["videoId"])
{
"success": true,
"data": {
"videoId": "cm4xa1b2c0007ab12mn34op56",
"projectId": "cm4x9k2p10001ab12cd34ef56",
"status": "STARTED"
},
"message": "Render started successfully"
}
{
"success": false,
"message": "There is nothing on the timeline to render yet"
}
{
"success": false,
"message": "Missing projectId"
}
{
"code": "not_authenticated",
"message": "Not authenticated",
"errorCode": "NOT_AUTHENTICATED",
"details": { "x-api-key": "Header not provided or API Key invalid" }
}
{
"success": false,
"message": "The project uses files that do not belong to this team"
}
{
"success": false,
"message": "Project not found"
}
Render Project
Render one of your projects again from its editor timeline
curl -X POST "https://api.hooked.so/v1/render" \
-H "x-api-key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"projectId": "cm4x9k2p10001ab12cd34ef56",
"webhook": "https://example.com/hooked/webhook?token=YOUR_SECRET"
}'
const response = await fetch("https://api.hooked.so/v1/render", {
method: "POST",
headers: {
"x-api-key": process.env.HOOKED_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
projectId: "cm4x9k2p10001ab12cd34ef56",
webhook: "https://example.com/hooked/webhook?token=YOUR_SECRET",
}),
});
const { data } = await response.json();
console.log("Render started, video ID:", data.videoId);
import os
import requests
response = requests.post(
"https://api.hooked.so/v1/render",
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
json={
"projectId": "cm4x9k2p10001ab12cd34ef56",
"webhook": "https://example.com/hooked/webhook?token=YOUR_SECRET",
},
)
data = response.json()["data"]
print("Render started, video ID:", data["videoId"])
{
"success": true,
"data": {
"videoId": "cm4xa1b2c0007ab12mn34op56",
"projectId": "cm4x9k2p10001ab12cd34ef56",
"status": "STARTED"
},
"message": "Render started successfully"
}
{
"success": false,
"message": "There is nothing on the timeline to render yet"
}
{
"success": false,
"message": "Missing projectId"
}
{
"code": "not_authenticated",
"message": "Not authenticated",
"errorCode": "NOT_AUTHENTICATED",
"details": { "x-api-key": "Header not provided or API Key invalid" }
}
{
"success": false,
"message": "The project uses files that do not belong to this team"
}
{
"success": false,
"message": "Project not found"
}
Overview
Every create endpoint renders its project on its own once generation finishes, so you do not need this call to get a first video. Use it to render a project again:- after editing it in the Hooked editor, or through Edit Project (captions, music, logo);
- after a render failed (
video.statusisFAILED).
videoId. Follow it with Get Video Details, or pass a webhook: the project’s original webhook is not reused, so pass it again if you want a call for this render. Get Project shows the latest video under video.
curl -X POST "https://api.hooked.so/v1/render" \
-H "x-api-key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"projectId": "cm4x9k2p10001ab12cd34ef56",
"webhook": "https://example.com/hooked/webhook?token=YOUR_SECRET"
}'
const response = await fetch("https://api.hooked.so/v1/render", {
method: "POST",
headers: {
"x-api-key": process.env.HOOKED_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
projectId: "cm4x9k2p10001ab12cd34ef56",
webhook: "https://example.com/hooked/webhook?token=YOUR_SECRET",
}),
});
const { data } = await response.json();
console.log("Render started, video ID:", data.videoId);
import os
import requests
response = requests.post(
"https://api.hooked.so/v1/render",
headers={"x-api-key": os.environ["HOOKED_API_KEY"]},
json={
"projectId": "cm4x9k2p10001ab12cd34ef56",
"webhook": "https://example.com/hooked/webhook?token=YOUR_SECRET",
},
)
data = response.json()["data"]
print("Render started, video ID:", data["videoId"])
{
"success": true,
"data": {
"videoId": "cm4xa1b2c0007ab12mn34op56",
"projectId": "cm4x9k2p10001ab12cd34ef56",
"status": "STARTED"
},
"message": "Render started successfully"
}
{
"success": false,
"message": "There is nothing on the timeline to render yet"
}
{
"success": false,
"message": "Missing projectId"
}
{
"code": "not_authenticated",
"message": "Not authenticated",
"errorCode": "NOT_AUTHENTICATED",
"details": { "x-api-key": "Header not provided or API Key invalid" }
}
{
"success": false,
"message": "The project uses files that do not belong to this team"
}
{
"success": false,
"message": "Project not found"
}
Errors
| Status | Message | Cause |
|---|---|---|
| 400 | Invalid JSON body | The body is not valid JSON. |
| 400 | Missing projectId | projectId not sent. |
| 400 | webhook: Must be a valid HTTPS URL | The webhook is not a valid URL or points to a private host. |
| 400 | There is nothing on the timeline to render yet | The project has not finished generating, or its timeline is empty. Wait for the project to finish. |
| 400 | Subscription not found | Your team has no billing record. Contact support. |
| 401 | code: "not_authenticated" | Missing or invalid x-api-key. |
| 403 | code: "entitlement_required" | Your team does not have the Hooked app product. |
| 403 | The project uses files that do not belong to this team | The timeline references files of another team. |
| 404 | Project not found | The ID does not exist or belongs to another team. |
| 500 | API Render Error in renderMedia | The render could not start. Retry later. |
Related
Get Project
Get Video Details
Webhooks
Authorizations
Headers
Makes the request safe to retry. 1-255 printable ASCII characters, one per operation (your job id, or a UUID you store), reused on every retry. Within 24 hours the same key with the same body answers with the first response and the header Idempotent-Replayed: true, without running or charging again. Keys are scoped to your team and the endpoint. 5xx answers and refusals before anything ran (401, 402, 403, 409, 429) are not kept. See Idempotency.
1 - 255^[\x20-\x7E]+$Body
A project of your team (the projectId a create endpoint answered). It must have finished generating.
"cm4x9k2p10001ab12cd34ef56"
HTTPS URL on a public host, called when this render completes or fails. The project's original webhook is not reused: pass it again to be called for this render. Requests are signed: verify the Hooked-Signature header (HMAC-SHA256 of ".") with the signing secret from Settings → Webhooks; Hooked-Event and Hooked-Delivery headers name the event and the delivery. No redirects are followed; 10 s timeout; 3 immediate attempts. See the Webhooks guide for the payload.