Nexcar

Webhooks

Receive an HTTP notification when a case changes status or is assigned to an analyst.

How they work#

When a case moves forward — it is created, finishes processing, changes its review status, or is assigned to someone — Nexcar sends an HTTP POST request to the URL you configured.

Delivery happens in the background: the operation that triggered it has already returned successfully before the webhook goes out, and a delivery failure does not roll it back. An assigned case stays assigned even if your endpoint is down.

Each webhook is configured per company and per event in Nexcar: you only receive the events you registered. Request them from your Nexcar contact or at soporte@nexcar.mx, providing the receiving URL and the event.

Available events#

EventWhen it fires
expediente-createdA case was created and landed in sin_documentos
processing-in-reviewProcessing finished and the review status became nuevo
processing-review-correctionsProcessing finished and the review status became devuelta_correccion or revision_correcciones
error-processingBulk processing ended in an operational error
services-circulo-creditoAny review status change when processing closes, with or without error
v1-assign-analystThe case was assigned to a user via POST /v1/cases/{case_id}/assign

The three processing-* events and services-circulo-credito are evaluated at the same moment — when processing closes — and fire only if the review status actually changed to that value. services-circulo-credito is the exception: it reports any review status change, and exists as a separate key for integrations that want every closure on a single channel.

v1-assign-analyst evaluates no transition: each assignment is a fact in itself, and reassigning the same user fires it again.

Payload structure#

You define the request body. Nexcar imposes no envelope: each webhook carries an associated JSON template, and the server fills it with the case data before sending. That way the payload goes straight into your system with no translation on your side.

The template is JSON with {{...}} placeholders:

{
  "event": "processing-in-review",
  "data": {
    "folio": "{{expedientData.internal_id}}",
    "status": "{{expedientData.review_status}}",
    "url": "{{expedientData.url_exp}}"
  }
}

With that, the POST you receive looks like this:

{
  "event": "processing-in-review",
  "data": {
    "folio": "EXP-2026-0001",
    "status": "nuevo",
    "url": "https://app.nexcar.mx/workspace-analysis/11111111-2222-3333-4444-555555555555/#"
  }
}

Available variables#

VariableContents
{{expedientData.vehicle_id}}Case UUID (the API's case_id)
{{expedientData.internal_id}}Your internal reference, the one you sent when creating the case
{{expedientData.review_status}}The case's review status at the time of the event
{{expedientData.url_exp}}Direct link to the case in the Nexcar interface
{{expedientData.user_id}}Identifier of the user who triggered the action
{{expedientData.user_name}}Their name, or N/A if it could not be resolved
{{expedientData.user_email}}Their email, or N/A if it could not be resolved
{{expedientData.created_at}}Case creation date, ISO 8601
{{environment}}Environment the event originated from

If you define no template#

The body is the minimum you need to identify the case:

{ "internal_id": "EXP-2026-0001", "source": "api" }

The exception is processing-in-review, which without a template sends:

{
  "status": "en_revision",
  "event_type": "in-review",
  "vehicle_id": "11111111-2222-3333-4444-555555555555",
  "internal_id": "EXP-2026-0001"
}

A case without an internal_id fires no status webhooks: with no reference there is no way for you to identify it on your side.

Authenticating the call#

The POST always carries Content-Type: application/json and Accept: application/json.

If your endpoint requires a credential, Nexcar sends it in the x-api-key header. The value is stored on Nexcar's side, never in the webhook's visible configuration: you hand us the key when registering the receiver and it travels on every call.

Delivery and failures#

AttemptsOne. There is no automatic retry
Timeout30 seconds
If your endpoint failsThe attempt is recorded with its status code and response, and an internal alert is raised at Nexcar

Since there is no retry, your receiver should return 2xx as soon as it receives the event and do the heavy lifting asynchronously: a late 2xx past the 30-second mark counts as a failure even if you processed the event.

If you need to recover a missed event, the query endpoints are the source of truth: a case's state can always be read with GET /v1/cases/{case_id}. The webhook notifies; the API confirms.

Idempotency#

The same case can generate several notifications of the same event — a repeated reassignment, a reprocessing — and two different events can arrive nearly at once when processing closes. Treat each call as notice that something changed, not as an increment: apply the state it carries rather than accumulating it.