Three listing types (kind): property - for sale, rental - for rent, complex - residential complex. Reading is free and open to any key; creating, editing and deleting need the objects:write scope and are not charged either.
List
curl "https://developers.grem.capital/api/v1/objects?kind=property&city=Berlin&limit=20" \
-H "Authorization: Bearer gsk_live_xxx"
GET /objects:
| Parameter | Description |
|---|---|
kind | required: property, rental or complex; case does not matter |
city, country | exact-match filters |
priceMin, priceMax | price, in US dollars (by the normalized price) |
areaMin, areaMax | area, m² |
rooms | rooms (property and rental); may be fractional |
type, residentialType | category - codes from the dictionaries (property and rental) |
page | page, from 1; a smaller value is treated as 1 |
limit | per page, default 20, 1-50; a value outside is cut into the range |
sort | newest (default) or oldest |
scope | agency keys only: by default the agency's listings; catalog - the public catalog |
Response: data - the listings, paginate - currentPage, totalPages, totalCount.
limit and page outside the range are cut into it, not refused. Other invalid values of a known parameter (an unknown enum value, a non-integer page, text instead of a number) are refused with 400 validation naming the field.
One listing
GET /objects/{kind}/{id} - one listing in the same shape. Unknown id - 404. An agency key can add scope=catalog to get the public view.
Listing shape
| Field | Description |
|---|---|
id, kind, name, slug | identity |
status | for someone else's listing - active or sold |
type | category - code |
price, currency | price; complex has price: { from, to, currency } |
constructionYear | year built, an integer or null |
address | full address, with street and coordinates |
nativeAreaUnit | the unit the listing was entered in (for display); areas come as { "value": 50, "unit": "m2" } |
photos | photos: id, isMain, mimetype, variants, ready |
processingStatus | ready, processing or failed - whether the photos are ready |
promoted | the listing is promoted |
author | the listing's agent or agency |
Categories and other attributes are codes; translated labels are in the dictionaries. Complex also has apartmentPlans (floor plans) and progress (construction progress).
ready: false on a photo means the watermarked variants are still being generated. Show a placeholder and re-read the listing later - do not cache an unfinished image.
What you see: any listing - the public card, as on the site; your listings - the full owner view. Nobody gets the owner's contacts, seller data from imports, moderation notes or originals without the watermark.
Create, edit, delete
| Action | Request | Response |
|---|---|---|
| Create | POST /objects/{kind} | 201 with the listing |
| Edit | PUT /objects/{kind}/{id} | the listing; owner only, otherwise 404 |
| Delete | DELETE /objects/{kind}/{id} | a draft is deleted for good, a published listing is archived; a listing with an active commission contract - 409 conflict |
curl -X POST https://developers.grem.capital/api/v1/objects/property \
-H "Authorization: Bearer gsk_live_xxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 9a1d2c3b-4e5f-4a6b-8c7d-0e1f2a3b4c5d" \
-d '{
"name": "2-room flat, Torstraße 12",
"type": "Residential",
"address": { "country": "Germany", "city": "Berlin", "street": "Torstraße", "streetNumber": "12" },
"price": 320000, "currency": "EUR",
"spaceAll": 64, "rooms": 2, "floor": 3, "buildingFloor": 5,
"photos": ["https://example.com/1.jpg"],
"publish": false
}'
publish: false(default) - a draft, not in the catalog;publish: true- published. Publishing needs at least 1 photo forpropertyandrental, 2 forcomplex.- Not every account role may create every kind - same as in the cabinet.
- Unknown fields are ignored. Take category codes from the dictionaries. The codes of
condition,conditionTypeandamenities(camelCase, likeneedsRenovation,fridge) are listed in the write schema itself (the tables below and/openapi.json) -GET /dictionariesdoes not decode them. - Areas: a number in m² or
{ "value": 700, "unit": "ft2" }. PUTwithoutphotoskeeps the existing photos.Idempotency-Keyon create prevents a duplicate on retry.
Photos
photos is an array; each item is:
- a public
https://...address - GREM downloads the image itself; - the id of a file uploaded with
POST /uploads(Files).
An address that cannot be downloaded is skipped and reported in the response warnings. With strictPhotos: true such a request fails with 422 instead.
Property fields
Required: name, type, address, price.
| Field | Description |
|---|---|
type | Residential, Commercial, Industrial or Land plot |
residentialType, commercialType, industrialType | subtype - a code or an array of codes |
marketSegment | primary (new build) or secondary |
description | description, up to 5000 characters |
address | country, city (required), district, region, street, streetNumber, postalCode, location |
price, currency | price; currency UAH, USD, EUR, AZN, GBP, AED, CNY, TRY, GEL |
constructionYear | year, 1700-2100 |
spaceAll, spaceLiving, spaceKitchen, effectiveArea, auxiliaryArea, landPlotArea | areas |
rooms, bedrooms, numberOfBathrooms, balconies, numberWindows, unitsCount | counts |
floor, buildingFloor, ceilingHeight | floor, floors, ceiling height |
condition | needsRenovation, partialRenovation, renovated, designer, shellCore, newFromDeveloper |
buildingType | newBuilding, secondary, stalinka, khrushchevka, brezhnevka, czech, gostinka, prerevolutionary, townhouseRow, detached, other |
wallMaterialType, constructionTech, kitchenType | wall material, construction technology, kitchen type |
amenities, buildingAmenities | in-unit and building amenities - arrays of codes |
utilitySystem, heating, windowView, balcony, parking | utilities, heating, view, balcony, parking |
safety | shelterNearby, powerBackup, autonomousHeating, waterReserve, starlink, gasAvailable, internetAvailable, elevatorWorks (yes/no) |
accessibility | ramp, groundLevelEntrance, wideDoors, disabledParking, wheelchairElevator (yes/no) |
programs | eOselya, eVidnovlennya, mortgageEligible, installment |
monthRentalRate, annualIncome, annualYield, paybackPeriod, propertyTax, insuranceCost, managementFee, repairsReserve | investment figures |
commission | commission for agents: payer, type, value |
tour | 3D tour: kind, url |
complexId | the complex the unit belongs to |
photos, video | media |
publish, strictPhotos | see above |
Rental fields
Required: name, type (Residential, Commercial, Industrial), address, price. Most fields are as for property; rental-specific ones:
| Field | Description |
|---|---|
rentalType | long - long-term, short - daily |
price, dayPrice, deposit | rate, daily rate, deposit |
totalArea, totalFloors, bathrooms | area, floors, bathrooms |
minRentTime, minTermMonths | minimum term |
availableFrom | available from |
checkIn, checkOut | check-in and check-out time: from, to — hours of the day (15 = 15:00) |
withChildren, withPets | children allowed; pets: yes, no, with someone |
furniture, furnitureList | furniture |
conditionType | condition - the same values as condition for property |
onsiteAmenities, internalFeature | amenities |
utilitiesIncluded, utilitiesCost | utilities |
checkInPay, onlinePay, bankTransfer, reportingDocuments | payment methods and documents |
Complex fields
Required: name, address.
| Field | Description |
|---|---|
description, descriptionPresentation, descriptionSocial | descriptions |
price | from, to, currency |
space | unit areas: from, to |
apartType | unit types |
class | economy, comfort, comfortPlus, business, premium, elite |
stage | planning, excavation, construction, finishing, commissioned, delivered |
completionQuarter | completion quarter |
queues | phases: name, stage, completionQuarter |
sectionsNumber, floors, apartmentsNumber, parkingSpaces | counts |
installment, installmentTerms | instalments: downPaymentPct, termMonths, interestRate |
infrastructure | infrastructure - an array of codes |
territoryDescription, parkingDescription, infrastructureDescription | descriptions |
apartmentPlans | floor plans: apartType, area, price, description, photos |
progress | construction progress: title, date, description, photos |
The full schema of each kind with every value - components ObjectWriteProperty, ObjectWriteRental, ObjectWriteComplex in /openapi.json. They are generated from the same checks the server runs.
Agency key
| Request | What it does |
|---|---|
PATCH /objects/{kind}/{id}/agency | move a listing into the agency or back to personal: body {"targetAgencyId": "<id>"} or {"targetAgencyId": null}; without the field - into the key's agency |
PATCH /objects/{kind}/{id}/assignee | assign an agent: {"assignTo": "<user id>"} |
With a personal key both answer 403. A listing cannot move directly from one agency to another (409 conflict) - move it to personal first. Assigning an agent to a personal listing, or to someone who is not an active member of the agency, is 409 conflict too. Permissions: into the agency - the listing's author; back to personal - a manager, the agency owner or the author; assign anyone - manager and above, an agent - only themselves.
Events
object.created, object.updated, object.published, object.deleted - see Webhooks.
Related
- Dictionaries - category and attribute codes.
- Files - uploading photos.
- Listing materials - landing page and PDF for a listing.