> ## Documentation Index
> Fetch the complete documentation index at: https://omniloy.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Ejemplos Prácticos

> Ejemplos clínicos reales usando la API Codify de SofIA para codificación diagnóstica, notas clínicas y procesamiento PDF

Esta página contiene ejemplos completos de uso de la API para diferentes casos de uso clínicos.

***

## Ejemplo 1: Codificación de diagnósticos y procedimientos

### Caso de uso

Extraer códigos CIE-10 de diagnósticos y procedimientos de una nota clínica para generar el CMBD automáticamente.

### Texto de entrada (JSON)

**Nota:** La API acepta tanto texto plano como JSON stringificado. En este ejemplo enviamos un objeto JSON completo como string.

```json theme={null}
{
  "informe_urgencias": {
    "fecha": "19/10/2025",
    "servicio": "Urgencias",
    "paciente": {
      "edad": 45,
      "sexo": "Varón"
    },
    "motivo_consulta": "Fiebre y malestar general",
    "antecedentes_personales": "No referidos de interés",
    "enfermedad_actual": "Paciente masculino de 45 años que acude al servicio de urgencias por presentar fiebre alta de hasta 39 °C, tos seca y malestar general de tres días de evolución. Niega disnea intensa ni dolor torácico pleurítico.",
    "exploracion_fisica": {
      "constantes_vitales": {
        "ta": "125/80 mmHg",
        "fc": "92 lpm",
        "fr": "20 rpm",
        "temperatura": "39 °C",
        "sato2": "95% basal"
      },
      "auscultacion_pulmonar": "Disminución del murmullo vesicular y crepitantes en base pulmonar derecha",
      "resto": "Dentro de la normalidad"
    },
    "pruebas_complementarias": {
      "radiografia_torax": "Infiltrado alveolar localizado en lóbulo inferior derecho compatible con neumonía lobar derecha"
    },
    "diagnostico": "Neumonía lobar derecha adquirida en la comunidad",
    "tratamiento_urgencias": [
      "Antitérmico oral",
      "Primera dosis de antibiótico administrada en el servicio"
    ],
    "tratamiento_alta": [
      "Amoxicilina-clavulánico 875/125 mg cada 8 horas durante 7 días",
      "Control evolutivo por su médico de atención primaria o reconsulta en urgencias ante empeoramiento clínico"
    ],
    "evolucion": "Paciente estable hemodinámicamente, con mejoría parcial tras tratamiento sintomático en urgencias. Se decide alta con tratamiento y recomendaciones."
  }
}
```

### Esquema JSON

[Ver archivo completo](/sofia/es/api/snippets#esquema-json)

```json theme={null}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "diagnosis_and_procedures/v1",
  "type": "object",
  "required": ["diags", "procs"],
  "properties": {
    "diags": {
      "type": "array",
      "description": "List of diagnosis codes (CIE10)",
      "items": {
        "type": "string",
        "source": "CIE-10-MC-ES-2026"
      }
    },
    "procs": {
      "type": "array",
      "description": "List of procedure codes (CIE10-PCS)",
      "items": {
        "type": "string",
        "source": "CIE-10-PCS-ES-2026"
      }
    }
  }
}
```

### Petición completa

[Ver archivo completo](/sofia/es/api/snippets#petición-completa)

**Importante:** Cuando envías JSON estructurado, debes convertirlo a string con `JSON.stringify()`.

```python theme={null}
import json
import requests

# El informe estructurado como JSON
informe_json = {
    "informe_urgencias": {
        "fecha": "19/10/2025",
        "servicio": "Urgencias",
        "paciente": {"edad": 45, "sexo": "Varón"},
        "motivo_consulta": "Fiebre y malestar general",
        "enfermedad_actual": "Paciente masculino de 45 años que acude al servicio de urgencias por presentar fiebre alta de hasta 39 °C, tos seca y malestar general de tres días de evolución.",
        "exploracion_fisica": {
            "constantes_vitales": {
                "ta": "125/80 mmHg",
                "fc": "92 lpm",
                "temperatura": "39 °C"
            },
            "auscultacion_pulmonar": "Disminución del murmullo vesicular y crepitantes en base pulmonar derecha"
        },
        "pruebas_complementarias": {
            "radiografia_torax": "Infiltrado alveolar compatible con neumonía lobar derecha"
        },
        "diagnostico": "Neumonía lobar derecha adquirida en la comunidad"
    }
}

# Convertir el JSON a string para enviarlo como input
payload = {
    "input": json.dumps(informe_json, ensure_ascii=False),  # JSON stringificado
    "json_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": ["diags", "procs"],
        "properties": {
            "diags": {
                "type": "array",
                "items": {"type": "string", "source": "CIE-10-MC-ES-2026"}
            },
            "procs": {
                "type": "array",
                "items": {"type": "string", "source": "CIE-10-PCS-ES-2026"}
            }
        }
    },
    "configure": "Codifica únicamente con códigos válidos. No inventes. Si hay duda, deja vacío.",
    "target_language": "es-ES",
    "metadata": {
        "encounter_type": "emergency",
        "site": "Urgencias Hospital General"
    }
}

response = requests.post(
    "https://{tu-endpoint}/v1/codify",
    json=payload,
    headers={
        "Authorization": "Bearer TU_TOKEN",
        "x-doctor": "dr_123",
        "x-patient": "pt_456"
    }
)

result = response.json()
print(f"Diagnósticos: {result['data']['diags']}")
print(f"Procedimientos: {result['data']['procs']}")
```

### Respuesta

[Ver archivo completo](/sofia/es/api/snippets#respuesta)

```json theme={null}
{
  "data": {
    "diags": ["J18.1"],
    "procs": ["0B9D0ZX"]
  },
  "run_id": "run_abc123"
}
```

**Interpretación:**

* **J18.1**: Neumonía lobar, no especificada
* **0B9D0ZX**: Drenaje de pleura derecha, vía percutánea, enfoque diagnóstico

***

## Ejemplo 2: Extracción desde formato FHIR

### Caso de uso

Procesar datos clínicos ya estructurados en formato FHIR (Fast Healthcare Interoperability Resources) y extraer códigos diagnósticos simplificados o información agregada.

**Nota:** La API también puede recibir JSON FHIR como entrada para extraer/transformar información específica.

### Texto de entrada (Bundle FHIR como JSON)

```json theme={null}
{
  "resourceType": "Bundle",
  "type": "collection",
  "entry": [
    {
      "resource": {
        "resourceType": "Patient",
        "id": "patient-001",
        "name": [
          {
            "family": "García",
            "given": ["Ana", "María"]
          }
        ],
        "birthDate": "1978-03-15",
        "gender": "female"
      }
    },
    {
      "resource": {
        "resourceType": "Encounter",
        "id": "encounter-001",
        "status": "finished",
        "class": {
          "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
          "code": "AMB",
          "display": "ambulatory"
        },
        "period": {
          "start": "2025-10-19T10:00:00Z",
          "end": "2025-10-19T10:30:00Z"
        }
      }
    },
    {
      "resource": {
        "resourceType": "Condition",
        "id": "condition-diabetes",
        "clinicalStatus": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
              "code": "active"
            }
          ]
        },
        "code": {
          "coding": [
            {
              "system": "http://snomed.info/sct",
              "code": "44054006",
              "display": "Diabetes mellitus type 2"
            },
            {
              "system": "http://hl7.org/fhir/sid/icd-10",
              "code": "E11.9",
              "display": "Diabetes mellitus tipo 2 sin complicaciones"
            }
          ]
        },
        "subject": {
          "reference": "Patient/patient-001"
        }
      }
    },
    {
      "resource": {
        "resourceType": "Condition",
        "id": "condition-hta",
        "clinicalStatus": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
              "code": "active"
            }
          ]
        },
        "code": {
          "coding": [
            {
              "system": "http://snomed.info/sct",
              "code": "38341003",
              "display": "Hypertensive disorder"
            },
            {
              "system": "http://hl7.org/fhir/sid/icd-10",
              "code": "I10",
              "display": "Hipertensión esencial (primaria)"
            }
          ]
        },
        "subject": {
          "reference": "Patient/patient-001"
        }
      }
    },
    {
      "resource": {
        "resourceType": "Observation",
        "id": "obs-glucosa",
        "status": "final",
        "code": {
          "coding": [
            {
              "system": "http://loinc.org",
              "code": "2339-0",
              "display": "Glucose [Mass/volume] in Blood"
            }
          ]
        },
        "subject": {
          "reference": "Patient/patient-001"
        },
        "effectiveDateTime": "2025-10-19T10:15:00Z",
        "valueQuantity": {
          "value": 185,
          "unit": "mg/dL",
          "system": "http://unitsofmeasure.org",
          "code": "mg/dL"
        },
        "interpretation": [
          {
            "coding": [
              {
                "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation",
                "code": "H",
                "display": "High"
              }
            ]
          }
        ]
      }
    }
  ]
}
```

### Esquema JSON para extraer resumen

```json theme={null}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "fhir_extraction/v1",
  "type": "object",
  "required": ["paciente", "diagnosticos_activos", "observaciones_relevantes"],
  "properties": {
    "paciente": {
      "type": "object",
      "properties": {
        "nombre_completo": {
          "type": "string",
          "description": "Nombre completo del paciente"
        },
        "edad": {
          "type": "integer",
          "description": "Edad calculada a partir de la fecha de nacimiento"
        },
        "sexo": {
          "type": "string",
          "enum": ["masculino", "femenino", "otro"]
        }
      }
    },
    "diagnosticos_activos": {
      "type": "array",
      "description": "Lista de diagnósticos activos con códigos CIE-10",
      "items": {
        "type": "object",
        "properties": {
          "codigo_cie10": {
            "type": "string",
            "source": "CIE-10-MC-ES-2026"
          },
          "descripcion": {
            "type": "string"
          }
        }
      }
    },
    "observaciones_relevantes": {
      "type": "array",
      "description": "Observaciones clínicas importantes",
      "items": {
        "type": "object",
        "properties": {
          "tipo": {
            "type": "string",
            "description": "Tipo de observación (laboratorio, constante vital, etc.)"
          },
          "nombre": {
            "type": "string"
          },
          "valor": {
            "type": "string"
          },
          "interpretacion": {
            "type": "string",
            "description": "Normal, Alto, Bajo, etc."
          }
        }
      }
    },
    "resumen_clinico": {
      "type": "string",
      "description": "Resumen narrativo de la consulta"
    }
  }
}
```

### Petición

```python theme={null}
import json
import requests

# Bundle FHIR completo
fhir_bundle = {
    "resourceType": "Bundle",
    "type": "collection",
    "entry": [
        # ... (el bundle FHIR completo de arriba)
    ]
}

# Convertir FHIR a string
payload = {
    "input": json.dumps(fhir_bundle, ensure_ascii=False),  # FHIR stringificado
    "json_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "required": ["paciente", "diagnosticos_activos"],
        "properties": {
            "paciente": {
                "type": "object",
                "properties": {
                    "nombre_completo": {"type": "string"},
                    "edad": {"type": "integer"},
                    "sexo": {"type": "string"}
                }
            },
            "diagnosticos_activos": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "codigo_cie10": {
                            "type": "string",
                            "source": "CIE-10-MC-ES-2026"
                        },
                        "descripcion": {"type": "string"}
                    }
                }
            },
            "observaciones_relevantes": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "tipo": {"type": "string"},
                        "nombre": {"type": "string"},
                        "valor": {"type": "string"},
                        "interpretacion": {"type": "string"}
                    }
                }
            },
            "resumen_clinico": {"type": "string"}
        }
    },
    "configure": "Extrae información del bundle FHIR y simplifica a formato legible. Mantén los códigos CIE-10 cuando estén disponibles.",
    "target_language": "es-ES"
}

response = requests.post(
    "https://{tu-endpoint}/v1/codify",
    json=payload,
    headers={
        "Authorization": "Bearer TU_TOKEN",
        "x-doctor": "dr_123",
        "x-patient": "pt_001"
    }
)

result = response.json()
print(json.dumps(result['data'], indent=2, ensure_ascii=False))
```

### Respuesta

```json theme={null}
{
  "data": {
    "paciente": {
      "nombre_completo": "Ana María García",
      "edad": 47,
      "sexo": "femenino"
    },
    "diagnosticos_activos": [
      {
        "codigo_cie10": "E11.9",
        "descripcion": "Diabetes mellitus tipo 2 sin complicaciones"
      },
      {
        "codigo_cie10": "I10",
        "descripcion": "Hipertensión esencial (primaria)"
      }
    ],
    "observaciones_relevantes": [
      {
        "tipo": "Laboratorio",
        "nombre": "Glucosa en sangre",
        "valor": "185 mg/dL",
        "interpretacion": "Alto"
      }
    ],
    "resumen_clinico": "Paciente femenina de 47 años con diabetes mellitus tipo 2 e hipertensión esencial en seguimiento. Última glucemia elevada (185 mg/dL). Requiere ajuste de tratamiento."
  },
  "run_id": "run_fhir_extract_001"
}
```

**Casos de uso con FHIR:**

* Simplificar bundles FHIR complejos a reportes legibles
* Extraer códigos específicos (CIE-10, SNOMED, LOINC) de recursos FHIR
* Generar resúmenes narrativos desde datos estructurados FHIR
* Convertir entre versiones de FHIR/HL7 o normalizar códigos
* Validar coherencia entre códigos SNOMED y CIE-10 en recursos FHIR

***

## Ejemplo 3: Nota clínica estructurada

### Caso de uso

Extraer campos estructurados de una consulta médica (motivo, enfermedad actual, plan de tratamiento, constantes vitales, etc.) para documentación automática del EHR.

### Texto de entrada

```
Paciente femenina de 29 años con odinofagia, fiebre 38.5°C desde hace 2 días. 
Exploración: placas amigdalares, adenopatías cervicales sensibles, sin exantema. 
Tratamiento: ibuprofeno y reposo. Se sugiere test de antígeno.
```

### Esquema JSON

[Ver archivo completo](/sofia/es/api/snippets#esquema-json-nota-clinica)

```json theme={null}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "clinical_note/v1",
  "type": "object",
  "required": ["motivo_de_consulta", "enfermedad_actual", "plan_de_tratamientos"],
  "properties": {
    "dia_actual": {"type": "string"},
    "proxima_cita": {"type": "string"},
    "motivo_de_consulta": {"type": "string"},
    "resumen": {"type": "string"},
    "enfermedad_actual": {"type": "string"},
    "comentarios_observaciones": {"type": "string"},
    "plan_de_tratamientos": {"type": "string"},
    "peticiones": {"type": "string"},
    "constantes_vitales": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "nombre": {"type": "string"},
          "valor": {"type": "string"},
          "unidad": {"type": "string"},
          "momento": {"type": "string", "format": "date-time"}
        }
      }
    }
  }
}
```

### Petición

[Ver archivo completo](/sofia/es/api/snippets#peticion-nota-clinica)

```python theme={null}
import requests

payload = {
    "input": """Paciente femenina de 29 años con odinofagia, fiebre 38.5°C desde hace 2 días. 
Exploración: placas amigdalares, adenopatías cervicales sensibles, sin exantema. 
Tratamiento: ibuprofeno y reposo. Se sugiere test de antígeno.""",
    "json_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "title": "clinical_note/v1",
        "type": "object",
        "required": ["motivo_de_consulta", "enfermedad_actual", "plan_de_tratamientos"],
        "properties": {
            "dia_actual": {"type": "string"},
            "proxima_cita": {"type": "string"},
            "motivo_de_consulta": {"type": "string"},
            "resumen": {"type": "string"},
            "enfermedad_actual": {"type": "string"},
            "comentarios_observaciones": {"type": "string"},
            "plan_de_tratamientos": {"type": "string"},
            "peticiones": {"type": "string"},
            "constantes_vitales": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "nombre": {"type": "string"},
                        "valor": {"type": "string"},
                        "unidad": {"type": "string"},
                        "momento": {"type": "string", "format": "date-time"}
                    }
                }
            }
        }
    },
    "target_language": "es-ES"
}

response = requests.post(
    "https://{tu-endpoint}/v1/codify",
    json=payload,
    headers={
        "Authorization": "Bearer TU_TOKEN",
        "x-doctor": "dr_234",
        "x-patient": "pt_567"
    }
)

result = response.json()
print(result['data'])
```

### Respuesta

[Ver archivo completo](/sofia/es/api/snippets#respuesta-nota-clinica)

```json theme={null}
{
  "data": {
    "dia_actual": "2025-10-19T09:45:00Z",
    "proxima_cita": "",
    "motivo_de_consulta": "Dolor de garganta y fiebre de 2 días",
    "resumen": "Faringoamigdalitis probable; inicio de ibuprofeno, reposo e hidratación; considerar test de antígeno.",
    "enfermedad_actual": "Dolor faríngeo, fiebre 38.5°C, odinofagia. Placas amigdalares, adenopatías cervicales.",
    "comentarios_observaciones": "Buen estado general, sin exantema.",
    "plan_de_tratamientos": "Ibuprofeno 400 mg cada 8h por 3 días; reposo; hidratación.",
    "peticiones": "Test rápido de antígeno para estreptococo si disponible.",
    "constantes_vitales": [
      {
        "nombre": "temperatura",
        "valor": "38.5",
        "unidad": "°C",
        "momento": "2025-10-19T09:40:00Z"
      }
    ]
  },
  "run_id": "run_def789"
}
```

***

## Ejemplo 4: Extracción para registro de oncología

### Caso de uso

Alimentar automáticamente un registro de oncología con datos extraídos de notas clínicas.

### Texto de entrada

```
Paciente diagnosticada de adenocarcinoma de mama izquierda. Estadio T2N1M0 
(estadio IIA). Receptores hormonales positivos (ER+, PR+), HER2 negativo. 
Se inicia protocolo de quimioterapia neoadyuvante con AC-T (adriamicina, 
ciclofosfamida seguido de taxanos). Programada cirugía conservadora tras 
respuesta favorable a QT.
```

### Esquema JSON

```json theme={null}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "registro_oncologia/v1",
  "type": "object",
  "required": ["diagnostico", "localizacion", "estadio_tnm"],
  "properties": {
    "diagnostico": {
      "type": "string",
      "description": "Diagnóstico histológico"
    },
    "codigo_cie10": {
      "type": "string",
      "source": "CIE-10-MC-ES-2026"
    },
    "localizacion": {
      "type": "string",
      "description": "Localización anatómica del tumor"
    },
    "estadio_tnm": {
      "type": "object",
      "properties": {
        "t": {"type": "string"},
        "n": {"type": "string"},
        "m": {"type": "string"},
        "estadio": {"type": "string"}
      }
    },
    "biomarcadores": {
      "type": "object",
      "properties": {
        "receptores_estrogenicos": {"type": "string"},
        "receptores_progesterona": {"type": "string"},
        "her2": {"type": "string"}
      }
    },
    "tratamiento_planificado": {
      "type": "string"
    },
    "protocolo_quimioterapia": {
      "type": "string"
    }
  }
}
```

### Respuesta esperada

```json theme={null}
{
  "data": {
    "diagnostico": "Adenocarcinoma de mama",
    "codigo_cie10": "C50.9",
    "localizacion": "mama izquierda",
    "estadio_tnm": {
      "t": "T2",
      "n": "N1",
      "m": "M0",
      "estadio": "IIA"
    },
    "biomarcadores": {
      "receptores_estrogenicos": "positivo",
      "receptores_progesterona": "positivo",
      "her2": "negativo"
    },
    "tratamiento_planificado": "Quimioterapia neoadyuvante seguida de cirugía conservadora",
    "protocolo_quimioterapia": "AC-T (adriamicina, ciclofosfamida seguido de taxanos)"
  },
  "run_id": "run_onco_001"
}
```

### Petición

```python theme={null}
import requests

payload = {
    "input": """Paciente diagnosticada de adenocarcinoma de mama izquierda. Estadio T2N1M0 
(estadio IIA). Receptores hormonales positivos (ER+, PR+), HER2 negativo. 
Se inicia protocolo de quimioterapia neoadyuvante con AC-T (adriamicina, 
ciclofosfamida seguido de taxanos). Programada cirugía conservadora tras 
respuesta favorable a QT.""",
    "json_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "title": "registro_oncologia/v1",
        "type": "object",
        "required": ["diagnostico", "localizacion", "estadio_tnm"],
        "properties": {
            "diagnostico": {"type": "string"},
            "codigo_cie10": {"type": "string", "source": "CIE-10-MC-ES-2026"},
            "localizacion": {"type": "string"},
            "estadio_tnm": {
                "type": "object",
                "properties": {
                    "t": {"type": "string"},
                    "n": {"type": "string"},
                    "m": {"type": "string"},
                    "estadio": {"type": "string"}
                }
            },
            "biomarcadores": {
                "type": "object",
                "properties": {
                    "receptores_estrogenicos": {"type": "string"},
                    "receptores_progesterona": {"type": "string"},
                    "her2": {"type": "string"}
                }
            },
            "tratamiento_planificado": {"type": "string"},
            "protocolo_quimioterapia": {"type": "string"}
        }
    },
    "target_language": "es-ES"
}

response = requests.post(
    "https://{tu-endpoint}/v1/codify",
    json=payload,
    headers={
        "Authorization": "Bearer TU_TOKEN",
        "x-doctor": "dr_345",
        "x-patient": "pt_678"
    }
)

result = response.json()
print(result['data'])
```

### Respuesta esperada

```json theme={null}
{
  "data": {
    "diagnostico": "Adenocarcinoma de mama",
    "codigo_cie10": "C50.9",
    "localizacion": "mama izquierda",
    "estadio_tnm": {
      "t": "T2",
      "n": "N1",
      "m": "M0",
      "estadio": "IIA"
    },
    "biomarcadores": {
      "receptores_estrogenicos": "positivo",
      "receptores_progesterona": "positivo",
      "her2": "negativo"
    },
    "tratamiento_planificado": "Quimioterapia neoadyuvante seguida de cirugía conservadora",
    "protocolo_quimioterapia": "AC-T (adriamicina, ciclofosfamida seguido de taxanos)"
  },
  "run_id": "run_onco_001"
}
```

***

## Ejemplo 5: Extracción de medicación

### Caso de uso

Extraer medicación prescrita con códigos del sistema de farmacia del hospital (Botplus).

### Texto de entrada

```
Se prescribe enalapril 10 mg cada 12 horas vía oral, atorvastatina 20 mg 
cada noche vía oral, y metformina 850 mg cada 8 horas con las comidas. 
Continuar con AAS 100 mg en desayuno.
```

### Esquema JSON con fuente custom

```json theme={null}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "medicamentos": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "nombre": {
            "type": "string",
            "description": "Nombre del medicamento"
          },
          "codigo_botplus": {
            "type": "string",
            "source": "BOTPLUS-2024",
            "description": "Código Botplus del medicamento"
          },
          "dosis": {
            "type": "string",
            "description": "Dosis prescrita"
          },
          "frecuencia": {
            "type": "string",
            "description": "Frecuencia de administración"
          },
          "via": {
            "type": "string",
            "enum": ["oral", "iv", "im", "sc", "topica", "inhalada"],
            "description": "Vía de administración"
          },
          "indicaciones_administracion": {
            "type": "string",
            "description": "Indicaciones especiales (ej: con comidas)"
          }
        }
      }
    }
  }
}
```

### Petición

```python theme={null}
import requests

payload = {
    "input": """Se prescribe enalapril 10 mg cada 12 horas vía oral, atorvastatina 20 mg 
cada noche vía oral, y metformina 850 mg cada 8 horas con las comidas. 
Continuar con AAS 100 mg en desayuno.""",
    "json_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "type": "object",
        "properties": {
            "medicamentos": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "nombre": {"type": "string"},
                        "codigo_botplus": {
                            "type": "string",
                            "source": "BOTPLUS-2024"
                        },
                        "dosis": {"type": "string"},
                        "frecuencia": {"type": "string"},
                        "via": {
                            "type": "string",
                            "enum": ["oral", "iv", "im", "sc", "topica", "inhalada"]
                        },
                        "indicaciones_administracion": {"type": "string"}
                    }
                }
            }
        }
    },
    "configure": "Extrae todos los medicamentos con códigos Botplus exactos. No inventes códigos.",
    "target_language": "es-ES"
}

response = requests.post(
    "https://{tu-endpoint}/v1/codify",
    json=payload,
    headers={
        "Authorization": "Bearer TU_TOKEN",
        "x-doctor": "dr_456",
        "x-patient": "pt_789"
    }
)

result = response.json()
print(result['data'])
```

### Respuesta esperada

```json theme={null}
{
  "data": {
    "medicamentos": [
      {
        "nombre": "Enalapril",
        "codigo_botplus": "652302",
        "dosis": "10 mg",
        "frecuencia": "cada 12 horas",
        "via": "oral",
        "indicaciones_administracion": ""
      },
      {
        "nombre": "Atorvastatina",
        "codigo_botplus": "663798",
        "dosis": "20 mg",
        "frecuencia": "cada noche",
        "via": "oral",
        "indicaciones_administracion": ""
      },
      {
        "nombre": "Metformina",
        "codigo_botplus": "651077",
        "dosis": "850 mg",
        "frecuencia": "cada 8 horas",
        "via": "oral",
        "indicaciones_administracion": "con las comidas"
      },
      {
        "nombre": "Ácido acetilsalicílico",
        "codigo_botplus": "651449",
        "dosis": "100 mg",
        "frecuencia": "cada 24 horas",
        "via": "oral",
        "indicaciones_administracion": "en desayuno"
      }
    ]
  },
  "run_id": "run_med_001"
}
```

***

## Ejemplo 6: Batch processing de múltiples notas

### Caso de uso

Procesar múltiples notas clínicas en paralelo para generar CMBD de todos los episodios cerrados del día.

### Código Python

```python theme={null}
import requests
import concurrent.futures
from typing import List, Dict

API_URL = "https://your-endpoint/v1/codify"
API_TOKEN = "your-token"

CMBD_SCHEMA = {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "required": ["diagnostico_principal", "procedimientos"],
    "properties": {
        "diagnostico_principal": {
            "type": "string",
            "source": "CIE-10-MC-ES-2026"
        },
        "diagnosticos_secundarios": {
            "type": "array",
            "items": {"type": "string", "source": "CIE-10-MC-ES-2026"}
        },
        "procedimientos": {
            "type": "array",
            "items": {"type": "string", "source": "CIE-10-PCS-ES-2026"}
        }
    }
}

def codify_note(note_data: Dict) -> Dict:
    """Codifica una nota clínica"""
    headers = {
        "Authorization": f"Bearer {API_TOKEN}",
        "Content-Type": "application/json",
        "x-doctor": note_data.get("doctor_id"),
        "x-patient": note_data.get("patient_id")
    }
    
    payload = {
        "input": note_data["text"],
        "json_schema": CMBD_SCHEMA,
        "target_language": "es-ES",
        "metadata": {
            "episode_id": note_data["episode_id"],
            "idempotency_key": f"episode_{note_data['episode_id']}_cmbd"
        }
    }
    
    response = requests.post(API_URL, json=payload, headers=headers, timeout=30)
    response.raise_for_status()
    
    result = response.json()
    return {
        "episode_id": note_data["episode_id"],
        "cmbd": result["data"],
        "run_id": result["run_id"]
    }

def process_batch(notes: List[Dict], max_workers: int = 10) -> List[Dict]:
    """Procesa múltiples notas en paralelo"""
    with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = [executor.submit(codify_note, note) for note in notes]
        results = []
        
        for future in concurrent.futures.as_completed(futures):
            try:
                result = future.result()
                results.append(result)
                print(f"✅ Episodio {result['episode_id']} procesado")
            except Exception as e:
                print(f"❌ Error: {e}")
        
        return results

# Uso
if __name__ == "__main__":
    # Obtener notas pendientes de codificación
    pending_notes = [
        {
            "episode_id": "EP001",
            "text": "Paciente con IAM anterior...",
            "doctor_id": "dr_123",
            "patient_id": "pt_456"
        },
        {
            "episode_id": "EP002",
            "text": "Paciente con fractura de cadera...",
            "doctor_id": "dr_124",
            "patient_id": "pt_457"
        },
        # ... más notas
    ]
    
    results = process_batch(pending_notes)
    print(f"\n✅ Procesados {len(results)} episodios")
    
    # Guardar en base de datos
    for result in results:
        save_cmbd_to_database(result["episode_id"], result["cmbd"])
```

***

## Próximos pasos

<Columns cols={3}>
  <Card title="Guía de JSON Schema" icon="wrench" href="/sofia/es/api/json-schema">
    Aprende a crear tus propios esquemas
  </Card>

  <Card title="Manejo de errores" icon="gear" href="/sofia/es/api/operations">
    Qué hacer cuando algo falla
  </Card>

  <Card title="Referencia OpenAPI" icon="book" href="/api-reference/codify-clinical-text-into-a-json-structure-you-define">
    Especificación completa con más ejemplos
  </Card>
</Columns>
