Properties

Properties API

Browse a Pedra account's properties, read their photo URLs to feed into create_video and the editing endpoints, create properties, and add photos to them by URL.

Properties are how photos are organized in a Pedra account. These endpoints let you browse a user's properties, read a property's photo URLs (to feed straight into create_video or the editing endpoints), create properties, and add photos to them by URL — the server fetches each URL and stores it, so any public image works.

Photos already in the account are the easiest source for a video. New photos get in three ways: public URLs through add_images_to_property; local files through the same endpoint, sent as base64 data: URIs; or, when the photos are on someone's phone, an upload link they open and upload to with no login.

List properties

POST/api/list_properties

Returns the account's properties (newest first), each with a photo count and an appUrl.

apiKeystringrequired
Your API key.
curl -X POST https://app.pedra.ai/api/list_properties \
  -H "Content-Type: application/json" \
  -d '{ "apiKey": "YOUR_API_KEY" }'

Response

JSON
{
  "properties": [
    {
      "propertyId": "<uuid>",
      "name": "Calle Mayor 12",
      "createdAt": "2026-06-30T10:00:00.000Z",
      "photoCount": 8,
      "appUrl": "https://app.pedra.ai/?propertyId=<uuid>"
    }
  ]
}

List property photos

POST/api/list_property_images

Returns a property's photos as public img.pedra.ai URLs — pass them straight to create_video or the image-editing endpoints.

apiKeystringrequired
Your API key.
propertyIdstringrequired
The property's id (from list_properties or create_property).
typestring
Which photos to list: "photo" (default) for regular photos, or "360" for the property's 360° photos — their imageIds are the sceneIds of a virtual tour.
Values: photo 360
Default: photo
curl -X POST https://app.pedra.ai/api/list_property_images \
  -H "Content-Type: application/json" \
  -d '{ "apiKey": "YOUR_API_KEY", "propertyId": "PROPERTY_ID" }'

Response

JSON
{
  "propertyId": "<uuid>",
  "name": "Calle Mayor 12",
  "images": [
    {
      "imageId": "<uuid>",
      "url": "https://img.pedra.ai/<uuid>",
      "name": "Image 1",
      "aspectRatio": 1.5
    }
  ]
}

Create a property

POST/api/create_property

Creates an empty property and returns its propertyId and appUrl.

apiKeystringrequired
Your API key.
namestring
Property name, e.g. the listing address. Optional.
curl -X POST https://app.pedra.ai/api/create_property \
  -H "Content-Type: application/json" \
  -d '{ "apiKey": "YOUR_API_KEY", "name": "Calle Mayor 12" }'

Response

JSON
{
  "message": "Property created",
  "propertyId": "<uuid>",
  "appUrl": "https://app.pedra.ai/?propertyId=<uuid>"
}

Add photos to a property

POST/api/add_images_to_property

Adds photos to a property by URL. The server fetches each URL and stores it (so any public https image — or a small data: URI — works), then returns the stored img.pedra.ai URLs. Up to 20 per call.

apiKeystringrequired
Your API key.
propertyIdstringrequired
The property's id (from list_properties or create_property).
imageUrlsarrayrequired
Array of image URLs to fetch and add (max 20). A single imageUrl string is also accepted.
namesarray
Optional array of names, one per image in the same order as imageUrls (e.g. the original file names). Returned as name by list_property_images and as source.name when you edit the photo. Never shown on the image. Defaults to "Image 1", "Image 2"...
typestring
"photo" (default) or "360". With "360", each photo is checked to be an equirectangular 360° photo (2:1, up to 80 MB) and stored for use in a virtual tour; max 10 per call.
Values: photo 360
Default: photo

Pass type: "360" to add 360° photos for a virtual tour instead: each one is checked to be equirectangular (2:1) and stored like the app stores them, up to 10 per call. data: URIs work here too, so local 360° files can be sent base64-encoded — one or a few per call, under the 50 MB request limit. Photos that aren't 360° come back in failed with the reason.

Every photo stored here counts toward the account's daily upload limit: 30 a day on the free plan, 500 on paid plans. Over it, the call returns 429 with code: "upload_limit" and nothing is stored; photos that fail on their own don't count.

curl -X POST https://app.pedra.ai/api/add_images_to_property \
  -H "Content-Type: application/json" \
  -d '{
    "apiKey": "YOUR_API_KEY",
    "propertyId": "PROPERTY_ID",
    "imageUrls": [
      "https://example.com/kitchen.jpg",
      "https://example.com/living-room.jpg"
    ],
    "names": ["IMG_0412.jpg", "IMG_0413.jpg"]
  }'

Response

JSON
{
  "message": "Added 2 image(s)",
  "propertyId": "<uuid>",
  "added": [
    { "imageId": "<uuid>", "url": "https://img.pedra.ai/<uuid>", "name": "IMG_0412.jpg", "aspectRatio": 1.5 }
  ],
  "failed": [],
  "appUrl": "https://app.pedra.ai/?propertyId=<uuid>"
}
POST/api/create_upload_link

When the photos are on someone's phone — the agent, the photographer, the owner — create_upload_link is the simplest way to get them into a property. It returns a no-login page, valid for 24 hours, that takes up to 100 photos (JPEG, PNG, WebP, and HEIC from an iPhone). With the default type: "any" it takes regular photos and 360° photos, and 2:1 images are stored as 360° automatically; type: "360" takes 360° photos only.

Send the uploadUrl to the person; once they're done, call list_property_images (type "photo" or "360") and use the URLs with the editing endpoints, create_video or create_virtual_tour. Upload links are free; you can make 5 a day on the free plan and 50 on paid plans, and each uploaded file counts toward the daily upload limit. Full reference: create_upload_link.

curl -X POST https://app.pedra.ai/api/create_upload_link \
  -H "Content-Type: application/json" \
  -d '{ "apiKey": "YOUR_API_KEY", "propertyId": "PROPERTY_ID" }'

Next

Feed a property's photo URLs into create_video, or use them with any virtual staging / enhancement endpoint.