Skip to main content
GET
https://api.pictory.ai
/
pictoryapis
/
v2
/
projects
/
{projectid}
Get Project by ID
curl --request GET \
  --url https://api.pictory.ai/pictoryapis/v2/projects/{projectid} \
  --header 'Authorization: <authorization>'
{
  "projectName": "Hello World Template",
  "source": "script",
  "step": "STORYBOARD",
  "schemaVersion": "v3",
  "layout": "16:9",
  "thumbnail": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/image/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2.jpg",
  "videoURL": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/video/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/Hello_World_Template.mp4",
  "shareVideoURL": "https://video.pictory.ai/20251222191648030d7df02f5b4054d4ca8831f1369459e25/202512222223581518MQ0e1s90cquQkN",
  "audioURL": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/audio/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/Hello_World_Template.mp3",
  "videoDuration": 1.99,
  "saveDate": "2025-12-23T01:54:26.658Z",
  "generatedDate": "2025-12-22T22:23:57.210Z",
  "srtFile": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/text/subtitles/154cc5e8-a124-46f5-971f-b2ba4ae1579c.srt",
  "vttFile": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/text/subtitles/72c97243-d206-4b6c-ad87-95606ce2e779.vtt",
  "txtFile": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/text/subtitles/8794b1d5-bf40-494e-9deb-724cb6f77310.txt",
  "scriptLanguage": "en",
  "voiceOverId": "20251222191850400c093ac81afb245cf922e440e89d24acd",
  "audioSpeed": 100,
  "videoVolume": 50,
  "brandId": "eb67b4ba-0eef-41fa-a772-d9675cc3645c",
  "smartTemplateId": "202507141030549677ylq8k8gu44vy1y",
  "inProgress": false,
  "scriptTxtSceneSettings": {
    "autoHighlightKeywords": true,
    "maxLines": 2,
    "autoVisualSelection": true
  },
  "visualFilter": {
    "libraries": [],
    "styles": [],
    "categories": []
  }
}

Overview

Retrieve comprehensive details about a specific project using its unique identifier. This endpoint returns the complete project configuration, including storyboard data, video URLs, audio settings, script information, and rendering details.
You need a valid API key to use this endpoint. Get your API key from the API Access page in your Pictory dashboard.

API Endpoint

GET https://api.pictory.ai/pictoryapis/v2/projects/{projectid}

Request Parameters

Path Parameters

projectid
string
required
The unique identifier of the project to retrieve. Can be either a string (for v3 schema projects) or an integer (for v2 schema and earlier projects).Example: 20251222191648030d7df02f5b4054d4ca8831f1369459e25

Headers

Authorization
string
required
API key for authentication (starts with pictai_)
Authorization: YOUR_API_KEY

Response

The response contains detailed project information including configuration, media URLs, and metadata.
projectName
string
Name of the project
source
string
Source type of the project (e.g., script, transcribe, url)
step
string
Current step/stage of the project workflow (e.g., STORYBOARD, EDIT, RENDER)
schemaVersion
string
Project schema version (e.g., v2, v3)
layout
string
Video aspect ratio layout (e.g., 16:9, 9:16, 1:1)
thumbnail
string
URL to the project thumbnail image
videoURL
string
URL to the rendered video file (if available)
shareVideoURL
string
Shareable URL for viewing the video
audioURL
string
URL to the generated audio file
videoDuration
number
Duration of the video in seconds
saveDate
string
ISO 8601 timestamp of when the project was last saved
generatedDate
string
ISO 8601 timestamp of when the video was generated
srtFile
string
URL to the SRT subtitle file
vttFile
string
URL to the VTT subtitle file
txtFile
string
URL to the text transcript file
scriptLanguage
string
Language code of the script (e.g., en for English)
voiceOverId
string
Identifier for the voice-over used in the project
audioSpeed
number
Audio playback speed percentage (100 = normal speed)
videoVolume
number
Background video volume level (0-100)
brandId
string
Identifier for the brand template applied to the project
smartTemplateId
string
Identifier for the smart template used
inProgress
boolean
Indicates whether the project is currently being processed
scriptTxtSceneSettings
object
Configuration settings for scene generation from script
visualFilter
object
Filters applied for visual selection

Response Examples

{
  "projectName": "Hello World Template",
  "source": "script",
  "step": "STORYBOARD",
  "schemaVersion": "v3",
  "layout": "16:9",
  "thumbnail": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/image/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2.jpg",
  "videoURL": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/video/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/Hello_World_Template.mp4",
  "shareVideoURL": "https://video.pictory.ai/20251222191648030d7df02f5b4054d4ca8831f1369459e25/202512222223581518MQ0e1s90cquQkN",
  "audioURL": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/audio/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/Hello_World_Template.mp3",
  "videoDuration": 1.99,
  "saveDate": "2025-12-23T01:54:26.658Z",
  "generatedDate": "2025-12-22T22:23:57.210Z",
  "srtFile": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/text/subtitles/154cc5e8-a124-46f5-971f-b2ba4ae1579c.srt",
  "vttFile": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/text/subtitles/72c97243-d206-4b6c-ad87-95606ce2e779.vtt",
  "txtFile": "https://d3uryq9bhgb5qr.cloudfront.net/TeamsAnnual/aa46778d-7965-46e0-967d-b48ee5d6ead9/f1c3b5a7-65f9-4386-a3ef-5ac378c12fa2/text/subtitles/8794b1d5-bf40-494e-9deb-724cb6f77310.txt",
  "scriptLanguage": "en",
  "voiceOverId": "20251222191850400c093ac81afb245cf922e440e89d24acd",
  "audioSpeed": 100,
  "videoVolume": 50,
  "brandId": "eb67b4ba-0eef-41fa-a772-d9675cc3645c",
  "smartTemplateId": "202507141030549677ylq8k8gu44vy1y",
  "inProgress": false,
  "scriptTxtSceneSettings": {
    "autoHighlightKeywords": true,
    "maxLines": 2,
    "autoVisualSelection": true
  },
  "visualFilter": {
    "libraries": [],
    "styles": [],
    "categories": []
  }
}

Code Examples

Replace YOUR_API_KEY with your actual API key that starts with pictai_
curl --request GET \
  --url 'https://api.pictory.ai/pictoryapis/v2/projects/YOUR_PROJECT_ID' \
  --header 'Authorization: YOUR_API_KEY' \
  --header 'accept: application/json' | python -m json.tool

Usage Notes

Use this endpoint to retrieve the complete project configuration, including all media URLs, subtitle files, and rendering settings. This is useful for checking project status, downloading rendered assets, or retrieving project metadata.
Project Status: Check the step field to determine the current workflow stage. Common values include STORYBOARD (editing), RENDER (rendering in progress), and COMPLETE (fully rendered).
Media URLs: All media URLs (video, audio, subtitles) point to CloudFront CDN for fast, reliable access. These URLs remain accessible as long as the project exists in your account.

Common Use Cases

1. Check Project Render Status

Monitor whether a project has finished rendering:
import requests
import time

def wait_for_render(project_id, api_key, timeout=300):
    """
    Poll project status until rendering is complete
    """
    url = f"https://api.pictory.ai/pictoryapis/v2/projects/{project_id}"
    headers = {"Authorization": api_key}

    start_time = time.time()

    while time.time() - start_time < timeout:
        response = requests.get(url, headers=headers)
        project = response.json()

        if project.get('step') == 'COMPLETE' or not project.get('inProgress'):
            print(f"Project rendering complete!")
            print(f"Video URL: {project.get('videoURL')}")
            return project

        print(f"Status: {project.get('step')}, In Progress: {project.get('inProgress')}")
        time.sleep(10)  # Check every 10 seconds

    raise TimeoutError("Project rendering timeout")

# Example usage
project = wait_for_render("YOUR_PROJECT_ID", "YOUR_API_KEY")

2. Download Project Assets

Download all media files associated with a project:
import requests
import os

def download_project_assets(project_id, api_key, output_dir="./downloads"):
    """
    Download video, audio, and subtitle files from a project
    """
    # Get project details
    url = f"https://api.pictory.ai/pictoryapis/v2/projects/{project_id}"
    headers = {"Authorization": api_key}

    response = requests.get(url, headers=headers)
    project = response.json()

    # Create output directory
    os.makedirs(output_dir, exist_ok=True)

    # Download files
    assets = {
        'video': project.get('videoURL'),
        'audio': project.get('audioURL'),
        'srt': project.get('srtFile'),
        'vtt': project.get('vttFile'),
        'txt': project.get('txtFile')
    }

    for asset_type, url in assets.items():
        if url:
            filename = f"{project['projectName']}_{asset_type}.{asset_type}"
            filepath = os.path.join(output_dir, filename)

            # Download file
            file_response = requests.get(url)
            with open(filepath, 'wb') as f:
                f.write(file_response.content)

            print(f"Downloaded {asset_type}: {filepath}")

    print(f"All assets downloaded to {output_dir}")

# Example usage
download_project_assets("YOUR_PROJECT_ID", "YOUR_API_KEY")

3. Extract Project Metadata

Extract and analyze project configuration and settings:
async function analyzeProject(projectId, apiKey) {
  const response = await fetch(
    `https://api.pictory.ai/pictoryapis/v2/projects/${projectId}`,
    { headers: { 'Authorization': `${apiKey}` } }
  );

  const project = await response.json();

  const metadata = {
    name: project.projectName,
    source: project.source,
    schema: project.schemaVersion,
    aspectRatio: project.layout,
    duration: project.videoDuration,
    language: project.scriptLanguage,
    created: project.generatedDate,
    lastSaved: project.saveDate,
    voiceOver: project.voiceOverId,
    brand: project.brandId,
    template: project.smartTemplateId,
    sceneSettings: {
      maxLines: project.scriptTxtSceneSettings?.maxLines,
      autoHighlight: project.scriptTxtSceneSettings?.autoHighlightKeywords,
      autoVisuals: project.scriptTxtSceneSettings?.autoVisualSelection
    },
    assets: {
      video: project.videoURL,
      audio: project.audioURL,
      shareLink: project.shareVideoURL,
      subtitles: {
        srt: project.srtFile,
        vtt: project.vttFile,
        txt: project.txtFile
      }
    }
  };

  console.log('Project Analysis:', metadata);
  return metadata;
}

// Example usage
const analysis = await analyzeProject('YOUR_PROJECT_ID', 'YOUR_API_KEY');

4. Compare Project Settings

Compare settings between multiple projects:
def compare_projects(project_ids, api_key):
    """
    Compare configuration settings across multiple projects
    """
    url_template = "https://api.pictory.ai/pictoryapis/v2/projects/{}"
    headers = {"Authorization": api_key}

    projects = []
    for pid in project_ids:
        response = requests.get(url_template.format(pid), headers=headers)
        projects.append(response.json())

    # Compare key settings
    comparison = {
        'names': [p.get('projectName') for p in projects],
        'layouts': [p.get('layout') for p in projects],
        'schemas': [p.get('schemaVersion') for p in projects],
        'durations': [p.get('videoDuration') for p in projects],
        'audioSpeeds': [p.get('audioSpeed') for p in projects],
        'videoVolumes': [p.get('videoVolume') for p in projects],
        'maxLines': [p.get('scriptTxtSceneSettings', {}).get('maxLines') for p in projects]
    }

    print("Project Comparison:")
    for key, values in comparison.items():
        print(f"{key}: {values}")

    return comparison

# Example usage
comparison = compare_projects(
    ["project_id_1", "project_id_2", "project_id_3"],
    "YOUR_API_KEY"
)
Retrieve the shareable video link for distribution:
async function getShareableLink(projectId, apiKey) {
  const response = await fetch(
    `https://api.pictory.ai/pictoryapis/v2/projects/${projectId}`,
    { headers: { 'Authorization': `${apiKey}` } }
  );

  const project = await response.json();

  if (project.shareVideoURL) {
    console.log(`Shareable link: ${project.shareVideoURL}`);
    console.log(`Project name: ${project.projectName}`);
    console.log(`Duration: ${project.videoDuration} seconds`);
    return project.shareVideoURL;
  } else {
    console.log('Shareable link not yet available');
    return null;
  }
}

// Example usage
const shareLink = await getShareableLink('YOUR_PROJECT_ID', 'YOUR_API_KEY');

6. Export Project Report

Generate a comprehensive report of project details:
import json
from datetime import datetime

def export_project_report(project_id, api_key, output_file="project_report.json"):
    """
    Export a detailed project report to JSON
    """
    url = f"https://api.pictory.ai/pictoryapis/v2/projects/{project_id}"
    headers = {"Authorization": api_key}

    response = requests.get(url, headers=headers)
    project = response.json()

    # Create structured report
    report = {
        "reportGenerated": datetime.now().isoformat(),
        "projectId": project_id,
        "basicInfo": {
            "name": project.get('projectName'),
            "source": project.get('source'),
            "status": project.get('step'),
            "inProgress": project.get('inProgress'),
            "schemaVersion": project.get('schemaVersion')
        },
        "videoSettings": {
            "layout": project.get('layout'),
            "duration": project.get('videoDuration'),
            "volume": project.get('videoVolume')
        },
        "audioSettings": {
            "language": project.get('scriptLanguage'),
            "voiceOverId": project.get('voiceOverId'),
            "speed": project.get('audioSpeed')
        },
        "timestamps": {
            "created": project.get('generatedDate'),
            "lastSaved": project.get('saveDate')
        },
        "assets": {
            "video": project.get('videoURL'),
            "audio": project.get('audioURL'),
            "thumbnail": project.get('thumbnail'),
            "shareLink": project.get('shareVideoURL'),
            "subtitles": {
                "srt": project.get('srtFile'),
                "vtt": project.get('vttFile'),
                "txt": project.get('txtFile')
            }
        },
        "branding": {
            "brandId": project.get('brandId'),
            "templateId": project.get('smartTemplateId')
        }
    }

    # Export to JSON
    with open(output_file, 'w') as f:
        json.dump(report, f, indent=2)

    print(f"Project report exported to {output_file}")
    return report

# Example usage
report = export_project_report("YOUR_PROJECT_ID", "YOUR_API_KEY")