API Reference

V3 Order APIs

Create, track, and manage orders in your web and mobile applications.

📘

V3 Order APIs

Order API Features

FeatureV3V2Description

Create Orders

via API

✅✅

PlanOmatic's Order API makes it easy speed up your workflow. When you identify a property that has marketing needs, request them via API. We will handle the rest!

Order Create >

Retrieve Order

Details via API

✅✅

Need an update on the status of your order? Use our Retrieve API to get the latest details on your order.

Order Retrieve >

Cancel Orders

via API

✅

Order created by mistake? No biggie! Just send us a cancelation request via our NEW cancel API.

Order Cancel >

Send a

Simple Services Array

to Customize Your Property's Assets

✅

Pass a simple array of services that can be easily customized to reflect your marketing needs.

Learn more >

Send

Metadata

to Customize Each Order

✅

Pass up to 4 key/value pairs to customize your orders.

Learn more >

Use

Organizational Entities

to Keep Your Orders Organized

✅

Organize your billing notifications and details based on a customizable billing_entity_slug.

Learn more

Avoid Accidental Double Orders With

Duplicate Protection

✅Duplicates are detected by matching the property address (street, street2, city, state, postal_code) within the same billing-parent company and an overlapping service, when an open order exists inside a configurable hours threshold (default 24h, admin-managed per integration). This is a great way to protect yourself against double ordering.

Order API Request Example

Below is an example of what a request to the Create Order API would look like. For a details on each of these attributes, check out Order Create API >

{
  "api_key": "your_api_key",
  "external_property_id": "{property_id}",
  "billing_entity_slug": "investment_entity_1",
  "external_order_id": "{external_order_id}",
  "metadata": {
    "metadata_key1": "abc123",
    "metadata_key2": "wxyz987"
  },
  "property": {
    "location": {
      "street": "123 Fake St",
      "street2": "Unit A",
      "city": "Denver",
      "state": "CO",
      "postal_code": "80205",
      "latitude": "39.739236",
      "longitude": "-104.990251"
    },
    "property_type": "single_family",
    "bedrooms": 3,
    "bathrooms": 2.5,
    "price": 3000,
    "square_footage": 1500
  },
  "services": [
    { "slug": "photos", "quantity": 15 },
    { "slug": "zillow_3d_and_floor_plans", "quantity": 1 }
  ],
  "property_access": {
    "vacant": true,
    "method_of_access": "lockbox_code",
    "access_code": "XXXX",
    "lockbox_location": "Behind A/C Unit",
    "preferred_date": "YYYY-MM-DD",
    "onsite_contact_name": "Jane Doe",
    "onsite_contact_phone": "+1 555-555-5555"
  },
  "order_notes": "Some special instructions."
}

Order API Response Example

Create Order, Retrieve Order and Cancel Order all answer with the same envelope: a code, a status, the order object in data, and a message. The order object in data is exactly what the Order Status Webhook posts as its body, so a parser written for one works for the other. Below is the response from Retrieve Order for a delivered order.

{
  "code": 200,
  "status": "action-successful",
  "data": {
    "order_id": 2120062,
    "external_property_id": "{property_id}",
    "external_order_id": "{external_order_id}",
    "created": "2026-10-14T10:40:23.000Z",
    "order_status": "completed",
    "event": "order.delivered",
    "billing_entity": {
      "slug": "investment_entity_1",
      "name": "Investment Entity Number 1"
    },
    "metadata": {
      "metadata_key1": "abc123",
      "metadata_key2": "wxyz987"
    },
    "property": {
      "location": {
        "address": "123 Fake St, Unit A, Denver, CO, 80205",
        "street": "123 Fake St",
        "street2": "Unit A",
        "city": "Denver",
        "state": "CO",
        "postal_code": "80205",
        "country": "US",
        "market": "Denver",
        "latitude": "39.739236",
        "longitude": "-104.990251"
      },
      "property_type": "single_family",
      "bedrooms": "3",
      "bathrooms": "2.5",
      "price": "3000",
      "square_footage": "1500"
    },
    "services": [
      {
        "slug": "photos",
        "quantity": 15,
        "name": "Photography",
        "price": "149.0"
      },
      {
        "slug": "zillow_3d_and_floor_plans",
        "quantity": 1,
        "name": "Zillow 3D",
        "price": "169.0"
      }
    ],
    "property_access": {
      "vacant": true,
      "method_of_access": "lockbox_code",
      "access_code": "4321",
      "lockbox_location": "Behind A/C Unit",
      "preferred_date": "2026-10-13",
      "onsite_contact_name": "Jane Doe",
      "onsite_contact_phone": "+1 555-555-5555"
    },
    "order_notes": "Some special instructions",
    "appointments": [
      {
        "appointment_id": 3760017,
        "start_datetime": "2026-10-16T15:00:00.000+00:00",
        "end_datetime": "2026-10-16T16:00:00.000+00:00",
        "duration_m": 60,
        "planotech_name": "Bobby",
        "cancelation_reason": null,
        "cancelation_notes": null,
        "canceled": null
      }
    ],
    "order_cancelation_reason": null,
    "order_cancelation_notes": null,
    "unable_to_complete_appt": false,
    "unable_to_complete_appt_reason": null,
    "unable_to_complete_appt_notes": null,
    "links": {
      "tour_link": "https://tours.planomatic.com/865496",
      "tour_mls_link": "https://tours.planomatic.com/mls865496",
      "zillow_3d_link": "https://www.zillow.com/view-imx/XXXXXXXXXX"
    },
    "photos": [
      {
        "sequence": 1,
        "caption": "Front View",
        "full_size_url": "https://assets.app.planomatic.com/connect/photos/{property}/{photo-1}/fullSize.jpg",
        "full_size_watermarked_url": "https://assets.app.planomatic.com/connect/photos/{property}/{photo-1}/wm/fullSize.jpg",
        "uploaded_at": "2026-10-16T16:23:11.000Z",
        "modified_at": "2026-10-17T17:54:46.000Z"
      },
      {
        "sequence": 2,
        "caption": "Kitchen",
        "full_size_url": "https://assets.app.planomatic.com/connect/photos/{property}/{photo-2}/fullSize.jpg",
        "full_size_watermarked_url": "https://assets.app.planomatic.com/connect/photos/{property}/{photo-2}/wm/fullSize.jpg",
        "uploaded_at": "2026-10-16T16:23:11.000Z",
        "modified_at": "2026-10-17T17:54:46.000Z"
      },
      {
        "sequence": 3,
        "caption": "Bedroom",
        "full_size_url": "https://assets.app.planomatic.com/connect/photos/{property}/{photo-3}/fullSize.jpg",
        "full_size_watermarked_url": "https://assets.app.planomatic.com/connect/photos/{property}/{photo-3}/wm/fullSize.jpg",
        "uploaded_at": "2026-10-16T16:23:11.000Z",
        "modified_at": "2026-10-17T17:54:46.000Z"
      }
    ],
    "legacy_order_id": 2120062
  },
  "message": "Order Retrieved."
}

The webhook posts the content of data alone, with no wrapper. Validation errors come back at the top level as { "code": 400, "status": "validation-error", "errors": [ { "attr": "...", "message": "..." } ] }, listing every failed validation, not only the first. For the meaning of order_status and event, the links keys and the photos attributes, see the Order Status Webhook page.

📘

How will I know if my property Is ready for photography?

Typically, the indication that a property is ready for photography will rely on one of the following:

  • An important Date is entered into the system (e.g. “Construction Final Date”)
  • A certain Property Status is reached (e.g. “Vacant Unrented Ready”)
    Our team will help you identify other important criteria to consider when setting up the ordering logic.