Diretriz

Uma diretriz é o desenho do cuidado: a sequência de consultas, tarefas, questionários e mensagens que a equipe segue para um tipo de paciente. Ela é o molde; aplicá-la a um paciente produz um plano de cuidado.

No FHIR a diretriz é um PlanDefinition. Esta página cobre o cadastro e a consulta das diretrizes; a aplicação a um paciente está na página do plano de cuidado.

Esta API grava o cabeçalho da diretriz, não o conteúdo dela. Nome, descrição e tipo são graváveis. As consultas previstas, as tarefas, os questionários e as mensagens programadas que a diretriz gera são montados pela equipe no Nilo Care — e uma diretriz criada por aqui nasce vazia, sem gerar nada quando aplicada a um paciente.

Na prática, o uso mais comum deste recurso é de leitura: descobrir a URL da diretriz para aplicá-la.

Linha de cuidado e protocolo

A plataforma organiza as diretrizes em dois tipos:

TipoCódigoComo a equipe o usaExemplo
Linha de cuidadoorder-setAcompanhamento contínuo de uma condiçãoDiabetes, hipertensão
Protocoloclinical-protocolUm roteiro com começo, meio e fimAcompanhamento pós-operatório

O tipo é uma convenção de uso, não uma regra que a plataforma aplique: a duração da diretriz é um campo à parte, e nada impede uma linha de cuidado com término definido nem um protocolo sem. A duração, aliás, não é gravável nem legível por esta API — é configurada no Nilo Care.

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 PlanDefinition
identifiersimSuas chaves da diretriz. É por elas que a API decide entre criar e atualizar
statussimExigido pelo FHIR e descartado na escrita. Envie active. Na leitura, active ou retired
namesimNome da diretriz, com no máximo 100 caracteresNome, no cadastro; Diretriz, ao aplicá-la a um paciente
descriptionnãoDescrição da diretrizDescrição
typenãoorder-set ou clinical-protocol, num coding do sistema de tipo do HL7Tipo
urlnãoUma URL canônica sua, para referenciar a diretriz sem depender do id
effectivePeriodnãoSó resposta: a vigência da diretriz
id · metanãoSó resposta: identificador Nilo FHIR da diretriz e metadados da gravação

status e effectivePeriod andam juntos

O status é derivado da vigência: active enquanto a data de hoje está dentro do effectivePeriod, retired fora dele — antes do início e depois do fim. Uma diretriz sem período nenhum é sempre active.

Os dois são definidos na plataforma. Enviar status ou effectivePeriod não tem efeito: o status é obrigatório pelo FHIR, então mande active e ignore o que ele significa na escrita.

Só diretriz active pode ser aplicada a um paciente. Uma retired continua aparecendo na busca — e uma diretriz cujo início ainda não chegou também é retired —, mas um plano de cuidado que a referencie é recusado com does not exist or is not active. Filtre por status=active antes de aplicar.

Campos que a Nilo não usa

O PlanDefinition canônico traz muito mais do que esta integração lê: version, title, subtitle, experimental, subject, date, publisher, contact, useContext, jurisdiction, purpose, usage, copyright, approvalDate, lastReviewDate, topic, author, editor, reviewer, endorser, relatedArtifact, library, goal e — o mais importante — action. Nenhum deles é lido.

action é o campo em que o FHIR descreve o conteúdo de uma diretriz, e ele não é suportado. Não há como enviar as consultas, tarefas ou questionários da diretriz por esta API, nem lê-los. O que a diretriz gera só se vê depois de aplicada, em CarePlan.activity[] — veja Plano de cuidado.

Repare também em title: o FHIR distingue name (identificador legível) de title (nome de exibição), e aqui só o name é lido. É ele que a equipe vê.

E a duração da diretriz, que o Nilo Care pede no cadastro, não tem campo aqui: não é gravável nem legível por esta API.

A referência lista só os campos suportados, e é assim que ela deve ser lida: o que mandar na escrita. A API em si não recusa quem manda os outros — eles ficam guardados no recurso e voltam nas leituras seguintes, sem nunca terem significado nada para a plataforma. Omita-os.

Encontrar a diretriz para aplicar

Este é o uso principal do recurso: CarePlan.instantiatesCanonical precisa de uma URL, e é aqui que você a obtém.

GET
/fhir/resources/PlanDefinition
1curl -G https://landing-zone-api.nilo.services/fhir/resources/PlanDefinition \
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 identifier=https://www.acmesaude.com.br/integracao/diretriz/|DM2 \
7 -d name=Acompanhamento \
8 -d status=active \
9 --data-urlencode type=http://terminology.hl7.org/CodeSystem/plan-definition-type|order-set \
10 --data-urlencode url=https://www.acmesaude.com.br/diretrizes/diabetes-tipo-2
Response
1{
2 "resourceType": "Bundle",
3 "type": "searchset",
4 "entry": [
5 {
6 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/PlanDefinition/5d81f3b6-04e7-4a29-9c50-b6127ea38d41",
7 "resource": {
8 "resourceType": "PlanDefinition",
9 "identifier": [
10 {
11 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--care-line",
12 "value": "412",
13 "use": "usual"
14 },
15 {
16 "system": "https://www.acmesaude.com.br/integracao/diretriz/",
17 "value": "DM2",
18 "use": "usual"
19 }
20 ],
21 "name": "Acompanhamento de diabetes tipo 2",
22 "status": "active",
23 "id": "5d81f3b6-04e7-4a29-9c50-b6127ea38d41",
24 "meta": {
25 "lastUpdated": "2026-03-02T09:41:55.318000Z",
26 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
27 },
28 "description": "Linha de cuidado para pacientes com diabetes tipo 2 em acompanhamento contínuo.",
29 "type": {
30 "coding": [
31 {
32 "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type",
33 "code": "order-set",
34 "display": "Order Set"
35 }
36 ]
37 },
38 "url": "https://www.acmesaude.com.br/diretrizes/diabetes-tipo-2",
39 "effectivePeriod": {
40 "start": "2025-01-01T00:00:00+00:00"
41 }
42 },
43 "search": {
44 "mode": "match"
45 }
46 },
47 {
48 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/PlanDefinition/b7420ce9-1d68-43a5-8f01-e6329ba5d7c2",
49 "resource": {
50 "resourceType": "PlanDefinition",
51 "identifier": [
52 {
53 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--care-line",
54 "value": "388",
55 "use": "usual"
56 }
57 ],
58 "name": "Pós-operatório de artroplastia",
59 "status": "retired",
60 "id": "b7420ce9-1d68-43a5-8f01-e6329ba5d7c2",
61 "meta": {
62 "lastUpdated": "2026-01-15T13:02:44.907000Z",
63 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM4MA"
64 },
65 "type": {
66 "coding": [
67 {
68 "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type",
69 "code": "clinical-protocol",
70 "display": "Clinical Protocol"
71 }
72 ]
73 },
74 "effectivePeriod": {
75 "end": "2026-01-15T00:00:00+00:00",
76 "start": "2024-02-01T00:00:00+00:00"
77 }
78 },
79 "search": {
80 "mode": "match"
81 }
82 }
83 ],
84 "link": []
85}

duas formas de montar o instantiatesCanonical, e as duas funcionam:

FormaO que enviarQuando usar
Pelo id do recurso{host}/fhir/resources/PlanDefinition/{id}Sempre funciona, mas o id é da plataforma e muda entre ambientes
Pela url canônicao valor exato do campo urlQuando você definiu uma url sua — a mesma vale em todos os ambientes

A resolução tenta primeiro o último segmento da URL como id do recurso e, não achando, procura uma diretriz cujo campo url seja exatamente o que você enviou. Nos dois caminhos a diretriz precisa estar active.

A forma pelo id embute o host do ambiente, e o id é diferente em cada um. Uma integração que promove configuração entre homologação e produção tem de reescrever essas URLs. Definir uma url própria em cada diretriz resolve isso de vez: o mesmo valor funciona nos dois ambientes.

Cadastrar ou atualizar

POST
/fhir/resources/PlanDefinition
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/PlanDefinition \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "PlanDefinition",
6 "identifier": [
7 {
8 "system": "https://www.acmesaude.com.br/integracao/diretriz/",
9 "value": "DM2",
10 "use": "usual"
11 }
12 ],
13 "name": "Acompanhamento de diabetes tipo 2",
14 "status": "active",
15 "description": "Linha de cuidado para pacientes com diabetes tipo 2 em acompanhamento contínuo.",
16 "type": {
17 "coding": [
18 {
19 "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type",
20 "code": "order-set"
21 }
22 ]
23 },
24 "url": "https://www.acmesaude.com.br/diretrizes/diabetes-tipo-2"
25}'

A resposta é o recurso gravado, sem envelope:

Response
1{
2 "resourceType": "PlanDefinition",
3 "identifier": [
4 {
5 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--care-line",
6 "value": "412",
7 "use": "usual"
8 },
9 {
10 "system": "https://www.acmesaude.com.br/integracao/diretriz/",
11 "value": "DM2",
12 "use": "usual"
13 }
14 ],
15 "name": "Acompanhamento de diabetes tipo 2",
16 "status": "active",
17 "id": "5d81f3b6-04e7-4a29-9c50-b6127ea38d41",
18 "meta": {
19 "lastUpdated": "2026-03-02T09:41:55.318000Z",
20 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
21 },
22 "description": "Linha de cuidado para pacientes com diabetes tipo 2 em acompanhamento contínuo.",
23 "type": {
24 "coding": [
25 {
26 "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type",
27 "code": "order-set",
28 "display": "Order Set"
29 }
30 ]
31 },
32 "url": "https://www.acmesaude.com.br/diretrizes/diabetes-tipo-2",
33 "effectivePeriod": {
34 "start": "2025-01-01T00:00:00+00:00"
35 }
36}

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

O mesmo POST cria e atualiza. Reenviando um identifier que já corresponde a uma diretriz, ela é atualizada.

POST
/fhir/resources/PlanDefinition
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/PlanDefinition \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "PlanDefinition",
6 "identifier": [
7 {
8 "system": "https://www.acmesaude.com.br/integracao/diretriz/",
9 "value": "POS-ARTRO",
10 "use": "usual"
11 }
12 ],
13 "name": "Pós-operatório de artroplastia",
14 "status": "active",
15 "type": {
16 "coding": [
17 {
18 "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type",
19 "code": "clinical-protocol"
20 }
21 ]
22 }
23}'

O tipo é preservado quando você o omite

type é o único campo desta página com preservação por omissão:

  • numa diretriz existente, omitir type mantém o tipo que ela já tem;
  • numa diretriz nova, omitir type cria uma linha de cuidado.

A API varre todos os coding e usa o primeiro cujo system seja o de tipo de diretriz do HL7, em qualquer posição da lista. Um coding em outro system, ou com um código fora dos dois aceitos, é ignorado — e cai na mesma regra da omissão, sem erro.

POST
/fhir/resources/PlanDefinition
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/PlanDefinition \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "PlanDefinition",
6 "identifier": [
7 {
8 "system": "https://www.acmesaude.com.br/integracao/diretriz/",
9 "value": "DM2",
10 "use": "usual"
11 }
12 ],
13 "name": "Acompanhamento de diabetes tipo 2 — adultos",
14 "status": "active"
15}'

name e description, ao contrário, não são preservados: uma atualização sem description apaga a descrição. O exemplo acima faz exatamente isso — repare que ele não traz description. Reenvie os dois sempre.

A URL canônica

url é o campo mais útil deste recurso para quem integra. A plataforma não o guarda como dado da diretriz, mas ele fica no recurso FHIR e é por ele que a diretriz pode ser encontrada:

1"url": "https://www.acmesaude.com.br/diretrizes/diabetes-tipo-2"

A url tem de ser única. Uma URL já usada por outra diretriz recusa a chamada com 409, e o mesmo acontece quando a url e o identifier do payload apontam para diretrizes diferentes — o caso clássico de copiar um payload e trocar só a chave.

São os dois únicos 409 deste recurso.

Defina a url na mesma chamada em que cria a diretriz. Acrescentá-la depois, sem mudar nome, descrição ou tipo, pode não ter efeito: a plataforma reconhece que nada mudou do lado dela e devolve o recurso como já estava, com 200 e sem gravar a URL. O mesmo vale para acrescentar um identifier seu ou qualquer outro campo que a plataforma não guarda.

Confira a url na resposta. Se ela não voltou, reenvie junto com uma alteração real — de nome ou de descrição.

Buscar

GET
/fhir/resources/PlanDefinition
1curl -G https://landing-zone-api.nilo.services/fhir/resources/PlanDefinition \
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 identifier=https://www.acmesaude.com.br/integracao/diretriz/|DM2 \
7 -d name=Acompanhamento \
8 -d status=active \
9 --data-urlencode type=http://terminology.hl7.org/CodeSystem/plan-definition-type|order-set \
10 --data-urlencode url=https://www.acmesaude.com.br/diretrizes/diabetes-tipo-2

A resposta é sempre um Bundle do tipo searchset, e 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 da diretriz, em system|valuePlanDefinition.identifier
statustokenactive ou retiredPlanDefinition.status
namestringNome da diretriz. A busca casa pelo início do nome, não por qualquer trecho delePlanDefinition.name
urluriA URL canônica exataPlanDefinition.url
typetokenTipo da diretriz, em system|codePlanDefinition.type
_lastUpdateddateData da última gravação no store, com os prefixos eq, ge, le

Os demais parâmetros canônicos do PlanDefinitiontitle, version, date, publisher, context, jurisdiction, topic, composed-of, depends-on, derived-from, predecessor e successor — só encontram o que você tiver enviado: a Nilo não preenche esses campos, mas guarda o que vier no payload. Numa diretriz criada pela plataforma eles vêm vazios, e a busca não devolve nada.

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

Uma diretriz antiga, que ninguém tenha tocado desde que a sua integração começou, pode não aparecer na lista. Se você espera uma diretriz e ela não vem, peça ao Suporte: a busca não é um inventário garantido.

Ler por ID

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

Response
1{
2 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/PlanDefinition/5d81f3b6-04e7-4a29-9c50-b6127ea38d41",
3 "resource": {
4 "resourceType": "PlanDefinition",
5 "identifier": [
6 {
7 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--care-line",
8 "value": "412",
9 "use": "usual"
10 },
11 {
12 "system": "https://www.acmesaude.com.br/integracao/diretriz/",
13 "value": "DM2",
14 "use": "usual"
15 }
16 ],
17 "name": "Acompanhamento de diabetes tipo 2",
18 "status": "active",
19 "id": "5d81f3b6-04e7-4a29-9c50-b6127ea38d41",
20 "meta": {
21 "lastUpdated": "2026-03-02T09:41:55.318000Z",
22 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
23 },
24 "type": {
25 "coding": [
26 {
27 "system": "http://terminology.hl7.org/CodeSystem/plan-definition-type",
28 "code": "order-set",
29 "display": "Order Set"
30 }
31 ]
32 },
33 "url": "https://www.acmesaude.com.br/diretrizes/diabetes-tipo-2",
34 "effectivePeriod": {
35 "start": "2025-01-01T00:00:00+00:00"
36 }
37 },
38 "search": {
39 "mode": "match"
40 }
41}

Valores aceitos

type.coding[0].code

Dois: order-set (linha de cuidado) e clinical-protocol (protocolo). O system tem de ser http://terminology.hl7.org/CodeSystem/plan-definition-type.

Os demais códigos do vocabulário HL7 — eca-rule e workflow-definition — não têm destino na plataforma e são ignorados em silêncio, caindo na regra da omissão.

status

Dois na leitura: active e retired. Nenhum deles é gravável.

Efeitos colaterais

Criar ou renomear uma diretriz não afeta os pacientes que já estão nela. Os planos de cuidado existentes continuam como estão; o que muda é o nome exibido.

Mudar o type de uma diretriz com pacientes é uma decisão de negócio, não de integração. Linha de cuidado e protocolo têm regras de duração diferentes. Se a sua integração sincroniza o tipo a partir de um sistema seu, confira antes que a mudança é intencional.

Uma diretriz excluída no Nilo Care some daqui. Ela não vira retired: o recurso deixa de existir, a leitura por id passa a responder 404 e ela some da busca — sem aviso. Se você guarda o conteúdo de uma diretriz, guarde o conteúdo, não o id.

Este endpoint nunca responde 204: não há remoção de diretriz por integração.

Erros

Recusa é 400, e o corpo é um OperationOutcome: issue[].details.text explica o motivo e, quando a recusa é de um campo conferido por esta API, issue[].expression aponta qual. As duas exceções são os 409 da url.

StatuscodeexpressionMensagemQuando
400requiredPlanDefinition.identifierField is requiredO payload não tem identifier
400business-rulePlanDefinition.identifierUnable to use any of the provided identifiers to match an existing resource, which can lead to duplicates.identifier, mas nenhum utilizável
400structureResource has identifier from a Nilo environment that is not the current environment.O payload traz um identificador Nilo gerado em outro ambiente
400structureo campo recusadomensagem da validação FHIRO payload não é um PlanDefinition válido
400exceptionHTTPBadRequest: …O name está ausente, ou passa de 100 caracteres
409conflictPlanDefinition.urlA PlanDefinition with the URL '…' already exists.A url já pertence a outra diretriz
409conflictPlanDefinition.urlThe URL references PlanDefinition '…' while the identifiers reference PlanDefinition '…'. Both must reference the same resource.A url e o identifier apontam para diretrizes diferentes
Response
1{
2 "issue": [
3 {
4 "code": "conflict",
5 "details": {
6 "text": "A PlanDefinition with the URL 'https://www.acmesaude.com.br/diretrizes/diabetes-tipo-2' already exists."
7 },
8 "expression": [
9 "PlanDefinition.url"
10 ],
11 "severity": "error"
12 }
13 ],
14 "resourceType": "OperationOutcome"
15}

A linha exception não é uma validação desta API — é a recusa da própria plataforma, repassada como está. Ela sai sem expression e com uma mensagem de erro de linguagem, que inclui o endereço interno chamado. Nada disso é contrato: não interprete o texto e não o exiba para o usuário final.

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