Create, track, and manage orders in your web and mobile applications.
V3 Order APIs
Order API Features
| Feature | V3 | V2 | Description |
|---|---|---|---|
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! |
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. |
Cancel Orders via API | ✅ | Order created by mistake? No biggie! Just send us a cancelation request via our NEW cancel API. | |
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. | |
Send Metadata to Customize Each Order | ✅ | Pass up to 4 key/value pairs to customize your orders. | |
Use Organizational Entities to Keep Your Orders Organized | ✅ | Organize your billing notifications and details based on a customizable billing_entity_slug. | |
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.
