Koskamo

DATASUS SIH/SUS MCP

An MCP server providing access to Brazil's public hospital admissions data (SIH/SUS) from 1992 to 2025. It allows agents to query ICD-10 causes, ICSAP indicators, hospitalization trends, and rates per 100,000 inhabitants using Streamable HTTP, with provenance blocks citing DATASUS in every response.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

DATASUS SIH/SUS MCP logo, by Sidney BissoliCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by Sidney Bissoli
MCP endpoint (Streamable HTTP)
https://sih.sidneybissoli.com/mcp
Vendor documentation

What its tools do

12 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

12 of 12 have a description · 12 of 12 declare behavior hints · 10 of 10 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Query hospital admissions for specific diseases and regions
  • Analyze ICSAP trends over time
  • Compare hospitalization rates between Brazilian states
  • Retrieve available data years and freshness

Source and maintenance

Community listingRegistry 1.8.2
Maintenance checked

Protocol and capabilities

Server
sih-br-mcp 1.8.2
MCP protocol negotiated in check
2025-11-25
Tools
12 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Brazilian hospital admissions from DATASUS SIH/SUS (AIH records, 1992-2025), read from pre-aggregated public cubes of the healthbr-data Parquet mirror, never from the FTP or TabNet: causes by ICD-10 chapter and group (ICD-9 before 1998), monthly series, ambulatory care sensitive conditions (ICSAP, the Brazilian list) and crude, age-specific or age-standardized rates per 100,000 by state and municipality. Every stratum carries admissions, length of stay, amount paid by SUS and deaths; every response carries a provenance block with the data vintage and the citation. Years and months are those of the ADMISSION date (DT_INTER), read from the billing months of that year plus the following ones — not the billing month; the most recent year is incomplete until its window closes and grows as hospitals bill late, and DATASUS re-edits files of past billing months, so every number is the version of the mirror's download (the provenance extraction date), not a final count. Typical flow: get_available_years first (which years each cube covers), then get_hospitalizations for counts by cause, place, age, sex and race, get_hospitalization_trends for monthly or annual series, get_hospitalization_rates and compare_regions for rates; get_icsap, get_icsap_indicators, rank_csap_groups and compare_icsap_trends for ICSAP; list_cid_chapters, list_csap_groups and classify_as_csap resolve codes and groups before querying. Do not use this server for individual AIH records, for variables the cubes do not carry (procedure performed, facility CNES, secondary diagnosis) or for other DATASUS systems (SIM, SINASC, SIA, SINAN): use microdatasus, PySUS or the healthbr-data mirror for those.

Tools

12 advertised

list_csap_groups — Grupos CSAP (Portaria 221/2008)
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lista os 19 grupos de Condições Sensíveis à Atenção Primária (CSAP) conforme Portaria MS/SAS 221/2008. Retorna código, nome e códigos CID-10 de cada grupo.

list_csap_groups input schema
{
  "type": "object",
  "properties": {
    "group_code": {
      "type": "string",
      "description": "Código do grupo específico (ex: 'g01'). Se omitido, retorna todos."
    },
    "include_cid_codes": {
      "type": "boolean",
      "description": "Se true, inclui lista de códigos CID-10 (default: false)"
    }
  },
  "additionalProperties": false
}
list_csap_groups output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "total_groups",
        "source",
        "groups"
      ]
    },
    {
      "required": [
        "group"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "error": {
      "type": "string",
      "description": "Grupo CSAP não encontrado"
    },
    "group": {
      "type": "object",
      "required": [
        "id",
        "code",
        "name_pt",
        "name_en",
        "diagnoses"
      ],
      "properties": {
        "id": {
          "type": "number",
          "description": "Número do grupo na Portaria, 1–19"
        },
        "code": {
          "type": "string",
          "description": "Código do grupo, g01–g19"
        },
        "name_en": {
          "type": "string",
          "description": "Nome em inglês"
        },
        "name_pt": {
          "type": "string",
          "description": "Nome em português"
        },
        "cid_codes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Todos os códigos CID-10 do grupo; só com `include_cid_codes: true`"
        },
        "diagnoses": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name",
              "cid10"
            ],
            "properties": {
              "name": {
                "type": "string",
                "description": "Diagnóstico"
              },
              "cid10": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Códigos CID-10 do diagnóstico"
              }
            },
            "additionalProperties": false
          },
          "description": "Diagnósticos que compõem o grupo, com seus códigos"
        }
      },
      "description": "O grupo pedido por `group_code`",
      "additionalProperties": false
    },
    "groups": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "code",
          "name",
          "cid_count"
        ],
        "properties": {
          "code": {
            "type": "string",
            "description": "Código do grupo, g01–g19"
          },
          "name": {
            "type": "string",
            "description": "Nome do grupo em português"
          },
          "cid_codes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Códigos CID-10 do grupo; só com `include_cid_codes: true`"
          },
          "cid_count": {
            "type": "number",
            "description": "Quantos códigos CID-10 compõem o grupo"
          }
        },
        "additionalProperties": false
      },
      "description": "Os 19 grupos, na ordem da Portaria"
    },
    "source": {
      "type": "string",
      "description": "Norma que define a lista (Portaria MS/SAS 221/2008)"
    },
    "provenance": {
      "type": "object",
      "required": [
        "source",
        "source_url",
        "data_vintage",
        "retrieved_at",
        "retrieval",
        "citation",
        "license"
      ],
      "properties": {
        "source": {
          "type": "string",
          "description": "Fonte oficial do dado"
        },
        "derived": {
          "type": "boolean",
          "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
        },
        "license": {
          "type": [
            "string",
            "null"
          ],
          "description": "Regime legal do dado (id SPDX quando há)"
        },
        "notices": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
        },
        "citation": {
          "type": "string",
          "description": "Citação pronta para uso"
        },
        "revision": {
          "type": "object",
          "required": [
            "status",
            "note"
          ],
          "properties": {
            "note": {
              "type": [
                "string",
                "null"
              ],
              "description": "O específico da fonte: o que revisa, quando, por quê"
            },
            "status": {
              "enum": [
                "current",
                "provisional",
                "final"
              ],
              "type": "string",
              "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
            }
          },
          "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
          "additionalProperties": false
        },
        "retrieval": {
          "oneOf": [
            {
              "type": "object",
              "required": [
                "requests",
                "attempts",
                "anomalies",
                "unstable"
              ],
              "properties": {
                "attempts": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                },
                "requests": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                },
                "unstable": {
                  "type": "boolean",
                  "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                },
                "anomalies": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "kind",
                      "count"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "timeout",
                          "network",
                          "http_4xx",
                          "http_5xx",
                          "rate_limited",
                          "malformed_body"
                        ],
                        "type": "string",
                        "description": "Classe da anomalia (vocabulário fechado do contrato)"
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 1,
                        "description": "Ocorrências desta classe na chamada"
                      }
                    },
                    "additionalProperties": false
                  },
                  "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                }
              },
              "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
        },
        "source_url": {
          "type": "string",
          "description": "URL canônica que reproduz a consulta ou localiza a fonte"
        },
        "data_vintage": {
          "type": [
            "string",
            "null"
          ],
          "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
        },
        "retrieved_at": {
          "type": "string",
          "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
        },
        "field_sources": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "fields",
              "source_url",
              "dataset_id",
              "data_vintage",
              "retrieved_at"
            ],
            "properties": {
              "fields": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Campos do payload atribuídos a esta sub-fonte"
              },
              "dataset_id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Identificador do conjunto da sub-fonte"
              },
              "source_url": {
                "type": "string",
                "description": "URL canônica da sub-fonte que originou estes campos"
              },
              "data_vintage": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Vintage/competência da sub-fonte"
              },
              "retrieved_at": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO-8601 da extração desta sub-fonte na origem"
              },
              "served_from_cache": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
              }
            },
            "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
            "additionalProperties": false
          },
          "minItems": 1,
          "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
        },
        "derivation_note": {
          "type": "string",
          "description": "Como o número foi calculado; presente junto com derived"
        }
      },
      "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
      "additionalProperties": false
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "total_groups": {
      "type": "number",
      "description": "Número de grupos na lista (19)"
    }
  },
  "description": "Os 19 grupos CSAP (lista completa) ou um grupo só, quando `group_code` é informado; `error` quando o código não existe",
  "additionalProperties": false
}
list_csap_groups annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_cid_chapters — Capítulos da CID-10
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lista os 22 capítulos da CID-10 com seus códigos e faixas de diagnóstico. Os cubos de 1992–1997 (diagnóstico em CID-9) trazem `cid_chapter` como o capítulo CID-10 equivalente (mapa por categoria em src/data/cid9-chapters.json).

list_cid_chapters input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_cid_chapters output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "total_chapters",
        "chapters"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "chapters": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "code",
          "roman",
          "range",
          "name_pt",
          "name_en"
        ],
        "properties": {
          "code": {
            "type": "string",
            "description": "Capítulo em algarismo romano (chave usada em `cid_chapter` é o número, 1–22)"
          },
          "range": {
            "type": "string",
            "description": "Intervalo de códigos CID-10 (ex.: A00-B99)"
          },
          "roman": {
            "type": "string",
            "description": "Capítulo em algarismo romano"
          },
          "name_en": {
            "type": "string",
            "description": "Nome em inglês"
          },
          "name_pt": {
            "type": "string",
            "description": "Nome em português"
          }
        },
        "additionalProperties": false
      },
      "description": "Os capítulos, na ordem da CID"
    },
    "provenance": {
      "type": "object",
      "required": [
        "source",
        "source_url",
        "data_vintage",
        "retrieved_at",
        "retrieval",
        "citation",
        "license"
      ],
      "properties": {
        "source": {
          "type": "string",
          "description": "Fonte oficial do dado"
        },
        "derived": {
          "type": "boolean",
          "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
        },
        "license": {
          "type": [
            "string",
            "null"
          ],
          "description": "Regime legal do dado (id SPDX quando há)"
        },
        "notices": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
        },
        "citation": {
          "type": "string",
          "description": "Citação pronta para uso"
        },
        "revision": {
          "type": "object",
          "required": [
            "status",
            "note"
          ],
          "properties": {
            "note": {
              "type": [
                "string",
                "null"
              ],
              "description": "O específico da fonte: o que revisa, quando, por quê"
            },
            "status": {
              "enum": [
                "current",
                "provisional",
                "final"
              ],
              "type": "string",
              "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
            }
          },
          "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
          "additionalProperties": false
        },
        "retrieval": {
          "oneOf": [
            {
              "type": "object",
              "required": [
                "requests",
                "attempts",
                "anomalies",
                "unstable"
              ],
              "properties": {
                "attempts": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                },
                "requests": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                },
                "unstable": {
                  "type": "boolean",
                  "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                },
                "anomalies": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "kind",
                      "count"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "timeout",
                          "network",
                          "http_4xx",
                          "http_5xx",
                          "rate_limited",
                          "malformed_body"
                        ],
                        "type": "string",
                        "description": "Classe da anomalia (vocabulário fechado do contrato)"
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 1,
                        "description": "Ocorrências desta classe na chamada"
                      }
                    },
                    "additionalProperties": false
                  },
                  "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                }
              },
              "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
        },
        "source_url": {
          "type": "string",
          "description": "URL canônica que reproduz a consulta ou localiza a fonte"
        },
        "data_vintage": {
          "type": [
            "string",
            "null"
          ],
          "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
        },
        "retrieved_at": {
          "type": "string",
          "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
        },
        "field_sources": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "fields",
              "source_url",
              "dataset_id",
              "data_vintage",
              "retrieved_at"
            ],
            "properties": {
              "fields": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Campos do payload atribuídos a esta sub-fonte"
              },
              "dataset_id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Identificador do conjunto da sub-fonte"
              },
              "source_url": {
                "type": "string",
                "description": "URL canônica da sub-fonte que originou estes campos"
              },
              "data_vintage": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Vintage/competência da sub-fonte"
              },
              "retrieved_at": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO-8601 da extração desta sub-fonte na origem"
              },
              "served_from_cache": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
              }
            },
            "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
            "additionalProperties": false
          },
          "minItems": 1,
          "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
        },
        "derivation_note": {
          "type": "string",
          "description": "Como o número foi calculado; presente junto com derived"
        }
      },
      "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
      "additionalProperties": false
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "total_chapters": {
      "type": "number",
      "description": "Número de capítulos (22)"
    }
  },
  "description": "Os 22 capítulos da CID-10 (versão 2019), com intervalo de códigos e nomes",
  "additionalProperties": false
}
list_cid_chapters annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_available_years — Anos disponíveis e frescor dos cubos
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retorna os anos disponíveis nos dados do SIH-SUS carregados e o frescor dos cubos em relação ao espelho healthbr-data (`freshness.status`: current, stale, unknown, pending ou disabled; quando stale, lista por ano as partições reeditadas pelo MS, regeneradas, retiradas ou novas na janela). Por ano, o que muda entre as eras do SIH: `race_available` (raça/cor só de 2008), `cid_revision` (9 = CID-9 de 6 dígitos em 1992–1997, 10 = CID-10; 1997 tem as duas), `icsap_list_revision` (cid9-derivada, não oficial, em 1992–1997), `uf_basis` (arquivo em 1992–1997, residencia de 1998), `municipality_available`, `currency` e `records_date_imputed`.

get_available_years input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_available_years output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "years",
        "data_range",
        "note",
        "race_available",
        "years_without_race",
        "cid_revision",
        "years_cid9",
        "icsap_available",
        "icsap_list_revision",
        "uf_basis",
        "years_uf_arquivo",
        "municipality_available",
        "currency",
        "records_date_imputed",
        "csap_universe",
        "population_years",
        "cubes_channel",
        "freshness"
      ]
    },
    {
      "required": [
        "error",
        "years"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "note": {
      "type": "string",
      "description": "Aviso sobre o que `years` significa"
    },
    "error": {
      "type": "string",
      "description": "Falha ao listar os anos"
    },
    "years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos com cubos Parquet presentes localmente"
    },
    "currency": {
      "type": "object",
      "description": "Moeda de `value` — chave é o ano (string)",
      "additionalProperties": {
        "type": [
          "array",
          "null"
        ],
        "items": {
          "type": "object",
          "required": [
            "from",
            "to",
            "code",
            "symbol",
            "name"
          ],
          "properties": {
            "to": {
              "type": "string",
              "description": "Última competência (AAAA-MM)"
            },
            "code": {
              "type": "string",
              "description": "Código ISO 4217 (BRE, BRR, BRL)"
            },
            "from": {
              "type": "string",
              "description": "Primeira competência (AAAA-MM)"
            },
            "name": {
              "type": "string",
              "description": "Nome da moeda"
            },
            "symbol": {
              "type": "string",
              "description": "Símbolo (Cr$, CR$, R$)"
            }
          },
          "additionalProperties": false
        },
        "description": "Moeda de `value` por competência; null quando o sidecar não informa"
      }
    },
    "uf_basis": {
      "type": "object",
      "description": "Base do eixo `uf` — chave é o ano (string)",
      "additionalProperties": {
        "enum": [
          "residencia",
          "arquivo"
        ],
        "description": "Base do eixo `uf`"
      }
    },
    "freshness": {
      "type": "object",
      "required": [
        "status",
        "checked_at",
        "method",
        "manifest_url",
        "manifest_last_updated_local",
        "manifest_last_updated_remote",
        "cubes",
        "error"
      ],
      "properties": {
        "cubes": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "cube_year",
              "reedited",
              "reprocessed",
              "removed",
              "new_in_window",
              "behind"
            ],
            "properties": {
              "behind": {
                "type": "boolean",
                "description": "true quando alguma lista acima tem item"
              },
              "removed": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Partições que saíram do manifesto"
              },
              "reedited": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Partições cujo .dbc de origem mudou (reedição do MS)"
              },
              "cube_year": {
                "type": "number",
                "description": "Ano do cubo"
              },
              "reprocessed": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Partições regeneradas pelo espelho"
              },
              "new_in_window": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Competências publicadas depois do build"
              }
            },
            "additionalProperties": false
          },
          "description": "Cubos atrasados frente ao espelho"
        },
        "error": {
          "type": [
            "string",
            "null"
          ],
          "description": "Erro da checagem; null quando não houve"
        },
        "method": {
          "enum": [
            "range",
            "full",
            null
          ],
          "description": "Como checou: sonda parcial ou manifesto inteiro"
        },
        "status": {
          "enum": [
            "disabled",
            "pending",
            "current",
            "stale",
            "unknown"
          ],
          "description": "Frescor dos cubos frente ao espelho"
        },
        "checked_at": {
          "type": [
            "string",
            "null"
          ],
          "description": "Instante (UTC) da última checagem; null se nunca terminou"
        },
        "manifest_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "URL do manifesto do espelho"
        },
        "manifest_last_updated_local": {
          "type": [
            "string",
            "null"
          ],
          "description": "Manifesto com que os cubos foram gerados"
        },
        "manifest_last_updated_remote": {
          "type": [
            "string",
            "null"
          ],
          "description": "Manifesto público lido agora"
        }
      },
      "description": "Frescor dos cubos locais frente ao espelho healthbr-data",
      "additionalProperties": false
    },
    "data_range": {
      "type": "object",
      "required": [
        "total_years"
      ],
      "properties": {
        "last_year": {
          "type": "number",
          "description": "Último ano local; ausente quando não há cubo"
        },
        "first_year": {
          "type": "number",
          "description": "Primeiro ano local; ausente quando não há cubo"
        },
        "total_years": {
          "type": "number",
          "description": "Quantos anos"
        }
      },
      "description": "Intervalo dos anos locais",
      "additionalProperties": false
    },
    "provenance": {
      "type": "object",
      "required": [
        "source",
        "source_url",
        "data_vintage",
        "retrieved_at",
        "retrieval",
        "citation",
        "license"
      ],
      "properties": {
        "source": {
          "type": "string",
          "description": "Fonte oficial do dado"
        },
        "derived": {
          "type": "boolean",
          "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
        },
        "license": {
          "type": [
            "string",
            "null"
          ],
          "description": "Regime legal do dado (id SPDX quando há)"
        },
        "notices": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
        },
        "citation": {
          "type": "string",
          "description": "Citação pronta para uso"
        },
        "revision": {
          "type": "object",
          "required": [
            "status",
            "note"
          ],
          "properties": {
            "note": {
              "type": [
                "string",
                "null"
              ],
              "description": "O específico da fonte: o que revisa, quando, por quê"
            },
            "status": {
              "enum": [
                "current",
                "provisional",
                "final"
              ],
              "type": "string",
              "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
            }
          },
          "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
          "additionalProperties": false
        },
        "retrieval": {
          "oneOf": [
            {
              "type": "object",
              "required": [
                "requests",
                "attempts",
                "anomalies",
                "unstable"
              ],
              "properties": {
                "attempts": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                },
                "requests": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                },
                "unstable": {
                  "type": "boolean",
                  "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                },
                "anomalies": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "kind",
                      "count"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "timeout",
                          "network",
                          "http_4xx",
                          "http_5xx",
                          "rate_limited",
                          "malformed_body"
                        ],
                        "type": "string",
                        "description": "Classe da anomalia (vocabulário fechado do contrato)"
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 1,
                        "description": "Ocorrências desta classe na chamada"
                      }
                    },
                    "additionalProperties": false
                  },
                  "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                }
              },
              "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
        },
        "source_url": {
          "type": "string",
          "description": "URL canônica que reproduz a consulta ou localiza a fonte"
        },
        "data_vintage": {
          "type": [
            "string",
            "null"
          ],
          "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
        },
        "retrieved_at": {
          "type": "string",
          "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
        },
        "field_sources": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "fields",
              "source_url",
              "dataset_id",
              "data_vintage",
              "retrieved_at"
            ],
            "properties": {
              "fields": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Campos do payload atribuídos a esta sub-fonte"
              },
              "dataset_id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Identificador do conjunto da sub-fonte"
              },
              "source_url": {
                "type": "string",
                "description": "URL canônica da sub-fonte que originou estes campos"
              },
              "data_vintage": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Vintage/competência da sub-fonte"
              },
              "retrieved_at": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO-8601 da extração desta sub-fonte na origem"
              },
              "served_from_cache": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
              }
            },
            "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
            "additionalProperties": false
          },
          "minItems": 1,
          "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
        },
        "derivation_note": {
          "type": "string",
          "description": "Como o número foi calculado; presente junto com derived"
        }
      },
      "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
      "additionalProperties": false
    },
    "years_cid9": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos em que o cubo usa CID-9 (1992–1997)"
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "cid_revision": {
      "type": "object",
      "description": "Internações por revisão da CID — chave é o ano (string)",
      "additionalProperties": {
        "type": "object",
        "description": "Revisão da CID (\"9\" ou \"10\") → internações",
        "additionalProperties": {
          "type": [
            "number",
            "null"
          ],
          "description": "Internações naquela revisão; null quando o sidecar não traz o total"
        }
      }
    },
    "csap_universe": {
      "type": "object",
      "description": "Universo do % ICSAP — chave é o ano (string)",
      "additionalProperties": {
        "type": [
          "object",
          "null"
        ],
        "required": [
          "method",
          "records_in_universe",
          "excluded"
        ],
        "properties": {
          "method": {
            "type": "string",
            "description": "Método (csapAIH)"
          },
          "excluded": {
            "type": "object",
            "description": "Motivo de exclusão → internações",
            "additionalProperties": {
              "type": "number",
              "description": "Internações fora do universo por este motivo"
            }
          },
          "records_in_universe": {
            "type": [
              "number",
              "null"
            ],
            "description": "Internações dentro do universo"
          }
        },
        "description": "Universo do % ICSAP como o csapAIH; null em cubo anterior ao builder 2.6.0",
        "additionalProperties": false
      }
    },
    "cubes_channel": {
      "type": "object",
      "required": [
        "enabled",
        "base_url",
        "published_years",
        "cache_dir",
        "manifest_source"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Como o cache baixa os anos pedidos"
        },
        "enabled": {
          "type": "boolean",
          "description": "false quando o cache de cubos está desligado"
        },
        "base_url": {
          "type": "string",
          "description": "URL do canal público de cubos"
        },
        "cache_dir": {
          "type": [
            "string",
            "null"
          ],
          "description": "Pasta do cache local; null quando desligado"
        },
        "manifest_source": {
          "enum": [
            "remote",
            "disk",
            "none",
            "disabled"
          ],
          "description": "De onde veio o manifesto"
        },
        "published_years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos publicados no manifesto do canal"
        },
        "manifest_generated_at": {
          "type": [
            "string",
            "null"
          ],
          "description": "Quando o manifesto foi gerado; null sem manifesto"
        }
      },
      "description": "Canal público dos cubos e cache local",
      "additionalProperties": false
    },
    "race_available": {
      "type": "object",
      "description": "Raça/cor disponível — chave é o ano (string)",
      "additionalProperties": {
        "type": "boolean",
        "description": "true quando o cubo tem raça/cor"
      }
    },
    "icsap_available": {
      "type": "object",
      "description": "ICSAP disponível — chave é o ano (string)",
      "additionalProperties": {
        "type": "boolean",
        "description": "true quando o cubo tem a marcação ICSAP"
      }
    },
    "population_years": {
      "type": [
        "object",
        "null"
      ],
      "required": [
        "first_year",
        "last_year",
        "detailed",
        "aggregated"
      ],
      "properties": {
        "detailed": {
          "type": [
            "object",
            "null"
          ],
          "required": [
            "first_year",
            "last_year",
            "source",
            "age"
          ],
          "properties": {
            "age": {
              "type": "string",
              "description": "Grão etário do arquivo"
            },
            "source": {
              "type": "string",
              "description": "Arquivo parquet que serve o intervalo"
            },
            "last_year": {
              "type": "number",
              "description": "Último ano coberto"
            },
            "age_groups": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Faixas etárias quinquenais (só no arquivo agregado)"
            },
            "first_year": {
              "type": "number",
              "description": "Primeiro ano coberto"
            }
          },
          "description": "pop_uf.parquet — idade simples por UF e sexo (projeções IBGE, 2000+)",
          "additionalProperties": false
        },
        "last_year": {
          "type": "number",
          "description": "Último ano com população por UF"
        },
        "aggregated": {
          "type": [
            "object",
            "null"
          ],
          "required": [
            "first_year",
            "last_year",
            "source",
            "age"
          ],
          "properties": {
            "age": {
              "type": "string",
              "description": "Grão etário do arquivo"
            },
            "source": {
              "type": "string",
              "description": "Arquivo parquet que serve o intervalo"
            },
            "last_year": {
              "type": "number",
              "description": "Último ano coberto"
            },
            "age_groups": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Faixas etárias quinquenais (só no arquivo agregado)"
            },
            "first_year": {
              "type": "number",
              "description": "Primeiro ano coberto"
            }
          },
          "description": "pop_uf_agregado.parquet — faixa etária quinquenal por UF e sexo (1991–1999)",
          "additionalProperties": false
        },
        "first_year": {
          "type": "number",
          "description": "Primeiro ano com população por UF (união dos dois arquivos)"
        }
      },
      "description": "Cobertura dos arquivos de população por UF: o que as ferramentas de taxa aceitam",
      "additionalProperties": false
    },
    "years_uf_arquivo": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos em que `uf` é a do estabelecimento (1992–1997)"
    },
    "years_without_race": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos sem raça/cor (1998–2007)"
    },
    "icsap_list_revision": {
      "type": "object",
      "description": "Lista ICSAP por revisão da CID — chave é o ano (string)",
      "additionalProperties": {
        "type": "object",
        "description": "Revisão → lista",
        "additionalProperties": {
          "type": "string",
          "description": "Lista usada (portaria-221-2008 ou cid9-derivada)"
        }
      }
    },
    "records_date_imputed": {
      "type": "object",
      "description": "Datas imputadas — chave é o ano (string)",
      "additionalProperties": {
        "type": "number",
        "description": "Internações que entraram com data imputada"
      }
    },
    "municipality_available": {
      "type": "object",
      "description": "Município disponível — chave é o ano (string)",
      "additionalProperties": {
        "type": "boolean",
        "description": "false quando `municipality_code` é nulo em todas as linhas"
      }
    }
  },
  "description": "Anos com cubo local, o que cada ano carrega (revisão da CID, raça/cor, município, moeda, universo ICSAP), cobertura da população, canal de cubos e frescor",
  "additionalProperties": false
}
get_available_years annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_hospitalizations — Internações do SUS com filtros
Advertised by the server during the last successful anonymous check.
Advertised read-only

Consulta dados de internações hospitalares do SUS com filtros flexíveis. Permite agregar por múltiplas dimensões (UF, CID, sexo, idade, raça, ano/mês). Raça/cor só existe de 2008 em diante: em 1998–2007 `race` é nulo (ver get_available_years.race_available). Série desde 1992: em 1992–1997 o diagnóstico é CID-9 decodificado por tabela (`cid_group` = categoria de 3 dígitos, `cid_chapter` = capítulo CID-10 equivalente; agrupar por `cid_revision` separa 9 e 10 — 1997 tem os dois), `uf` é a UF do ARQUIVO (estabelecimento), não de residência, e `value` é nominal na moeda da época — ver get_available_years (uf_basis, currency) e as `notes` da resposta. `exclusion` (agrupável) marca as internações fora do universo do % ICSAP do csapAIH (procedimento_obstetrico, parto, longa_permanencia; nula = dentro).

get_hospitalizations input schema
{
  "type": "object",
  "properties": {
    "uf": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Lista de UFs (ex: ['SP', 'RJ']). Se omitido, todas."
    },
    "sex": {
      "enum": [
        "M",
        "F"
      ],
      "type": "string",
      "description": "Filtrar por sexo"
    },
    "race": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Raça/cor (branca, preta, parda, amarela, indigena, ignorado). Só existe de 2008 em diante: em 1998–2007 race é nulo e o filtro não alcança esses anos."
    },
    "year": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Anos para consultar (ex: [2023, 2024]); série de 1992 em diante"
    },
    "limit": {
      "type": "integer",
      "description": "Limitar número de resultados"
    },
    "month": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Meses (1-12). Se omitido, todos."
    },
    "age_max": {
      "type": "integer",
      "description": "Idade máxima em anos"
    },
    "age_min": {
      "type": "integer",
      "description": "Idade mínima em anos"
    },
    "is_csap": {
      "type": "boolean",
      "description": "Filtrar apenas CSAP (true) ou não-CSAP (false)"
    },
    "group_by": {
      "type": "array",
      "items": {
        "enum": [
          "year",
          "month",
          "uf",
          "cid_chapter",
          "cid_revision",
          "cid_group",
          "sex",
          "age",
          "race",
          "exclusion",
          "is_csap",
          "csap_group"
        ],
        "type": "string"
      },
      "description": "Dimensões para agrupamento"
    },
    "cid_chapter": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Capítulos CID-10 (1-22). Se omitido, todos."
    }
  },
  "additionalProperties": false
}
get_hospitalizations output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "data",
        "summary",
        "filters_applied"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "n_hospitalizations",
          "total_days",
          "total_value",
          "deaths"
        ],
        "properties": {
          "uf": {
            "type": "string",
            "description": "UF de residência — do estabelecimento em 1992–1997 (group_by: uf)"
          },
          "age": {
            "type": "number",
            "description": "Idade em anos (group_by: age)"
          },
          "sex": {
            "type": "string",
            "description": "Sexo: M ou F (group_by: sex)"
          },
          "race": {
            "type": [
              "string",
              "null"
            ],
            "description": "Raça/cor; null em 1998–2007, quando a AIH não trazia o campo (group_by: race)"
          },
          "year": {
            "type": "number",
            "description": "Ano da internação (DT_INTER) — group_by: year"
          },
          "month": {
            "type": "number",
            "description": "Mês, 1–12 (group_by: month)"
          },
          "deaths": {
            "type": [
              "number",
              "null"
            ],
            "description": "Óbitos; null quando o recorte não tem nenhuma linha"
          },
          "is_csap": {
            "type": "boolean",
            "description": "Internação por condição sensível à atenção primária (group_by: is_csap)"
          },
          "cid_group": {
            "type": "string",
            "description": "Categoria CID de 3 dígitos (group_by: cid_group)"
          },
          "exclusion": {
            "type": [
              "string",
              "null"
            ],
            "description": "Motivo de exclusão do universo csapAIH; null quando dentro do universo (group_by: exclusion)"
          },
          "csap_group": {
            "type": [
              "string",
              "null"
            ],
            "description": "Grupo CSAP g01–g19; null quando a internação não é sensível (group_by: csap_group)"
          },
          "total_days": {
            "type": [
              "number",
              "null"
            ],
            "description": "Dias de permanência; null quando o recorte não tem nenhuma linha"
          },
          "cid_chapter": {
            "type": "number",
            "description": "Capítulo da CID, 1–22 (group_by: cid_chapter)"
          },
          "total_value": {
            "type": [
              "number",
              "null"
            ],
            "description": "Valor total pago (R$); null quando o recorte não tem nenhuma linha"
          },
          "cid_revision": {
            "type": "number",
            "description": "Revisão da CID do diagnóstico: 9 ou 10 (group_by: cid_revision)"
          },
          "n_hospitalizations": {
            "type": [
              "number",
              "null"
            ],
            "description": "Internações; null quando o recorte não tem nenhuma linha"
          }
        },
        "description": "Uma linha por combinação de `group_by` (só as colunas pedidas aparecem)",
        "additionalProperties": false
      },
      "description": "Linhas agrupadas (vazio no caminho de erro-mole)"
    },
    "note": {
      "type": "string",
      "description": "Como obter o dado (por exemplo, consultar get_available_years)"
    },
    "error": {
      "type": "string",
      "description": "Motivo pelo qual não há dados nesta resposta (ano sem dado, cobertura populacional, falha na consulta)"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Avisos que qualificam os números: era CID-9, raça/cor ausente, universo do % ICSAP, denominador populacional, truncamento"
    },
    "summary": {
      "type": "object",
      "required": [
        "total_hospitalizations",
        "total_days",
        "total_value",
        "deaths",
        "hospital_mortality_rate",
        "records_returned"
      ],
      "properties": {
        "deaths": {
          "type": "number",
          "description": "Óbitos"
        },
        "total_days": {
          "type": "number",
          "description": "Dias de permanência"
        },
        "total_value": {
          "type": "number",
          "description": "Valor pago (R$), duas casas"
        },
        "records_returned": {
          "type": "number",
          "description": "Linhas em `data`"
        },
        "total_hospitalizations": {
          "type": "number",
          "description": "Internações no recorte inteiro"
        },
        "hospital_mortality_rate": {
          "type": "number",
          "description": "Óbitos / internações × 100, duas casas"
        }
      },
      "description": "Totais do recorte inteiro (não do trecho devolvido, quando truncado)",
      "additionalProperties": false
    },
    "truncated": {
      "type": "object",
      "required": [
        "returned",
        "total"
      ],
      "properties": {
        "total": {
          "type": "number",
          "description": "Linhas que a consulta produziu"
        },
        "returned": {
          "type": "number",
          "description": "Linhas devolvidas (o teto)"
        }
      },
      "description": "Presente só quando `data` foi truncado no teto de linhas; os totais em `summary` são do conjunto inteiro",
      "additionalProperties": false
    },
    "provenance": {
      "type": "object",
      "required": [
        "source",
        "source_url",
        "data_vintage",
        "retrieved_at",
        "retrieval",
        "citation",
        "license"
      ],
      "properties": {
        "source": {
          "type": "string",
          "description": "Fonte oficial do dado"
        },
        "derived": {
          "type": "boolean",
          "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
        },
        "license": {
          "type": [
            "string",
            "null"
          ],
          "description": "Regime legal do dado (id SPDX quando há)"
        },
        "notices": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
        },
        "citation": {
          "type": "string",
          "description": "Citação pronta para uso"
        },
        "revision": {
          "type": "object",
          "required": [
            "status",
            "note"
          ],
          "properties": {
            "note": {
              "type": [
                "string",
                "null"
              ],
              "description": "O específico da fonte: o que revisa, quando, por quê"
            },
            "status": {
              "enum": [
                "current",
                "provisional",
                "final"
              ],
              "type": "string",
              "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
            }
          },
          "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
          "additionalProperties": false
        },
        "retrieval": {
          "oneOf": [
            {
              "type": "object",
              "required": [
                "requests",
                "attempts",
                "anomalies",
                "unstable"
              ],
              "properties": {
                "attempts": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                },
                "requests": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                },
                "unstable": {
                  "type": "boolean",
                  "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                },
                "anomalies": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "kind",
                      "count"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "timeout",
                          "network",
                          "http_4xx",
                          "http_5xx",
                          "rate_limited",
                          "malformed_body"
                        ],
                        "type": "string",
                        "description": "Classe da anomalia (vocabulário fechado do contrato)"
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 1,
                        "description": "Ocorrências desta classe na chamada"
                      }
                    },
                    "additionalProperties": false
                  },
                  "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                }
              },
              "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
        },
        "source_url": {
          "type": "string",
          "description": "URL canônica que reproduz a consulta ou localiza a fonte"
        },
        "data_vintage": {
          "type": [
            "string",
            "null"
          ],
          "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
        },
        "retrieved_at": {
          "type": "string",
          "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
        },
        "field_sources": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "fields",
              "source_url",
              "dataset_id",
              "data_vintage",
              "retrieved_at"
            ],
            "properties": {
              "fields": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Campos do payload atribuídos a esta sub-fonte"
              },
              "dataset_id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Identificador do conjunto da sub-fonte"
              },
              "source_url": {
                "type": "string",
                "description": "URL canônica da sub-fonte que originou estes campos"
              },
              "data_vintage": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Vintage/competência da sub-fonte"
              },
              "retrieved_at": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO-8601 da extração desta sub-fonte na origem"
              },
              "served_from_cache": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
              }
            },
            "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
            "additionalProperties": false
          },
          "minItems": 1,
          "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
        },
        "derivation_note": {
          "type": "string",
          "description": "Como o número foi calculado; presente junto com derived"
        }
      },
      "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
      "additionalProperties": false
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "filters_applied": {
      "type": "object",
      "properties": {
        "uf": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Lista de UFs (ex: ['SP', 'RJ']). Se omitido, todas."
        },
        "sex": {
          "enum": [
            "M",
            "F"
          ],
          "type": "string",
          "description": "Filtrar por sexo"
        },
        "race": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Raça/cor (branca, preta, parda, amarela, indigena, ignorado). Só existe de 2008 em diante: em 1998–2007 race é nulo e o filtro não alcança esses anos."
        },
        "year": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "Anos para consultar (ex: [2023, 2024]); série de 1992 em diante"
        },
        "limit": {
          "type": "integer",
          "description": "Limitar número de resultados"
        },
        "month": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "Meses (1-12). Se omitido, todos."
        },
        "age_max": {
          "type": "integer",
          "description": "Idade máxima em anos"
        },
        "age_min": {
          "type": "integer",
          "description": "Idade mínima em anos"
        },
        "is_csap": {
          "type": "boolean",
          "description": "Filtrar apenas CSAP (true) ou não-CSAP (false)"
        },
        "group_by": {
          "type": "array",
          "items": {
            "enum": [
              "year",
              "month",
              "uf",
              "cid_chapter",
              "cid_revision",
              "cid_group",
              "sex",
              "age",
              "race",
              "exclusion",
              "is_csap",
              "csap_group"
            ],
            "type": "string"
          },
          "description": "Dimensões para agrupamento"
        },
        "cid_chapter": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "Capítulos CID-10 (1-22). Se omitido, todos."
        }
      },
      "description": "Os argumentos recebidos, ecoados",
      "additionalProperties": false
    },
    "published_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos que o canal de cubos publica — a verdade do canal, distinta do que esta instância tem em disco; só com o cache de cubos ligado"
    },
    "available_sih_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos com dados SIH atendíveis por este servidor"
    },
    "years_not_available": {
      "type": "object",
      "required": [
        "years",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Quais anos ficaram fora e quais os números cobrem"
        },
        "years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos pedidos que não têm dados SIH e ficaram fora do resultado"
        }
      },
      "description": "Presente só quando parte dos anos pedidos não tem dado: os números cobrem apenas os anos atendidos",
      "additionalProperties": false
    }
  },
  "description": "Internações do cubo de causas, agrupadas conforme `group_by`, com totais do recorte inteiro; `error` quando nenhum ano pedido tem dado",
  "additionalProperties": false
}
get_hospitalizations annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_hospitalization_trends — Séries temporais de internações
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retorna séries temporais de internações (mensal ou anual). Útil para análise de tendências e sazonalidade. O ano e o mês são os da INTERNAÇÃO (DT_INTER), não a competência de faturamento; o ano mais recente cresce até a janela dele fechar (AIH faturada com atraso), e o DATASUS reedita arquivos de competências passadas — cada número é a versão do download do espelho. Série desde 1992; em 1992–1997 `uf` é a UF do arquivo (estabelecimento) e as internações sem data na fonte (1992-01..04 e 1993-01) entram no mês de faturamento — ver get_available_years e as `notes`.

get_hospitalization_trends input schema
{
  "type": "object",
  "required": [
    "year_start",
    "year_end"
  ],
  "properties": {
    "uf": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "UFs para filtrar"
    },
    "year_end": {
      "type": "integer",
      "description": "Ano final"
    },
    "year_start": {
      "type": "integer",
      "description": "Ano inicial"
    },
    "cid_chapter": {
      "type": "integer",
      "description": "Capítulo CID-10 específico"
    },
    "granularity": {
      "enum": [
        "monthly",
        "yearly"
      ],
      "type": "string",
      "description": "Granularidade temporal (default: yearly)"
    }
  },
  "additionalProperties": false
}
get_hospitalization_trends output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "granularity",
        "period",
        "series"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {},
      "description": "Sempre vazio: só aparece no caminho de erro-mole do funil"
    },
    "note": {
      "type": "string",
      "description": "Como obter o dado (por exemplo, consultar get_available_years)"
    },
    "error": {
      "type": "string",
      "description": "Motivo pelo qual não há dados nesta resposta (ano sem dado, cobertura populacional, falha na consulta)"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Avisos que qualificam os números: era CID-9, raça/cor ausente, universo do % ICSAP, denominador populacional, truncamento"
    },
    "period": {
      "type": "object",
      "required": [
        "start",
        "end"
      ],
      "properties": {
        "end": {
          "type": [
            "number",
            "string"
          ],
          "description": "Ano (anual) ou AAAA-MM (mensal) final"
        },
        "start": {
          "type": [
            "number",
            "string"
          ],
          "description": "Ano (anual) ou AAAA-MM (mensal) inicial"
        }
      },
      "description": "Intervalo pedido",
      "additionalProperties": false
    },
    "series": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "required": [
              "year",
              "n_hospitalizations",
              "deaths"
            ],
            "properties": {
              "year": {
                "type": "number",
                "description": "Ano da internação (DT_INTER)"
              },
              "deaths": {
                "type": "number",
                "description": "Óbitos no ano"
              },
              "n_hospitalizations": {
                "type": "number",
                "description": "Internações no ano"
              }
            },
            "description": "Ponto anual",
            "additionalProperties": false
          },
          {
            "type": "object",
            "required": [
              "year_month",
              "n",
              "deaths"
            ],
            "properties": {
              "n": {
                "type": "number",
                "description": "Internações no mês"
              },
              "deaths": {
                "type": "number",
                "description": "Óbitos no mês"
              },
              "year_month": {
                "type": "string",
                "description": "Ano-mês da INTERNAÇÃO (DT_INTER), AAAA-MM — não a competência de faturamento; só nas internações sem DT_INTER na fonte (1992-01..04, 1993-01) é a competência"
              }
            },
            "description": "Ponto mensal",
            "additionalProperties": false
          }
        ]
      },
      "description": "Um ponto por ano ou por mês, em ordem cronológica"
    },
    "provenance": {
      "type": "object",
      "required": [
        "source",
        "source_url",
        "data_vintage",
        "retrieved_at",
        "retrieval",
        "citation",
        "license"
      ],
      "properties": {
        "source": {
          "type": "string",
          "description": "Fonte oficial do dado"
        },
        "derived": {
          "type": "boolean",
          "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
        },
        "license": {
          "type": [
            "string",
            "null"
          ],
          "description": "Regime legal do dado (id SPDX quando há)"
        },
        "notices": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
        },
        "citation": {
          "type": "string",
          "description": "Citação pronta para uso"
        },
        "revision": {
          "type": "object",
          "required": [
            "status",
            "note"
          ],
          "properties": {
            "note": {
              "type": [
                "string",
                "null"
              ],
              "description": "O específico da fonte: o que revisa, quando, por quê"
            },
            "status": {
              "enum": [
                "current",
                "provisional",
                "final"
              ],
              "type": "string",
              "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
            }
          },
          "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
          "additionalProperties": false
        },
        "retrieval": {
          "oneOf": [
            {
              "type": "object",
              "required": [
                "requests",
                "attempts",
                "anomalies",
                "unstable"
              ],
              "properties": {
                "attempts": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                },
                "requests": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                },
                "unstable": {
                  "type": "boolean",
                  "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                },
                "anomalies": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "kind",
                      "count"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "timeout",
                          "network",
                          "http_4xx",
                          "http_5xx",
                          "rate_limited",
                          "malformed_body"
                        ],
                        "type": "string",
                        "description": "Classe da anomalia (vocabulário fechado do contrato)"
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 1,
                        "description": "Ocorrências desta classe na chamada"
                      }
                    },
                    "additionalProperties": false
                  },
                  "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                }
              },
              "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
        },
        "source_url": {
          "type": "string",
          "description": "URL canônica que reproduz a consulta ou localiza a fonte"
        },
        "data_vintage": {
          "type": [
            "string",
            "null"
          ],
          "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
        },
        "retrieved_at": {
          "type": "string",
          "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
        },
        "field_sources": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "fields",
              "source_url",
              "dataset_id",
              "data_vintage",
              "retrieved_at"
            ],
            "properties": {
              "fields": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Campos do payload atribuídos a esta sub-fonte"
              },
              "dataset_id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Identificador do conjunto da sub-fonte"
              },
              "source_url": {
                "type": "string",
                "description": "URL canônica da sub-fonte que originou estes campos"
              },
              "data_vintage": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Vintage/competência da sub-fonte"
              },
              "retrieved_at": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO-8601 da extração desta sub-fonte na origem"
              },
              "served_from_cache": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
              }
            },
            "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
            "additionalProperties": false
          },
          "minItems": 1,
          "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
        },
        "derivation_note": {
          "type": "string",
          "description": "Como o número foi calculado; presente junto com derived"
        }
      },
      "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
      "additionalProperties": false
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "granularity": {
      "enum": [
        "yearly",
        "monthly"
      ],
      "description": "Grão da série"
    },
    "published_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos que o canal de cubos publica — a verdade do canal, distinta do que esta instância tem em disco; só com o cache de cubos ligado"
    },
    "available_sih_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos com dados SIH atendíveis por este servidor"
    },
    "years_not_available": {
      "type": "object",
      "required": [
        "years",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Quais anos ficaram fora e quais os números cobrem"
        },
        "years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos pedidos que não têm dados SIH e ficaram fora do resultado"
        }
      },
      "description": "Presente só quando parte dos anos pedidos não tem dado: os números cobrem apenas os anos atendidos",
      "additionalProperties": false
    }
  },
  "description": "Série temporal de internações, anual (`year`) ou mensal (`year_month`); `error` quando nenhum ano do intervalo tem dado",
  "additionalProperties": false
}
get_hospitalization_trends annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_regions — Comparação entre UFs e regiões
Advertised by the server during the last successful anonymous check.
Advertised read-only

Compara internações entre UFs ou regiões do Brasil. Gera rankings e identifica variações regionais. Em 1992–1997 `uf` é a UF do arquivo (estabelecimento), não de residência — ver get_available_years.uf_basis e as `notes`.

compare_regions input schema
{
  "type": "object",
  "properties": {
    "year": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Anos para consultar"
    },
    "limit": {
      "type": "integer",
      "description": "Número de resultados (default: 10)"
    },
    "metric": {
      "enum": [
        "n",
        "deaths"
      ],
      "type": "string",
      "description": "Métrica para ranking (default: n)"
    },
    "is_csap": {
      "type": "boolean",
      "description": "Filtrar apenas CSAP"
    },
    "compare_by": {
      "enum": [
        "uf",
        "region"
      ],
      "type": "string",
      "description": "Comparar por UF ou região (default: uf)"
    },
    "cid_chapter": {
      "type": "integer",
      "description": "Capítulo CID-10 específico"
    }
  },
  "additionalProperties": false
}
compare_regions output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "compare_by",
        "metric",
        "ranking",
        "total_locations"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {},
      "description": "Sempre vazio: só aparece no caminho de erro-mole do funil"
    },
    "note": {
      "type": "string",
      "description": "Como obter o dado (por exemplo, consultar get_available_years)"
    },
    "error": {
      "type": "string",
      "description": "Motivo pelo qual não há dados nesta resposta (ano sem dado, cobertura populacional, falha na consulta)"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Avisos que qualificam os números: era CID-9, raça/cor ausente, universo do % ICSAP, denominador populacional, truncamento"
    },
    "metric": {
      "enum": [
        "n",
        "deaths"
      ],
      "description": "Métrica que ordena o ranking"
    },
    "ranking": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "rank",
          "uf",
          "n_hospitalizations",
          "deaths",
          "mortality_rate"
        ],
        "properties": {
          "uf": {
            "type": "string",
            "description": "UF"
          },
          "rank": {
            "type": "number",
            "description": "Posição, 1 = maior"
          },
          "deaths": {
            "type": "number",
            "description": "Óbitos"
          },
          "mortality_rate": {
            "type": "number",
            "description": "Óbitos / internações × 100, duas casas"
          },
          "n_hospitalizations": {
            "type": "number",
            "description": "Internações"
          }
        },
        "additionalProperties": false
      },
      "description": "Ranking em ordem decrescente da métrica"
    },
    "compare_by": {
      "enum": [
        "uf",
        "region"
      ],
      "description": "Eixo da comparação (hoje ambos agrupam por UF)"
    },
    "provenance": {
      "type": "object",
      "required": [
        "source",
        "source_url",
        "data_vintage",
        "retrieved_at",
        "retrieval",
        "citation",
        "license"
      ],
      "properties": {
        "source": {
          "type": "string",
          "description": "Fonte oficial do dado"
        },
        "derived": {
          "type": "boolean",
          "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
        },
        "license": {
          "type": [
            "string",
            "null"
          ],
          "description": "Regime legal do dado (id SPDX quando há)"
        },
        "notices": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
        },
        "citation": {
          "type": "string",
          "description": "Citação pronta para uso"
        },
        "revision": {
          "type": "object",
          "required": [
            "status",
            "note"
          ],
          "properties": {
            "note": {
              "type": [
                "string",
                "null"
              ],
              "description": "O específico da fonte: o que revisa, quando, por quê"
            },
            "status": {
              "enum": [
                "current",
                "provisional",
                "final"
              ],
              "type": "string",
              "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
            }
          },
          "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
          "additionalProperties": false
        },
        "retrieval": {
          "oneOf": [
            {
              "type": "object",
              "required": [
                "requests",
                "attempts",
                "anomalies",
                "unstable"
              ],
              "properties": {
                "attempts": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                },
                "requests": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                },
                "unstable": {
                  "type": "boolean",
                  "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                },
                "anomalies": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "kind",
                      "count"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "timeout",
                          "network",
                          "http_4xx",
                          "http_5xx",
                          "rate_limited",
                          "malformed_body"
                        ],
                        "type": "string",
                        "description": "Classe da anomalia (vocabulário fechado do contrato)"
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 1,
                        "description": "Ocorrências desta classe na chamada"
                      }
                    },
                    "additionalProperties": false
                  },
                  "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                }
              },
              "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
        },
        "source_url": {
          "type": "string",
          "description": "URL canônica que reproduz a consulta ou localiza a fonte"
        },
        "data_vintage": {
          "type": [
            "string",
            "null"
          ],
          "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
        },
        "retrieved_at": {
          "type": "string",
          "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
        },
        "field_sources": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "fields",
              "source_url",
              "dataset_id",
              "data_vintage",
              "retrieved_at"
            ],
            "properties": {
              "fields": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Campos do payload atribuídos a esta sub-fonte"
              },
              "dataset_id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Identificador do conjunto da sub-fonte"
              },
              "source_url": {
                "type": "string",
                "description": "URL canônica da sub-fonte que originou estes campos"
              },
              "data_vintage": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Vintage/competência da sub-fonte"
              },
              "retrieved_at": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO-8601 da extração desta sub-fonte na origem"
              },
              "served_from_cache": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
              }
            },
            "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
            "additionalProperties": false
          },
          "minItems": 1,
          "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
        },
        "derivation_note": {
          "type": "string",
          "description": "Como o número foi calculado; presente junto com derived"
        }
      },
      "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
      "additionalProperties": false
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "published_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos que o canal de cubos publica — a verdade do canal, distinta do que esta instância tem em disco; só com o cache de cubos ligado"
    },
    "total_locations": {
      "type": "number",
      "description": "Quantas localidades no ranking"
    },
    "available_sih_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos com dados SIH atendíveis por este servidor"
    },
    "years_not_available": {
      "type": "object",
      "required": [
        "years",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Quais anos ficaram fora e quais os números cobrem"
        },
        "years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos pedidos que não têm dados SIH e ficaram fora do resultado"
        }
      },
      "description": "Presente só quando parte dos anos pedidos não tem dado: os números cobrem apenas os anos atendidos",
      "additionalProperties": false
    }
  },
  "description": "Ranking de UFs por internações ou óbitos; `error` quando nenhum ano pedido tem dado",
  "additionalProperties": false
}
compare_regions annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_icsap — Internações por condições sensíveis (ICSAP)
Advertised by the server during the last successful anonymous check.
Advertised read-only

Consulta internações por Condições Sensíveis à Atenção Primária (ICSAP). Permite filtros por grupo CSAP, UF, município, sexo, idade e raça. Raça/cor só existe de 2008 em diante: em 1998–2007 `race` é nulo (ver get_available_years.race_available). Série desde 1992: em 1992–1997 a ICSAP vem de lista CID-9 DERIVADA e não oficial (g03 e g05 não comparáveis com 1998+), `uf` é a UF do arquivo e `municipality_code` é nulo — ver get_available_years (icsap_list_revision, uf_basis) e as `notes`. Percentual no universo do pacote R csapAIH por padrão (`universe`): fora do numerador e do denominador as internações por procedimento obstétrico, parto e longa permanência.

get_icsap input schema
{
  "type": "object",
  "properties": {
    "uf": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "UFs para filtrar"
    },
    "sex": {
      "enum": [
        "M",
        "F"
      ],
      "type": "string",
      "description": "Filtrar por sexo"
    },
    "race": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Raça/cor (branca, preta, parda, amarela, indigena, ignorado). Só existe de 2008 em diante: em 1998–2007 race é nulo e o filtro não alcança esses anos."
    },
    "year": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Anos para consultar"
    },
    "age_max": {
      "type": "integer",
      "description": "Idade máxima"
    },
    "age_min": {
      "type": "integer",
      "description": "Idade mínima"
    },
    "group_by": {
      "type": "array",
      "items": {
        "enum": [
          "year",
          "uf",
          "municipality_code",
          "cid_revision",
          "csap_group",
          "sex",
          "age",
          "race"
        ],
        "type": "string"
      },
      "description": "Dimensões para agrupamento"
    },
    "universe": {
      "enum": [
        "csapaih",
        "all"
      ],
      "type": "string",
      "description": "Universo do % ICSAP: 'csapaih' (padrão) tira do numerador e do denominador as internações por procedimento obstétrico, com diagnóstico de parto (O80-O84) e as AIH de longa permanência, como o pacote R csapAIH (Nedel); 'all' conta todas as internações."
    },
    "csap_group": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Grupos CSAP (ex: ['g01', 'g05'])"
    },
    "municipality_code": {
      "type": "string",
      "description": "Código IBGE do município (6 dígitos)"
    }
  },
  "additionalProperties": false
}
get_icsap output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "data",
        "notes",
        "summary",
        "filters_applied"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "n_icsap",
          "n_total",
          "icsap_percentage",
          "total_days",
          "total_value",
          "deaths"
        ],
        "properties": {
          "uf": {
            "type": "string",
            "description": "UF de residência — do estabelecimento em 1992–1997 (group_by: uf)"
          },
          "age": {
            "type": "number",
            "description": "Idade em anos (group_by: age)"
          },
          "sex": {
            "type": "string",
            "description": "Sexo: M ou F (group_by: sex)"
          },
          "race": {
            "type": [
              "string",
              "null"
            ],
            "description": "Raça/cor; null em 1998–2007 (group_by: race)"
          },
          "year": {
            "type": "number",
            "description": "Ano da internação (DT_INTER) — group_by: year"
          },
          "deaths": {
            "type": "number",
            "description": "Óbitos nas ICSAP"
          },
          "n_icsap": {
            "type": "number",
            "description": "Internações por condições sensíveis à atenção primária no universo escolhido"
          },
          "n_total": {
            "type": "number",
            "description": "Total de internações no universo escolhido (denominador)"
          },
          "csap_group": {
            "type": [
              "string",
              "null"
            ],
            "description": "Grupo CSAP g01–g19 (group_by: csap_group)"
          },
          "total_days": {
            "type": "number",
            "description": "Dias de permanência das ICSAP"
          },
          "total_value": {
            "type": "number",
            "description": "Valor pago das ICSAP (R$)"
          },
          "cid_revision": {
            "type": "number",
            "description": "Revisão da CID: 9 ou 10 (group_by: cid_revision)"
          },
          "icsap_percentage": {
            "type": "number",
            "description": "n_icsap / n_total × 100, duas casas"
          },
          "municipality_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Código IBGE do município de residência (6 dígitos); null em 1992–1997 (group_by: municipality_code)"
          }
        },
        "description": "Uma linha por combinação de `group_by` (só as colunas pedidas aparecem)",
        "additionalProperties": false
      },
      "description": "Linhas agrupadas (vazio no caminho de erro-mole)"
    },
    "note": {
      "type": "string",
      "description": "Como obter o dado (por exemplo, consultar get_available_years)"
    },
    "error": {
      "type": "string",
      "description": "Motivo pelo qual não há dados nesta resposta (ano sem dado, cobertura populacional, falha na consulta)"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Avisos que qualificam os números: era CID-9, raça/cor ausente, universo do % ICSAP, denominador populacional, truncamento"
    },
    "summary": {
      "type": "object",
      "required": [
        "total_icsap",
        "total_hospitalizations",
        "icsap_percentage",
        "total_days",
        "total_value",
        "deaths",
        "records_returned"
      ],
      "properties": {
        "deaths": {
          "type": "number",
          "description": "Óbitos nas ICSAP"
        },
        "total_days": {
          "type": "number",
          "description": "Dias de permanência das ICSAP"
        },
        "total_icsap": {
          "type": "number",
          "description": "ICSAP no recorte inteiro"
        },
        "total_value": {
          "type": "number",
          "description": "Valor pago das ICSAP (R$)"
        },
        "icsap_percentage": {
          "type": "number",
          "description": "total_icsap / total_hospitalizations × 100, duas casas"
        },
        "records_returned": {
          "type": "number",
          "description": "Linhas em `data`"
        },
        "total_hospitalizations": {
          "type": "number",
          "description": "Internações no universo (denominador)"
        }
      },
      "description": "Totais do recorte inteiro, calculados sem agrupamento",
      "additionalProperties": false
    },
    "truncated": {
      "type": "object",
      "required": [
        "returned",
        "total"
      ],
      "properties": {
        "total": {
          "type": "number",
          "description": "Linhas que a consulta produziu"
        },
        "returned": {
          "type": "number",
          "description": "Linhas devolvidas (o teto)"
        }
      },
      "description": "Presente só quando `data` foi truncado no teto de linhas; os totais em `summary` são do conjunto inteiro",
      "additionalProperties": false
    },
    "provenance": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "source",
          "source_url",
          "data_vintage",
          "retrieved_at",
          "retrieval",
          "citation",
          "license"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Fonte oficial do dado"
          },
          "derived": {
            "type": "boolean",
            "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
          },
          "license": {
            "type": [
              "string",
              "null"
            ],
            "description": "Regime legal do dado (id SPDX quando há)"
          },
          "notices": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
          },
          "citation": {
            "type": "string",
            "description": "Citação pronta para uso"
          },
          "revision": {
            "type": "object",
            "required": [
              "status",
              "note"
            ],
            "properties": {
              "note": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "O específico da fonte: o que revisa, quando, por quê"
              },
              "status": {
                "enum": [
                  "current",
                  "provisional",
                  "final"
                ],
                "type": "string",
                "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
              }
            },
            "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
            "additionalProperties": false
          },
          "retrieval": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "requests",
                  "attempts",
                  "anomalies",
                  "unstable"
                ],
                "properties": {
                  "attempts": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                  },
                  "requests": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                  },
                  "unstable": {
                    "type": "boolean",
                    "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                  },
                  "anomalies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "kind",
                        "count"
                      ],
                      "properties": {
                        "kind": {
                          "enum": [
                            "timeout",
                            "network",
                            "http_4xx",
                            "http_5xx",
                            "rate_limited",
                            "malformed_body"
                          ],
                          "type": "string",
                          "description": "Classe da anomalia (vocabulário fechado do contrato)"
                        },
                        "count": {
                          "type": "integer",
                          "minimum": 1,
                          "description": "Ocorrências desta classe na chamada"
                        }
                      },
                      "additionalProperties": false
                    },
                    "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                  }
                },
                "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
          },
          "source_url": {
            "type": "string",
            "description": "URL canônica que reproduz a consulta ou localiza a fonte"
          },
          "data_vintage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
          },
          "retrieved_at": {
            "type": "string",
            "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
          },
          "field_sources": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "fields",
                "source_url",
                "dataset_id",
                "data_vintage",
                "retrieved_at"
              ],
              "properties": {
                "fields": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "minItems": 1,
                  "description": "Campos do payload atribuídos a esta sub-fonte"
                },
                "dataset_id": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Identificador do conjunto da sub-fonte"
                },
                "source_url": {
                  "type": "string",
                  "description": "URL canônica da sub-fonte que originou estes campos"
                },
                "data_vintage": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Vintage/competência da sub-fonte"
                },
                "retrieved_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "ISO-8601 da extração desta sub-fonte na origem"
                },
                "served_from_cache": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
                }
              },
              "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
              "additionalProperties": false
            },
            "minItems": 1,
            "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
          },
          "derivation_note": {
            "type": "string",
            "description": "Como o número foi calculado; presente junto com derived"
          }
        },
        "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
        "additionalProperties": false
      },
      "description": "Um bloco por procedência que contribuiu com esta resposta (SIH, lista CSAP, csapAIH, população…); licenças nunca se fundem"
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "filters_applied": {
      "type": "object",
      "properties": {
        "uf": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "UFs para filtrar"
        },
        "sex": {
          "enum": [
            "M",
            "F"
          ],
          "type": "string",
          "description": "Filtrar por sexo"
        },
        "race": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Raça/cor (branca, preta, parda, amarela, indigena, ignorado). Só existe de 2008 em diante: em 1998–2007 race é nulo e o filtro não alcança esses anos."
        },
        "year": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "Anos para consultar"
        },
        "age_max": {
          "type": "integer",
          "description": "Idade máxima"
        },
        "age_min": {
          "type": "integer",
          "description": "Idade mínima"
        },
        "group_by": {
          "type": "array",
          "items": {
            "enum": [
              "year",
              "uf",
              "municipality_code",
              "cid_revision",
              "csap_group",
              "sex",
              "age",
              "race"
            ],
            "type": "string"
          },
          "description": "Dimensões para agrupamento"
        },
        "universe": {
          "enum": [
            "csapaih",
            "all"
          ],
          "type": "string",
          "description": "Universo do % ICSAP: 'csapaih' (padrão) tira do numerador e do denominador as internações por procedimento obstétrico, com diagnóstico de parto (O80-O84) e as AIH de longa permanência, como o pacote R csapAIH (Nedel); 'all' conta todas as internações."
        },
        "csap_group": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Grupos CSAP (ex: ['g01', 'g05'])"
        },
        "municipality_code": {
          "type": "string",
          "description": "Código IBGE do município (6 dígitos)"
        }
      },
      "description": "Os argumentos recebidos, ecoados",
      "additionalProperties": false
    },
    "published_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos que o canal de cubos publica — a verdade do canal, distinta do que esta instância tem em disco; só com o cache de cubos ligado"
    },
    "available_sih_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos com dados SIH atendíveis por este servidor"
    },
    "years_not_available": {
      "type": "object",
      "required": [
        "years",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Quais anos ficaram fora e quais os números cobrem"
        },
        "years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos pedidos que não têm dados SIH e ficaram fora do resultado"
        }
      },
      "description": "Presente só quando parte dos anos pedidos não tem dado: os números cobrem apenas os anos atendidos",
      "additionalProperties": false
    }
  },
  "description": "Internações por condições sensíveis à atenção primária, agrupadas conforme `group_by`, com totais e a nota do universo; `error` quando nenhum ano pedido tem dado",
  "additionalProperties": false
}
get_icsap annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_icsap_indicators — Indicadores de ICSAP
Advertised by the server during the last successful anonymous check.
Advertised read-only

Calcula indicadores de ICSAP: percentual (ICSAP/Total×100). Métricas-chave para avaliar a Atenção Primária. Agrupar por raça só faz sentido de 2008 em diante: em 1998–2007 `race` é nulo (ver get_available_years.race_available). Em 1992–1997 a ICSAP vem de lista CID-9 DERIVADA e não oficial (g03 e g05 não comparáveis com 1998+) e `uf` é a UF do arquivo — ver as `notes`. Percentual no universo do pacote R csapAIH por padrão (`universe`): fora do numerador e do denominador as internações por procedimento obstétrico, parto e longa permanência.

get_icsap_indicators input schema
{
  "type": "object",
  "properties": {
    "uf": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "UFs para calcular"
    },
    "sex": {
      "enum": [
        "M",
        "F"
      ],
      "type": "string",
      "description": "Filtrar por sexo"
    },
    "year": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Anos para calcular"
    },
    "age_max": {
      "type": "integer",
      "description": "Idade máxima"
    },
    "age_min": {
      "type": "integer",
      "description": "Idade mínima"
    },
    "group_by": {
      "type": "array",
      "items": {
        "enum": [
          "year",
          "uf",
          "cid_revision",
          "sex",
          "race"
        ],
        "type": "string"
      },
      "description": "Dimensões para agrupamento"
    },
    "universe": {
      "enum": [
        "csapaih",
        "all"
      ],
      "type": "string",
      "description": "Universo do % ICSAP: 'csapaih' (padrão) tira do numerador e do denominador as internações por procedimento obstétrico, com diagnóstico de parto (O80-O84) e as AIH de longa permanência, como o pacote R csapAIH (Nedel); 'all' conta todas as internações."
    },
    "municipality_code": {
      "type": "string",
      "description": "Código IBGE do município"
    }
  },
  "additionalProperties": false
}
get_icsap_indicators output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "data",
        "notes",
        "indicators_calculated",
        "note"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "n_icsap",
          "n_total",
          "icsap_percentage",
          "total_days",
          "total_value",
          "deaths"
        ],
        "properties": {
          "uf": {
            "type": "string",
            "description": "UF de residência — do estabelecimento em 1992–1997 (group_by: uf)"
          },
          "age": {
            "type": "number",
            "description": "Idade em anos (group_by: age)"
          },
          "sex": {
            "type": "string",
            "description": "Sexo: M ou F (group_by: sex)"
          },
          "race": {
            "type": [
              "string",
              "null"
            ],
            "description": "Raça/cor; null em 1998–2007 (group_by: race)"
          },
          "year": {
            "type": "number",
            "description": "Ano da internação (DT_INTER) — group_by: year"
          },
          "deaths": {
            "type": "number",
            "description": "Óbitos nas ICSAP"
          },
          "n_icsap": {
            "type": "number",
            "description": "Internações por condições sensíveis à atenção primária no universo escolhido"
          },
          "n_total": {
            "type": "number",
            "description": "Total de internações no universo escolhido (denominador)"
          },
          "csap_group": {
            "type": [
              "string",
              "null"
            ],
            "description": "Grupo CSAP g01–g19 (group_by: csap_group)"
          },
          "total_days": {
            "type": "number",
            "description": "Dias de permanência das ICSAP"
          },
          "total_value": {
            "type": "number",
            "description": "Valor pago das ICSAP (R$)"
          },
          "cid_revision": {
            "type": "number",
            "description": "Revisão da CID: 9 ou 10 (group_by: cid_revision)"
          },
          "icsap_percentage": {
            "type": "number",
            "description": "n_icsap / n_total × 100, duas casas"
          },
          "municipality_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Código IBGE do município de residência (6 dígitos); null em 1992–1997 (group_by: municipality_code)"
          }
        },
        "description": "Uma linha por combinação de `group_by` (só as colunas pedidas aparecem)",
        "additionalProperties": false
      },
      "description": "Um estrato por linha (vazio no caminho de erro-mole)"
    },
    "note": {
      "type": "string",
      "description": "Fórmula do indicador — ou, no caminho de erro-mole, como obter o dado"
    },
    "error": {
      "type": "string",
      "description": "Motivo pelo qual não há dados nesta resposta (ano sem dado, cobertura populacional, falha na consulta)"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Avisos que qualificam os números: era CID-9, raça/cor ausente, universo do % ICSAP, denominador populacional, truncamento"
    },
    "truncated": {
      "type": "object",
      "required": [
        "returned",
        "total"
      ],
      "properties": {
        "total": {
          "type": "number",
          "description": "Linhas que a consulta produziu"
        },
        "returned": {
          "type": "number",
          "description": "Linhas devolvidas (o teto)"
        }
      },
      "description": "Presente só quando `data` foi truncado no teto de linhas; os totais em `summary` são do conjunto inteiro",
      "additionalProperties": false
    },
    "provenance": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "source",
          "source_url",
          "data_vintage",
          "retrieved_at",
          "retrieval",
          "citation",
          "license"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Fonte oficial do dado"
          },
          "derived": {
            "type": "boolean",
            "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
          },
          "license": {
            "type": [
              "string",
              "null"
            ],
            "description": "Regime legal do dado (id SPDX quando há)"
          },
          "notices": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
          },
          "citation": {
            "type": "string",
            "description": "Citação pronta para uso"
          },
          "revision": {
            "type": "object",
            "required": [
              "status",
              "note"
            ],
            "properties": {
              "note": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "O específico da fonte: o que revisa, quando, por quê"
              },
              "status": {
                "enum": [
                  "current",
                  "provisional",
                  "final"
                ],
                "type": "string",
                "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
              }
            },
            "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
            "additionalProperties": false
          },
          "retrieval": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "requests",
                  "attempts",
                  "anomalies",
                  "unstable"
                ],
                "properties": {
                  "attempts": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                  },
                  "requests": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                  },
                  "unstable": {
                    "type": "boolean",
                    "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                  },
                  "anomalies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "kind",
                        "count"
                      ],
                      "properties": {
                        "kind": {
                          "enum": [
                            "timeout",
                            "network",
                            "http_4xx",
                            "http_5xx",
                            "rate_limited",
                            "malformed_body"
                          ],
                          "type": "string",
                          "description": "Classe da anomalia (vocabulário fechado do contrato)"
                        },
                        "count": {
                          "type": "integer",
                          "minimum": 1,
                          "description": "Ocorrências desta classe na chamada"
                        }
                      },
                      "additionalProperties": false
                    },
                    "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                  }
                },
                "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
          },
          "source_url": {
            "type": "string",
            "description": "URL canônica que reproduz a consulta ou localiza a fonte"
          },
          "data_vintage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
          },
          "retrieved_at": {
            "type": "string",
            "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
          },
          "field_sources": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "fields",
                "source_url",
                "dataset_id",
                "data_vintage",
                "retrieved_at"
              ],
              "properties": {
                "fields": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "minItems": 1,
                  "description": "Campos do payload atribuídos a esta sub-fonte"
                },
                "dataset_id": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Identificador do conjunto da sub-fonte"
                },
                "source_url": {
                  "type": "string",
                  "description": "URL canônica da sub-fonte que originou estes campos"
                },
                "data_vintage": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Vintage/competência da sub-fonte"
                },
                "retrieved_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "ISO-8601 da extração desta sub-fonte na origem"
                },
                "served_from_cache": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
                }
              },
              "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
              "additionalProperties": false
            },
            "minItems": 1,
            "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
          },
          "derivation_note": {
            "type": "string",
            "description": "Como o número foi calculado; presente junto com derived"
          }
        },
        "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
        "additionalProperties": false
      },
      "description": "Um bloco por procedência que contribuiu com esta resposta (SIH, lista CSAP, csapAIH, população…); licenças nunca se fundem"
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "published_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos que o canal de cubos publica — a verdade do canal, distinta do que esta instância tem em disco; só com o cache de cubos ligado"
    },
    "available_sih_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos com dados SIH atendíveis por este servidor"
    },
    "years_not_available": {
      "type": "object",
      "required": [
        "years",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Quais anos ficaram fora e quais os números cobrem"
        },
        "years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos pedidos que não têm dados SIH e ficaram fora do resultado"
        }
      },
      "description": "Presente só quando parte dos anos pedidos não tem dado: os números cobrem apenas os anos atendidos",
      "additionalProperties": false
    },
    "indicators_calculated": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Indicadores presentes nas linhas (icsap_percentage)"
    }
  },
  "description": "Percentual de ICSAP por estrato de `group_by`, com a fórmula e a nota do universo; `error` quando nenhum ano pedido tem dado",
  "additionalProperties": false
}
get_icsap_indicators annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
rank_csap_groups — Ranking dos grupos CSAP
Advertised by the server during the last successful anonymous check.
Advertised read-only

Gera ranking dos 19 grupos CSAP por número de internações, dias de internação ou valor. Identifica principais causas evitáveis. Em 1992–1997 a ICSAP vem de lista CID-9 DERIVADA e não oficial (g03 e g05 não comparáveis com 1998+) e `value` é nominal na moeda da época — ver as `notes`. Universo do pacote R csapAIH por padrão (`universe`): fora as internações por procedimento obstétrico, parto e longa permanência.

rank_csap_groups input schema
{
  "type": "object",
  "properties": {
    "uf": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "UFs para filtrar"
    },
    "sex": {
      "enum": [
        "M",
        "F"
      ],
      "type": "string",
      "description": "Filtrar por sexo"
    },
    "year": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Anos para consultar"
    },
    "limit": {
      "type": "integer",
      "maximum": 19,
      "minimum": 1,
      "description": "Número de grupos no ranking (default: 19)"
    },
    "metric": {
      "enum": [
        "n",
        "days",
        "value",
        "deaths"
      ],
      "type": "string",
      "description": "Métrica para ranking (default: n)"
    },
    "age_max": {
      "type": "integer",
      "description": "Idade máxima"
    },
    "age_min": {
      "type": "integer",
      "description": "Idade mínima"
    },
    "universe": {
      "enum": [
        "csapaih",
        "all"
      ],
      "type": "string",
      "description": "Universo do % ICSAP: 'csapaih' (padrão) tira do numerador e do denominador as internações por procedimento obstétrico, com diagnóstico de parto (O80-O84) e as AIH de longa permanência, como o pacote R csapAIH (Nedel); 'all' conta todas as internações."
    }
  },
  "additionalProperties": false
}
rank_csap_groups output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "metric",
        "ranking",
        "notes",
        "concentration",
        "total_groups"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {},
      "description": "Sempre vazio: só aparece no caminho de erro-mole do funil"
    },
    "note": {
      "type": "string",
      "description": "Como obter o dado (por exemplo, consultar get_available_years)"
    },
    "error": {
      "type": "string",
      "description": "Motivo pelo qual não há dados nesta resposta (ano sem dado, cobertura populacional, falha na consulta)"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Avisos que qualificam os números: era CID-9, raça/cor ausente, universo do % ICSAP, denominador populacional, truncamento"
    },
    "metric": {
      "enum": [
        "n",
        "days",
        "value",
        "deaths"
      ],
      "description": "Métrica que ordena"
    },
    "ranking": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "rank",
          "csap_group",
          "csap_name",
          "metric_value",
          "pct_of_total",
          "n_hospitalizations",
          "total_days",
          "total_value",
          "deaths"
        ],
        "properties": {
          "rank": {
            "type": "number",
            "description": "Posição, 1 = maior"
          },
          "deaths": {
            "type": "number",
            "description": "Óbitos"
          },
          "csap_name": {
            "type": "string",
            "description": "Nome do grupo"
          },
          "csap_group": {
            "type": "string",
            "description": "Grupo CSAP g01–g19"
          },
          "total_days": {
            "type": "number",
            "description": "Dias de permanência"
          },
          "total_value": {
            "type": "number",
            "description": "Valor pago (R$)"
          },
          "metric_value": {
            "type": "number",
            "description": "Valor da métrica escolhida"
          },
          "pct_of_total": {
            "type": "number",
            "description": "Participação do grupo no total da métrica, %"
          },
          "n_hospitalizations": {
            "type": "number",
            "description": "Internações do grupo"
          }
        },
        "additionalProperties": false
      },
      "description": "Ranking em ordem decrescente da métrica"
    },
    "provenance": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "source",
          "source_url",
          "data_vintage",
          "retrieved_at",
          "retrieval",
          "citation",
          "license"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Fonte oficial do dado"
          },
          "derived": {
            "type": "boolean",
            "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
          },
          "license": {
            "type": [
              "string",
              "null"
            ],
            "description": "Regime legal do dado (id SPDX quando há)"
          },
          "notices": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
          },
          "citation": {
            "type": "string",
            "description": "Citação pronta para uso"
          },
          "revision": {
            "type": "object",
            "required": [
              "status",
              "note"
            ],
            "properties": {
              "note": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "O específico da fonte: o que revisa, quando, por quê"
              },
              "status": {
                "enum": [
                  "current",
                  "provisional",
                  "final"
                ],
                "type": "string",
                "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
              }
            },
            "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
            "additionalProperties": false
          },
          "retrieval": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "requests",
                  "attempts",
                  "anomalies",
                  "unstable"
                ],
                "properties": {
                  "attempts": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                  },
                  "requests": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                  },
                  "unstable": {
                    "type": "boolean",
                    "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                  },
                  "anomalies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "kind",
                        "count"
                      ],
                      "properties": {
                        "kind": {
                          "enum": [
                            "timeout",
                            "network",
                            "http_4xx",
                            "http_5xx",
                            "rate_limited",
                            "malformed_body"
                          ],
                          "type": "string",
                          "description": "Classe da anomalia (vocabulário fechado do contrato)"
                        },
                        "count": {
                          "type": "integer",
                          "minimum": 1,
                          "description": "Ocorrências desta classe na chamada"
                        }
                      },
                      "additionalProperties": false
                    },
                    "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                  }
                },
                "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
          },
          "source_url": {
            "type": "string",
            "description": "URL canônica que reproduz a consulta ou localiza a fonte"
          },
          "data_vintage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
          },
          "retrieved_at": {
            "type": "string",
            "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
          },
          "field_sources": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "fields",
                "source_url",
                "dataset_id",
                "data_vintage",
                "retrieved_at"
              ],
              "properties": {
                "fields": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "minItems": 1,
                  "description": "Campos do payload atribuídos a esta sub-fonte"
                },
                "dataset_id": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Identificador do conjunto da sub-fonte"
                },
                "source_url": {
                  "type": "string",
                  "description": "URL canônica da sub-fonte que originou estes campos"
                },
                "data_vintage": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Vintage/competência da sub-fonte"
                },
                "retrieved_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "ISO-8601 da extração desta sub-fonte na origem"
                },
                "served_from_cache": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
                }
              },
              "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
              "additionalProperties": false
            },
            "minItems": 1,
            "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
          },
          "derivation_note": {
            "type": "string",
            "description": "Como o número foi calculado; presente junto com derived"
          }
        },
        "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
        "additionalProperties": false
      },
      "description": "Um bloco por procedência que contribuiu com esta resposta (SIH, lista CSAP, csapAIH, população…); licenças nunca se fundem"
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "total_groups": {
      "type": "number",
      "description": "Quantos grupos no ranking"
    },
    "concentration": {
      "type": "object",
      "required": [
        "top_3_percentage",
        "top_5_percentage"
      ],
      "properties": {
        "top_3_percentage": {
          "type": "number",
          "description": "Soma da participação dos 3 primeiros, %"
        },
        "top_5_percentage": {
          "type": "number",
          "description": "Soma dos 5 primeiros, %"
        }
      },
      "description": "Concentração da métrica nos primeiros grupos do ranking (soma de `pct_of_total`, duas casas)",
      "additionalProperties": false
    },
    "published_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos que o canal de cubos publica — a verdade do canal, distinta do que esta instância tem em disco; só com o cache de cubos ligado"
    },
    "available_sih_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos com dados SIH atendíveis por este servidor"
    },
    "years_not_available": {
      "type": "object",
      "required": [
        "years",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Quais anos ficaram fora e quais os números cobrem"
        },
        "years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos pedidos que não têm dados SIH e ficaram fora do resultado"
        }
      },
      "description": "Presente só quando parte dos anos pedidos não tem dado: os números cobrem apenas os anos atendidos",
      "additionalProperties": false
    }
  },
  "description": "Os grupos CSAP ordenados pela métrica, com participação de cada um e concentração nos primeiros; `error` quando nenhum ano pedido tem dado",
  "additionalProperties": false
}
rank_csap_groups annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
classify_as_csap — Classificar CID-10 como CSAP
Advertised by the server during the last successful anonymous check.
Advertised read-only

Classifica um ou mais códigos CID-10 como CSAP ou não. Retorna o grupo CSAP correspondente se aplicável. Aceita as duas notações do mesmo código — `J18.1` (OMS) e `J181` (SIH) — com a mesma resposta. Código que NÃO é CID-10 não é classificado: volta com `is_csap: null` e `error` próprio, nunca `false` (que afirmaria que a condição existe e não é sensível). Só CID-10: os códigos CID-9 de 6 dígitos do SIH de 1992–1997 são classificados no build pela lista derivada (src/data/csap-groups-cid9.json), não por esta ferramenta.

classify_as_csap input schema
{
  "type": "object",
  "required": [
    "cid_codes"
  ],
  "properties": {
    "cid_codes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Códigos CID-10 para classificar (ex: ['J18', 'A09', 'K35'])"
    }
  },
  "additionalProperties": false
}
classify_as_csap output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "classifications",
        "summary"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "error": {
      "type": "string",
      "description": "Só quando houver código não classificado: quantos foram e para onde olhar"
    },
    "summary": {
      "type": "object",
      "required": [
        "total",
        "csap",
        "non_csap"
      ],
      "properties": {
        "csap": {
          "type": "number",
          "description": "Quantos são sensíveis"
        },
        "total": {
          "type": "number",
          "description": "Códigos informados"
        },
        "non_csap": {
          "type": "number",
          "description": "Quantos são CID-10 e não são sensíveis (não inclui os não classificados)"
        },
        "not_classified": {
          "type": "number",
          "description": "Só quando houver: quantos não são CID-10"
        }
      },
      "description": "Contagem dos códigos informados: sensíveis, não sensíveis e não classificados",
      "additionalProperties": false
    },
    "provenance": {
      "type": "object",
      "required": [
        "source",
        "source_url",
        "data_vintage",
        "retrieved_at",
        "retrieval",
        "citation",
        "license"
      ],
      "properties": {
        "source": {
          "type": "string",
          "description": "Fonte oficial do dado"
        },
        "derived": {
          "type": "boolean",
          "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
        },
        "license": {
          "type": [
            "string",
            "null"
          ],
          "description": "Regime legal do dado (id SPDX quando há)"
        },
        "notices": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
        },
        "citation": {
          "type": "string",
          "description": "Citação pronta para uso"
        },
        "revision": {
          "type": "object",
          "required": [
            "status",
            "note"
          ],
          "properties": {
            "note": {
              "type": [
                "string",
                "null"
              ],
              "description": "O específico da fonte: o que revisa, quando, por quê"
            },
            "status": {
              "enum": [
                "current",
                "provisional",
                "final"
              ],
              "type": "string",
              "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
            }
          },
          "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
          "additionalProperties": false
        },
        "retrieval": {
          "oneOf": [
            {
              "type": "object",
              "required": [
                "requests",
                "attempts",
                "anomalies",
                "unstable"
              ],
              "properties": {
                "attempts": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                },
                "requests": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                },
                "unstable": {
                  "type": "boolean",
                  "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                },
                "anomalies": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "kind",
                      "count"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "timeout",
                          "network",
                          "http_4xx",
                          "http_5xx",
                          "rate_limited",
                          "malformed_body"
                        ],
                        "type": "string",
                        "description": "Classe da anomalia (vocabulário fechado do contrato)"
                      },
                      "count": {
                        "type": "integer",
                        "minimum": 1,
                        "description": "Ocorrências desta classe na chamada"
                      }
                    },
                    "additionalProperties": false
                  },
                  "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                }
              },
              "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
        },
        "source_url": {
          "type": "string",
          "description": "URL canônica que reproduz a consulta ou localiza a fonte"
        },
        "data_vintage": {
          "type": [
            "string",
            "null"
          ],
          "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
        },
        "retrieved_at": {
          "type": "string",
          "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
        },
        "field_sources": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "fields",
              "source_url",
              "dataset_id",
              "data_vintage",
              "retrieved_at"
            ],
            "properties": {
              "fields": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Campos do payload atribuídos a esta sub-fonte"
              },
              "dataset_id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Identificador do conjunto da sub-fonte"
              },
              "source_url": {
                "type": "string",
                "description": "URL canônica da sub-fonte que originou estes campos"
              },
              "data_vintage": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Vintage/competência da sub-fonte"
              },
              "retrieved_at": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO-8601 da extração desta sub-fonte na origem"
              },
              "served_from_cache": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
              }
            },
            "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
            "additionalProperties": false
          },
          "minItems": 1,
          "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
        },
        "derivation_note": {
          "type": "string",
          "description": "Como o número foi calculado; presente junto com derived"
        }
      },
      "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
      "additionalProperties": false
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "classifications": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "cid",
          "is_csap",
          "csap_group",
          "csap_name"
        ],
        "properties": {
          "cid": {
            "type": "string",
            "description": "Código como foi informado"
          },
          "error": {
            "type": "string",
            "description": "Só nas entradas não classificadas: por que o código não é CID-10"
          },
          "is_csap": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "true quando o código cai em algum grupo CSAP; false quando é CID-10 e não cai; null quando não é um código CID-10 (não classificado — veja `error` da entrada)"
          },
          "csap_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nome do grupo; null quando não é sensível ou não foi classificado"
          },
          "csap_group": {
            "type": [
              "string",
              "null"
            ],
            "description": "Grupo CSAP g01–g19; null quando não é sensível ou não foi classificado"
          }
        },
        "additionalProperties": false
      },
      "description": "Uma entrada por código, na ordem informada"
    }
  },
  "description": "Cada código CID-10 informado classificado como sensível (com o grupo) ou não; `is_csap` é null no código que não é CID-10, que não recebe classificação",
  "additionalProperties": false
}
classify_as_csap annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_hospitalization_rates — Taxas de internação por população
Advertised by the server during the last successful anonymous check.
Advertised read-only

Calcula taxas de internação por população. A taxa sai em `rate`, na base declarada em `rate_per` (1000, 10000 ou 100000; default 100000). Denominador lido de dois arquivos, informados em get_available_years.population_years: projeções do IBGE por idade simples de 2000 em diante (pop_uf.parquet) e, de 1991 a 1999, população por faixa etária quinquenal somada dos municípios (pop_uf_agregado.parquet) — antes de 2000 o recorte por idade só vale nos limites das faixas (age_min múltiplo de 5, age_max terminado em 4 ou 9, ou 80+). A resposta diz qual arquivo serviu a cada ano (population_source) e avisa quando mistura os dois.

get_hospitalization_rates input schema
{
  "type": "object",
  "properties": {
    "uf": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "UFs para filtrar"
    },
    "sex": {
      "enum": [
        "M",
        "F"
      ],
      "type": "string",
      "description": "Filtrar por sexo"
    },
    "year": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Anos para calcular"
    },
    "age_max": {
      "type": "integer",
      "description": "Idade máxima"
    },
    "age_min": {
      "type": "integer",
      "description": "Idade mínima"
    },
    "is_csap": {
      "type": "boolean",
      "description": "Filtrar apenas CSAP"
    },
    "group_by": {
      "type": "array",
      "items": {
        "enum": [
          "year",
          "uf",
          "sex"
        ],
        "type": "string"
      },
      "description": "Dimensões para agrupamento"
    },
    "rate_per": {
      "enum": [
        1000,
        10000,
        100000
      ],
      "type": "integer",
      "description": "Taxa por X habitantes (default: 100000)"
    },
    "rate_type": {
      "enum": [
        "crude",
        "specific"
      ],
      "type": "string",
      "description": "Tipo de taxa: crude (bruta) ou specific (específica por filtro)"
    },
    "cid_chapter": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Capítulos CID-10 (1-22)"
    }
  },
  "additionalProperties": false
}
get_hospitalization_rates output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "data",
        "summary",
        "metadata"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "n_hospitalizations",
          "deaths",
          "population",
          "rate",
          "rate_per",
          "rate_per_100k",
          "population_source",
          "mortality_rate"
        ],
        "properties": {
          "uf": {
            "type": "string",
            "description": "UF (quando agrupado por UF ou mais de uma UF)"
          },
          "rate": {
            "type": "number",
            "description": "Internações por `rate_per` habitantes, com no mínimo 3 algarismos significativos e nunca menos de duas casas (taxa pequena não vira 0)"
          },
          "year": {
            "type": "number",
            "description": "Ano da internação (DT_INTER), quando agrupado por ano ou mais de um ano"
          },
          "deaths": {
            "type": "number",
            "description": "Óbitos"
          },
          "rate_per": {
            "type": "number",
            "description": "Base da taxa (1000, 10000 ou 100000)"
          },
          "population": {
            "type": "number",
            "description": "População do estrato (denominador)"
          },
          "rate_per_100k": {
            "type": "number",
            "deprecated": true,
            "description": "DEPRECADO — use `rate` com `rate_per`. Internações por 100 mil habitantes, qualquer que seja `rate_per`, mesmo arredondamento de `rate`; sai numa versão futura"
          },
          "mortality_rate": {
            "type": "number",
            "description": "Óbitos / internações × 100, duas casas"
          },
          "population_source": {
            "enum": [
              "detailed",
              "aggregated",
              null
            ],
            "description": "Arquivo de população que serviu o ano"
          },
          "n_hospitalizations": {
            "type": "number",
            "description": "Internações"
          }
        },
        "additionalProperties": false
      },
      "description": "Um estrato por linha (vazio quando não há internação no recorte)"
    },
    "note": {
      "type": "string",
      "description": "Como obter o dado (por exemplo, consultar get_available_years)"
    },
    "error": {
      "type": "string",
      "description": "Motivo pelo qual não há dados nesta resposta (ano sem dado, cobertura populacional, falha na consulta)"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Avisos que qualificam os números: era CID-9, raça/cor ausente, universo do % ICSAP, denominador populacional, truncamento"
    },
    "summary": {
      "type": "object",
      "required": [
        "total_hospitalizations",
        "total_population",
        "overall_rate",
        "rate_per",
        "rate_type"
      ],
      "properties": {
        "rate_per": {
          "type": "number",
          "description": "Base da taxa"
        },
        "rate_type": {
          "enum": [
            "crude",
            "specific"
          ],
          "description": "Bruta ou específica"
        },
        "overall_rate": {
          "type": "number",
          "description": "Taxa do conjunto, na base `rate_per`, mesmo arredondamento de `rate`"
        },
        "total_population": {
          "type": "number",
          "description": "População somada"
        },
        "total_hospitalizations": {
          "type": "number",
          "description": "Internações somadas"
        }
      },
      "description": "Totais somados sobre as linhas de `data` e a taxa do conjunto",
      "additionalProperties": false
    },
    "metadata": {
      "type": "object",
      "required": [
        "population_source",
        "filters_applied"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Presente quando nenhuma internação casou o recorte"
        },
        "filters_applied": {
          "type": "object",
          "properties": {
            "uf": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "UFs para filtrar"
            },
            "sex": {
              "enum": [
                "M",
                "F"
              ],
              "type": "string",
              "description": "Filtrar por sexo"
            },
            "year": {
              "type": "array",
              "items": {
                "type": "integer"
              },
              "description": "Anos para calcular"
            },
            "age_max": {
              "type": "integer",
              "description": "Idade máxima"
            },
            "age_min": {
              "type": "integer",
              "description": "Idade mínima"
            },
            "is_csap": {
              "type": "boolean",
              "description": "Filtrar apenas CSAP"
            },
            "group_by": {
              "type": "array",
              "items": {
                "enum": [
                  "year",
                  "uf",
                  "sex"
                ],
                "type": "string"
              },
              "description": "Dimensões para agrupamento"
            },
            "rate_per": {
              "enum": [
                1000,
                10000,
                100000
              ],
              "type": "integer",
              "description": "Taxa por X habitantes (default: 100000)"
            },
            "rate_type": {
              "enum": [
                "crude",
                "specific"
              ],
              "type": "string",
              "description": "Tipo de taxa: crude (bruta) ou specific (específica por filtro)"
            },
            "cid_chapter": {
              "type": "array",
              "items": {
                "type": "integer"
              },
              "description": "Capítulos CID-10 (1-22)"
            }
          },
          "description": "Os argumentos, com UFs normalizadas e só os anos atendidos",
          "additionalProperties": false
        },
        "population_notes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Avisos sobre o denominador (faixa quinquenal antes de 2000; mistura de fontes)"
        },
        "population_source": {
          "type": "object",
          "description": "Fonte da população — chave é o ano (string)",
          "additionalProperties": {
            "enum": [
              "detailed",
              "aggregated",
              null
            ],
            "description": "Arquivo que serviu o ano"
          }
        },
        "available_sih_years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos com dados SIH atendíveis por este servidor"
        }
      },
      "description": "De onde veio o denominador (arquivo de população por ano, avisos) e os argumentos efetivamente atendidos",
      "additionalProperties": false
    },
    "truncated": {
      "type": "object",
      "required": [
        "returned",
        "total"
      ],
      "properties": {
        "total": {
          "type": "number",
          "description": "Linhas que a consulta produziu"
        },
        "returned": {
          "type": "number",
          "description": "Linhas devolvidas (o teto)"
        }
      },
      "description": "Presente só quando `data` foi truncado no teto de linhas; os totais em `summary` são do conjunto inteiro",
      "additionalProperties": false
    },
    "provenance": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "source",
          "source_url",
          "data_vintage",
          "retrieved_at",
          "retrieval",
          "citation",
          "license"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Fonte oficial do dado"
          },
          "derived": {
            "type": "boolean",
            "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
          },
          "license": {
            "type": [
              "string",
              "null"
            ],
            "description": "Regime legal do dado (id SPDX quando há)"
          },
          "notices": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
          },
          "citation": {
            "type": "string",
            "description": "Citação pronta para uso"
          },
          "revision": {
            "type": "object",
            "required": [
              "status",
              "note"
            ],
            "properties": {
              "note": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "O específico da fonte: o que revisa, quando, por quê"
              },
              "status": {
                "enum": [
                  "current",
                  "provisional",
                  "final"
                ],
                "type": "string",
                "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
              }
            },
            "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
            "additionalProperties": false
          },
          "retrieval": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "requests",
                  "attempts",
                  "anomalies",
                  "unstable"
                ],
                "properties": {
                  "attempts": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                  },
                  "requests": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                  },
                  "unstable": {
                    "type": "boolean",
                    "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                  },
                  "anomalies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "kind",
                        "count"
                      ],
                      "properties": {
                        "kind": {
                          "enum": [
                            "timeout",
                            "network",
                            "http_4xx",
                            "http_5xx",
                            "rate_limited",
                            "malformed_body"
                          ],
                          "type": "string",
                          "description": "Classe da anomalia (vocabulário fechado do contrato)"
                        },
                        "count": {
                          "type": "integer",
                          "minimum": 1,
                          "description": "Ocorrências desta classe na chamada"
                        }
                      },
                      "additionalProperties": false
                    },
                    "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                  }
                },
                "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
          },
          "source_url": {
            "type": "string",
            "description": "URL canônica que reproduz a consulta ou localiza a fonte"
          },
          "data_vintage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
          },
          "retrieved_at": {
            "type": "string",
            "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
          },
          "field_sources": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "fields",
                "source_url",
                "dataset_id",
                "data_vintage",
                "retrieved_at"
              ],
              "properties": {
                "fields": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "minItems": 1,
                  "description": "Campos do payload atribuídos a esta sub-fonte"
                },
                "dataset_id": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Identificador do conjunto da sub-fonte"
                },
                "source_url": {
                  "type": "string",
                  "description": "URL canônica da sub-fonte que originou estes campos"
                },
                "data_vintage": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Vintage/competência da sub-fonte"
                },
                "retrieved_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "ISO-8601 da extração desta sub-fonte na origem"
                },
                "served_from_cache": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
                }
              },
              "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
              "additionalProperties": false
            },
            "minItems": 1,
            "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
          },
          "derivation_note": {
            "type": "string",
            "description": "Como o número foi calculado; presente junto com derived"
          }
        },
        "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
        "additionalProperties": false
      },
      "description": "Um bloco por procedência que contribuiu com esta resposta (SIH, lista CSAP, csapAIH, população…); licenças nunca se fundem"
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "published_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos que o canal de cubos publica — a verdade do canal, distinta do que esta instância tem em disco; só com o cache de cubos ligado"
    },
    "population_years": {
      "type": "object",
      "required": [
        "first_year",
        "last_year",
        "detailed",
        "aggregated"
      ],
      "properties": {
        "detailed": {
          "type": [
            "object",
            "null"
          ],
          "required": [
            "first_year",
            "last_year",
            "source",
            "age"
          ],
          "properties": {
            "age": {
              "type": "string",
              "description": "Grão etário do arquivo"
            },
            "source": {
              "type": "string",
              "description": "Arquivo parquet que serve o intervalo"
            },
            "last_year": {
              "type": "number",
              "description": "Último ano coberto"
            },
            "age_groups": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Faixas etárias quinquenais (só no arquivo agregado)"
            },
            "first_year": {
              "type": "number",
              "description": "Primeiro ano coberto"
            }
          },
          "description": "pop_uf.parquet — idade simples por UF e sexo (projeções IBGE, 2000+)",
          "additionalProperties": false
        },
        "last_year": {
          "type": "number",
          "description": "Último ano com população por UF"
        },
        "aggregated": {
          "type": [
            "object",
            "null"
          ],
          "required": [
            "first_year",
            "last_year",
            "source",
            "age"
          ],
          "properties": {
            "age": {
              "type": "string",
              "description": "Grão etário do arquivo"
            },
            "source": {
              "type": "string",
              "description": "Arquivo parquet que serve o intervalo"
            },
            "last_year": {
              "type": "number",
              "description": "Último ano coberto"
            },
            "age_groups": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Faixas etárias quinquenais (só no arquivo agregado)"
            },
            "first_year": {
              "type": "number",
              "description": "Primeiro ano coberto"
            }
          },
          "description": "pop_uf_agregado.parquet — faixa etária quinquenal por UF e sexo (1991–1999)",
          "additionalProperties": false
        },
        "first_year": {
          "type": "number",
          "description": "Primeiro ano com população por UF (união dos dois arquivos)"
        }
      },
      "description": "Cobertura dos arquivos de população por UF: o que as ferramentas de taxa aceitam",
      "additionalProperties": false
    },
    "available_sih_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos com dados SIH atendíveis por este servidor"
    },
    "years_not_available": {
      "type": "object",
      "required": [
        "years",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Quais anos ficaram fora e quais os números cobrem"
        },
        "years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos pedidos que não têm dados SIH e ficaram fora do resultado"
        }
      },
      "description": "Presente só quando parte dos anos pedidos não tem dado: os números cobrem apenas os anos atendidos",
      "additionalProperties": false
    }
  },
  "description": "Taxa de internação por população (IBGE por UF), bruta ou específica; `error` quando o ano está fora da cobertura populacional ou nenhum ano pedido tem dado",
  "additionalProperties": false
}
get_hospitalization_rates annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_icsap_trends — Tendências comparativas de ICSAP
Advertised by the server during the last successful anonymous check.
Advertised read-only

Análise temporal comparativa de ICSAP entre UFs ou grupos CSAP. Calcula tendências, variação anual e identifica melhores/piores desempenhos. Para `percentage` e `count` valem todos os anos do SIH (desde 1992); `rate_per_10k` exige população e aceita só os anos de get_available_years.population_years. Em 1992–1997 a ICSAP vem de lista CID-9 DERIVADA e não oficial (g03 e g05 não comparáveis com 1998+) e `uf` é a UF do arquivo — ver as `notes`. Percentual no universo do pacote R csapAIH por padrão (`universe`): fora do numerador e do denominador as internações por procedimento obstétrico, parto e longa permanência.

compare_icsap_trends input schema
{
  "type": "object",
  "required": [
    "start_year",
    "end_year"
  ],
  "properties": {
    "end_year": {
      "type": "integer",
      "description": "Ano final"
    },
    "universe": {
      "enum": [
        "csapaih",
        "all"
      ],
      "type": "string",
      "description": "Universo do % ICSAP: 'csapaih' (padrão) tira do numerador e do denominador as internações por procedimento obstétrico, com diagnóstico de parto (O80-O84) e as AIH de longa permanência, como o pacote R csapAIH (Nedel); 'all' conta todas as internações."
    },
    "indicator": {
      "enum": [
        "percentage",
        "count",
        "rate_per_10k"
      ],
      "type": "string",
      "description": "Indicador: percentage (% ICSAP), count (número), rate_per_10k (taxa)"
    },
    "compare_by": {
      "enum": [
        "uf",
        "csap_group"
      ],
      "type": "string",
      "description": "Comparar por UF ou grupo CSAP"
    },
    "start_year": {
      "type": "integer",
      "description": "Ano inicial"
    },
    "compare_values": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Valores específicos para comparar (UFs ou grupos CSAP)"
    },
    "include_trend_line": {
      "type": "boolean",
      "description": "Incluir análise de tendência linear (default: true)"
    }
  },
  "additionalProperties": false
}
compare_icsap_trends output schema
{
  "type": "object",
  "anyOf": [
    {
      "required": [
        "indicator",
        "period",
        "compare_by",
        "series",
        "notes",
        "summary"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "required": [
    "provenance",
    "attribution"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {},
      "description": "Sempre vazio: só aparece no caminho de erro-mole do funil"
    },
    "note": {
      "type": "string",
      "description": "Como obter o dado (por exemplo, consultar get_available_years)"
    },
    "error": {
      "type": "string",
      "description": "Motivo pelo qual não há dados nesta resposta (ano sem dado, cobertura populacional, falha na consulta)"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Avisos que qualificam os números: era CID-9, raça/cor ausente, universo do % ICSAP, denominador populacional, truncamento"
    },
    "period": {
      "type": "object",
      "required": [
        "start",
        "end"
      ],
      "properties": {
        "end": {
          "type": "number",
          "description": "Ano final pedido"
        },
        "start": {
          "type": "number",
          "description": "Ano inicial pedido"
        }
      },
      "description": "Intervalo de anos pedido",
      "additionalProperties": false
    },
    "series": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "year"
        ],
        "properties": {
          "year": {
            "type": "number",
            "description": "Ano"
          }
        },
        "description": "Um ponto por ano: `year` mais uma chave por valor comparado (UF, grupo ou `total`) com o indicador",
        "additionalProperties": {
          "type": "number",
          "description": "Valor do indicador para esta UF, grupo ou `total`"
        }
      },
      "description": "Pontos em ordem cronológica"
    },
    "trends": {
      "type": "object",
      "description": "Tendência por valor comparado; só com `include_trend_line` e ao menos dois anos — ausente quando desligada",
      "additionalProperties": {
        "type": "object",
        "required": [
          "slope",
          "direction",
          "avg_annual_change",
          "start_value",
          "end_value",
          "change_pct"
        ],
        "properties": {
          "slope": {
            "type": "number",
            "description": "Inclinação da regressão linear (indicador por ano)"
          },
          "direction": {
            "enum": [
              "increasing",
              "decreasing",
              "stable"
            ],
            "description": "Sentido da tendência"
          },
          "end_value": {
            "type": "number",
            "description": "Valor no último ano"
          },
          "change_pct": {
            "type": "number",
            "description": "Variação relativa entre as pontas, %"
          },
          "start_value": {
            "type": "number",
            "description": "Valor no primeiro ano"
          },
          "avg_annual_change": {
            "type": "number",
            "description": "Variação média anual"
          }
        },
        "additionalProperties": false
      }
    },
    "summary": {
      "type": "object",
      "required": [],
      "properties": {
        "note": {
          "type": "string",
          "description": "Como ler o indicador; só para `percentage`"
        },
        "best_performer": {
          "type": "string",
          "description": "Valor comparado com a melhor evolução; só com mais de uma tendência"
        },
        "worst_performer": {
          "type": "string",
          "description": "Valor comparado com a pior evolução; só com mais de uma tendência"
        }
      },
      "description": "Melhor e pior evolução entre os valores comparados (pela variação entre as pontas) e como ler o indicador; vazio quando não há o que dizer",
      "additionalProperties": false
    },
    "indicator": {
      "enum": [
        "percentage",
        "count",
        "rate_per_10k"
      ],
      "description": "Indicador das séries"
    },
    "compare_by": {
      "type": "string",
      "description": "Eixo comparado: uf, csap_group ou total (sem eixo)"
    },
    "provenance": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "source",
          "source_url",
          "data_vintage",
          "retrieved_at",
          "retrieval",
          "citation",
          "license"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Fonte oficial do dado"
          },
          "derived": {
            "type": "boolean",
            "description": "Presente (true) quando o número foi calculado por este servidor — os cubos SIH são somas das internações dos arquivos do DATASUS"
          },
          "license": {
            "type": [
              "string",
              "null"
            ],
            "description": "Regime legal do dado (id SPDX quando há)"
          },
          "notices": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "description": "Avisos que acompanham o dado (ex.: cubo atrás do espelho healthbr-data, frescor não verificado). Ausente quando não há aviso"
          },
          "citation": {
            "type": "string",
            "description": "Citação pronta para uso"
          },
          "revision": {
            "type": "object",
            "required": [
              "status",
              "note"
            ],
            "properties": {
              "note": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "O específico da fonte: o que revisa, quando, por quê"
              },
              "status": {
                "enum": [
                  "current",
                  "provisional",
                  "final"
                ],
                "type": "string",
                "description": "current = versão vigente, a fonte pode revisá-la; provisional = preliminar, incompleta ou sujeita a mudança (não compare como se fosse fechada); final = não muda mais, declarado pela fonte"
              }
            },
            "description": "Se o número ainda pode mudar: provisional quando algum ano da resposta ainda tem competências abertas no SIH (o total ainda pode crescer); current nos demais — o DATASUS reedita arquivos de competências passadas",
            "additionalProperties": false
          },
          "retrieval": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "requests",
                  "attempts",
                  "anomalies",
                  "unstable"
                ],
                "properties": {
                  "attempts": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Tentativas somadas, incluindo as repetidas (>= requests)"
                  },
                  "requests": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Idas distintas à origem que compõem esta resposta (fatias, páginas)"
                  },
                  "unstable": {
                    "type": "boolean",
                    "description": "true se houve repetição (attempts > requests) ou alguma anomalia"
                  },
                  "anomalies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "kind",
                        "count"
                      ],
                      "properties": {
                        "kind": {
                          "enum": [
                            "timeout",
                            "network",
                            "http_4xx",
                            "http_5xx",
                            "rate_limited",
                            "malformed_body"
                          ],
                          "type": "string",
                          "description": "Classe da anomalia (vocabulário fechado do contrato)"
                        },
                        "count": {
                          "type": "integer",
                          "minimum": 1,
                          "description": "Ocorrências desta classe na chamada"
                        }
                      },
                      "additionalProperties": false
                    },
                    "description": "Anomalias superadas até o sucesso, somadas por classe, em ordem fixa; [] se nenhuma"
                  }
                },
                "description": "Diagnóstico de origem da chamada: como o dado foi obtido. Medição real do servidor; unstable=true pede ao agente que trate o dado como obtido com dificuldade",
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "Diagnóstico de origem desta chamada: idas ao canal sih/cubos/ do healthbr-data (manifesto e arquivos que faltavam no disco), tentativas somadas e anomalias contornadas; unstable=true quando houve anomalia. null = a resposta veio do DISCO (cache aquecido) ou o bloco não é do canal (listas de referência)"
          },
          "source_url": {
            "type": "string",
            "description": "URL canônica que reproduz a consulta ou localiza a fonte"
          },
          "data_vintage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Competência ou safra do dado segundo a fonte; null quando a fonte não expõe"
          },
          "retrieved_at": {
            "type": "string",
            "description": "Instante REAL da extração na origem (ISO-8601) — para os cubos SIH, o download MAIS ANTIGO, do FTP do DATASUS, entre os .dbc que alimentaram a resposta (cópia idêntica ao original naquela data, MD5 registrado no sidecar), nunca o instante da chamada"
          },
          "field_sources": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "fields",
                "source_url",
                "dataset_id",
                "data_vintage",
                "retrieved_at"
              ],
              "properties": {
                "fields": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "minItems": 1,
                  "description": "Campos do payload atribuídos a esta sub-fonte"
                },
                "dataset_id": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Identificador do conjunto da sub-fonte"
                },
                "source_url": {
                  "type": "string",
                  "description": "URL canônica da sub-fonte que originou estes campos"
                },
                "data_vintage": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Vintage/competência da sub-fonte"
                },
                "retrieved_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "ISO-8601 da extração desta sub-fonte na origem"
                },
                "served_from_cache": {
                  "type": [
                    "boolean",
                    "null"
                  ],
                  "description": "true se esta sub-fonte veio do cache do servidor (retrieved_at é o da extração original); false se foi buscada nesta chamada; null se o servidor não distingue"
                }
              },
              "description": "Proveniência de um grupo de campos da resposta: de onde veio e quando foi extraído",
              "additionalProperties": false
            },
            "minItems": 1,
            "description": "Presente só quando a resposta junta partes de origens ou momentos distintos: para cada grupo de campos, a URL, a extração e se veio do cache. Ausente nas respostas de uma origem só"
          },
          "derivation_note": {
            "type": "string",
            "description": "Como o número foi calculado; presente junto com derived"
          }
        },
        "description": "Bloco de proveniência do portfólio: fonte, URL, competência, extração, diagnóstico de origem, citação e licença; e, só quando há o que dizer, avisos, o que o servidor calculou e se o número ainda pode mudar",
        "additionalProperties": false
      },
      "description": "Um bloco por procedência que contribuiu com esta resposta (SIH, lista CSAP, csapAIH, população…); licenças nunca se fundem"
    },
    "attribution": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "URLs canônicas das fontes desta resposta (lista de atribuição)"
    },
    "published_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos que o canal de cubos publica — a verdade do canal, distinta do que esta instância tem em disco; só com o cache de cubos ligado"
    },
    "population_years": {
      "type": "object",
      "required": [
        "first_year",
        "last_year"
      ],
      "properties": {
        "last_year": {
          "type": "number",
          "description": "Último ano com população"
        },
        "first_year": {
          "type": "number",
          "description": "Primeiro ano com população"
        }
      },
      "description": "Cobertura populacional; só no erro-mole de `rate_per_10k` fora do intervalo",
      "additionalProperties": false
    },
    "available_sih_years": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Anos com dados SIH atendíveis por este servidor"
    },
    "years_not_available": {
      "type": "object",
      "required": [
        "years",
        "note"
      ],
      "properties": {
        "note": {
          "type": "string",
          "description": "Quais anos ficaram fora e quais os números cobrem"
        },
        "years": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Anos pedidos que não têm dados SIH e ficaram fora do resultado"
        }
      },
      "description": "Presente só quando parte dos anos pedidos não tem dado: os números cobrem apenas os anos atendidos",
      "additionalProperties": false
    }
  },
  "description": "Séries anuais do indicador ICSAP por UF ou grupo CSAP, com tendência linear e melhor/pior desempenho; `error` quando o intervalo está fora da cobertura",
  "additionalProperties": false
}
compare_icsap_trends annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1382 ms
95th percentile latency
1382 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1382 ms · metadata changed · 12 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http datasus-sih-sus-mcp-sidneybissoli https://sih.sidneybissoli.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add datasus-sih-sus-mcp-sidneybissoli --url https://sih.sidneybissoli.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable datasus-sih-sus-mcp-sidneybissoli in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "datasus-sih-sus-mcp-sidneybissoli": {
      "url": "https://sih.sidneybissoli.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "datasus-sih-sus-mcp-sidneybissoli": {
      "type": "streamableHttp",
      "url": "https://sih.sidneybissoli.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start datasus-sih-sus-mcp-sidneybissoli and inspect its tools.
VS Code configuration
{
  "servers": {
    "datasus-sih-sus-mcp-sidneybissoli": {
      "type": "http",
      "url": "https://sih.sidneybissoli.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http datasus-sih-sus-mcp-sidneybissoli https://sih.sidneybissoli.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://sih.sidneybissoli.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "datasus-sih-sus-mcp-sidneybissoli": {
      "serverUrl": "https://sih.sidneybissoli.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like DATASUS SIH/SUS MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.