This service will return the list of real estate developments of your account (the agency that owns the token). The scope comes from the access token, it is not sent as a parameter.
| Resource information | |
|---|---|
| Authentication | Required (API Token, Bearer) |
| Scope | express-base |
| HTTP Method | GET |
| Response | JSON |
| Version | 1 |
Resource URL
https://mapaprop.app/api/action/express-v1/developments
Sample code
GET /api/action/express-v1/developments?customerId=1&dateFrom=20-02-2019&dateTo=28-02-2019 HTTP/1.1
Host: mapaprop.app
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Authorization: Bearer {access_token}
Parameters
| Key | Type | Required | Description |
|---|---|---|---|
| customerId | int | no | Ignored. The scope comes from the access token: the search is always scoped to the agency that owns the token, and a customerId sent in the query has no effect. |
| term | string | no | A term that will try to match at least 3 characters in the zone, address or title of the property. Full text search capabilities. |
| type | int | no | Always overridden to 23 (Desarrollo Inmobiliario) by the API. Any user-provided value is ignored. Constants |
| operation | int | no | An operation of the property. Constants |
| from | int | no | The start record number. Default is 0. |
| size | int | no | The amount of records to bring in each query. Default is 7. Maximum is 20 (validation error: "You cannot retrieve more than 20 properties at a time"). |
| branchId | int | no | The ID of the branch where the properties are located. |
| stateId | int | no | The state ID of the property |
| countyId | int | no | The county ID of the property |
| cityId | int | no | The city ID of the property |
| tempOccupancy | int | no | The number of people who can live in a property |
| dateFrom | string | no | The date you want to arrive (format is "dd-MM-yyyy") |
| dateTo | string | no | The date you want to leave (format is "dd-MM-yyyy") |
Pagination
This endpoint uses offset-based pagination via the from and size query parameters.
| Parameter | Meaning | Default | Maximum |
|---|---|---|---|
from | Zero-based offset of the first record to return | 0 | — |
size | Number of records returned per request | 7 | 20 |
The response always includes a total field with the total number of records matching your filters (not just the ones returned in the current page). Use it to know when to stop paginating.
How to paginate
To retrieve page N (1-indexed) with a fixed page size:
from = (N - 1) * size
Keep requesting the next page while from + size < total.
Example: paginate through 25 developments, 20 per page
Assume a search returns "total": 25. To get every result you need 2 requests:
Page 1 — records 1 to 20:
GET /api/action/express-v1/developments?from=0&size=20
Response: { "took": 8, "total": 25, "properties": [ ...20 items... ] }
Page 2 — records 21 to 25:
GET /api/action/express-v1/developments?from=20&size=20
Response: { "took": 6, "total": 25, "properties": [ ...5 items... ] }
At this point from + size = 40 >= total = 25, so there are no more pages.
Notes
- Keep filters consistent across pages. Changing any filter between requests (e.g.
operation,stateId,dateFrom) resets the result set and your offset will point to a different collection. sizecannot exceed 20. Requestingsize=21or more returns a validation error:"You cannot retrieve more than 20 properties at a time". To retrieve large result sets you must paginate.fromis an offset, not a page number.from=2returns records starting at position 3, not "page 2".- Numeric filters expect an integer. A value outside the range of an integer (a 20-digit number, for instance) or one with decimals returns a validation error instead of being silently ignored.
- The
tookfield is the time in milliseconds the search took on the server side for that page only.
Response
A JSON document with the list of zones in a hierarchy where the customer has properties.
| Object | Field | Type | Required | Description |
|---|---|---|---|---|
| Response | took | int | yes | How long the search took in milliseconds |
| total | int | yes | How many total records are in the context of this search. You can paginate thru them | |
| properties | Array of Property | yes | The list of Property objects | |
| Property | propertyHash | string | yes | A unique ID for the property |
| timestamp | string | yes | ISO8601 timestamp of when the property was created | |
| lastUpdate | string | yes | ISO8601 timestamp of when the property was last updated | |
| code | string | yes | A unique code of the property entered by the customer | |
| branchId | int | yes | The ID of the branch that this property is related to. GET /api/action/express-v1/branches. | |
| type | int | yes | The Id of property type. GET /api/action/express-v1/types | |
| operation | int | yes | The Id of property operation. Constants | |
| propertyType | string | yes | The translated description of the property type. GET /api/action/express-v1/types | |
| propertyOperation | string | yes | The translated description of the property operations. Constants | |
| status | string | yes | The translated description of the building status. Constants | |
| mainImage | string | no | The Id of property type. GET /api/action/express-v1/types | |
| currency | string | yes | The currency symbol of the price of the property. Constants | |
| price | int | yes | The price of the property | |
| expensesCurrency | string | no | The currency symbol of the monthly / yearly expenses of the property. Constants | |
| expensesPrice | int | no | The price of the monthly / yearly expenses of the property | |
| taxCurrency | string | no | The currency symbol of the monthly / yearly taxes of the property. Constants | |
| taxPrice | int | no | The price of the monthly / yearly taxes of the property | |
| title | string | yes | A title entered by the customer | |
| address | string | yes | The street address and number of the property | |
| zipCode | string | yes | The postal code of property location | |
| zone | string | yes | A friendly description combining from city (if available) to state | |
| countryId | int | yes | The ID of the property country location | |
| stateId | int | yes | The ID of the property state location. GET /api/action/express-v1/zones | |
| countyId | int | yes | The ID of the property county location. GET /api/action/express-v1/zones | |
| cityId | int | no | The ID of the property city location. GET /api/action/express-v1/zones | |
| countryId | int | yes | The ID of the property country location. GET /api/action/express-v1/zones | |
| country | string | yes | The name of the country | |
| state | string | yes | The name of the state | |
| county | string | yes | The name of the county or 2nd division location | |
| city | string | no | The name of the city / neighborhood or 3rd division | |
| suspended | boolean | yes | The publication has been suspended | |
| reserved | boolean | yes | The property has been reserved | |
| rented | boolean | yes | The property has been rented | |
| sold | boolean | yes | The property has been sold | |
| description | string | yes | The long description of the property | |
| conditions | string | no | The long conditions statement of the property. Usually related to payments | |
| bedrooms | int | no | Number of bedrooms of the property | |
| ambiences | int | no | The number of ambiences / spaces for the property | |
| bathrooms | int | no | Number of bathrooms of the property | |
| dependencies | int | no | Number of dependency rooms (extra rooms) | |
| occupancy | int | no | Number of occupants (generally if this is a temp rental) | |
| toilettes | int | no | Number of toilettes (half bathrooms) in the property | |
| buildingArea | int | no | Square meters of the built area | |
| landArea | int | no | Square meters of the land of the property | |
| yearsOld | int | no | How old the property is | |
| ubication | string | no | The property cardinal ubication in the building | |
| totalFloors | int | no | The total floors in the building | |
| apartmentsPerFloor | int | no | The amount of apartments per floor | |
| airConditionerType | string | no | Type of air conditioner. | |
| waterHeaterType | string | no | Type of water heater. | |
| heatingType | string | no | Type of heating appliances. | |
| balconyType | string | no | Type of balcony. | |
| garage | int | no | The total garages of the property | |
| garageType | string | no | Type of garage. | |
| images | Array of Image | no | Array of Image object | |
| location | Location | yes | Location object | |
| Location | lon | string | yes | Longitude location of the property |
| lat | string | yes | Latitude location of the property | |
| Image | image | string | yes | URL for image |
| thumbnail | string | yes | URL for the thumbail | |
| orientation | int | yes | Orientation of the image. 1 = PORTRAIT, 2 = LANDSCAPE | |
| type | int | yes | Type of image. 1 = PHOTO, 2 = BLUEPRINT | |
| contentType | string | yes | The image content type | |
| timestamp | string | yes | The ISO8601 timestamp of when the image was uploaded | |
| Labels | labels | Array of labels | no | The labels of property. Constants |
| attributes | attributes | Array of json attributes | no | All property attributes |
| descriptionFormatted | description | string | no | Description with new formatting that accepts line breaks |
The development's own fields
A development is a property with extra fields, and they are the ones that make it useful:
| Field | Type | Required | Description |
|---|---|---|---|
| development | boolean | yes | Always true in this service |
| developmentProperties | Array of int | no | The Ids of the units that make up the development. They are the ones you pass to GET /development/properties to fetch the detail of each one |
| commercialTagline | string | no | The project's commercial tagline, exactly as the agency entered it |
| deliveryDate | string | no | Delivery date, in ISO8601 format with time zone |
| logoUrl | string | no | URL of the development's logo. It is the project's logo, not the agency's |
| totalApartments | int | no | Total homes in the project |
| totalTowers | int | no | Total towers |
| totalElevators | int | no | Total elevators |
| totalOffices | int | no | Total offices |
| totalCommercialUnits | int | no | Total commercial units |
| totalHouses | int | no | Total houses |
| totalLots | int | no | Total lots |
These are the values the agency declared for the project. They are not the result of counting
the units in developmentProperties: a development may advertise 500 homes and have 12 loaded.
A 0 means "not declared", not "zero".
The seven counters are optional, and when the agency does not fill them in the service returns
0 instead of omitting them. So "totalTowers": 0 does not mean the project has no towers: it
means nobody reported how many.
If you are going to display the value, treat 0 as absence. A site that publishes "0 towers" is
stating something the agency never said.
This is the object's convention, not this group's: it applies the same way to the optional
integers that already existed —totalFloors, floors, apartmentsPerFloor, toilettes,
dependencies, expensesPrice and taxPrice—, which have always behaved this way.
The three non-numeric fields are OMITTED when empty.
commercialTagline, deliveryDate and logoUrl do not arrive as null: they simply are not
in the JSON. It is the other half of the same convention, and you need both to read a response
correctly: for the numeric ones you ask about the value, for these about the key's existence.
developmentStats — the figures DERIVED from the units
Since 2026-10-27 every development carries a developmentStats block with the indicators that
come from counting its units. Nobody entered them: they are computed in the backend from the
units linked to the development, and recomputed whenever one of them changes.
It is the other half of the previous group, and they have to be read together.
The seven counters (totalApartments, totalTowers…) are what the agency declared for the
project. developmentStats is what is actually loaded. A development may advertise 500 homes
(totalApartments: 500) and have 12 units loaded (developmentStats.units.total: 12). Both are
true and they answer different questions.
"developmentStats": {
"units": { "total": 4, "available": 4, "sold": 0, "rented": 0, "reserved": 0,
"suspended": 0, "withOperation": 0, "availabilityRate": 100 },
"sale": { "units": 4, "commercialized": 0, "rate": 0 },
"rent": { "units": 0, "commercialized": 0, "rate": null },
"otherOperation": { "units": 0 },
"buildingArea": { "unit": "m2", "total": 936, "available": 936,
"unavailable": 0, "sold": 0, "rented": 0, "reserved": 0 },
"prices": { "mixedCurrencies": false,
"byCurrency": { "ARS": { "units": 4, "from": 2333333, "to": 2333333,
"total": 9333332, "average": 2333333 } } },
"typology": { "byAmbiences": { "2": 4 }, "byRooms": { "2": 4 },
"byBuildingArea": { "234": 4 }, "byLandArea": { "250": 4 } }
}
| Branch | What it carries |
|---|---|
units | how many units there are and in what state. withOperation counts units, not states: one that is sold AND reserved counts once. availabilityRate is the percentage available out of the total |
sale / rent | commercialization by operation, each measured against its own universe |
otherOperation | units under barter, transfer, share or auction. They exist so that sale.units + rent.units + otherOperation.units adds up to the total and no unit disappears |
buildingArea | the covered square metres. unavailable is an OR (sold ‖ reserved ‖ rented), so a unit with two states is deducted only once |
prices.byCurrency | the breakdown by currency: from/to the range, total the sum, average the average |
typology | how many units there are by rooms, bedrooms, covered m² and total m². The keys are the value; the ones that are absent belong to no unit |
A rate of null is NOT 0.
sale.rate and rent.rate come back as null when there is no unit under that operation: the
question "how much of what is for sale has been placed?" has no answer if nothing is for sale,
and a 0 % would be a false one. A 0 does mean something: there are units for sale and none has
been placed.
In a rent-only development you will see sale.rate: null and a number in rent.rate. That is
correct: they are two different businesses and they are not averaged together.
Prices have NO flat fields, and that is deliberate.
There is no prices.from, prices.to, prices.total or prices.average at the block level:
only byCurrency. If a development has units in dollars and in pesos, any single figure mixing
them is false, not approximate — an average of 120,000 USD and 95,000,000 ARS is neither
dollars nor pesos.
mixedCurrencies tells you whether there is more than one. With a single currency — the usual
case — the only bucket in byCurrency IS the development's figure: read it and you are done.
Only developments carry it. A regular property has no developmentStats at all: it has no
units to derive it from, so the question does not exist. It is not a zeroed block — the key is
absent.
It recomputes on its own. When a unit is sold, rented, changes price or area, or is deleted, the development's block is updated at that moment. There is nothing to request and no process to wait for.
developmentId — which development a property belongs to
Since 2026-10-26 every property carries developmentId: the Id of the development it belongs
to, or 0 if it belongs to none.
| Field | Type | Required | Description |
|---|---|---|---|
| developmentId | int | yes | Id of the development this property is a unit of. 0 = it is not a unit of any development |
It is the inverse of developmentProperties, and it completes the relation in both directions:
with developmentProperties you go from the project to its units; with developmentId, from a unit
back to its project.
A development can also have a developmentId. If it is a sub-development — a stage within a
larger project — it will carry development: true, its own developmentProperties and the
developmentId of its parent project. All three at once.
Additional fields
Each development also brings the same extra fields as a property —seoUrl, typeDesc,
operationDesc, descriptionFormatted, publishedAt, floors, garages, branchSeoUrl,
customerCountry, customerCountryDesc, videos, alternativePrices, reservations and
tempOccupied— documented in
GET /properties.
The response also includes fields for Mapaprop's internal use that are not part of this
contract and may change without notice: embeddingVersion, vectorizedAt, configs,
moderationStatus, publication and networks. Do not build anything on them.
Sample response
{
"took":6,
"total":3,
"properties": [
{
"zipCode":"1884",
"country":"Argentina",
"developmentProperties": [
198102
],
"landArea":133,
"county":"Almirante Brown",
"buildingArea":235,
"cityId":897,
"type":220,
"ambiences":2,
"zone":"Malvinas Argentinas, Almirante Brown, Buenos Aires, Argentina",
"price":1200000,
"airConditionerType":"Central",
"publication": [
{
"mercadolibre":false,
"plan":"no-plan"
},
{
"cabaprop":false,
"plan":"no-plan"
},
{
"zonaprop":false,
"plan":"no-plan"
},
{
"navent":false,
"plan":"no-plan"
}
],
"state":"Buenos Aires",
"branchId":1,
"images": [],
"development":true,
"descriptionFormatted":"Descripcion de un desarrollo unico del sistema.",
"bathrooms":2,
"suspended":false,
"labels": [
"laundry",
"playroom",
"suite"
],
"propertyOperation":"Venta",
"bedrooms":2,
"garages":1,
"yearsOld":12,
"reserved":false,
"lastUpdate":"2024-10-22T12:21:00.000-03:00",
"customerCountryDesc":"Argentina",
"code":"1-DESARROLLO-3",
"city":"Malvinas Argentinas",
"description":"Descripcion de un desarrollo unico del sistema.",
"alternativePrices": [],
"title":"titulo de desarrollo",
"networks": [
"4",
"5"
],
"customerCountry":1,
"countryId":1,
"seoUrl":"venta-de-desarrollo-inmobiliario-en-malvinas-argentinas-almirante-brown-buenos-aires-1-247058",
"rented":false,
"countyId":140,
"propertyType":"Desarrollo Inmobiliario",
"hightlight": {},
"currency":"ARS",
"timestamp":"2024-10-03T00:00:00.000-03:00",
"sold":false,
"address":"Calle 123 1537",
"stateId":2,
"garage":1,
"propertyHash":"1a9ad9df2c25980db55e6f74c5d62b94",
"mainImage":"https://s3.amazonaws.com/mapaprop-dev-image/photos/noimage.gif",
"garageType":"Espacio Guarda Coche",
"location": {
"lon":"-58.54596230000001",
"lat":"-34.5904958"
},
"attributes": [
{
"group_sub":"label",
"country":"ar",
"key_legacy":"hasLaundry",
"group_subtype":"spaces",
"id":"laundry",
"label":"Lavadero",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
},
{
"group_sub":"label",
"country":"ar",
"key_legacy":"petsReady",
"group_subtype":"extras",
"id":"petsReady",
"label":"Apto mascotas",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
},
{
"group_sub":"label",
"country":"ar",
"key_legacy":"playroom",
"group_subtype":"spaces",
"id":"playroom",
"label":"Playroom",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
},
{
"group_sub":"label",
"country":"ar",
"key_legacy":"hasPrivatElevator",
"group_subtype":"ammenities",
"id":"private-elevator",
"label":"Elevador privado",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
},
{
"group_sub":"label",
"country":"ar",
"key_legacy":"suite",
"group_subtype":"spaces",
"id":"suite",
"label":"Dormitorio en suite",
"locale":"es_AR",
"type":"bool",
"group":"propertyAttribute",
"status":true
}
],
"operation":1
}
]
}