Lifecycle
What happens to a property from the moment you send it until it's no longer listed on Spot2.
Possible states
| State | What it means for you |
|---|---|
| New | The property appears in your feed for the first time. |
| Modified | The property already exists but some of its data changed (price, description, photos, etc.). |
| Unchanged | The property already exists and no data has changed since the last sync. |
| Deactivated | Its external_id appeared in the /properties/deleted endpoint. |
| Resurrected | The property was deactivated but reappeared in the main feed. |
When a property is published
A property is published when:
- It is new and passes all mandatory validations.
- It is modified and still passes all validations.
If the property fails a validation, it remains pending. You'll receive the details of the issues via the feedback webhook.
When a property is deactivated
A property is deactivated when its external_id appears in the deletion endpoint (/properties/deleted). This indicates the property was delisted in your CRM and should no longer be published.
Spot2 queries the deletion endpoint on each sync cycle. The delisting is immediate: the property is deactivated in the same cycle.
The absence of a property from the main feed is never interpreted as deletion. Only the deletion endpoint can deactivate properties.
More details in Deletion Protocol.
When a property is resurrected
If a property was deactivated and then reappears in your main feed with the same external_id, it is republished with the current data. It goes through all validations again before being published.
If the external_id changes, it is treated as a new property.
Fault tolerance
The incremental model is designed to tolerate failures:
- API returns empty (temporary bug): If Spot2 sends
updated_sinceand your API responds with 0 items, nothing is deleted. Absence is never deletion. - Timeout mid-pagination: The cycle is marked as failed. The next cycle retries from the same timestamp — no information is lost.
- Spot2 is down for N days: On return, it sends
updated_sincewith the last successful cycle's date. Your API returns all accumulated changes.