Stager AI API v1Developer Reference

Automate Your Real Estate
Photo Editing Workflow

Link your proprietary CRM, database, or photography platform directly into Stager AI. Our API handles heavy lifting like multi-exposure HDR blending, lens fixes, perspective straightening, and smart AI staging enhancements.

Pricing & Credit System

Active subscription required. To use the Stager AI API, you must maintain an active subscription on your account.

You can purchase any subscription plan that fits your needs. We automatically adjust your API credit quota to match the standard rate of 0.25¢ per photo across all features. This ensures consistent pricing whether you're using the web app or API.

Bonus: Unused monthly credits roll over to the next month, so you can accumulate credits for larger projects or seasonal workloads.

All API operations consume credits from your account. Credits are deducted when processing completes successfully.

HDR Multi-Bracket Merge0.25¢ per final photo

How it works: A bracket group of up to 7 exposure photos counts as 1 final photo for billing purposes. For example, if you upload 5 bracket photos and merge them into 1 final HDR image, you are charged 0.25¢ for that single output.

Example: Processing 10 bracket groups (50 total input photos) results in 10 final merged images = 2.50¢ total cost
AI Staging & Retouching0.25¢ per photo

Applies to virtual staging, lawn replacement, sky replacement, and retouch operations.

Included: First 3 re-renders per photo at no additional cost
Additional renders: Every 3rd render after the initial 3 consumes 1 credit (0.25¢). For example: renders 4, 7, 10, 13, etc. cost 1 credit each
Example: Virtual stage a photo (0.25¢) → re-renders 2, 3, 5, 6 (included) → re-render 4 (0.25¢) → re-render 7 (0.25¢) = 0.75¢ total for 7 renders
Video Generation6 credits per scene

Each scene in your video animation consumes 6 credits.

Scene duration: Each scene lasts 10-15 seconds of animation
Photos per scene: 1 to 5 images (order determines animation sequence)
Example: Creating a video with 4 scenes (e.g., living room, kitchen, bedroom, exterior) = 4 × 6 = 24 credits total. Final video duration: ~50 seconds

Section 1: Setup & Core Utility

Authentication

Need an API Key?

Base URLhttps://api.stagerai.com

API access is open to business accounts and high-volume platforms. To get your production key, shoot us a quick message via the live chat. Every request requires the stager-api-key header.

Section 2: HDR Multi-Bracket Merge Engine

Two Approaches to HDR Merging

Choose the workflow that best fits your use case:

Option 1: Batch Upload (Automatic Grouping)

Upload all listing photos at once. The server automatically detects and groups bracket sets based on timing and exposure metadata. Perfect for large-scale processing where you want the API to handle bracket detection.

Option 2: Single Bracket Upload (Manual Selection)

Upload and process one bracket group at a time. You control which photos belong together as bracket sets. Better for workflows where you have pre-organized brackets or need explicit control.

Capabilities

Single & Multi-Bracket Processing

Process both single images and multi-bracket exposure series through our automated HDR rendering pipeline. Upload anywhere from 1 to 7 exposures per bracket group.

Automatic Structural Modifications

Our processing clusters natively handle the following fixes:

  • HDR Multi-Bracket Blending: Combines up to 7 exposures into a single vibrant image.
  • Lens & Fish-Eye Correction: Unwraps perspective distortions from wide-angle glass optics.
  • Perspective Straightening: Enforces perfect vertical architectural structural balances.
  • Window Pulls: Isolates clipping levels in window highlights to balance exterior illumination values.

Supported File Formats

Supports all common real estate photography raw formats including Canon (CR3, CR2), Nikon (NEF, NRW), Sony (ARW, SRF), Fujifilm (RAF), Panasonic (RW2), and standard formats (JPEG, PNG, TIFF).

HDR Processing Pipeline

INPUT1 or MultiExposure(up to 7)Detect &AlignRegisterExposuresMerge &BlendTone MapExposuresCorrections• Lens Fix• Perspective• Window PullOUTPUTFinal HDRImage

The HDR pipeline automatically processes your bracket series through detection, alignment, blending, and structural corrections to produce a vibrant, perfectly balanced final image.

0. Create a Project (Shared)

Both workflows require an administrative project wrapper. Create one before proceeding with either approach.

POST/api/projects
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "title": "123 Main Street Suite"
}
/ Response JSON
{
  "id": "project_uuid_here",
  "title": "123 Main Street Suite"
}
Option 1: Batch Upload

Server automatically detects and groups bracket sets. Ideal for large-scale processing of complete photo listings.

1. Create a Batch

Initialize a batch container for all photos in this property listing. The server will auto-detect bracket groups.

POST/api/hdr-batch
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "projectId": "project_uuid_here",
  "lensCorrection": true,
  "perspectiveCorrection": true,
  "photographerRemoval": true,
  "fireplaceEnhancement": false,
  "tvScreenReplacement": false,
  "autoPrivacy": false,
  "editingStyle": 11 // Stager Classic V2 Or leave empty to use latest model 
}
/ Response JSON
{
  "batchId": "batch_uuid_here"
}

2. Get Upload URLs (Per Photo)

Generate signed URLs for each photo you want to upload. Call this endpoint once per photo file.

POST/api/hdr-batch/:batchId/url
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "filename": "living_room_1.jpg"
}
/ Response JSON
{
  "id": "image_uuid_here",
  "url": "https://storage.googleapis.com/...temporary_gcloud_put_url..."
}
Tip: Repeat this endpoint for each photo file. You can upload unlimited photos; the server will intelligently group them into bracket sets based on EXIF data (capture time, exposure values).

3. Trigger Batch Processing

Once all photos are uploaded, trigger the server to detect bracket groups and process them.

POST/api/hdr-batch/:batchId/enhance
/ Required Headersstager-api-key: your_api_key_here
/ Response JSON
{}
How it works: The server analyzes EXIF metadata (timestamp, exposure time, ISO, f-number) to automatically detect which photos belong together as bracket sets, then processes each set asynchronously.

4. Get Batch Results

Poll this endpoint to check processing status of all bracket groups in the batch and retrieve the final merged HDR images.

GET/api/hdr-batch/:batchId?format=jpg
/ Required Headersstager-api-key: your_api_key_here
/ Response JSON
{
  "processing": true,
  "results": [
    {
      "groupId": "group_uuid_1",
      "imageUrl": "https://storage.googleapis.com/.../hdr_output_1.jpg",
      "processing": false,
      "status": undefined
    },
    {
      "groupId": "group_uuid_2",
      "imageUrl": undefined,
      "processing": true,
      "status": undefined
    },
    {
      "groupId": "group_uuid_3",
      "imageUrl": undefined,
      "processing": false,
      "status": "error",
      "code": "noCredits",
      "message": "No credits left"
    }
  ]
}
Note: format is an optional query string parameter (jpg or png), not a request body field — this is a GET request.
Response fields:
  • processing: True if any group is still processing
  • results: Array of result objects, one per detected bracket group
  • groupId: Unique ID for this bracket group
  • imageUrl: Final HDR image URL (available when processing complete)
  • status: "error" if processing failed, undefined otherwise
Polling recommendation: Poll every 30-40 seconds. The overall batch is complete when processing is false and all groups have either imageUrl or an error status.
Option 2: Single Bracket Upload

Manually organize and upload one bracket group at a time. You control which photos belong together.

1. Create an HDR Group

Create a container for one complete bracket set (up to 7 exposure photos). Repeat this for each bracket group.

POST/api/hdr-image-group
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "projectId": "project_uuid_here",
  "lensCorrection": true,
  "perspectiveCorrection": true,
  "photographerRemoval": true,
  "fireplaceEnhancement": false,
  "tvScreenReplacement": false,
  "autoPrivacy": false,
  "editingStyle": 11 Stager Classic V2 Or leave empty to use latest model
}
/ Response JSON
{
  "groupId": "group_uuid_here"
}

2. Get Upload URLs (Per Photo in Group)

Generate signed URLs for each exposure photo in this bracket set. Maximum 7 photos per group.

POST/api/hdr-upload-url
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "groupId": "group_uuid_here",
  "filename": "living_room_exposure_1.jpg"
}
/ Response JSON
{
  "id": "image_uuid_here",
  "uploadUrl": "https://storage.googleapis.com/...temporary_gcloud_put_url..."
}
Note: Call this endpoint once per exposure in the bracket. Maximum 7 images per group.

3. Process the Bracket Group

Trigger merging of the uploaded exposure photos into a single HDR result.

POST/api/hdr-enhance
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "groupId": "group_uuid_here"
}
/ Response JSON
{}

4. Check Status & Get Result

Poll this endpoint to check processing status and retrieve the final merged HDR image.

GET/api/hdr-image-group/:groupId?format=jpg
/ Required Headersstager-api-key: your_api_key_here
/ Response JSON
// If processing:
{
  "status": "processing"
}

// On Complete:
{
  "status": "completed",
  "imageUrl": "https://storage.googleapis.com/stager-final-results/output.jpg",
  "filename": "living_room_exposure_1.jpg"
}
Polling recommendation: Check every 5-10 seconds. Processing typically takes 30 seconds to 2 minutes per bracket group depending on image size and complexity.

Section 3: AI Staging & Environment Replacement

1. Upload Target Image Asset

Prerequisite step: Upload your base scene photo file as multi-part form data. The returned id (e.g. imageId) is required to trigger all subsequent staging or replacement features.

POST/api/image
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
// Multi-part Form Data Form\nFile: binary_image_payload.jpg / .png
/ Response JSON
{
  "success": true,
  "data": {
    "id": "img_71283912739",
    "imageUrl": "https://storage.googleapis.com/stager-resized/cache_file.jpg",
    "width": 1920,
    "height": 1280
  }
}

2. Auto Virtual Staging

Populates empty rooms with interior decor arrangements matched against specific architectural styles and functional footprints.

POST/api/images/:imageId/stage
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "roomType": "LIVING_ROOM", 
  "roomStyle": "modern", 
  "actionType": "subtleStaging", 
  "resolution": "high", 
  "colorTypes": ["classicWhite", "naturalWood"],
  "removeFurniture": false,
  "extraInstructions": "Add a luxury linen sofa assembly"
}
/ Response JSON
{
  "success": true,
  "data": [
    {
      "id": "res_9823192",
      "imageUrl": "https://storage.googleapis.com/.../staged_output.png",
      "width": 1920,
      "height": 1280
    }
  ]
}
Allowed Configuration Parameters:
actionType values: subtleStaging, autoStaging
resolution values: low, high, superHigh
roomType values: LIVING_ROOM, DINING_ROOM, BEDROOM, KITCHEN, KITCHEN_LIVING_AREA, HOME_OFFICE, TERRACE, BALCONY, BATHROOM, EXTERIOR, GAME_ROOM, KIDS_ROOM, GARAGE
roomStyle values: modern, minimalist, scandinavian, industrial, rustic, farmhouse, kidsRoom, coastalModern, luxury, midCentury, bohoChic, japandi
colorTypes values: classicWhite, charcoalGray, matteBlack, beige, espressoBrown, walnut, naturalWood, navyBlue, forestGreen, rusticOak, ivory, steelBlue, ashGray, mahogany

3. Automated Lawn Replacement

Identifies patchy yard structures, weeds, and dirt paths, swapping them out with pristine, freshly cut grass turf extensions.

POST/api/images/:imageId/lawn-replace
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "lawnType": "medium",
  "resolution": "high", 
  "extraInstructions": "Keep the stone pathway intact"
}
/ Response JSON
{
  "success": true,
  "data": [
    {
      "id": "res_8812301",
      "imageUrl": "https://storage.googleapis.com/.../lawn_output.png",
      "width": 1920,
      "height": 1280
    }
  ]
}
Allowed lawnType configurations: light | medium | strong
Resolution values: low, high, superHigh

4. Automated Sky Replacement

Overlays gray or overexposed weather horizons with deep blue skies or stunning twilight backdrops while dynamically adjusting building facade shadows.

POST/api/images/:imageId/sky-replace
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "skyType": "twilight",
  "resolution": "high", 
  "skySubType": "dramatic"
}
/ Response JSON
{
  "success": true,
  "data": [
    {
      "id": "res_1102931",
      "imageUrl": "https://storage.googleapis.com/.../sky_output.png",
      "width": 1920,
      "height": 1280
    }
  ]
}
resolution values: low, high, superHigh
skyType variations: blue, twilight (processed via lightning fast rendering systems)
skySubType variations: subtle | middle | dramatic

Section 4: AI Video Generation

Capabilities

Automated Real Estate Video Creation

Transform property images into engaging marketing videos with multiple animation styles and effects. Perfect for creating virtual tours, before-and-after comparisons, and dynamic listings.

  • Floor Plan Rotating Effect: Creates smooth 360° rotations with zoom effects.
  • Listing Slow Motion: Elegant pan and zoom animations across property images.
  • Before & After Staging: Side-by-side comparisons of original vs. virtually staged images.
  • Before & After Renovation: Showcase property transformations and renovations.
  • Multiple Audio Options: Royalty-free background music library or custom uploads.

1. Upload Video Images

Prerequisite step: Upload property images as multi-part form data. The returned id (image ID) is required when creating video clips and adding frames to your animations.

POST/api/image
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
// Multi-part Form Data Form\nFile: binary_image_payload.jpg / .png
/ Response JSON
{
  "success": true,
  "data": {
    "id": "img_71283912739",
    "imageUrl": "https://storage.googleapis.com/stager-resized/cache_file.jpg",
    "width": 1920,
    "height": 1280
  }
}
Note: Save the returned id to use when creating video clips. You can upload multiple images and use them in different video projects or multiple times within the same project.

2. Get Audio Library

Retrieves available background music tracks including built-in royalty-free options and user-uploaded custom audio.

GET/api/audio
/ Required Headersstager-api-key: your_api_key_here
/ Response JSON
{
  "data": {
    "items": [
      {
        "id": "audio_001",
        "name": "Corporate Inspirational",
        "url": "https://storage.googleapis.com/.../audio.mp3",
        "isCustom": false
      },
      {
        "id": "custom_audio_123",
        "name": "My Custom Soundtrack",
        "url": "https://storage.googleapis.com/.../custom.mp3",
        "isCustom": true
      }
    ]
  }
}

3. Create Video Project

Initializes a new video project with specified orientation, animation style, and optional background audio.

POST/api/videos
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "title": "Luxury Home Tour - 123 Main St",
  "orientation": "horizontal",
  "videoType": "listingSlowMotion",
  "audioId": "audio_001"
}
/ Response JSON
{
  "data": {
    "id": "video_abc123xyz",
    "title": "Luxury Home Tour - 123 Main St",
    "orientation": "horizontal",
    "videoType": "listingSlowMotion",
    "clips": []
  }
}
orientation values: horizontal, vertical
videoType values: listingSlowMotion, beforeAndAfterStaging, beforeAndAfterStagingRenovation, floorPlanRotatingEffect
audioId: Optional. Use ID from audio library endpoint. If omitted, template default will be used.

4. List Video Projects

Retrieves paginated list of all videos created by the authenticated user.

GET/api/videos?offset=0&limit=50
/ Required Headersstager-api-key: your_api_key_here
/ Response JSON
{
  "data": {
    "items": [
      {
        "id": "video_abc123xyz",
        "title": "Luxury Home Tour - 123 Main St",
        "orientation": "horizontal",
        "videoType": "listingSlowMotion",
        "videoUrl": "https://storage.googleapis.com/.../final_video.mp4",
        "createdAt": "2024-01-15T10:30:00Z"
      }
    ],
    "total": 1
  }
}

5. Get Video Details

Retrieves complete video project details including all clips, images, and rendering status.

GET/api/videos/:videoId
/ Required Headersstager-api-key: your_api_key_here
/ Response JSON
{
  "data": {
    "id": "video_abc123xyz",
    "title": "Luxury Home Tour - 123 Main St",
    "videoUrl": "https://storage.googleapis.com/.../final_video.mp4",
    "clips": [
      {
        "id": "clip_001",
        "order": 0,
        "videoUrl": "https://storage.googleapis.com/.../clip_001.mp4",
        "images": [
          {
            "id": "img_123",
            "imageId": "img_uuid",
            "url": "https://storage.googleapis.com/.../thumbnail.jpg",
            "isGeneration": false
          }
        ]
      }
    ]
  }
}

6. Create Video Clip

Adds a new clip (sequence of images) to an existing video project. Each image is a frame in the animation.

POST/api/videos/:videoId/clips
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "images": [
    { "id": "img_123", "order": 0 },
    { "id": "img_124", "order": 1 },
    { "id": "img_125", "order": 2 }
  ],
  "customInstructions": "Add smooth transitions between rooms"
}
/ Response JSON
{
  "data": {
    "id": "clip_001"
  }
}
Note: Image IDs must be previously uploaded to your project. Order determines frame sequence in the animation.

7. Render Video

Initiates background processing to generate the final video file from all clips and images. Processing is async; use the progress endpoint to monitor status.

POST/api/videos/:videoId/render
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{}
/ Response JSON
{
  "data": {}
}
Note: Rendering happens asynchronously. Poll the progress endpoint to track completion. Typical render time: 5-30 minutes depending on video length and complexity.

8. Check Video Progress

Polls rendering status and retrieves progress metrics, video URL, and file size for completed renders.

GET/api/videos/:videoId/progress
/ Required Headersstager-api-key: your_api_key_here
/ Response JSON
// While processing:
{
  "status": "progress",
  "progress": 45
}

// When complete:
{
  "status": "done",
  "url": "https://storage.googleapis.com/.../final_video.mp4",
  "size": 125000000
}

// On error:
{
  "status": "error",
  "message": "Render failed: insufficient memory"
}
Recommendation: Poll this endpoint every 5-10 seconds to track rendering progress. Returns one of three states: "progress" (with percentage), "done" (with video URL and file size), or "error" (with error message).

9. Edit Clip

Updates an existing clip's images, order, or custom instructions. Changes automatically reset render status requiring a new render call.

PUT/api/videos/:videoId/clips/:clipId
/ Required Headersstager-api-key: your_api_key_here
/ Request Body (JSON)
{
  "images": [
    { "id": "img_123", "order": 0 },
    { "id": "img_126", "order": 1 }
  ],
  "customInstructions": "Updated smooth transitions"
}
/ Response JSON
{
  "data": {
    "success": true
  }
}

10. Delete Clip

Removes a clip from the video project. Video will need re-rendering after deletion.

DELETE/api/videos/:videoId/clips/:clipId
/ Required Headersstager-api-key: your_api_key_here
/ Response JSON
{
  "data": {
    "success": true
  }
}

Video Generation Pipeline

INPUTImages1-5 perSceneSequenceOrderFrames &DurationApply StyleSlow Motion,Before &After, etc.Audio SyncBackgroundMusic orNarrationRenderEncode &OptimizeOUTPUTFinal Video(10-15s)

The video pipeline transforms your image sequences into polished marketing videos. Each scene (1-5 images) generates a 10-15 second video segment with smooth animations, synchronized audio, and professional effects.