Agendamento

Um agendamento é o compromisso marcado entre um paciente e um profissional: quando, com quem, e se é online ou presencial. No Nilo Care ele aparece na ficha do paciente, nas seções Agendamentos liberados e Agendamentos marcados — e, nas implantações com a tela nova, também em Passados.

No FHIR o recurso é o Appointment, e esta integração o usa nas duas pontas.

Dois campos do FHIR se cruzam aqui, e é fácil errar. O título do agendamento vai em description, e as observações vão em comment — não o contrário. Trocá-los grava o texto livre no campo de título da plataforma.

Nenhum dos dois é exibido nas telas de agendamento hoje: o que a equipe vê na lista é o nome do profissional e a especialidade. Mas eles ficam gravados, e é pelo nome certo que outros sistemas os leem.

Campos

A coluna No Nilo Care traz o rótulo com que o dado aparece para a equipe; são rótulos, não caminhos de navegação.

CampoObrigatórioO que significaNo Nilo Care
resourceTypesimConstante Appointment
identifiersimSuas chaves do agendamento. É por elas que a API decide entre criar e atualizar
statussimA situação. Oito valores aceitos, quatro situações — veja abaixoa seção onde o agendamento aparece
startsim na escritaInício previstoa data e a hora na linha do agendamento
endsim na escritaFim previsto. Tem de ser maior que o starta hora final, na mesma linha
participantsimExatamente um paciente e um profissionalSelecione o profissional responsável
descriptionnãoO título do agendamento— (não é exibido)
commentnãoAs observações, em texto livre— (não é exibido)
appointmentTypenãoModalidade: online ou presencialConsulta será
creatednãoSó resposta: quando o agendamento foi criado
contained[]nãoSó resposta: a sala de vídeo, quando há
id · metanãoSó resposta: identificador Nilo FHIR e metadados da gravação

status: oito valores entram, seis saem

A escrita aceita oito valores do FHIR e os reduz a quatro situações da plataforma. A leitura devolve a situação, não o que você mandou:

Você enviaA plataforma registraA leitura devolve
booked · proposed · pending · arrived · checked-inAgendadobooked
cancelledCanceladocancelled
noshowPaciente não compareceunoshow
fulfilledRealizadofulfilled

A leitura, por sua vez, traduz nove situações da plataforma em seis códigos:

Situação no Nilo Carestatus
Agendadobooked
Reagendadobooked
Recorrentebooked
Liberadoproposed
Canceladocancelled
Não compareceunoshow
Não compareceu, com justificativanoshow
Bloqueado / indisponívelwaitlist
Realizadofulfilled

Um agendamento reagendado e um recorrente voltam como booked, iguais a um agendamento comum. Não há campo que diga que ele foi remarcado, nem que ele faz parte de uma série.

O status não faz round-trip. Enviar proposed, pending, arrived ou checked-in e reler devolve booked — os quatro colapsam na mesma situação. Não construa fluxo em cima de distinguir “confirmado” de “paciente chegou”: a plataforma não guarda essa diferença.

waitlist e entered-in-error recusam a chamada. Eles não têm destino na plataforma, e a recusa vem como not-supported, apontando Appointment.status.

E waitlist é justamente um valor que a leitura devolve, num agendamento marcado como indisponível pela equipe. Ou seja: há agendamentos que você lê e não consegue reenviar.

proposed é aceito na escrita, mas não faz o que parece: ele não cria um agendamento liberado, vira um agendamento normal. Liberar horário para o paciente marcar é ação da equipe na tela.

waitlist é o único valor que a leitura devolve e a escrita não aceita.

Os participantes

participant precisa de exatamente um de cada tipo, e o type do actor é o que distingue:

1"participant": [
2 { "status": "accepted",
3 "actor": { "type": "Patient",
4 "identifier": { "system": "https://www.acmesaude.com.br/integracao/paciente/",
5 "value": "507823709" } } },
6 { "status": "accepted",
7 "actor": { "type": "Practitioner",
8 "identifier": { "system": "https://www.acmesaude.com.br/integracao/profissional/",
9 "value": "5032932" } } }
10]

Zero ou dois participantes do mesmo tipo recusam a chamada, com uma mensagem que nomeia o tipo que faltou. Um agendamento com dois profissionais, ou sem paciente, não é possível.

E o type é obrigatório: sem ele a API não sabe qual é qual, e a chamada é recusada como se o participante não existisse.

participant[].status é exigido pelo FHIR e descartado na escrita: a leitura devolve sempre accepted, nos dois participantes. Não há como registrar que o paciente ainda não confirmou.

A modalidade

appointmentType diz se a consulta é online ou presencial, num coding cujo system é {host}/fhir/resources/CodeSystem/appointment-type — a URL absoluta do seu ambiente, como https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/appointment-type em produção:

codeModalidade
ONLINEAtendimento online
IN_PERSONAtendimento presencial

Omitir appointmentType cria um agendamento online, não um sem modalidade. Se a consulta é presencial, mande o IN_PERSON — a omissão não é neutra.

Um coding em outro system é ignorado em silêncio e cai na mesma regra da omissão — e é por isso que errar a URL do system é perigoso: a consulta presencial vira online e a chamada responde 200. Já um código desconhecido dentro do system da Nilo recusa a chamada com not-supported.

A sala de vídeo

Nos agendamentos online com sala criada, o link vem embutido no próprio recurso, em contained[0].address:

1"contained": [
2 { "resourceType": "Endpoint",
3 "status": "active",
4 "address": "https://video.nilo.services/r/9f2c41a8",
5 "connectionType": { "code": "https" },
6 "payloadType": [{ "text": "video" }] }
7]

É só resposta: enviar um contained não cria sala — embora o que você mandar fique gravado e volte nas leituras seguintes, sem significar nada.

A sala não nasce com o agendamento, e nem todo agendamento tem uma. Três coisas precisam ser verdade:

  • a funcionalidade tem de estar habilitada para o seu ambiente, o que é decidido na implantação. Se ela não estiver, nenhum agendamento terá sala — fale com o Suporte;
  • o agendamento tem de ter datas no futuro: um agendamento retroativo não gera sala;
  • a situação tem de ser de agendamento em aberto: fulfilled, noshow e cancelled não geram sala.

E a criação é assíncrona. A resposta do POST normalmente vem sem contained; a sala aparece em segundos, podendo levar alguns minutos em períodos de alta demanda. Prefira ser avisado por webhook a ficar consultando — e não conclua que o agendamento não terá sala só porque a primeira leitura veio sem ela.

Campos que a Nilo não usa

O Appointment canônico traz muito mais do que esta integração lê: cancelationReason, serviceCategory, serviceType, specialty, reasonCode, reasonReference, priority, supportingInformation, minutesDuration, slot, basedOn, requestedPeriod e patientInstruction. Nenhum deles é lido.

Repare em cancelationReason: não há como registrar por que um agendamento foi cancelado. E em specialty: a especialidade do agendamento existe na tela e não tem campo aqui.

A referência lista só os campos suportados, e é assim que ela deve ser lida: o que mandar na escrita. A API em si é mais tolerante — o que você mandar a mais fica guardado no recurso e volta nas leituras seguintes, sem nunca ter significado nada para a plataforma. Se o seu validador for estrito contra a referência, uma resposta assim vai parecer inválida; o remédio é não enviá-los.

Marcar um agendamento

POST
/fhir/resources/Appointment
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Appointment \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Appointment",
6 "identifier": [
7 {
8 "system": "https://www.acmesaude.com.br/integracao/agendamento/",
9 "value": "AG-3001",
10 "use": "usual"
11 }
12 ],
13 "status": "booked",
14 "participant": [
15 {
16 "actor": {
17 "identifier": {
18 "system": "https://www.acmesaude.com.br/integracao/paciente/",
19 "value": "507823709",
20 "use": "usual"
21 },
22 "type": "Patient"
23 },
24 "status": "accepted"
25 },
26 {
27 "actor": {
28 "identifier": {
29 "system": "https://www.acmesaude.com.br/integracao/profissional/",
30 "value": "5032932",
31 "use": "usual"
32 },
33 "type": "Practitioner"
34 },
35 "status": "accepted"
36 }
37 ],
38 "start": "2026-06-15T14:00:00+00:00",
39 "end": "2026-06-15T14:30:00+00:00",
40 "description": "Consulta de retorno — endocrinologia",
41 "comment": "Paciente pediu horário no fim da tarde.",
42 "appointmentType": {
43 "coding": [
44 {
45 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/appointment-type",
46 "code": "ONLINE"
47 }
48 ]
49 }
50}'

A resposta é o recurso gravado, sem envelope:

Response
1{
2 "resourceType": "Appointment",
3 "identifier": [
4 {
5 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--scheduling-v2",
6 "value": "620914",
7 "use": "usual"
8 },
9 {
10 "system": "https://www.acmesaude.com.br/integracao/agendamento/",
11 "value": "AG-3001",
12 "use": "usual"
13 }
14 ],
15 "status": "booked",
16 "participant": [
17 {
18 "actor": {
19 "identifier": {
20 "system": "https://www.acmesaude.com.br/integracao/paciente/",
21 "value": "507823709",
22 "use": "usual"
23 },
24 "type": "Patient",
25 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
26 },
27 "status": "accepted"
28 },
29 {
30 "actor": {
31 "identifier": {
32 "system": "https://www.acmesaude.com.br/integracao/profissional/",
33 "value": "5032932",
34 "use": "usual"
35 },
36 "type": "Practitioner",
37 "reference": "Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19"
38 },
39 "status": "accepted"
40 }
41 ],
42 "id": "8f30c26b-5d17-4e94-a1c3-70b6e2854f19",
43 "meta": {
44 "lastUpdated": "2026-06-01T09:12:45.208000Z",
45 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
46 },
47 "start": "2026-06-15T14:00:00+00:00",
48 "end": "2026-06-15T14:30:00+00:00",
49 "description": "Consulta de retorno — endocrinologia",
50 "comment": "Paciente pediu horário no fim da tarde.",
51 "appointmentType": {
52 "coding": [
53 {
54 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/appointment-type",
55 "code": "ONLINE",
56 "display": "Atendimento Online"
57 }
58 ]
59 },
60 "created": "2026-06-01T09:12:44+00:00"
61}

Guarde o id: é por ele que se faz a leitura direta. Ao lado do seu identifier, a resposta traz o identificador Nilo do agendamento, no system …/NamingSystem/care-api--scheduling-v2.

POST
/fhir/resources/Appointment
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Appointment \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Appointment",
6 "identifier": [
7 {
8 "system": "https://www.acmesaude.com.br/integracao/agendamento/",
9 "value": "AG-3002",
10 "use": "usual"
11 }
12 ],
13 "status": "booked",
14 "participant": [
15 {
16 "actor": {
17 "identifier": {
18 "system": "https://www.acmesaude.com.br/integracao/paciente/",
19 "value": "507823709",
20 "use": "usual"
21 },
22 "type": "Patient"
23 },
24 "status": "accepted"
25 },
26 {
27 "actor": {
28 "identifier": {
29 "system": "https://www.acmesaude.com.br/integracao/profissional/",
30 "value": "5032932",
31 "use": "usual"
32 },
33 "type": "Practitioner"
34 },
35 "status": "accepted"
36 }
37 ],
38 "start": "2026-06-16T09:00:00+00:00",
39 "end": "2026-06-16T09:40:00+00:00",
40 "description": "Consulta inicial — nutrição",
41 "appointmentType": {
42 "coding": [
43 {
44 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/appointment-type",
45 "code": "IN_PERSON"
46 }
47 ]
48 }
49}'

Cancelar

Cancelar é reenviar o mesmo identifier com status: cancelled.

POST
/fhir/resources/Appointment
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Appointment \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Appointment",
6 "identifier": [
7 {
8 "system": "https://www.acmesaude.com.br/integracao/agendamento/",
9 "value": "AG-3001",
10 "use": "usual"
11 }
12 ],
13 "status": "cancelled",
14 "participant": [
15 {
16 "actor": {
17 "identifier": {
18 "system": "https://www.acmesaude.com.br/integracao/paciente/",
19 "value": "507823709",
20 "use": "usual"
21 },
22 "type": "Patient"
23 },
24 "status": "accepted"
25 },
26 {
27 "actor": {
28 "identifier": {
29 "system": "https://www.acmesaude.com.br/integracao/profissional/",
30 "value": "5032932",
31 "use": "usual"
32 },
33 "type": "Practitioner"
34 },
35 "status": "accepted"
36 }
37 ],
38 "start": "2026-06-15T14:00:00+00:00",
39 "end": "2026-06-15T14:30:00+00:00",
40 "description": "Consulta de retorno — endocrinologia",
41 "comment": "Paciente pediu horário no fim da tarde.",
42 "appointmentType": {
43 "coding": [
44 {
45 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/appointment-type",
46 "code": "ONLINE"
47 }
48 ]
49 }
50}'

Não há atualização parcial. Todo POST monta o agendamento inteiro a partir do payload, e o que você omitir é apagado na plataforma ou volta ao padrão: sem comment, as observações somem da ficha; sem appointmentType, um agendamento presencial vira online.

Reenvie o recurso inteiro em toda atualização, inclusive no cancelamento.

E a leitura não acompanha esse apagamento. O recurso FHIR guarda o último valor não vazio: depois de um POST sem comment, a consulta continua devolvendo a observação antiga, que a equipe já não vê. Para zerar de verdade os dois lados, mande o campo vazio ("comment": "") em vez de omiti-lo.

Não há remoção por integração: este endpoint nunca responde 204. Cancelar é a forma de encerrar um agendamento.

Ao cancelar, a plataforma pode limpar as datas do registro. Um agendamento com status: cancelled lido depois disso pode vir sem start e sem end — não trate a ausência como erro de leitura.

Buscar

GET
/fhir/resources/Appointment
1curl -G https://landing-zone-api.nilo.services/fhir/resources/Appointment \
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 --data-urlencode appointment-type=https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/appointment-type|ONLINE \
7 -d date=ge2026-06-01 \
8 --data-urlencode identifier=https://www.acmesaude.com.br/integracao/agendamento/|AG-3001 \
9 --data-urlencode patient=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
10 --data-urlencode patient:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709 \
11 --data-urlencode practitioner=Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19 \
12 --data-urlencode practitioner:identifier=https://www.acmesaude.com.br/integracao/profissional/|5032932 \
13 -d status=booked

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/Appointment/8f30c26b-5d17-4e94-a1c3-70b6e2854f19",
7 "resource": {
8 "resourceType": "Appointment",
9 "identifier": [
10 {
11 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--scheduling-v2",
12 "value": "620914",
13 "use": "usual"
14 },
15 {
16 "system": "https://www.acmesaude.com.br/integracao/agendamento/",
17 "value": "AG-3001",
18 "use": "usual"
19 }
20 ],
21 "status": "booked",
22 "participant": [
23 {
24 "actor": {
25 "identifier": {
26 "system": "https://www.acmesaude.com.br/integracao/paciente/",
27 "value": "507823709",
28 "use": "usual"
29 },
30 "type": "Patient",
31 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
32 },
33 "status": "accepted"
34 },
35 {
36 "actor": {
37 "identifier": {
38 "system": "https://www.acmesaude.com.br/integracao/profissional/",
39 "value": "5032932",
40 "use": "usual"
41 },
42 "type": "Practitioner",
43 "reference": "Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19"
44 },
45 "status": "accepted"
46 }
47 ],
48 "id": "8f30c26b-5d17-4e94-a1c3-70b6e2854f19",
49 "meta": {
50 "lastUpdated": "2026-06-01T09:12:45.208000Z",
51 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
52 },
53 "start": "2026-06-15T14:00:00+00:00",
54 "end": "2026-06-15T14:30:00+00:00",
55 "description": "Consulta de retorno — endocrinologia",
56 "comment": "Paciente pediu horário no fim da tarde.",
57 "appointmentType": {
58 "coding": [
59 {
60 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/appointment-type",
61 "code": "ONLINE",
62 "display": "Atendimento Online"
63 }
64 ]
65 },
66 "created": "2026-06-01T09:12:44+00:00",
67 "contained": [
68 {
69 "resourceType": "Endpoint",
70 "address": "https://video.nilo.services/r/9f2c41a8",
71 "status": "active",
72 "connectionType": {
73 "code": "https"
74 },
75 "payloadType": [
76 {
77 "text": "video"
78 }
79 ]
80 }
81 ]
82 },
83 "search": {
84 "mode": "match"
85 }
86 },
87 {
88 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Appointment/1d74b8e0-92a6-4c15-830f-4e5a7c93d268",
89 "resource": {
90 "resourceType": "Appointment",
91 "identifier": [
92 {
93 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--scheduling-v2",
94 "value": "620915",
95 "use": "usual"
96 }
97 ],
98 "status": "fulfilled",
99 "participant": [
100 {
101 "actor": {
102 "identifier": {
103 "system": "https://www.acmesaude.com.br/integracao/paciente/",
104 "value": "507823709",
105 "use": "usual"
106 },
107 "type": "Patient",
108 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
109 },
110 "status": "accepted"
111 },
112 {
113 "actor": {
114 "identifier": {
115 "system": "https://www.acmesaude.com.br/integracao/profissional/",
116 "value": "5032932",
117 "use": "usual"
118 },
119 "type": "Practitioner",
120 "reference": "Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19"
121 },
122 "status": "accepted"
123 }
124 ],
125 "id": "1d74b8e0-92a6-4c15-830f-4e5a7c93d268",
126 "meta": {
127 "lastUpdated": "2026-06-02T11:40:02.774000Z",
128 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM5OA"
129 },
130 "start": "2026-06-02T10:00:00+00:00",
131 "end": "2026-06-02T10:40:00+00:00",
132 "description": "Consulta inicial — nutrição",
133 "appointmentType": {
134 "coding": [
135 {
136 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/appointment-type",
137 "code": "IN_PERSON",
138 "display": "Atendimento Presencial"
139 }
140 ]
141 },
142 "created": "2026-05-20T15:03:11+00:00"
143 },
144 "search": {
145 "mode": "match"
146 }
147 }
148 ],
149 "link": []
150}

Busca sem resultados não é erro: volta 200 com um Bundle cujo entry é uma lista vazia.

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

Parâmetros de busca suportados

NomeTipoDescriçãoExpressão
identifiertokenIdentificador do agendamento, em system|valueAppointment.identifier
patientreferencePaciente, pelo id Nilo FHIR deleAppointment.participant.actor
patient:identifierreferencePaciente, pelo identificador deleAppointment.participant.actor.identifier
practitionerreferenceProfissional, pelo id Nilo FHIR deleAppointment.participant.actor
practitioner:identifierreferenceProfissional, pelo identificador deleAppointment.participant.actor.identifier
datedateData do agendamento, com os prefixos eq, ge, leAppointment.start
statustokenSituaçãoAppointment.status
appointment-typetokenModalidade, em system|codeAppointment.appointmentType
_lastUpdateddateData da última gravação no store, com os prefixos eq, ge, le

Os demais parâmetros canônicos do Appointmentservice-category, service-type, specialty, reason-code, reason-reference, slot, based-on e supporting-info — só encontram o que você mesmo tiver enviado: a plataforma não preenche nenhum desses campos, mas guarda o que vier no payload.

part-status é a exceção pelo motivo oposto: como todo participante é gravado como accepted, part-status=accepted devolve tudo. Não é filtro útil.

Qual identificador as referências de participant.actor carregam depende da sua implantação. Na configuração que usa identificadores externos, cada referência sai com o identificador do seu sistema; sem ela, vem o identificador Nilo do paciente e do profissional. É 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.

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

Response
1{
2 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Appointment/8f30c26b-5d17-4e94-a1c3-70b6e2854f19",
3 "resource": {
4 "resourceType": "Appointment",
5 "identifier": [
6 {
7 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--scheduling-v2",
8 "value": "620914",
9 "use": "usual"
10 }
11 ],
12 "status": "booked",
13 "participant": [
14 {
15 "actor": {
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 "status": "accepted"
25 },
26 {
27 "actor": {
28 "identifier": {
29 "system": "https://www.acmesaude.com.br/integracao/profissional/",
30 "value": "5032932",
31 "use": "usual"
32 },
33 "type": "Practitioner",
34 "reference": "Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19"
35 },
36 "status": "accepted"
37 }
38 ],
39 "id": "8f30c26b-5d17-4e94-a1c3-70b6e2854f19",
40 "meta": {
41 "lastUpdated": "2026-06-01T09:12:45.208000Z",
42 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
43 },
44 "start": "2026-06-15T14:00:00+00:00",
45 "end": "2026-06-15T14:30:00+00:00",
46 "description": "Consulta de retorno — endocrinologia",
47 "created": "2026-06-01T09:12:44+00:00"
48 },
49 "search": {
50 "mode": "match"
51 }
52}

Efeitos colaterais

Um agendamento apagado na plataforma some do store. A busca para de devolvê-lo e a leitura por id passa a responder 404, sem aviso. Não conclua que ele foi cancelado — um cancelamento devolve status: cancelled, não um 404.

O mesmo acontece, mais raramente, quando o agendamento fica sem situação registrada ou com uma situação que esta integração não conhece: o recurso é removido em silêncio na sincronização seguinte.

Marcar um agendamento não cria um atendimento. O atendimento nasce quando a consulta acontece — veja Atendimentos.

O profissional que você informa em participant fica registrado também como autor e como responsável pelo agendamento na plataforma. Não há como separar quem atende de quem marcou.

Um agendamento marcado por integração aparece na agenda do profissional como qualquer outro, e a equipe pode alterá-lo por lá. Uma alteração feita na tela chega às suas leituras seguintes.

Erros

Recusa é 400, e o corpo é um OperationOutcome: issue[].expression aponta o campo culpado e issue[].details.text explica o motivo.

codeexpressionMensagemQuando
requiredAppointment.identifierField is requiredO payload não tem identifier
business-ruleAppointment.identifierUnable to use any of the provided identifiers to match an existing resource, which can lead to duplicates.identifier, mas nenhum utilizável
requiredAppointment.participant.actorAppointment must have only one participant.actor of type PatientFalta o paciente, ou vem mais de um
requiredAppointment.participant.actorAppointment must have only one participant.actor of type PractitionerFalta o profissional, ou vem mais de um
not-foundAppointment.participant.actorUnable to find Patient · Unable to find PractitionerO identificador não resolve para alguém do seu ambiente
requiredAppointment.startThe start field is requiredO payload não tem start
requiredAppointment.endThe end field is requiredO payload não tem end
invalidAppointment.endThe end field must be greater than the start fieldO fim é menor ou igual ao início
not-supportedAppointment.statusThe status '…' is not supportedwaitlist ou entered-in-error
not-supportedAppointment.appointmentTypeThe appointment type code '…' is not supportedCódigo de modalidade desconhecido no system da Nilo
structureResource has identifier from a Nilo environment that is not the current environment.O payload traz um identificador Nilo gerado em outro ambiente
structureo campo recusadomensagem da validação FHIRO payload não é um Appointment válido — status ou participant ausentes, tipo errado num campo
Response
1{
2 "issue": [
3 {
4 "code": "required",
5 "details": {
6 "text": "Appointment must have only one participant.actor of type Practitioner"
7 },
8 "expression": [
9 "Appointment.participant.actor"
10 ],
11 "severity": "error"
12 }
13 ],
14 "resourceType": "OperationOutcome"
15}

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

O que a integração não cobre

  • o motivo do cancelamento;
  • a especialidade e a recorrência do agendamento, que existem na tela;
  • a distinção entre agendamento liberado e marcado na escrita — só na leitura;
  • a confirmação do paciente: participant[].status é sempre accepted;
  • criar a sala de vídeo — ela é criada pela plataforma.

Para a consulta prevista por uma diretriz, que antecede o agendamento, veja Consulta prevista; para o atendimento que acontece depois, Atendimentos.