Skip to navigation

Extensões

Extensões são o mecanismo do FHIR para carregar informação que o recurso padrão não prevê. Elas não alteram a estrutura do recurso: convivem com os campos padrão, e um sistema que não conhece uma extensão continua processando o resto do recurso normalmente.

Na Nilo é por aí que trafega o que é específico da plataforma — o status do paciente, o grupo a que ele pertence, as decisões de onboarding. Algumas são obrigatórias no envio, então esta página não é opcional para quem vai escrever um Patient.

A URL é a chave

Cada extensão é identificada por uma URL, e a comparação é de igualdade exata da string inteira. Não há normalização: nem barra final, nem http por https, nem casamento por sufixo. A URL que você manda é a URL que a Nilo procura, caractere por caractere.

As extensões da Nilo ficam sob:

{host}/fhir/resources/StructureDefinition/

Repare no /resources. E {host} é o host do ambiente que você está chamando — os dois estão em Introdução.

Uma URL de extensão errada não gera erro de URL: a extensão simplesmente não é encontrada. Nas extensões opcionais o valor enviado é ignorado em silêncio — num paciente que já existe a API preserva o valor atual, e num paciente novo aplica o padrão da unidade de cuidado. Nas duas obrigatórias (patient-sendWelcomingMessage e patient-createOnboardingScheduling) o resultado é um 400 dizendo que a extensão é obrigatória, mesmo estando ela ali no payload.

Os dois erros mais comuns são omitir o /resources e usar o host de produção contra homologação.

O tipo do valor também é a chave

O nome do campo de valor — valueBoolean, valueString, valueIdentifier, valueCodeableConcept, valueUrl — faz parte do contrato de cada extensão. A leitura busca exatamente aquele campo: um valueString onde se espera valueBoolean é lido como ausente, com o mesmo desfecho silencioso de uma URL errada. Por isso o catálogo abaixo traz o tipo de cada uma.

Onde aplicar

Uma extensão só é lida no nível em que foi projetada. As de Patient, Coverage, Practitioner e Encounter ficam no extension da raiz do recurso; algumas são compostas e carregam as suas próprias extensões aninhadas, e aí o filho só é encontrado dentro do pai — nunca na raiz. É o caso do practitioner-user-active, que fora de practitioner-user não tem efeito nenhum, e do patient-paths, que a API devolve nas leituras:

{
"extension": [
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-paths",
"extension": [
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-paths-home",
"valueUrl": "https://acme.nilocare.app/patients/48210"
}
]
}
]
}

Também não convém reescrever a estrutura de uma extensão — trocar o nome do campo de valor, achatar uma composta ou acrescentar elementos à definição produz o mesmo resultado de não a ter enviado.

As extensões da Nilo estão listadas pelo sufixo; o prefixo é {host}/fhir/resources/StructureDefinition/, com o {host} do ambiente que você chama. As duas do hl7.org estão por extenso, porque não ficam sob esse prefixo.

RecursoExtensãoTipoDireçãoO que faz
Patientpatient-sendWelcomingMessagevalueBooleanenvio e respostaDispara ou não a mensagem de boas-vindas após o cadastro. Obrigatória no envio
Patientpatient-createOnboardingSchedulingvalueBooleanenvio e respostaLibera o paciente para o primeiro agendamento logo após o cadastro. Obrigatória no envio
Patientpatient-isLeadvalueBooleanenvio e respostaMarca o cadastro como pré-cadastro: o paciente ainda não aceitou os termos
Patientpatient-statusvalueStringenvio e respostaStatus do paciente, pelo id de um status do seu care provider. Precisa concordar com active
PatientGroup — sem o segmento StructureDefinition/valueIdentifiersó envioGrupo do paciente, pelo identificador de um Group já cadastrado
Patientpatient-cohortvalueIdentifierenvio e respostaGrupo pelo id Nilo. Legada — prefira Group
Patientpatient-religionvalueCodeableConcept (.text)só envioReligião declarada
Patienthttp://hl7.org/fhir/StructureDefinition/patient-genderIdentityvalueCodeableConceptenvio e respostaIdentidade de gênero
Patienthttp://hl7.org/fhir/StructureDefinition/patient-cadavericDonorvalueBooleanenvio e respostaSe o paciente é doador de órgãos
Patientpatient-paths → patient-paths-homeextension → valueUrlsó respostaAtalho para a ficha do paciente no NiloCare
Coverageinsurance-planvalueIdentifiersó envioProduto da operadora, pelo identificador de um InsurancePlan já cadastrado
Practitionerpractitioner-userextensionsó envioAcesso do profissional ao NiloCare. Composta: carrega -active e -email
Practitionerpractitioner-user-activevalueBooleansó enviotrue concede o acesso, false remove. Só dentro de practitioner-user
Practitionerpractitioner-user-emailvalueStringsó envioE-mail de login. Obrigatória quando o acesso está sendo concedido. Só dentro de practitioner-user
Practitionerpractitioner-organizationvalueIdentifierenvio e respostaUnidade de cuidado do profissional, pelo identificador de uma Organization já cadastrada. Repetível, e só adiciona
Practitionerpractitioner-legacy-typevalueStringsó respostaClassificação interna do profissional, derivada do cadastro
Encounterencounter-admitSourcevalueCodeableConceptenvio e respostaOrigem do atendimento, pelo id de um item do catálogo da implantação. Só em class VR e AMB
Encounterencounter-serviceChannelvalueCodeableConceptenvio e respostaCanal usado no atendimento, pelo id de um item do catálogo. Só em class VR e AMB
Encounterencounter-dischargeDispositionvalueCodeableConceptenvio e respostaDesfecho do atendimento, pelo id de um item do catálogo. Só em class VR e AMB
Encounterencounter-clinicalNotevalueMarkdownenvio e respostaEntrevista clínica do atendimento, em markdown. Omitida, mantém a gravada; vazia ou repetida, é recusada. Só em class VR e AMB
Appointmentappointment-allowConflictvalueBooleanenvio e respostatrue dispensa a conferência da agenda do profissional — colisão, grade de atendimento e duplicidade de horário, as três juntas. Omitida vale true; só um false explícito pede a conferência, e ainda assim a configuração do care provider pode dispensá-la. Vem em toda leitura

O que cada uma significa no fluxo do recurso — quais são exigidas, com o que precisam concordar, o que acontece na atualização parcial — está na página do recurso: Paciente, Cobertura, Profissional, Atendimentos e Agendamento.

Nas três extensões do Encounter o coding.system também é load-bearing: precisa ser {host}/fhir/resources/CodeSystem/encounter-admitSource (e equivalentes). Um coding no system errado é lido como ausente, com o mesmo desfecho silencioso de uma URL errada. Elas valem apenas nos atendimentos de class VR e AMB — nos eventos (EMER e IMP) são gravadas e ignoradas.

patient-religion é assimétrica. A escrita aceita a URL sob o prefixo da Nilo, mas a leitura devolve http://hl7.org/fhir/StructureDefinition/patient-religion. Ou seja: reenviar um recurso exatamente como ele veio numa resposta não preserva a religião — reenvie a URL da Nilo.

O grupo tem o mesmo tipo de assimetria: você envia em Group e a resposta traz patient-cohort, com o id Nilo do grupo. As duas descrevem o mesmo vínculo.

As três extensões de acesso do Practitioner são as únicas desta lista que agem fora do recurso: enviá-las cria ou remove um usuário com acesso ao NiloCare. Não as inclua num payload de rotina só porque a plataforma as devolveria — a leitura não as devolve, e mandar practitioner-user-active: false num reenvio remove o acesso de quem já tinha.

Exemplo

O cadastro completo de paciente manda seis extensões de uma vez: as duas obrigatórias, isLead, e as três do hl7.org:

POST
/fhir/resources/Patient
curl -X POST https://landing-zone-api.nilo.services/fhir/resources/Patient \
-H "x-api-key: <apiKey>" \
-H "Content-Type: application/json" \
-d '{
"identifier": [
{
"system": "https://www.acmesaude.com.br/integracao/paciente/",
"value": "507823709",
"use": "usual"
},
{
"system": "https://servicos.receita.fazenda.gov.br/servicos/cpf/",
"value": "39053344705",
"use": "official"
}
],
"resourceType": "Patient",
"active": true,
"address": [
{
"city": "São Paulo",
"country": "Brasil",
"district": "Pinheiros",
"line": [
"Rua das Acácias",
"120",
"Apto 42"
],
"postalCode": "01415000",
"state": "São Paulo",
"type": "both",
"use": "home"
}
],
"birthDate": "1974-12-25",
"contained": [
{
"resourceType": "Group",
"identifier": [
{
"system": "https://www.acmesaude.com.br/integracao/grupo/",
"value": "diabeticos-tipo-2",
"use": "usual"
}
],
"type": "person",
"actual": true,
"name": "Diabéticos tipo 2"
}
],
"extension": [
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-isLead",
"valueBoolean": false
},
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-sendWelcomingMessage",
"valueBoolean": true
},
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-createOnboardingScheduling",
"valueBoolean": true
},
{
"url": "http://hl7.org/fhir/StructureDefinition/patient-genderIdentity",
"valueCodeableConcept": {
"coding": [
{
"code": "male",
"display": "male",
"system": "http://hl7.org/fhir/gender-identity"
}
]
}
},
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-religion",
"valueCodeableConcept": {
"text": "Católica"
}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/patient-cadavericDonor",
"valueBoolean": true
}
],
"gender": "male",
"managingOrganization": {
"identifier": {
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--care-unit",
"value": "4",
"use": "usual"
},
"type": "Organization"
},
"maritalStatus": {
"coding": [
{
"code": "M",
"display": "Married",
"system": "http://terminology.hl7.org/CodeSystem/v3-MaritalStatus"
}
]
},
"name": [
{
"family": "Silveira",
"given": [
"João",
"Pedro"
],
"text": "João Pedro Silveira",
"use": "official"
},
{
"text": "Joana Silveira",
"use": "usual"
}
],
"telecom": [
{
"system": "phone",
"use": "mobile",
"value": "5511987654321"
},
{
"system": "email",
"use": "home",
"value": "joao.silveira@example.com"
}
]
}'

E a resposta traz as que a Nilo gera, incluindo a composta patient-paths:

Response
{
"identifier": [
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--patient",
"value": "48210",
"use": "usual"
},
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--patient-v2-token",
"value": "0f1c2d3e-4a5b-6c7d-8e9f-a0b1c2d3e4f5",
"use": "usual"
},
{
"system": "https://www.acmesaude.com.br/integracao/paciente/",
"value": "507823709",
"use": "usual"
},
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--patient-v2",
"value": "31502",
"use": "usual"
}
],
"resourceType": "Patient",
"active": true,
"contained": [
{
"resourceType": "Group",
"identifier": [
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--cohort",
"value": "904",
"use": "usual"
},
{
"system": "https://www.acmesaude.com.br/integracao/grupo/",
"value": "diabeticos-tipo-2",
"use": "usual"
}
],
"type": "person",
"actual": true,
"name": "Diabéticos tipo 2"
}
],
"communication": [
{
"language": {
"coding": [
{
"code": "pt-BR",
"display": "Portuguese (Brazil)",
"system": "urn:ietf:bcp:47"
}
]
},
"preferred": true
}
],
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/patient-genderIdentity",
"valueCodeableConcept": {
"coding": [
{
"code": "non-disclose",
"display": "does not wish to disclose",
"system": "http://hl7.org/fhir/gender-identity"
}
]
}
},
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-cohort",
"valueIdentifier": {
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/sorting-hat-api--cohort",
"use": "usual",
"value": "904"
}
},
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-sendWelcomingMessage",
"valueBoolean": true
},
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-createOnboardingScheduling",
"valueBoolean": true
},
{
"extension": [
{
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-paths-home",
"valueUrl": "https://acme.nilocare.app/patients/48210"
}
],
"url": "https://landing-zone-api.nilo.services/fhir/resources/StructureDefinition/patient-paths"
}
],
"gender": "other",
"id": "ba200cfa-dae0-46cf-81a0-008e3f7414b4",
"meta": {
"lastUpdated": "2026-08-06T13:04:12.905000Z",
"versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
},
"name": [
{
"family": "Silveira",
"given": [
"João"
],
"text": "João Silveira",
"use": "official"
}
]
}

Extensões que a Nilo não conhece

Fora as obrigatórias, mande uma extensão só quando ela for relevante para aquele recurso: omitir uma extensão opcional preserva o valor que já está gravado.

Uma extensão cuja URL a Nilo não reconhece não é recusada nem descartada — ela é gravada no recurso e volta nas leituras seguintes, sem nenhum efeito sobre os dados da Nilo. Isso é útil para carregar metadado seu, e é uma armadilha quando a intenção era usar uma extensão da plataforma e a URL saiu errada: o payload volta parecendo correto.