Skip to main content
Version: v1.0

Property Schema

Complete reference for the JSON format your API must return for each property. This document defines the standard contract for new Spot2 Ingestion integrations.


Conventions

  • Field names use snake_case.
  • Dates use ISO 8601 with timezone when available, for example 2026-07-24T15:40:43Z.
  • Text is UTF-8.
  • Numeric fields use decimal point and no thousands separators.
  • Empty arrays use [], not null.
  • Null fields (null) are equivalent to missing fields.
  • Unknown fields are ignored. Only fields documented in this schema are processed.

JSON Structure

Each property is represented as a JSON object:

{
"external_id": "PROP-001",
"property_type": "office",
"modality": "rent",
"title": "Oficina corporativa en Polanco",
"description": "Oficina acondicionada con estacionamiento y aire acondicionado.",
"updated_at": "2026-07-24T15:40:43Z",
"surface_m2": 250.5,
"land_m2": null,
"bedrooms": 0,
"bathrooms": 2.5,
"parking_spots": 4,
"price": {
"currency": "MXN",
"rent_price": 120000,
"sale_price": null
},
"location": {
"latitude": 19.4326,
"longitude": -99.1937,
"street": "Avenida Presidente Masaryk",
"ext_number": "123",
"int_number": "4B",
"neighborhood": "Polanco",
"city": "Ciudad de México",
"state": "Ciudad de México",
"postal_code": "11560"
},
"contact": {
"name": "Broker CRM",
"phone": "525512345678",
"email": "broker@example.com"
},
"office": {
"floor_level": 6,
"floor_level_number": "4"
},
"industrial": {},
"retail": {},
"terrain": {},
"photos": [
"https://cdn.your-crm.com/photo-1.jpg",
"https://cdn.your-crm.com/photo-2.jpg"
],
"amenities": [
"aire acondicionado",
"elevador"
]
}

Identity And Classification

FieldLocationTypeRequirement
external_idrootstringRequired. Unique and immutable identifier in your system. id is also accepted as fallback, but always sending external_id is recommended.
property_typerootstringRequired. One of office, retail, industrial, terrain.
modalityrootstringRequired. One of rent, sale, rent_and_sale. If missing or unrecognized, it is interpreted as rent; always send it explicitly.
titlerootstringOptional. If missing, an operational title is generated from external_id.
descriptionrootstringOptional, but recommended. Preserved as external description for audit and content improvement.
updated_atrootstringRecommended. Last modification in your CRM. Used for incremental sync and to detect potentially inactive inventory.

property_type Catalog

Spot2 Ingestion processes these 4 commercial families:

ValueUse
officeOffices, corporate suites, private offices, medical offices, and coworking.
retailRetail spaces, shops, restaurants, showrooms, and shopping-center spaces.
industrialWarehouses, industrial units, distribution centers, factories, and industrial parks.
terrainCommercial or industrial land and lots.

Do not send residential properties. Houses, apartments, housing, and mainly residential uses are rejected automatically.

Normalization Examples

If your CRM has internal subtypes, normalize them before exposing the feed:

Internal CRM subtypeSend as property_type
oficina, edificio, corporate, private office, medical office, coworkingoffice
local, retail space, shop, restaurant, showroom, shopping center, hotel, bar, cafeteria, pharmacy, gym, spa, boutiqueretail
bodega, industrial warehouse, industrial unit, warehouse, galpón, depósito, industrial parkindustrial
terreno, commercial land, industrial land, lot, land, plotterrain

modality Catalog

ValueMeaning
rentRent only.
saleSale only.
rent_and_saleAvailable for both rent and sale. Send both prices.

Price

The price object groups prices and currency:

FieldTypeRequirement
rent_pricenumber or nullRequired with value greater than 0 when modality is rent or rent_and_sale.
sale_pricenumber or nullRequired with value greater than 0 when modality is sale or rent_and_sale.
currencystringRecommended. Public allowed values: MXN, USD. If missing, it is interpreted as MXN.

Example for rent and sale:

{
"external_id": "PROP-002",
"property_type": "retail",
"modality": "rent_and_sale",
"price": {
"rent_price": 35000,
"sale_price": 4500000,
"currency": "MXN"
}
}

Supported Currencies

CodeCurrency
MXNMexican peso.
USDUS dollar.

We recommend sending prices in MXN. If you send USD, Spot2 applies validations on the converted MXN value when applicable.


Location

The location object describes address and coordinates:

FieldTypeRequirement
citystringRequired for publishing.
statestringRequired for publishing.
postal_codestringRequired. Must resolve during enrichment.
streetstringRequired. Required together with coordinates.
ext_numberstringOptional. Maximum 6 characters.
int_numberstringOptional. Maximum 6 characters if sent.
neighborhoodstringOptional. Neighborhood, borough, or area.
latitudenumberRequired. Must be different from 0.
longitudenumberRequired. Must be different from 0.

If coordinates are confidently outside Mexico, the property may publish as draft or with reduced visibility.


Contact

The contact object contains agent or commercial contact data:

FieldTypeRequirement
namestringRequired. Commercial contact name.
emailstringRequired. Contact email address.
phonestringRequired. Contact phone number.

If the contact is blocked by quality or security policies, the property is not published.


Physical Characteristics

FieldLocationTypeRequirement
surface_m2rootnumber or nullRecommended. Built surface in m². If missing or non-positive, it is treated as unknown.
land_m2rootnumber or nullRecommended for land. For terrain, used as surface fallback when surface_m2 is missing or non-positive.
bedroomsrootinteger or nullOptional. Maximum 20 if sent.
bathroomsrootnumber or nullOptional. Decimals are accepted, for example 2.5.
parking_spotsrootinteger or nullOptional. 0 is valid and means no parking spaces. If missing, it is omitted from the publish payload.

Photos

FieldTypeRequirement
photosstring[]Recommended. Without photos, or with fewer than 3 photos, the property may publish as draft or with reduced visibility. We recommend 3 or more.

Rules:

  • Send public http or https URLs; https is recommended.
  • Array order defines visual priority; the first image is used as main image when applicable.
  • Spot2 may cap the final photo payload to 20 URLs.

Amenities

amenities is an array of text labels. Spanish or English labels are accepted and mapped to the internal catalog when they match a known amenity. Unknown amenities are ignored and do not cause rejection.

Some amenities are also inferred from numeric fields: bathrooms > 0 adds bathrooms, and parking_spots > 0 adds parking.

Recommended values:

Recommended valueAmenity
bathrooms or bañosBathrooms
wifiWi-Fi
air_conditioning or aire acondicionadoAir conditioning
parking or estacionamientoParking
warehouse or bodegaWarehouse / storage
accessibility or accesibilidadAccessibility
electricity or luzElectricity
security_system or sistema de seguridadSecurity system
forklift or montacargasForklift
whiteboard or pizarrónWhiteboard
elevator or elevadorElevator
terrace or terrazaTerrace
cleaning_area or zona de limpiezaCleaning area
divisibleDivisible
mezzanineMezzanine
equipped_kitchen or cocina equipadaEquipped kitchen
backup_generator or planta de luzBackup generator
kitchen or cocinaKitchen
loft or tapancoLoft

Type-Specific Fields

The office, industrial, retail, and terrain objects are optional, but some fields have validations when sent.

Office ("property_type": "office")

FieldLocationTypeValidation
floor_levelofficeintegerOptional. If 6, floor_level_number is required.
floor_level_numberofficestring or numberRequired when floor_level = 6.
{
"property_type": "office",
"office": {
"floor_level": 6,
"floor_level_number": "4"
}
}

Industrial ("property_type": "industrial")

FieldLocationTypeValidation
min_height_mindustrialnumber or nullMinimum clear height. If missing, interpreted as 0.
max_height_mindustrialnumber or nullMaximum clear height. If sent, min_height_m must not be greater than this value.
min_area_divisible_m2industrialnumber or nullMinimum divisible area. Must be less than or equal to max_area_divisible_m2 when both exist.
max_area_divisible_m2industrialnumber or nullMaximum divisible area. Must be greater than or equal to min_area_divisible_m2 when both exist.
luminariesindustrialinteger or nullIf greater than 0, luminary_specs is required.
luminary_specsindustrialstring or nullLuminary specifications. Required when luminaries > 0.
{
"property_type": "industrial",
"industrial": {
"min_height_m": 4.5,
"max_height_m": 9.2,
"min_area_divisible_m2": 200,
"max_area_divisible_m2": 2000,
"luminaries": 20,
"luminary_specs": "LED industrial 200W"
}
}

Retail ("property_type": "retail")

FieldLocationTypeValidation
min_height_mretailnumber or nullMinimum clear height. If missing, interpreted as 0.
price_per_sqm_minretailnumber or nullMinimum price per m². Must be less than or equal to price_per_sqm_max when both exist.
price_per_sqm_maxretailnumber or nullMaximum price per m². Must be greater than or equal to price_per_sqm_min when both exist.
{
"property_type": "retail",
"retail": {
"min_height_m": 3.8,
"price_per_sqm_min": 200,
"price_per_sqm_max": 500
}
}

Terrain ("property_type": "terrain")

FieldLocationTypeValidation
land_useterrainstringRequired for land when the field is present in the mapped payload. We recommend always sending it.
{
"property_type": "terrain",
"surface_m2": 0,
"land_m2": 5000,
"terrain": {
"land_use": "industrial"
}
}

Publishing Rules

The property is evaluated with three severities:

SeverityResult
BLOCKNot published. You must fix the data in your CRM.
DRAFTPublished as draft or with reduced internal visibility.
WARNPublished normally, but missing amenities are recorded.

Summary of critical requirements to avoid BLOCK:

  • external_id present.
  • Commercial and recognizable property_type.
  • Valid modality.
  • At least one price greater than 0.
  • location.city, location.state, location.street, location.latitude, and location.longitude present.
  • postal_code resolvable after enrichment.
  • Exterior and interior numbers with maximum 6 characters when sent.
  • contact.name, contact.email, and contact.phone present.
  • Valid type-specific rules.
  • Contact must not be blocked.
  • Description must not indicate a residential property.

For the full rules catalog, see Validation Rules.


Custom Integrations

If your CRM cannot expose this exact contract, the integration requires a custom adapter outside this document.