Etiqueta

Uma etiqueta é um marcador que a equipe pendura num paciente para sinalizar alguma coisa sobre ele — Gestante, Alto risco, Prioridade no atendimento. Ela tem vigência: começa num dia e pode terminar noutro.

No FHIR o recurso é a Flag, e esta integração o usa nas duas pontas: aplicar uma etiqueta a um paciente e consultar as que ele tem.

A etiqueta em si não é criada por aqui. O que você aplica é uma etiqueta que já existe no catálogo do seu ambiente, e o catálogo é montado pela equipe em Configurações › Etiquetas — onde a categoria precisa ser criada antes da etiqueta. Para descobrir quais etiquetas existem, e os códigos delas, leia o catálogo de códigos.

Campos

CampoObrigatórioO que significaNo Nilo Care
resourceTypesimConstante Flag
identifiersimSuas chaves da etiqueta aplicada. É por elas que a API decide entre criar e atualizar
statussimactive ou inactive, e tem de concordar com o period. entered-in-error é aceito e tratado como inactive
code.coding[]simA etiqueta, por um código do catálogoEtiqueta
subject.identifiersimO paciente
category[].coding[]nãoA categoria da etiqueta. Enviada, é conferidaCategoria
period.start · period.endnãoA vigência da etiqueta
id · metanãoSó resposta: identificador Nilo FHIR e metadados da gravação

code.text, code.coding[].display, category e os display dela vêm do catálogo na leitura. Enviá-los não tem efeito: quem identifica a etiqueta é o par system + code.

E category vem sempre na leitura, mesmo que você não a tenha enviado — ela é derivada da etiqueta.

status e period têm de concordar

Esta é a regra que mais recusa chamadas neste recurso. A API confere se o status que você mandou bate com o period:

O que você mandaResultado
active, sem periodA plataforma decide a vigência — começa agora
active, com period já começado e não terminadoAceito
active, com period futuro ou já terminadoRecusado (Status does not match the period)
inactive, com period futuro ou já terminadoAceito
inactive, com period vigenteRecusado
inactive, sem period, numa etiqueta que já existeA etiqueta é encerrada agora
inactive, sem period, numa etiqueta novaRecusado (Period is required to create inactive flags)

status não é um campo livre: é uma afirmação sobre o period, e ela é verificada. Mandar active numa etiqueta com vigência futura não a agenda — recusa a chamada.

E o status gravado não muda sozinho. Ele é calculado no momento da gravação, não da leitura: uma etiqueta gravada como inactive com vigência futura continua sendo devolvida como inactive depois de a data chegar, até que alguma coisa altere a etiqueta na plataforma.

Não conte com a virada automática. Se você agenda etiquetas, reenvie o recurso com status: active quando a vigência começar — ou compare o period com a data de hoje do seu lado.

status é derivado do período, não um estado à parte: não existe uma etiqueta “desativada mas dentro da vigência”.

Encerrar uma etiqueta

Reenviar o mesmo identifier com status: inactive e sem period encerra a etiqueta no instante da chamada.

POST
/fhir/resources/Flag
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Flag \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Flag",
6 "identifier": [
7 {
8 "system": "https://www.acmesaude.com.br/integracao/etiqueta/",
9 "value": "ET-7001",
10 "use": "usual"
11 }
12 ],
13 "status": "inactive",
14 "code": {
15 "coding": [
16 {
17 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-code",
18 "code": "318"
19 }
20 ]
21 },
22 "subject": {
23 "identifier": {
24 "system": "https://www.acmesaude.com.br/integracao/paciente/",
25 "value": "507823709",
26 "use": "usual"
27 },
28 "type": "Patient"
29 }
30}'

Não há remoção por integração: este endpoint nunca responde 204. Encerrar é a forma de tirar uma etiqueta do paciente, e o registro continua existindo com a vigência fechada.

Campos que a Nilo não usa

A Flag canônica traz mais do que esta integração lê: encounter, author e text. Nenhum deles é lido — em particular, não há como registrar quem aplicou a etiqueta nem a que atendimento ela se refere.

A referência lista só os campos suportados, não os permitidos: 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. Se o seu validador for estrito contra a referência, uma resposta assim vai parecer inválida; o remédio é não enviá-los.

Aplicar uma etiqueta

POST
/fhir/resources/Flag
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Flag \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Flag",
6 "identifier": [
7 {
8 "system": "https://www.acmesaude.com.br/integracao/etiqueta/",
9 "value": "ET-7001",
10 "use": "usual"
11 }
12 ],
13 "status": "active",
14 "code": {
15 "coding": [
16 {
17 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-code",
18 "code": "318"
19 }
20 ]
21 },
22 "subject": {
23 "identifier": {
24 "system": "https://www.acmesaude.com.br/integracao/paciente/",
25 "value": "507823709",
26 "use": "usual"
27 },
28 "type": "Patient"
29 }
30}'

A resposta é o recurso gravado, sem envelope:

Response
1{
2 "resourceType": "Flag",
3 "identifier": [
4 {
5 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--patient-tag",
6 "value": "55210",
7 "use": "usual"
8 },
9 {
10 "system": "https://www.acmesaude.com.br/integracao/etiqueta/",
11 "value": "ET-7001",
12 "use": "usual"
13 }
14 ],
15 "status": "active",
16 "code": {
17 "coding": [
18 {
19 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-code",
20 "code": "318",
21 "display": "Gestante"
22 }
23 ],
24 "text": "Gestante"
25 },
26 "subject": {
27 "identifier": {
28 "system": "https://www.acmesaude.com.br/integracao/paciente/",
29 "value": "507823709",
30 "use": "usual"
31 },
32 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4",
33 "type": "Patient"
34 },
35 "id": "4c7a0d31-98e6-42b5-b17f-3e05a92c8674",
36 "meta": {
37 "lastUpdated": "2026-05-04T10:15:33.902000Z",
38 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
39 },
40 "category": [
41 {
42 "coding": [
43 {
44 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-category",
45 "code": "12",
46 "display": "Condições de saúde"
47 }
48 ],
49 "text": "Condições de saúde"
50 }
51 ],
52 "period": {
53 "start": "2026-05-04T10:15:33+00:00"
54 }
55}

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

Mandando mais de um identifier, eles são testados na ordem em que aparecem no payload, e o primeiro que casar com uma etiqueta existente vence.

POST
/fhir/resources/Flag
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Flag \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "resourceType": "Flag",
6 "identifier": [
7 {
8 "system": "https://www.acmesaude.com.br/integracao/etiqueta/",
9 "value": "ET-7002",
10 "use": "usual"
11 }
12 ],
13 "status": "active",
14 "code": {
15 "coding": [
16 {
17 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-code",
18 "code": "318"
19 }
20 ]
21 },
22 "subject": {
23 "identifier": {
24 "system": "https://www.acmesaude.com.br/integracao/paciente/",
25 "value": "507823709",
26 "use": "usual"
27 },
28 "type": "Patient"
29 },
30 "category": [
31 {
32 "coding": [
33 {
34 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-category",
35 "code": "12"
36 }
37 ]
38 }
39 ],
40 "period": {
41 "start": "2026-05-04T00:00:00+00:00"
42 }
43}'

O código da etiqueta

O código vai num coding cujo system é {host}/fhir/resources/CodeSystem/flag-code, com o host do seu ambiente:

1"code": {
2 "coding": [
3 {
4 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-code",
5 "code": "318"
6 }
7 ]
8}

Um coding em qualquer outro system é ignorado, e não sobrando nenhum no system certo a chamada é recusada com Invalid system …. Confira a URL — o system é o mesmo valor que o url do catálogo.

O código precisa existir no catálogo do seu ambiente. Um código válido em homologação pode não existir em produção: os catálogos são independentes.

A categoria

category é opcional — e, quando você a manda, ela não classifica nada: é conferida contra a categoria à qual a etiqueta já pertence.

Mandar uma categoria que não é a da etiqueta recusa a chamada (Tag does not belong to the category). Se você não tem certeza, omita — a leitura vai trazer a categoria certa de qualquer forma.

Buscar

GET
/fhir/resources/Flag
1curl -G https://landing-zone-api.nilo.services/fhir/resources/Flag \
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 date=ge2026-01-01 \
7 --data-urlencode identifier=https://www.acmesaude.com.br/integracao/etiqueta/|ET-7001 \
8 --data-urlencode patient=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
9 --data-urlencode patient:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709 \
10 --data-urlencode subject=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4

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/Flag/4c7a0d31-98e6-42b5-b17f-3e05a92c8674",
7 "resource": {
8 "resourceType": "Flag",
9 "identifier": [
10 {
11 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--patient-tag",
12 "value": "55210",
13 "use": "usual"
14 },
15 {
16 "system": "https://www.acmesaude.com.br/integracao/etiqueta/",
17 "value": "ET-7001",
18 "use": "usual"
19 }
20 ],
21 "status": "active",
22 "code": {
23 "coding": [
24 {
25 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-code",
26 "code": "318",
27 "display": "Gestante"
28 }
29 ],
30 "text": "Gestante"
31 },
32 "subject": {
33 "identifier": {
34 "system": "https://www.acmesaude.com.br/integracao/paciente/",
35 "value": "507823709",
36 "use": "usual"
37 },
38 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4",
39 "type": "Patient"
40 },
41 "id": "4c7a0d31-98e6-42b5-b17f-3e05a92c8674",
42 "meta": {
43 "lastUpdated": "2026-05-04T10:15:33.902000Z",
44 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
45 },
46 "category": [
47 {
48 "coding": [
49 {
50 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-category",
51 "code": "12",
52 "display": "Condições de saúde"
53 }
54 ],
55 "text": "Condições de saúde"
56 }
57 ],
58 "period": {
59 "start": "2026-05-04T00:00:00+00:00"
60 }
61 },
62 "search": {
63 "mode": "match"
64 }
65 }
66 ],
67 "link": []
68}

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 etiqueta aplicada, em system|valueFlag.identifier
patient · subjectreferencePaciente, pelo id Nilo FHIR deleFlag.subject
patient:identifier · subject:identifierreferencePaciente, pelo identificador deleFlag.subject.identifier
datedateVigência da etiqueta, com os prefixos eq, ge, leFlag.period
_lastUpdateddateData da última gravação no store, com os prefixos eq, ge, le

status, code e category são preenchidos no recurso e não são filtráveis. O Flag do FHIR R4 não define parâmetro de busca para nenhum dos três — não há como pedir “as etiquetas ativas” nem “os pacientes com a etiqueta 318”.

Para isso, busque por paciente ou por date e filtre do seu lado.

author e encounter são parâmetros canônicos que funcionam — mas só encontram as etiquetas em que você enviou o campo, já que a plataforma nunca o preenche.

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

A busca devolve também as etiquetas aplicadas pela equipe dentro do Nilo Care. Essas trazem apenas o identificador Nilo — não haverá um identifier seu. É por essa diferença que você separa umas das outras.

Ler por ID

GET
/fhir/resources/Flag/:id
1curl https://landing-zone-api.nilo.services/fhir/resources/Flag/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 etiqueta está em resource.

Response
1{
2 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Flag/4c7a0d31-98e6-42b5-b17f-3e05a92c8674",
3 "resource": {
4 "resourceType": "Flag",
5 "identifier": [
6 {
7 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--patient-tag",
8 "value": "55210",
9 "use": "usual"
10 }
11 ],
12 "status": "active",
13 "code": {
14 "coding": [
15 {
16 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-code",
17 "code": "318",
18 "display": "Gestante"
19 }
20 ],
21 "text": "Gestante"
22 },
23 "subject": {
24 "identifier": {
25 "system": "https://www.acmesaude.com.br/integracao/paciente/",
26 "value": "507823709",
27 "use": "usual"
28 },
29 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4",
30 "type": "Patient"
31 },
32 "id": "4c7a0d31-98e6-42b5-b17f-3e05a92c8674",
33 "meta": {
34 "lastUpdated": "2026-05-04T10:15:33.902000Z",
35 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
36 },
37 "category": [
38 {
39 "coding": [
40 {
41 "system": "https://landing-zone-api.nilo.services/fhir/resources/CodeSystem/flag-category",
42 "code": "12",
43 "display": "Condições de saúde"
44 }
45 ],
46 "text": "Condições de saúde"
47 }
48 ],
49 "period": {
50 "start": "2026-05-04T00:00:00+00:00"
51 }
52 },
53 "search": {
54 "mode": "match"
55 }
56}

Efeitos colaterais

Aplicar uma etiqueta não notifica ninguém e não cria nada. Ela aparece como um chip no cartão de cabeçalho do paciente, com o ícone e a cor da categoria — que é onde a categoria, que não classifica nada na escrita, acaba tendo efeito visível.

Etiqueta encerrada no catálogo continua aplicada. Se a equipe encerrar uma etiqueta nas configurações, ela some do catálogo mas as aplicações existentes continuam sendo devolvidas na busca — com o display que tinham.

Encerrar uma categoria encerra, junto, todas as etiquetas dela — e também não afeta as aplicações já feitas.

Erros

Recusa é 400 — com uma exceção, o 409 da etiqueta repetida. O corpo é um OperationOutcome: issue[].expression aponta o campo culpado e issue[].details.text explica o motivo.

codeexpressionMensagemQuando
requiredFlag.identifierField is requiredO payload não tem identifier
business-ruleFlag.identifierUnable to use any of the provided identifiers to match an existing resource, which can lead to duplicates.identifier, mas nenhum utilizável
not-foundFlag.subjectPatient does not existO subject não resolve para um paciente do seu ambiente — ou está ausente, que sai com a mesma mensagem
code-invalidFlag.code.coding.codeTag not foundO código não existe no catálogo do ambiente
code-invalidFlag.category.coding.codeCategory not foundA categoria enviada não existe
invariantFlag.category.coding.codeTag does not belong to the categoryA categoria enviada não é a da etiqueta
multiple-matchesFlag.category.codingMultiple matches to system …Mais de uma categoria, com códigos diferentes
code-invalidFlag.code…coding.systemInvalid system …Nenhum coding no system do catálogo
invariantFlag.statusStatus does not match the periodO status não bate com o period
business-ruleFlag.periodPeriod is required to create inactive flagsEtiqueta nova, inactive e sem period
structureResource has identifier from a Nilo environment that is not the current environment.O payload traz um identificador Nilo gerado em outro ambiente

E, fora do 400:

StatuscodeMensagemQuando
409conflictResource conflicts with other existing resource(s)O paciente já tem essa mesma etiqueta em vigência

Um paciente não pode ter a mesma etiqueta aplicada duas vezes em vigência simultânea. A segunda aplicação é recusada com 409, mesmo com um identifier diferente — a plataforma compara o par paciente + etiqueta, não a sua chave. Encerre a primeira antes de aplicar de novo.

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

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