Skip to content

Idempotencia en endpoints FHIR

Los endpoints POST /fhir/r4/{ResourceType}/$register son idempotentes: múltiples envíos del mismo recurso con la misma combinación de identificadores (tenant + identifier.system + identifier.value) no generan nuevos recursos.

El siguiente diagrama ilustra el flujo de decisión del servidor:

Comportamiento

Creación inicial

Cuando se envía un recurso con una combinación de identificadores que no existe previamente para la organización autenticada, la plataforma crea el recurso y responde con 201 Created.

Reenvío de un recurso previamente registrado

Si se reenvía el mismo recurso con la misma combinación de identifier.system e identifier.value para la misma organización autenticada, la plataforma no crea un nuevo recurso. En su lugar, retorna el recurso existente con 201 Created.

La respuesta es idéntica al caso de creación inicial. Esto es intencional: la idempotencia es transparente para el cliente.

Nota sobre los ejemplos: Los ejemplos a continuación utilizan el recurso DiagnosticReport a modo ilustrativo. El mismo comportamiento aplica a cualquier recurso FHIR que implemente el patrón $register.

Ejemplo — Recurso creado exitosamente:

json
// Response - 201 Created
{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "diagnosticReport",
      "resource": {
        "resourceType": "DiagnosticReport",
        "id": "ea58008d-d5cd-4023-a916-d242ea10f55b",
        "meta": {
          "versionId": 1,
          "lastUpdated": "2026-05-04T12:33:15.887Z"
        },
        "status": "final",
        "identifier": [
          {
            "system": "https://misistema.com/laboratorio/informes",
            "value": "INF-2024-000123"
          }
        ]
      }
    },
    {
      "name": "issues",
      "resource": {
        "resourceType": "OperationOutcome",
        "issue": [
          {
            "severity": "information",
            "code": "informational",
            "diagnostics": "Resource created successfully"
          }
        ]
      }
    }
  ]
}

Combinación de unicidad

La unicidad de un recurso está determinada por la combinación de los siguientes tres elementos:

  • Tenant: Organización autenticada mediante OAuth 2.0 (se determina automáticamente a partir del token de acceso).
  • identifier.system: URI del sistema de identificación.
  • identifier.value: Identificador único del recurso dentro del sistema.

Esta combinación es utilizada por la plataforma para prevenir registros duplicados. La misma combinación de system + value puede existir para distintas organizaciones, ya que el tenant las diferencia automáticamente y las aísla en espacios de nombres separados.

La documentación específica de cada recurso define la estructura particular del campo identifier.

Header If-None-Exist

El endpoint soporta opcionalmente el encabezado FHIR estándar If-None-Exist para compatibilidad con clientes FHIR existentes. Sin embargo, la garantía de idempotencia es responsabilidad del servidor y no depende de la presencia de este encabezado. La plataforma previene la duplicación incluso cuando el header no está presente.

Uso recomendado: El valor del header debe ser una expresión de búsqueda FHIR que identifique de forma única el recurso:

If-None-Exist: identifier=https://misistema.com/laboratorio/informes|INF-2024-000123

Donde el formato es identifier={system}|{value}.

Comportamiento:

EscenarioHeader If-None-ExistResultado
Recurso nuevo, no existe previamenteAusente201 Created - se crea el recurso
Recurso nuevo, no existe previamentePresente201 Created - se crea el recurso
Recurso ya existe para la misma combinaciónAusente201 Created - no se duplica
Recurso ya existe para la misma combinaciónPresente201 Created - no se duplica

La idempotencia está garantizada por el servidor independientemente del header If-None-Exist. El header se ofrece únicamente para compatibilidad con clientes FHIR estándar que lo requieran.

Documentación de Quralo