Consulta prevista

Uma consulta prevista é o que a diretriz mandou acontecer: quando o plano de cuidado de um paciente é criado, ele gera uma consulta prevista para cada consulta que a diretriz determina — retorno com o endocrinologista em 90 dias, por exemplo.

Ela ainda não é um agendamento: é a intenção de um. Enquanto o paciente não marca, ela fica esperando; quando marca, um agendamento é criado e a plataforma liga os dois — mas esse elo é interno e não aparece neste recurso. No Nilo Care a consulta prevista fica no bloco de agendamentos da diretriz aplicada ao paciente.

No FHIR o recurso é o Schedule.

Este recurso é somente leitura. Não existe POST /fhir/resources/Schedule — as consultas previstas são geradas pela plataforma a partir da diretriz, e não há como criá-las, alterá-las ou cancelá-las por esta API.

As mesmas consultas previstas também aparecem em activity[] do plano de cuidado do paciente, junto com as tarefas e os questionários que a diretriz gerou. A vantagem desta página é poder buscá-las diretamente, sem passar pelo plano.

Campos

Todos os campos são de resposta — nenhum deles é enviado por você.

CampoSempre presenteO que significaNo Nilo Care
resourceTypesimConstante Schedule
identifiersimIdentificador Nilo da consulta prevista, no system …/NamingSystem/hippocrates-api--guideline-patient-scheduling
activesimSe a situação da consulta prevista ainda está em aberto — veja o avisoo selo de situação
actor[]quase sempreO paciente e, quando houver, o profissional
planningHorizon.startsimA data prevista para a consultaa data do agendamento previsto
planningHorizon.endnãoO instante em que a consulta prevista foi encerrada
specialty[0].textsimA especialidade da consultaa especialidade do agendamento previsto
serviceType[0].textnãoO tipo de atendimento previsto, como está cadastrado na plataforma
commentnãoTexto de diagnóstico em formato interno — veja o aviso
id · metasimIdentificador Nilo FHIR do recurso e metadados da gravação

specialty vem sempre — a especialidade é obrigatória do lado da plataforma. serviceType, não: só aparece quando o tipo de atendimento está definido, e o vocabulário dele é o da plataforma, não uma lista fixa deste contrato.

active esconde oito situações em duas

A plataforma distingue oito situações para uma consulta prevista. Este recurso reduz todas a um booleano:

Situação na plataformaactive
Disponível para o paciente marcartrue
Aguardando o paciente marcartrue
Falha no envio do link de agendamentotrue
Já agendadatrue
Canceladafalse
Finalizadafalse
Não realizadafalse
Desatualizadafalse

active: true não quer dizer que a consulta foi marcada. Uma consulta prevista que o paciente ainda não agendou e uma que ele já agendou saem exatamente iguais aqui. E active: false junta o cancelamento, a conclusão e a desatualização num valor só.

Se a sua integração precisa saber se a consulta aconteceu, este recurso não responde. O agendamento de verdade é outro recurso, e a consulta prevista não traz referência para ele — mas o activity[] do plano de cuidado traz.

E há uma segunda situação, que não é a mesma coisa. Além da situação acima, a equipe pode marcar uma consulta prevista à mão como feita ou não feita. Esse segundo eixo não mexe no active: uma consulta marcada à mão como feita continua active: true — e, apesar disso, ganha um planningHorizon.end.

O único lugar onde essa marcação aparece é o comment, como manual-status:done ou manual-status:not_done. Não conte com active para saber se a consulta foi resolvida.

O selo Atrasada, que a equipe vê quando o prazo de agendar passou, também não tem campo aqui: uma consulta prevista atrasada continua active: true.

Os selos que a equipe vê não são um por situação: a tela combina a situação, o atraso e a marcação manual antes de escolher o selo, e mais de uma situação desta tabela pode aparecer sem selo nenhum. Não tente casar active com o que está na tela.

planningHorizon não é um prazo

planningHorizon.start é a data prevista para a consulta, e planningHorizon.end é o instante em que a consulta prevista foi encerrada — não a data limite para marcá-la.

Três consequências:

  • numa consulta prevista em aberto, planningHorizon vem só com start. Um cliente que espere sempre os dois extremos quebra;
  • end aparece também quando a equipe marca a consulta à mão como feita — e nesse caso active continua true. Ver end preenchido não significa active: false;
  • end é um instante com hora, enquanto start é uma data pura. Eles não descrevem a mesma coisa e não formam um intervalo de agenda.

O prazo para o paciente marcar não tem campo neste recurso. Ele aparece no plano de cuidado, em activity[].detail.scheduledPeriod, como uma janela fixa de sete dias a partir da data prevista.

comment vaza formato interno

Quando há motivo de cancelamento ou situação marcada à mão, comment traz os dois num texto montado internamente:

cancelled-reason:Paciente remarcou | manual-status:not_done

Não é contrato. O formato pode mudar sem aviso, os valores não são traduzidos e não há garantia de que os dois pedaços apareçam. Use comment só para exibição a um humano, e nunca faça parsing dele.

Quando não há nem motivo de cancelamento nem situação manual, o campo não vem.

Um cancelled-reason não implica consulta cancelada. Cancelar o agendamento sem remover a consulta prevista devolve ela para disponível — e o motivo do cancelamento fica gravado. Você verá active: true com um cancelled-reason no comment.

Leia actor pelo tipo, não pela posição

Na prática o paciente vem primeiro e o profissional depois, mas isso não é garantido: se o paciente não puder ser resolvido, o profissional ocupa a primeira posição e o array vem com um item só.

Case pelo actor[].typePatient ou Practitioner —, nunca por índice.

Qual identificador a referência de actor carrega depende da sua implantação. Na configuração que usa identificadores externos, cada referência sai com o identificador do seu sistema se o recurso apontado tiver um; se não tiver, cai silenciosamente no identificador Nilo. Confira o que veio na resposta antes de montar a busca em volume.

Campos que a Nilo não usa

O Schedule canônico tem campos que esta integração não produz: serviceCategory, specialty como código (aqui só há text) e actor com papéis distinguíveis. Como esta referência descreve só o que é suportado, eles não aparecem no schema — e, como não há escrita, também não há como preenchê-los.

specialty e serviceType são CodeableConcept, mas vêm só com text, nunca com coding. Não há código para casar com um catálogo: o que você recebe é o nome, como ele está cadastrado — e, por isso, não há como buscar por eles (veja Parâmetros de busca).

specialty ainda tem uma degradação silenciosa: quando a especialidade não tem nome cadastrado, o text traz o identificador numérico dela — um valor como "418", que parece um nome e não é. Se o texto for só dígitos, trate como desconhecido.

Cadastrar ou atualizar

Não existe. Este recurso não tem caminho de escrita nesta API — nem para criar, nem para atualizar, nem para cancelar uma consulta prevista.

Um POST /fhir/resources/Schedule não é uma operação suportada e não devolve um erro de validação tratável: a chamada falha com erro inesperado do servidor (500). Não escreva tratamento em cima desse comportamento — ele não é contrato, e nada é gravado de qualquer forma.

Dentro de uma carga em lote o erro é limpo, e igualmente definitivo: a entrada é recusada com Resource Schedule not supported.

O que existe de escrita nesta área é a aplicação da diretriz — veja Plano de cuidado. As consultas previstas nascem dela.

Buscar

GET
/fhir/resources/Schedule
1curl -G https://landing-zone-api.nilo.services/fhir/resources/Schedule \
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 active=true \
7 --data-urlencode actor=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
8 --data-urlencode actor:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709 \
9 -d date=ge2026-06-01 \
10 --data-urlencode identifier=https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--guideline-patient-scheduling|90412 \
11 --data-urlencode "service-type=Consulta de retorno" \
12 -d specialty=Endocrinologia

A resposta é sempre um Bundle do tipo searchset:

Response
1{
2 "resourceType": "Bundle",
3 "type": "searchset",
4 "entry": [
5 {
6 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Schedule/6a2f70b4-cd39-4185-92e7-8b04f1c6ae53",
7 "resource": {
8 "resourceType": "Schedule",
9 "identifier": [
10 {
11 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--guideline-patient-scheduling",
12 "value": "90412",
13 "use": "usual"
14 }
15 ],
16 "id": "6a2f70b4-cd39-4185-92e7-8b04f1c6ae53",
17 "meta": {
18 "lastUpdated": "2026-05-20T08:12:03.552000Z",
19 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
20 },
21 "active": true,
22 "actor": [
23 {
24 "identifier": {
25 "system": "https://www.acmesaude.com.br/integracao/paciente/",
26 "value": "507823709",
27 "use": "usual"
28 },
29 "type": "Patient",
30 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
31 },
32 {
33 "identifier": {
34 "system": "https://www.acmesaude.com.br/integracao/profissional/",
35 "value": "5032932",
36 "use": "usual"
37 },
38 "type": "Practitioner",
39 "reference": "Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19"
40 }
41 ],
42 "planningHorizon": {
43 "start": "2026-06-15"
44 },
45 "specialty": [
46 {
47 "text": "Endocrinologia"
48 }
49 ],
50 "serviceType": [
51 {
52 "text": "Consulta de retorno"
53 }
54 ]
55 },
56 "search": {
57 "mode": "match"
58 }
59 },
60 {
61 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Schedule/c93a1e07-45b8-4d26-b7f1-08e5c2947da6",
62 "resource": {
63 "resourceType": "Schedule",
64 "identifier": [
65 {
66 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--guideline-patient-scheduling",
67 "value": "90413",
68 "use": "usual"
69 }
70 ],
71 "id": "c93a1e07-45b8-4d26-b7f1-08e5c2947da6",
72 "meta": {
73 "lastUpdated": "2026-05-22T17:45:11.908000Z",
74 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM4NQ"
75 },
76 "active": false,
77 "actor": [
78 {
79 "identifier": {
80 "system": "https://www.acmesaude.com.br/integracao/paciente/",
81 "value": "507823709",
82 "use": "usual"
83 },
84 "type": "Patient",
85 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
86 }
87 ],
88 "planningHorizon": {
89 "end": "2026-05-22T17:45:10+00:00",
90 "start": "2026-05-18"
91 },
92 "specialty": [
93 {
94 "text": "Nutrição"
95 }
96 ],
97 "comment": "cancelled-reason:Paciente remarcou | manual-status:not_done"
98 },
99 "search": {
100 "mode": "match"
101 }
102 }
103 ],
104 "link": []
105}

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 consulta prevista, em system|valueSchedule.identifier
actorreferencePaciente ou profissional, pelo id Nilo FHIR deleSchedule.actor
actor:identifierreferenceO mesmo, pelo identificador embutido na referênciaSchedule.actor.identifier
activetokentrue ou falseSchedule.active
datedateData prevista, com os prefixos eq, ge, leSchedule.planningHorizon
_lastUpdateddateData da última gravação no store, com os prefixos eq, ge, le

Em date, prefira o prefixo ge. Como a consulta prevista em aberto não tem planningHorizon.end, o período é semanticamente aberto, e eq e le sobre um período aberto se comportam de forma pouco intuitiva.

actor não distingue paciente de profissional. É um só parâmetro para os dois papéis: buscar por um profissional devolve as consultas previstas em que ele é o profissional, e buscar por um paciente devolve as dele — mas não há como pedir “as consultas em que este paciente é o paciente” de forma explícita. Na prática isso não gera confusão, porque um identificador de paciente não casa com um profissional.

Os demais parâmetros canônicos do Schedule existem e não encontram nada aqui: service-category, porque a plataforma não preenche o campo; e specialty e service-type, porque os dois são parâmetros de token, que procuram dentro de coding — e a Nilo preenche só o text. Buscar pelo nome da especialidade ou do tipo de atendimento não devolve nada.

Não há parâmetro que ligue a consulta prevista ao plano de cuidado que a gerou. Para listar as consultas previstas de um plano, leia o activity[] do plano de cuidado.

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/Schedule/:id
1curl https://landing-zone-api.nilo.services/fhir/resources/Schedule/id \
2 -H "x-api-key: <apiKey>"

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 consulta prevista está em resource. Ler active ou planningHorizon na raiz da resposta não encontra nada.

Response
1{
2 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Schedule/6a2f70b4-cd39-4185-92e7-8b04f1c6ae53",
3 "resource": {
4 "resourceType": "Schedule",
5 "identifier": [
6 {
7 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--guideline-patient-scheduling",
8 "value": "90412",
9 "use": "usual"
10 }
11 ],
12 "id": "6a2f70b4-cd39-4185-92e7-8b04f1c6ae53",
13 "meta": {
14 "lastUpdated": "2026-05-20T08:12:03.552000Z",
15 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
16 },
17 "active": true,
18 "actor": [
19 {
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 ],
29 "planningHorizon": {
30 "start": "2026-06-15"
31 },
32 "specialty": [
33 {
34 "text": "Endocrinologia"
35 }
36 ],
37 "serviceType": [
38 {
39 "text": "Consulta de retorno"
40 }
41 ]
42 },
43 "search": {
44 "mode": "match"
45 }
46}

A leitura por ID responde 404 quando o id não existe — inclusive quando a consulta prevista foi removida junto com o plano de cuidado que a gerou.

O que a integração não cobre

Não há escrita, e vários dados que a plataforma guarda não têm campo aqui:

  • o agendamento que a consulta prevista virou — não há referência para ele;
  • o plano de cuidado que a gerou, e a diretriz por trás dele;
  • o prazo para o paciente marcar — ele está no activity[].detail.scheduledPeriod do plano de cuidado, não aqui;
  • quem cancelou a consulta prevista;
  • a distinção entre as oito situações da plataforma, reduzida ao booleano active.

Para o plano de cuidado e o que ele gerou, veja Plano de cuidado; para a diretriz, Diretriz.