Capture link
Any Estanza share link can be opened by a headless browser and screenshotted. Add view options to the link, add capture=1, wait for the page to say it is ready, then take the picture. No API key and no sign-in: the link is the permission, the same link a person would open.
The recipe
With Playwright, in three steps after opening the page:
const page = await browser.newPage({ viewport: { width: 1600, height: 1000 } });
await page.goto('https://app.estanza.casa/share/SHARE_ID?capture=1&view=3d&camera=south-east&time=day');
await page.waitForSelector('html[data-ready="true"]', { timeout: 60_000 });
await page.screenshot({ path: 'home.png' });The picture is the size of the browser window. Set the viewport to the size you want; 1600 by 1000 is a good default for a model to read.
Parameters
Every option is optional. A value the viewer does not know is ignored and the default is used, so a typo gives you the plain view rather than an error.
capture=11 or true. Default: off.
Hides every control, the floor chips and the Estanza mark, frames the home, freezes the quality tier and turns on the ready signal. Room names stay, because they are part of the drawing.
view3d, 2d. Default: 3d.
Opens the 3D model or the flat floor plan.
floora floor id, or its place in the floor list counting from 1. Default: every floor in 3D, the main floor in 2D.
Shows one floor.
rooma room id or slug. Default: none.
Frames one room and opens its floor. It wins over floor when the two disagree.
timeday, night. Default: day.
Lights the 3D model for day or night. The flat plan has no night.
cameraoverview, north, north-east, east, south-east, south, south-west, west, north-west. Default: overview.
Where the camera stands, by the compass of the plan. A compass camera looks down at 35 degrees; overview is the angle the viewer opens with.
yawdegrees, 0 is north and 90 is east. Default: from camera.
Turns the camera around the home. It wins over camera.
pitchdegrees, 5 to 85. Default: from camera.
How far the camera looks down. Values outside the range are held at its ends.
zoom0.25 to 4. Default: 1.
Above 1 comes closer than the fit, below 1 steps back.
qualitysaver, balanced, sharp, full. Default: full on a capture link.
The rendering tier. A capture link never changes tier while it draws.
labels1 or true, 0 or false. Default: 1.
Room names and areas. In 3D they show only when one floor is on screen.
cables1 or true, 0 or false. Default: 0.
Cable runs and the sockets, racks and access points they connect, in their cable colours, with the length of each run on the plan. They are drawn where they really are, so in 3D a wall or a sofa can hide them; the flat plan shows them all.
furniture1 or true, 0 or false. Default: 1.
Furniture, appliances, plants and every other placed item. The framing stays the same with it off.
lights1 or true, 0 or false. Default: 1.
Light fittings and their plan symbols. With it off the rooms stay lit as before; only the fittings go.
notes1 or true, 0 or false. Default: 1.
The notes the owner wrote on the plan.
The ready signal
On a capture link the page sets data-ready="false" on its html element and switches it to "true" once the frame is final, which means all of these hold:
- The home has loaded, with every furniture model and texture it asked for.
- The camera has framed the home or the room.
- The fonts the page uses have loaded.
- At least one frame has been drawn after the last of those, and nothing has been drawn for half a second since.
If anything on screen changes after that, for example the window is resized, it goes back to "false" until the new frame is final. A share link that was revoked never turns ready, so always wait with a timeout.
The page draws only when something changes, so a capture tab left open costs nothing once it is ready.