cURL
curl --fail-with-body --request POST \
--url "$XPILOT_API_BASE_URL/v1/video-agents/conversations/%3Cconversation_id%3E/renders" \
--header "Authorization: Bearer $XPILOT_API_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: lesson-request-001' \
--data '{"force":false}'const response = await fetch(process.env.XPILOT_API_BASE_URL + "/v1/video-agents/conversations/%3Cconversation_id%3E/renders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.XPILOT_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "lesson-request-001",
},
body: JSON.stringify({
"force": false
}),
});
const result = await response.json();
if (!response.ok) throw new Error(JSON.stringify(result));
console.log(result);import os, json, requests
response = requests.request(
"POST",
os.environ["XPILOT_API_BASE_URL"] + "/v1/video-agents/conversations/%3Cconversation_id%3E/renders",
headers={
"Authorization": "Bearer " + os.environ["XPILOT_API_KEY"],
"Content-Type": "application/json",
"Idempotency-Key": "lesson-request-001",
},
json=json.loads("{\"force\":false}"),
timeout=70,
)
print(response.status_code, response.text)
response.raise_for_status(){
"data": {
"conversation_id": "<conversation_id>",
"render_id": "<render_id>",
"message_id": "<message_id>",
"status": "running",
"progress": 0,
"video_url": null,
"created_at": null
}
}{
"error": {
"code": "invalid_parameter",
"message": "Check parameter types, required fields and idempotency key."
},
"request_id": "<request_id>"
}{
"error": {
"code": "invalid_token",
"message": "Use an active scoped API Key. MCP OAuth tokens cannot call REST."
},
"request_id": "<request_id>"
}{
"error": {
"code": "insufficient_credits",
"message": "The balance cannot cover the platform reserve, or the credential monthly budget is used up."
},
"request_id": "<request_id>"
}{
"error": {
"code": "insufficient_scope",
"message": "Check the credential scope and resource ownership."
},
"request_id": "<request_id>"
}{
"error": {
"code": "not_found",
"message": "Use an existing owned conversation, message, brand kit or render ID."
},
"request_id": "<request_id>"
}{
"error": {
"code": "idempotency_conflict",
"message": "The same idempotency key must use the exact same input. A conversation may already be busy."
},
"request_id": "<request_id>"
}{
"error": {
"code": "rate_limited",
"message": "Credential/workspace rate or concurrency limit reached. Respect Retry-After before retrying.",
"retry_after": 60
},
"request_id": "<request_id>"
}Renders
Create render
Export an MP4 once preview_video_url is available (409 preview_not_ready otherwise). A preview is not an export. Retrying with the same Idempotency-Key returns the same render. Poll get render until completed.
POST
/
v1
/
video-agents
/
conversations
/
{conversation_id}
/
renders
cURL
curl --fail-with-body --request POST \
--url "$XPILOT_API_BASE_URL/v1/video-agents/conversations/%3Cconversation_id%3E/renders" \
--header "Authorization: Bearer $XPILOT_API_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: lesson-request-001' \
--data '{"force":false}'const response = await fetch(process.env.XPILOT_API_BASE_URL + "/v1/video-agents/conversations/%3Cconversation_id%3E/renders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.XPILOT_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "lesson-request-001",
},
body: JSON.stringify({
"force": false
}),
});
const result = await response.json();
if (!response.ok) throw new Error(JSON.stringify(result));
console.log(result);import os, json, requests
response = requests.request(
"POST",
os.environ["XPILOT_API_BASE_URL"] + "/v1/video-agents/conversations/%3Cconversation_id%3E/renders",
headers={
"Authorization": "Bearer " + os.environ["XPILOT_API_KEY"],
"Content-Type": "application/json",
"Idempotency-Key": "lesson-request-001",
},
json=json.loads("{\"force\":false}"),
timeout=70,
)
print(response.status_code, response.text)
response.raise_for_status(){
"data": {
"conversation_id": "<conversation_id>",
"render_id": "<render_id>",
"message_id": "<message_id>",
"status": "running",
"progress": 0,
"video_url": null,
"created_at": null
}
}{
"error": {
"code": "invalid_parameter",
"message": "Check parameter types, required fields and idempotency key."
},
"request_id": "<request_id>"
}{
"error": {
"code": "invalid_token",
"message": "Use an active scoped API Key. MCP OAuth tokens cannot call REST."
},
"request_id": "<request_id>"
}{
"error": {
"code": "insufficient_credits",
"message": "The balance cannot cover the platform reserve, or the credential monthly budget is used up."
},
"request_id": "<request_id>"
}{
"error": {
"code": "insufficient_scope",
"message": "Check the credential scope and resource ownership."
},
"request_id": "<request_id>"
}{
"error": {
"code": "not_found",
"message": "Use an existing owned conversation, message, brand kit or render ID."
},
"request_id": "<request_id>"
}{
"error": {
"code": "idempotency_conflict",
"message": "The same idempotency key must use the exact same input. A conversation may already be busy."
},
"request_id": "<request_id>"
}{
"error": {
"code": "rate_limited",
"message": "Credential/workspace rate or concurrency limit reached. Respect Retry-After before retrying.",
"retry_after": 60
},
"request_id": "<request_id>"
}Documentation by X-Pilot
This request starts work that may consume workspace credits. Check credits and capacity before sending it.
video_agents:write. A stable Idempotency-Key is required for exact retries.
Manage API keys · Authentication and recovery

Authorizations
Scoped X-Pilot API key
Headers
Stable key for exact retries only. Use a different key for a different operation or input.
Required string length:
8 - 128Path Parameters
An owned video agent conversation ID.
Body
application/json
Response
Success
