Condição

Uma condição é qualquer problema de saúde que a equipe registra sobre o paciente: o diagnóstico fechado num atendimento, uma doença crônica que o acompanha há anos, ou a conduta que o profissional orientou ao encerrar a consulta.

No FHIR todos esses casos são o mesmo recurso, a Condition — e é aqui que este recurso pede atenção. Dois campos do payload decidem qual dos três registros a Nilo cria, e eles não parecem campos de decisão: passam por descrição.

No payloadO que a Nilo registraNo NiloCare
verificationStatus com o código provisionalUma conduta do atendimentoCondutas e orientações do atendimento
category com o código event no system da NiloUm evento clínico do pacienteCondição do evento na linha do tempo
qualquer outro casoUm diagnóstico de atendimentoDiagnósticos do atendimento

A ordem é essa: provisional é conferido primeiro e ganha de tudo. Um payload com verificationStatus provisional e category event grava uma conduta, não um evento.

A consequência mais séria dessa regra aparece num ida-e-volta. Um diagnóstico marcado como Hipótese na plataforma é lido com verificationStatus provisional. Reenviar esse mesmo recurso de volta não atualiza o diagnóstico nem grava a conduta: a escrita falha com 400 e uma mensagem genérica de recurso não localizado, porque o identifier enviado já pertence a uma condição de outro destino. Se o seu integrador lê condições e as reescreve, filtre os provisional antes de reenviar.

Os três destinos compartilham um endpoint, um schema e uma busca. O que muda é quais campos são lidos, quais são obrigatórios e o que acontece de efeito colateral — e é isso que o resto desta página detalha.

Campos

A coluna No NiloCare traz o rótulo com que o dado aparece para a equipe; são rótulos, não caminhos de navegação: a tela pode ser reorganizada, o rótulo é o que permite conferir se o dado chegou onde você esperava.

CampoObrigatórioO que significaNo NiloCare
subjectsimO paciente, por um identificador dele já cadastradoPaciente
identifiersim na conduta, sim na prática nos outrosChaves da condição. É por aqui que a API decide entre criar e atualizar
codesim no diagnóstico e no eventoO diagnóstico, pelo código de um dos três catálogos aceitosDiagnóstico
recordersim no diagnóstico e no eventoO profissional que registrou, por um identificador deleDiagnosticado por
encounternãoO atendimento a que a condição pertenceAtendimento
note[]sim na condutaNa conduta, o conteúdo dela. No diagnóstico, só respostaCondutas e orientações · notas do diagnóstico
onsetDateTimenãoInício da condição. Só tem efeito no evento clínico
abatementDateTimenãoFim da condição. Só tem efeito no evento clínico
categorynãoRoteia a escrita. O código event no system da Nilo escolhe o evento clínico
verificationStatusnãoRoteia a escrita. Só provisional tem efeito. Nas leituras é derivadoAlterar verificação
clinicalStatusnãoSó resposta, e derivado do registro. resolved no diagnóstico encerrado; active ou resolved no evento clínicoAlterar status clínico
recordedDatenãoSó resposta. O que ele traz depende do destino — veja Datas
idnãoSó resposta: o identificador Nilo FHIR do recurso
metanãoSó resposta: metadados da gravação

O que muda de destino para destino

CampoDiagnóstico de atendimentoEvento clínicoConduta
codeobrigatórioobrigatórionão é lido
recorderobrigatórioobrigatórionão é lido
identifieropcional na validaçãoopcional na validaçãoobrigatório
note[]só leituranão existeobrigatório, escrita e leitura
onsetDateTimesem efeitoinício da condiçãosem efeito
abatementDateTimesem efeitofim da condiçãosem efeito
encounteratendimento do prontuáriohospitalização ou pronto atendimentoatendimento do prontuário
verificationStatus na leiturao status do diagnóstico, em três dos seis estadossempre confirmedsempre provisional
clinicalStatus na leituraresolved, e só no estado Encerradoderivado do fim da condiçãonão vem

Campos que a Nilo não usa

A Condition canônica tem campos que esta integração não lê nem grava: asserter, severity, bodySite, stage, evidence, onsetPeriod, onsetAge, onsetString, abatementPeriod, abatementAge, abatementString, abatementBoolean e encounter como lista. Ficam fora da referência de propósito. Como esta referência descreve só o que é suportado, eles não aparecem no schema do recurso. O servidor os aceita, guarda no recurso FHIR e devolve nas leituras seguintes, mas nada no NiloCare passa a exibi-los.

E dois dados que o NiloCare mostra não têm campo nesta API: a cor e o ícone com que a condição é destacada na ficha, e o autor de cada nota de diagnóstico — a nota volta com authorReference, mas ele é da plataforma, não do seu payload.

Cadastrar ou atualizar

Não há endpoint separado para criar e atualizar. O mesmo POST faz os dois, e quem decide é o identifier: se já existir uma condição com aquele par system + value, ela é atualizada; se não existir, é criada.

POST
/fhir/resources/Condition
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Condition \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Condition",
6 "subject": {
7 "identifier": {
8 "system": "https://www.acmesaude.com.br/integracao/paciente/",
9 "value": "507823709",
10 "use": "usual"
11 },
12 "type": "Patient"
13 },
14 "code": {
15 "coding": [
16 {
17 "code": "J06.9",
18 "display": "Infecção aguda das vias aéreas superiores não especificada",
19 "system": "http://hl7.org/fhir/sid/icd-10"
20 }
21 ]
22 },
23 "encounter": {
24 "identifier": {
25 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
26 "value": "55162",
27 "use": "usual"
28 },
29 "type": "Encounter"
30 },
31 "identifier": [
32 {
33 "system": "https://www.acmesaude.com.br/integracao/diagnostico/",
34 "value": "78901",
35 "use": "usual"
36 }
37 ],
38 "recorder": {
39 "identifier": {
40 "system": "https://www.acmesaude.com.br/integracao/profissional/",
41 "value": "5032932",
42 "use": "usual"
43 },
44 "type": "Practitioner"
45 }
46}'

A resposta devolve o recurso como ficou gravado, sem envelope:

Response
1{
2 "resourceType": "Condition",
3 "subject": {
4 "identifier": {
5 "system": "https://www.acmesaude.com.br/integracao/paciente/",
6 "value": "507823709",
7 "use": "usual"
8 },
9 "type": "Patient",
10 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
11 },
12 "category": [
13 {
14 "coding": [
15 {
16 "code": "encounter-diagnosis",
17 "display": "Encounter Diagnosis",
18 "system": "http://terminology.hl7.org/CodeSystem/condition-category"
19 }
20 ],
21 "text": "Encounter Diagnosis"
22 },
23 {
24 "coding": [
25 {
26 "code": "patient-diagnosis",
27 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/condition-category"
28 }
29 ]
30 }
31 ],
32 "code": {
33 "coding": [
34 {
35 "code": "J06.9",
36 "display": "Infecção aguda das vias aéreas superiores não especificada",
37 "system": "http://hl7.org/fhir/sid/icd-10"
38 }
39 ],
40 "text": "Infecção aguda das vias aéreas superiores não especificada"
41 },
42 "encounter": {
43 "identifier": {
44 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
45 "value": "55162",
46 "use": "usual"
47 },
48 "type": "Encounter",
49 "reference": "Encounter/7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294"
50 },
51 "id": "c61b5f58-32b0-477b-b75a-54e306952082",
52 "identifier": [
53 {
54 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--patient-diagnosis-v3",
55 "value": "412885",
56 "use": "usual"
57 },
58 {
59 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--patient-diagnosis",
60 "value": "412885",
61 "use": "usual"
62 },
63 {
64 "system": "https://www.acmesaude.com.br/integracao/diagnostico/",
65 "value": "78901",
66 "use": "usual"
67 }
68 ],
69 "recordedDate": "2026-04-16",
70 "recorder": {
71 "identifier": {
72 "system": "https://www.acmesaude.com.br/integracao/profissional/",
73 "value": "5032932",
74 "use": "usual"
75 },
76 "type": "Practitioner",
77 "reference": "Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38"
78 }
79}

O reconhecimento é por destino: a busca pelo seu identifier é restrita às condições daquele mesmo destino. Um identifier já usado num diagnóstico não atualiza um evento clínico com o mesmo valor — e reenviá-lo apontando para outro destino falha, como no aviso acima.

Guarde o id: é por ele que se faz a leitura direta. A resposta traz também o identificador Nilo da condição ao lado do seu, e o system dele diz qual dos três destinos gravou:

system do identificador NiloDestino
…/NamingSystem/care-api--patient-diagnosis-v3Diagnóstico de atendimento
…/NamingSystem/hippocrates-api--conditionEvento clínico
…/NamingSystem/care-api--conduct-v2Conduta

Diagnósticos de atendimento carregam também um identificador no system …/NamingSystem/care-api--patient-diagnosis, sem o -v3. É o mesmo diagnóstico: o system antigo é preservado para não partir o histórico dos registros anteriores.

Nas duas variantes de diagnóstico o identifier não é exigido pela validação, e é por isso que ele é obrigatório na prática: sem identificador nenhum a API não tem como reconhecer a condição, e cada POST cria uma condição nova. Mande sempre a sua chave.

Na conduta é diferente: a validação recusa o payload sem identifier, com o code required.

A atualização substitui, não complementa. Assim como no Coverage, no Practitioner e no Encounter, e diferente do Patient, um campo omitido não preserva o valor atual na plataforma: num evento clínico, omitir abatementDateTime reabre a condição, e omitir onsetDateTime apaga o início. Para mudar um campo só, reenvie a condição inteira com o valor novo.

Uma exceção nos três destinos: encounter é preservado. Omiti-lo não desvincula a condição do atendimento — o vínculo atual continua valendo. Não há como desfazer um vínculo por esta API.

E o recurso FHIR que você lê depois não reflete o apagamento. Na regravação, o valor que já estava guardado sobrevive onde a plataforma não gera um novo: omitir onsetDateTime zera o início na plataforma, mas a leitura seguinte continua devolvendo o onsetDateTime anterior. Se você precisa confirmar que um campo foi apagado, não confie na releitura do recurso.

O diagnóstico

code é como você diz qual é o diagnóstico, e o coding[0].system tem de ser um dos três catálogos que a plataforma mantém:

Catálogosystem
CID-10http://hl7.org/fhir/sid/icd-10
CIAP-2http://hl7.org/fhir/sid/icpc-2
NANDAhttp://terminology.hl7.org/CodeSystem/nanda

Só o primeiro coding de code é lido. Mandar o CID-10 em coding[1] e outra terminologia em coding[0] faz a escrita ser recusada pelo coding[0], e o CID-10 nunca é considerado. Ponha o código que vale na primeira posição.

O código precisa existir no catálogo — não há criação de diagnóstico por esta API. Um system fora dos três e um código inexistente têm mensagens diferentes: Unknown diagnosis system: … com o code not-supported, e Unknown … with code: … com o code not-found. Os dois payloads completos estão na aba Referência, em POST /fhir/resources/Condition.

Na leitura, code.text e code.coding[0].display vêm preenchidos com a descrição oficial do item do catálogo, não com o que você enviou. No envio esses dois campos não são necessários.

code não é lido na conduta, e mandá-lo lá não é erro — a conduta simplesmente o ignora.

O profissional

recorder é o profissional que registrou a condição, e é obrigatório nas duas variantes de diagnóstico. O profissional precisa já estar cadastrado; veja Profissional.

Faltando o campo, a recusa vem com o code required e o expression Condition.recorder. Havendo o campo com um identificador que não resolve, vem Professional does not exist com o code not-found.

Na conduta, recorder não é lido: a conduta gravada não tem autor, mesmo que você mande um.

O paciente

subject é obrigatório nos três destinos, e o paciente tem de existir — uma condição não cria paciente. Cadastre o Paciente primeiro.

A mesma recusa cobre os dois casos: subject ausente e subject com um identificador que não resolve saem os dois como not-found com Patient does not exist, não como required.

Response
1{
2 "issue": [
3 {
4 "code": "not-found",
5 "details": {
6 "text": "Patient does not exist"
7 },
8 "expression": [
9 "Condition.subject"
10 ],
11 "severity": "error"
12 }
13 ],
14 "resourceType": "OperationOutcome"
15}

O atendimento

encounter liga a condição a um atendimento, e o que ele aceita depende do destino.

Nas duas variantes de diagnóstico e na conduta, é um atendimento do prontuário — veja Atendimentos. O campo é opcional: sem ele, o diagnóstico é registrado sem vínculo.

No evento clínico, encounter só aceita uma hospitalização ou um pronto atendimento. Apontar para um atendimento do prontuário é recusado com … is not an event.

POST
/fhir/resources/Condition
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Condition \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Condition",
6 "subject": {
7 "identifier": {
8 "system": "https://www.acmesaude.com.br/integracao/paciente/",
9 "value": "507823709",
10 "use": "usual"
11 },
12 "type": "Patient"
13 },
14 "abatementDateTime": "2026-01-22",
15 "category": [
16 {
17 "coding": [
18 {
19 "code": "event",
20 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/condition-category"
21 }
22 ]
23 }
24 ],
25 "code": {
26 "coding": [
27 {
28 "code": "J18.9",
29 "display": "Pneumonia não especificada",
30 "system": "http://hl7.org/fhir/sid/icd-10"
31 }
32 ]
33 },
34 "encounter": {
35 "identifier": {
36 "system": "https://www.acmesaude.com.br/integracao/evento/",
37 "value": "1126",
38 "use": "usual"
39 },
40 "type": "Encounter"
41 },
42 "identifier": [
43 {
44 "system": "https://www.acmesaude.com.br/integracao/condicao/",
45 "value": "55124",
46 "use": "usual"
47 }
48 ],
49 "onsetDateTime": "2026-01-15",
50 "recorder": {
51 "identifier": {
52 "system": "https://www.acmesaude.com.br/integracao/profissional/",
53 "value": "5032932",
54 "use": "usual"
55 },
56 "type": "Practitioner"
57 }
58}'

A referência é sempre por identifier, não pelo id do store. É o identificador do seu sistema que você usou ao criar o atendimento — a API resolve a partir dele.

Datas

O evento clínico é o único destino que lê datas do payload: onsetDateTime é o início da condição e abatementDateTime é o fim. Nos outros dois, os dois campos são aceitos e não gravam nada.

No evento clínico, o que você manda em onsetDateTime volta em recordedDate, não em onsetDateTime. Enviar e reler não devolve o mesmo payload: o onsetDateTime que aparece na leitura é o que ficou guardado do seu próprio envio, não o valor que a plataforma registrou. Para saber o início da condição de verdade, leia recordedDate.

Nos outros dois destinos recordedDate é outra coisa: no diagnóstico de atendimento é a data em que o diagnóstico foi registrado, sem hora; na conduta é o instante em que a conduta foi criada. Nenhum dos dois aceita o campo na escrita.

Situação da condição

clinicalStatus e verificationStatus aparecem no NiloCare como dois seletores no mesmo menu de status da condição — Alterar status clínico e Alterar verificação — e é assim que a equipe muda o status de um diagnóstico. Pela API eles funcionam de outra forma.

Status no NiloCareComo vem na leitura
HipóteseverificationStatus provisional
ReferidoverificationStatus unconfirmed
ConfirmadoverificationStatus confirmed
EncerradoclinicalStatus resolved
Agudo · Crôniconão vem em campo nenhum

Agudo e Crônico são estados de verificação que a plataforma reconhece e que esta integração não representa: um diagnóstico nesses dois estados volta sem verificationStatus e sem clinicalStatus, indistinguível de um diagnóstico sem status. Não conclua “sem status” a partir da ausência dos dois campos.

O eixo Ativo / Inativo que a aba de condições oferece também não sai nesta API: num diagnóstico de atendimento, o único valor que clinicalStatus assume é o resolved da tabela acima. Uma condição marcada como Inativa na tela continua sem clinicalStatus.

Essa tabela descreve a leitura. Na escrita, não há como definir o status de um diagnóstico por esta API: clinicalStatus é ignorado, e verificationStatus só serve para rotear — mandar confirmed ou unconfirmed não grava nada, e mandar provisional troca o destino: com um identifier novo grava uma conduta, e com o identifier de um diagnóstico que já existe falha com 400. Um diagnóstico criado por aqui nasce sem status, e quem o define é a equipe na tela.

Como o valor que você enviou continua no recurso FHIR, ele volta na leitura imediatamente seguinte ao POST — mesmo sem ter sido gravado na plataforma. O valor real aparece na próxima vez que o diagnóstico mudar por lá, e aí substitui o seu. Reler o recurso logo depois do POST não confirma o que a Nilo registrou.

Vale para a maioria dos campos que a Nilo não lê. note num diagnóstico de atendimento é a exceção: ele não é apenas ignorado, é descartado — a resposta traz as notas da plataforma, que num diagnóstico recém-criado é uma lista vazia, e não as suas.

E um reenvio em que nada do que a plataforma usa mudou pode não regravar o recurso FHIR: nesse caso a resposta traz o recurso como ele estava antes.

No evento clínico os dois campos são derivados e não há o que enviar: verificationStatus é sempre confirmed, e clinicalStatus é resolved quando há abatementDateTime e active quando não há.

Evento clínico

O evento clínico é a condição que não pertence a um atendimento: a doença crônica, o histórico que o paciente já traz. Ele é escolhido por um coding no system {host}/fhir/resources/CodeSystem/condition-category com o código event:

POST
/fhir/resources/Condition
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Condition \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Condition",
6 "subject": {
7 "identifier": {
8 "system": "https://www.acmesaude.com.br/integracao/paciente/",
9 "value": "507823709",
10 "use": "usual"
11 },
12 "type": "Patient"
13 },
14 "category": [
15 {
16 "coding": [
17 {
18 "code": "event",
19 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/condition-category"
20 }
21 ]
22 }
23 ],
24 "code": {
25 "coding": [
26 {
27 "code": "I10",
28 "display": "Hipertensão essencial",
29 "system": "http://hl7.org/fhir/sid/icd-10"
30 }
31 ]
32 },
33 "identifier": [
34 {
35 "system": "https://www.acmesaude.com.br/integracao/condicao/",
36 "value": "55123",
37 "use": "usual"
38 }
39 ],
40 "onsetDateTime": "2026-01-15",
41 "recorder": {
42 "identifier": {
43 "system": "https://www.acmesaude.com.br/integracao/profissional/",
44 "value": "5032932",
45 "use": "usual"
46 },
47 "type": "Practitioner"
48 }
49}'

O system desse coding é conferido. Um coding com o código event em outro system — no system do FHIR, por exemplo — não roteia: a condição vira um diagnóstico de atendimento. O mesmo acontece com um category que traga vários coding no system da Nilo com códigos diferentes: a ambiguidade não é recusada, é descartada, e o destino vira o padrão.

Um evento clínico só aparece no NiloCare quando está associado a uma hospitalização ou a um pronto atendimento. A associação é feita de duas formas: pelo encounter da própria condição, ou pelo diagnosis[].condition do evento — veja Hospitalização e Pronto atendimento. Um evento clínico sem nenhuma das duas fica gravado e não é exibido.

Para criar a condição e o evento numa chamada só, use um Bundle do tipo transaction: o diagnosis[].condition do evento referencia o fullUrl da condição criada na mesma requisição. Fora do Bundle, a condição precisa já existir e a referência é pelo identifier dela. Uma condição pertence a um evento — vincular a mesma condição a um segundo é recusado.

Vincular várias condições ao mesmo evento é aceito, mas o evento na linha do tempo mostra uma delas — a alterada mais recentemente. As outras ficam gravadas e vinculadas, e são alcançáveis pela busca; elas só não aparecem todas no evento.

Conduta do atendimento

A conduta é o que o profissional orientou ao encerrar o atendimento. Ela é escolhida por verificationStatus provisional, e nela o conteúdo é o note: cada item da lista é uma linha da conduta.

Há um segundo caminho para gravar conduta, pela Solicitação de serviço com intent: proposal. Escolha um dos dois: gravar a mesma conduta pelos dois cria registros diferentes.

POST
/fhir/resources/Condition
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Condition \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Condition",
6 "subject": {
7 "identifier": {
8 "system": "https://www.acmesaude.com.br/integracao/paciente/",
9 "value": "507823709",
10 "use": "usual"
11 },
12 "type": "Patient"
13 },
14 "encounter": {
15 "identifier": {
16 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
17 "value": "55162",
18 "use": "usual"
19 },
20 "type": "Encounter"
21 },
22 "identifier": [
23 {
24 "system": "https://www.acmesaude.com.br/integracao/conduta/",
25 "value": "4471",
26 "use": "usual"
27 }
28 ],
29 "note": [
30 {
31 "text": "Manter hidratação e repouso."
32 },
33 {
34 "text": "Retornar em 7 dias se não houver melhora."
35 }
36 ],
37 "verificationStatus": {
38 "coding": [
39 {
40 "code": "provisional",
41 "display": "Provisional",
42 "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
43 }
44 ]
45 }
46}'

Nesse destino, code e recorder não são lidos, identifier é obrigatório e note também: uma conduta sem note falha com um erro genérico, não com required.

E falha depois de o atendimento de suporte ter sido criado. Uma conduta sem encounter e sem note devolve 400 e deixa um atendimento vazio no prontuário do paciente. Confira que note está preenchido antes de enviar.

Na leitura, a conduta vem com um note por linha; na escrita, as linhas que você manda são juntadas numa só anotação do lado da plataforma. Enviar duas notas e reler devolve duas notas — mas uma nota que contenha uma quebra de linha volta partida em duas.

Uma conduta sem encounter cria um atendimento. A API precisa de um atendimento onde pendurar a conduta, e não achando um, cria um atendimento já finalizado para servir de suporte. Uma carga de condutas sem encounter, portanto, popula o prontuário do paciente com um atendimento por conduta.

Numa atualização de conduta, o atendimento já vinculado é mantido — o encounter do payload não o troca, e nenhum atendimento novo é criado. A troca de atendimento de uma conduta existente não é possível por esta API.

Na criação, o paciente do atendimento referenciado tem de ser o mesmo de subject; não sendo, a escrita é recusada com Encounter's patient does not match the resource's patient. Na atualização essa conferência não acontece, porque o encounter do payload não é nem resolvido.

Um encounter que não resolve, na conduta, também não sai como not-found: sai com o code genérico exception.

Buscar

GET
/fhir/resources/Condition
1curl -G https://landing-zone-api.nilo.services/fhir/resources/Condition \
2 -H "x-api-key: <apiKey>" \
3 -d _count=50 \
4 -d _lastUpdated=eq2013-01-14 \
5 --data-urlencode _page_token=Cjj3YopYuf%2F%2F%2F%2F%2BABd%2BbgE0m...dSANQAFoLCUSM7w9VYUqaEANglLWUugQ%3D \
6 -d abatement-date=ge2026-01-01 \
7 --data-urlencode category=https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/condition-category|event \
8 --data-urlencode clinical-status=http://terminology.hl7.org/CodeSystem/condition-clinical|resolved \
9 --data-urlencode code=http://hl7.org/fhir/sid/icd-10|J06.9 \
10 --data-urlencode encounter=Encounter/7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294 \
11 --data-urlencode identifier=https://www.acmesaude.com.br/integracao/diagnostico/|78901 \
12 --data-urlencode patient=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
13 --data-urlencode patient:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709 \
14 -d recorded-date=ge2026-01-01 \
15 --data-urlencode recorder=Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38 \
16 --data-urlencode subject=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
17 --data-urlencode verification-status=http://terminology.hl7.org/CodeSystem/condition-ver-status|confirmed

A busca é a mesma para os três destinos, porque são o mesmo recurso FHIR. Para trazer só um deles, filtre por category ou por verification-status:

$# só os eventos clínicos de um paciente
$curl --request GET \
> --url 'https://landing-zone-api.nilo.services/fhir/resources/Condition?patient:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709&category=https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/condition-category|event' \
> --header 'x-api-key: SUA_API_KEY'

A resposta é sempre um Bundle do tipo searchset, mesmo quando há um único resultado:

Response
1{
2 "resourceType": "Bundle",
3 "type": "searchset",
4 "entry": [
5 {
6 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Condition/c61b5f58-32b0-477b-b75a-54e306952082",
7 "resource": {
8 "resourceType": "Condition",
9 "subject": {
10 "identifier": {
11 "system": "https://www.acmesaude.com.br/integracao/paciente/",
12 "value": "507823709",
13 "use": "usual"
14 },
15 "type": "Patient",
16 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
17 },
18 "category": [
19 {
20 "coding": [
21 {
22 "code": "encounter-diagnosis",
23 "display": "Encounter Diagnosis",
24 "system": "http://terminology.hl7.org/CodeSystem/condition-category"
25 }
26 ],
27 "text": "Encounter Diagnosis"
28 },
29 {
30 "coding": [
31 {
32 "code": "patient-diagnosis",
33 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/condition-category"
34 }
35 ]
36 }
37 ],
38 "code": {
39 "coding": [
40 {
41 "code": "J06.9",
42 "display": "Infecção aguda das vias aéreas superiores não especificada",
43 "system": "http://hl7.org/fhir/sid/icd-10"
44 }
45 ],
46 "text": "Infecção aguda das vias aéreas superiores não especificada"
47 },
48 "encounter": {
49 "identifier": {
50 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
51 "value": "55162",
52 "use": "usual"
53 },
54 "type": "Encounter",
55 "reference": "Encounter/7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294"
56 },
57 "id": "c61b5f58-32b0-477b-b75a-54e306952082",
58 "identifier": [
59 {
60 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--patient-diagnosis-v3",
61 "value": "412885",
62 "use": "usual"
63 },
64 {
65 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--patient-diagnosis",
66 "value": "412885",
67 "use": "usual"
68 },
69 {
70 "system": "https://www.acmesaude.com.br/integracao/diagnostico/",
71 "value": "78901",
72 "use": "usual"
73 }
74 ],
75 "note": [
76 {
77 "authorReference": {
78 "identifier": {
79 "system": "https://www.acmesaude.com.br/integracao/profissional/",
80 "value": "5032932",
81 "use": "usual"
82 },
83 "type": "Practitioner",
84 "reference": "Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38"
85 },
86 "text": "Paciente relata melhora após 48 h."
87 }
88 ],
89 "recordedDate": "2026-04-16",
90 "recorder": {
91 "identifier": {
92 "system": "https://www.acmesaude.com.br/integracao/profissional/",
93 "value": "5032932",
94 "use": "usual"
95 },
96 "type": "Practitioner",
97 "reference": "Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38"
98 },
99 "verificationStatus": {
100 "coding": [
101 {
102 "code": "confirmed",
103 "display": "Confirmed",
104 "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
105 }
106 ],
107 "text": "Confirmed"
108 }
109 },
110 "search": {
111 "mode": "match"
112 }
113 },
114 {
115 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Condition/2f8b6d31-0c47-4ae9-95d2-6a1e3f70bc84",
116 "resource": {
117 "resourceType": "Condition",
118 "subject": {
119 "identifier": {
120 "system": "https://www.acmesaude.com.br/integracao/paciente/",
121 "value": "507823709",
122 "use": "usual"
123 },
124 "type": "Patient",
125 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
126 },
127 "encounter": {
128 "identifier": {
129 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
130 "value": "55162",
131 "use": "usual"
132 },
133 "type": "Encounter",
134 "reference": "Encounter/7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294"
135 },
136 "id": "2f8b6d31-0c47-4ae9-95d2-6a1e3f70bc84",
137 "identifier": [
138 {
139 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--conduct-v2",
140 "value": "90233",
141 "use": "usual"
142 },
143 {
144 "system": "https://www.acmesaude.com.br/integracao/conduta/",
145 "value": "4471",
146 "use": "usual"
147 }
148 ],
149 "note": [
150 {
151 "text": "Manter hidratação e repouso."
152 },
153 {
154 "text": "Retornar em 7 dias se não houver melhora."
155 }
156 ],
157 "recordedDate": "2026-04-16T20:04:31+00:00",
158 "verificationStatus": {
159 "coding": [
160 {
161 "code": "provisional",
162 "display": "Provisional",
163 "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
164 }
165 ],
166 "text": "Provisional"
167 }
168 },
169 "search": {
170 "mode": "match"
171 }
172 }
173 ],
174 "link": []
175}

Busca sem resultados não é erro: volta 200 com um Bundle cujo entry é uma lista vazia. Trate a ausência de resultados pela lista vazia, não esperando um 404.

Response
1{
2 "resourceType": "Bundle",
3 "type": "searchset",
4 "entry": [],
5 "link": []
6}

Parâmetros de busca suportados

NomeTipoDescriçãoExpressão
identifiertokenIdentificador da condição, em system|valueCondition.identifier
patient:identifierreferencePaciente, pelo identificador deleCondition.subject.identifier
patientreferencePaciente, pelo id Nilo FHIRCondition.subject
subjectreferenceO mesmo campo que patient, e aceita o mesmo :identifierCondition.subject
categorytokenSepara os destinos: event ou patient-diagnosis no system da NiloCondition.category
codetokenCódigo do diagnóstico, num dos três catálogosCondition.code
encounterreferenceAtendimento da condição. Aceita :identifierCondition.encounter
recorderreferenceProfissional que registrou. Aceita :identifierCondition.recorder
verification-statustokenprovisional traz as condutas; nos diagnósticos, o statusCondition.verificationStatus
clinical-statustokenresolved traz as condições encerradasCondition.clinicalStatus
recorded-datedateData de registro, com os prefixos eq, ge, leCondition.recordedDate
abatement-datedateData de encerramento. A plataforma só a produz nos eventos clínicosCondition.abatementDateTime
_lastUpdateddateData da última gravação no store, com os mesmos prefixos

Qual identificador do paciente o subject carrega depende da sua implantação. Na configuração que usa identificadores externos nas referências, é o identificador do seu sistema — e o filtro acima funciona como está. Sem ela, o subject traz o identificador Nilo do paciente (…/NamingSystem/hippocrates-api--patient), e é esse system que você tem de usar no filtro. Confira numa resposta de leitura qual dos dois está lá antes de montar a busca em volume. O mesmo vale para recorder e encounter.

Vários parâmetros canônicos da Condition existem e não encontram nada aqui, porque a Nilo não preenche o campo correspondente: asserter, severity, body-site, evidence, evidence-detail, stage, abatement-string, onset-info e onset-age.

onset-date é um caso à parte: ele só encontra as condições em que você enviou onsetDateTime, porque a plataforma não produz esse campo — nem nos eventos clínicos, onde o início da condição sai em recordedDate. abatement-date tem meia ressalva do mesmo tipo: fora dos eventos clínicos, ele encontra apenas as condições em que você enviou abatementDateTime.

E recorder não encontra condutas, que são gravadas sem profissional.

A paginação é por _count e _page_token; havendo página seguinte, o Bundle traz a URL pronta em link.

Ler por ID

GET
/fhir/resources/Condition/:id
1curl https://landing-zone-api.nilo.services/fhir/resources/Condition/id \
2 -H "x-api-key: <apiKey>"

A leitura por ID responde 404 quando o id não existe.

Diferente da busca, esta leitura não devolve um Bundle — mas também não devolve o recurso nu. A resposta é um envelope com fullUrl, search e resource, e a condição está em resource. Ler code ou identifier na raiz da resposta não encontra nada.

Response
1{
2 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Condition/c61b5f58-32b0-477b-b75a-54e306952082",
3 "resource": {
4 "resourceType": "Condition",
5 "subject": {
6 "identifier": {
7 "system": "https://www.acmesaude.com.br/integracao/paciente/",
8 "value": "507823709",
9 "use": "usual"
10 },
11 "type": "Patient",
12 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
13 },
14 "category": [
15 {
16 "coding": [
17 {
18 "code": "encounter-diagnosis",
19 "display": "Encounter Diagnosis",
20 "system": "http://terminology.hl7.org/CodeSystem/condition-category"
21 }
22 ],
23 "text": "Encounter Diagnosis"
24 },
25 {
26 "coding": [
27 {
28 "code": "patient-diagnosis",
29 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/condition-category"
30 }
31 ]
32 }
33 ],
34 "code": {
35 "coding": [
36 {
37 "code": "J06.9",
38 "display": "Infecção aguda das vias aéreas superiores não especificada",
39 "system": "http://hl7.org/fhir/sid/icd-10"
40 }
41 ],
42 "text": "Infecção aguda das vias aéreas superiores não especificada"
43 },
44 "encounter": {
45 "identifier": {
46 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
47 "value": "55162",
48 "use": "usual"
49 },
50 "type": "Encounter",
51 "reference": "Encounter/7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294"
52 },
53 "id": "c61b5f58-32b0-477b-b75a-54e306952082",
54 "identifier": [
55 {
56 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--patient-diagnosis-v3",
57 "value": "412885",
58 "use": "usual"
59 },
60 {
61 "system": "https://www.acmesaude.com.br/integracao/diagnostico/",
62 "value": "78901",
63 "use": "usual"
64 }
65 ],
66 "meta": {
67 "lastUpdated": "2026-04-16T20:05:03.118000Z",
68 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
69 },
70 "recordedDate": "2026-04-16",
71 "recorder": {
72 "identifier": {
73 "system": "https://www.acmesaude.com.br/integracao/profissional/",
74 "value": "5032932",
75 "use": "usual"
76 },
77 "type": "Practitioner",
78 "reference": "Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38"
79 },
80 "verificationStatus": {
81 "coding": [
82 {
83 "code": "confirmed",
84 "display": "Confirmed",
85 "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
86 }
87 ],
88 "text": "Confirmed"
89 }
90 },
91 "search": {
92 "mode": "match"
93 }
94}

Nem tudo o que você lê foi escrito por esta API. Diagnósticos, condições e condutas registradas pela equipe no NiloCare aparecem aqui do mesmo jeito — e são eles que trazem verificationStatus e clinicalStatus com o status real, e as notas de diagnóstico com authorReference.

Valores aceitos

Catálogos de diagnóstico

Três terminologias, e o code é o código do item nela: CID-10 (http://hl7.org/fhir/sid/icd-10), CIAP-2 (http://hl7.org/fhir/sid/icpc-2) e NANDA (http://terminology.hl7.org/CodeSystem/nanda). Qualquer outro system no coding[0] é recusado.

Os três são catálogos da plataforma, e o código tem de existir neles. Para descobrir o código de um diagnóstico, leia uma condição já registrada pela plataforma e aproveite o code que vier — ou peça a lista ao Suporte.

Classificação

category usa dois system. O do FHIR, condition-category, aparece nas leituras com o código encounter-diagnosis e é constante. O da Nilo, {host}/fhir/resources/CodeSystem/condition-category, é o que roteia e o que identifica o destino na leitura:

CódigoDestino
eventEvento clínico
patient-diagnosisDiagnóstico de atendimento

patient-diagnosis é devolvido nas leituras, mas não é preciso enviá-lo: o diagnóstico de atendimento é o destino padrão, e um payload sem category nenhum chega lá.

Situação e verificação

clinicalStatus usa condition-clinical e verificationStatus usa condition-ver-status. Dos valores do padrão, a plataforma devolve active e resolved no primeiro e unconfirmed, provisional e confirmed no segundo. Na escrita, o único valor com efeito é o provisional que roteia para a conduta.

Efeitos colaterais

Uma conduta sem encounter cria um atendimento já finalizado no prontuário do paciente, para servir de suporte à conduta.

verificationStatus provisional muda o tipo de registro, não só o status. É o efeito colateral mais fácil de disparar sem querer: basta reenviar um diagnóstico provável que foi lido desta API.

Vincular uma condição a uma hospitalização ou pronto atendimento pelo diagnosis do evento altera a condição: ela passa a pertencer àquele evento. Uma condição pertence a um evento só, e a segunda tentativa é recusada — veja o aviso em Hospitalização.

Este endpoint não remove condições: a escrita nunca responde 204. A remoção acontece do lado da plataforma e é propagada para o store FHIR pela sincronização.

Erros

Recusa é 400, e o corpo é um OperationOutcome: issue[].expression aponta o campo culpado e issue[].details.text explica o motivo. O outro código que este endpoint devolve é 409, quando a condição conflita com um registro já existente na plataforma.

codeexpressionMensagemQuando
not-foundCondition.subjectPatient does not existO identificador do paciente não resolve
requiredCondition.recorderField is requiredDiagnóstico ou evento sem recorder
not-foundCondition.recorderProfessional does not existO identificador do profissional não resolve
not-supportedCondition.codeUnknown diagnosis system: …code.coding[0].system fora dos três catálogos
not-foundCondition.codeUnknown … with code: …O código não existe no catálogo
not-foundCondition.encounterEncounter does not existO identificador do atendimento não resolve, no diagnóstico ou no evento
structureCondition.encounter… is not an eventEvento clínico apontando para atendimento do prontuário
invalidCondition.encounterEncounter's patient does not match the resource's patientConduta nova com atendimento de outro paciente
requiredCondition.identifierField is requiredConduta sem identifier
exceptionmensagem genéricaDiagnóstico ou evento sem code; conduta sem note; conduta com encounter que não resolve; identifier já usado em outro destino

Os payloads completos estão na aba Referência, em POST /fhir/resources/Condition.

A última linha da tabela agrupa quatro situações que não saem como required nem como not-found, e sim com o code genérico exception e sem expression. São elas que um integrador tende a tratar errado: não espere um erro de campo obrigatório para code ausente nem para note ausente, e não espere not-found para um encounter de conduta que não resolve. Confira o payload antes de enviar.

O que a integração não cobre

O status de um diagnóstico não é definível por esta API — nem na criação, nem depois. Também não há como registrar a gravidade, o local do corpo, o estadiamento ou a evidência de uma condição, nem adicionar uma nota a um diagnóstico já criado, nem desfazer o vínculo de uma condição com o atendimento dela.

O diagnóstico de atendimento tem início e fim na plataforma, e esta API não os escreve nem os lê: onsetDateTime e abatementDateTime só chegam ao registro no evento clínico. Um diagnóstico com período definido pela equipe volta sem nenhuma data além do recordedDate.

A avaliação clínica e o exame físico do atendimento estão em Avaliação clínica, e a leitura consolidada das condutas de um atendimento está em Conduta. Os medicamentos e os pedidos de exame de um atendimento têm recursos próprios.