VitrinaAPI

Mantener tu stock al día desde tu ERP

Tu ERP sigue siendo la fuente de verdad. Vitrina recibe una copia de cada auto y la usa en conversaciones, sitio web y portales.

AutomotorasSolo en los workspaces de automotoras.

Si tu automotora ya trabaja con un ERP propio, no tienes que cambiarlo. Tu ERP le avisa a Vitrina cuando un auto entra, cambia, se reserva o se vende. Con esa copia, el agente responde por el stock real y tu sitio muestra el lote al día. Publicar en los portales es un clic desde la aplicación.

Son cinco operaciones:

Cuando en tu ERP…Llamas a
Entra un autoPOST /vehicles
Cambia el precio, el kilometraje, las fotos o la descripciónPUT /vehicles/{id}
Se reservaPUT /vehicles/{id} con status: "reservado"
Se vendePUT /vehicles/{id} con status: "vendido"
Sale sin vendersePUT /vehicles/{id} con active: false

Las respuestas de esta página salen de una corrida contra un espacio de prueba. Los identificadores serán otros; la forma es la misma.

Trampa

Guarda el id de Vitrina en tu ERP

POST /vehicles no recibe tu código interno. Devuelve un id, y todas las llamadas siguientes usan ese id. Guárdalo junto a tu ficha del auto en cuanto lo creas.

Antes de empezar

  • Una key con tenant:read, marketplace:read y marketplace:write. Se emite en Autenticación.
  • Construye primero contra tu espacio de prueba con una key sk_test_. Cuando el sync funcione, cambias a la key real: el código es el mismo.

1. Toma el id de tu sucursal

curl https://api.vitrinadev.com/api/v1/locations \
  -H "Authorization: Bearer $VITRINA_KEY"
{
  "data": [
    { "id": "35cc2d47-8929-4c84-9bfa-9a4835db55cb", "name": "Casa matriz" }
  ]
}

Cada auto va a una sucursal. Con una sola, ese id es el mismo para todo el stock. Lo pides una vez y lo guardas en la configuración del sync.

2. Crea cada auto una vez

curl -X POST https://api.vitrinadev.com/api/v1/vehicles \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5b0f8c1e-erp-RTKZ45-alta" \
  -d '{
    "make": "Toyota",
    "model": "Yaris",
    "version": "XLS 1.5",
    "year": 2022,
    "price_amount": 11990000,
    "price_currency": "CLP",
    "odometer_value": 28500,
    "odometer_unit": "KM",
    "type": "Car",
    "listing_type": "Usado",
    "fuel_type": "Bencina",
    "gear_type": "Manual",
    "color": "Gris",
    "registration_number": "RTKZ45",
    "location_id": "35cc2d47-8929-4c84-9bfa-9a4835db55cb",
    "description": "Único dueño, mantenimientos al día.",
    "photos": [
      { "url": "https://images.unsplash.com/photo-1623869675781-80aa31012a5a", "order": 0 }
    ]
  }'
{
  "data": {
    "id": "0ea21e09-afb1-4df6-9e55-3e610627cc9e",
    "make": "Toyota",
    "model": "Yaris",
    "registration_number": "RTKZ45",
    "plate_normalized": "RTKZ45",
    "price_amount": 11990000,
    "odometer_value": 28500,
    "description": "Único dueño, mantenimientos al día.",
    "status": "disponible",
    "active": true,
    "location_id": "35cc2d47-8929-4c84-9bfa-9a4835db55cb",
    "photos": [
      { "url": "https://images.unsplash.com/photo-1623869675781-80aa31012a5a", "order": 0 }
    ],
    "created_at": "2026-10-06T15:03:28.627Z"
  }
}

201, y desde ese momento el agente ya puede ofrecer el auto. Las fotos van como URLs públicas, en el mismo objeto.

description es el texto libre del aviso: en Chileautos aparece como «Comentarios del vendedor». Los saltos de línea van como \n. Para cambiarlo después, manda description en el PUT del paso 4.

Trampa

Sin teléfonos ni links en la descripción

Chileautos no permite datos de contacto en el aviso. Si description trae un teléfono, un correo, un link o la palabra WhatsApp, Vitrina no publica ese auto en Chileautos.

Si la red se corta y tu ERP reintenta con el mismo Idempotency-Key y el mismo cuerpo, la API devuelve el mismo auto con el mismo id, y no crea un segundo.

3. Si el auto ya estaba cargado

La misma patente contra un auto activo responde 409:

{
  "error": {
    "code": "CONFLICT",
    "message": "Otro vehículo activo ya tiene esta patente (conflicto de patente).",
    "details": { "field": "registration_number", "reason": "plate_backstop" },
    "requestId": "b465d445-97d6-4a74-950f-37bb906a2266"
  }
}

Eso pasa en la primera carga si alguien ya subió autos a mano. Búscalo por patente y guarda su id:

curl "https://api.vitrinadev.com/api/v1/vehicles?q=RTKZ45" \
  -H "Authorization: Bearer $VITRINA_KEY"
{
  "data": [
    { "id": "0ea21e09-afb1-4df6-9e55-3e610627cc9e", "registration_number": "RTKZ45", "status": "disponible" }
  ],
  "meta": { "total": 1 }
}

q busca texto libre, así que confirma que registration_number sea la patente que buscabas antes de guardar el id.

4. Manda solo lo que cambió

curl -X PUT https://api.vitrinadev.com/api/v1/vehicles/0ea21e09-afb1-4df6-9e55-3e610627cc9e \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "price_amount": 11490000, "odometer_value": 29100 }'
{
  "data": {
    "id": "0ea21e09-afb1-4df6-9e55-3e610627cc9e",
    "price_amount": 11490000,
    "price_clp": 11490000,
    "odometer_value": 29100,
    "status": "disponible",
    "updated_at": "2026-10-06T15:03:30.483Z"
  }
}

Los campos que no mandas no se tocan. Si el auto está publicado en un portal, el cambio llega también al aviso, sin otra llamada.

5. Reservado

curl -X PUT https://api.vitrinadev.com/api/v1/vehicles/0ea21e09-afb1-4df6-9e55-3e610627cc9e \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "status": "reservado" }'
{
  "data": {
    "id": "0ea21e09-afb1-4df6-9e55-3e610627cc9e",
    "status": "reservado",
    "reserved_at": "2026-10-06T15:03:31.365Z",
    "active": true
  }
}

Un reservado sigue en el lote, con su etiqueta, y sus avisos siguen arriba. Si la reserva se cae, vuelve a mandar status: "disponible".

6. Vendido

curl -X PUT https://api.vitrinadev.com/api/v1/vehicles/0ea21e09-afb1-4df6-9e55-3e610627cc9e \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "status": "vendido" }'
{
  "data": {
    "id": "0ea21e09-afb1-4df6-9e55-3e610627cc9e",
    "status": "vendido",
    "reserved_at": "2026-10-06T15:03:31.365Z",
    "sold_at": "2026-10-06T15:03:31.771Z",
    "active": true
  }
}

Esa sola llamada hace el resto:

  • Cierra los avisos del auto en todos los portales conectados.
  • Cancela las pruebas de manejo futuras de ese auto.
  • El agente deja de ofrecerlo, y sale del lote público: GET /stock/{id} responde 404.

No borres un auto vendido. Con vendido, la venta queda en su historial y en las métricas.

7. Sale sin venderse

Un auto que vuelve a su dueño o que sacas de la venta por un tiempo:

curl -X PUT https://api.vitrinadev.com/api/v1/vehicles/944fd909-5f42-407e-80a4-f9aad09afb92 \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "active": false }'
{
  "data": {
    "id": "944fd909-5f42-407e-80a4-f9aad09afb92",
    "status": "disponible",
    "active": false
  }
}

Sale del lote público y sus avisos se pausan o se retiran. Con active: true vuelve, y los avisos pausados se reactivan.

8. Concilia una vez al día

Una llamada que falló deja las dos listas distintas. Una pasada nocturna lo corrige: recorre GET /vehicles en páginas de 100 y compara contra tu ERP.

curl "https://api.vitrinadev.com/api/v1/vehicles?limit=100&offset=0" \
  -H "Authorization: Bearer $VITRINA_KEY"
{
  "data": [
    { "id": "e13dd607-68e9-4777-8a36-c3d99088b1a7", "registration_number": "ZZBB46", "status": "disponible" }
  ],
  "meta": { "total": 64 }
}

Un auto activo en Vitrina que ya no está disponible en tu ERP recibe el paso 6 o el 7. Un auto de tu ERP sin id de Vitrina recibe el paso 2.

Publicar en los portales

Con el stock sincronizado, publicar no requiere código. Conecta tus cuentas una vez en la aplicación, en Automotora → Marketplaces. Después, desde Stock, seleccionas los autos y eliges Publicar. Lo que tu ERP cambie después (precio, fotos, vendido) llega solo a cada aviso.

Guía completa en Manual de automotora → Publicar en un portal.

Opcional: publicar desde tu ERP

Si prefieres que tu ERP decida dónde va cada auto, agrega publish_to al POST /vehicles o al PUT /vehicles/{id}, con el nombre del portal (chileautos, mercadolibre, yapo, linze):

curl -X PUT https://api.vitrinadev.com/api/v1/vehicles/0ea21e09-afb1-4df6-9e55-3e610627cc9e \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "publish_to": ["chileautos", "mercadolibre"] }'

Reintentar es seguro: un portal donde el auto ya está publicado responde already_published y no crea un segundo aviso. Los detalles y los errores de publish_to están en Subir tu stock sin cargar el mismo auto dos veces.

Con el stock al día, Mostrar tu stock en tu sitio web lo lleva a tu página, y Sacar la lista de interesados en un auto responde quién preguntó por cada unidad.

En esta página