# P-Video Upscale API Documentation > LLM-optimized documentation for P-Video Upscale. Copy into your AI assistant for integration help. ## Overview **Model ID:** `p-video-upscale` **Type:** Video Generation **Credit Cost:** 0.6 credits per second Pruna P-Video Upscale. Fast, low-cost video upscaling to 720p, 1080p, 2K, or 4K. Keeps the aspect ratio and the original audio. ## Endpoint ``` POST https://pixeldojo.ai/api/v1/models/p-video-upscale/run ``` ## Authentication All requests require an API key in the Authorization header: ``` Authorization: Bearer YOUR_API_KEY ``` Get your API key: https://pixeldojo.ai/api-platform/api-keys ## Input Parameters | Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | `video` | url | Yes | - | Public HTTPS URL of the source clip: a standard MP4 or MOV, max 50 MB. The server downloads it once and bills its measured length; a file it cannot measure is refused before any charge. | | `video_duration` | number | No | - | Source clip length in seconds (1-80). Optional and only used for the price preview: the run bills the length the server measures. (min: 1, max: 80) | | `target` | enum | No | 1080p | Output size. The source aspect ratio is kept, and a clip already larger than the target is not shrunk. Credits per second: 720p 0.3, 1080p 0.6, 2k 1.2, 4k 2.4. Longest clip: 720p 80s, 1080p 40s, 2k 20s, 4k 10s. (Options: 720p, 1080p, 2k, 4k) | | `fps` | enum | No | 30 | Output frame rate. 60 interpolates the extra frames and doubles the price. (Options: 30, 60) | | `video_width` | integer | No | - | Optional source width in pixels. The run measures the source and uses its real size. | | `video_height` | integer | No | - | Optional source height in pixels. The run measures the source and uses its real size. | ## Quick Start ### 1. Submit a Job ```bash curl -X POST "https://pixeldojo.ai/api/v1/models/p-video-upscale/run" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "video": "https://example.com/clip.mp4", "target": "1080p" }' ``` **Response:** ```json { "jobId": "job_abc123...", "status": "pending", "statusUrl": "https://pixeldojo.ai/api/v1/jobs/job_abc123", "creditCost": 3, "creditsRemaining": 95 } ``` ### 2. Poll for Results ```bash curl "https://pixeldojo.ai/api/v1/jobs/job_abc123" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Completed Response:** ```json { "jobId": "job_abc123...", "status": "completed", "output": { "video": "https://temp.pixeldojo.ai/..." }, "creditCost": 3 } ``` ## Python Example ```python import requests import time API_KEY = "YOUR_API_KEY" # Submit job response = requests.post( "https://pixeldojo.ai/api/v1/models/p-video-upscale/run", headers={ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" }, json={ "video": "https://example.com/clip.mp4", "target": "1080p" } ) job = response.json() job_id = job["jobId"] # Poll for completion while True: status_response = requests.get( f"https://pixeldojo.ai/api/v1/jobs/{'{job_id}'}", headers={"Authorization": f"Bearer {API_KEY}"} ) status = status_response.json() if status["status"] == "completed": print("Output:", status["output"]) break elif status["status"] == "failed": print("Error:", status.get("error")) break time.sleep(2) ``` ## JavaScript Example ```javascript const API_KEY = 'YOUR_API_KEY'; // Submit job const submitResponse = await fetch('https://pixeldojo.ai/api/v1/models/p-video-upscale/run', { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ "video": "https://example.com/clip.mp4", "target": "1080p" }) }); const job = await submitResponse.json(); // Poll for completion const pollForResult = async (jobId) => { while (true) { const statusResponse = await fetch(`https://pixeldojo.ai/api/v1/jobs/${jobId}`, { headers: { 'Authorization': `Bearer ${API_KEY}` } }); const status = await statusResponse.json(); if (status.status === 'completed') return status.output; if (status.status === 'failed') throw new Error(status.error); await new Promise(r => setTimeout(r, 2000)); } }; const output = await pollForResult(job.jobId); console.log('Output:', output); ``` ## Use Saved Characters (@Name) This model takes no reference images, so `@Name` of a saved character is refused (400) before anything is charged. A saved location, prop or style with a description is inserted as text. For saved characters, use a model that takes reference images, such as Nano Banana Pro or Seedream 5 for images, or Seedance 2.5 or WAN 3.0 for video. ## Error Codes | Code | Status | Description | |------|--------|-------------| | `unauthorized` | 401 | Invalid or missing API key | | `insufficient_credits` | 402 | Not enough credits | | `invalid_request` | 400 | Invalid parameters | | `model_not_found` | 404 | Model ID not found | | `internal_error` | 500 | Server error | ## Links - **Full Documentation:** https://pixeldojo.ai/api-platform/p-video-upscale - **API Keys:** https://pixeldojo.ai/api-platform/api-keys - **Buy Credits:** https://pixeldojo.ai/api-platform/buy-credits - **All Models:** https://pixeldojo.ai/api/v1/models - **OpenAPI Spec:** https://pixeldojo.ai/api/openapi