{"openapi":"3.1.0","paths":{"/api/integrations/v1/catalog":{"get":{"description":"Ámbito: `visits:write`.","operationId":"ProviderIntegrationController_catalog","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"properties":{"status":{"type":"number","example":200},"data":{"$ref":"#/components/schemas/ProviderCatalogResponseDto"},"message":{"type":"string","example":"Operación realizada correctamente"}}}}}},"401":{"description":"API key ausente, inválida, revocada o caducada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"429":{"description":"Límite de peticiones de la clave superado (Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}}},"security":[{"provider-api-key":[]}],"summary":"Tipos de servicio permitidos y aseguradoras finales admitidas","tags":["Provider Integration API (v1)"]}},"/api/integrations/v1/visits":{"post":{"description":"Ámbito: `visits:write`. Con `Idempotency-Key` (recomendado), repetir la petición con la misma clave y el mismo cuerpo durante 24 h devuelve **el mismo aviso** (200, cabecera `Idempotent-Replayed: true`); con otro cuerpo, 409. El paciente se identifica por documento y se reutiliza si ya existe. `externalRef` es obligatorio si el proveedor lo exige.","operationId":"ProviderIntegrationController_create","parameters":[{"name":"X-Sandbox-Simulation","in":"header","description":"Solo sandbox. `manual`: el aviso no avanza solo; muévelo con `POST /sandbox/visits/{id}/advance`","required":false,"schema":{"type":"string","example":"manual"}},{"name":"Idempotency-Key","in":"header","description":"Identificador único de la operación en tu sistema (máx. 200 caracteres)","required":false,"schema":{"type":"string","example":"crm-exp-2026-004512-1"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderCreateVisitDto"},"examples":{"urgente":{"value":{"patient":{"firstName":"María","lastName":"García López","documentType":"DNI","documentNumber":"12345678Z","birthDate":"1948-05-17","phone":"+34600111222"},"address":{"line1":"Calle de Alcalá 120","line2":"3º B","city":"Madrid","postalCode":"28009"},"serviceTypeId":"57605fe9-bade-4040-b403-5eeb58e57c9e","priority":"URGENT","reason":"Fiebre alta desde ayer","externalRef":"EXP-2026-004512","insurerId":"fe8faeb8-0051-40d5-b0c1-dce10d5f5ba1"}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"properties":{"status":{"type":"number","example":201},"data":{"$ref":"#/components/schemas/ProviderVisitResponseDto"},"message":{"type":"string","example":"Operación realizada correctamente"}}}}}},"400":{"description":"Datos inválidos, tipo de servicio no permitido o falta el expediente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"401":{"description":"API key ausente, inválida, revocada o caducada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"403":{"description":"La clave no tiene el ámbito visits:write","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"409":{"description":"Idempotency-Key reutilizada con otro cuerpo o en curso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"429":{"description":"Límite de peticiones de la clave superado (Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}}},"security":[{"provider-api-key":[]}],"summary":"Crea un aviso","tags":["Provider Integration API (v1)"]},"get":{"description":"Ámbito: `visits:read`. `?externalRef=EXP-…` busca por nº de expediente exacto.","operationId":"ProviderIntegrationController_list","parameters":[{"name":"page","required":false,"in":"query","description":"Número de página (1-indexado)","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Elementos por página","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"search","required":false,"in":"query","description":"Búsqueda libre (nombre/email según el recurso)","schema":{"type":"string"}},{"name":"sortBy","required":false,"in":"query","description":"Campo de ordenación","schema":{"type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"status","required":false,"in":"query","description":"Uno o varios estados","schema":{"type":"array","items":{"type":"string","enum":["PENDING","ASSIGNED","EN_ROUTE","ON_SITE","FINISHED","VALIDATED","INVOICED","CANCELLED"]}}},{"name":"priority","required":false,"in":"query","schema":{"type":"string","enum":["URGENT","NORMAL","SCHEDULED"]}},{"name":"dateFrom","required":false,"in":"query","description":"Día de servicio desde (incl.)","schema":{"example":"2026-09-01","type":"string"}},{"name":"dateTo","required":false,"in":"query","description":"Día de servicio hasta (incl.)","schema":{"example":"2026-09-30","type":"string"}},{"name":"externalRef","required":false,"in":"query","description":"Nº de expediente exacto","schema":{"example":"EXP-2026-004512","type":"string"}},{"name":"serviceTypeId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"properties":{"status":{"type":"number","example":200},"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProviderVisitResponseDto"}},"pagination":{"type":"object","properties":{"page":{"type":"number","example":1},"limit":{"type":"number","example":20},"totalItems":{"type":"number","example":134},"totalPages":{"type":"number","example":7}}}}},"message":{"type":"string","example":"Operación realizada correctamente"}}}}}},"401":{"description":"API key ausente, inválida, revocada o caducada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"429":{"description":"Límite de peticiones de la clave superado (Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}}},"security":[{"provider-api-key":[]}],"summary":"Lista avisos del proveedor (filtro por externalRef, estado, fechas)","tags":["Provider Integration API (v1)"]}},"/api/integrations/v1/visits/{id}":{"get":{"description":"Ámbito: `visits:read`. Un aviso de otro proveedor responde 404.","operationId":"ProviderIntegrationController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"properties":{"status":{"type":"number","example":200},"data":{"$ref":"#/components/schemas/ProviderVisitDetailResponseDto"},"message":{"type":"string","example":"Operación realizada correctamente"}}}}}},"401":{"description":"API key ausente, inválida, revocada o caducada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"404":{"description":"Aviso no encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"429":{"description":"Límite de peticiones de la clave superado (Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}}},"security":[{"provider-api-key":[]}],"summary":"Estado, hitos y línea de tiempo de un aviso","tags":["Provider Integration API (v1)"]}},"/api/integrations/v1/visits/{id}/eta":{"get":{"description":"Ámbito: `visits:read`. Con la unidad en camino, minutos y hora estimada por carretera desde su última posición. En otros estados, `etaMinutes` es null. **No** se devuelve la posición de la unidad.","operationId":"ProviderIntegrationController_eta","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"properties":{"status":{"type":"number","example":200},"data":{"$ref":"#/components/schemas/ProviderVisitEtaResponseDto"},"message":{"type":"string","example":"Operación realizada correctamente"}}}}}},"401":{"description":"API key ausente, inválida, revocada o caducada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"404":{"description":"Aviso no encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"429":{"description":"Límite de peticiones de la clave superado (Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}}},"security":[{"provider-api-key":[]}],"summary":"Hora estimada de llegada de la unidad (con el aviso en camino)","tags":["Provider Integration API (v1)"]}},"/api/integrations/v1/visits/{id}/cancel":{"post":{"description":"Ámbito: `visits:write`. Con la unidad en camino, llama a la centralita.","operationId":"ProviderIntegrationController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderCancelVisitDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"properties":{"status":{"type":"number","example":200},"data":{"$ref":"#/components/schemas/ProviderVisitResponseDto"},"message":{"type":"string","example":"Operación realizada correctamente"}}}}}},"401":{"description":"API key ausente, inválida, revocada o caducada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"409":{"description":"El aviso ya no se puede cancelar desde la integración","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"429":{"description":"Límite de peticiones de la clave superado (Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}}},"security":[{"provider-api-key":[]}],"summary":"Cancela un aviso (solo PENDING/ASSIGNED, sin cargo)","tags":["Provider Integration API (v1)"]}},"/api/integrations/v1/visits/{id}/report":{"get":{"description":"Ámbito: `reports:read`. Cada descarga queda registrada (CLINICAL_ACCESS).","operationId":"ProviderIntegrationController_report","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"401":{"description":"API key ausente, inválida, revocada o caducada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"404":{"description":"Sin informe compartido para este aviso","content":{"application/pdf":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"429":{"description":"Límite de peticiones de la clave superado (Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}}},"security":[{"provider-api-key":[]}],"summary":"Descarga el informe asistencial (PDF) si está compartido y consentido","tags":["Provider Integration API (v1)"]}},"/api/integrations/v1/sandbox/visits/{id}/advance":{"post":{"description":"Ámbito: `visits:write`. Dispara los mismos webhooks que en producción para cada estado por el que pasa. Para cancelar, `{\"to\":\"CANCELLED\"}` (desde pendiente, asignado o en camino).","operationId":"SandboxIntegrationController_advance","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxAdvanceVisitDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"properties":{"status":{"type":"number","example":200},"data":{"$ref":"#/components/schemas/ProviderVisitDetailResponseDto"},"message":{"type":"string","example":"Operación realizada correctamente"}}}}}},"400":{"description":"El aviso no puede pasar a ese estado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}},"404":{"description":"Aviso no encontrado, o la ruta no existe (producción)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetailDto"}}}}},"security":[{"provider-api-key":[]}],"summary":"[Solo sandbox] Avanza un aviso de prueba al siguiente estado o al indicado","tags":["Provider Integration API (v1)"]}},"/api/integrations/v1/sandbox/reset":{"post":{"description":"Ámbito: `visits:write`. Deja el entorno limpio para empezar otra batería de pruebas.","operationId":"SandboxIntegrationController_reset","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"properties":{"status":{"type":"number","example":200},"data":{"$ref":"#/components/schemas/SandboxResetResponseDto"},"message":{"type":"string","example":"Operación realizada correctamente"}}}}}}},"security":[{"provider-api-key":[]}],"summary":"[Solo sandbox] Borra todos tus avisos de prueba","tags":["Provider Integration API (v1)"]}}},"info":{"title":"API de integración para proveedores · Salud en Ruta","description":"API REST para que aseguradoras, intermediarios y plataformas sanitarias **envíen avisos médicos y de enfermería a domicilio** a Salud en Ruta y sigan su evolución.\n\n- Autenticación con `X-Api-Key` (claves `srd_live_…` en producción y `srd_test_…` en pruebas).\n- Errores en formato RFC 9457 (`application/problem+json`).\n- Idempotencia con `Idempotency-Key` (24 h).\n- Webhooks firmados con HMAC-SHA256 para cada cambio de estado.\n- Todas las respuestas llevan `X-Serad-Environment: production | sandbox`.\n\nGuías, ejemplos y entorno de pruebas: https://www.saludenruta.es/desarrolladores","version":"1.0.0","contact":{}},"tags":[{"name":"Provider Integration API (v1)","description":"Avisos, catálogo, informes y sandbox"}],"servers":[],"components":{"securitySchemes":{"provider-api-key":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Clave del proveedor. Producción: srd_live_…; pruebas (sandbox): srd_test_…"}},"schemas":{"FieldErrorDto":{"type":"object","properties":{"field":{"type":"string","example":"email"},"message":{"type":"string","example":"El campo 'email' no tiene un formato válido"}},"required":["field","message"]},"ProblemDetailDto":{"type":"object","properties":{"type":{"type":"string","example":"https://api.dominio.com/errors/validation-error"},"title":{"type":"string","example":"Error de validación"},"status":{"type":"number","example":400},"detail":{"type":"string","example":"El campo 'email' no tiene un formato válido"},"instance":{"type":"string","example":"/users/123"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/FieldErrorDto"}},"timestamp":{"type":"string","example":"2026-07-07T10:00:00.000Z"}},"required":["type","title","status","detail","instance","timestamp"]},"ProviderVisitServiceTypeDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"code":{"type":"string","example":"GENERAL_CONSULTATION"},"name":{"type":"string","example":"Consulta general"}},"required":["id","code","name"]},"ProviderVisitMilestonesDto":{"type":"object","properties":{"requestedAt":{"format":"date-time","type":"string"},"assignedAt":{"format":"date-time","type":"string","nullable":true},"departedAt":{"format":"date-time","type":"string","nullable":true},"arrivedAt":{"format":"date-time","type":"string","nullable":true},"finishedAt":{"format":"date-time","type":"string","nullable":true},"cancelledAt":{"format":"date-time","type":"string","nullable":true},"invoicedAt":{"format":"date-time","type":"string","nullable":true}},"required":["requestedAt"]},"ProviderVisitUnitDto":{"type":"object","properties":{"type":{"type":"string","enum":["MEDICAL","NURSING"]},"label":{"type":"string","example":"Unidad médica","description":"Nunca nombres ni matrículas"}},"required":["type","label"]},"ProviderVisitResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"code":{"type":"string","example":"AV-000123"},"status":{"type":"string","enum":["PENDING","ASSIGNED","EN_ROUTE","ON_SITE","FINISHED","VALIDATED","INVOICED","CANCELLED"]},"statusLabel":{"type":"string","example":"Unidad en camino"},"priority":{"type":"string","enum":["URGENT","NORMAL","SCHEDULED"]},"origin":{"type":"string","enum":["INTRANET","PROVIDER_PORTAL","PROVIDER_API"]},"externalRef":{"type":"string","nullable":true,"example":"EXP-2026-004512"},"serviceType":{"$ref":"#/components/schemas/ProviderVisitServiceTypeDto"},"requiredProfessional":{"type":"string","enum":["DOCTOR","NURSE"]},"insurer":{"type":"object","nullable":true,"description":"Aseguradora final"},"patientName":{"type":"string","example":"María García López","description":"Nombre del paciente que envió"},"address":{"type":"object","description":"Domicilio (sin coordenadas ni indicaciones de acceso)"},"serviceDate":{"type":"string","example":"2026-09-25"},"scheduledFrom":{"format":"date-time","type":"string","nullable":true},"scheduledTo":{"format":"date-time","type":"string","nullable":true,"description":"Fin de la cita, calculado: inicio + tiempo estimado"},"estimatedMinutes":{"type":"number","example":60,"description":"Tiempo estimado de realización, en minutos (puede ampliarse con el aviso en curso)"},"milestones":{"$ref":"#/components/schemas/ProviderVisitMilestonesDto"},"unit":{"nullable":true,"description":"Solo el tipo de unidad, desde la asignación","type":"object","allOf":[{"$ref":"#/components/schemas/ProviderVisitUnitDto"}]},"outcome":{"type":"string","enum":["ATTENDED","PATIENT_ABSENT","REFERRED_HOSPITAL","REFUSED","CANCELLED"],"nullable":true},"cancellationReason":{"type":"string","nullable":true},"cancelledWithCharge":{"type":"boolean"},"cancellable":{"type":"boolean","description":"Si el proveedor puede cancelarlo ahora (PENDING/ASSIGNED)"},"reportAvailable":{"type":"boolean","description":"Si hay informe asistencial compartido y descargable"},"invoiceId":{"type":"string","nullable":true,"format":"uuid"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","code","status","statusLabel","priority","origin","serviceType","requiredProfessional","patientName","address","serviceDate","estimatedMinutes","milestones","cancelledWithCharge","cancellable","reportAvailable","createdAt","updatedAt"]},"ProviderCatalogServiceTypeDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"code":{"type":"string","example":"GENERAL_CONSULTATION"},"name":{"type":"string","example":"Consulta general"},"requiredProfessional":{"type":"string","enum":["DOCTOR","NURSE"]}},"required":["id","code","name","requiredProfessional"]},"ProviderCatalogInsurerDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","example":"Sanitas"}},"required":["id","name"]},"ProviderCatalogResponseDto":{"type":"object","properties":{"providerType":{"type":"string","enum":["INSURER","INTERMEDIARY","PRIVATE","OTHER"]},"requiresExternalRef":{"type":"boolean","description":"Si externalRef es obligatorio"},"serviceTypes":{"description":"Tipos de servicio con línea en su tarifa vigente (o todos los activos sin tarifa)","type":"array","items":{"$ref":"#/components/schemas/ProviderCatalogServiceTypeDto"}},"insurers":{"description":"Aseguradoras finales admitidas (solo intermediarios)","type":"array","items":{"$ref":"#/components/schemas/ProviderCatalogInsurerDto"}}},"required":["providerType","requiresExternalRef","serviceTypes","insurers"]},"ProviderVisitPatientInputDto":{"type":"object","properties":{"firstName":{"type":"string","example":"María"},"lastName":{"type":"string","example":"García López"},"documentType":{"type":"string","enum":["DNI","NIE","PASSPORT","NONE"],"default":"NONE"},"documentNumber":{"type":"string","example":"12345678Z","description":"Obligatorio salvo documentType NONE"},"birthDate":{"type":"string","example":"1948-05-17"},"sex":{"type":"string","enum":["MALE","FEMALE","OTHER","UNKNOWN"]},"phone":{"type":"string","example":"+34600111222"}},"required":["firstName","lastName"]},"VisitAddressInputDto":{"type":"object","properties":{"line1":{"type":"string","example":"Calle de Alcalá 120"},"line2":{"type":"string","example":"3º B"},"city":{"type":"string","example":"Madrid"},"postalCode":{"type":"string","example":"28009"},"province":{"type":"string","example":"Madrid"},"accessNotes":{"type":"string","example":"Portal 2, código 1234#"},"latitude":{"type":"number","example":40.4212,"description":"Si falta, se geocodifica"},"longitude":{"type":"number","example":-3.6765}},"required":["line1","city","postalCode"]},"ProviderCreateVisitDto":{"type":"object","properties":{"patientId":{"type":"string","format":"uuid","description":"Paciente de un aviso anterior **de este proveedor** (`GET /client/patients`). Si llega, `patient` no hace falta"},"patient":{"description":"Datos del paciente. Obligatorio salvo que se indique `patientId`","allOf":[{"$ref":"#/components/schemas/ProviderVisitPatientInputDto"}]},"address":{"description":"Domicilio de la visita; se geocodifica si no trae coordenadas","allOf":[{"$ref":"#/components/schemas/VisitAddressInputDto"}]},"serviceTypeCode":{"type":"string","example":"URG","description":"Código del tipo de servicio (GET /catalog). **Recomendado**: es el mismo en pruebas y en producción, a diferencia del `serviceTypeId`. Obligatorio si no se indica `serviceTypeId`"},"serviceTypeId":{"type":"string","format":"uuid","description":"Id del tipo de servicio (GET /catalog). Cambia entre entornos: mejor `serviceTypeCode`. Obligatorio si no se indica `serviceTypeCode`"},"priority":{"type":"string","enum":["URGENT","NORMAL","SCHEDULED"],"description":"Por defecto NORMAL, o SCHEDULED si trae franja"},"scheduledFrom":{"format":"date-time","type":"string","example":"2026-09-26T09:00:00+02:00"},"estimatedMinutes":{"type":"number","example":60,"minimum":30,"maximum":240,"multipleOf":10,"description":"Tiempo estimado en minutos: bloques de 10 entre 30 y 240. Por defecto 60"},"scheduledTo":{"format":"date-time","type":"string","example":"2026-09-26T11:00:00+02:00","deprecated":true,"description":"Obsoleto: usar `estimatedMinutes`. Si llega sin él, la duración de la franja se redondea al bloque de 10 min y se usa como tiempo estimado"},"reason":{"type":"string","example":"Fiebre alta desde ayer, 39 ºC","description":"Motivo de la solicitud"},"externalRef":{"type":"string","example":"EXP-2026-004512","description":"Obligatorio si el proveedor lo exige"},"insurerId":{"type":"string","format":"uuid","description":"Aseguradora final: solo intermediarios, y entre sus aseguradoras gestionadas"},"callerName":{"type":"string","example":"Ana García (hija)"},"callerPhone":{"type":"string","example":"+34600111333"}},"required":["address","reason"]},"ProviderVisitTimelineEntryDto":{"type":"object","properties":{"status":{"type":"string","enum":["PENDING","ASSIGNED","EN_ROUTE","ON_SITE","FINISHED","VALIDATED","INVOICED","CANCELLED"]},"label":{"type":"string","example":"Unidad asignada"},"at":{"format":"date-time","type":"string"}},"required":["status","label","at"]},"ProviderVisitDetailResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"code":{"type":"string","example":"AV-000123"},"status":{"type":"string","enum":["PENDING","ASSIGNED","EN_ROUTE","ON_SITE","FINISHED","VALIDATED","INVOICED","CANCELLED"]},"statusLabel":{"type":"string","example":"Unidad en camino"},"priority":{"type":"string","enum":["URGENT","NORMAL","SCHEDULED"]},"origin":{"type":"string","enum":["INTRANET","PROVIDER_PORTAL","PROVIDER_API"]},"externalRef":{"type":"string","nullable":true,"example":"EXP-2026-004512"},"serviceType":{"$ref":"#/components/schemas/ProviderVisitServiceTypeDto"},"requiredProfessional":{"type":"string","enum":["DOCTOR","NURSE"]},"insurer":{"type":"object","nullable":true,"description":"Aseguradora final"},"patientName":{"type":"string","example":"María García López","description":"Nombre del paciente que envió"},"address":{"type":"object","description":"Domicilio (sin coordenadas ni indicaciones de acceso)"},"serviceDate":{"type":"string","example":"2026-09-25"},"scheduledFrom":{"format":"date-time","type":"string","nullable":true},"scheduledTo":{"format":"date-time","type":"string","nullable":true,"description":"Fin de la cita, calculado: inicio + tiempo estimado"},"estimatedMinutes":{"type":"number","example":60,"description":"Tiempo estimado de realización, en minutos (puede ampliarse con el aviso en curso)"},"milestones":{"$ref":"#/components/schemas/ProviderVisitMilestonesDto"},"unit":{"nullable":true,"description":"Solo el tipo de unidad, desde la asignación","type":"object","allOf":[{"$ref":"#/components/schemas/ProviderVisitUnitDto"}]},"outcome":{"type":"string","enum":["ATTENDED","PATIENT_ABSENT","REFERRED_HOSPITAL","REFUSED","CANCELLED"],"nullable":true},"cancellationReason":{"type":"string","nullable":true},"cancelledWithCharge":{"type":"boolean"},"cancellable":{"type":"boolean","description":"Si el proveedor puede cancelarlo ahora (PENDING/ASSIGNED)"},"reportAvailable":{"type":"boolean","description":"Si hay informe asistencial compartido y descargable"},"invoiceId":{"type":"string","nullable":true,"format":"uuid"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"timeline":{"type":"array","items":{"$ref":"#/components/schemas/ProviderVisitTimelineEntryDto"}}},"required":["id","code","status","statusLabel","priority","origin","serviceType","requiredProfessional","patientName","address","serviceDate","estimatedMinutes","milestones","cancelledWithCharge","cancellable","reportAvailable","createdAt","updatedAt","timeline"]},"ProviderVisitEtaResponseDto":{"type":"object","properties":{"status":{"type":"string","enum":["PENDING","ASSIGNED","EN_ROUTE","ON_SITE","FINISHED","VALIDATED","INVOICED","CANCELLED"]},"etaMinutes":{"type":"number","nullable":true,"example":14,"description":"Minutos estimados hasta la llegada; null si no está EN_ROUTE o no hay posición"},"estimatedArrivalAt":{"format":"date-time","type":"string","nullable":true,"description":"Hora estimada de llegada"},"estimated":{"type":"boolean","description":"true si es una estimación en línea recta (sin OSRM)"},"calculatedAt":{"format":"date-time","type":"string"}},"required":["status","estimated","calculatedAt"]},"ProviderCancelVisitDto":{"type":"object","properties":{"reason":{"type":"string","example":"El paciente ya no necesita la visita"}},"required":["reason"]},"SandboxAdvanceVisitDto":{"type":"object","properties":{"to":{"type":"string","enum":["ASSIGNED","EN_ROUTE","ON_SITE","FINISHED","CANCELLED"],"description":"Estado destino. Sin él, el siguiente. Pasa por los intermedios, con su webhook cada uno"}}},"SandboxResetResponseDto":{"type":"object","properties":{"deletedVisits":{"type":"number","example":12}}},"ProviderApiKeyResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"providerId":{"type":"string","format":"uuid"},"name":{"type":"string","example":"Integración CRM expedientes"},"keyPrefix":{"type":"string","example":"a1b2c3d4","description":"Prefijo visible: la clave empieza por srd_live_<prefijo>_, srd_test_<prefijo>_ o (legacy) srd_<prefijo>_"},"keyFormat":{"type":"string","enum":["live","test","legacy"],"example":"live","description":"Formato con el que se emitió: live (srd_live_), test (srd_test_) o legacy (srd_<prefijo>_)"},"scopes":{"type":"array","items":{"type":"string","enum":["visits:write","visits:read","reports:read"]}},"rateLimitPerMinute":{"type":"number","example":60},"expiresAt":{"format":"date-time","type":"string","nullable":true},"lastUsedAt":{"format":"date-time","type":"string","nullable":true},"lastUsedIp":{"type":"string","nullable":true},"revokedAt":{"format":"date-time","type":"string","nullable":true},"rotatedFromId":{"type":"string","nullable":true,"format":"uuid"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","providerId","name","keyPrefix","keyFormat","scopes","rateLimitPerMinute","createdAt"]},"ProviderApiKeyCreatedDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"providerId":{"type":"string","format":"uuid"},"name":{"type":"string","example":"Integración CRM expedientes"},"keyPrefix":{"type":"string","example":"a1b2c3d4","description":"Prefijo visible: la clave empieza por srd_live_<prefijo>_, srd_test_<prefijo>_ o (legacy) srd_<prefijo>_"},"keyFormat":{"type":"string","enum":["live","test","legacy"],"example":"live","description":"Formato con el que se emitió: live (srd_live_), test (srd_test_) o legacy (srd_<prefijo>_)"},"scopes":{"type":"array","items":{"type":"string","enum":["visits:write","visits:read","reports:read"]}},"rateLimitPerMinute":{"type":"number","example":60},"expiresAt":{"format":"date-time","type":"string","nullable":true},"lastUsedAt":{"format":"date-time","type":"string","nullable":true},"lastUsedIp":{"type":"string","nullable":true},"revokedAt":{"format":"date-time","type":"string","nullable":true},"rotatedFromId":{"type":"string","nullable":true,"format":"uuid"},"createdAt":{"format":"date-time","type":"string"},"key":{"type":"string","example":"srd_a1b2c3d4_Qm9yZ2VzIGVzIHVuIGdlbmlvIGRlIGxhIGxpdGVyYXR1cmE","description":"Clave completa. **Solo se muestra en esta respuesta**; guárdala en un gestor de secretos"}},"required":["id","providerId","name","keyPrefix","keyFormat","scopes","rateLimitPerMinute","createdAt","key"]},"CreateProviderApiKeyDto":{"type":"object","properties":{"name":{"type":"string","example":"Integración CRM expedientes"},"scopes":{"type":"array","example":["visits:write","visits:read"],"items":{"type":"string","enum":["visits:write","visits:read","reports:read"]}},"rateLimitPerMinute":{"type":"number","example":60,"description":"Peticiones por minuto (por defecto 60)"},"expiresAt":{"type":"string","example":"2027-12-31T23:59:59Z","description":"Sin valor, no caduca"}},"required":["name","scopes"]},"ProviderWebhookResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"providerId":{"type":"string","format":"uuid"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["visit.created","visit.assigned","visit.en_route","visit.on_site","visit.finished","visit.cancelled","visit.invoiced","report.shared"]}},"active":{"type":"boolean"},"description":{"type":"string","nullable":true},"secretHint":{"type":"string","example":"whsec_…3f9a","description":"Solo los últimos caracteres"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","providerId","url","events","active","secretHint","createdAt","updatedAt"]},"ProviderWebhookWithSecretDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"providerId":{"type":"string","format":"uuid"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["visit.created","visit.assigned","visit.en_route","visit.on_site","visit.finished","visit.cancelled","visit.invoiced","report.shared"]}},"active":{"type":"boolean"},"description":{"type":"string","nullable":true},"secretHint":{"type":"string","example":"whsec_…3f9a","description":"Solo los últimos caracteres"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"secret":{"type":"string","example":"whsec_2Qx…","description":"Secreto completo para verificar X-Serad-Signature. Solo en esta respuesta"}},"required":["id","providerId","url","events","active","secretHint","createdAt","updatedAt","secret"]},"CreateProviderWebhookDto":{"type":"object","properties":{"url":{"type":"string","example":"https://integraciones.aseguradora.es/serad/webhooks"},"events":{"type":"array","example":["visit.assigned","visit.finished"],"items":{"type":"string","enum":["visit.created","visit.assigned","visit.en_route","visit.on_site","visit.finished","visit.cancelled","visit.invoiced","report.shared"]}},"description":{"type":"string","example":"CRM de expedientes (producción)"},"secret":{"type":"string","description":"Secreto de firma. Si no se indica, se genera (whsec_…) y se devuelve una vez"}},"required":["url","events"]},"UpdateProviderWebhookDto":{"type":"object","properties":{"url":{"type":"string","example":"https://integraciones.aseguradora.es/serad/webhooks"},"events":{"type":"array","example":["visit.assigned","visit.finished"],"items":{"type":"string","enum":["visit.created","visit.assigned","visit.en_route","visit.on_site","visit.finished","visit.cancelled","visit.invoiced","report.shared"]}},"description":{"type":"string","example":"CRM de expedientes (producción)"},"secret":{"type":"string","description":"Secreto de firma. Si no se indica, se genera (whsec_…) y se devuelve una vez"},"active":{"type":"boolean","description":"Desactivado no recibe eventos"}}},"ProviderWebhookDeliveryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"endpointId":{"type":"string","format":"uuid"},"event":{"type":"string","example":"visit.assigned"},"eventId":{"type":"string","format":"uuid"},"visitId":{"type":"string","nullable":true,"format":"uuid"},"status":{"type":"string","enum":["PENDING","RETRYING","SUCCEEDED","FAILED"]},"attempts":{"type":"number","example":2},"maxAttempts":{"type":"number","example":6},"lastStatusCode":{"type":"number","nullable":true,"example":500},"lastResponse":{"type":"string","nullable":true,"description":"Truncada a 1000 caracteres"},"lastError":{"type":"string","nullable":true},"lastAttemptAt":{"format":"date-time","type":"string","nullable":true},"nextAttemptAt":{"format":"date-time","type":"string","nullable":true},"deliveredAt":{"format":"date-time","type":"string","nullable":true},"isTest":{"type":"boolean"},"redeliveryOfId":{"type":"string","nullable":true,"format":"uuid"},"payload":{"type":"object","description":"Carga enviada (sin datos clínicos)"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","endpointId","event","eventId","status","attempts","maxAttempts","isTest","payload","createdAt"]}}},"webhooks":{"visit.created":{"post":{"summary":"Evento visit.created","description":"Petición que Salud en Ruta envía a tu URL. Verifica la firma: `X-Serad-Signature` = `sha256=` + hex(HMAC-SHA256(secreto, `<X-Serad-Timestamp>.<cuerpo crudo>`)), con una tolerancia de 300 s. Responde 2xx en menos de 10 s; si no, se reintenta: 12 intentos en total con espera exponencial (de 30 s a 1 h, unas 5 horas). `X-Serad-Delivery` identifica la entrega para descartar duplicados.","parameters":[{"name":"X-Serad-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Event","in":"header","required":true,"schema":{"type":"string","example":"visit.created"}},{"name":"X-Serad-Delivery","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"id":"6f0a9c1e-2b7d-4f8a-9e3c-1d2b3c4d5e6f","type":"visit.created","createdAt":"2026-10-01T09:15:00.000Z","data":{"visit":{"id":"c6a3c348-40b6-4158-a44a-7d85f01a0201","code":"AV-000018","externalRef":"EXP-2026-004512","status":"ASSIGNED","priority":"URGENT","origin":"PROVIDER_API","serviceTypeCode":"URG","unitType":"MEDICAL","milestones":{"requestedAt":"2026-10-01T09:10:00.000Z","assignedAt":"2026-10-01T09:15:00.000Z"},"outcome":null,"cancelledWithCharge":false,"invoice":null}}}}}},"responses":{"2XX":{"description":"Recibido. Cualquier otra respuesta se reintenta."}}}},"visit.assigned":{"post":{"summary":"Evento visit.assigned","description":"Petición que Salud en Ruta envía a tu URL. Verifica la firma: `X-Serad-Signature` = `sha256=` + hex(HMAC-SHA256(secreto, `<X-Serad-Timestamp>.<cuerpo crudo>`)), con una tolerancia de 300 s. Responde 2xx en menos de 10 s; si no, se reintenta: 12 intentos en total con espera exponencial (de 30 s a 1 h, unas 5 horas). `X-Serad-Delivery` identifica la entrega para descartar duplicados.","parameters":[{"name":"X-Serad-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Event","in":"header","required":true,"schema":{"type":"string","example":"visit.assigned"}},{"name":"X-Serad-Delivery","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"id":"6f0a9c1e-2b7d-4f8a-9e3c-1d2b3c4d5e6f","type":"visit.assigned","createdAt":"2026-10-01T09:15:00.000Z","data":{"visit":{"id":"c6a3c348-40b6-4158-a44a-7d85f01a0201","code":"AV-000018","externalRef":"EXP-2026-004512","status":"ASSIGNED","priority":"URGENT","origin":"PROVIDER_API","serviceTypeCode":"URG","unitType":"MEDICAL","milestones":{"requestedAt":"2026-10-01T09:10:00.000Z","assignedAt":"2026-10-01T09:15:00.000Z"},"outcome":null,"cancelledWithCharge":false,"invoice":null}}}}}},"responses":{"2XX":{"description":"Recibido. Cualquier otra respuesta se reintenta."}}}},"visit.en_route":{"post":{"summary":"Evento visit.en_route","description":"Petición que Salud en Ruta envía a tu URL. Verifica la firma: `X-Serad-Signature` = `sha256=` + hex(HMAC-SHA256(secreto, `<X-Serad-Timestamp>.<cuerpo crudo>`)), con una tolerancia de 300 s. Responde 2xx en menos de 10 s; si no, se reintenta: 12 intentos en total con espera exponencial (de 30 s a 1 h, unas 5 horas). `X-Serad-Delivery` identifica la entrega para descartar duplicados.","parameters":[{"name":"X-Serad-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Event","in":"header","required":true,"schema":{"type":"string","example":"visit.en_route"}},{"name":"X-Serad-Delivery","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"id":"6f0a9c1e-2b7d-4f8a-9e3c-1d2b3c4d5e6f","type":"visit.en_route","createdAt":"2026-10-01T09:15:00.000Z","data":{"visit":{"id":"c6a3c348-40b6-4158-a44a-7d85f01a0201","code":"AV-000018","externalRef":"EXP-2026-004512","status":"ASSIGNED","priority":"URGENT","origin":"PROVIDER_API","serviceTypeCode":"URG","unitType":"MEDICAL","milestones":{"requestedAt":"2026-10-01T09:10:00.000Z","assignedAt":"2026-10-01T09:15:00.000Z"},"outcome":null,"cancelledWithCharge":false,"invoice":null}}}}}},"responses":{"2XX":{"description":"Recibido. Cualquier otra respuesta se reintenta."}}}},"visit.on_site":{"post":{"summary":"Evento visit.on_site","description":"Petición que Salud en Ruta envía a tu URL. Verifica la firma: `X-Serad-Signature` = `sha256=` + hex(HMAC-SHA256(secreto, `<X-Serad-Timestamp>.<cuerpo crudo>`)), con una tolerancia de 300 s. Responde 2xx en menos de 10 s; si no, se reintenta: 12 intentos en total con espera exponencial (de 30 s a 1 h, unas 5 horas). `X-Serad-Delivery` identifica la entrega para descartar duplicados.","parameters":[{"name":"X-Serad-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Event","in":"header","required":true,"schema":{"type":"string","example":"visit.on_site"}},{"name":"X-Serad-Delivery","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"id":"6f0a9c1e-2b7d-4f8a-9e3c-1d2b3c4d5e6f","type":"visit.on_site","createdAt":"2026-10-01T09:15:00.000Z","data":{"visit":{"id":"c6a3c348-40b6-4158-a44a-7d85f01a0201","code":"AV-000018","externalRef":"EXP-2026-004512","status":"ASSIGNED","priority":"URGENT","origin":"PROVIDER_API","serviceTypeCode":"URG","unitType":"MEDICAL","milestones":{"requestedAt":"2026-10-01T09:10:00.000Z","assignedAt":"2026-10-01T09:15:00.000Z"},"outcome":null,"cancelledWithCharge":false,"invoice":null}}}}}},"responses":{"2XX":{"description":"Recibido. Cualquier otra respuesta se reintenta."}}}},"visit.finished":{"post":{"summary":"Evento visit.finished","description":"Petición que Salud en Ruta envía a tu URL. Verifica la firma: `X-Serad-Signature` = `sha256=` + hex(HMAC-SHA256(secreto, `<X-Serad-Timestamp>.<cuerpo crudo>`)), con una tolerancia de 300 s. Responde 2xx en menos de 10 s; si no, se reintenta: 12 intentos en total con espera exponencial (de 30 s a 1 h, unas 5 horas). `X-Serad-Delivery` identifica la entrega para descartar duplicados.","parameters":[{"name":"X-Serad-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Event","in":"header","required":true,"schema":{"type":"string","example":"visit.finished"}},{"name":"X-Serad-Delivery","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"id":"6f0a9c1e-2b7d-4f8a-9e3c-1d2b3c4d5e6f","type":"visit.finished","createdAt":"2026-10-01T09:15:00.000Z","data":{"visit":{"id":"c6a3c348-40b6-4158-a44a-7d85f01a0201","code":"AV-000018","externalRef":"EXP-2026-004512","status":"ASSIGNED","priority":"URGENT","origin":"PROVIDER_API","serviceTypeCode":"URG","unitType":"MEDICAL","milestones":{"requestedAt":"2026-10-01T09:10:00.000Z","assignedAt":"2026-10-01T09:15:00.000Z"},"outcome":null,"cancelledWithCharge":false,"invoice":null}}}}}},"responses":{"2XX":{"description":"Recibido. Cualquier otra respuesta se reintenta."}}}},"visit.cancelled":{"post":{"summary":"Evento visit.cancelled","description":"Petición que Salud en Ruta envía a tu URL. Verifica la firma: `X-Serad-Signature` = `sha256=` + hex(HMAC-SHA256(secreto, `<X-Serad-Timestamp>.<cuerpo crudo>`)), con una tolerancia de 300 s. Responde 2xx en menos de 10 s; si no, se reintenta: 12 intentos en total con espera exponencial (de 30 s a 1 h, unas 5 horas). `X-Serad-Delivery` identifica la entrega para descartar duplicados.","parameters":[{"name":"X-Serad-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Event","in":"header","required":true,"schema":{"type":"string","example":"visit.cancelled"}},{"name":"X-Serad-Delivery","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"id":"6f0a9c1e-2b7d-4f8a-9e3c-1d2b3c4d5e6f","type":"visit.cancelled","createdAt":"2026-10-01T09:15:00.000Z","data":{"visit":{"id":"c6a3c348-40b6-4158-a44a-7d85f01a0201","code":"AV-000018","externalRef":"EXP-2026-004512","status":"ASSIGNED","priority":"URGENT","origin":"PROVIDER_API","serviceTypeCode":"URG","unitType":"MEDICAL","milestones":{"requestedAt":"2026-10-01T09:10:00.000Z","assignedAt":"2026-10-01T09:15:00.000Z"},"outcome":null,"cancelledWithCharge":false,"invoice":null}}}}}},"responses":{"2XX":{"description":"Recibido. Cualquier otra respuesta se reintenta."}}}},"visit.invoiced":{"post":{"summary":"Evento visit.invoiced","description":"Petición que Salud en Ruta envía a tu URL. Verifica la firma: `X-Serad-Signature` = `sha256=` + hex(HMAC-SHA256(secreto, `<X-Serad-Timestamp>.<cuerpo crudo>`)), con una tolerancia de 300 s. Responde 2xx en menos de 10 s; si no, se reintenta: 12 intentos en total con espera exponencial (de 30 s a 1 h, unas 5 horas). `X-Serad-Delivery` identifica la entrega para descartar duplicados.","parameters":[{"name":"X-Serad-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Event","in":"header","required":true,"schema":{"type":"string","example":"visit.invoiced"}},{"name":"X-Serad-Delivery","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"id":"6f0a9c1e-2b7d-4f8a-9e3c-1d2b3c4d5e6f","type":"visit.invoiced","createdAt":"2026-10-01T09:15:00.000Z","data":{"visit":{"id":"c6a3c348-40b6-4158-a44a-7d85f01a0201","code":"AV-000018","externalRef":"EXP-2026-004512","status":"ASSIGNED","priority":"URGENT","origin":"PROVIDER_API","serviceTypeCode":"URG","unitType":"MEDICAL","milestones":{"requestedAt":"2026-10-01T09:10:00.000Z","assignedAt":"2026-10-01T09:15:00.000Z"},"outcome":null,"cancelledWithCharge":false,"invoice":null}}}}}},"responses":{"2XX":{"description":"Recibido. Cualquier otra respuesta se reintenta."}}}},"report.shared":{"post":{"summary":"Evento report.shared","description":"Petición que Salud en Ruta envía a tu URL. Verifica la firma: `X-Serad-Signature` = `sha256=` + hex(HMAC-SHA256(secreto, `<X-Serad-Timestamp>.<cuerpo crudo>`)), con una tolerancia de 300 s. Responde 2xx en menos de 10 s; si no, se reintenta: 12 intentos en total con espera exponencial (de 30 s a 1 h, unas 5 horas). `X-Serad-Delivery` identifica la entrega para descartar duplicados.","parameters":[{"name":"X-Serad-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"X-Serad-Event","in":"header","required":true,"schema":{"type":"string","example":"report.shared"}},{"name":"X-Serad-Delivery","in":"header","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"id":"6f0a9c1e-2b7d-4f8a-9e3c-1d2b3c4d5e6f","type":"report.shared","createdAt":"2026-10-01T09:15:00.000Z","data":{"visit":{"id":"c6a3c348-40b6-4158-a44a-7d85f01a0201","code":"AV-000018","externalRef":"EXP-2026-004512","status":"ASSIGNED","priority":"URGENT","origin":"PROVIDER_API","serviceTypeCode":"URG","unitType":"MEDICAL","milestones":{"requestedAt":"2026-10-01T09:10:00.000Z","assignedAt":"2026-10-01T09:15:00.000Z"},"outcome":null,"cancelledWithCharge":false,"invoice":null}}}}}},"responses":{"2XX":{"description":"Recibido. Cualquier otra respuesta se reintenta."}}}}}}