Validation Rules
Quality rules applied to each property before publishing. If a rule fails, the property is blocked, published as draft, or published normally with missing amenities recorded.
Severities
| Severity | Effect |
|---|---|
| BLOCK | The property is not published. You must fix the data in your CRM so it can be processed in a later cycle. |
| DRAFT | The property may publish in draft state or with reduced internal visibility. |
| WARN | The property publishes normally. Only applies to missing amenities. |
When a property fails multiple rules, the highest severity determines the result:
Any BLOCK rule fails -> BLOCK result
No BLOCK, any DRAFT rule fails -> DRAFT result
No BLOCK or DRAFT -> PUBLISH result
All rules are evaluated to provide complete diagnostics. The standard webhook with status REJECTED includes only blocking issue messages.
BLOCK Rules
These rules prevent publication.
| Rule | Field(s) | Condition that must pass |
|---|---|---|
| Property type | property_type | Must be commercial and resolve to office, retail, industrial, or terrain. Residential properties are rejected. |
| Description eligibility | description | The description must not indicate disallowed residential content. If analysis cannot rule out residential risk, the property is blocked conservatively. |
| Modality | modality | Must resolve to rent, sale, or both. Send rent, sale, or rent_and_sale. |
| Price present | price.rent_price, price.sale_price | At least one price must be greater than 0. |
| Basic location | location.city, location.state | City and state must be present. |
| Resolvable postal code | location.postal_code | Must exist and resolve during enrichment. |
| Required coordinates | location.latitude, location.longitude | Both must be present and different from 0. |
| Required street | location.street | Must be present together with coordinates. |
| Required contact | contact.name, contact.email, contact.phone | All three fields must be present. |
| Exterior number | location.ext_number | If sent, must be at most 6 characters. |
| Interior number | location.int_number | If sent, must be at most 6 characters. |
| Blocked contact | contact.email, contact.phone | The agent or contact must not be blocked by quality or security policies. |
| Maximum bedrooms | bedrooms | If sent, must be less than or equal to 20. |
| Industrial divisible area | industrial.min_area_divisible_m2, industrial.max_area_divisible_m2 | If both exist, max must be greater than or equal to min. |
| Industrial height | industrial.min_height_m, industrial.max_height_m | If maximum height is sent, minimum height must not exceed it. |
| Industrial luminaries | industrial.luminaries, industrial.luminary_specs | If luminaries > 0, luminary_specs must be present. |
| Office floor | office.floor_level, office.floor_level_number | If floor_level = 6, floor_level_number must be present. |
| Retail price per m² range | retail.price_per_sqm_min, retail.price_per_sqm_max | If both exist, max must be greater than or equal to min. |
| Land use | terrain.land_use | For land, always sending it is recommended. If the field reaches the mapped payload empty, it blocks. |
DRAFT Rules
These rules do not block processing, but degrade visibility or leave the property in draft.
| Rule | Field(s) | Condition that must pass |
|---|---|---|
| Minimum photos | photos | At least 1 photo is required to avoid draft. |
| Photo quality | photos | We recommend at least 3 photos. With 1 or 2 photos, the property may remain in draft or reduced visibility. |
| Coordinates inside Mexico | location.latitude, location.longitude | Coordinates must be confidently inside Mexico. Invalid or outside-country cases degrade to draft. |
| Minimum price | price.rent_price, price.sale_price | Price must be above the canonical validation minimum. |
| Price per m² | price, surface_m2 / land_m2 | Price per m² must be within the canonical range by property type and modality. |
| Minimum surface | surface_m2 / land_m2 | Surface must be above the canonical minimum for the property type. |
| Statistical surface | surface_m2 / land_m2 | Surface must be within the canonical range by property type. |
WARN Rules
These rules do not affect public publication, but are recorded for quality control.
| Rule | Field(s) | Recommended condition |
|---|---|---|
| Amenities | amenities | Send at least one recognizable amenity. |
Thresholds
Price per m² and surface ranges come from Spot2 canonical validation rules. They are evaluated by property type, modality, and available surface scope.
Most relevant public thresholds:
| Threshold | Value |
|---|---|
| Minimum photos to avoid draft | 1 |
| Recommended photos to avoid draft | 3 |
| Recommended minimum description length | 20 characters |
| Maximum bedrooms | 20 |
| Maximum description length | 1000 characters |
| Maximum exterior number length | 6 characters |
| Maximum interior number length | 6 characters |
Permanent Rejection
If a property fails BLOCK rules for 5 consecutive cycles without data changes, it is marked as permanently failed to avoid unnecessary full retries.
The property is still revalidated in later cycles. If you fix the data in your CRM and it passes QA with PUBLISH or DRAFT, it leaves permanent failure and re-enters the normal flow.
Webhook Messages
The standard webhook only sends REJECTED when there is a blocking rejection. In that case, messages contains readable messages for the integrator and only includes BLOCK rules.
DRAFT rules and the amenities WARN rule may be logged internally or reported to Spot2 quality systems, but they do not appear as rejection messages in the standard webhook.