Photos and the fetcher
Send HTTPS photo URLs; our fetcher downloads, checks and re-encodes them. The rules, the caps, reuse by digest, and what happens when a fetch fails.
There is no upload endpoint. photos[] holds HTTPS URLs; our fetcher downloads each image when the item is imported.
The rules#
- 0 to 64 photos in the payload. The first is the cover; the order you send is the order we show.
- Each
urlis a publichttps://URL: no IP address, no local host name, no port other than 443, no credentials, up to 2,048 characters. A URL listed twice isduplicate_photo_url. room_typeis optional:exterior,living_room,kitchen,bedroom,bathroom,balcony,hallway,view,garage,other.captionis optional, up to 500 characters.
How many we keep#
- The agency's plan caps the photos stored. Extra photos are dropped from the end, and the item carries the warning
photo_cap_applied. - At least 3 photos are needed to publish. An
activeitem that ends with fewer than 3 stored photos fails withphoto_minimum. A listing that is already published keeps its previous photo set in that case, so it never goes live with too few. A 2-photo listing can still be staged asinactive. - Sandbox items fetch at most 8 photos (nothing is stored on the sandbox).
Reuse: unchanged photos are not fetched again#
We keep each photo's source URL and the SHA-256 of the bytes we fetched. On the next push:
- with your
digest(the SHA-256 of the image bytes, 64 lower-case hex characters), a photo is reused only when its URL matches a stored photo and your digest equals the SHA-256 of the bytes we stored for it; otherwise it is downloaded again — change the digest when the image at a URL changes; - without your
digest, the URL alone decides. Without your digest, a URL we already hold is reused as is and never fetched again.
If you replace the image behind a URL without changing the URL, send digest so we notice.
When a fetch fails#
| Failure | Examples | What happens |
|---|---|---|
| Transient | timeout, HTTP 5xx or 429 from your host | the item retries with backoff (1, 2, 5, 15, 30 minutes); after 5 attempts it fails with photo_fetch_failed |
| Permanent | HTTP 4xx, not an image, too large, a disallowed address | the item fails at once with photo_fetch_failed; the URL and the reason are in the item's details |
A failed item does not change what is already published. Fix the photo and push again.
Fetcher limits#
HTTPS on port 443 only, public hosts only, at most 3 redirects, 15 seconds and 10 MiB per image, JPEG, PNG, WebP or AVIF (SVG and GIF are refused). Images are re-encoded to WebP, at most 2560 px, metadata stripped. Our egress addresses are not published: serve photos from a public CDN. Details on the fetcher page.
Last updated