Docs

Photos and floor plans

Last updated: 2026-10-034 min read

Both tools take a file as multipart/form-data.

Photo enhancement

POST /photo/enhance - scope tools:photo, job. One photo per request.

Form parts:

PartDescription
imagethe photo - required; JPEG, PNG or WebP up to 25 MB
maskcleanup only: a PNG mask, white marks the area to change
dataoptions as one JSON string - required

Options in data:

FieldDescription
modeenhance - light, colour, sharpness; cleanup - remove things; staging - furnish an empty room. Default cleanup
promptrequired for cleanup and staging (3-500 characters): what to remove or how to furnish; optional for enhance
intensitylight, medium (default), strong
roomTypeliving, bedroom, kitchen, bathroom, dining, office, outdoor
furnitureStylefor staging: modern, scandinavian, industrial, luxury, minimalist, coastal
autoMaskcleanup without your own mask: find the area automatically
seeda number for a repeatable result
negativePromptwhat to avoid, up to 300 characters
objectId, objectTypeyour listing the photo belongs to (property or complex)
curl -X POST https://developers.grem.capital/api/v1/photo/enhance \
  -H "Authorization: Bearer gsk_live_xxx" \
  -F 'data={"mode":"cleanup","prompt":"remove the chair and the boxes"}' \
  -F "[email protected]"

A mask with enhance or staging is refused - it does not work there, and nothing is charged. The price depends on the mode. Refusals: a mask outside cleanup - 422 with code: MASK_NOT_SUPPORTED; another file type or a file over 25 MB - 422 with code: JOB_CREATE_FAILED; an unknown key in data - 400. The start answer carries sku and priceMinor - what the call is charged (absent when the plan quota covers it).

202 with jobId. The finished job (GET /photo/enhance/jobs/{id}):

FieldDescription
resultsresult variants
results[].variantvariant number
results[].urlimage address
results[].width, results[].heightsize
metadata.errorfor a failed job: the reason, as a generic text

Variant file: GET /artifacts/v1/ai/photo-enhancement/jobs/{jobId}/download/{variant}. Events - photo.completed / photo.failed.

Floor plan cleanup

POST /floorplan/create - scope tools:floorplan. A photo or scan of a plan becomes a clean plan with room labels and areas. Processed right away: the 202 already holds the outcome.

PartDescription
filethe plan image (JPEG, PNG, WebP, HEIC; up to 20 MB) - required; the name image is accepted too
objectIdattach the result to your listing
objectTypeproperty, rental or complex
curl -X POST https://developers.grem.capital/api/v1/floorplan/create \
  -H "Authorization: Bearer gsk_live_xxx" \
  -F "[email protected]"

Response:

FieldDescription
jobIdjob id
statusdone - labels accepted automatically; review - result ready, labels worth checking; rejected - the image is not a plan; failed - failure
statecompleted for done and review, failed for rejected and failed
roomsrooms: label, area (m², when labelled), stable (the label was read the same in every pass), placement (where the label sits on the cleaned plan)
totalAreatotal area, m², when areas are labelled on the plan
cleanedFileIdthe cleaned plan image
sourceFileIdthe plan you uploaded

Report: GET /artifacts/v1/ai/floor-plan/jobs/{id}/report.pdf. Fetch the result again - GET /floorplan/create/jobs/{id}. Events - floorplan.completed / floorplan.failed. If the image is not a plan, nothing is charged.

Was this article helpful?