Profissional

O Practitioner é a pessoa que presta o cuidado, direta ou indiretamente — médico, enfermeiro, nutricionista, recepcionista. É quem assina um atendimento, aparece como responsável na linha do tempo do paciente e compõe a equipe de cuidado.

Este recurso é a alternativa a pedir cadastro de profissional ao Suporte: pela API você cadastra a pessoa, registra o conselho e as especialidades, vincula as unidades de cuidado em que ela atua e — se quiser — concede o acesso ao NiloCare, tudo na mesma escrita.

Escrever um Practitioner pode criar um usuário com acesso ao NiloCare e aos pacientes das unidades de cuidado vinculadas. É o efeito colateral mais forte desta API. Antes da primeira carga, leia Acesso ao NiloCare 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, ao menos umChaves do profissional. É por aqui que a API decide entre criar e atualizar, e é aqui que vão e-mail, CPF e registro em conselhoCPF, Conselho / Número / UF, E-mail
namesim, com use: officialNome do profissional. De text, ou de given + familyNome completo
telecom system: phonenãoTelefone. Havendo mais de um, vale o últimoTelefone
gendernãoSexo registradoGênero
qualification[]nãoEspecialidades, uma por item, pelo código CBOEspecialidades
qualification[].period.endnãoData no passado encerra aquela especialidade
address use: worknãoLocais de atendimento do profissionalLocais de atendimento
extension practitioner-organizationnão 1Unidade de cuidado em que o profissional atua. RepetívelUnidades
extension practitioner-usernãoAcesso ao NiloCare: cria ou remove o login
extension practitioner-user-emailsim, se o acesso está sendo concedidoE-mail de loginE-mail
extension practitioner-user-activenãotrue concede o acesso, false remove
activenãoSó resposta: a leitura devolve sempre true
extension practitioner-legacy-typenãoSó resposta: classificação interna derivada do cadastro

1 Não é obrigatória, mas alguma unidade de cuidado sempre é aplicada: sem a extensão vale a unidade padrão da sua implantação, e se não houver unidade padrão configurada a escrita é recusada.

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

Campos do Practitioner que a Nilo não usa

O Practitioner canônico tem campos que esta integração não lê nem grava: photo, birthDate, communication e o qualification[].issuer. Ficam fora da referência de propósito. Enviá-los não é erro — o valor é gravado no recurso FHIR e volta nas leituras seguintes —, mas nada no NiloCare passa a exibi-los.

A extensão practitioner-user-password também não tem efeito: a senha não é definida por esta API. O profissional recebe o convite de acesso pelo e-mail de login.

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

POST
/fhir/resources/Practitioner
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Practitioner \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "identifier": [
6 {
7 "system": "https://www.acmesaude.com.br/integracao/profissional/",
8 "value": "5032932",
9 "use": "usual"
10 }
11 ],
12 "name": [
13 {
14 "text": "Ana Ribeiro",
15 "use": "official"
16 }
17 ],
18 "resourceType": "Practitioner"
19}'

A resposta devolve o recurso como ficou gravado:

Response
1{
2 "identifier": [
3 {
4 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/almanac-api--professional",
5 "value": "77412",
6 "use": "usual"
7 },
8 {
9 "system": "urn:ietf:rfc:6530",
10 "value": "ana.ribeiro@acmesaude.com.br",
11 "use": "usual"
12 },
13 {
14 "system": "https://servicos.receita.fazenda.gov.br/servicos/cpf/",
15 "value": "52998224725",
16 "use": "official"
17 },
18 {
19 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/NiloClassCouncil/",
20 "value": "CRM-SP-118234",
21 "use": "official"
22 },
23 {
24 "system": "https://www.acmesaude.com.br/integracao/profissional/",
25 "value": "5032932",
26 "use": "usual"
27 }
28 ],
29 "name": [
30 {
31 "text": "Ana Ribeiro",
32 "use": "official"
33 }
34 ],
35 "resourceType": "Practitioner",
36 "active": true,
37 "address": [
38 {
39 "city": "São Paulo",
40 "country": "BR",
41 "district": "Bela Vista",
42 "line": [
43 "Av. Paulista",
44 "1000",
45 "Sala 502"
46 ],
47 "postalCode": "01310-100",
48 "state": "SP",
49 "text": "Av. Paulista, 1000, Sala 502 - Bela Vista, São Paulo - SP, BR, 01310-100",
50 "type": "both",
51 "use": "work"
52 }
53 ],
54 "extension": [
55 {
56 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-legacy-type",
57 "valueString": "care_user"
58 },
59 {
60 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-organization",
61 "valueIdentifier": {
62 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
63 "use": "usual",
64 "value": "4"
65 }
66 }
67 ],
68 "gender": "female",
69 "id": "1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38",
70 "meta": {
71 "lastUpdated": "2026-08-12T18:22:41.118000Z",
72 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
73 },
74 "qualification": [
75 {
76 "code": {
77 "coding": [
78 {
79 "code": "31",
80 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/almanac-api--specialty"
81 },
82 {
83 "code": "225130",
84 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
85 }
86 ],
87 "text": "Medicina de Família e Comunidade"
88 }
89 }
90 ],
91 "telecom": [
92 {
93 "system": "phone",
94 "use": "mobile",
95 "value": "+5511987654321"
96 }
97 ]
98}

Guarde o id: é por ele que se faz a leitura direta. A resposta traz também o identificador Nilo do profissional (…/NamingSystem/almanac-api--professional) ao lado do seu — os dois servem para buscar, e o seu continua sendo o único que você precisa guardar.

A atualização de profissional substitui, não complementa. Assim como no Coverage e diferente do Patient, um campo omitido não preserva o valor atual: omitir telecom apaga o telefone, omitir gender volta o cadastro para não informado, omitir o identificador de CPF ou de conselho desfaz o vínculo com aquele documento. Para mudar só o telefone, reenvie o payload inteiro com o telefone novo.

A única exceção é o e-mail: omitido, o e-mail que já estava gravado é preservado.

Identificadores

Ao menos um identifier é obrigatório, e o system enviado precisa estar entre os namespaces habilitados para a sua unidade de cuidado — é por ele que a Nilo decide entre criar e atualizar. Enviar só identificadores de system desconhecido é recusado, em vez de criar um profissional duplicado — é a recusa mais comum na primeira integração, e o payload dela está em Erros.

A mensagem lista os system que estão habilitados. Habilitar um novo não é feito pela API: abra um ticket no Suporte informando a URI do seu namespace.

Além da chave do seu sistema, três system têm significado próprio:

systemO que carrega
urn:ietf:rfc:6530E-mail do profissional
https://servicos.receita.fazenda.gov.br/servicos/cpf/CPF
{host}/fhir/resources/NamingSystem/NiloClassCouncil/Registro em conselho

Estes três só servem para encontrar um profissional já cadastrado se também estiverem habilitados como namespaces de identificador da sua unidade. Não estando, eles continuam sendo gravados — CPF, conselho e e-mail entram no cadastro —, mas o casamento tem de vir de outro identificador.

Registro em conselho

O registro vai num identifier no system {host}/fhir/resources/NamingSystem/NiloClassCouncil/, e o value reúne num só campo os três que o NiloCare mostra separados — Conselho, UF e Número:

conselho-UF-número

Por exemplo, CRM-SP-118234.

POST
/fhir/resources/Practitioner
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Practitioner \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "identifier": [
6 {
7 "system": "https://www.acmesaude.com.br/integracao/profissional/",
8 "value": "5032932",
9 "use": "usual"
10 },
11 {
12 "system": "https://servicos.receita.fazenda.gov.br/servicos/cpf/",
13 "value": "52998224725",
14 "use": "official"
15 },
16 {
17 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/NiloClassCouncil/",
18 "value": "CRM-SP-118234",
19 "use": "official"
20 }
21 ],
22 "name": [
23 {
24 "family": "Ribeiro",
25 "given": [
26 "Ana"
27 ],
28 "use": "official"
29 }
30 ],
31 "resourceType": "Practitioner",
32 "gender": "female",
33 "telecom": [
34 {
35 "system": "phone",
36 "value": "+5511987654321"
37 }
38 ]
39}'

O formato tem de ter exatamente dois hifens. Um número de registro que contenha hifen (CRM-SP-1182-34) é recusado, e o mesmo vale para um valor sem a UF (CRM-118234). Se o seu sistema guarda o registro num campo único com hifens, normalize antes de enviar.

A recusa vem com code: invalid apontando Practitioner.identifier. Os conselhos reconhecidos estão em Conselhos aceitos.

Acesso ao NiloCare

Quem controla o login é a extensão composta practitioner-user. Sem ela, nada acontece com o acesso — o profissional é apenas um cadastro, e o login que ele já tivesse continua como está.

Enviando a extensão, o que decide é practitioner-user-active:

practitioner-user-activeEfeito
trueCria o usuário se ainda não existir, atualiza o nome dele e concede o acesso ao seu care provider
falseRemove o acesso do usuário ao seu care provider. O cadastro do profissional permanece
ausenteNada é feito com o acesso
POST
/fhir/resources/Practitioner
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Practitioner \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "identifier": [
6 {
7 "system": "https://www.acmesaude.com.br/integracao/profissional/",
8 "value": "5032932",
9 "use": "usual"
10 },
11 {
12 "system": "urn:ietf:rfc:6530",
13 "value": "ana.ribeiro@acmesaude.com.br",
14 "use": "usual"
15 }
16 ],
17 "name": [
18 {
19 "text": "Ana Ribeiro",
20 "use": "official"
21 }
22 ],
23 "resourceType": "Practitioner",
24 "extension": [
25 {
26 "extension": [
27 {
28 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-user-active",
29 "valueBoolean": true
30 },
31 {
32 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-user-email",
33 "valueString": "ana.ribeiro@acmesaude.com.br"
34 }
35 ],
36 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-user"
37 }
38 ]
39}'

practitioner-user-email é obrigatória quando o acesso está sendo concedido: é o e-mail com que o profissional entra na plataforma.

Sem ela, a recusa é code: required apontando Practitioner.extension.

Na remoção o e-mail também é necessário — é por ele que o usuário é localizado:

POST
/fhir/resources/Practitioner
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Practitioner \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "identifier": [
6 {
7 "system": "https://www.acmesaude.com.br/integracao/profissional/",
8 "value": "5032932",
9 "use": "usual"
10 }
11 ],
12 "name": [
13 {
14 "text": "Ana Ribeiro",
15 "use": "official"
16 }
17 ],
18 "resourceType": "Practitioner",
19 "extension": [
20 {
21 "extension": [
22 {
23 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-user-active",
24 "valueBoolean": false
25 },
26 {
27 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-user-email",
28 "valueString": "ana.ribeiro@acmesaude.com.br"
29 }
30 ],
31 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-user"
32 }
33 ]
34}'

active: false remove o acesso, não o cadastro. O profissional continua existindo, continua aparecendo em atendimentos passados e volta a ter acesso se você reenviar a extensão com true. Para o e-mail que não corresponde a nenhum usuário, false não é erro: nada é feito.

O e-mail pode vir na extensão, no identifier do system urn:ietf:rfc:6530, ou nos dois. Nos dois, os valores precisam ser iguais. Basta haver um e-mail em qualquer um dos dois lugares para o profissional passar a ser tratado como usuário da plataforma — mas conceder o acesso exige o e-mail especificamente na extensão.

Unidades de cuidado

Cada extensão practitioner-organization vincula o profissional a uma unidade de cuidado, e com ela ao acesso aos pacientes daquela unidade. Uma extensão por unidade:

POST
/fhir/resources/Practitioner
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Practitioner \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "identifier": [
6 {
7 "system": "https://www.acmesaude.com.br/integracao/profissional/",
8 "value": "5032932",
9 "use": "usual"
10 }
11 ],
12 "name": [
13 {
14 "text": "Ana Ribeiro",
15 "use": "official"
16 }
17 ],
18 "resourceType": "Practitioner",
19 "extension": [
20 {
21 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-organization",
22 "valueIdentifier": {
23 "system": "https://www.acmesaude.com.br/integracao/unidade-de-cuidado/",
24 "use": "usual",
25 "value": "10654"
26 }
27 },
28 {
29 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-organization",
30 "valueIdentifier": {
31 "system": "https://www.acmesaude.com.br/integracao/unidade-de-cuidado/",
32 "use": "usual",
33 "value": "9998232"
34 }
35 }
36 ]
37}'

O valueIdentifier aceita qualquer identificador de uma unidade de cuidado já cadastrada, inclusive o do seu próprio sistema. Para descobrir as unidades disponíveis, liste-as — veja Unidade de cuidado:

GET
/fhir/resources/Organization
1curl -G https://landing-zone-api.nilo.services/fhir/resources/Organization \
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 identifier=https://www.acmesaude.com.br/integracao/unidade/|UC-01 \
8 -d name=Centro

A semântica é de adição: a extensão nunca remove um vínculo. Um profissional vinculado a três unidades e reenviado com uma só continua nas três. Remover unidade de cuidado tem implicações de acesso a dados e é feito pelo Suporte, não pela API.

Sem nenhuma extensão practitioner-organization, o profissional é vinculado à unidade de cuidado padrão da sua implantação. Não havendo unidade padrão configurada, a escrita é recusada.

Quando o identificador enviado não resolve para nenhuma unidade cadastrada, o expression traz Practitioner.extensions[0].valueIdentifier, com um s a mais em extension. O índice é confiável — é a posição da extensão no seu payload —, mas o caminho não é um FHIRPath válido. Não o use como chave de tratamento automático.

Especialidades

Cada especialidade é uma entrada de qualification, identificada pelo código CBO no system http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO:

POST
/fhir/resources/Practitioner
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Practitioner \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "identifier": [
6 {
7 "system": "https://www.acmesaude.com.br/integracao/profissional/",
8 "value": "5032932",
9 "use": "usual"
10 }
11 ],
12 "name": [
13 {
14 "text": "Ana Ribeiro",
15 "use": "official"
16 }
17 ],
18 "resourceType": "Practitioner",
19 "qualification": [
20 {
21 "code": {
22 "coding": [
23 {
24 "code": "225130",
25 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
26 }
27 ]
28 }
29 },
30 {
31 "code": {
32 "coding": [
33 {
34 "code": "225175",
35 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
36 }
37 ]
38 }
39 }
40 ]
41}'

O CBO tem de existir no catálogo — se não existir, a recusa aponta o item e o coding culpados em Practitioner.qualification[N].code.coding[N].code.

Para várias especialidades, use uma entrada de qualification por especialidade. Dois códigos CBO no mesmo coding que apontam para especialidades diferentes são recusados.

Todo item precisa de um coding no system do CBO — um item só com text, ou só com o código do catálogo Nilo que vem nas leituras, é recusado.

Para encerrar uma especialidade, reenvie-a com period.end no passado:

POST
/fhir/resources/Practitioner
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Practitioner \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "identifier": [
6 {
7 "system": "https://www.acmesaude.com.br/integracao/profissional/",
8 "value": "5032932",
9 "use": "usual"
10 }
11 ],
12 "name": [
13 {
14 "text": "Ana Ribeiro",
15 "use": "official"
16 }
17 ],
18 "resourceType": "Practitioner",
19 "qualification": [
20 {
21 "code": {
22 "coding": [
23 {
24 "code": "225175",
25 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
26 }
27 ]
28 },
29 "period": {
30 "end": "2026-07-31T23:59:00+00:00"
31 }
32 }
33 ]
34}'

qualification é aditivo: as especialidades já gravadas e ausentes do payload continuam. Só period.end remove. E period não volta na leitura — a resposta traz apenas as especialidades vigentes, cada uma com o CBO, o código do catálogo Nilo e o nome em text.

Locais de atendimento

Endereços com use: work viram os locais de atendimento do profissional. O line é posicional:

PosiçãoConteúdo
line[0]Logradouro
line[1]Número — S/N quando ausente
line[2]Complemento
POST
/fhir/resources/Practitioner
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Practitioner \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "identifier": [
6 {
7 "system": "https://www.acmesaude.com.br/integracao/profissional/",
8 "value": "5032932",
9 "use": "usual"
10 }
11 ],
12 "name": [
13 {
14 "text": "Ana Ribeiro",
15 "use": "official"
16 }
17 ],
18 "resourceType": "Practitioner",
19 "address": [
20 {
21 "city": "São Paulo",
22 "country": "BR",
23 "district": "Bela Vista",
24 "line": [
25 "Av. Paulista",
26 "1000",
27 "Sala 502"
28 ],
29 "postalCode": "01310-100",
30 "state": "SP",
31 "use": "work"
32 }
33 ]
34}'

Diferente das especialidades e das unidades, address não é aditivo: os locais de trabalho que estavam gravados e não vêm no payload são desvinculados do profissional. Envie sempre a lista completa dos locais em que ele atende.

E o comportamento é instável quando o profissional já tem mais de um local gravado: nessa situação a sincronização pode criar um local duplicado e desvincular um que devia permanecer. Enquanto isso não estiver resolvido, prefira não enviar address em atualizações de profissional com vários locais — trate os locais pelo Suporte.

Endereços com qualquer outro use são ignorados, sem erro. E a leitura devolve os locais com use: work, type: both e um text já formatado. state e country voltam como estão gravados; o text usa a sigla do estado e do país, que a Nilo guarda em campos separados e esta escrita não deriva. Ou seja: um local criado por aqui com state: SP volta com state: SP, e a sigla no text só aparece nos endereços que a plataforma normalizou.

Buscar

GET
/fhir/resources/Practitioner
1curl -G https://landing-zone-api.nilo.services/fhir/resources/Practitioner \
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 -d active=true \
6 --data-urlencode "address-city=São Paulo" \
7 -d address-postalcode=01310-100 \
8 -d address-state=SP \
9 -d gender=female \
10 --data-urlencode identifier=https://www.acmesaude.com.br/integracao/profissional/|5032932 \
11 --data-urlencode "name=Ana Ribeiro" \
12 --data-urlencode phone=+5511987654321

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/Practitioner/1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38",
7 "resource": {
8 "identifier": [
9 {
10 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/almanac-api--professional",
11 "value": "77412",
12 "use": "usual"
13 },
14 {
15 "system": "urn:ietf:rfc:6530",
16 "value": "ana.ribeiro@acmesaude.com.br",
17 "use": "usual"
18 },
19 {
20 "system": "https://servicos.receita.fazenda.gov.br/servicos/cpf/",
21 "value": "52998224725",
22 "use": "official"
23 },
24 {
25 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/NiloClassCouncil/",
26 "value": "CRM-SP-118234",
27 "use": "official"
28 },
29 {
30 "system": "https://www.acmesaude.com.br/integracao/profissional/",
31 "value": "5032932",
32 "use": "usual"
33 }
34 ],
35 "name": [
36 {
37 "text": "Ana Ribeiro",
38 "use": "official"
39 }
40 ],
41 "resourceType": "Practitioner",
42 "active": true,
43 "extension": [
44 {
45 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-legacy-type",
46 "valueString": "care_user"
47 },
48 {
49 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-organization",
50 "valueIdentifier": {
51 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
52 "use": "usual",
53 "value": "4"
54 }
55 }
56 ],
57 "gender": "female",
58 "id": "1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38",
59 "qualification": [
60 {
61 "code": {
62 "coding": [
63 {
64 "code": "31",
65 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/almanac-api--specialty"
66 },
67 {
68 "code": "225130",
69 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
70 }
71 ],
72 "text": "Medicina de Família e Comunidade"
73 }
74 }
75 ],
76 "telecom": [
77 {
78 "system": "phone",
79 "use": "mobile",
80 "value": "+5511987654321"
81 }
82 ]
83 },
84 "search": {
85 "mode": "match"
86 }
87 }
88 ],
89 "link": []
90}

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 profissional, em system|value. Vale para a sua chave, o e-mail, o CPF e o registro em conselhoPractitioner.identifier
namestringQualquer parte do nomePractitioner.name
phoneticstringNome por correspondência fonéticaPractitioner.name
gendertokenSexo registradoPractitioner.gender
activetokenSe o cadastro está ativo — a Nilo grava sempre truePractitioner.active
phonetokenTelefonePractitioner.telecom.where(system='phone')
telecomtokenQualquer contato — na prática, o telefonePractitioner.telecom
addressstringQualquer campo de um local de atendimentoPractitioner.address
address-citystringCidadePractitioner.address.city
address-statestringEstadoPractitioner.address.state
address-postalcodestringCEPPractitioner.address.postalCode
address-countrystringPaísPractitioner.address.country
address-usetokenFinalidade do endereço — a Nilo grava sempre workPractitioner.address.use

Dois parâmetros canônicos do Practitioner existem e não encontram nada aqui. family e given filtram partes do nome, e a Nilo grava o nome inteiro num único name[0].text — use name. E email filtra telecom com system: email, mas o e-mail do profissional não fica em telecom: fica em identifier, no system urn:ietf:rfc:6530. Para achar alguém pelo e-mail, use identifier=urn:ietf:rfc:6530|ana.ribeiro@acmesaude.com.br.

Especialidade, unidade de cuidado e acesso ao NiloCare não são filtráveis: o FHIR R4 não define search parameter para qualification nem para extensões no Practitioner.

A busca mais comum na prática é pelo identificador do seu próprio sistema:

$curl --request GET \
> --url 'https://landing-zone-api.nilo.services/fhir/resources/Practitioner?identifier=https://www.acmesaude.com.br/integracao/profissional/|5032932' \
> --header 'x-api-key: SUA_API_KEY'

Ler por ID

GET
/fhir/resources/Practitioner/:id
1curl https://landing-zone-api.nilo.services/fhir/resources/Practitioner/id \
2 -H "x-api-key: <apiKey>"

Diferente da busca, a leitura por ID devolve o recurso direto, sem envelope Bundle, e responde 404 quando o id não existe.

Response
1{
2 "identifier": [
3 {
4 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/almanac-api--professional",
5 "value": "77412",
6 "use": "usual"
7 },
8 {
9 "system": "urn:ietf:rfc:6530",
10 "value": "ana.ribeiro@acmesaude.com.br",
11 "use": "usual"
12 },
13 {
14 "system": "https://www.acmesaude.com.br/integracao/profissional/",
15 "value": "5032932",
16 "use": "usual"
17 }
18 ],
19 "name": [
20 {
21 "text": "Ana Ribeiro",
22 "use": "official"
23 }
24 ],
25 "resourceType": "Practitioner",
26 "active": true,
27 "extension": [
28 {
29 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-legacy-type",
30 "valueString": "care_user"
31 },
32 {
33 "url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/practitioner-organization",
34 "valueIdentifier": {
35 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
36 "use": "usual",
37 "value": "4"
38 }
39 }
40 ],
41 "gender": "female",
42 "id": "1a9c7f52-64b8-4a3e-8d21-9f0b7c4e6d38",
43 "meta": {
44 "lastUpdated": "2026-08-12T18:22:41.118000Z",
45 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
46 },
47 "telecom": [
48 {
49 "system": "phone",
50 "use": "mobile",
51 "value": "+5511987654321"
52 }
53 ]
54}

Valores aceitos

Conselhos aceitos

O conselho do registro é a sigla do conselho de classe. O NiloCare reconhece:

SiglaConselho
ABGAssociação Brasileira de Gerontologia
CRMConselho Regional de Medicina
CFMConselho Federal de Medicina
CORENConselho Regional de Enfermagem
COFENConselho Federal de Enfermagem
CRFConselho Regional de Farmácia
CFFConselho Federal de Farmácia
CRBMConselho Regional de Biomedicina
CFBMConselho Federal de Biomedicina
CREFITOConselho Regional de Fisioterapia e Terapia Ocupacional
COFFITOConselho Federal de Fisioterapia
CREFONOConselho Regional de Fonoaudiologia
CFFAConselho Federal de Fonoaudiologia
CRNConselho Regional de Nutricionistas
CFNConselho Federal de Nutricionistas
CRPConselho Regional de Psicologia
CFPConselho Federal de Psicologia
CREFConselho Regional de Educação Física
CONFEFConselho Federal de Educação Física

A UF é a sigla de duas letras do estado que emitiu o registro.

Gênero

gender usa os quatro códigos do FHIR R4:

CódigoNo NiloCare
maleMasculino
femaleFeminino
otherOutro
unknownNão informado

Qualquer outro valor, ou a ausência do campo, é gravado como não informado e volta como unknown na leitura.

Especialidades

As especialidades não são um vocabulário fixo desta API: elas vêm do catálogo de CBO (Classificação Brasileira de Ocupações) e do catálogo de especialidades do NiloCare, que a implantação mantém. 225130 é Médico de Família e Comunidade, 225175 é Médico Geneticista.

A leitura devolve, além do CBO que você enviou, o código do catálogo Nilo da especialidade e o nome dela em text — é por esse nome que a especialidade aparece na plataforma.

Efeitos colaterais

A escrita de Practitioner faz mais do que gravar o cadastro.

Com a extensão practitioner-user e active: true, a escrita cria um usuário e concede acesso ao NiloCare — e com ele o acesso aos pacientes de todas as unidades de cuidado vinculadas ao profissional. Com active: false, ela remove o acesso. Nos dois casos o efeito é imediato e não passa por aprovação.

Enviar address desvincula os locais de atendimento que não vierem no payload.

CPF e registro em conselho que ainda não existiam são criados no cadastro da Nilo, e um CPF ou registro já cadastrado é reaproveitado em vez de duplicado.

Este endpoint não remove profissionais: a escrita nunca responde 204. A remoção acontece do lado Nilo e é propagada para o store FHIR pela sincronização, não por esta API. O mesmo vale para o vínculo com unidade de cuidado, que a API só sabe adicionar.

Erros

Recusa é sempre 400 com um OperationOutcome: issue[].code classifica o problema, issue[].expression aponta o campo culpado e issue[].details.text explica o motivo.

codeexpressionO que aconteceu
business-rulePractitioner.identifierNenhum system enviado está habilitado para a sua unidade. A mensagem lista os que estão
invalidPractitioner.identifierRegistro em conselho fora do formato conselho-UF-número
requiredPractitioner.identifierNenhum identifier no payload
requiredPractitioner.namename ausente
requiredPractitioner.extensionAcesso sendo concedido sem practitioner-user-email
business-ruleE-mail do identifier e da extensão de login divergem
business-rulePractitioner.qualification[N].code.codingItem sem coding no system do CBO, ou com dois CBOs de especialidades diferentes
business-rulePractitioner.qualification[N].code.coding[N].codeCBO inexistente no catálogo
not-foundPractitioner.extensions[N].valueIdentifierUnidade de cuidado da extensão não encontrada
not-foundPractitioner.?Sem extensão de unidade e sem unidade padrão configurada
exceptionOs identificadores casaram com mais de um profissional
exceptionFalha ao criar o usuário de acesso

O erro que toda primeira integração encontra é o do identificador não habilitado:

Response
1{
2 "issue": [
3 {
4 "code": "business-rule",
5 "details": {
6 "text": "Unable to use any of the provided identifiers to match an existing resource, which can lead to duplicates. Configured identifier systems: https://www.acmesaude.com.br/integracao/profissional/, urn:ietf:rfc:6530."
7 },
8 "expression": [
9 "Practitioner.identifier"
10 ],
11 "severity": "error"
12 }
13 ],
14 "resourceType": "OperationOutcome"
15}

Este erro só sai quando name está ausente. Um name presente mas sem nenhum item use: official passa pela validação e grava o profissional sem nome — a escrita responde 200 e o cadastro fica vazio no lugar do nome. Confira o use antes de montar a carga.

Os dois últimos chegam da camada de execução sem serem reformulados, e por isso o code é o genérico exception e o details.text é técnico. Trate-os pela mensagem aproximada, não pelo texto exato — ele pode mudar.

A aba Referência traz o payload de todos estes erros: abra o endpoint de cadastro do Profissional e troque o exemplo na resposta 400.

O que a integração não cobre

Nem a senha nem a redefinição de senha do profissional são definidas por esta API: o convite de acesso vai por e-mail. Perfil e permissões dentro do NiloCare também não — a API concede ou remove o acesso, e o que a pessoa pode fazer depois é configuração da plataforma.

A remoção de vínculo com unidade de cuidado e a remoção do cadastro do profissional passam pelo Suporte.

E a especialidade por unidade não existe aqui: qualification descreve as especialidades da pessoa, não o que ela atende em cada unidade. O papel do profissional dentro de uma equipe é assunto do CareTeam.