Empezar
Entornos de producción y pruebas
Diferencias entre producción y el entorno de pruebas (sandbox), prefijos de las claves, la cabecera X-Serad-Environment, por qué los identificadores cambian entre entornos y la lista de comprobación para pasar a producción.
Última revisión: 1 de octubre de 2026
Dos entornos separados
La API existe en dos entornos completamente independientes: dos despliegues distintos de la misma API, cada uno con su propia base de datos. Lo que haces en uno no aparece nunca en el otro.
| Producción | Pruebas (sandbox) | |
|---|---|---|
| URL base | https://api.saludenruta.es/api/integrations/v1 | https://sandbox-api.saludenruta.es/api/integrations/v1 |
| Claves | srd_live_<prefijo>_<secreto> | srd_test_<prefijo>_<secreto> |
| Cabecera en todas las respuestas | X-Serad-Environment: production | X-Serad-Environment: sandbox |
| Datos | Reales | Ficticios. Nunca se mezclan: son bases de datos distintas |
| Quién mueve los avisos | La centralita y las unidades de Salud en Ruta | Un simulador |
| Correo, notificaciones, receta, avisos al personal | Reales | Desactivados |
| Facturación | Real | No se factura nada |
| Coste | Según tu contrato | Gratuito |
Las rutas, los campos, los errores y los webhooks son exactamente iguales en los dos entornos: el código que funciona contra el sandbox funciona contra producción cambiando solo la URL base, la clave y el secreto del webhook.
La clave decide el entorno
Cada clave pertenece a un entorno. Si usas una clave contra el entorno equivocado, la API responde 401 con el tipo /errors/provider-api/wrong-environment y un mensaje que lo dice claramente («Estás usando una clave de pruebas contra producción»), para que no lo confundas con una clave mal copiada:
{
"type": "/errors/provider-api/wrong-environment",
"title": "Clave de otro entorno",
"status": 401,
"detail": "Estás usando una clave de pruebas contra producción",
"instance": "/api/integrations/v1/visits",
"timestamp": "2026-10-01T09:10:00.000Z"
}La cabecera X-Serad-Environment
Todas las respuestas de la API, también las de error, llevan la cabecera X-Serad-Environment con el valor production o sandbox. Úsala para:
- Registrar en tus logs contra qué entorno se hizo cada llamada.
- Proteger tus pruebas automáticas: si un test de integración recibe
production, que falle inmediatamente. - Mostrarlo en tus pantallas internas («Conectado a: pruebas») para que nadie dé de alta avisos reales creyendo que son de prueba, ni al revés.
curl -sI "https://sandbox-api.saludenruta.es/api/integrations/v1/catalog" -H "X-Api-Key: $SERAD_API_KEY" | grep -i x-serad-environment
# X-Serad-Environment: sandboxLos identificadores cambian entre entornos
Los id de los avisos, de los tipos de servicio y de las aseguradoras no coinciden entre producción y sandbox: son bases de datos distintas, y cada una genera los suyos. Un serviceTypeId copiado del sandbox no existe en producción.
Por eso:
- Usa siempre códigos, no ids, para los datos de catálogo. Al crear un aviso, envía
serviceTypeCode(por ejemplo,GENERAL_CONSULTATION) en vez deserviceTypeId. Los códigos son los mismos en los dos entornos. - Lee el catálogo de cada entorno al arrancar tu integración (o una vez al día) y guárdalo en caché, en lugar de escribir ids en tu código o en tu configuración.
- Guarda los
idde los avisos junto al entorno en tu base de datos, o en tablas separadas. Un aviso del sandbox no se puede consultar en producción. - Relaciona los avisos con tu sistema por tu nº de expediente (
externalRef), que es tuyo y no depende del entorno.
Lista de comprobación para pasar a producción
Antes de pedir tu clave de producción, comprueba en el sandbox que tu integración cumple todo esto. Lo repasaremos contigo en la validación.
Configuración
- La URL base, la clave y el secreto del webhook se leen de la configuración del entorno (variables de entorno o gestor de secretos), no están en el código.
- Tus pruebas automáticas comprueban que
X-Serad-Environmentessandbox. - El tipo de servicio se envía con
serviceTypeCode, y el catálogo se lee de la API. - La clave solo se usa desde tu servidor (nunca en un navegador ni en una app).
Avisos
- Envías una
Idempotency-Keyúnica por cada alta y la reutilizas en los reintentos (idempotencia). - Envías el nº de expediente (
externalRef) si tu catálogo dicerequiresExternalRef: true. - Distingues los avisos urgentes, normales y con cita, y las citas usan
scheduledFromyestimatedMinutes(avisos). - Sabes cancelar un aviso y gestionas el
409cuando ya no se puede (cancelar).
Webhooks
- Verificas la firma de cada entrega con el cuerpo crudo y rechazas las que no cuadran o tienen más de 300 s (firma).
- Respondes
2xxen menos de 10 s y procesas después, en segundo plano. - Descartas los eventos repetidos por su
id(no porX-Serad-Delivery, que cambia en un reenvío manual) (idempotencia del receptor). - Tu receptor aguanta que los eventos lleguen fuera de orden (usa los
milestones, no el orden de llegada).
Errores y límites
- Tratas los errores por su
statusy sutype(errores), y registras eldetaily elinstance. - Ante un
429esperas lo que diceRetry-After, y ante un5xxreintentas con espera exponencial (límites de uso). - Un fallo de la API no bloquea tu operativa: si no puedes enviar un aviso urgente, tu equipo sabe que puede llamar a la centralita (+34 611 673 280).
Cuando todo esté en verde, escríbenos para la validación.
¿Falta algo o algo no cuadra con lo que ves? Escribe al equipo técnico: info@saludenruta.es.
