Identificadores

Um identificador é o que liga um registro do seu sistema ao mesmo registro dentro da Nilo. É ele que decide se um POST cria ou atualiza — isso está em Escritas.

Esta página cobre o resto: o que a API lê de um identificador, quais identificadores ela devolve, como apontar de um recurso para outro e como buscar por identificador.

O que a API lê de um identificador

CampoO que éComo a API usa
systemA URI do namespace — quem emitiu o identificadorObrigatório. É a primeira metade da chave, e é o que a Nilo compara para decidir se aquele identificador é utilizável
valueA chave do registro dentro daquele namespaceObrigatório. É a segunda metade da chave
useA finalidade do identificador (official, usual, temp, secondary, old)Lido em pontos específicos, não de forma geral — veja a nota abaixo
periodA vigência do identificadorAceito e devolvido, sem efeito. Nenhum recurso desta API lê a vigência de um identificador

O use não é decorativo, mas também não é lido em todo lugar. No Patient ele decide três coisas: um CPF com use: official pode sobrescrever um CPF já gravado e um CPF com qualquer outro use só entra se ainda não houver nenhum; um name com use: official é o nome civil e com use: usual é o nome social; um telefone com use: old ou use: temp é descartado em vez de derrubar a requisição. Os detalhes estão em Paciente. Fora desses casos, o use é apenas armazenado.

Os identificadores que a Nilo devolve

Toda resposta traz mais identificadores do que você enviou: o seu, mais os que a Nilo emite. Os dela seguem sempre a mesma forma:

{host}/fhir/resources/NamingSystem/{api}--{recurso}

Onde {api} é o microsserviço Nilo que é dono do registro e {recurso} é o modelo, em kebab-case. Por exemplo, o id interno do paciente:

https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--patient

O value desse identificador é a chave primária do registro na Nilo, então ele serve para buscar e para referenciar sem nenhuma tradução no meio. A lista dos que voltam num paciente está em Paciente.

O {host} faz parte do identificador — não é enfeite. Um identificador Nilo de produção enviado para homologação não é reconhecido, e o recurso é recusado na validação. Use sempre o host do ambiente que você está chamando; os dois estão em Introdução.

Quais system a Nilo aceita no envio

Para Patient e Practitioner, os system aceitos são configurados por unidade de cuidado, e a lista é ordenada: quando o payload traz vários identificadores, a Nilo tenta encontrar o registro na ordem em que os namespaces foram configurados. Um payload que só traz system fora dessa lista é recusado, em vez de criar um registro duplicado — veja Paciente.

Nos demais recursos não há lista: qualquer system presente no recurso é aceito como chave de upsert.

Consequência prática: no Patient você não escolhe livremente o seu system — ele precisa estar habilitado para a sua unidade antes da primeira carga. Se não souber quais estão habilitados, fale com o time antes de montar a integração.

Referenciar outro recurso por identificador

Um recurso aponta para outro pelo identificador, não pelo id da Nilo. Em vez de reference: "Patient/...", mande identifier:

1{
2 "resourceType": "Condition",
3 "identifier": [
4 {
5 "system": "https://www.acmesaude.com.br/integracao/condicao/",
6 "value": "CON-0001"
7 }
8 ],
9 "subject": {
10 "type": "Patient",
11 "identifier": {
12 "system": "https://www.acmesaude.com.br/integracao/paciente/",
13 "value": "507823709"
14 }
15 }
16}

A resolução tem dois caminhos. Se o system for um NamingSystem da Nilo, o value já é a chave do registro e a referência resolve direto. Se for um system seu, a Nilo busca o recurso apontado no store por aquele identificador e lê o identificador Nilo de dentro dele.

O recurso referenciado precisa já existir. Uma referência que não resolve recusa a escrita inteira — ela nunca cria o alvo por conta própria. Identificador sem system ou sem value também é recusado, com 400 apontando identifier.system ou identifier.value.

Buscar por identificador

O parâmetro identifier recebe as duas metades separadas por barra vertical, e vale para qualquer recurso que tenha busca:

$curl --request GET \
> --url 'https://landing-zone-api.nilo.services/fhir/resources/Condition?identifier=https://www.acmesaude.com.br/integracao/condicao/|CON-0001' \
> --header 'x-api-key: SUA_API_KEY'

O system entra cru, com as suas próprias barras — não precisa escapar nada. O que precisa é colocar a URL entre aspas, porque a barra vertical é um pipe para o shell.

A resposta é um Bundle do tipo searchset, como em qualquer busca: nenhum resultado é 200 com Bundle vazio, não 404.

Boas práticas

  • Mantenha o system estável. Trocar o system de um registro já integrado faz a Nilo tratá-lo como um registro novo, e o histórico fica partido em dois. Não há como juntá-los depois pela API.
  • Garanta a unicidade do value dentro de cada system. Dois registros seus com o mesmo par fazem o upsert acertar o registro errado — silenciosamente, porque para a API é o mesmo recurso.
  • Prefira namespaces oficiais quando existirem. O CPF, por exemplo, tem tratamento próprio sob https://servicos.receita.fazenda.gov.br/servicos/cpf/, e usá-lo permite que a Nilo correlacione o paciente com dados vindos de outra origem.
  • Documente os seus namespaces. Registre a URI de cada system que você usa e o formato do value — é essa lista que precisa ser habilitada na sua unidade de cuidado, e é ela que alguém vai consultar quando um upsert cair no lugar errado.