Equipe de cuidado

Uma equipe de cuidado é o grupo de profissionais responsável por acompanhar um paciente: quem está nela e com que especialidade cada um atua. O vínculo é o outro lado da mesma moeda — qual equipe acompanha qual paciente, e desde quando.

No FHIR as duas coisas são o mesmo recurso, CareTeam, e é o campo subject que diz qual delas você está manipulando.

A equipe de cuidado é pré-requisito de boa parte do produto: um paciente sem equipe não recebe plano de cuidado, e a aplicação de uma diretriz é recusada se a equipe dele não cobrir as especialidades exigidas — veja Plano de cuidado.

As duas formas do recurso

subjectO que a escrita fazO que a leitura devolve
ausenteCria ou atualiza a equipe: nome, unidade de cuidado e a composição de profissionaisA equipe, sempre com status: active e sem period
presenteCria ou atualiza o vínculo entre o paciente e uma equipe, com vigênciaO vínculo, com subject, period e um único participant apontando a equipe

As duas formas convivem no mesmo endpoint e no mesmo conjunto de dados: uma busca sem filtro devolve equipes e vínculos misturados. Use identificadores distintos para cada uma. Se a sua chave do vínculo for igual à chave da equipe, a escrita alcança o registro errado — e não há erro, porque do ponto de vista do FHIR os dois são um CareTeam com aquele identifier.

Campos

A coluna Onde diz em qual das duas formas o campo é lido. 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.

CampoObrigatórioOndeO que significaNo NiloCare
resourceTypesimambasConstante CareTeam
identifiernão pela validação, sim na práticaambasSuas chaves do registro. É por aqui que a API reconhece uma equipe — ou um vínculo — que já existe
subjectsó no vínculovínculoO paciente, por um identificador dele. type tem de ser Patient. É a presença dele que escolhe a forma do recursoo vínculo aparece como Equipe de cuidado na ficha do paciente
participantsimambasQuem compõe a equipe. Na equipe, um item por profissional; no vínculo, um único item apontando a equipeProfissionais
participant[].membersimambasO profissional (type: Practitioner) ou a equipe já criada (type: CareTeam)Profissional
participant[].rolesim quando member.type é PractitionerambasAs especialidades desse profissional dentro da equipe, uma por item, em CBO ou SNOMED CTEspecialidades no time
managingOrganizationnãoambasA unidade de cuidado da equipe, só pelo identificador Nilo dela. Havendo mais de um item, vale o último com esse system; omitido, a unidade padrão da implantação é usadaUnidade de cuidado
namenãoambasNome da equipe. Omitido na criação, a plataforma gera um nome aleatório de dez caracteresNome
statusnão pela validação, sim na prática no vínculovínculoactive atribui a equipe ao paciente, inactive encerra o vínculo. Omitido, o vínculo nasce ativo e sem datas. Na equipe o campo não tem efeito sobre o cadastro
periodnãovínculoVigência do vínculo. Omitido, o status decide as datas
id · metanãoambasSó resposta: identificador Nilo FHIR e metadados da gravação

Campos que a Nilo não usa

A CareTeam canônica traz mais do que esta integração lê: category, encounter, note, reasonCode, reasonReference, telecom, e ainda participant[].onBehalfOf, participant[].period e participant[].id. Nenhum deles é lido, e por isso nenhum aparece na referência do recurso.

Enviá-los não é erro, e nenhum deles tem efeito — um period dentro de um participant, por exemplo, não limita a participação daquele profissional na equipe. Os campos de topo (note, telecom, category, encounter, reasonCode, reasonReference) ficam guardados no recurso e voltam nas leituras seguintes. Os que ficam dentro de participant[] não: quando a plataforma regrava a equipe, ela reescreve a lista de participantes inteira, e onBehalfOf, period e id desaparecem com ela.

Montar a equipe

Não há endpoint separado para criar e atualizar: o mesmo POST faz os dois, e a equipe é reconhecida pelo identifier.

POST
/fhir/resources/CareTeam
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/CareTeam \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "participant": [
6 {
7 "member": {
8 "identifier": {
9 "system": "https://www.acmesaude.com.br/integracao/profissional/",
10 "value": "1111",
11 "use": "usual"
12 },
13 "type": "Practitioner"
14 },
15 "role": [
16 {
17 "coding": [
18 {
19 "code": "223565",
20 "display": "Enfermeiro da Estratégia de Saúde da Família",
21 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
22 }
23 ]
24 }
25 ]
26 },
27 {
28 "member": {
29 "identifier": {
30 "system": "https://www.acmesaude.com.br/integracao/profissional/",
31 "value": "2222",
32 "use": "usual"
33 },
34 "type": "Practitioner"
35 },
36 "role": [
37 {
38 "coding": [
39 {
40 "code": "225130",
41 "display": "Médico de Família e Comunidade",
42 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
43 }
44 ]
45 }
46 ]
47 }
48 ],
49 "resourceType": "CareTeam",
50 "identifier": [
51 {
52 "system": "https://www.acmesaude.com.br/integracao/equipe-de-cuidado/",
53 "value": "123",
54 "use": "usual"
55 }
56 ],
57 "managingOrganization": [
58 {
59 "identifier": {
60 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
61 "value": "4471",
62 "use": "usual"
63 },
64 "type": "Organization"
65 }
66 ],
67 "name": "Equipe de cuidado crônico — Zona Sul",
68 "status": "active"
69}'

A resposta é o recurso gravado, sem envelope:

Response
1{
2 "participant": [
3 {
4 "member": {
5 "identifier": {
6 "system": "https://www.acmesaude.com.br/integracao/profissional/",
7 "value": "1111",
8 "use": "usual"
9 },
10 "type": "Practitioner"
11 },
12 "role": [
13 {
14 "coding": [
15 {
16 "code": "223565",
17 "display": "Enfermeiro da Estratégia de Saúde da Família",
18 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
19 }
20 ]
21 }
22 ]
23 },
24 {
25 "member": {
26 "identifier": {
27 "system": "https://www.acmesaude.com.br/integracao/profissional/",
28 "value": "2222",
29 "use": "usual"
30 },
31 "type": "Practitioner"
32 },
33 "role": [
34 {
35 "coding": [
36 {
37 "code": "225130",
38 "display": "Médico de Família e Comunidade",
39 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
40 }
41 ]
42 }
43 ]
44 }
45 ],
46 "resourceType": "CareTeam",
47 "id": "9d2c47f0-6b18-4a35-8e71-05fc93b2ad64",
48 "identifier": [
49 {
50 "system": "https://www.acmesaude.com.br/integracao/equipe-de-cuidado/",
51 "value": "123",
52 "use": "usual"
53 },
54 {
55 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-team",
56 "value": "8812",
57 "use": "usual"
58 }
59 ],
60 "managingOrganization": [
61 {
62 "identifier": {
63 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
64 "value": "4471",
65 "use": "usual"
66 },
67 "type": "Organization"
68 }
69 ],
70 "meta": {
71 "lastUpdated": "2026-03-02T13:22:41.204000Z",
72 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
73 },
74 "name": "Equipe de cuidado crônico — Zona Sul",
75 "status": "active"
76}

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

A resposta da escrita repete o que você enviou — ela não confirma o que a plataforma registrou. Na gravação, todo campo presente no seu payload vence a visão da plataforma: participant, role, name, status e period voltam como foram mandados, acrescidos apenas de id, meta e do identificador Nilo. Um profissional que a plataforma descartou continua aparecendo na resposta, e as referências (member.reference) não vêm.

Para saber como a equipe ficou de fato, leia a equipe depois — por id ou por identifier. A leitura é o que reflete a plataforma; a resposta da escrita, não.

Sem identifier que case, a chamada cria uma equipe nova. Não há reconhecimento por composição de profissionais nesta forma do recurso: mandar duas vezes a mesma equipe com chaves diferentes produz duas equipes com os mesmos integrantes. Mande sempre a sua chave, e a mesma chave.

Os profissionais e as especialidades

Cada item de participant é um profissional, e role são as especialidades com que ele atua naquela equipe. Um profissional com duas especialidades no time vai num único participant, com dois itens em role.

Repetir o mesmo profissional em dois participant também funciona: as especialidades dos dois itens são somadas, e o resultado é o mesmo de um item com dois role. É o que permite reenviar, sem tratamento, a forma que a leitura devolve.

Três condições, todas verificadas na chamada:

  1. member.type tem de ser Practitioner. Na escrita da equipe nenhum outro tipo é aceito.
  2. O profissional tem de existir e estar ativo — é o cadastro de Profissional que responde por isso.
  3. O profissional tem de pertencer à unidade de cuidado da equipe. Um profissional fora dela recusa a chamada inteira.

A atualização substitui a composição, não a complementa. Todo par profissional + especialidade que não vier no participant é removido da equipe. Para trocar um integrante, reenvie a formação completa — inclusive quem não mudou.

POST
/fhir/resources/CareTeam
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/CareTeam \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "participant": [
6 {
7 "member": {
8 "identifier": {
9 "system": "https://www.acmesaude.com.br/integracao/profissional/",
10 "value": "3333",
11 "use": "usual"
12 },
13 "type": "Practitioner"
14 },
15 "role": [
16 {
17 "coding": [
18 {
19 "code": "223565",
20 "display": "Enfermeiro da Estratégia de Saúde da Família",
21 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
22 }
23 ]
24 }
25 ]
26 },
27 {
28 "member": {
29 "identifier": {
30 "system": "https://www.acmesaude.com.br/integracao/profissional/",
31 "value": "2222",
32 "use": "usual"
33 },
34 "type": "Practitioner"
35 },
36 "role": [
37 {
38 "coding": [
39 {
40 "code": "225130",
41 "display": "Médico de Família e Comunidade",
42 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
43 }
44 ]
45 }
46 ]
47 }
48 ],
49 "resourceType": "CareTeam",
50 "identifier": [
51 {
52 "system": "https://www.acmesaude.com.br/integracao/equipe-de-cuidado/",
53 "value": "123",
54 "use": "usual"
55 }
56 ],
57 "managingOrganization": [
58 {
59 "identifier": {
60 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
61 "value": "4471",
62 "use": "usual"
63 },
64 "type": "Organization"
65 }
66 ],
67 "status": "active"
68}'

A chave participant tem de estar presente: um payload sem ela é recusado com participant of the CareTeam is required. Uma lista vazia ([]) é aceita pela regra de negócio e esvazia a equipe — todos os integrantes são removidos e a equipe continua existindo, sem ninguém. Mas o padrão FHIR não admite array vazio, e a validação do recurso acontece antes dessa regra: se você precisa esvaziar uma equipe pela API, confirme esse caminho com o Suporte antes de contar com ele.

Um role cujo coding não esteja em CBO nem em SNOMED CT é ignorado em silêncio, e o profissional acaba fora da equipe: sem especialidade reconhecida, não há o que registrar. A chamada responde 200, e — como a resposta repete o payload — ela ainda mostra o profissional. Só uma leitura posterior revela que ele não entrou. Já um código dentro desses sistemas que não esteja mapeado recusa a chamada, com mensagem explícita — veja Erros.

A unidade de cuidado

A unidade vem em managingOrganization[].identifier, e só é reconhecida no system …/NamingSystem/sorting-hat-api--care-unit — o identificador Nilo da unidade. Omitida, ou informada em outro system, a unidade padrão da sua implantação é usada.

1"managingOrganization": [
2 {
3 "identifier": {
4 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
5 "value": "4471"
6 },
7 "type": "Organization"
8 }
9]

A unidade de cuidado não muda depois da criação. Numa atualização ela é usada apenas para validar os profissionais enviados; a unidade gravada na equipe continua a mesma. E como a validação é feita contra a unidade do payload, omitir managingOrganization numa atualização faz a chamada ser validada contra a unidade padrão — se a equipe não for dela, os profissionais são recusados por não pertencerem “a nenhuma unidade de cuidado”. Envie sempre a mesma unidade que você usou na criação.

Aqui a sua própria chave não serve. Ao contrário do Paciente e do Profissional, que aceitam qualquer identificador da unidade, a equipe de cuidado só lê o identificador Nilo. Um managingOrganization com o identificador do seu sistema é ignorado em silêncio, e a equipe acaba na unidade padrão — ou a chamada é recusada com Managing organization not found. se não houver padrão configurado.

Havendo mais de um item em managingOrganization, vale o último cujo system seja o identificador Nilo, não o primeiro.

Para descobrir as unidades do seu ambiente e o identificador Nilo de cada uma, 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

status na escrita da equipe não tem efeito sobre o cadastro: a equipe não tem vigência. Mas o valor que você enviar fica no recurso FHIR e é lido de volta até a plataforma regravar a equipe — o que pode levar horas, porque uma regravação sem mudança de conteúdo é dispensada. Envie active, que é o valor que a plataforma produz.

Atribuir a equipe a um paciente

Com subject, a mesma escrita passa a ser o vínculo entre o paciente e uma equipe. Há duas formas, escolhidas pelo member.type do participant.

Apontando uma equipe existente

member.type igual a CareTeam, com o identificador da equipe. É a forma previsível: o vínculo aponta uma equipe que você já criou.

POST
/fhir/resources/CareTeam
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/CareTeam \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "participant": [
6 {
7 "member": {
8 "identifier": {
9 "system": "https://www.acmesaude.com.br/integracao/equipe-de-cuidado/",
10 "value": "123",
11 "use": "usual"
12 },
13 "type": "CareTeam"
14 }
15 }
16 ],
17 "resourceType": "CareTeam",
18 "identifier": [
19 {
20 "system": "https://www.acmesaude.com.br/integracao/vinculo-equipe/",
21 "value": "321",
22 "use": "usual"
23 }
24 ],
25 "managingOrganization": [
26 {
27 "identifier": {
28 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
29 "value": "4471",
30 "use": "usual"
31 },
32 "type": "Organization"
33 }
34 ],
35 "status": "active",
36 "subject": {
37 "identifier": {
38 "system": "https://www.acmesaude.com.br/integracao/paciente/",
39 "value": "507823709",
40 "use": "usual"
41 },
42 "type": "Patient"
43 }
44}'
Response
1{
2 "participant": [
3 {
4 "member": {
5 "identifier": {
6 "system": "https://www.acmesaude.com.br/integracao/equipe-de-cuidado/",
7 "value": "123",
8 "use": "usual"
9 },
10 "type": "CareTeam",
11 "reference": "CareTeam/9d2c47f0-6b18-4a35-8e71-05fc93b2ad64"
12 }
13 }
14 ],
15 "resourceType": "CareTeam",
16 "id": "4a7e15d8-3c62-4f09-b8a3-71de095cb246",
17 "identifier": [
18 {
19 "system": "https://www.acmesaude.com.br/integracao/vinculo-equipe/",
20 "value": "321",
21 "use": "usual"
22 },
23 {
24 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--patient-care-team",
25 "value": "30512",
26 "use": "usual"
27 }
28 ],
29 "managingOrganization": [
30 {
31 "identifier": {
32 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
33 "value": "4471",
34 "use": "usual"
35 },
36 "type": "Organization"
37 }
38 ],
39 "name": "Equipe de cuidado crônico — Zona Sul",
40 "period": {
41 "start": "2026-03-02T00:00:00Z"
42 },
43 "status": "active",
44 "subject": {
45 "identifier": {
46 "system": "https://www.acmesaude.com.br/integracao/paciente/",
47 "value": "507823709",
48 "use": "usual"
49 },
50 "type": "Patient"
51 }
52}

A equipe precisa existir antes. Não existindo, a chamada é recusada — mas o erro sai como code: exception, com uma mensagem de linguagem no lugar de uma explicação do campo. Crie a equipe primeiro e confirme o identifier dela antes de atribuí-la.

Compondo pelos profissionais

member.type igual a Practitioner em todos os participantes, cada um com o seu role. A plataforma procura uma equipe cuja composição de profissionais e especialidades seja exatamente a que você enviou e, achando, vincula o paciente a ela.

POST
/fhir/resources/CareTeam
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/CareTeam \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "participant": [
6 {
7 "member": {
8 "identifier": {
9 "system": "https://www.acmesaude.com.br/integracao/profissional/",
10 "value": "1111",
11 "use": "usual"
12 },
13 "type": "Practitioner"
14 },
15 "role": [
16 {
17 "coding": [
18 {
19 "code": "223565",
20 "display": "Enfermeiro da Estratégia de Saúde da Família",
21 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
22 }
23 ]
24 }
25 ]
26 }
27 ],
28 "resourceType": "CareTeam",
29 "identifier": [
30 {
31 "system": "https://www.acmesaude.com.br/integracao/vinculo-equipe/",
32 "value": "322",
33 "use": "usual"
34 }
35 ],
36 "managingOrganization": [
37 {
38 "identifier": {
39 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
40 "value": "4471",
41 "use": "usual"
42 },
43 "type": "Organization"
44 }
45 ],
46 "name": "Equipe de cuidado crônico — Zona Sul",
47 "status": "active",
48 "subject": {
49 "identifier": {
50 "system": "https://www.acmesaude.com.br/integracao/paciente/",
51 "value": "507823709",
52 "use": "usual"
53 },
54 "type": "Patient"
55 }
56}'

Não achando, uma equipe nova é criada. É o efeito colateral mais fácil de disparar sem querer: uma especialidade a mais ou a menos já faz a composição não casar, e o resultado é uma equipe nova — com o name que você mandou, ou um nome aleatório — em vez do vínculo com a equipe que você tinha em mente. Se a intenção é reusar uma equipe, aponte-a pelo member.type: CareTeam.

A equipe reaproveitada é reescrita. Antes de comparar composições, a API tenta reencontrar o vínculo pelo identifier que você mandou; achando, reusa a equipe que ele já apontava. Mas em seguida essa equipe recebe o name do payload e tem a composição substituída pela que você enviou, par a par — exatamente como numa atualização da equipe. Reenviar o vínculo com um profissional a menos remove esse profissional da equipe, para todos os pacientes ligados a ela.

Se a sua intenção é só trocar o paciente de equipe, aponte a equipe por member.type: CareTeam: essa forma não mexe na composição.

Nesta forma, um profissional que não pertence à unidade de cuidado é descartado em silêncio: ele é validado como profissional, mas fica de fora da equipe montada, e a chamada responde 200. É diferente da escrita da equipe, onde o mesmo caso é recusado com erro. Confira a composição da equipe criada antes de considerar a atribuição concluída.

Um participant vazio também é aceito aqui, e vincula o paciente a uma equipe nova sem nenhum profissional. Como um paciente sem profissionais na equipe não recebe plano de cuidado, essa combinação raramente é o que se quer.

Vigência: status e period

O status é a instrução, e o period é o registro. Enviando um sem o outro, o status decide as datas:

Você enviaO que fica registrado
status: active, sem periodO vínculo começa agora; a data de fim atual é preservada
status: inactive, sem periodO vínculo é encerrado agora; a data de início atual é preservada
period com start e/ou endAs datas enviadas; a que faltar mantém o valor atual

Havendo period no payload, três regras são conferidas:

  • period.end não pode ser enviado com status: active;
  • period.end tem de ser anterior ao momento da chamada;
  • o período tem de ser coerente com o status — um período vigente não pode vir marcado como inactive, nem o contrário.

Na leitura, o status é derivado do período: active quando o momento da leitura cai dentro dele, inactive fora. Um vínculo sem datas é lido como active.

Criar um vínculo encerra um vínculo anterior do paciente. A plataforma fecha um dos vínculos existentes com a data e hora da chamada antes de registrar o novo — não é preciso encerrá-lo antes, e não há aviso na resposta de que isso aconteceu. Um paciente tem uma equipe por vez.

O vínculo escolhido não é necessariamente o vigente: é o primeiro que a plataforma encontra para aquele paciente. Num paciente com histórico de vínculos, isso pode reescrever a data de fim de um vínculo já encerrado. Encerre você mesmo o vínculo vigente, com status: inactive, antes de atribuir a equipe nova — é o caminho previsível.

O encerramento automático vale para a criação de um vínculo, não para a atualização de um que já existe. Reenviar um vínculo que a API reconheça pelo identifier atualiza aquele registro e não mexe em nenhum outro.

Quando o encerramento automático não resolve a situação — por exemplo, um paciente com mais de um vínculo em aberto —, a escrita é recusada com This patient already belongs to an unfinished care team, e nada é gravado. Nesse caso encerre os vínculos abertos explicitamente, com status: inactive, antes de atribuir a equipe nova.

Encerrar o vínculo

Reenvie o vínculo com status: inactive e sem period:

POST
/fhir/resources/CareTeam
1curl -X POST https://landing-zone-api.nilo.services/fhir/resources/CareTeam \
2 -H "x-api-key: <apiKey>" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "participant": [
6 {
7 "member": {
8 "identifier": {
9 "system": "https://www.acmesaude.com.br/integracao/equipe-de-cuidado/",
10 "value": "123",
11 "use": "usual"
12 },
13 "type": "CareTeam"
14 }
15 }
16 ],
17 "resourceType": "CareTeam",
18 "identifier": [
19 {
20 "system": "https://www.acmesaude.com.br/integracao/vinculo-equipe/",
21 "value": "321",
22 "use": "usual"
23 }
24 ],
25 "status": "inactive",
26 "subject": {
27 "identifier": {
28 "system": "https://www.acmesaude.com.br/integracao/paciente/",
29 "value": "507823709",
30 "use": "usual"
31 },
32 "type": "Patient"
33 }
34}'

Depois disso o paciente fica sem equipe de cuidado até uma nova atribuição — e sem equipe ele não entra em diretriz nova e não recebe itens de plano de cuidado. Encerrar sem atribuir outra equipe interrompe o acompanhamento.

Buscar

GET
/fhir/resources/CareTeam
1curl -G https://landing-zone-api.nilo.services/fhir/resources/CareTeam \
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/equipe-de-cuidado/|123 \
8 --data-urlencode participant=Practitioner/2c9f81ab-4d70-4e33-9b52-6ad10f7c4e88 \
9 --data-urlencode participant:identifier=https://www.acmesaude.com.br/integracao/profissional/|1111 \
10 --data-urlencode patient=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
11 --data-urlencode patient:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709 \
12 -d status=active \
13 --data-urlencode subject=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
14 --data-urlencode subject:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709

A resposta é sempre um Bundle do tipo searchset, com equipes e vínculos misturados:

Response
1{
2 "resourceType": "Bundle",
3 "type": "searchset",
4 "entry": [
5 {
6 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/CareTeam/9d2c47f0-6b18-4a35-8e71-05fc93b2ad64",
7 "resource": {
8 "participant": [
9 {
10 "member": {
11 "identifier": {
12 "system": "https://www.acmesaude.com.br/integracao/profissional/",
13 "value": "1111",
14 "use": "usual"
15 },
16 "type": "Practitioner",
17 "reference": "Practitioner/2c9f81ab-4d70-4e33-9b52-6ad10f7c4e88"
18 },
19 "role": [
20 {
21 "coding": [
22 {
23 "code": "223565",
24 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
25 }
26 ],
27 "text": "ENFERMEIRO DA ESTRATEGIA DE SAUDE DA FAMILIA"
28 }
29 ]
30 },
31 {
32 "member": {
33 "identifier": {
34 "system": "https://www.acmesaude.com.br/integracao/profissional/",
35 "value": "2222",
36 "use": "usual"
37 },
38 "type": "Practitioner",
39 "reference": "Practitioner/6f30b71c-9e48-4a11-84d0-b7c25e9138af"
40 },
41 "role": [
42 {
43 "coding": [
44 {
45 "code": "225130",
46 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
47 }
48 ],
49 "text": "MEDICO DA FAMILIA E COMUNIDADE"
50 }
51 ]
52 }
53 ],
54 "resourceType": "CareTeam",
55 "id": "9d2c47f0-6b18-4a35-8e71-05fc93b2ad64",
56 "identifier": [
57 {
58 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-team",
59 "value": "8812",
60 "use": "usual"
61 },
62 {
63 "system": "https://www.acmesaude.com.br/integracao/equipe-de-cuidado/",
64 "value": "123",
65 "use": "usual"
66 }
67 ],
68 "managingOrganization": [
69 {
70 "identifier": {
71 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
72 "value": "4471",
73 "use": "usual"
74 },
75 "type": "Organization"
76 }
77 ],
78 "name": "Equipe de cuidado crônico — Zona Sul",
79 "status": "active"
80 },
81 "search": {
82 "mode": "match"
83 }
84 },
85 {
86 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/CareTeam/4a7e15d8-3c62-4f09-b8a3-71de095cb246",
87 "resource": {
88 "participant": [
89 {
90 "member": {
91 "identifier": {
92 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-team",
93 "value": "8812",
94 "use": "usual"
95 },
96 "type": "CareTeam",
97 "reference": "CareTeam/9d2c47f0-6b18-4a35-8e71-05fc93b2ad64"
98 }
99 }
100 ],
101 "resourceType": "CareTeam",
102 "id": "4a7e15d8-3c62-4f09-b8a3-71de095cb246",
103 "identifier": [
104 {
105 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--patient-care-team",
106 "value": "30512",
107 "use": "usual"
108 },
109 {
110 "system": "https://www.acmesaude.com.br/integracao/vinculo-equipe/",
111 "value": "321",
112 "use": "usual"
113 }
114 ],
115 "managingOrganization": [
116 {
117 "identifier": {
118 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
119 "value": "4471",
120 "use": "usual"
121 },
122 "type": "Organization"
123 }
124 ],
125 "name": "Equipe de cuidado crônico — Zona Sul",
126 "period": {
127 "start": "2026-03-02T00:00:00Z"
128 },
129 "status": "active",
130 "subject": {
131 "identifier": {
132 "system": "https://www.acmesaude.com.br/integracao/paciente/",
133 "value": "507823709",
134 "use": "usual"
135 },
136 "type": "Patient",
137 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
138 }
139 },
140 "search": {
141 "mode": "match"
142 }
143 }
144 ],
145 "link": []
146}

Busca sem resultados não é erro: volta 200 com um Bundle cujo entry é uma lista vazia. Trate a ausência de resultados pela lista vazia, não esperando um 404.

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

Parâmetros de busca suportados

NomeTipoDescriçãoExpressão
identifiertokenIdentificador da equipe ou do vínculo, em system|valueCareTeam.identifier
statustokenactive ou inactiveCareTeam.status
subject:identifiertokenVínculos de um paciente, pelo identificador deleCareTeam.subject.identifier
subjectreferenceVínculos de um paciente, pelo id Nilo FHIRCareTeam.subject
patient:identifier · patientidemSinônimos dos dois acima: aqui o subject é sempre um pacienteCareTeam.subject
participant:identifiertokenRecursos em que um profissional — ou uma equipe — participa, pelo identificador deleCareTeam.participant.member.identifier
participantreferenceO mesmo, pelo id Nilo FHIRCareTeam.participant.member
datedateVigência do vínculo, com os prefixos eq, ge, leCareTeam.period
_lastUpdateddateData da última gravação no store, com os mesmos prefixos

A busca mais usada é a do vínculo vigente de um paciente:

$curl --request GET \
> --url 'https://landing-zone-api.nilo.services/fhir/resources/CareTeam?subject:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709&status=active' \
> --header 'x-api-key: SUA_API_KEY'

status=inactive traz apenas vínculos, e só os encerrados: a equipe de cuidado sai sempre como active. Não há, do outro lado, um filtro que traga apenas equipes — para separá-las dos vínculos, olhe a presença de subject em cada entrada do resultado.

Qual identificador as referências carregam depende da sua implantação. Na configuração que usa identificadores externos nas referências, subject e participant[].member trazem o identificador do seu sistema, e os filtros acima funcionam como estão. Sem ela, vêm os identificadores Nilo (…/NamingSystem/hippocrates-api--patient, …/NamingSystem/almanac-api--professional), e é 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.

Dois parâmetros canônicos da CareTeam existem e não encontram nada aqui, porque a Nilo não preenche o campo correspondente: category e encounter.

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

Response
1{
2 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/CareTeam/9d2c47f0-6b18-4a35-8e71-05fc93b2ad64",
3 "resource": {
4 "participant": [
5 {
6 "member": {
7 "identifier": {
8 "system": "https://www.acmesaude.com.br/integracao/profissional/",
9 "value": "1111",
10 "use": "usual"
11 },
12 "type": "Practitioner",
13 "reference": "Practitioner/2c9f81ab-4d70-4e33-9b52-6ad10f7c4e88"
14 },
15 "role": [
16 {
17 "coding": [
18 {
19 "code": "224571005",
20 "system": "http://snomed.info/sct"
21 }
22 ],
23 "text": "Nurse practitioner"
24 },
25 {
26 "coding": [
27 {
28 "code": "223565",
29 "system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
30 }
31 ],
32 "text": "ENFERMEIRO DA ESTRATEGIA DE SAUDE DA FAMILIA"
33 }
34 ]
35 }
36 ],
37 "resourceType": "CareTeam",
38 "id": "9d2c47f0-6b18-4a35-8e71-05fc93b2ad64",
39 "identifier": [
40 {
41 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-team",
42 "value": "8812",
43 "use": "usual"
44 },
45 {
46 "system": "https://www.acmesaude.com.br/integracao/equipe-de-cuidado/",
47 "value": "123",
48 "use": "usual"
49 }
50 ],
51 "managingOrganization": [
52 {
53 "identifier": {
54 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
55 "value": "4471",
56 "use": "usual"
57 },
58 "type": "Organization"
59 }
60 ],
61 "meta": {
62 "lastUpdated": "2026-03-02T13:22:41.204000Z",
63 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
64 },
65 "name": "Equipe de cuidado crônico — Zona Sul",
66 "status": "active"
67 },
68 "search": {
69 "mode": "match"
70 }
71}

A leitura da equipe quebra um profissional com várias especialidades em vários participant. Você escreve um item com dois role; a leitura devolve dois itens com o mesmo member e um role cada. Não é perda de dado — reenviar o que foi lido reconstrói a mesma composição —, mas quem conta participant para saber o tamanho da equipe conta errado. Conte member distintos.

Cada role lido traz um coding, e text com o nome da ocupação naquele catálogo — não o nome da especialidade na plataforma. Uma especialidade mapeada nos dois catálogos sai como dois itens de role, um por sistema, e não como um item com dois coding.

Response
1{
2 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/CareTeam/4a7e15d8-3c62-4f09-b8a3-71de095cb246",
3 "resource": {
4 "participant": [
5 {
6 "member": {
7 "identifier": {
8 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-team",
9 "value": "8812",
10 "use": "usual"
11 },
12 "type": "CareTeam",
13 "reference": "CareTeam/9d2c47f0-6b18-4a35-8e71-05fc93b2ad64"
14 }
15 }
16 ],
17 "resourceType": "CareTeam",
18 "id": "4a7e15d8-3c62-4f09-b8a3-71de095cb246",
19 "identifier": [
20 {
21 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--patient-care-team",
22 "value": "30512",
23 "use": "usual"
24 },
25 {
26 "system": "https://www.acmesaude.com.br/integracao/vinculo-equipe/",
27 "value": "321",
28 "use": "usual"
29 }
30 ],
31 "managingOrganization": [
32 {
33 "identifier": {
34 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
35 "value": "4471",
36 "use": "usual"
37 },
38 "type": "Organization"
39 }
40 ],
41 "name": "Equipe de cuidado crônico — Zona Sul",
42 "period": {
43 "end": "2026-08-14T18:03:12.517000Z",
44 "start": "2026-03-02T00:00:00Z"
45 },
46 "status": "inactive",
47 "subject": {
48 "identifier": {
49 "system": "https://www.acmesaude.com.br/integracao/paciente/",
50 "value": "507823709",
51 "use": "usual"
52 },
53 "type": "Patient",
54 "reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4"
55 }
56 },
57 "search": {
58 "mode": "match"
59 }
60}

A leitura por ID responde 404 quando o id não existe.

Valores aceitos

participant[].role

Dois sistemas de codificação, e só eles:

SistemasystemCatálogo
CBOhttp://www.saude.gov.br/fhir/r4/CodeSystem/BRCBOClassificação Brasileira de Ocupações
SNOMED CThttp://snomed.info/sctSNOMED CT

Dentro de um item de role, o primeiro coding num desses dois sistemas é o que vale — os demais são ignorados. Um código em qualquer outro system é ignorado, e um item de role só com códigos ignorados não registra especialidade nenhuma.

Nem todo código dos dois catálogos é utilizável: o código precisa estar mapeado para uma especialidade da plataforma. Não estando, a chamada é recusada com BOC code … does not exist or it is not mapped ou SNOMED code … does not exist or it is not mapped.

status

active e inactive — são os dois únicos valores que a leitura produz e os dois únicos com efeito na escrita.

Os demais valores do FHIR R4 (proposed, suspended, entered-in-error) não são recusados: eles caem no mesmo caminho de um status ausente, e num vínculo novo isso grava um vínculo sem datas, que a leitura seguinte devolve como active. Não use nenhum deles esperando que o vínculo fique inativo — só inactive encerra.

Efeitos colaterais

Atribuir uma equipe a um paciente encerra o vínculo vigente dele. O vínculo anterior é fechado com a data e hora da chamada, sem aviso na resposta.

Atualizar a equipe remove quem não foi enviado. A composição enviada substitui a existente, par a par (profissional + especialidade).

Atribuir uma equipe pelos profissionais pode criar uma equipe nova. Sem uma equipe cuja composição case exatamente com a enviada, uma é criada — e passa a existir no cadastro de equipes da unidade.

Este endpoint não remove equipes nem vínculos: a escrita nunca responde 204. O que existe é o encerramento do vínculo, por status: inactive, e ele preserva o registro no histórico do paciente.

Erros

Recusa é 400, e o corpo é um OperationOutcome: issue[].expression aponta o campo culpado e issue[].details.text explica o motivo. O outro código que este endpoint devolve é 429.

codeexpressionMensagemQuando
structureCareTeam.participantparticipant of the CareTeam is requiredA chave participant está ausente do payload
structureCareTeam.participant.memberMembers of the Care Team must be PractitionersNa escrita da equipe, um member sem type ou com type diferente de Practitioner
structureCareTeam.participant.roleThe role of Practitioners is requiredNa escrita da equipe, um participante sem role
structureCareTeam.participant.roleBOC code … does not exist or it is not mappedCódigo CBO não mapeado para uma especialidade
structureCareTeam.participant.roleSNOMED code … does not exist or it is not mappedIdem, em SNOMED CT
structureCareTeam.participantPractitioner with identifier … does not exist or is not activeO identificador do profissional não resolve, ou o profissional está inativo
structureCareTeam.participantPractitioner with nilo identifier does not existO profissional existe no store mas não tem identificador Nilo
structureCareTeam.participantParticipant not found.O profissional tem identificador Nilo, mas o cadastro não foi encontrado
structureCareTeam.participantProfessional … not found in any Care UnitO profissional não pertence à unidade de cuidado da equipe
structureCareTeam.participantCareTeam … does not exist or is not activeNo vínculo, a equipe apontada existe no store mas o cadastro dela não
structureCareTeam.participant.memberOnly Practitioner and CareTeam is a type supportedNo vínculo, um member.type fora desses dois
structureCareTeam.participant.memberMany Participant must be practitionersNo vínculo com mais de um participante, algum não é Practitioner
structureCareTeam.managingOrganizationManaging organization not found.A unidade informada não existe, ou não há unidade padrão configurada
structureCareTeam.subject.typeSubject type must be Patientsubject.type diferente de Patient
structureCareTeam.subjectPatient with identifier … does not exist or is not activeO identificador do paciente não resolve
structureCareTeam.subjectPatient with nilo identifier does not existO paciente existe no store mas não tem identificador Nilo
structureCareTeam.subjectPatient not foundO identificador Nilo do paciente está presente mas vazio
structureCareTeam.subjectSubject not found.O paciente tem identificador Nilo, mas o cadastro não foi encontrado
structureCareTeam.subjectSubject does not belongs to this managing organization.O paciente não pertence à unidade de cuidado da equipe
structureCareTeam.subjectThis patient already belongs to an unfinished care teamO paciente tem vínculo em aberto que o encerramento automático não resolveu
structureCareTeam.periodperiod.end should not be used when status is activeperiod.end enviado com status: active
structureCareTeam.periodperiod.end should be less than nowperiod.end no futuro
structureCareTeam.statusThe given period is inconsistent with status …Período vigente marcado como inactive, ou o contrário
exceptionTypeError: 'NoneType' object is not iterableUm item de role sem coding (só com text), ou, no vínculo composto por profissionais, um participante sem role
exceptionAttributeError: 'NoneType' object has no attribute …O subject, ou a equipe apontada no participant de um vínculo, não casa com nenhum recurso

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

Response
1{
2 "issue": [
3 {
4 "code": "structure",
5 "details": {
6 "text": "Professional https://www.acmesaude.com.br/integracao/profissional/|1111 not found in any Care Unit"
7 },
8 "expression": [
9 "CareTeam.participant"
10 ],
11 "severity": "error"
12 }
13 ],
14 "resourceType": "OperationOutcome"
15}

As duas últimas linhas da tabela não são validações — são falhas não tratadas, e a segunda é o caso comum de identificador errado, não uma raridade. O 400 sai com code: exception, sem expression, e com uma mensagem de erro de linguagem em vez de uma explicação do campo. As mensagens específicas de paciente e de equipe inexistentes estão na tabela porque o código as produz, mas elas dependem de o repositório de recursos responder “não encontrado” — quando o identificador apenas não casa com nada, o que você recebe é o exception.

Nenhuma das duas é contrato: não tente interpretá-las. Trate code: exception como “payload recusado, motivo não classificado”, e confira os identificadores enviados.

Limite de escrita

As escritas deste recurso podem ser limitadas por janela de tempo, para todo o seu ambiente. Atingido o limite, a resposta é 429 com o code throttled e o tempo de espera na mensagem — aguarde e repita.

O limite vigente é definido na implantação, e pode estar desligado. Se você vai fazer uma carga em volume, confirme com o Suporte qual é o teto do seu ambiente antes de dimensionar.