API para desarrolladores

API de Repromatronic para talleres y revendedores

Envía ficheros ECU, consulta el estado, descarga el fichero modificado y recibe avisos en tu propio programa de gestión. Misma cola y mismos técnicos que el panel: el fichero lo modifica y lo revisa un ingeniero.

Cómo funciona

1. Permiso de subida

POST /uploads devuelve una URL firmada. Subes el fichero original con un PUT directo (hasta 50 MB).

2. Crear el pedido

POST /orders con los datos del vehículo, la centralita, la herramienta y los servicios. Los créditos se descuentan al entregar, como en el panel.

3. Aviso y descarga

Cuando el técnico entrega, recibes el webhook order.completed y descargas con GET /orders/{id}/file. Si necesita un dato, llega order.needs_info.

Planes

Precio al mes sin IVA. Los ficheros se pagan con los créditos de la cuenta, al mismo precio que en el panel. Sin permanencia: se da de baja desde el panel.

API Taller

Para integrar tu propio programa de gestión con el servicio de ficheros.

59 €€/mes

  • ✓ Hasta 50 ficheros al mes por API
  • ✓ 1 clave de producción + claves de pruebas
  • ✓ 2 webhooks
  • ✓ 2.000 llamadas al día
  • ✓ Catálogo de vehículos y servicios
  • ✓ Soporte por email
Contratar

API Pro

Para talleres grandes y revendedores con volumen.

149 €€/mes

  • ✓ Hasta 250 ficheros al mes por API
  • ✓ 5 claves de producción + claves de pruebas
  • ✓ 10 webhooks
  • ✓ 10.000 llamadas al día
  • ✓ Catálogo de vehículos y servicios
  • ✓ Soporte prioritario
Contratar

API Empresa

Tarifa a medida para grandes consumos y redes de talleres.

desde 349 €€/mes

  • ✓ Ficheros sin límite
  • ✓ Claves y webhooks sin límite
  • ✓ Varias sucursales bajo una cuenta
  • ✓ Acuerdo de nivel de servicio
  • ✓ Integración asistida
  • ✓ Soporte prioritario
Pedir oferta

Las claves de pruebas (rp_test_) están incluidas en todos los planes y no crean pedidos ni gastan créditos.

Autenticación

Cada petición lleva la cabecera Authorization: Bearer con una clave creada en Panel › API. Las claves rp_live_ crean pedidos reales; las rp_test_ validan todo pero no crean nada. Trata la clave como una contraseña: si se filtra, revócala en el panel.

Authorization: Bearer rp_live_0123456789abcdef0123456789abcdef

Inicio rápido

# 1) Upload permission / Permiso de subida
curl -X POST https://app.repromatronic.es/api/v1/uploads \
  -H "Authorization: Bearer rp_live_XXXXXXXX" \
  -H "Content-Type: application/json" \
  -d '{"filename":"original.bin","size":1048576}'
# → { "file_path": "...", "upload_url": "https://...", "method": "PUT" }

curl -X PUT "<upload_url>" -H "Content-Type: application/octet-stream" \
  -H "x-upsert: false" --data-binary @original.bin

# 2) Create the order / Crear el pedido
curl -X POST https://app.repromatronic.es/api/v1/orders \
  -H "Authorization: Bearer rp_live_XXXXXXXX" \
  -H "Content-Type: application/json" \
  -d '{
    "file_path": "<file_path>",
    "vehicle_category_id": "<id from /services>",
    "plate": "1234ABC", "make": "Audi", "model": "A4", "engine": "2.0 TDI 150 CV",
    "year": 2019, "power_hp": 150, "km": 85000, "gearbox": "manual",
    "tool": "KESS3", "ecu": "Bosch EDC17C74",
    "services": ["<service_id>"], "external_ref": "OT-2026-0412"
  }'
# → 201 { "order": { "id": "…", "status": "queued", "credits": 2, … } }

# 3) When order.completed arrives / Cuando llega order.completed
curl https://app.repromatronic.es/api/v1/orders/<id>/file \
  -H "Authorization: Bearer rp_live_XXXXXXXX"
# → { "url": "https://…", "filename": "…", "expires_in": 3600 }

Referencia de endpoints

Base: https://app.repromatronic.es/api/v1 · Todas las respuestas son JSON · Fechas en ISO 8601 (UTC)

MétodoRutaQué hace
GET/meCuenta, saldo de créditos, plan y consumo del mes.
GET/servicesCategorías de vehículo, servicios con su coste en créditos, complementos e incompatibilidades.
GET/vehicles/types · /makes?type= · /models?make= · /generations?model= · /engines?generation= · /engines/{id} · /search?q=Catálogo de vehículos: potencia y par de serie, etapas, métodos y herramientas de lectura.
POST/uploadsPermiso de subida firmado para el fichero original (paso 1).
POST/ordersCrea el pedido (paso 2). JSON con file_path, o multipart con `file` si pesa menos de 4 MB. `external_ref` evita duplicados.
GET/ordersLista con filtros: status, since, plate, external_ref; paginación page/limit.
GET/orders/{id}Detalle y estado del pedido.
GET/orders/{id}/fileFichero modificado: URL firmada de 1 hora (o 302 con ?redirect=1).
GET/orders/{id}/originalTu fichero original.
GET · POST/orders/{id}/messagesConversación con el técnico: leer y escribir.
POST/orders/{id}/revisionPedir revisión de un fichero entregado (gratis, 30 días).
POST/orders/{id}/cancelCancelar un pedido que sigue en cola.
GET · POST · PATCH · DELETE/webhooks · /webhooks/{id} · /webhooks/{id}/testGestionar tus webhooks y enviar un evento de prueba.
GET/plans · /openapi.jsonPúblicos, sin clave.

Campos de POST /orders

file_pathRuta devuelta por /uploads (obligatorio si no envías `file` por multipart).
vehicle_category_idId de categoría de GET /services (turismo, camión, agrícola…).
plate, make, model, engine, yearMatrícula, marca, modelo, motor (p. ej. «2.0 TDI 150 CV») y año.
power_hp, power_kw, km, gearboxPotencia de serie en CV (kW opcional), kilómetros y cambio: manual o automatic.
tool, ecuHerramienta de lectura (KESS3, Flex, Autotuner, bFlash…) y centralita (p. ej. «Bosch EDC17C46»).
services[], addons[]Ids de GET /services. Al menos un servicio; los complementos van con su servicio.
read_method, read_type, vin, dtc_codes[], notesOpcionales: obd/banco/boot/bdm/jtag, completa/parcial, bastidor, códigos de avería y notas para el técnico.
external_refTu referencia (orden de trabajo). Si repites la misma, no se crea un segundo pedido.

Estados del pedido

queuedEn cola: recibido, pendiente de que un técnico lo coja.
pendingPendiente de información: el técnico necesita un dato (pending_reason).
processingEn proceso.
completedCompletado: el fichero modificado está disponible.
revisionEn revisión a petición del taller.
cancelled / refundedCancelado / abonado (créditos devueltos).

Webhooks

Registra una URL https y los eventos que te interesan (o ninguno para recibirlos todos). Cada envío es un POST JSON firmado. Responde 2xx en menos de 8 segundos; si no, se reintenta hasta 7 veces con esperas crecientes (1 min → 12 h).

Eventos

order.createdPedido recibido.
order.processingUn técnico se ha puesto con él.
order.needs_infoEl técnico necesita un dato (data.reason).
order.completedFichero modificado listo: descárgalo con /orders/{id}/file.
order.revisionRevisión aceptada.
order.messageMensaje del técnico (data.message).
order.cancelled · order.refundedCancelado o abonado.

Verificar la firma

Cabecera X-Repromatronic-Signature: t=<unix>,v1=<hex>. v1 es el HMAC-SHA256 del texto `${t}.${cuerpo}` con el secreto del webhook sin el prefijo rpwh_. Rechaza firmas con más de 5 minutos de antigüedad.

// Node.js
const crypto = require("crypto");
function verify(secret, header, rawBody) {
  const m = /t=(\d+),v1=([0-9a-f]+)/.exec(header || "");
  if (!m) return false;
  if (Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return false;
  const expected = crypto.createHmac("sha256", secret.replace(/^rpwh_/, ""))
    .update(`${m[1]}.${rawBody}`).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(m[2], "hex"));
}
<?php // PHP
function verify(string $secret, string $header, string $rawBody): bool {
  if (!preg_match('/t=(\d+),v1=([0-9a-f]+)/', $header, $m)) return false;
  if (abs(time() - (int)$m[1]) > 300) return false;
  $expected = hash_hmac('sha256', $m[1] . '.' . $rawBody, preg_replace('/^rpwh_/', '', $secret));
  return hash_equals($expected, $m[2]);
}
{
  "id": "evt_9f2c…",
  "type": "order.completed",
  "created_at": "2026-10-11T16:20:00.000Z",
  "data": { "order": { "id": "…", "reference": "A1B2C3D4", "status": "completed", "external_ref": "OT-2026-0412", "links": { "file": "/api/v1/orders/…/file" } } }
}

Errores y límites

Los errores devuelven { error: { code, message, fields? } }. Límites: 120 llamadas por minuto por clave y las llamadas diarias y ficheros mensuales del plan. Al superarlos, 429 (con retry_after) o 402 (cupo del plan o créditos insuficientes).

401 unauthorizedClave ausente, no válida o revocada.
402 subscription_required · plan_quota_exceeded · insufficient_credits_reservedSin plan, cupo mensual agotado o créditos insuficientes.
409 not_ready · not_cancellable · window_expiredLa acción no procede en el estado actual.
422 validation_errorCampos no válidos: mira error.fields.
429 rate_limited · daily_limitDemasiadas llamadas.

Modo de pruebas

Con una clave rp_test_ todas las lecturas funcionan con tus datos reales, y las escrituras (pedidos, mensajes, revisiones, cancelaciones) se validan y devuelven la respuesta que verías en producción, sin crear nada ni gastar créditos. Para probar la entrega de webhooks usa POST /webhooks/{id}/test.

Preguntas frecuentes

¿Cuánto cuesta cada fichero por API?

Lo mismo que en el panel: se descuenta de tus créditos al entregarlo. El plan solo cubre el acceso a la API.

¿Mi programa de gestión tiene que ser especial?

No. Cualquier programa que pueda hacer peticiones HTTPS (PHP, .NET, Node, Python, Java…) vale. Si usas un programa comercial, pásale esta página a su proveedor.

¿Puedo revender el servicio con mi marca?

Sí: el plan Empresa admite varias sucursales bajo una cuenta y el certificado de reprogramación sale con tu marca si la activas en el panel.

¿Qué horario tiene?

La API responde 24 h. Los ficheros se procesan en el horario del equipo técnico, todos los días de 8:00 a 22:00 (hora peninsular).

¿Dónde pido ayuda?

Escribe a info@repromatronic.es con la hora de la llamada y la ruta, o desde los tickets del panel.