Import Properties by JSON
Document version: v1.0 Date: 2026-04-29 Audience: Advanced clients, integrators, power users
Summary
JSON mode is the fastest and most accurate way to import a property when you already have structured data. Unlike URL and HTML modes, this mode does not use scraping or AI: what you paste is what goes into the system, with no automatic transformations.
This mode is recommended if:
- You already have an export from another system (CRM, ERP, Excel converted to JSON, etc.)
- You are doing a custom integration
- You want full control over the fields without relying on the scraper
If you have never worked with JSON, you should use URL or HTML mode first.
How it works
Paste the JSON -> Mapaprop validates the structure -> Shows you the data in the Editor -> You confirm -> Property imported
The JSON is loaded directly into the Editor. There you will see all fields pre-filled with what you provided — you can correct anything before pressing Import.
JSON structure
The JSON is a flat object (no wrapper). If your source wraps it in { "data": { ... } }, no problem — the system automatically unpacks the data field.
Minimum required (example)
With just this, you can import a property. You can fill in the rest in the Editor afterward.
{
"title": "2-room apartment in Palermo",
"description": "Bright apartment, street-facing balcony, integrated kitchen.",
"operation": 1,
"type": 1,
"price": 95000,
"currency": "USD",
"address": "Avenida Santa Fe 3500",
"zone0": 1,
"zone1": 1,
"zone2": 23,
"zone3": 1340,
"rooms": 1,
"bathrooms": 1,
"buildingArea": 45
}
That's it. The rest of the fields (orientation, expenses, photos, attributes) can be added from the Editor.
Fields: what each one means
Identification
| Field | Type | Required | Example | Description |
|---|---|---|---|---|
title | string | Yes | "House with garden" | Public title of the property. Maximum 200 characters. |
code | string | No | "DEV-12345" | Internal code. If you don't provide it, Mapaprop generates an automatic one like IMP-{timestamp}. |
description | string | Yes | "Beautiful apt..." | Long description (plain text). |
descriptionFormatted | string | No | "Beautiful apt..." | Same description but with formatted line breaks. If not provided, copies description. |
urlWebExternal | string | No | "https://othersite.com" | Source URL, if you want to preserve the link. |
Property type and operation
| Field | Type | Required | Common values |
|---|---|---|---|
type | int | Yes | 1=Apartment, 2=House, 3=Estate, 4=Land, 10=PH, 23=Development |
operation | int | Yes | 1=Sale, 2=Rent, 3=Temporary rent |
status | int | No | 1=Brand new, 2=Excellent, 8=Regular, etc. Default: the system infers it. |
Full list of types in docs/mapaprop-mysql/mapaprop-database-mysql-report.md.
Location
Mapaprop uses a zone hierarchy with 4 levels. You must provide at least zone0, zone1, zone2. If you know the neighborhood (zone3) too, even better.
| Field | Type | Required | Meaning | Example (Argentina) |
|---|---|---|---|---|
zone0 | int | Yes | Country | 1 (Argentina) |
zone1 | int | Yes | Province | 1 (Capital), 2 (Buenos Aires) |
zone2 | int | Yes | District / City / Commune | 23 (Palermo), 138 (La Matanza) |
zone3 | int | No | Neighborhood / Locality | 1340 (Abasto) |
address | str | Yes | Street and number | "Av. Santa Fe 3500" |
betweenStreets | str | No | Between streets | "Between Coronel Diaz and Pueyrredon" |
zipcode | str | No | Zip code | "1425" |
mapLatitude | str | No | Latitude (string with decimal) | "-34.5955856" |
mapLongitude | str | No | Longitude | "-58.382166" |
Important: if you provide address and zone*, the Editor will show you the location on the map for confirmation. If you're unsure about zone IDs, you can provide just zone3Description (neighborhood text) and the Editor will help you map it.
{
"address": "Av. Santa Fe 3500",
"zone3Description": "Palermo",
"zone2Description": "Capital Federal"
}
Price
| Field | Type | Required | Example | Description |
|---|---|---|---|---|
price | number | Yes | 95000 | Main price. Number only, no symbols or dots. |
currency | string | Yes | "USD" | Currency. Values: "USD", "ARS", "EUR", etc. |
expensesPrice | number | No | 150000 | Monthly expenses (for rentals and properties in PH). |
expensesCurrency | string | No | "ARS" | Expenses currency (may differ from price). |
taxPrice | number | No | 5000 | Taxes / ABL. |
taxCurrency | string | No | "ARS" | Tax currency. |
paymentPeriod | int | No | 2 | 1=Daily, 2=Monthly, 3=Annual. Default 2 (monthly). |
Physical characteristics
| Field | Type | Description |
|---|---|---|
landArea | int | Land area in m². |
buildingArea | int | Covered area in m². |
rooms | int | Number of bedrooms (not the same as rooms/ambiences). |
ambiences | int | Total rooms (includes living room, kitchen, bedrooms). |
bathrooms | int | Full bathrooms. |
toilettes | int | Toilets (half baths). |
dependencies | int | Service dependencies. |
floors | int | Floor where the apartment is located (if applicable). |
totalFloors | int | Total number of floors in the building. |
apartmentsPerFloor | int | Apartments per floor. |
garage | int | Number of parking spaces. |
garageType | int | 1=Covered, 2=Semi-covered, 3=Uncovered. |
yearsOld | int | Age in years. 0 = brand new. |
orientation | str | "1"=North, "2"=South, ... "8"=Southwest. |
Careful: rooms ≠ ambiences. A 3-room apartment with 2 bedrooms would have ambiences: 3 and rooms: 2.
Amenities (booleans)
All optional. Pass them as true if the property has them, omit them if not (no need to set false).
{
"hasSwimmingPool": true,
"hasPatio": true,
"hasLaundry": true,
"hasStorage": true,
"hasSecurity": true,
"hasPrivateElevator": true,
"terrace": true,
"frontGarden": true,
"grill": true,
"janitor": true,
"suite": true,
"playroom": true,
"furnished": true,
"accessible": true,
"laundryMachine": true,
"wifi": true,
"alarm": true,
"securityBox": true,
"partySaloon": true,
"jacuzzi": true,
"barbecueArea": true,
"electricGenerator": true,
"gatedCommunity": true,
"countryClub": true,
"park": true,
"mortgageReady": true,
"professionalAvailable": true,
"petsReady": true,
"telephoneLine": true,
"cableIncluded": true
}
Images
{
"mainImage": "https://mysite.com/main-photo.jpg",
"images": [
{ "url": "https://mysite.com/photo1.jpg", "description": "Living room" },
{ "url": "https://mysite.com/photo2.jpg", "description": "Kitchen" },
{ "url": "https://mysite.com/photo3.jpg", "description": "Bedroom" }
]
}
- URLs must be public and accessible from the Internet (Mapaprop downloads them to the server).
- If you only have one main photo, provide
mainImageand leaveimagesempty or don't include it — the system builds the array frommainImage. - Recommended maximum: 20 photos per property.
Business status
{
"reserved": false,
"sold": false,
"rented": false,
"suspended": false,
"published": true,
"publishedOnlyWebsite": false
}
published: falseleaves the property as a draft (visible only in your panel, not published to networks or website).publishedOnlyWebsite: truepublishes it only on your site without sending it to portals (Zonaprop, MercadoLibre, etc.).
Advanced attributes (not required)
The attributes array allows passing amenities with detail (category, Spanish label, legacy code). If you don't provide it, Mapaprop infers attributes from the booleans in the previous section.
{
"attributes": [
{
"locale": "es_AR",
"country": "ar",
"id": "swimming-pool",
"label": "Piscina",
"group": "propertyAttribute",
"group_sub": "label",
"group_subtype": "ammenities",
"type": "bool",
"key_legacy": "hasSwimmingPool",
"selected": true,
"status": true
}
]
}
We only recommend using attributes if you are migrating from a system that already exports them in this format. For normal use, booleans are sufficient.
Complete realistic example
This is a valid and complete JSON, ready to paste into the form:
{
"code": "JSON-001",
"title": "2-room apartment in Palermo with balcony",
"description": "Bright apartment, high floor, with street-facing balcony. Kitchen integrated with living room. Bedroom with closet. Full bathroom with bathtub. Building with superintendent and electric doorman. Close to subway and buses. Mortgage ready.",
"operation": 1,
"type": 1,
"address": "Av. Santa Fe 3500",
"betweenStreets": "Between Coronel Diaz and Pueyrredon",
"zone0": 1,
"zone1": 1,
"zone2": 23,
"zone3": 22097,
"zipcode": "1425",
"mapLatitude": "-34.5955856",
"mapLongitude": "-58.382166",
"price": 95000,
"currency": "USD",
"expensesPrice": 80000,
"expensesCurrency": "ARS",
"rooms": 1,
"ambiences": 2,
"bathrooms": 1,
"toilettes": 0,
"buildingArea": 45,
"landArea": 45,
"floors": 7,
"totalFloors": 12,
"apartmentsPerFloor": 4,
"yearsOld": 8,
"orientation": "1",
"airConditioner": 2,
"heatingType": 4,
"waterHeaterType": 2,
"balconyType": 1,
"hasLaundry": true,
"laundryMachine": true,
"hasSecurity": true,
"janitor": true,
"mortgageReady": true,
"terrace": true,
"mainImage": "https://mysite.com/apt-photo-1.jpg",
"images": [
{ "url": "https://mysite.com/apt-photo-1.jpg", "description": "Living room" },
{ "url": "https://mysite.com/apt-photo-2.jpg", "description": "Kitchen" },
{ "url": "https://mysite.com/apt-photo-3.jpg", "description": "Bedroom" },
{ "url": "https://mysite.com/apt-photo-4.jpg", "description": "Balcony" }
],
"published": true,
"urlWebExternal": "https://mysite.com/properties/palermo-apt"
}
Common errors
| Symptom | Probable cause | How to fix it |
|---|---|---|
| "The JSON does not have a valid format" | Extra comma, unclosed quotes, or you used single quotes ' instead of ". | Paste it into https://jsonlint.com/ to find the syntax error. |
| "Required fields are missing" | You're missing title, description, operation, type, price, currency or zones. | Check the "Minimum required" section above. |
| Images don't load | URLs are not public (require login) or return 404. | Test them by pasting into an incognito browser. If they don't open, the server can't download them either. |
| Imports but zones are empty | You provided zone3Description as text but zone3 IDs are not resolved. | Fill in the correct IDs, or use the zone selector in the Editor after pasting the JSON. |
Price appears as 0 | You provided price as a string ("95000") or with dots/commas ("95.000"). | Provide it as a number without separators: 95000. |
rooms and ambiences are the same | Confusion between bedrooms and rooms. | rooms=bedrooms, ambiences=total rooms. A 3-room apt with 2 bedrooms is rooms: 2, ambiences: 3. |
System says CODE_DUPLICATED | You provided a code that already exists in your account. | Change it or omit it from the JSON (Mapaprop generates an automatic one like IMP-{timestamp}). |
Validation before pasting
- Validate the JSON at
https://jsonlint.com/orhttps://jsonformatter.org/. If the site shows a syntax error, it won't work in Mapaprop either. - Verify it has all required fields:
title,description,operation,type,price,currency,address,zone0,zone1,zone2. - Test with the minimum example first. If it works, add fields gradually.
Differences between the 3 modes
| Aspect | URL | HTML | JSON |
|---|---|---|---|
| Data source | Live web scraping + AI | HTML pasted by user | JSON pasted by user |
| Reliability | High for known portals | High — bypasses blocks | 100% — no transformations |
| Time | 30-90s | 30-60s | Immediate |
| Requires format knowledge | No | No | Yes |
| Recommended for | Common use | Sites with login wall | Power users / integrations |
Support and references
- Property object technical doc:
.claude/rules/java-backend/property-object-reference.md - MySQL schema:
docs/mapaprop-mysql/mapaprop-database-mysql-report.md - General import rules:
property-import-url-rules.md - Architecture:
property-import-url-architecture.md - Full JSON example:
mapaprop-apps/mapaprop-v2/pages/properties/property-post-v3.json
If you encounter a case not covered by this documentation, copy the error modal report and send it in a support ticket.