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

FieldTypeRequiredExampleDescription
titlestringYes"House with garden"Public title of the property. Maximum 200 characters.
codestringNo"DEV-12345"Internal code. If you don't provide it, Mapaprop generates an automatic one like IMP-{timestamp}.
descriptionstringYes"Beautiful apt..."Long description (plain text).
descriptionFormattedstringNo"Beautiful apt..."Same description but with formatted line breaks. If not provided, copies description.
urlWebExternalstringNo"https://othersite.com"Source URL, if you want to preserve the link.

Property type and operation

FieldTypeRequiredCommon values
typeintYes1=Apartment, 2=House, 3=Estate, 4=Land, 10=PH, 23=Development
operationintYes1=Sale, 2=Rent, 3=Temporary rent
statusintNo1=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.

FieldTypeRequiredMeaningExample (Argentina)
zone0intYesCountry1 (Argentina)
zone1intYesProvince1 (Capital), 2 (Buenos Aires)
zone2intYesDistrict / City / Commune23 (Palermo), 138 (La Matanza)
zone3intNoNeighborhood / Locality1340 (Abasto)
addressstrYesStreet and number"Av. Santa Fe 3500"
betweenStreetsstrNoBetween streets"Between Coronel Diaz and Pueyrredon"
zipcodestrNoZip code"1425"
mapLatitudestrNoLatitude (string with decimal)"-34.5955856"
mapLongitudestrNoLongitude"-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

FieldTypeRequiredExampleDescription
pricenumberYes95000Main price. Number only, no symbols or dots.
currencystringYes"USD"Currency. Values: "USD", "ARS", "EUR", etc.
expensesPricenumberNo150000Monthly expenses (for rentals and properties in PH).
expensesCurrencystringNo"ARS"Expenses currency (may differ from price).
taxPricenumberNo5000Taxes / ABL.
taxCurrencystringNo"ARS"Tax currency.
paymentPeriodintNo21=Daily, 2=Monthly, 3=Annual. Default 2 (monthly).

Physical characteristics

FieldTypeDescription
landAreaintLand area in m².
buildingAreaintCovered area in m².
roomsintNumber of bedrooms (not the same as rooms/ambiences).
ambiencesintTotal rooms (includes living room, kitchen, bedrooms).
bathroomsintFull bathrooms.
toilettesintToilets (half baths).
dependenciesintService dependencies.
floorsintFloor where the apartment is located (if applicable).
totalFloorsintTotal number of floors in the building.
apartmentsPerFloorintApartments per floor.
garageintNumber of parking spaces.
garageTypeint1=Covered, 2=Semi-covered, 3=Uncovered.
yearsOldintAge in years. 0 = brand new.
orientationstr"1"=North, "2"=South, ... "8"=Southwest.

Careful: roomsambiences. 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 mainImage and leave images empty or don't include it — the system builds the array from mainImage.
  • Recommended maximum: 20 photos per property.

Business status

{
    "reserved": false,
    "sold": false,
    "rented": false,
    "suspended": false,
    "published": true,
    "publishedOnlyWebsite": false
}
  • published: false leaves the property as a draft (visible only in your panel, not published to networks or website).
  • publishedOnlyWebsite: true publishes 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

SymptomProbable causeHow 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 loadURLs 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 emptyYou 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 0You 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 sameConfusion between bedrooms and rooms.rooms=bedrooms, ambiences=total rooms. A 3-room apt with 2 bedrooms is rooms: 2, ambiences: 3.
System says CODE_DUPLICATEDYou 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

  1. Validate the JSON at https://jsonlint.com/ or https://jsonformatter.org/. If the site shows a syntax error, it won't work in Mapaprop either.
  2. Verify it has all required fields: title, description, operation, type, price, currency, address, zone0, zone1, zone2.
  3. Test with the minimum example first. If it works, add fields gradually.

Differences between the 3 modes

AspectURLHTMLJSON
Data sourceLive web scraping + AIHTML pasted by userJSON pasted by user
ReliabilityHigh for known portalsHigh — bypasses blocks100% — no transformations
Time30-90s30-60sImmediate
Requires format knowledgeNoNoYes
Recommended forCommon useSites with login wallPower 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.