---
title: "Create a no-login upload link for photos and 360° photos"
method: POST
path: "/api/create_upload_link"
tags: ["Virtual tours"]
---

# Create a no-login upload link for photos and 360° photos

`POST /api/create_upload_link`

## Request

- Base URL: `https://app.pedra.ai`
- URL: `https://app.pedra.ai/api/create_upload_link`
- Auth: none required

Returns a no-login upload page (valid 24 h) that can only add photos to one property. Works on a phone or computer: drag & drop or pick files, up to 100 files, JPEG/PNG/WebP up to 80 MB each (iPhone HEIC photos work when uploaded from the iPhone). `type: "any"` (default) takes regular photos and 360° photos — 2:1 images are detected and stored as 360° photos automatically; `type: "360"` takes 360° photos only (use it for virtual tours). Photos are stored like the web app stores them (long side 2048 px, 3072 px over 20 MB; 360° photos 4096/6144 px wide). Files are sorted by file name (= shooting order). When the upload is done, call /api/list_property_images (type "photo" or "360") for URLs to edit, use in create_video, or call /api/create_virtual_tour with the propertyId and no scenes. This is how chat assistants get photos from a user's phone. Free; 5 links/day on the free plan, 50/day on paid plans (429 `upload_link_limit`). Each uploaded file counts toward the daily upload limit.

## Request body

- object
  - `apiKey` string, required: Account API key, sent in the request body. Get one at https://app.pedra.ai under Settings → API.
  - `propertyId` string: Property to upload into. Omit to create a new property named after `name`.
  - `name` string
  - `type` 'any' | '360': "any": photos and 360° photos (2:1 images stored as 360° automatically). "360": 360° photos only — use it for a virtual tour.
  - `language` 'en' | 'es' | 'fr' | 'de' | 'it' | 'pt': Tour page UI language and the language of AI room names. Non-English tours get a /{lang}/virtual-tour/... URL.

## Response `200`

Upload link created.

- object
  - `uploadUrl` string
  - `propertyId` string
  - `propertyName` string, nullable
  - `type` 'any' | '360'
  - `expiresAt` string, date-time
  - `maxFiles` integer: Max files per link (100).
  - `appUrl` string
  - `message` string

## Other responses

- `400`: Invalid `type`.
- `404`: Missing, invalid, or revoked API key, or a tour/property that isn't on this account.
- `405`: Wrong HTTP method — all endpoints accept POST (credits also accepts GET).
- `429`: Daily limit reached. Nothing is stored.
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/pedra/apis/pedra-api.md) · [All operations](https://skmtc.dev/pedra/apis/pedra-api/llms.txt) · [OpenAPI document](https://skmtc.dev/pedra/apis/pedra-api/revisions/87b2e76912c8?raw)
