Skip to main content
Version: v1.0

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:

  1. Extract the token from the Authorization header.
  2. Compare the received token with the agreed value.
  3. If it matches, process the webhook.
  4. If it does not match, respond 401 and 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:

StatusWhen it happensFields
PROCESSINGThe property was accepted by Ingestion and sent to the downstream publication flow.external_id, status
REJECTEDThe 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"
}
FieldTypeDescription
external_idstringProperty identifier in your system.
statusstringAlways 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"
]
}
FieldTypeDescription
external_idstringProperty identifier in your system.
statusstringAlways REJECTED.
messagesstring[]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:

AttemptApproximate wait
1Immediate
210 seconds
330 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

CodeWhen to use it
2xxWebhook received correctly.
401Invalid bearer token.
429Temporary rate limit. We retry.
5xxTemporary server error. We retry.

Security

  • Always use HTTPS.
  • Validate the bearer token on every request.
  • Do not expose the feedback_token in logs, source code, or URLs.
  • Process the webhook idempotently by external_id and status.