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
import jsonimport osimport sysimport time
import requestsfrom 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')Create the following main.js
const axios = require('axios');const axiosRetry = require('axios-retry').default;const fs = require('node:fs');
async function main() { axiosRetry(axios, { retries: 3, retryCondition: (error) => { return [413, 429, 503].includes(error.response.status); }, });
let job = { "type": "inference.veo.fast.txt2vid.v1", "config": { "prompt": "Running in the woods with a dog.", "aspect_ratio": "16:9", "resolution": "720p", "generate_audio": true } };
let res = await axios({ method: 'POST', url: 'https://inference.prodia.com/v2/job/async', headers: { 'Accept': 'video/mp4', 'Authorization': `Bearer ${process.env.PRODIA_TOKEN}`, }, data: job, });
job = res.data; let jobStatus = job.state.current; console.log(`Job ID: ${job.id}`); console.log(`Job Status: ${jobStatus}`);
while (jobStatus == 'processing') { await new Promise(resolve => setTimeout(resolve, 1000)); res = await axios({ method: 'GET', url: `https://inference.prodia.com/v2/job/async/${job.id}/job.state.current`, headers: { 'Authorization': `Bearer ${process.env.PRODIA_TOKEN}`, }, }); jobStatus = res.data; console.log(`Job Status: ${jobStatus}`) }
if (jobStatus != 'processed') { console.log(job); process.exit(1); }
res = await axios({ method: 'GET', url: `https://inference.prodia.com/v2/job/async/${job.id}/output/video.mp4`, headers: { 'Authorization': `Bearer ${process.env.PRODIA_TOKEN}`, }, responseType: 'arraybuffer', });
fs.writeFileSync('output.mp4', res.data); console.log('Output file: output.mp4');}
await main();