API REST para Venta de Pólizas de Vehículos – Dominicana de Seguros
https://www.redbajasusa.com/segurosapi/api
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"
}
GET /health
// Respuesta:
{
"success": true,
"data": {
"status": "ok",
"timestamp": "2026-03-15 14:30:00",
"version": "1.0.0"
}
}
La API acepta peticiones de cualquier origen (Access-Control-Allow-Origin: *). Soporta los métodos GET, POST, PUT, DELETE y preflight OPTIONS.
Todos los endpoints (excepto /health y /vehicle-types) requieren autenticación mediante dos headers HTTP:
| Header | Descripción | Ejemplo |
|---|---|---|
X-API-Key | Identificador público de la clave API | disashop_kiosk_01 |
X-API-Secret | Secreto de la clave API | s3cr3t_v4lu3_here |
X-API-Secret en código del lado del cliente.
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
HTTP/1.1 401 Unauthorized
{
"success": false,
"error": "Invalid API credentials",
"timestamp": "..."
}
Cada API Key tiene un límite de 10,000 peticiones por día. Al superar el límite se retorna HTTP 429.
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.
transaction_id (UUID) es el identificador que se pasa en cada llamada subsiguiente.
POST /start-transactionRegistra la sesión de venta con cédula, placa y teléfono del cliente. Retorna el transaction_id.
POST /validate-dataVerifica que la cédula y placa existan en la base de datos MasterOne. Retorna el tipo de vehículo detectado.
POST /send-otpEnvía un código de 6 dígitos por SMS al teléfono registrado. El código expira en 10 minutos.
POST /validate-otpEl cliente ingresa el código recibido. Máximo 3 intentos fallidos.
GET /vehicle-versionsCarga 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.
GET /vehicle-detailCuando el usuario selecciona una versión, obtiene su cilindraje y los planes disponibles. El plan sugerido se resalta automáticamente por cilindraje.
POST /confirm-vehicle-versionGuarda la versión confirmada y el plan seleccionado. Estado pasa a version_confirmada.
POST /get-quoteLlama a DCS para calcular la prima exacta. Se puede incluir grúa y casa conductor como servicios adicionales. Retorna el monto_total actualizado.
POST /process-paymentRegistra el pago. Integrar con el sistema de cobro del kiosko (tarjeta, efectivo, etc.). Estado pasa a pago_procesado.
POST /emit-policyEmite la póliza en DCS, genera los PDFs (póliza + marbete) y envía el link de descarga por SMS al cliente.
Estados especiales: cancelada, error, vehiculo_no_soportado
/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.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
cedula | string | Req | Número de cédula dominicana (sin guiones) |
telefono | string | Req | Teléfono móvil (10 dígitos, ej: 8291234567) |
placa | string | Req | Placa 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"
}
}
transaction_id retornado debe almacenarse localmente; se usa en todos los pasos siguientes.| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
transaction_id | string | Req | UUID de la transacción |
cedula | string | Req | Cédula del titular |
placa | string | Req | Placa 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"
}
// 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"
}
}
/send-otp nuevamente para generar uno nuevo.| Campo | Tipo | Descripción |
|---|---|---|
transaction_id | string | UUID de la transacción |
codigo | string | Có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"
}
| Parámetro | Descripción |
|---|---|
transaction_id | UUID 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 }
]
}
}
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].
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.
| Parámetro | Descripción |
|---|---|
transaction_id | UUID de la transacción |
de_indice_dato | Có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)
]
}
}
sugerido: true indica el plan que mejor coincide; si solo hay un plan compatible, se marca sugerido automáticamente.
planes_disponibles es orientativo (del catálogo). El precio definitivo lo confirma /get-quote al consultar la prima real en DCS.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
transaction_id | string | Req | UUID de la transacción |
de_indice_dato | string | Req | Código de versión confirmado por el usuario (ej: 10|1050|20) |
cd_tipo_plan | integer | Req | ID 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"
}
}
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
transaction_id | string | Req | UUID de la transacción |
incluye_grua | boolean | Opc | Incluir servicio de grúa (default: false) |
incluye_casa_conductor | boolean | Opc | Incluir 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",
...
}
}
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.
// Request
{ "transaction_id": "550e8400-..." }
// Response
{
"success": true,
"data": {
"estado": "pago_procesado",
"mensaje": "Pago registrado correctamente"
}
}
// 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
}
}
documentos también se pueden mostrar en pantalla para descarga inmediata en el kiosco.
// 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",
...
}
}
| Parámetro | Requerido | Descripción |
|---|---|---|
transaction_id | Req | UUID de la transacción |
tipo | Opc | poliza (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"
X-API-Key / X-API-Secret) o como query parameters (api_key / api_secret).
| Parámetro | Descripción |
|---|---|
tipo_vehiculo | automovil | jeepeta | motocicleta |
transaction_id | UUID 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
}
]
}
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.
| Estado | Descripción | Próximo endpoint |
|---|---|---|
iniciada | Transacción creada | /validate-data |
datos_validados | Cédula y placa verificadas en MasterOne | /send-otp |
otp_enviado | Código SMS enviado al cliente | /validate-otp |
otp_validado | Identidad del cliente confirmada | /vehicle-versions |
version_confirmada | Versión del vehículo y plan seleccionados | /get-quote |
pago_procesado | Pago registrado | /emit-policy |
poliza_emitida | Póliza emitida en DCS | /download-document |
completada | Proceso finalizado completamente | — |
cancelada | Transacción cancelada manualmente | — |
error | Error no recuperable en el proceso | Iniciar nueva transacción |
vehiculo_no_soportado | El tipo de vehículo no tiene cobertura disponible | — |
error o vehiculo_no_soportado, se debe iniciar una nueva transacción desde /start-transaction.
| Código | Significado | Acción recomendada |
|---|---|---|
200 | Éxito | Continuar flujo |
400 | Parámetros incorrectos o faltantes | Revisar el body de la petición |
401 | Credenciales API inválidas | Verificar X-API-Key y X-API-Secret |
404 | Transacción no encontrada | Verificar transaction_id |
429 | Rate limit excedido | Esperar o contactar administrador |
500 | Error interno del servidor | Reintentar una vez; si persiste, registrar y notificar |
| Error | Causa 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 |
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);
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'];
| Endpoint | Timeout sugerido | Razón |
|---|---|---|
| Todos excepto /emit-policy | 15 segundos | Respuesta rápida esperada |
/get-quote | 30 segundos | Llamada externa a DCS para calcular prima |
/emit-policy | 60 segundos | Emisión + generación de PDF + SMS |
/emit-policy, consultar /transaction-status al reconectar. Si el estado es poliza_emitida, la póliza fue emitida exitosamente aunque no recibiste la respuesta.pago_procesado y la póliza no se emitió aún, se puede reintentar /emit-policy.transaction_id en sesión para poder recuperar el estado.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.
X-API-Secret no debe aparecer en logs, reportes de errores, ni en código front-end expuesto.apptest.dominicanadeseguros.com). Confirmar con el administrador la fecha de cambio al servidor de producción antes del go-live.
Para dudas técnicas, acceso a credenciales o reporte de incidentes, contactar al administrador del sistema de DISASHOP.