Skip to navigation

Solicitação de serviço

A solicitação de serviço é o pedido de que alguma coisa seja feita para o paciente. Na plataforma isso são três coisas diferentes, e todas saem como ServiceRequest:

O que éEscrita
Pedido de examenão há
Encaminhamento para outra especialidadenão há
Conduta de sugestão terapêuticasim — é a única

Reconhecer qual é qual se faz pelo system do identificador Nilo, e só por ele — veja Como distinguir as três origens.

O intent decide tudo na escrita, e o valor que funciona não é o natural. Só intent: proposal tem destino: ele grava uma conduta. Qualquer outro valor — inclusive order, que é o que a leitura devolve nos pedidos de exame — não é gravável, e a chamada falha com erro inesperado do servidor (500), sem OperationOutcome.

Ou seja: você não pode reenviar um pedido de exame lido por esta API. Não há caminho de escrita para pedido de exame nem para encaminhamento.

Como distinguir as três origens

O intent separa a conduta das outras duas. Para separar pedido de exame de encaminhamento, olhe o system do identificador Nilo:

Origemintentsystem do identificador NiloCampos exclusivos
Pedido de exameorder…/NamingSystem/hippocrates-api--exam-requestcode, category, orderDetail, basedOn, supportingInfo
Encaminhamentoorder…/NamingSystem/hippocrates-api--patient-referralperformerType, reasonCode, authoredOn, locationReference
Condutaproposal…/NamingSystem/care-api--conduct-v2—

Só a conduta pode carregar uma chave do seu sistema, porque é a única que você grava. As outras duas trazem apenas o identificador Nilo.

Pedido de exame

É o exame solicitado numa receita.

CampoSempre presenteO que significaNo Nilo Care
identifiersimIdentificador Nilo do pedido—
statussimSituação da receita — veja abaixo—
intentsimConstante order—
category[0]simConstante TUSS-50 de procedimento diagnóstico—
codenãoO exame, num código TUSS-63o nome do exame no card do pedido
orderDetail[]nãoOs CIDs que justificam o pedido, um por itemCID — a tela mostra só o primeiro
subjectsimO paciente—
requestersimO profissional que pediu—
encountersimO atendimento da receita—
basedOn[0]simA receita de origem—
supportingInfo[]nãoAponta para o documento com a URL do PDF do pedido—

O status vem da receita inteira, não deste exame:

ValorSituação da receita
draftPendente ou em emissão
completedEmitida
entered-in-errorA emissão falhou
unknownReceita apagada

Uma receita com três exames produz três pedidos, todos com o mesmo status. Ele não diz se o exame foi realizado — esse dado não existe nesta API.

E o status do pedido de exame pode ficar para trás. Ele é fotografado quando o pedido muda, não quando a receita é emitida: um pedido pode continuar draft numa receita já emitida. O encaminhamento não tem esse problema — nele a mudança de situação da receita ressincroniza o recurso.

Se você precisa acompanhar a emissão, releia por _lastUpdated em vez de confiar no status que veio.

encounter e basedOn vêm sem o campo reference — só com identifier e type. Para buscar por eles, use encounter:identifier e based-on:identifier; a forma sem modificador não encontra nada.

O documento apontado por supportingInfo[0] carrega o mesmo identificador do pedido de exame — então dá para buscá-lo direto por identifier, sem seguir a referência. A URL do arquivo está em content[0].attachment.url.

Esse recurso não tem página neste guia, e a URL que ele guarda é um caminho de armazenamento, não necessariamente um link de download direto — o mesmo comportamento descrito em Arquivo do paciente.

Response
{
"resourceType": "Bundle",
"type": "searchset",
"entry": [
{
"fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/ServiceRequest/2b8e4f19-a075-4c63-9d81-5e06f3a2c748",
"resource": {
"resourceType": "ServiceRequest",
"identifier": [
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--exam-request",
"value": "40218",
"use": "usual"
}
],
"status": "completed",
"intent": "order",
"subject": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/paciente/",
"value": "507823709",
"use": "usual"
},
"reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4",
"type": "Patient"
},
"id": "2b8e4f19-a075-4c63-9d81-5e06f3a2c748",
"meta": {
"lastUpdated": "2026-04-16T18:22:41.330000Z",
"versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
},
"encounter": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/atendimento/",
"value": "55162",
"use": "usual"
},
"type": "Encounter"
},
"category": [
{
"coding": [
{
"code": "23",
"system": "https://fhir.ans.gov.br/CodeSystem/tuss-50"
}
]
}
],
"code": {
"coding": [
{
"code": "40304361",
"system": "https://fhir.ans.gov.br/CodeSystem/tuss-63"
}
]
},
"orderDetail": [
{
"coding": [
{
"code": "E11",
"system": "http://hl7.org/fhir/sid/icd-10"
}
]
}
],
"basedOn": [
{
"identifier": {
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--prescription",
"value": "31002",
"use": "usual"
},
"type": "ServiceRequest"
}
],
"requester": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/profissional/",
"value": "5032932",
"use": "usual"
},
"type": "Practitioner",
"reference": "Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19"
}
},
"search": {
"mode": "match"
}
}
],
"link": []
}

Encaminhamento

É o encaminhamento do paciente para outra especialidade, registrado num atendimento.

CampoSempre presenteO que significaNo Nilo Care
identifiersimIdentificador Nilo do encaminhamento—
statussimSituação da receita — com outro mapa, veja abaixo—
intentsimConstante order—
authoredOnsimData do encaminhamento—
subjectsimO paciente—
requestersimO profissional responsável—
encountersimO atendimento da receita—
performerTypenãoA especialidade de destino, num código CBO— (não é exibida)
reasonCode[]nãoO motivo em texto e o CIDo motivo, sem rótulo; CID
note[]nãoA conduta e a história clínicaHistórico clínico
locationReference[0]simO local de atendimento da receita—

O status do encaminhamento usa um mapa diferente do pedido de exame, sobre a mesma situação de receita:

Situação da receitaPedido de exameEncaminhamento
Pendentedrafton-hold
Em emissãodraftdraft
Falhouentered-in-errorentered-in-error
Emitidacompletedactive

Um encaminhamento emitido é active; um pedido de exame emitido é completed. Não trate os dois vocabulários como um só.

Não leia note[] nem reasonCode[] por posição. Nos dois, a ordem é fixa mas os itens são opcionais e só entram se estiverem preenchidos:

  • note[] — conduta primeiro, história clínica depois. Num encaminhamento sem conduta, a história clínica é note[0];
  • reasonCode[] — motivo em texto primeiro, CID depois. Sem motivo, o CID é reasonCode[0].

Não há campo que distinga um do outro dentro de note[]. No reasonCode[] dá para separar: o CID é o item que traz coding.

performerType vem da tradução da especialidade da plataforma para um código CBO, e essa tradução pode não existir: uma especialidade sem correspondência CBO faz o campo não vir, sem erro.

Response
{
"resourceType": "Bundle",
"type": "searchset",
"entry": [
{
"fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/ServiceRequest/7c19d503-6b28-4a71-8fe4-90b2a5c31d6f",
"resource": {
"resourceType": "ServiceRequest",
"identifier": [
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--patient-referral",
"value": "9014",
"use": "usual"
}
],
"status": "active",
"intent": "order",
"subject": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/paciente/",
"value": "507823709",
"use": "usual"
},
"reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4",
"type": "Patient"
},
"id": "7c19d503-6b28-4a71-8fe4-90b2a5c31d6f",
"meta": {
"lastUpdated": "2026-04-16T18:25:03.712000Z",
"versionId": "MTc4NjAyMTQ1MjkwNTAwMDM5Mg"
},
"note": [
{
"text": "Ajustar esquema terapêutico e reavaliar em 30 dias."
},
{
"text": "Paciente em uso de metformina há dois anos."
}
],
"requester": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/profissional/",
"value": "5032932",
"use": "usual"
},
"type": "Practitioner",
"reference": "Practitioner/1f30c8b7-45ad-4e62-9c81-73b0e5f24a19"
},
"authoredOn": "2026-04-16T00:00:00+00:00",
"reasonCode": [
{
"text": "Descompensação glicêmica persistente"
},
{
"coding": [
{
"code": "E11",
"display": "Diabetes mellitus tipo 2",
"system": "http://hl7.org/fhir/sid/icd-10"
}
],
"text": "Diabetes mellitus tipo 2"
}
],
"performerType": {
"coding": [
{
"code": "225125",
"system": "http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO"
}
],
"text": "Médico endocrinologista e metabologista"
}
},
"search": {
"mode": "match"
}
}
],
"link": []
}

Conduta

É a conduta de um atendimento cujo desfecho foi sugestão terapêutica. É o único dos três que você pode gravar.

CampoObrigatório na escritaO que significaNo Nilo Care
resourceTypesimConstante ServiceRequest—
identifiersimSuas chaves da conduta—
intentsimTem de ser proposal—
statussimExigido pelo FHIR e descartado. A leitura devolve sempre completed—
subject.identifiersimO paciente, pela sua chave ou pelo identificador Nilo dele—
note[]simO conteúdo da conduta: cada item é uma linhaCondutas e orientações
encounternãoO atendimento onde pendurar a condutaAtendimento
POST
/fhir/resources/ServiceRequest
curl -X POST https://landing-zone-api.nilo.services/fhir/resources/ServiceRequest \
-H "x-api-key: <apiKey>" \
-H "Content-Type: application/json" \
-d '{
"resourceType": "ServiceRequest",
"identifier": [
{
"system": "https://www.acmesaude.com.br/integracao/conduta/",
"value": "C-9001",
"use": "usual"
}
],
"status": "completed",
"intent": "proposal",
"subject": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/paciente/",
"value": "507823709",
"use": "usual"
},
"type": "Patient"
},
"note": [
{
"text": "Retorno em 15 dias."
},
{
"text": "Oriento sinais de alarme."
}
],
"encounter": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/atendimento/",
"value": "55162",
"use": "usual"
},
"type": "Encounter"
}
}'

A resposta é o recurso gravado, sem envelope:

Response
{
"resourceType": "ServiceRequest",
"identifier": [
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--conduct-v2",
"value": "77410",
"use": "usual"
},
{
"system": "https://www.acmesaude.com.br/integracao/conduta/",
"value": "C-9001",
"use": "usual"
}
],
"status": "completed",
"intent": "proposal",
"subject": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/paciente/",
"value": "507823709",
"use": "usual"
},
"reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4",
"type": "Patient"
},
"id": "e5028a71-3c94-4d16-b0a7-62d3f9814c05",
"meta": {
"lastUpdated": "2026-04-17T09:41:20.118000Z",
"versionId": "MTc4NjAyMTQ1MjkwNTAwMDM5NQ"
},
"note": [
{
"text": "Retorno em 15 dias."
},
{
"text": "Oriento sinais de alarme."
}
],
"encounter": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/atendimento/",
"value": "55162",
"use": "usual"
},
"type": "Encounter"
}
}

Uma conduta sem encounter cria um atendimento. A plataforma precisa de um atendimento onde pendurar a conduta e, não recebendo um, cria um atendimento já finalizado no prontuário do paciente — visível para a equipe como qualquer outro.

Se você tem o atendimento, mande-o — é o caminho recomendado.

POST
/fhir/resources/ServiceRequest
curl -X POST https://landing-zone-api.nilo.services/fhir/resources/ServiceRequest \
-H "x-api-key: <apiKey>" \
-H "Content-Type: application/json" \
-d '{
"resourceType": "ServiceRequest",
"identifier": [
{
"system": "https://www.acmesaude.com.br/integracao/conduta/",
"value": "C-9002",
"use": "usual"
}
],
"status": "completed",
"intent": "proposal",
"subject": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/paciente/",
"value": "507823709",
"use": "usual"
},
"type": "Patient"
},
"note": [
{
"text": "Manter dieta e retornar em 30 dias."
}
]
}'

Uma conduta sem note falha — e falha depois de o atendimento ter sido criado. A recusa vem sem classificação de campo, e o atendimento vazio fica no prontuário. Confira que note está preenchido antes de enviar.

O mesmo POST cria e atualiza: reenviando um identifier que já corresponde a uma conduta, o texto dela é reescrito.

O atendimento de uma conduta não muda depois da criação. Numa atualização, o encounter do payload é ignorado e a conduta continua no atendimento onde já estava. Para movê-la, não há caminho por esta API.

Na leitura, a conduta vem com um note por linha; na escrita, os itens que você manda são juntados numa nota só do lado da plataforma. Enviar duas notas e reler devolve duas notas — mas uma nota que contenha uma quebra de linha volta partida em duas.

O encounter que você mandou é preservado no recurso e volta nas leituras seguintes. Uma conduta registrada dentro da plataforma, essa sim, vem sem encounter.

O mesmo vale para qualquer campo que você envie e que a plataforma não produza — code, category, priority, reasonCode. Eles ficam guardados no recurso e voltam nas leituras seguintes, sem nunca terem significado nada para a plataforma. A referência não os declara, mas a API não os recusa. Omita-os.

Response
{
"resourceType": "Bundle",
"type": "searchset",
"entry": [
{
"fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/ServiceRequest/e5028a71-3c94-4d16-b0a7-62d3f9814c05",
"resource": {
"resourceType": "ServiceRequest",
"identifier": [
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/care-api--conduct-v2",
"value": "77410",
"use": "usual"
},
{
"system": "https://www.acmesaude.com.br/integracao/conduta/",
"value": "C-9001",
"use": "usual"
}
],
"status": "completed",
"intent": "proposal",
"subject": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/paciente/",
"value": "507823709",
"use": "usual"
},
"reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4",
"type": "Patient"
},
"id": "e5028a71-3c94-4d16-b0a7-62d3f9814c05",
"meta": {
"lastUpdated": "2026-04-17T09:41:20.118000Z",
"versionId": "MTc4NjAyMTQ1MjkwNTAwMDM5NQ"
},
"note": [
{
"text": "Retorno em 15 dias."
},
{
"text": "Oriento sinais de alarme."
}
]
},
"search": {
"mode": "match"
}
}
],
"link": []
}

Pendurar a conduta num atendimento existente pode mudar o recurso que a lê. O tipo de recurso em que a conduta aparece é decidido pelo desfecho do atendimento, não pelo endpoint que você usou: num atendimento de resultado de exame ela vira Procedimento, e num de hipótese diagnóstica vira Condição.

A resposta do seu POST sempre volta como ServiceRequest, mas a próxima sincronização pode reescrevê-la como outro recurso — e aí ela some da busca de ServiceRequest. Só quando a API cria o atendimento é que o desfecho fica garantido como sugestão terapêutica.

A mesma conduta em outros recursos

A conduta que você grava aqui também aparece em action[] da Conduta do atendimento, com o texto inteiro em vez de quebrado por linha — mas não na hora: aquele recurso só é regravado quando o atendimento em si sincroniza.

E é a mesma família de registro que a Condição grava com verificationStatus: provisional. Quando a API cria o atendimento, o que muda entre os dois caminhos é o desfecho que ela dá a ele; quando você informa um encounter, o desfecho é o do atendimento que já existe, e a diferença é só o tipo de recurso que guarda a sua chave.

Não grave a mesma conduta pelos dois caminhos. POST /fhir/resources/Condition com verificationStatus: provisional e POST /fhir/resources/ServiceRequest com intent: proposal gravam registros diferentes, cada um com o seu identificador. Escolha um.

Buscar

GET
/fhir/resources/ServiceRequest
curl -G https://landing-zone-api.nilo.services/fhir/resources/ServiceRequest \
-H "x-api-key: <apiKey>" \
-d _count=50 \
-d _lastUpdated=eq2013-01-14 \
--data-urlencode based-on:identifier=https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--prescription|31002 \
--data-urlencode encounter:identifier=https://www.acmesaude.com.br/integracao/atendimento/|55162 \
--data-urlencode identifier=https://www.acmesaude.com.br/integracao/conduta/|C-9001 \
-d intent=proposal \
--data-urlencode patient=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
--data-urlencode patient:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709 \
--data-urlencode requester:identifier=https://www.acmesaude.com.br/integracao/profissional/|5032932 \
-d status=completed \
--data-urlencode subject=Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4 \
--data-urlencode subject:identifier=https://www.acmesaude.com.br/integracao/paciente/|507823709

A resposta é sempre um Bundle do tipo searchset, e a busca mistura as três origens. Filtre por intent para separar a conduta, e pelo system do identificador para separar pedido de exame de encaminhamento.

Busca sem resultados não é erro: volta 200 com um Bundle cujo entry é uma lista vazia.

Response
{
"resourceType": "Bundle",
"type": "searchset",
"entry": [],
"link": []
}

Parâmetros de busca suportados

NomeTipoDescriçãoExpressão
identifiertokenIdentificador da solicitação, em system|valueServiceRequest.identifier
patient:identifier · subject:identifierreferencePaciente, pelo identificador deleServiceRequest.subject.identifier
patient · subjectreferencePaciente, pelo id Nilo FHIR deleServiceRequest.subject
intenttokenorder ou proposalServiceRequest.intent
statustokenSituação, com o vocabulário da origemServiceRequest.status
requester:identifierreferenceProfissional, pelo identificador deleServiceRequest.requester.identifier
encounter:identifierreferenceAtendimento, pelo identificador deleServiceRequest.encounter.identifier
based-on:identifierreferenceReceita de origem do pedido de exame, pelo identificador delaServiceRequest.basedOn.identifier
_lastUpdateddateData da última gravação no store, com os prefixos eq, ge, le—

No pedido de exame, encounter e based-on só encontram com o modificador :identifier — as duas referências saem sem o campo reference, e é nele que a forma sem modificador procura.

O subject, esse, vem completo nas três origens: patient e patient:identifier funcionam igualmente.

Os demais parâmetros canônicos do ServiceRequest existem e não encontram nada, porque a plataforma não preenche o campo correspondente: authored (exceto no encaminhamento), body-site, instantiates-canonical, occurrence, performer, priority, replaces, requisition e specimen.

code e category são preenchidos no pedido de exame, mas com coding — então funcionam com o par system|code, não com o nome do exame.

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/ServiceRequest/:id
curl https://landing-zone-api.nilo.services/fhir/resources/ServiceRequest/id \
-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 solicitação está em resource.

Response
{
"fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/ServiceRequest/2b8e4f19-a075-4c63-9d81-5e06f3a2c748",
"resource": {
"resourceType": "ServiceRequest",
"identifier": [
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/hippocrates-api--exam-request",
"value": "40218",
"use": "usual"
}
],
"status": "completed",
"intent": "order",
"subject": {
"identifier": {
"system": "https://www.acmesaude.com.br/integracao/paciente/",
"value": "507823709",
"use": "usual"
},
"reference": "Patient/ba200cfa-dae0-46cf-81a0-008e3f7414b4",
"type": "Patient"
},
"id": "2b8e4f19-a075-4c63-9d81-5e06f3a2c748",
"meta": {
"lastUpdated": "2026-04-16T18:22:41.330000Z",
"versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
},
"code": {
"coding": [
{
"code": "40304361",
"system": "https://fhir.ans.gov.br/CodeSystem/tuss-63"
}
]
}
},
"search": {
"mode": "match"
}
}

Erros

Recusa é 400, e o corpo é um OperationOutcome — exceto quando o intent não é proposal, caso em que a chamada falha com 500 e sem corpo tratável.

codeexpressionMensagemQuando
requiredServiceRequest.identifierField is requiredO payload não tem identifier
business-ruleServiceRequest.identifierUnable to use any of the provided identifiers to match an existing resource, which can lead to duplicates.Há identifier, mas nenhum utilizável
not-foundServiceRequest.subjectPatient does not existO subject.identifier não resolve para um paciente do seu ambiente — ou o subject veio sem identifier, que sai com a mesma mensagem
invalidServiceRequest.encounterEncounter's patient does not match the resource's patientO atendimento informado é de outro paciente
structure—Resource has identifier from a Nilo environment that is not the current environment.O payload traz um identificador Nilo gerado em outro ambiente
exception—TypeError: …A conduta veio sem note
Response
{
"issue": [
{
"code": "not-found",
"details": {
"text": "Patient does not exist"
},
"expression": [
"ServiceRequest.subject"
],
"severity": "error"
}
],
"resourceType": "OperationOutcome"
}

Um POST com intent diferente de proposal não devolve nenhum dos erros acima: a chamada falha com erro inesperado do servidor (500), sem OperationOutcome. Não escreva tratamento em cima desse comportamento — ele não é contrato, e nada é gravado.

Dentro de uma carga em lote o erro é limpo: a entrada é recusada com Resource ServiceRequest not supported.

O que a integração não cobre

  • escrever pedido de exame ou encaminhamento — só a conduta é gravável;
  • se o exame foi realizado, e o resultado dele;
  • a receita que agrupa os pedidos, como recurso próprio;
  • a distinção entre conduta e história clínica dentro de note[] do encaminhamento;
  • o autor e a data da conduta.

Para as condutas de um atendimento reunidas num recurso só, veja Conduta; para as condutas registradas como condição, Condição; para o procedimento em si, Procedimento.