🛡️
Documentación Técnica
SegurosAPI

Guía de Integración para Kioscos
DisaShop

API REST para Venta de Pólizas de Vehículos – Dominicana de Seguros

Versión: 2.1 Fecha: Marzo 2026 Destinatario: Equipo de Desarrollo DisaShop Confidencial

Tabla de Contenido

  1. Información General
  2. Autenticación
  3. Flujo Completo de Venta (10 Pasos)
  4. Referencia de Endpoints
  5. Estados de la Transacción
  6. Manejo de Errores
  7. Ejemplos de Integración Completa
  8. Consideraciones de Implementación

1. Información General

URL Base

https://www.redbajasusa.com/segurosapi/api

Formato de Respuesta

Todas las respuestas son application/json con la siguiente estructura:

// Respuesta exitosa
{
  "success": true,
  "data": { ... },
  "timestamp": "2026-03-15 14:30:00"
}

// Respuesta de error
{
  "success": false,
  "error": "Descripción del error",
  "timestamp": "2026-03-15 14:30:00"
}

Health Check (sin autenticación)

GET /health

// Respuesta:
{
  "success": true,
  "data": {
    "status": "ok",
    "timestamp": "2026-03-15 14:30:00",
    "version": "1.0.0"
  }
}

CORS

La API acepta peticiones de cualquier origen (Access-Control-Allow-Origin: *). Soporta los métodos GET, POST, PUT, DELETE y preflight OPTIONS.

2. Autenticación

Todos los endpoints (excepto /health y /vehicle-types) requieren autenticación mediante dos headers HTTP:

HeaderDescripciónEjemplo
X-API-KeyIdentificador público de la clave APIdisashop_kiosk_01
X-API-SecretSecreto de la clave APIs3cr3t_v4lu3_here
⚠️ Importante: Las credenciales API son proporcionadas por el administrador del sistema. Nunca exponer el X-API-Secret en código del lado del cliente.

Ejemplo de Headers HTTP

POST /segurosapi/api/start-transaction HTTP/1.1
Host: www.redbajasusa.com
Content-Type: application/json
X-API-Key: disashop_kiosk_01
X-API-Secret: tu_secreto_aqui

Error de Autenticación

HTTP/1.1 401 Unauthorized
{
  "success": false,
  "error": "Invalid API credentials",
  "timestamp": "..."
}

Rate Limiting

Cada API Key tiene un límite de 10,000 peticiones por día. Al superar el límite se retorna HTTP 429.

3. Flujo Completo de Venta

La venta de una póliza sigue un flujo secuencial de 10 pasos obligatorios. Cada paso valida el estado de la transacción antes de ejecutarse.

ℹ️ Concepto clave: Una transacción es el registro de sesión de venta. Se crea al inicio y su transaction_id (UUID) es el identificador que se pasa en cada llamada subsiguiente.
1

Iniciar Transacción — POST /start-transaction

Registra la sesión de venta con cédula, placa y teléfono del cliente. Retorna el transaction_id.

2

Validar Datos — POST /validate-data

Verifica que la cédula y placa existan en la base de datos MasterOne. Retorna el tipo de vehículo detectado.

3

Enviar OTP — POST /send-otp

Envía un código de 6 dígitos por SMS al teléfono registrado. El código expira en 10 minutos.

4

Validar OTP — POST /validate-otp

El cliente ingresa el código recibido. Máximo 3 intentos fallidos.

5

Obtener Versiones del Vehículo — GET /vehicle-versions

Carga la lista de variantes (versiones) disponibles en DCS para la marca/modelo del vehículo. Una versión es marcada como sugerida por el algoritmo. Si el vehículo solo tiene una versión, el campo version_unica: true indica que se debe omitir la pantalla de selección y avanzar directamente al paso 6.

6

Obtener Detalle de Versión + Planes — GET /vehicle-detail

Cuando el usuario selecciona una versión, obtiene su cilindraje y los planes disponibles. El plan sugerido se resalta automáticamente por cilindraje.

7

Confirmar Versión y Plan — POST /confirm-vehicle-version

Guarda la versión confirmada y el plan seleccionado. Estado pasa a version_confirmada.

8

Obtener Cotización — POST /get-quote

Llama a DCS para calcular la prima exacta. Se puede incluir grúa y casa conductor como servicios adicionales. Retorna el monto_total actualizado.

9

Procesar Pago — POST /process-payment

Registra el pago. Integrar con el sistema de cobro del kiosko (tarjeta, efectivo, etc.). Estado pasa a pago_procesado.

10

Emitir Póliza — POST /emit-policy

Emite la póliza en DCS, genera los PDFs (póliza + marbete) y envía el link de descarga por SMS al cliente.

Diagrama de Estados

iniciada
datos_validados
otp_enviado
otp_validado
version_confirmada
pago_procesado
poliza_emitida
completada

Estados especiales: cancelada, error, vehiculo_no_soportado

ℹ️ Atajo automático — versión única: Cuando /vehicle-versions retorna version_unica: true, el kiosco debe saltar la pantalla de selección de versión (paso 5→6) y llamar directamente a /vehicle-detail. La transacción avanza al estado version_confirmada de la misma manera.

4. Referencia de Endpoints

POST /start-transaction Iniciar transacción de venta

Request Body

CampoTipoRequeridoDescripción
cedulastringReqNúmero de cédula dominicana (sin guiones)
telefonostringReqTeléfono móvil (10 dígitos, ej: 8291234567)
placastringReqPlaca del vehículo
// Request
{
  "cedula": "40212345678",
  "telefono": "8291234567",
  "placa": "A123456"
}

// Response 200
{
  "success": true,
  "data": {
    "transaction_id": "550e8400-e29b-41d4-a716-446655440000",
    "estado": "iniciada",
    "created_at": "2026-03-15 10:00:00"
  }
}
El transaction_id retornado debe almacenarse localmente; se usa en todos los pasos siguientes.
POST /validate-data Validar cédula y placa en base de datos

Request Body

CampoTipoRequeridoDescripción
transaction_idstringReqUUID de la transacción
cedulastringReqCédula del titular
placastringReqPlaca del vehículo
// Request
{
  "transaction_id": "550e8400-...",
  "cedula": "40212345678",
  "placa": "A123456"
}

// Response 200
{
  "success": true,
  "data": {
    "cedula_valida": true,
    "placa_valida": true,
    "tipo_vehiculo": "automovil",        // "automovil" | "jeepeta" | "motocicleta"
    "tipo_vehiculo_raw": "AUTOMOVIL PRIVADO",  // Valor original de MasterOne
    "nombre_titular": "JUAN PEREZ",
    "marca": "TOYOTA",
    "modelo": "COROLLA",
    "ano": "2020",
    "estado": "datos_validados"
  }
}

// Error: vehículo no soportado
{
  "success": false,
  "error": "Tipo de vehículo no soportado para seguro: CAMION PESADO"
}
POST /send-otp Enviar código OTP por SMS
// Request
{ "transaction_id": "550e8400-..." }

// Response 200
{
  "success": true,
  "data": {
    "mensaje": "Código OTP enviado por SMS",
    "expira_en": 600,          // segundos (10 minutos)
    "intentos_restantes": 3,
    "estado": "otp_enviado"
  }
}
El código OTP expira a los 10 minutos. Si expira, llamar a /send-otp nuevamente para generar uno nuevo.
POST /validate-otp Verificar código OTP ingresado por el cliente
CampoTipoDescripción
transaction_idstringUUID de la transacción
codigostringCódigo de 6 dígitos ingresado por el cliente
// Request
{
  "transaction_id": "550e8400-...",
  "codigo": "483920"
}

// Response exitosa
{
  "success": true,
  "data": {
    "valido": true,
    "estado": "otp_validado"
  }
}

// Error: código incorrecto
{
  "success": false,
  "error": "Código OTP incorrecto. Intentos restantes: 2"
}
GET /vehicle-versions Nuevo Obtener variantes del vehículo disponibles en DCS

Query Parameters

ParámetroDescripción
transaction_idUUID de la transacción (estado debe ser otp_validado o superior)
// Request
GET /vehicle-versions?transaction_id=550e8400-...

// Response — vehículo con múltiples versiones
{
  "success": true,
  "data": {
    "marca": "TOYOTA",
    "modelo": "COROLLA",
    "total_versiones": 4,
    "version_unica": false,
    "sugerido": "10|1050|20",
    "versiones": [
      {
        "deIndiceDato": "10|1050|18",
        "descripcion": "COROLLA 1.6L 4CIL SEDAN",
        "sugerido": false
      },
      {
        "deIndiceDato": "10|1050|20",
        "descripcion": "COROLLA 1.8L 4CIL SEDAN",
        "sugerido": true        // Versión sugerida por el algoritmo
      },
      {
        "deIndiceDato": "10|1050|22",
        "descripcion": "COROLLA 2.0L 4CIL SEDAN",
        "sugerido": false
      }
    ]
  }
}

// Response — versión única (saltar pantalla de selección)
{
  "success": true,
  "data": {
    "marca": "HONDA",
    "modelo": "PCX 150",
    "total_versiones": 1,
    "version_unica": true,      // ← Solo hay una versión; ya fue guardada automáticamente
    "sugerido": "45|320|1",
    "versiones": [
      { "deIndiceDato": "45|320|1", "descripcion": "PCX 150CC", "sugerido": true }
    ]
  }
}
ℹ️ Lógica de versión única: Cuando version_unica === true, la API ya guardó el deIndiceDato en la transacción. El kiosco debe saltar la pantalla de selección y llamar directamente a /vehicle-detail con el deIndiceDato de versiones[0].
ℹ️ UX múltiples versiones: Cuando version_unica === false, mostrar la lista al usuario con la versión sugerida destacada visualmente. El campo deIndiceDato es el código que se usará en los pasos siguientes.
GET /vehicle-detail Nuevo Obtener especificaciones y planes disponibles para una versión

Query Parameters

ParámetroDescripción
transaction_idUUID de la transacción
de_indice_datoCódigo de versión DCS (ej: 10|1050|20)
// Request
GET /vehicle-detail?transaction_id=550e8400-...&de_indice_dato=10|1050|20

// Response
{
  "success": true,
  "data": {
    "detalle_vehiculo": {
      "cilindraje": "4 CILINDROS",   // Valor textual de DCS
      "tonelaje": 0,
      "tipoVehiculo": "AUTOMÓVIL",
      "claseVehiculo": "SEDAN"
    },
    "tipo_vehiculo": "automovil",     // Tipo local mapeado
    "planes_disponibles": [
      // Solo se retornan planes cuyo rango de cilindraje es compatible con el vehículo
      {
        "cd_tipo_plan": 5,
        "descripcion": "Sedan 4 Cil - 12 meses",
        "tipo_vehiculo": "automovil",
        "vigencia_meses": 12,
        "tipo_cobertura": "COMPLETO",
        "precio": 8500.00,
        "cilindraje_min": 1,          // Rango del plan (cilindros o CC para motos)
        "cilindraje_max": 4,
        "sugerido": true              // Plan recomendado por cilindraje
      }
      // Planes de 6 cil y más de 6 cil NO aparecen (incompatibles con este vehículo)
    ]
  }
}
✅ Planes pre-filtrados por cilindraje: La API retorna únicamente los planes compatibles con el cilindraje detectado. No es necesario filtrar del lado del cliente. El campo sugerido: true indica el plan que mejor coincide; si solo hay un plan compatible, se marca sugerido automáticamente.
El precio en planes_disponibles es orientativo (del catálogo). El precio definitivo lo confirma /get-quote al consultar la prima real en DCS.
POST /confirm-vehicle-version Nuevo Confirmar versión del vehículo y plan seleccionado
CampoTipoRequeridoDescripción
transaction_idstringReqUUID de la transacción
de_indice_datostringReqCódigo de versión confirmado por el usuario (ej: 10|1050|20)
cd_tipo_planintegerReqID del plan seleccionado
// Request
{
  "transaction_id": "550e8400-...",
  "de_indice_dato": "10|1050|20",
  "cd_tipo_plan": 5
}

// Response
{
  "success": true,
  "data": {
    "de_indice_dato": "10|1050|20",
    "plan": {
      "cd_tipo_plan": 5,
      "descripcion": "Sedan 4 Cil - 12 meses",
      "precio": 8500.00
    },
    "detalle_vehiculo": {
      "cilindraje": 4,
      "tipoVehiculo": "AUTOMÓVIL"
    },
    "estado": "version_confirmada"
  }
}
POST /get-quote Obtener cotización final con precio definitivo de DCS
CampoTipoRequeridoDescripción
transaction_idstringReqUUID de la transacción
incluye_gruabooleanOpcIncluir servicio de grúa (default: false)
incluye_casa_conductorbooleanOpcIncluir casa para el conductor (default: false)
// Request
{
  "transaction_id": "550e8400-...",
  "incluye_grua": true,
  "incluye_casa_conductor": false
}

// Response — retorna todos los campos de la transacción
{
  "success": true,
  "data": {
    "id": "550e8400-...",
    "estado": "version_confirmada",
    "monto_total": 8750.50,      // Prima real calculada por DCS
    "plan_nombre": "Sedan 4 Cil - 12 meses",
    "incluye_grua": 1,
    "incluye_casa_conductor": 0,
    "numero_cotizacion": "COT-2026-00123",
    ...
  }
}
⚠️ Precio final: El monto_total retornado por este endpoint es el precio exacto y definitivo calculado por DCS según las especificaciones del vehículo. Mostrarlo siempre al cliente antes de procesar el pago.
POST /process-payment Registrar el pago del cliente
// Request
{ "transaction_id": "550e8400-..." }

// Response
{
  "success": true,
  "data": {
    "estado": "pago_procesado",
    "mensaje": "Pago registrado correctamente"
  }
}
Integración de pago: Este endpoint marca la transacción como pagada en el sistema. El kiosco debe procesar el cobro real (tarjeta POS, efectivo, etc.) antes de llamar a este endpoint. Si el cobro falla en el hardware, NO llamar este endpoint.
POST /emit-policy Emitir póliza en DCS y generar documentos
// Request
{ "transaction_id": "550e8400-..." }

// Response (puede tardar hasta 30 segundos)
{
  "success": true,
  "data": {
    "estado": "poliza_emitida",
    "numero_poliza": "1-600-45409-1",
    "numero_certificado": "1",
    "numero_endoso": "0",
    "vigencia_desde": "2026-03-15",
    "vigencia_hasta": "2027-03-15",
    "documentos": {
      "poliza_url": "https://www.redbajasusa.com/segurosapi/download.php?token=abc123&tipo=poliza",
      "marbete_url": "https://www.redbajasusa.com/segurosapi/download.php?token=abc123&tipo=marbete"
    },
    "sms_enviado": true
  }
}
Después de la emisión exitosa, el cliente recibe automáticamente un SMS con el link para descargar sus documentos. Las URLs de documentos también se pueden mostrar en pantalla para descarga inmediata en el kiosco.
Este endpoint puede tardar hasta 30 segundos. Configurar el timeout del cliente HTTP a mínimo 60 segundos.
GET /transaction-status Consultar estado actual de una transacción
// Request
GET /transaction-status?transaction_id=550e8400-...

// Response — retorna todos los campos de la transacción
{
  "success": true,
  "data": {
    "id": "550e8400-...",
    "estado": "poliza_emitida",
    "numero_poliza": "1-600-45409-1",
    "monto_total": 8750.50,
    "cedula": "40212345678",
    "placa": "A123456",
    "created_at": "2026-03-15 10:00:00",
    ...
  }
}
GET /download-document Descargar póliza o marbete en PDF

Query Parameters

ParámetroRequeridoDescripción
transaction_idReqUUID de la transacción
tipoOpcpoliza (default) o marbete
// Descargar póliza
GET /download-document?transaction_id=550e8400-...&tipo=poliza

// Descargar marbete (sticker)
GET /download-document?transaction_id=550e8400-...&tipo=marbete

// Respuesta: binario PDF con headers:
// Content-Type: application/pdf
// Content-Disposition: attachment; filename="poliza_1-600-45409-1.pdf"
Autenticación para este endpoint: puede enviarse en headers (X-API-Key / X-API-Secret) o como query parameters (api_key / api_secret).
GET /products Listar planes de seguro disponibles por tipo de vehículo

Query Parameters (usar uno de los dos)

ParámetroDescripción
tipo_vehiculoautomovil | jeepeta | motocicleta
transaction_idUUID de transacción (el tipo se detecta automáticamente)
GET /products?tipo_vehiculo=automovil

// Response
{
  "success": true,
  "data": [
    {
      "id": 5,
      "nombre": "Sedan 4 Cil - 12 meses",
      "tipo_vehiculo": "automovil",
      "vigencia_meses": 12,
      "tipo_cobertura": "COMPLETO",
      "precio": 8500.00,
      "cilindraje_min": 1,      // Rango mínimo de cilindros/CC (null = sin límite)
      "cilindraje_max": 4       // Rango máximo de cilindros/CC (null = sin límite)
    },
    {
      "id": 21,
      "nombre": "Sedan 6 Cil - 12 meses",
      "tipo_vehiculo": "automovil",
      "vigencia_meses": 12,
      "tipo_cobertura": "COMPLETO",
      "precio": 10200.00,
      "cilindraje_min": 5,
      "cilindraje_max": 6
    }
  ]
}
Este endpoint retorna todos los planes del tipo indicado (sin filtrar por cilindraje). Si tienes el cilindraje del vehículo, usa los campos cilindraje_min/cilindraje_max para resaltar el plan correcto. Para mostrar únicamente los planes compatibles con un vehículo específico, usa /vehicle-detail que sí aplica el filtro automáticamente.

5. Estados de la Transacción

EstadoDescripciónPróximo endpoint
iniciadaTransacción creada/validate-data
datos_validadosCédula y placa verificadas en MasterOne/send-otp
otp_enviadoCódigo SMS enviado al cliente/validate-otp
otp_validadoIdentidad del cliente confirmada/vehicle-versions
version_confirmadaVersión del vehículo y plan seleccionados/get-quote
pago_procesadoPago registrado/emit-policy
poliza_emitidaPóliza emitida en DCS/download-document
completadaProceso finalizado completamente
canceladaTransacción cancelada manualmente
errorError no recuperable en el procesoIniciar nueva transacción
vehiculo_no_soportadoEl tipo de vehículo no tiene cobertura disponible
Si una transacción queda en estado error o vehiculo_no_soportado, se debe iniciar una nueva transacción desde /start-transaction.

6. Manejo de Errores

Códigos HTTP

CódigoSignificadoAcción recomendada
200ÉxitoContinuar flujo
400Parámetros incorrectos o faltantesRevisar el body de la petición
401Credenciales API inválidasVerificar X-API-Key y X-API-Secret
404Transacción no encontradaVerificar transaction_id
429Rate limit excedidoEsperar o contactar administrador
500Error interno del servidorReintentar una vez; si persiste, registrar y notificar

Errores Comunes

ErrorCausa probable
"Cédula no encontrada en el sistema"La cédula no está registrada en MasterOne
"Placa no encontrada o no pertenece a esta cédula"Datos incorrectos o vehículo no registrado
"Código OTP incorrecto"El usuario ingresó mal el código
"OTP expirado"Pasaron más de 10 minutos; llamar /send-otp otra vez
"Tipo de vehículo no soportado"El vehículo es de un tipo sin cobertura (camión pesado, etc.)
"Estado de transacción inválido"Se llamó un endpoint fuera de orden; verificar el flujo

7. Ejemplos de Integración Completa

JavaScript / Fetch API

const API_BASE = 'https://www.redbajasusa.com/segurosapi/api';
const HEADERS = {
  'Content-Type': 'application/json',
  'X-API-Key': 'TU_API_KEY',
  'X-API-Secret': 'TU_API_SECRET'
};

// Helper genérico
async function apiCall(method, path, body = null) {
  const opts = { method, headers: HEADERS };
  if (body) opts.body = JSON.stringify(body);
  const res = await fetch(API_BASE + path, opts);
  const json = await res.json();
  if (!json.success) throw new Error(json.error);
  return json.data;
}

// ─── Flujo completo ───────────────────────────────────────

// Paso 1: Iniciar transacción
const txData = await apiCall('POST', '/start-transaction', {
  cedula: '40212345678',
  telefono: '8291234567',
  placa: 'A123456'
});
const txId = txData.transaction_id;

// Paso 2: Validar datos
const validated = await apiCall('POST', '/validate-data', {
  transaction_id: txId,
  cedula: '40212345678',
  placa: 'A123456'
});
console.log('Tipo vehículo:', validated.tipo_vehiculo); // "automovil"

// Paso 3 & 4: OTP
await apiCall('POST', '/send-otp', { transaction_id: txId });
const codigoCliente = await pedirCodigoAlUsuario(); // UI del kiosco
await apiCall('POST', '/validate-otp', {
  transaction_id: txId,
  codigo: codigoCliente
});

// Paso 5: Versiones del vehículo
const versData = await apiCall('GET', `/vehicle-versions?transaction_id=${txId}`);
const versionElegida = await mostrarVersionesAlUsuario(versData.versiones);

// Paso 6: Detalle + planes
const detail = await apiCall('GET',
  `/vehicle-detail?transaction_id=${txId}&de_indice_dato=${encodeURIComponent(versionElegida)}`
);
const planElegido = await mostrarPlanesAlUsuario(detail.planes_disponibles);

// Paso 7: Confirmar versión
await apiCall('POST', '/confirm-vehicle-version', {
  transaction_id: txId,
  de_indice_dato: versionElegida,
  cd_tipo_plan: planElegido.cd_tipo_plan
});

// Paso 8: Cotización (con grúa)
const quote = await apiCall('POST', '/get-quote', {
  transaction_id: txId,
  incluye_grua: true,
  incluye_casa_conductor: false
});
console.log('Precio final:', quote.monto_total, 'RD$');

// Paso 9: Pago (después de cobrar al cliente)
await cobrarAlCliente(quote.monto_total); // Tu lógica de pago
await apiCall('POST', '/process-payment', { transaction_id: txId });

// Paso 10: Emitir póliza
const policy = await apiCall('POST', '/emit-policy', { transaction_id: txId });
console.log('Póliza:', policy.numero_poliza);
console.log('Descargar:', policy.documentos.poliza_url);

PHP / cURL

function apiCall($method, $endpoint, $data = null) {
    $url  = 'https://www.redbajasusa.com/segurosapi/api' . $endpoint;
    $ch   = curl_init($url);
    $hdrs = [
        'Content-Type: application/json',
        'X-API-Key: TU_API_KEY',
        'X-API-Secret: TU_API_SECRET'
    ];

    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST  => $method,
        CURLOPT_HTTPHEADER     => $hdrs,
        CURLOPT_TIMEOUT        => 60,
    ]);

    if ($data) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    }

    $resp = json_decode(curl_exec($ch), true);
    curl_close($ch);

    if (!$resp['success']) {
        throw new Exception($resp['error']);
    }
    return $resp['data'];
}

// Paso 1
$tx = apiCall('POST', '/start-transaction', [
    'cedula'   => '40212345678',
    'telefono' => '8291234567',
    'placa'    => 'A123456'
]);
$txId = $tx['transaction_id'];

8. Consideraciones de Implementación

Timeouts Recomendados

EndpointTimeout sugeridoRazón
Todos excepto /emit-policy15 segundosRespuesta rápida esperada
/get-quote30 segundosLlamada externa a DCS para calcular prima
/emit-policy60 segundosEmisión + generación de PDF + SMS

Manejo de Interrupciones en el Kiosco

Sesión de Kiosco

Selección de Versión del Vehículo

El paso de selección de versión fue agregado para garantizar que el precio cotizado coincida exactamente con el precio final emitido. El algoritmo hace su mejor suposición (marcada como sugerido: true), pero el usuario puede cambiarla si la descripción no coincide con su vehículo.

Seguridad

Ambiente de Pruebas

El backend actualmente apunta al servidor de pruebas de DCS (apptest.dominicanadeseguros.com). Confirmar con el administrador la fecha de cambio al servidor de producción antes del go-live.

Soporte

Para dudas técnicas, acceso a credenciales o reporte de incidentes, contactar al administrador del sistema de DISASHOP.

SegurosAPI v2.0 — Documentación Técnica para DisaShop — Marzo 2026 — Confidencial