Both tools take a file as multipart/form-data.
Photo enhancement
POST /photo/enhance - scope tools:photo, job. One photo per request.
Form parts:
| Part | Description |
|---|---|
image | the photo - required; JPEG, PNG or WebP up to 25 MB |
mask | cleanup only: a PNG mask, white marks the area to change |
data | options as one JSON string - required |
Options in data:
| Field | Description |
|---|---|
mode | enhance - light, colour, sharpness; cleanup - remove things; staging - furnish an empty room. Default cleanup |
prompt | required for cleanup and staging (3-500 characters): what to remove or how to furnish; optional for enhance |
intensity | light, medium (default), strong |
roomType | living, bedroom, kitchen, bathroom, dining, office, outdoor |
furnitureStyle | for staging: modern, scandinavian, industrial, luxury, minimalist, coastal |
autoMask | cleanup without your own mask: find the area automatically |
seed | a number for a repeatable result |
negativePrompt | what to avoid, up to 300 characters |
objectId, objectType | your 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}):
| Field | Description |
|---|---|
results | result variants |
results[].variant | variant number |
results[].url | image address |
results[].width, results[].height | size |
metadata.error | for 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.
| Part | Description |
|---|---|
file | the plan image (JPEG, PNG, WebP, HEIC; up to 20 MB) - required; the name image is accepted too |
objectId | attach the result to your listing |
objectType | property, rental or complex |
curl -X POST https://developers.grem.capital/api/v1/floorplan/create \
-H "Authorization: Bearer gsk_live_xxx" \
-F "[email protected]"
Response:
| Field | Description |
|---|---|
jobId | job id |
status | done - labels accepted automatically; review - result ready, labels worth checking; rejected - the image is not a plan; failed - failure |
state | completed for done and review, failed for rejected and failed |
rooms | rooms: label, area (m², when labelled), stable (the label was read the same in every pass), placement (where the label sits on the cleaned plan) |
totalArea | total area, m², when areas are labelled on the plan |
cleanedFileId | the cleaned plan image |
sourceFileId | the 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.