Feedback Webhook
We notify you by webhook when Spot2 Ingestion accepts a property for processing or rejects it because of blocking errors. The webhook is optional: your properties are still processed without it, but you do not receive automatic acceptance or rejection feedback.
Endpoint You Provide
Expose an HTTP POST endpoint that receives JSON:
POST /api/webhooks/spot2/feedback HTTP/1.1
Host: your-crm.com
Content-Type: application/json
Authorization: Bearer <feedback-token>
Respond with any 2xx status when the webhook is processed correctly.
Webhook Authentication
Each request includes a shared bearer token:
Authorization: Bearer <feedback-token>
To verify it:
- Extract the token from the
Authorizationheader. - Compare the received token with the agreed value.
- If it matches, process the webhook.
- If it does not match, respond
401and discard the request.
If you need to rotate the token, coordinate with Spot2 to avoid rejected requests during the transition.
Statuses Emitted By Ingestion
Spot2 Ingestion only emits ingestion-stage statuses:
| Status | When it happens | Fields |
|---|---|---|
PROCESSING | The property was accepted by Ingestion and sent to the downstream publication flow. | external_id, status |
REJECTED | The property cannot continue because of a blocking mapping, enrichment, QA, prepare, or publish error. | external_id, status, messages |
Final marketplace statuses, such as published, unpublished, or archived, belong to downstream services and are not part of this standard Ingestion webhook.
PROCESSING Payload
The property was accepted for processing. This status does not mean it is already published in the marketplace.
{
"external_id": "PROP-001",
"status": "PROCESSING"
}
| Field | Type | Description |
|---|---|---|
external_id | string | Property identifier in your system. |
status | string | Always PROCESSING. |
REJECTED Payload
The property cannot continue because of blocking errors. Fix the data in your CRM so it can be reprocessed in a later cycle.
{
"external_id": "PROP-002",
"status": "REJECTED",
"messages": [
"At least one price (rent or sale) must be greater than zero",
"location.latitude and location.longitude are required",
"contact.name, contact.email, and contact.phone are required",
"zip_code_id could not be resolved for postal_code: 00000"
]
}
| Field | Type | Description |
|---|---|---|
external_id | string | Property identifier in your system. |
status | string | Always REJECTED. |
messages | string[] | Human-readable messages with blocking errors. |
messages includes only BLOCK issues. DRAFT findings and the amenities WARN rule are not sent as rejections in this webhook.
Message Language
Messages are sent in Spanish by default. If you need messages in English, we can configure it per integration.
Retries
Webhook delivery is asynchronous. If your endpoint does not respond with 2xx, we make up to 3 total attempts with backoff:
| Attempt | Approximate wait |
|---|---|
| 1 | Immediate |
| 2 | 10 seconds |
| 3 | 30 seconds |
If retries are exhausted, we abandon the delivery and log the failure. This does not stop the ingestion cycle or affect property publication.
Expected Responses
| Code | When to use it |
|---|---|
2xx | Webhook received correctly. |
401 | Invalid bearer token. |
429 | Temporary rate limit. We retry. |
5xx | Temporary server error. We retry. |
Security
- Always use HTTPS.
- Validate the bearer token on every request.
- Do not expose the
feedback_tokenin logs, source code, or URLs. - Process the webhook idempotently by
external_idandstatus.