Version
The major version is in the path: /api/v1. Within v1 we do not break existing integrations. The current contract version is info.version in /openapi.json; it grows with every change.
What may change without notice
These changes are compatible, and your client should cope with them:
- new operations and tools;
- new optional request fields;
- new response fields;
- new values in response enumerations (statuses, codes), new error codes in
title, new webhook event types; - changes to the
detailtext; - higher limits.
Writing a client
- Ignore unknown response fields.
- Treat an unknown enumeration value, error code or event type as "other", not as a failure.
- Branch on
status,titleandcode, not on thedetailtext. - Do not rely on field order or id length.
- Rely on the job
state, not on the tool's rawstatus.
What counts as breaking
Removing or renaming an operation, field, scope or event; a new required request field; changing a field's type or meaning; changing the status code for the same case; narrowing the allowed values. We do not make such changes in v1 without notice: the operation is first marked deprecated in /openapi.json and in this changelog, and keeps working for at least 6 months. Closing a vulnerability is the exception.
A fix that brings a response in line with this documentation is not a breaking change.
Changelog
2026-10-03 - version 1.16
Changed:
429carriescode:minute_limitordaily_limit(the key's daily limit, resets at 00:00 UTC).- An object written with an agency key belongs to the agency;
object.*andlead.*webhooks of agency objects and leads reach the agency's endpoints too. - Object photos: up to 50 for every kind, as in the cabinet.
- SDK 1.7.2: an empty stream chunk no longer splits a chat event.
Fixed:
PUT /objects/{kind}/{id}keeps the moderation state,isSoldand the publication of the listing; it used to reset them (a plain edit unpublished a live listing).GET /objectsno longer lists objects of suspended owners; a card hidden from guests is not shown by id either.PATCH /leads/{id}: the sender of a lead without a contract may change its status, as in the cabinet; the change and the archive are written to the lead's history.
2026-10-03 - version 1.15
Changed:
PATCH /leads/{id}(status) andDELETE /leads/{id}follow the cabinet rules: finalization, commission collection, active contract or agreement -422with the reason incode.?expand=historyno longer carries service metadata (tokens, other users' ids).- The chat's free daily limit answers
code: free_daily_limitwithRetry-Afteruntil 00:00 UTC. GET /works:previewUrl,linkandobject.photoUrlare/files/...paths forGET /artifacts/{path};nextCursorisnullon the last page.- Lead write: unknown fields are dropped (not refused); the lengths the service enforces are in the spec;
pool: truehands the lead to the platform pool. - SDK 1.7.1:
jobs.waitwaits out a429;chat.streamhandles a CRLF split between chunks;artifact()takessignal.
Fixed:
- Music preview: a
Rangepast the end is416(it was answered as404); a failing file service is502, not404. - A file over 15 MB in
POST /uploadsis413. A refusedstrictPhotoslisting names the photos that failed (code: photo_fetch_failed). - A content pack refusal names
form.media.photos. Sandbox: the review takes the first file of any name; rent strings and photo service keys are not refused.
2026-10-03 - version 1.14
Changed:
- A repeat of the express valuation with the same
Idempotency-Keyis now free entirely: the API call is not charged either. GET /works: acursorthat is notnextCursoris400(it silently restarted the list).POST /webhooks/{id}/test: aneventTypethat is not in the list is400(it sent a generic test).- Swipe Match:
reasonCodetakes the listed reasons only, as the service always required; leadkindmay bepool. - SDK 1.7.0:
jobs.waitsurvives a dropped poll;artifact()takesrange;chat.streamreads CRLF streams and gives one call per event.
Fixed:
- Music preview:
bytes=-Nreturns the last N bytes, aRangepast the end is416. - A connection timeout before the request was sent releases the
Idempotency-Key. - Sandbox: video photos under any field name the service reads, rent numbers sent as strings, flyer PNGs of the stated size.
2026-10-03 - version 1.13
Added:
GET /worksreturns what the cabinet shows for each result:street,streetNumber,previewUrl,link,repeatIndex,errorand the listing (object).GET /chat/sessionsdocuments its parameters:limit,cursor,q,projectId,archivedOnly,sort.Problem.titlein the spec listsrange_not_satisfiable; the webhook list carriesrequestId.- SDK 1.6.1:
chat.listSessionstakes the list parameters.
Changed:
- The spec states limits production already enforced: avatar
scriptTextup to 1200 characters, flyerformatsup to 3 andlayoutsup to 5, flyercontactsfield lengths, photoseedup to 2147483647, and no unknown keys in photodata. - Express valuation: the gateway refuses only a request with no area at all and no property type; whether
landPlotAreacounts is decided by the service (land named inpropertyTypeorapartmentTypecounts too).
Fixed:
- The sandbox refuses photos the way production does (JPEG, PNG or WebP up to 25 MB -
JOB_CREATE_FAILED; a mask outside cleanup -MASK_NOT_SUPPORTED) and accepts what production cuts or replaces (video title, volume, end card and closing-phrase options, landing page language, more than 20 content photos, rentfurnishedas a word). A report job no longer showspendingafterrunning. - A refused download redirect says so instead of a timeout; a
Rangesuffix longer than the file returns the whole file. - SDK 1.6.1:
verifyWebhookSignatureworks on Node 18.
2026-10-03 - version 1.12
Added:
416 range_not_satisfiableas an RFC 9457 problem (it came with an empty body).priceMinorin the photo enhancement start: what the call is charged, as the cabinet shows it.- SDK 1.6.0:
workstakesfrom/to,chat.historytakeslimit/cursor,chat.sendMessagetakesstyle.
Changed:
GET /match/leads:limitover 50 orpageover 1000 answer400(they were never cut).POST /match/leads/{id}/events: anIdempotency-Keyof another format is400instead of being dropped silently.- A field refused by the flyer is
400 validationnaming the field (was422). - A call whose payment is still being reserved under the same
Idempotency-Keyis409 idempotency_conflict(was422). - Express valuation:
landPlotAreacounts as the area only forland, as in the service. - A timeout, a reset connection or a socket closed mid-answer keep the
Idempotency-Keytaken; only a request that never reached the service releases it. - SDK 1.6.0: an upload is never repeated after
503; the abort listener is removed after each pause.
Fixed:
- PDF and landing page refusals carry their reason:
402withINSUFFICIENT_FUNDSorQUOTA_EXCEEDED(was422withoutcode). - The sandbox refuses exactly what production refuses: file type and size of uploads; texts cut instead of refused; unknown video
length,aspectandlanguagefall back to the default; flyer codes are case-insensitive; a draft withouttype. The insufficient-funds simulation answersINSUFFICIENT_FUNDS, the code production sends. limitandpageare cut into range by the gateway itself (GET /chat/history?limit=500answered400;limit=0gave 20 instead of 1).
2026-10-03 - version 1.11
Added:
- Job results carry the fields the cabinet shows: content pack, text and video -
progress,masterProfile(the story outline the texts and narration were built on) anderrorfor a failed job; photo -metadata.error; floor plan -rooms[].stable,rooms[].placement,sourceFileId. - Browsers (CORS) can read the
RateLimit-*,Retry-After,Grem-Sandbox,X-Request-IdandContent-Rangeheaders.
Changed:
- Webhooks: a test key creates and manages sandbox endpoints only; they get only sandbox job events, and live endpoints never get them.
limitandpageoutside the range are cut into it instead of400;kindinGET /objectsis case-insensitive;roomsmay be fractional.Idempotency-Keybelongs to the API key, the method and the actual path (POST /objects/propertyandPOST /objects/rentalare different operations). After a timeout listing and lead creates hold the key for 15 minutes, like tools; a request that never reached the service releases it.text/generate:customDirectionis cut to 500 characters.- SDK 1.5.1:
503on a write is retried only with anIdempotency-Key; aRetry-Afterover 30 seconds is not waited for;maxRetriesis at most 10; yourAbortSignalcancels the pause; message ids work on Node 18.
Fixed:
- Sandbox works like production: checks of
multipartfields, report fields per category, house heating values, commercialapartmentTypeand complexes; files only for finished jobs, at the tool's own path and with known artifact ids;Grem-Sandboxalso on answers made before the key check;Grem-Simulateis case-insensitive. - Without a key, invalid query parameters answer
401first. - An agent-scoped agency key no longer reads jobs started with the agency-wide key.
- Webhook endpoints saved earlier on another port keep receiving deliveries.
- An unsatisfiable
Rangeanswers416instead of404; a report review document up to 40 MB is accepted.
2026-10-03 - version 1.10
Added:
- The
conflicterror code (409): the resource is in a state that does not allow the action (Errors). - Video closing phrase fields in
POST /video/create:ctaMode,ctaIntent,ctaText,ctaMarket;GET /video/endingsoptions carryintentandtext. GET /works: thefromandtofilters.- SDK 1.5.0: the
maxRetriesoption -429and503are retried afterRetry-After.
Changed:
- Query parameters are checked: a known parameter with an invalid value is
400 validationnaming the field. - Webhooks:
httpson port 443 only, no credentials in the URL; the 11th address is422; agency webhooks are managed with the agency-wide key only. Idempotency-Keybelongs to the API key and the operation; after a tool timeout the key stays reserved for 15 minutes.- Money refusals (quota, debt, fair use, balance) are
402 insufficient_fundswithcode. - An agent-scoped agency key sees only its own jobs and files.
- File downloads count against the rate limit.
Fixed:
- Every error, including a too large or malformed body, comes as RFC 9457
application/problem+json; a body over the limit is413 payload_too_large. - The video
endingfield was never read; usectaIntentorctaText. - SDK:
simulatewith a live key throws instead of running the call.
2026-10-03 - versions 1.8-1.9
Added:
- Comparable listings:
estimate.analogsin the express valuation,analogsin the full report,compsin the rent estimate - the same as in the cabinet and the PDF. - Fields of finished jobs are described in full: report figures under their real names (
potPrice,priceRangeLow,priceRangeHigh, …), review, floor plan, photo, flyer, draft. - SDK 1.4.0: the
Analogtype.
Changed:
- Tool responses carry only documented fields; internal fields that used to slip through are no longer returned.
- A tool that
GET /tools/statusreports unavailable answers503 service_unavailablebefore anything is charged (before, this held only for the content pack, texts and video). - The appraisal review confirm response carries job fields only (
jobId,state,status); the deprecated_idis no longer returned there.
Fixed:
- Avatar video:
artifactslists the ids needed for the download URL. - Rental
checkIn/checkOutare documented as hours of the day.
2026-10-02 - version 1.7
Added:
- Sandbox: test keys (
gsk_test) simulate tools without charging; theGrem-Simulateheader picks the outcome. estimate.confidenceScorein the express valuation.
Changed:
- Calls that start a tool wait up to 5 minutes instead of 60 seconds.
- The express valuation repeated with the same
Idempotency-Keyreturns the finished result without a second charge, also after a timeout.
Fixed:
estimate.confidenceof the express valuation was alwaysnull.- Floor plan responses no longer carry internal fields.
GET /objectswithoutkind, and refusals for listings and leads, now explain the reason indetail.
2026-10-02 - version 1.6
Changed:
- Every job response carries the same
jobIdfield. The per-tool namesid,_id,contentGenJobIdare still returned and deprecated. - SDK 1.2.0:
Job.jobIdis always present.
2026-10-02 - versions 1.2-1.5
Added:
GET /voices,GET /avatar/avatars,GET /video/music,GET /video/endings- ids for the tools (Reference data).GET /tools/status- tool availability;GET /works- work history.POST /flyer/create- personal flyer, scopetools:flyer.POST /valuation/review/jobs/{id}/confirm- confirming report review data.- The
statefield in every job response. - In errors - the
codeanderrorsfields, the codesforbidden,payload_too_large,service_unavailable. - In the API description - full request and response schemas for every tool, the full listing write contract per kind, each operation's billing class (
x-grem-billing), the list of scopes and events. - The
scope(listings) andpool(leads) parameters are documented.
Changed:
- A refusal for missing data (for example texts without a description or city) is now
422 business_rulewith a reason and a code. It used to be502 provider_error. - A refusal for resource permissions is now
403 forbiddenwith a reason. It used to be500. - The test webhook delivery for tools has the same shape as a real one:
{ jobId, status, state }.
Fixed:
- Agency keys work with every tool, the chat and file downloads.
- Report review and floor plan: the job status is available by the id from the response, webhooks arrive.
- Downloading content pack, text and video files - only for the job's owner.