Atendimentos

O atendimento é a interação entre o paciente e a equipe com a finalidade de prestar cuidado ou avaliar o estado de saúde. É o registro em torno do qual gira o resto do prontuário — a avaliação clínica, os diagnósticos, as condutas e os documentos emitidos todos apontam para ele.

No FHIR ele é um Encounter, e o campo class decide o que a Nilo cria. Esta página cobre os dois valores que geram um atendimento no prontuário:

class.codeO que a Nilo criaNo NiloCare
VRAtendimento por teleconsultaAtendimentos do paciente
AMBAtendimento presencialAtendimentos do paciente

Os outros dois valores aceitos, EMER e IMP, criam um evento na linha do tempo do paciente em vez de um atendimento, e seguem regras próprias — estão em Pronto atendimento e Hospitalização. Qualquer outro código do vocabulário do FHIR é recusado.

Escrever um atendimento com profissional e sem appointment cria um agendamento na agenda daquele profissional. É o efeito colateral mais forte deste recurso. Antes da primeira carga em volume, leia Agendamento e Efeitos colaterais.

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
identifiersim na práticaChaves do atendimento. É por aqui que a API decide entre criar e atualizar
classsimVR para teleconsulta, AMB para presencial
statussimSituação do atendimento, convertida para um dos três estados da plataforma
subjectsimO paciente atendido, por um identificador dele já cadastrado
period.startsimInício do atendimento
period.endnãoFim do atendimento. Tem de ser maior que period.startFinalizado em
participant[].individualnãoO profissional responsável, por um identificador deleResponsável
participant[].typesim, se há participantPapel do participante. O código tem de ser ATND
appointmentnãoAgendamento já existente a que o atendimento pertence. Um único item
length.valuenãoDuração em minutos do agendamento criado, quando period.end falta
extension encounter-admitSourcenãoDe onde veio o atendimentoOrigem do atendimento
extension encounter-serviceChannelnãoPor qual meio o atendimento foi feitoCanal utilizado para o atendimento
extension encounter-dischargeDispositionnãoComo o atendimento terminouDesfecho do atendimento
idnãoSó resposta: o identificador Nilo FHIR do recurso
metanãoSó resposta: metadados da gravação

As URLs completas das extensões estão em Extensões — nesta página elas aparecem só pelo nome final.

Campos que a Nilo não usa

O Encounter canônico tem campos que esta integração não lê nem grava: type, serviceType, priority, episodeOfCare, basedOn, reasonCode, reasonReference, account, hospitalization, serviceProvider, partOf, classHistory, statusHistory e participant[].period. 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.

Dois em particular:

  • location não é lido num atendimento do prontuário. O local só existe nos eventos.
  • diagnosis não é lido aqui. Os diagnósticos de um atendimento são escritos pelo recurso Condição.

E dois campos do NiloCare não têm representação FHIR alguma: Criado em é o instante em que a plataforma registrou o atendimento — não é period.start e não é escrito por esta API — e o exame físico não tem campo neste recurso.

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 um atendimento com aquele par system + value, ele é atualizado; se não existir, é criado.

POST
/fhir/resources/Encounter
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Encounter \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "class": {
6 "code": "VR",
7 "display": "virtual",
8 "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
9 },
10 "period": {
11 "start": "2026-04-16T19:30:00+00:00",
12 "end": "2026-04-16T20:00:00+00:00"
13 },
14 "resourceType": "Encounter",
15 "status": "finished",
16 "subject": {
17 "identifier": {
18 "system": "https://www.acmesaude.com.br/integracao/paciente/",
19 "value": "507823709",
20 "use": "usual"
21 },
22 "type": "Patient"
23 },
24 "identifier": [
25 {
26 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
27 "value": "55162",
28 "use": "usual"
29 }
30 ],
31 "participant": [
32 {
33 "individual": {
34 "identifier": {
35 "system": "https://www.acmesaude.com.br/integracao/profissional/",
36 "value": "5032932",
37 "use": "usual"
38 },
39 "type": "Practitioner"
40 },
41 "type": [
42 {
43 "coding": [
44 {
45 "code": "ATND",
46 "display": "attender",
47 "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType"
48 }
49 ],
50 "text": "attender"
51 }
52 ]
53 }
54 ]
55}'

A resposta devolve o recurso como ficou gravado:

Response
1{
2 "class": {
3 "code": "VR",
4 "display": "virtual",
5 "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
6 },
7 "period": {
8 "start": "2026-04-16T19:30:00+00:00",
9 "end": "2026-04-16T20:00:00+00:00"
10 },
11 "resourceType": "Encounter",
12 "status": "finished",
13 "subject": {
14 "identifier": {
15 "system": "https://www.acmesaude.com.br/integracao/paciente/",
16 "value": "507823709",
17 "use": "usual"
18 },
19 "type": "Patient",
20 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
21 },
22 "id": "7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294",
23 "meta": {
24 "lastUpdated": "2026-04-16T20:00:12.441000Z",
25 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
26 },
27 "identifier": [
28 {
29 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--appointment-v3",
30 "value": "318472",
31 "use": "usual"
32 },
33 {
34 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
35 "value": "55162",
36 "use": "usual"
37 }
38 ],
39 "participant": [
40 {
41 "individual": {
42 "identifier": {
43 "system": "https://www.acmesaude.com.br/integracao/profissional/",
44 "value": "5032932",
45 "use": "usual"
46 },
47 "type": "Practitioner",
48 "reference": "Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38"
49 },
50 "type": [
51 {
52 "coding": [
53 {
54 "code": "ATND",
55 "display": "attender",
56 "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType"
57 }
58 ],
59 "text": "attender"
60 }
61 ]
62 }
63 ]
64}

Guarde o id: é por ele que se faz a leitura direta. A resposta traz também o identificador Nilo do atendimento ao lado do seu, no system:

{host}/fhir/resources/NamingSystem/care-api--appointment-v3

Atendimentos sincronizados há mais tempo podem carregar também um identificador no system …/NamingSystem/care-api--appointment, sem o -v3. É o mesmo atendimento: o system antigo é preservado para não partir o histórico. Nos registros novos só o -v3 aparece.

E as consultas antigas do histórico do paciente, que esta API não escreve, chegam com um terceiro system: …/NamingSystem/hippocrates-api--appointment. Veja o aviso em Ler por ID.

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 o atendimento, e cada POST cria um atendimento novo. Mande sempre a sua chave.

A atualização substitui, não complementa. Assim como no Coverage e no Practitioner, e diferente do Patient, um campo omitido não preserva o valor atual: omitir period.end volta o atendimento para em andamento, omitir participant apaga o responsável, e omitir as extensões apaga origem, canal e desfecho. Para mudar um campo só, reenvie o atendimento inteiro com o valor novo.

Exceção: o vínculo com o agendamento é preservado — veja Agendamento.

Situação do atendimento

status é obrigatório pelo FHIR R4, e os nove valores do padrão são convertidos para os três estados que a plataforma tem:

status enviadoEstado na Nilostatus nas leituras seguintes
planned · arrived · triagedAguardandoplanned
in-progress · onleave · entered-in-error · unknownEm andamentoin-progress
finished · cancelledFinalizadofinished

O status que você enviou continua no recurso FHIR e volta na leitura imediatamente seguinte — inclusive um cancelled, que a plataforma não tem. O valor da plataforma só aparece na próxima vez que o atendimento mudar por lá, e aí substitui o seu. Ou seja: reler o recurso logo depois do POST não confirma o que a Nilo registrou. Use a tabela acima para saber o estado real.

Vale para todo campo que a Nilo não lê, não só para o status: um reenvio em que nada do que a plataforma usa mudou pode não regravar o recurso FHIR, e aí a resposta traz o recurso como ele estava antes. Se você depende de um campo que só existe no seu payload, não conte com ele ter sido atualizado por um reenvio.

Período

period.start é obrigatório:

Response
1{
2 "errors": "Encounter class SS is not supported"
3}

period.end é opcional, e quando enviado tem de ser maior que period.start — dois valores iguais são recusados:

Response
1{
2 "errors": "Encounter class SS is not supported"
3}

Profissional responsável

O FHIR permite vários participantes num atendimento; a Nilo registra um: o primeiro item de participant cujo type traz o código ATND.

1{
2 "type": [
3 {
4 "coding": [
5 {
6 "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType",
7 "code": "ATND"
8 }
9 ]
10 }
11 ],
12 "individual": { "type": "Practitioner", "identifier": { "": "" } }
13}

Um item de participant sem type faz a escrita falhar com um erro genérico, em vez de ser ignorado. Se você não tem o papel do participante, não mande o participant.

O profissional precisa existir — no store FHIR e no cadastro da plataforma. Uma das duas ausências recusa a escrita, com mensagens diferentes:

Response
1{
2 "errors": "Encounter class SS is not supported"
3}
Response
1{
2 "errors": "Encounter class SS is not supported"
3}

O participant é opcional. Sem ele, o atendimento é criado sem responsável — e sem agendamento:

POST
/fhir/resources/Encounter
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Encounter \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "class": {
6 "code": "AMB",
7 "display": "ambulatory",
8 "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
9 },
10 "period": {
11 "start": "2026-04-16T14:00:00+00:00",
12 "end": "2026-04-16T14:40:00+00:00"
13 },
14 "resourceType": "Encounter",
15 "status": "finished",
16 "subject": {
17 "identifier": {
18 "system": "https://www.acmesaude.com.br/integracao/paciente/",
19 "value": "507823709",
20 "use": "usual"
21 },
22 "type": "Patient"
23 },
24 "identifier": [
25 {
26 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
27 "value": "55163",
28 "use": "usual"
29 }
30 ]
31}'

Agendamento

Um atendimento do prontuário pode estar ligado a um agendamento na agenda do profissional, e o campo appointment é como você diz qual:

POST
/fhir/resources/Encounter
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Encounter \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "class": {
6 "code": "VR",
7 "display": "virtual",
8 "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
9 },
10 "period": {
11 "start": "2026-04-16T19:30:00+00:00",
12 "end": "2026-04-16T20:00:00+00:00"
13 },
14 "resourceType": "Encounter",
15 "status": "finished",
16 "subject": {
17 "identifier": {
18 "system": "https://www.acmesaude.com.br/integracao/paciente/",
19 "value": "507823709",
20 "use": "usual"
21 },
22 "type": "Patient"
23 },
24 "identifier": [
25 {
26 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
27 "value": "55165",
28 "use": "usual"
29 }
30 ],
31 "appointment": [
32 {
33 "identifier": {
34 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--scheduling-v2",
35 "value": "90218",
36 "use": "usual"
37 },
38 "type": "Appointment"
39 }
40 ],
41 "participant": [
42 {
43 "individual": {
44 "identifier": {
45 "system": "https://www.acmesaude.com.br/integracao/profissional/",
46 "value": "5032932",
47 "use": "usual"
48 },
49 "type": "Practitioner"
50 },
51 "type": [
52 {
53 "coding": [
54 {
55 "code": "ATND",
56 "display": "attender",
57 "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType"
58 }
59 ],
60 "text": "attender"
61 }
62 ]
63 }
64 ]
65}'

Um único item — mais de um é recusado:

Response
1{
2 "errors": "Encounter class SS is not supported"
3}

Essa validação só acontece quando há um profissional no participant. Sem profissional, dois appointment passam sem erro e nenhum deles é usado.

Sem appointment e com profissional, um agendamento novo é criado. A API primeiro procura um agendamento daquele profissional para aquele paciente começando exatamente em period.start; não achando, cria um, com conflito de agenda permitido e um resumo gerado automaticamente. O agendamento entra como Agendado se period.start está no futuro e como Realizado se está no passado.

Uma carga histórica de atendimentos com profissional, portanto, popula a agenda de cada profissional com um agendamento por atendimento.

appointment só é considerado quando existe um participant com profissional. Enviar appointment sem profissional não gera erro: a referência é simplesmente ignorada, e o atendimento fica sem agendamento. E numa atualização, o agendamento já vinculado ao atendimento é mantido — o appointment do payload não o troca.

O exemplo acima referencia o agendamento pelo system Nilo (…/NamingSystem/care-api--scheduling-v2), que é o que você tem quando o agendamento nasceu na plataforma. Qualquer identificador do agendamento serve, inclusive um do seu sistema.

Quando o agendamento é criado, a duração dele vem de period.end. Faltando period.end, ela vem de length.value, em minutos:

POST
/fhir/resources/Encounter
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Encounter \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "class": {
6 "code": "VR",
7 "display": "virtual",
8 "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
9 },
10 "period": {
11 "start": "2026-04-16T19:30:00+00:00"
12 },
13 "resourceType": "Encounter",
14 "status": "in-progress",
15 "subject": {
16 "identifier": {
17 "system": "https://www.acmesaude.com.br/integracao/paciente/",
18 "value": "507823709",
19 "use": "usual"
20 },
21 "type": "Patient"
22 },
23 "identifier": [
24 {
25 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
26 "value": "55164",
27 "use": "usual"
28 }
29 ],
30 "length": {
31 "value": 20
32 },
33 "participant": [
34 {
35 "individual": {
36 "identifier": {
37 "system": "https://www.acmesaude.com.br/integracao/profissional/",
38 "value": "5032932",
39 "use": "usual"
40 },
41 "type": "Practitioner"
42 },
43 "type": [
44 {
45 "coding": [
46 {
47 "code": "ATND",
48 "display": "attender",
49 "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType"
50 }
51 ],
52 "text": "attender"
53 }
54 ]
55 }
56 ]
57}'

Sem period.end e sem length, o agendamento é criado com 1 minuto de duração. period.end tem prioridade: enviando os dois, length é ignorado.

length é lido sempre em minutos, e a unidade que você declarar é ignorada. {"value": 2, "unit": "h"} produz um agendamento de 2 minutos, não de 2 horas. Converta para minutos antes de enviar.

Origem, canal e desfecho

Três extensões descrevem o contexto do atendimento. Todas carregam um valueCodeableConcept cujo coding.code é o código do catálogo da sua implantação:

POST
/fhir/resources/Encounter
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Encounter \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "class": {
6 "code": "VR",
7 "display": "virtual",
8 "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
9 },
10 "period": {
11 "start": "2026-04-16T19:30:00+00:00",
12 "end": "2026-04-16T20:00:00+00:00"
13 },
14 "resourceType": "Encounter",
15 "status": "finished",
16 "subject": {
17 "identifier": {
18 "system": "https://www.acmesaude.com.br/integracao/paciente/",
19 "value": "507823709",
20 "use": "usual"
21 },
22 "type": "Patient"
23 },
24 "identifier": [
25 {
26 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
27 "value": "55166",
28 "use": "usual"
29 }
30 ],
31 "extension": [
32 {
33 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/encounter-admitSource",
34 "valueCodeableConcept": {
35 "coding": [
36 {
37 "code": "1",
38 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/encounter-admitSource"
39 }
40 ]
41 }
42 },
43 {
44 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/encounter-serviceChannel",
45 "valueCodeableConcept": {
46 "coding": [
47 {
48 "code": "3",
49 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/encounter-serviceChannel"
50 }
51 ]
52 }
53 },
54 {
55 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/encounter-dischargeDisposition",
56 "valueCodeableConcept": {
57 "coding": [
58 {
59 "code": "7",
60 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/encounter-dischargeDisposition"
61 }
62 ]
63 }
64 }
65 ]
66}'
ExtensãoNo NiloCare
encounter-admitSourceOrigem do atendimento
encounter-serviceChannelCanal utilizado para o atendimento
encounter-dischargeDispositionDesfecho do atendimento

O coding.system precisa ser o do catálogo correspondente — {host}/fhir/resources/CodeSystem/encounter-admitSource e equivalentes. Um coding em outro system é ignorado, e a extensão não tem efeito. Aqui, diferente do class, o system é conferido.

Havendo mais de uma extensão com a mesma URL no payload, vale a primeira. E na leitura a Nilo devolve o display e o text preenchidos com o nome do item do catálogo, que é o que aparece na tela — no envio esses dois campos não são necessários.

Os códigos de origem, canal e desfecho são configurados por implantação, e não há catálogo publicado nesses system: GET /fhir/resources/CodeSystem/encounter-admitSource responde 404. Peça a lista ao Suporte, ou leia um atendimento já registrado pela plataforma e aproveite os códigos que vierem nas extensões.

Paciente

subject é obrigatório, e o paciente tem de existir — no store FHIR e no cadastro da plataforma. As duas ausências têm mensagens diferentes:

Response
1{
2 "errors": "Encounter class SS is not supported"
3}
Response
1{
2 "errors": "Encounter class SS is not supported"
3}

Um atendimento não cria paciente. Cadastre o Paciente primeiro.

Buscar

GET
/fhir/resources/Encounter
1curl -G https://landing-zone-api.nilo.services/fhir/resources/Encounter \
2 -H "x-api-key: <apiKey>" \
3 -d _lastUpdated=eq2013-01-14 \
4 --data-urlencode _page_token=Cjj3YopYuf%2F%2F%2F%2F%2BABd%2BbgE0m...dSANQAFoLCUSM7w9VYUqaEANglLWUugQ%3D \
5 --data-urlencode class=http://terminology.hl7.org/CodeSystem/v3-ActCode|VR \
6 -d date=ge2026-04-01 \
7 --data-urlencode diagnosis=Condition/c61b5f58-32b0-477b-b75a-54e306952082 \
8 --data-urlencode identifier=https://www.acmesaude.com.br/integracao/atendimento/|55162 \
9 --data-urlencode participant=Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38 \
10 --data-urlencode participant-type=http://terminology.hl7.org/CodeSystem/v3-ParticipationType|ATND \
11 --data-urlencode patient=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
12 --data-urlencode patient:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709 \
13 --data-urlencode practitioner=Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38 \
14 -d status=finished \
15 --data-urlencode subject=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4

A busca é a mesma para atendimentos e eventos, porque os quatro tipos são o mesmo recurso FHIR. Para trazer só os atendimentos do prontuário, filtre por class:

$curl --request GET \
> --url 'https://landing-zone-api.nilo.services/fhir/resources/Encounter?patient:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709&class=VR,AMB' \
> --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/Encounter/7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294",
7 "resource": {
8 "class": {
9 "code": "VR",
10 "display": "virtual",
11 "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
12 },
13 "period": {
14 "start": "2026-04-16T19:30:00+00:00",
15 "end": "2026-04-16T20:00:00+00:00"
16 },
17 "resourceType": "Encounter",
18 "status": "finished",
19 "subject": {
20 "identifier": {
21 "system": "https://www.acmesaude.com.br/integracao/paciente/",
22 "value": "507823709",
23 "use": "usual"
24 },
25 "type": "Patient",
26 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
27 },
28 "id": "7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294",
29 "identifier": [
30 {
31 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--appointment-v3",
32 "value": "318472",
33 "use": "usual"
34 },
35 {
36 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
37 "value": "55162",
38 "use": "usual"
39 }
40 ],
41 "extension": [
42 {
43 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/encounter-serviceChannel",
44 "valueCodeableConcept": {
45 "coding": [
46 {
47 "code": "3",
48 "display": "Vídeo",
49 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/encounter-serviceChannel"
50 }
51 ],
52 "text": "Vídeo"
53 }
54 }
55 ],
56 "participant": [
57 {
58 "individual": {
59 "identifier": {
60 "system": "https://www.acmesaude.com.br/integracao/profissional/",
61 "value": "5032932",
62 "use": "usual"
63 },
64 "type": "Practitioner",
65 "reference": "Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38"
66 },
67 "type": [
68 {
69 "coding": [
70 {
71 "code": "ATND",
72 "display": "attender",
73 "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType"
74 }
75 ],
76 "text": "attender"
77 }
78 ]
79 }
80 ]
81 },
82 "search": {
83 "mode": "match"
84 }
85 }
86 ],
87 "link": []
88}

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 do atendimento, em system|valueEncounter.identifier
patient:identifierreferencePaciente atendido, pelo identificador deleEncounter.subject.identifier
patientreferencePaciente atendido, pelo id Nilo FHIREncounter.subject
subjectreferenceO mesmo campo que patient, e aceita o mesmo :identifierEncounter.subject
classtokenTipo do atendimento — VR ou AMB aqui, EMER e IMP nos eventosEncounter.class
statustokenSituação — na prática, planned, in-progress ou finishedEncounter.status
datedatePeríodo do atendimento, com os prefixos eq, ge, leEncounter.period
practitionerreferenceProfissional responsável. Aceita :identifierEncounter.participant.individual
participantreferenceO mesmo campo que practitionerEncounter.participant.individual
participant-typetokenPapel do participante — ATND nos atendimentos do prontuárioEncounter.participant.type

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 practitioner.

Vários parâmetros canônicos do Encounter existem e não encontram nada aqui, porque a Nilo não preenche o campo correspondente: type, service-provider, episode-of-care, based-on, part-of, reason-code, reason-reference, account e special-arrangement.

appointment e length só encontram os atendimentos em que você enviou aqueles campos — a plataforma não os produz por conta própria. E location e diagnosis só encontram eventos.

Ler por ID

GET
/fhir/resources/Encounter/:id
1curl https://landing-zone-api.nilo.services/fhir/resources/Encounter/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 o atendimento está em resource. Ler status ou identifier na raiz da resposta não encontra nada.

Response
1{
2 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Encounter/7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294",
3 "resource": {
4 "class": {
5 "code": "VR",
6 "display": "virtual",
7 "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode"
8 },
9 "period": {
10 "start": "2026-04-16T19:30:00+00:00",
11 "end": "2026-04-16T20:00:00+00:00"
12 },
13 "resourceType": "Encounter",
14 "status": "finished",
15 "subject": {
16 "identifier": {
17 "system": "https://www.acmesaude.com.br/integracao/paciente/",
18 "value": "507823709",
19 "use": "usual"
20 },
21 "type": "Patient",
22 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
23 },
24 "id": "7c1d4e08-52ba-4f37-9e6a-3b0d81f5c294",
25 "meta": {
26 "lastUpdated": "2026-04-16T20:00:12.441000Z",
27 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
28 },
29 "identifier": [
30 {
31 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--appointment-v3",
32 "value": "318472",
33 "use": "usual"
34 },
35 {
36 "system": "https://www.acmesaude.com.br/integracao/atendimento/",
37 "value": "55162",
38 "use": "usual"
39 }
40 ],
41 "extension": [
42 {
43 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/encounter-admitSource",
44 "valueCodeableConcept": {
45 "coding": [
46 {
47 "code": "1",
48 "display": "Busca ativa",
49 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/encounter-admitSource"
50 }
51 ],
52 "text": "Busca ativa"
53 }
54 },
55 {
56 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/encounter-serviceChannel",
57 "valueCodeableConcept": {
58 "coding": [
59 {
60 "code": "3",
61 "display": "Vídeo",
62 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/encounter-serviceChannel"
63 }
64 ],
65 "text": "Vídeo"
66 }
67 },
68 {
69 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/encounter-dischargeDisposition",
70 "valueCodeableConcept": {
71 "coding": [
72 {
73 "code": "7",
74 "display": "Alta",
75 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/encounter-dischargeDisposition"
76 }
77 ],
78 "text": "Alta"
79 }
80 }
81 ],
82 "participant": [
83 {
84 "individual": {
85 "identifier": {
86 "system": "https://www.acmesaude.com.br/integracao/profissional/",
87 "value": "5032932",
88 "use": "usual"
89 },
90 "type": "Practitioner",
91 "reference": "Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38"
92 },
93 "type": [
94 {
95 "coding": [
96 {
97 "code": "ATND",
98 "display": "attender",
99 "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType"
100 }
101 ],
102 "text": "attender"
103 }
104 ]
105 }
106 ]
107 },
108 "search": {
109 "mode": "match"
110 }
111}

Nem tudo o que você lê foi escrito por esta API. Atendimentos registrados pela equipe no NiloCare aparecem aqui do mesmo jeito — e consultas mais antigas do histórico do paciente vêm com class AMB, status finished e um participant que traz apenas o papel, com o código CBO da especialidade em type, sem individual. É a especialidade que atendeu, não a pessoa.

Valores aceitos

Classes

class.code usa o vocabulário v3-ActEncounterCode. Os dois códigos desta página:

CódigodisplayO que cria
VRvirtualAtendimento por teleconsulta
AMBambulatoryAtendimento presencial

O system esperado é http://terminology.hl7.org/CodeSystem/v3-ActCode. Os códigos que criam evento em vez de atendimento — EMER e IMP — estão nas páginas dos eventos. Qualquer outro código do vocabulário (HH, SS, OBSENC, PRENC, FLD, ACUTE, NONAC) é recusado:

Response
1{
2 "errors": "Encounter class SS is not supported"
3}

Situações

status aceita os nove códigos do FHIR R4 no envio. Nas leituras, só três aparecem: planned, in-progress e finished. A conversão está em Situação do atendimento.

Papel do participante

participant[].type usa o vocabulário v3-ParticipationType. O único código com significado aqui é ATND (attender), e é o que a Nilo devolve nas leituras.

Catálogos de origem, canal e desfecho

Não são vocabulários desta API: são catálogos que a sua implantação mantém, e o code é o id do item no catálogo. Não há catálogo publicado nesses system — veja o aviso em Origem, canal e desfecho.

Efeitos colaterais

Um atendimento com profissional e sem appointment cria um agendamento na agenda daquele profissional, com conflito de agenda permitido.

Reenviar um atendimento cujo identificador aponta para um registro que não existe mais na Nilo faz a API remover o recurso FHIR órfão e criar um atendimento novo em seguida. É a forma de não deixar dois recursos com o mesmo identificador, mas o id Nilo FHIR muda: o id que você tinha guardado deixa de resolver.

Este endpoint não remove atendimentos: 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 é 429, quando o limite de escrita do tipo de recurso é atingido — nesse caso, aguarde e repita.

Há uma exceção de forma. O class.code não suportado é recusado antes de o atendimento chegar à camada FHIR, e volta com só um campo errors com a mensagem, sem issue, sem code e sem expression:

Response
1{
2 "errors": "Encounter class SS is not supported"
3}

O que a integração não cobre

A avaliação clínica, o exame físico e os pontos de atenção de um atendimento não são campos do Encounter: estão em Avaliação clínica. As condutas e orientações estão em Conduta, os diagnósticos do atendimento em Condição e os medicamentos em Medicamento. Os documentos emitidos no atendimento — prescrição, solicitação de exame e encaminhamento — também têm recursos próprios. O plano de cuidado do paciente não é alcançável a partir do atendimento.

Também não há como, por esta API: registrar mais de um profissional num atendimento, ou informar o local de um atendimento do prontuário — local só existe nos eventos.