Pixly Developer Docs
Everything Pixly's app can generate — virtual staging, photo enhancement, cinematic video — is callable by AI agents and scripts through one MCP endpoint, with an OAuth sign-in flow and a CLI on top. This page is the complete reference; the machine-readable mirror lives at /docs.md.
Getting started
The fastest path, end to end:
- Create an API key in Settings → API keys (shown once — copy it immediately). An active Pixly subscription is required.
- Connect a client (one-step setup per client) or install the CLI:
npx pixly-cli help - Ask for a staged room — or run
pixly stage photo.jpg --style scandinavian
Generations spend the account's normal credit balance — same pipeline, quality, and pricing as the app, and every result also appears in the Pixly Library.
Authentication
Two credential types, both sent as Authorization: Bearer <token>:
- API keys (pixly_sk_…) — for Claude Code, Cursor, scripts, and CI. Created in Settings, stored hashed, revocable instantly. Keys can never mint other keys.
- OAuth 2.1 (pixly_at_… access tokens) — for clients with a sign-in flow, like claude.ai custom connectors. Public clients with PKCE S256 only; single-use authorization codes; refresh-token rotation.
OAuth surface (discovery starts from the 401 WWW-Authenticate header):
| Parameter | Type | Required | Description |
|---|---|---|---|
| GET /.well-known/oauth-authorization-server | — | no | RFC 8414 authorization-server metadata (endpoints, PKCE methods, grant types) |
| GET /.well-known/oauth-protected-resource/api/mcp | — | no | RFC 9728 protected-resource metadata — advertised in the 401 WWW-Authenticate header |
| POST /api/oauth/register | — | no | RFC 7591 dynamic client registration (open; public clients; body: client_name, redirect_uris[]) |
| GET /oauth/authorize | — | no | User consent page — query: response_type=code, client_id, redirect_uri, state, code_challenge, code_challenge_method=S256 |
| POST /api/oauth/token | — | no | Token endpoint — grant_type authorization_code (code, code_verifier, client_id, redirect_uri) or refresh_token (rotates the pair). Form-encoded or JSON. |
MCP endpoint
POST https://pixly.app/api/mcp
Model Context Protocol over streamable HTTP, stateless: single JSON responses, no SSE streams, no sessions. Protocol versions 2025-03-26 and 2025-06-18. Methods: initialize, tools/list, tools/call, ping; notifications return 202.
Example request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "virtual_staging",
"arguments": {
"imageUrl": "https://example.com/living-room.jpg",
"style": "scandinavian"
}
}
}Example response — result.content[0].text is JSON (a job snapshot); tool failures set result.isError: true with an actionable message:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\n \"jobId\": \"4bf4bb95-f5af-44d8-9508-65807f68636d\",\n \"type\": \"image_staging\",\n \"status\": \"processing\",\n \"creditsCharged\": 1,\n \"createdAt\": \"2026-08-10T20:07:08Z\",\n \"note\": \"Still running — call get_job again in a few seconds.\"\n}"
}
]
}
}REST API
Prefer plain HTTP to JSON-RPC? Every tool is also a REST endpoint — same pipeline, same credits, results in the same Library. Identical bearer auth. /v1 is a stable contract: fields and tools get added, never removed or reshaped.
| Parameter | Type | Required | Description |
|---|---|---|---|
| GET /api/v1/openapi.json | — | no | This API as an OpenAPI 3.1 document (no auth) — for platforms that build a connector from an OpenAPI URL |
| GET /api/v1/tools | — | no | Tool catalog with JSON Schema for every input — self-documenting |
| POST /api/v1/tools/{slug} | — | no | Run a tool. 200 = finished inline (photo tools), 202 = accepted, poll the job (video tools) |
| POST /api/v1/uploads | — | no | Only for local files: { "filename", "contentType" } returns a presigned PUT ticket, an imageUrl to pass to any tool, and a non-expiring r2Path. (A photo that already has a URL goes straight to a tool as imageUrl.) |
| GET /api/v1/jobs/{id} | — | no | Job status + result URLs (valid 7 days) |
| GET /api/v1/jobs | — | no | Recent generations — ?limit=1-50&type=images|videos |
| GET /api/v1/library | — | no | Your library as pictures (thumbnail, file, source, r2Path) — ?limit=1-60&type=images|videos|uploads&locale=en|es|pt|de|fr|it|pl|cs&before=<nextBefore> |
| GET /api/v1/account | — | no | Credit balance and plan |
| POST /api/v1/checkout | — | no | A Stripe Checkout URL for the account holder to pay on — call it when a tool answers 402. Body (optional): { "plan": "starter" | "agent" | "pro_agent" | "team" } for an account with no plan, { "topUpUsd": 10-500 } for one that has a plan. Nothing is charged until a person completes the page. |
End to end:
# 1. run a tool — pass the photo's URL, we fetch and store it
curl -X POST https://pixly.app/api/v1/tools/virtual_staging \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/living-room.jpg","style":"scandinavian"}'
# → { "jobId": "...", "status": "completed", "creditsCharged": 1, "resultUrls": ["https://..."] }
# 2. for video tools (202), poll until completed
curl https://pixly.app/api/v1/jobs/JOB_ID -H "Authorization: Bearer $PIXLY_API_KEY"
# Local file with no URL? Get a presigned PUT ticket, upload, pass r2Path.
curl -X POST https://pixly.app/api/v1/uploads \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"filename":"living-room.jpg","contentType":"image/jpeg"}'
# → { "uploadUrl": "https://...", "r2Path": "users/.../living-room.jpg" }Status codes:
| Parameter | Type | Required | Description |
|---|---|---|---|
| 200 | — | no | Done — resultUrls present (photo tools finish inline) |
| 202 | — | no | Accepted and running — poll GET /api/v1/jobs/{id} (video tools) |
| 401 | — | no | Missing/invalid credential |
| 402 | — | no | Out of credits, or no active subscription (error.required = credits needed) — POST /api/v1/checkout returns a payment link |
| 404 | — | no | Unknown tool or job |
| 409 | — | no | A request with the same Idempotency-Key is still running — retry in a few seconds for its result |
| 410 | — | no | Source photo no longer available — re-upload |
| 422 | — | no | Invalid input — error.issues lists the offending fields |
| 429 | — | no | Rate limited — see Retry-After (120 req/min, 30/min for generations) |
| 502 / 503 | — | no | Provider trouble; credits from a charged job auto-refund within 24h |
Errors come back as { "error": { "code", "message", "issues"?, "required"?, "jobId"? } }.
Typical workflow
- Call a generation tool with imageUrl — any public https URL, or a data:image/…;base64, URI. Pixly fetches and stores it for you → job snapshot.
- Poll get_job until status: "completed" → download resultUrls. Image tools usually complete inline (up to ~2 min); videos take 1–5 minutes.
Results come back as URLs, so chaining needs no upload step — feed a resultUrlsentry straight back in as the next tool's imageUrl to animate a photo you just staged. Only a local file with no URL needs create_upload_ticket first: PUT the bytes to the returned uploadUrl, then send r2Path instead.
Tools reference
Generated from the live tool registry. Every tool is callable three ways — MCP, REST, and the CLI — with identical parameters.
virtual_staging
Try it in the app →AI virtual staging: furnish and style an empty (or badly furnished) room photo in a chosen interior design style — also the tool for "redesign this room" or "show this room in another style". HD, watermark-free results. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| style | string | yes | Interior style id. One of: modern-minimal, scandinavian, industrial, mid-century-modern, japandi, contemporary, transitional, urban-chic, bauhaus, organic-modern, brutalist, italian-modern, traditional, art-deco, colonial, victorian, french-country, english-cottage, neoclassical, art-nouveau, grandmillennial, hollywood-regency, parisian-chic, modern-classic, craftsman, mediterranean, mediterranean-modern, rustic-farmhouse, bohemian, tropical, family-staging, hygge, wabi-sabi, modern-farmhouse, cottagecore, shabby-chic, cabin-lodge, eclectic, retro-70s, warm-luxury, investor-premium, contemporary-dark, glam, penthouse-modern, hotel-suite, maximalist, quiet-luxury, coastal, desert-modern, hacienda, pacific-northwest, caribbean-resort, hamptons, moroccan, tuscan, southwestern, asian-zen, coastal-grandmother, cape-cod, california-casual, mountain-modern. When the user has no preference, "modern-minimal" or "scandinavian" suit most listings. |
| roomType | string | no | Room type hint; omit to let vision infer it from the photo |
| customInstructions | string | no | Optional: ONLY a wish the user stated beyond the style and room, in their words (e.g. "add a reading chair", "no rug"). Leave it out otherwise — Pixly writes the staging prompt itself (keeps walls, windows and camera angle, furnishes to scale); never restate the request or list furniture here. |
| numImagesdeprecated | integer (default: 1) | no | Ignored — staging always returns one image. Call again for another take. |
| stagingQualitydeprecated | "standard" | "pro" | no | Ignored — the Pro tier is retired. Every staging costs 1 credit. |
curl -X POST https://pixly.app/api/v1/tools/virtual_staging \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg","style":"..."}'edit_staged_photo
Change one thing in a photo and keep everything else exactly as it is — the parts the edit doesn't touch are copied from the photo, not redrawn. Works on any photo: a staged room, any Pixly result, or the user's own picture (swap the sofa, recolour a wall, remove a car, change the words on a sign). Optional `mask` limits the change to a marked area. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | The photo to edit: a Pixly result (a resultUrls entry), the user's own photo, or any public image URL / data:image URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of the photo to edit (a resultPaths entry, or an upload) — the alternative to imageUrl. |
| style | string | no | Optional. Style id of the staging being edited (the ids virtual_staging takes). Left out, it is read from the photo's history; a photo that was never staged needs none. |
| customInstructions | string | yes | The change to make, in the user's words, e.g. "make the sofa dark green", "remove the car from the driveway", "change the sign to SOLD". |
| mask | string | no | Optional area to change: a PNG as a data:image/png;base64 URI or an https URL, the photo's shape, WHITE where the photo may change and BLACK (or transparent) everywhere else. Leave it out to let the request alone decide — that already keeps the rest of the photo. |
| maskR2Path | string | no | Storage path of a mask — the alternative to mask. |
| sourceJobId | string | no | Job the photo came from, when it is a Pixly result (lineage) |
| sourceResultIndex | integer | no | Which of that job's results was edited |
curl -X POST https://pixly.app/api/v1/tools/edit_staged_photo \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg","customInstructions":"..."}'cinematic_motion
Try it in the app →Photo to video: turn a single listing photo into a short cinematic real estate video with a professional camera move (zoom, orbit, fly-through, crane up…). No second frame needed. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| cameraMove | "zoom" | "fly-through" | "orbit" | "pan" | "aerial" | "pull-back" | "crane-up" | "tilt-up" | "boom-down" | "drone-orbit" | "flyover" | "pull-away" | "handheld" | no | Camera-move preset |
| direction | "left-to-right" | "right-to-left" | no | The direction the camera travels, for the moves that have one (orbit, pan, drone-orbit). 'left-to-right' sends the camera rightward, 'right-to-left' leftward. Ignored by every other move; omit to use the move's own default. |
| durationSeconds | 5 | 10 | no | Clip length in seconds. Leave out for the default 5 s; 10 s costs about twice as much — use it only when the user asks for a longer video. |
| format | "original" | "9:16" | "16:9" | no | Video shape. original (default) keeps the photo's own shape; 9:16 or 16:9 crop the photo, centred, to that shape before it is animated. |
curl -X POST https://pixly.app/api/v1/tools/cinematic_motion \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'photo_to_video
Try it in the app →Turn a start photo — and optionally an end photo — into a video. With an end photo the camera travels from the first photo and lands exactly on the second (e.g. two views of the same kitchen → an orbit around the island). Pick a ready-made camera move or write your own prompt; choose the model, length and sound. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Start frame — where the video begins. Public https URL or data: URI; either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| endImageUrl | string | no | Optional end frame — the camera travels from the start photo and lands exactly on this one. Best when both photos show the same space from different spots. |
| endR2Pathadvanced | string | no | R2 path of the end frame — the alternative to endImageUrl. |
| cameraMove | "smooth" | "walk" | "orbitLeft" | "orbitRight" | "pushIn" | "pullBack" | "riseUp" | no | Ready-made camera move used when no prompt is given. |
| prompt | string | no | Your own description of the video, in any language. Replaces cameraMove when set. |
| model | "kling-v3" | "kling-2.6" | no | kling-v3: 3/5/8/10/15 s, optional sound, lands most precisely on the end frame. kling-2.6: 5/10 s, silent, cheaper. |
| durationSeconds | integer (default: 5) | no | Clip length. kling-v3 takes 3, 5, 8, 10 or 15; kling-2.6 takes 5 or 10. |
| sound | boolean (default: false) | no | Add ambient sound (kling-v3 only; kling-2.6 is always silent). |
| format | "original" | "16:9" | "9:16" | "1:1" | no | Video shape. original (default) keeps the start photo's own shape; 16:9, 9:16 or 1:1 crop the photos, centred, to that shape before they are animated. |
curl -X POST https://pixly.app/api/v1/tools/photo_to_video \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg","endImageUrl":"https://example.com/room.jpg"}'before_after_reel
Try it in the app →Before and after video: animate a before→after transformation (e.g. empty room → staged, or a renovation, or a daylight photo → its Day to Night version with videoIntent day_to_night) into a social-ready reveal reel from two photos. Both photos are required. Only have one? Make the other first with a photo tool — virtual_staging (empty room → furnished), remove_furniture (furnished → empty), day_to_night, restyle_room, makeover_exterior and the other edit tools — and pass its result as afterImageUrl (or beforeImageUrl). Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| beforeImageUrl | string | no | Start frame (e.g. the empty room photo) — https URL or data: URI |
| afterImageUrl | string | no | End frame (e.g. the staged result) — https URL or data: URI |
| beforeR2Pathadvanced | string | no | R2 path of the start frame — the alternative to beforeImageUrl. |
| afterR2Pathadvanced | string | no | R2 path of the end frame — the alternative to afterImageUrl. |
| videoIntent | "staging_reveal" | "staging_reveal_reverse" | "construction_timelapse" | "day_to_night" | no | staging_reveal: an empty room becoming a furnished one (or a renovation). day_to_night: Before is a daylight photo and After its dusk version (a Pixly Day to Night result and its original) — the video turns day into the lit evening; revealStyle does not apply. |
| revealStyle | "smooth" | "slideIn" | "dropLand" | "glowBuild" | "movers" | no | How the transformation is revealed |
| durationSeconds | 5 | 10 | no | |
| format | "original" | "9:16" | "16:9" | "1:1" | no | Video shape. original (default) keeps the photos' own shape; 9:16, 16:9 or 1:1 crop both photos, centred, to that shape first. |
curl -X POST https://pixly.app/api/v1/tools/before_after_reel \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"beforeImageUrl":"https://example.com/room.jpg","afterImageUrl":"https://example.com/room.jpg"}'flythrough_video
Try it in the app →Flythrough video: one continuous camera move through a home from 2-4 room photos in walking order. Each pair of neighbouring photos becomes a 3-second move that flies from one room into the next, and the moves are stitched into one film with a cinematic speed ramp. Returns one job: poll get_job until the film is ready (a few minutes). Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| photos | array | yes | The rooms in walking order, 2 to 4 photos (e.g. hallway → living room → kitchen). Each photo should show the doorway or opening into the next room — the camera flies through it. Each item takes imageUrl or r2Path. |
| format | "16:9" | "9:16" | "1:1" | no | Film shape. Omit to follow the photos (landscape photos → 16:9). |
| title | string | no | Optional name for the tour, e.g. the street address. |
curl -X POST https://pixly.app/api/v1/tools/flythrough_video \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"photos":"..."}'before_after_image
Try it in the app →Free (no credits): one comparison image from a before and an after photo of the same place — e.g. an empty room and its virtual staging, a daylight shot and its dusk version, a room before and after a restyle. Side by side, stacked, or split by a line; original shape, square, 4:5 or 9:16. Write the labels in the user's language. Returns a finished image at once.
| Parameter | Type | Required | Description |
|---|---|---|---|
| beforeImageUrl | string | no | The BEFORE photo (e.g. the empty room, the daylight shot). Public https URL or data: URI; or beforeR2Path. |
| beforeR2Pathadvanced | string | no | Storage path of the before photo — the alternative to beforeImageUrl. For a Pixly result, its original photo is the job's source. |
| afterImageUrl | string | no | The AFTER photo (e.g. the staged room, the dusk version). Public https URL or data: URI; or afterR2Path. |
| afterR2Pathadvanced | string | no | Storage path of the after photo — the alternative to afterImageUrl. |
| layout | "side" | "stack" | "vsplit" | "diagonal" | no | side = next to each other, stack = one above the other, vsplit = one frame split by a vertical line, diagonal = split by a slanted line. |
| aspect | "original" | "1:1" | "4:5" | "9:16" | no | Shape of the image: original (follows the photos), 1:1 square, 4:5 Instagram post, 9:16 Stories/Reels. |
| labels | boolean (default: true) | no | Show the Before / After labels. |
| beforeLabel | string | no | Label text for the before photo, in the user's language (default "Before"). |
| afterLabel | string | no | Label text for the after photo, in the user's language (default "After"). |
curl -X POST https://pixly.app/api/v1/tools/before_after_image \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"beforeImageUrl":"https://example.com/room.jpg","afterImageUrl":"https://example.com/room.jpg"}'watermark_photos
Try it in the app →Free (no credits): put the agent's or agency's mark on listing photos — text (name, phone) and/or the logo saved on their Pixly account — in a corner or the middle, up to 10 photos per call. Returns every marked photo at once.
| Parameter | Type | Required | Description |
|---|---|---|---|
| photos | array | yes | The photos to mark, 1–10. Each item takes imageUrl or r2Path. |
| text | string | no | The text, e.g. "Smith Realty · 555-0100". Optional when the account has a saved logo. |
| position | "bottom-right" | "bottom-left" | "top-right" | "top-left" | "center" | no | |
| size | "small" | "medium" | "large" | no | |
| useLogo | boolean (default: true) | no | Add the logo saved on the account (Pixly floor plan settings), when there is one. |
curl -X POST https://pixly.app/api/v1/tools/watermark_photos \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"photos":"..."}'blur_faces_plates
Try it in the app →Free (no credits): find and blur people's faces and car licence plates in property photos before they're posted — street and exterior shots, open houses. Automatic detection, 1–5 photos per call. Says so when nothing is found.
| Parameter | Type | Required | Description |
|---|---|---|---|
| photos | array | yes | The photos, 1–5. Each item takes imageUrl or r2Path. |
| faces | boolean (default: true) | no | |
| plates | boolean (default: true) | no | |
| style | "blur" | "pixelate" | no |
curl -X POST https://pixly.app/api/v1/tools/blur_faces_plates \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"photos":"..."}'straighten_photo
Try it in the app →Free (no credits): automatically straighten a property photo — leaning walls made vertical (converging verticals from a tilted camera) and a tilted horizon levelled, like a pro photographer's lens correction. Crops the edges slightly. Best before staging or any other edit. Says so when the photo is already straight or has no straight lines to go by.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
curl -X POST https://pixly.app/api/v1/tools/straighten_photo \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'draw_floor_plan
Try it in the app →Free (no credits): draw a clean 2D floor plan from a layout YOU write — read the user's description, or look at their hand sketch or brochure plan, and send every room as a rectangle in metres (or feet) plus doors and windows. Returns the drawn plan (areas and dimensions on it) at once, saved so the user can fine-tune it in Pixly's floor plan editor. If the layout has problems (overlapping rooms, a door between rooms that don't touch) you get exactly what to fix — fix it and call again. To change a plan, call again with its planId and the whole updated layout; the new version is saved as its own plan and the earlier one is kept.
| Parameter | Type | Required | Description |
|---|---|---|---|
| title | string | no | Address or listing name for the plan's title block. |
| units | "m" | "ft" | no | Units of every number below, and of the labels on the plan. |
| rooms | array | yes | Every room as an axis-aligned rectangle. Neighbouring rooms must share the wall exactly (one's right edge = the other's left edge) and must not overlap. An L-shaped space = two rectangles joined by a doorway. Lay out a typical sensible plan when the user gives only rough sizes. |
| doors | array (default: []) | no | |
| windows | array (default: []) | no | |
| planId | string | no | To CHANGE a plan you drew before: its planId from that result, with the whole updated layout — saved as a new plan beside it (nothing is overwritten). Omit for a new plan. |
curl -X POST https://pixly.app/api/v1/tools/draw_floor_plan \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"rooms":"..."}'enhance_photo
Try it in the app →Real estate photo editing in one step: turn an amateur listing photo into a finished, professional photo (exposure, color, clarity). Returns 3 variants to pick from. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
curl -X POST https://pixly.app/api/v1/tools/enhance_photo \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'declutter_photo
Try it in the app →Remove clutter, mess, and personal items from a listing photo while keeping the room, furniture, and architecture intact. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
curl -X POST https://pixly.app/api/v1/tools/declutter_photo \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'remove_furniture
Try it in the app →Remove furniture from a photo: empty a room and rebuild the surfaces behind what was taken out, keeping the architecture and camera angle identical — the blank canvas for restaging. By default it also removes the room's own joinery (fitted kitchen, built-in wardrobes, bathroom fixtures); mode 'movable' leaves those alone, and an optional extra takes the floor covering out too, for a full renovation strip-back. Doors always stay. (Declutter is the opposite: it keeps the furniture.) Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| mode | "movable" | "fitted" | no | How far to strip the room. 'fitted' (the default) removes the movable contents AND the room's own joinery — the fitted kitchen and its appliances, built-in wardrobes and shelving, and bathroom sanitaryware. 'movable' removes only furniture, rugs, curtains, art, plants and lamps, leaving the kitchen, built-ins, sanitaryware, floor and doors exactly as they are. |
| extras | array | no | Extra things to take out, for a full strip-back. Only applies with mode 'fitted' and is ignored otherwise: 'floor' takes the floor covering down to bare concrete screed. Omit to keep the floor. Doors always stay, as do walls, ceiling, windows, structural openings and the camera. |
curl -X POST https://pixly.app/api/v1/tools/remove_furniture \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'day_to_night
Try it in the app →Day to dusk (virtual twilight): turn a daytime listing photo into a magazine-style evening scene — lights on, warm glow, dusk sky — with the building and camera angle unchanged. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
curl -X POST https://pixly.app/api/v1/tools/day_to_night \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'replace_sky
Try it in the app →Replace a grey, overcast or blown-out sky in an exterior listing photo with a natural clear blue sky, matching the light and keeping the building, trees and reflections unchanged. A run takes about 1–2 minutes; poll get_job until it completes. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| sky | "auto" | "clear" | "light_clouds" | "dramatic_clouds" | "sunset" | "pastel_sunrise" | "winter_clear" | no | Sky style. 'auto' lets the tool pick what suits the photo's light. |
| sun | "auto" | "on" | "off" | no | Sun glow: auto (a glow for sunset/sunrise styles, none otherwise), on (place it with sunX/sunY), off. |
| sunX | number | no | With sun=on: glow position from the left edge, 0..1. |
| sunY | number | no | With sun=on: glow position from the top edge, 0..1 (kept in the top 60%). |
curl -X POST https://pixly.app/api/v1/tools/replace_sky \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'replace_lawn
Try it in the app →Turn patchy, brown or bare grass in an exterior listing photo into a healthy green lawn, leaving driveways, paths, beds and the house untouched. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| lawn | "auto" | "fresh_mown" | "lush" | "natural" | "golf" | "warm_season" | no | Lawn style. 'auto' lets the tool pick a healthy lawn that suits the photo. |
| shade | "light" | "medium" | "deep" | no | How green; only used with a chosen lawn style. |
| stripes | "auto" | "on" | "off" | no | Mowing stripes: auto (stripes for fresh_mown and golf, none otherwise), on, off. |
curl -X POST https://pixly.app/api/v1/tools/replace_lawn \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'restyle_room
Try it in the app →Give one or more surfaces of a room a new finish — repaint the walls, change the floor, reface the kitchen cabinets and worktop, retile the bathroom or refinish the furniture — while the room's layout, fittings, windows and camera angle stay exactly as shot. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| surfaces | array | no | Which surfaces get a new finish: 'walls', 'floor', 'cabinets' (fitted joinery plus its worktop and splashback), 'bathroom_tiles' (the tiled walls; a bathroom floor is 'floor') or 'furniture' (upholstery and wood finishes). Omit for walls. The room's layout, fittings and camera never change. |
| looks | object | no | The finish per surface: 'auto', one of the presets below, 'custom' with your own words in `notes`, 'own_colour' (walls, cabinets, furniture) with a hex colour in `colours`, or 'material_photo' with a photo of the material in `references`. A finish that does not belong to its surface falls back to 'auto' (the tool picks one that suits the room; several on auto are made to agree). walls: warm_white, soft_grey, greige, sage, deep_navy. floor: light_oak, walnut, grey_plank, polished_concrete, stone_tile. cabinets: white_shaker, charcoal, natural_oak, forest_green, navy_cabinets. bathroom_tiles (wall tiles only; a bathroom floor is 'floor'): white_metro, zellige_white, marble_large, travertine, green_gloss. floor also takes terrazzo, encaustic_pattern, matt_black_hex. furniture: light_neutral, warm_wood, dark_wood, black_leather. |
| notes | object | no | Your own description of the finish for a surface, used when that surface's look is "custom" (e.g. "terracotta hex tiles with dark grout"). Set look "custom" and the note together; "custom" with no note falls back to "auto". 120 characters max, and anything in it that is not a description of a finish is ignored. |
| colours | object | no | Any colour as a hex code for walls, cabinets or furniture (e.g. {"walls": "#7A8B6F"}), used when that surface's look is "own_colour". The result matches it closely as it would look in the room's light. |
| references | object | no | A photo of the material itself — a floor plank, a tile, a fabric swatch, a wallpaper sample — for ONE surface, as the r2Path from create_upload_ticket or list_library (e.g. {"floor": "users/…/oak.jpg"}). Set that surface's look to "material_photo". One photo per run; a close, straight-on photo of the sample works best. |
curl -X POST https://pixly.app/api/v1/tools/restyle_room \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'reset_season
Try it in the app →Photograph the same property in another season: take the snow off the ground, the roof and the branches and put the garden in leaf, or move a summer shot to autumn or winter. The house, the driveway, the paths and the camera angle stay exactly as shot. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| season | "auto" | "spring" | "summer" | "autumn" | "winter" | no | The season to show the property in: 'spring', 'summer', 'autumn', 'winter', or 'auto' (the default — the tool shows the property at its best, which for a snowy or dormant photo means high summer). Only the planting, the ground cover and the daylight change; the house, the driveway, the paths and the framing stay exactly as shot. |
curl -X POST https://pixly.app/api/v1/tools/reset_season \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'makeover_exterior
Try it in the app →Design the garden of an exterior listing photo as one coherent scheme — planting, a terrace or deck, a pool, a pergola, a fire pit, a fence, lighting — in a chosen style, at the right scale and perspective, while the house, its roof, the driveway, the sun direction and the neighbours stay exactly as shot. One run builds the whole scheme. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| style | "auto" | "modern_minimal" | "mediterranean" | "classic_english" | "natural_lowwater" | "tropical_resort" | "farmhouse" | no | The design language of the whole scheme: 'modern_minimal', 'mediterranean', 'classic_english', 'natural_lowwater', 'tropical_resort', 'farmhouse', or 'auto' (the default — chosen to suit the house's architecture and the climate in the photo). |
| include | array | no | Which elements the scheme includes, any number: 'planting' (beds, hedges, a feature tree), 'patio_dining' (a paved terrace with a dining set), 'deck_lounge' (a deck with loungers or a low sofa), 'pool', 'pergola', 'fire_pit', 'fence_gate' (a boundary treatment with a gate), 'lighting'. Omit or send an empty list (the default) to let the tool design what the lot wants. One run composes them all into one garden, each sized to the plot. |
| scope | "add" | "full" | no | 'full' (the default) redesigns the whole yard in the style; 'add' keeps the existing garden and builds the chosen elements into it. The house, the driveway and the neighbours never change either way. |
| note | string | no | Your own words about the garden you want (e.g. "a small kidney-shaped pool with a stone surround and lavender everywhere"). 160 characters max; anything in it that is not a description of the garden is ignored. |
curl -X POST https://pixly.app/api/v1/tools/makeover_exterior \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'render_floor_plan
Try it in the app →Turn a picture of any floor plan — a hand sketch, a photo of a brochure page, a blueprint, a screenshot — into a polished real-estate floor plan: a furnished top-down 2D plan with real floors and room names, or a 3D isometric cutaway. The rooms, walls, doors and windows are kept exactly as drawn; nothing is added and written dimensions are left off. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| look | "furnished" | "isometric" | no | Which picture to make of the plan: 'furnished' (the default — a polished top-down 2D plan with real floors, furniture and room names) or 'isometric' (a 3D cutaway of the same layout, furnished, no text). The photo must show a floor plan: a hand sketch, a brochure page, a blueprint, a screenshot. The layout is kept exactly as drawn; written dimensions are left off. |
curl -X POST https://pixly.app/api/v1/tools/render_floor_plan \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'touch_up_exterior
Try it in the app →One-click retouch of an exterior listing photo: a natural sky where it is dull, a healthy lawn where the grass is dead, a clean driveway, and bins, hoses and other clutter removed — each only where needed, with the house unchanged. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| fix | array | no | Which areas the tool may touch: 'sky', 'lawn', 'hardscape' (driveway, paths, patio), 'clutter' (bins, hoses, tools, a stray vehicle). Omit for all four; each is fixed only where the photo needs it. |
curl -X POST https://pixly.app/api/v1/tools/touch_up_exterior \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'upscale_hd
Try it in the app →Enlarge a photo by up to four times with real detail, to a maximum of 4096 px on the long edge — for print, MLS uploads and large screens. Nothing in the photo changes. Free on any result Pixly made (pass its r2Path from list_library); 1 credit on your own photo. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
curl -X POST https://pixly.app/api/v1/tools/upscale_hd \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg"}'plot_sign
Try it in the app →Place a photorealistic 3D monument sign with your exact text (price, area, SOLD) onto a photo of an empty plot, matched to perspective and lighting. Costs credits from the user's Pixly balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| imageUrl | string | no | Public https URL of the source photo, or a data: URI. Either imageUrl or r2Path is required. |
| r2Pathadvanced | string | no | Storage path of a photo already in the user's Pixly library (from list_library, or returned by an upload ticket) — the alternative to imageUrl. |
| text | string | yes | Sign label, verbatim — a price ("$1,200,000"), area ("800 m²"), or short word ("SOLD") |
| look | "stone" | "metal" | "grass" | "sign" | no | Sign material/style; defaults server-side |
| orientation | "standing" | "lying" | no | Letter orientation (letter looks only); defaults server-side |
curl -X POST https://pixly.app/api/v1/tools/plot_sign \
-H "Authorization: Bearer $PIXLY_API_KEY" -H "Content-Type: application/json" \
-d '{"imageUrl":"https://example.com/room.jpg","text":"..."}'upload_image_from_url
Rarely needed: generation tools take an imageUrl directly. Use this only to import a photo into Pixly ahead of time, e.g. to reuse one URL across several tools without refetching it each time.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Publicly reachable image URL (JPG/PNG/WebP, max 10 MB) to import into Pixly |
create_upload_ticket
Get a presigned upload URL for a LOCAL image file — the one case a URL can't cover. PUT the file to uploadUrl with the same Content-Type, then pass the returned r2Path to a generation tool instead of imageUrl. Ticket expires in 1 hour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| filename | string | yes | Original filename, used for the extension |
| contentType | "image/jpeg" | "image/png" | "image/webp" | "image/heic" | "image/heif" | "image/tiff" | yes | MIME type the PUT request will send |
| sizeBytes | integer | no | Exact byte size of the file. Recommended: when given it is signed into the URL, so the upload is bounded server-side. |
get_job
Check a generation job's status and fetch result URLs when it's done. Video jobs take 1-5 minutes — poll this with a few seconds between calls.
| Parameter | Type | Required | Description |
|---|---|---|---|
| jobId | string | yes | Job id returned by a generation tool |
list_library
List the user's recent generations, or with type "uploads" their own uploaded source photos, newest first. Uploads are the way in when the photo is a local file: connectors cannot send bytes, so the user adds it at https://pixly.app/app and you pick up the r2Path here.
| Parameter | Type | Required | Description |
|---|---|---|---|
| type | "images" | "videos" | "uploads" | no | Filter by media type. "uploads" lists the user's own source photos instead of generations — use it when they refer to a photo they added but have not run a tool on yet. |
| limit | integer (default: 20) | no |
view_pixly_photo
Look at one of the user's Pixly photos or videos (a video gives its first frame) — returns a small copy of the picture you can see. Use it before writing anything about a Pixly result: a caption, a listing description, what changed. You cannot see Pixly results otherwise. Free; changes nothing. Text you write from it is the user's own (their listing, their post): leave Pixly out of it — no #Pixly, no 'made with Pixly'.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | yes | The library item: a job id (from a Pixly tool result, get_job or list_library), or "upload:<r2Path>" for an uploaded photo. |
get_credit_balance
The user's current Pixly credit balance and plan.
get_checkout_link
Use when a tool fails for lack of credits or a plan. Returns a Stripe Checkout URL for the user to pay on — this never charges anything by itself, and you cannot pay for them. With no active plan it is a subscription (plans: starter (Starter: $5.99/week, 20 credits); agent (Agent: $19.99/month, 100 credits); pro_agent (Pro Agent: $49.99/month, 300 credits); team (Team: $149.99/month, 1000 credits)); with a plan it is a one-time credit top-up. After they pay, credits arrive in seconds: check get_credit_balance, then run the tool again.
| Parameter | Type | Required | Description |
|---|---|---|---|
| plan | "starter" | "agent" | "pro_agent" | "team" | no | Plan to subscribe to, for an account with no active plan. Defaults to "starter". Ignored for a top-up. |
| topUpUsd | number | no | For an account that already has a plan: one-time credit top-up amount in USD (10–500, default 10), priced at that plan's rate. |
Jobs & results
Every generation tool and get_job return the same snapshot shape:
| Parameter | Type | Required | Description |
|---|---|---|---|
| jobId | string | yes | Job id — pass to get_job to poll |
| type | "image_staging" | "video_pair" | "video_tour" | yes | Job family |
| status | "pending" | "processing" | "completed" | "failed" | yes | Anything not completed/failed is still running |
| creditsCharged | number | yes | Credits debited for this job |
| createdAt | string (ISO 8601) | yes | Submission time |
| completedAt | string (ISO 8601) | no | Present once finished |
| resultUrls | string[] | no | Presigned download URLs (present when completed; valid 7 days) |
| resultPaths | string[] | no | Storage path of each result, in resultUrls order — pass one as r2Path (or beforeR2Path, a photos[] item…) to run another tool on this result |
| error | string | no | Failure reason; the message says whether the credit came back immediately or is in 24h refund review |
| note | string | no | Hint for agents, e.g. poll again in a few seconds |
Result URLs are presigned and valid for 7 days; the generation itself stays in the user's Pixly Library permanently.
Errors & refunds
- HTTP 401 — missing or invalid credential. The WWW-Authenticate header carries the OAuth resource-metadata URL so OAuth-capable clients discover the sign-in flow automatically.
- JSON-RPC errors — -32700 parse, -32600 invalid request (batching is not supported), -32601 unknown method, -32602 invalid params, -32603 internal.
- Tool errors — result.isError: truewith a message agents can act on: insufficient credits (with the amount needed), invalid input (with the exact field), or a source photo that's no longer available.
- Refunds — a failed job always returns the credit. If it died before any model ran, the refund is immediate; otherwise it enters refund review and credits return within 24 hours. No action needed either way.
CLI
npx pixly-cli help # or: npm install -g pixly-cli export PIXLY_API_KEY=pixly_sk_...
Node ≥ 18, zero dependencies. Local photo arguments upload automatically; results download to the current directory (--out to choose a path; tools that return several results — enhance gives you 3 — get -1, -2, … suffixes).
pixly stage <photo> --style <id>
Virtually stage a room photo. Takes a URL or a local file (uploaded automatically).
- --style <id> (required) — style id, e.g. scandinavian, modern-luxury
- --room <type> — room-type hint; omitted = inferred from the photo
- --instructions <text> — extra instructions blended into the prompt
- --out <file.jpg> — output path (default: <name>-staged.jpg)
pixly enhance <photo>
Professional photo enhancement — returns 3 variants.
- --out <file.jpg>
pixly declutter <photo>
Remove clutter and personal items.
- --out <file.jpg>
pixly remove-furniture <photo>
Empty the room — all furniture, rugs, art and decor out, surfaces rebuilt. Walls, ceiling, windows and the camera never change.
- --movable — leave the fitted kitchen, built-ins and sanitaryware alone (default removes those too)
- --floor — take the floor covering down to bare screed as well (doors always stay)
- --out <file.jpg>
pixly day-to-night <photo>
Turn a daytime photo into a night scene.
- --out <file.jpg>
pixly sky <photo>
Replace a grey or overcast sky with a natural one; reflections updated, house unchanged. Auto by default.
- --sky clear|light-clouds|dramatic-clouds|sunset|pastel-sunrise|winter-clear (default auto)
- --sun auto|on|off · --sun-at <x,y> — place the sun, 0..1 from the top-left; implies --sun on
- --out <file.jpg>
pixly lawn <photo>
Turn patchy or brown grass into a healthy green lawn; only the grass changes. Auto by default.
- --lawn fresh-mown|lush|natural|golf|warm-season (default auto)
- --shade light|medium|deep · --stripes auto|on|off
- --out <file.jpg>
pixly season <photo> [--season winter]
Photograph the same property in another season — snow off the ground, roof and branches and the garden in leaf, or a summer shot moved to autumn or winter. The house, the driveway, the paths and the framing stay as shot. Auto by default.
- --season auto|spring|summer|autumn|winter (default auto — a snowy or bare photo comes back in high summer)
- --out <file.jpg> — output path
pixly restyle <photo> --walls sage --floor walnut
New finishes on the surfaces you name — walls, floor, kitchen cabinets, bathroom tiles, furniture — with the layout, fittings and camera unchanged. A surface with no flag is left alone; no flags at all repaints the walls on auto.
- --walls · --floor · --cabinets · --tiles · --furniture — a preset finish, `auto`, or the finish in your own words ("limewash in a warm clay", 120 chars max)
- --out <file.jpg> — output path
pixly makeover <photo>
Exterior Makeover — a whole garden scheme in one run (planting, terrace, pool, pergola…), with the house, driveway and neighbours unchanged.
- --style auto|modern-minimal|mediterranean|classic-english|natural-lowwater|tropical-resort|farmhouse (default auto)
- --include pool,pergola,fire-pit,… — planting, patio-dining, deck-lounge, pool, pergola, fire-pit, fence-gate, lighting
- --keep — build into the existing garden instead of redesigning the yard
- --note "…" — the garden in your own words (160 chars max)
- --out <file.jpg>
pixly floor-plan <picture>
Floor Plan Render — any picture of a plan (sketch, brochure page, blueprint, screenshot) becomes a furnished 2D plan or a 3D isometric view; the layout is kept exactly as drawn.
- --look furnished|isometric (default furnished)
- --out <file.jpg>
pixly upscale <photo>
HD Upscale — enlarge by up to four times with real detail, to a maximum of 4096 px on the long edge. Free on a Pixly result (pass its r2Path from `pixly jobs`), 1 credit on your own photo.
- --out <file.jpg>
pixly touch-up <photo>
Sky, lawn, driveway and clutter fixed in one pass, each only where the photo needs it; the house stays as shot.
- --only sky,lawn,driveway,clutter — allow only these fixes
- --skip clutter — everything except these (e.g. keep the car in the drive)
- --out <file.jpg>
pixly plot-sign <photo> --text "SOLD"
Photorealistic 3D monument sign on an empty-plot photo.
- --text <label> (required, max 24 chars)
- --look stone|metal|grass|sign
- --orientation standing|lying
- --out <file.jpg>
pixly motion <photo>
Cinematic camera-move clip from a single photo.
- --move zoom|fly-through|orbit|pan|aerial|pull-back|crane-up|tilt-up|boom-down|drone-orbit|flyover|pull-away|handheld
- --duration 5|10 (default 5)
- --format 9:16|16:9 (default 9:16)
- --out <file.mp4>
pixly video <start> [--end <photo>]
Photo to Video — a clip from one photo, or with --end a camera move that travels from the start photo and lands exactly on the end one.
- --move smooth|walk|orbit-left|orbit-right|push-in|pull-back|rise-up (default smooth)
- --prompt "…" — your own description of the video; replaces --move
- --model kling-v3|kling-2.6 · --duration 3|5|8|10|15 (kling-2.6: 5|10) · --sound (kling-v3)
- --format 16:9|9:16|1:1 · --out <file.mp4>
pixly reel --before <a.jpg> --after <b.jpg>
Before→after reveal video from two frames.
- --intent staging_reveal|staging_reveal_reverse|construction_timelapse
- --reveal smooth|slideIn|dropLand|glowBuild|movers (default smooth)
- --duration 5|10 · --format 9:16|16:9|1:1 · --out <file.mp4>
pixly job <jobId>
Job status + result URLs (JSON).
pixly jobs
Recent generations.
- --limit <n> (default 20)
- --type images|videos
pixly uploads
Photos you have uploaded, with the r2Path to pass as <photo>.
- --limit <n>
pixly balance
Credits remaining and plan.
pixly checkout
A Stripe payment link: a subscription with no plan yet, a credit top-up with one. Never charges by itself.
- --plan starter|agent|pro_agent|team
- --amount <usd> — top-up amount
pixly tools
List every available tool.
For AI agents
This entire reference is available as pure markdown at https://pixly.app/docs.md (also linked from /llms.txt). To teach an agent Pixly in one message, paste this:
Connect to Pixly (real-estate photo & video AI) via MCP: - Endpoint: https://pixly.app/api/mcp (streamable HTTP, stateless JSON responses) - Auth: header "Authorization: Bearer pixly_sk_..." (user creates the key at https://pixly.app/app/settings) or OAuth sign-in - Workflow: call a generation tool (virtual_staging, edit_staged_photo, cinematic_motion, photo_to_video, before_after_reel, flythrough_video, before_after_image, watermark_photos, blur_faces_plates, straighten_photo, draw_floor_plan, enhance_photo, declutter_photo, remove_furniture, day_to_night, replace_sky, replace_lawn, restyle_room, reset_season, makeover_exterior, render_floor_plan, touch_up_exterior, upscale_hd, plot_sign) with imageUrl = the photo's https URL (or a data: URI) → poll get_job until status "completed" → download resultUrls. Only a local file with no URL needs create_upload_ticket first — and if you are a connector that cannot PUT bytes, have the user add the photo at https://pixly.app/app and call list_library with type "uploads" to get its r2Path. - Generations spend the user's Pixly credit balance (check with get_credit_balance). Failed jobs always refund — instantly if nothing ran, otherwise within 24h. - Full reference: https://pixly.app/docs.md