API Reference

Services

Customize marketing services based on property needs.

Overview

Orders can be placed for one or many services based on the needs of your property. These services are passed as an array of objects, each with a slug for identification and a quantity.

Services Example

"services": [
  { "slug": "photos", "quantity": 15 },
  { "slug": "zillow_3d_and_floor_plans", "quantity": 1 }
]
"services": [
  { "slug": "ai_virtual_staging", "quantity": 5, "previous_order_id": "654321" }
]
📘

Development Tip

When developing your ordering solution, we recommend a data-driven services approach. Your marketing team may decide to add an additional service for properties in a specific city at some point. Keeping the services array configurable rather than hardcoded will help your team stay flexible.

Available Services

For an in depth description of PlanOmatic services, please check out our service page. Check it out >

📘

Catalog changes

The catalog below is current as of October 20, 2026. There is no API endpoint to fetch it; this page is the reference. Changes are rare, and when they happen they are almost always a new quantity on an existing service or a new service, not a renamed or removed slug. We email integration contacts before any change that could affect an integration.

If you send a slug we do not recognize, the Create Order API answers 400 with services[].slug unrecognized. If you send a quantity that is not valid for that service, it answers 400 with services[].quantity invalid. No order is created in either case, so your integration can treat both as recoverable validation errors.

ServiceslugValid quantitiesProperty accessprevious_order_id
Photographyphotos10, 15, 20, 25, 30, 40Interior
Photography and Zillow 3D Home Tourphotos_and_zillow_3d10, 15, 20, 25, 30Interior
Zillow 3D Home Tour and Floor Planzillow_3d_and_floor_plans1Interior
Exterior Photographyexterior_photos1, 3, 5Exterior only
Amenity Photographyamenity_photos5, 10Interior
AI Virtual Stagingai_virtual_staging3, 4, 5NoneYes
Enhanced Virtual Staging, all interiors (up to 12 photos)enhanced_virtual_staging_all_interiors1NoneYes

Property access says what the PlanOtech needs on site. For "None", send method_of_access: "no_access_needed". For "Exterior only", no_access_needed is right when the exterior is reachable without a code or a gate; otherwise send the access details as usual. When an order mixes services, send the access details the most demanding service needs. Property access details >

Quantity is the number of photos for photography services, the number of photos to stage or edit for staging and editing services, and 1 for services delivered as a single product.

Prices in the Payload

Each services[] item in an API response or webhook carries a price: the total for that line in US dollars, after any discount on your account and before tax. It is a decimal string for a priced line (for example "149.0"), the unquoted number 0.0 for a line with no separate charge, and null when no price is configured for your account. Parse it as a number in all three cases. Service prices are per your agreement with PlanOmatic.

Asset Orders

AI Virtual Staging and Enhanced Virtual Staging create new deliverables from photos that already exist, so they do not need their own photo shoot. You can order them two ways:

  1. Alongside a shoot. Include the staging service in the same order as your photography (or other property) services. The staging is applied to the photos captured by that order. No previous_order_id is used.
  2. After delivery. Once an order has been delivered, order staging against its assets by adding a previous_order_id to each staging service. No new shoot is scheduled; PlanOmatic works from the already-delivered photos, and the result comes back as its own order with its own order.delivered and a full photos array.
📘

Eligible services

previous_order_id is currently supported only for AI Virtual Staging (ai_virtual_staging) and Enhanced Virtual Staging (enhanced_virtual_staging_all_interiors), the services marked "Yes" in the table above. It is not used for any other service.

Option 1: Order staging alongside a shoot

Include the staging service in your order together with your photography services, without previous_order_id. Mixing staging and shoot services in a single order is fully supported.

"services": [
  { "slug": "photos", "quantity": 15 },
  { "slug": "ai_virtual_staging", "quantity": 5 }
]

Option 2: Order staging after delivery (previous_order_id)

Send a Create Order request containing only your staging service(s), each with the same previous_order_id: the PlanOmatic order_id of the delivered order whose photos you want staged. Because no one visits the property, set property_access.method_of_access to no_access_needed. property, property_access, billing_entity_slug and external_property_id are still required.

{
  "api_key": "y0Ur-AP1-k3y",
  "external_property_id": "{property_id}",
  "billing_entity_slug": "investment_entity_1",
  "property": {
    "location": {
      "street": "123 Fake St",
      "city": "Denver",
      "state": "CO",
      "postal_code": "80205"
    },
    "property_type": "single_family"
  },
  "property_access": {
    "vacant": true,
    "method_of_access": "no_access_needed",
    "onsite_contact_name": "Jane Doe",
    "onsite_contact_phone": "+1 555-555-5555"
  },
  "services": [
    { "slug": "ai_virtual_staging", "quantity": 5, "previous_order_id": "654321" }
  ]
}

Rules for previous_order_id

  • Delivered orders only. The order referenced by previous_order_id must already be delivered. You cannot stage against an order that has not been delivered yet.
  • Staging services only. previous_order_id is only valid on the eligible staging services above.
  • One previous order per request. Every service that includes previous_order_id must reference the same value.
📘

Mixing services is fine, unless you add previous_order_id

Combining staging and shoot services in one order is perfectly valid (that is Option 1); just leave previous_order_id out. The "cannot mix asset and non-asset services" error appears only when you include previous_order_id on some services but not all. To stage assets from an order that was already delivered, place a separate, staging-only order with previous_order_id (Option 2).

Errors

Error messageWhen it happens
only valid on asset-type servicesprevious_order_id was sent on a service other than the eligible staging services.
must reference the same previous orderServices in the request reference different previous_order_id values.
cannot mix asset and non-asset servicesSome services include previous_order_id and others do not. Submit them as separate orders.
unrecognizedThe previous_order_id does not match a known order.