Skip to content

Async API

Our new asynchronous polling-style API is built specifically to enable easy integration of long duration video workflows.

Create the following main.py

main.py
import json
import os
import sys
import time
import requests
from requests.adapters import HTTPAdapter, Retry
prodia_token = os.getenv('PRODIA_TOKEN')
prodia_url = 'https://inference.prodia.com/v2/job/async'
session = requests.Session()
retries = Retry(allowed_methods=None, status_forcelist=Retry.RETRY_AFTER_STATUS_CODES)
session.mount('http://', HTTPAdapter(max_retries=retries))
session.mount('https://', HTTPAdapter(max_retries=retries))
session.headers.update({'Authorization': f"Bearer {prodia_token}"})
headers = {
'Accept': 'video/mp4',
}
job = json.loads('''{
"type": "inference.veo.fast.txt2vid.v1",
"config": {
"prompt": "Running in the woods with a dog.",
"aspect_ratio": "16:9",
"resolution": "720p",
"generate_audio": true
}
}''')
res = session.post(prodia_url, headers=headers, json=job)
print(f"Request ID: {res.headers['x-request-id']}")
print(f"Status: {res.status_code}")
if res.status_code != 201:
print(res.text)
sys.exit(1)
job = res.json()
job_id = job['id']
job_status = job['state']['current']
print(f"Job ID: {job_id}")
print(f"Job Status: {job_status}")
while job_status == 'processing':
time.sleep(1)
res = session.get(f"{prodia_url}/{job_id}/job.state.current")
if res.status_code != 200:
print(res.text)
sys.exit(1)
job_status = res.text
print(f"Job Status: {job_status}")
if job_status != 'processed':
res = session.get(f"{prodia_url}/{job_id}/job.json")
if res.status_code != 200:
print(res.text)
sys.exit(1)
print(res.json())
sys.exit(1)
res = session.get(f"{prodia_url}/{job_id}/output/video.mp4")
if res.status_code != 200:
print(res.text)
sys.exit(1)
with open('output.mp4', 'wb') as f:
f.write(res.content)
print('Output file: output.mp4')