Skip to navigation

Questionário

Um questionário é o formulário que a equipe monta no Nilo Care e aplica ao paciente: a lista de perguntas, o tipo de cada uma e as opções de resposta. É o molde; o que o paciente respondeu é o questionário respondido.

No FHIR o recurso é o Questionnaire, e ele existe aqui sobretudo para uma coisa: resolver a canônica que cada resposta carrega em questionnaire, e assim descobrir o enunciado de cada pergunta.

Este recurso é somente leitura. Não existe POST /fhir/resources/Questionnaire — os questionários são montados pela equipe no Nilo Care, e não há como criá-los ou alterá-los por esta API.

Campos

A coluna No Nilo Care traz o rótulo com que o dado aparece para a equipe; são rótulos, não caminhos de navegação. Todos os campos são de resposta — nenhum deles é enviado por você.

CampoSempre presenteO que significaNo Nilo Care
resourceTypesimConstante Questionnaire—
identifiersimIdentificador Nilo do questionário, no system …/NamingSystem/inquisition-api--questionnaire—
statussimdraft, active, retired ou unknowna situação do questionário
namesimNome do questionárioNome, na lista; Nome do questionário, no construtor
titlesimRepete o nameidem
descriptionnãoDescrição do questionárioDescrição
datesimData e hora da última alteraçãoData atualização
lastReviewDatesimA mesma data da última alteração, sem a horaData atualização
approvalDatenãoData em que o questionário foi publicado, sem a horaData publicação
subjectTypesimConstante — e errada; veja o aviso—
item[]nãoUma entrada por perguntaas perguntas do formulário
id · metasimIdentificador Nilo FHIR do recurso e metadados da gravação—

name e title trazem o mesmo texto. O FHIR distingue nome técnico de título de exibição; a plataforma tem só um nome, e ele é copiado para os dois campos.

date e lastReviewDate vêm da mesma data — a da última alteração do questionário —, mas não no mesmo formato: o FHIR tipa lastReviewDate como data pura, então a hora se perde ali e fica só em date. approvalDate também é data pura. Não há revisão registrada à parte.

subjectType vem com o valor Questionnaire, e isso não faz sentido. No FHIR o campo diz a que tipo de recurso o questionário se aplica — o valor correto seria Patient. Ignore este campo: ele não carrega informação e não deve ser usado para nada.

status

ValorSituação na plataforma
draftRascunho, ainda não publicado
activePublicado e disponível para aplicação
retiredDespublicado, ou substituído por uma versão mais nova
unknownValor de reserva do FHIR — na prática não ocorre

Na tela, os quatro estados aparecem como Rascunho, Publicado, Não publicado e Desatualizado — ou, numa implantação que ainda usa a lista antiga, Rascunho, Ativo, Inativo e Desatualizado.

retired junta duas coisas diferentes — o questionário que a equipe tirou do ar (Não publicado) e o que foi substituído por uma versão mais nova (Desatualizado). Não há campo que distinga um do outro, nem que aponte para a versão que substituiu.

As perguntas

Cada pergunta do questionário vira um item de item[], com três campos — o linkId, o enunciado em text e o tipo em type — mais as opções, nas perguntas de escolha.

linkId é a chave para casar pergunta e resposta. É o mesmo valor que aparece em item[].linkId do questionário respondido. Lendo os dois recursos, é por ele que você liga o enunciado à resposta do paciente.

Tipos de pergunta

typeTipo na plataforma
choiceEscolha única, escolha múltipla e sim/não
stringTexto curto
textTexto longo

choice não distingue escolha única de escolha múltipla. Os dois tipos saem iguais, e não há campo que diga quantas opções o paciente podia marcar. Se isso importa para a sua integração, o dado não está nesta API.

Seis outros tipos de pergunta caem todos em text. Escala, data, numérica, e-mail, telefone e os blocos de texto informativo — que nem aceitam resposta — saem todos com type: text, indistinguíveis de uma pergunta de texto longo.

A pergunta de escala é o caso mais confuso: ela tem opções, e elas vêm em answerOption. Ou seja, um type: text com answerOption é sinal de que o tipo original se perdeu; um sem opções pode ser texto longo ou qualquer um dos demais.

As opções de resposta

Nas perguntas de escolha, cada opção vira um item de answerOption, com o rótulo em valueString.

Opções de campo aberto não entram na lista. Uma pergunta com a opção Outro (especifique) aparece aqui sem ela: o answerOption traz só as opções fechadas, e o total de opções que você lê é menor do que o que o paciente viu.

É o outro lado de um comportamento do questionário respondido: quando o paciente escolhe uma opção aberta e digita algo, a resposta traz o texto digitado, e não um rótulo que exista aqui. Não trate a resposta como um valor que tem de estar em answerOption.

answerOption traz só o rótulo. A pontuação de cada opção, que a plataforma usa para calcular o resultado do questionário, não é exposta — nem aqui nem no questionário respondido.

O que item[] não representa

A lista de perguntas é plana: as seções do formulário não existem no recurso, e perguntas de seções diferentes vêm num nível só. Não há como reconstruir onde uma seção termina e a outra começa.

A ordem, essa sim, é a da tela: as perguntas vêm na ordem das seções e, dentro de cada seção, na ordem em que foram montadas. É por isso que dá para ordenar as respostas de um paciente por aqui — veja Questionário respondido.

Num questionário que veio de uma sincronização externa e já foi ressincronizado, item[] pode trazer perguntas de versões anteriores junto com as atuais — enunciados repetidos, com linkId diferentes. Case sempre pelo linkId que veio na resposta do paciente, e não conte os itens para saber o tamanho do formulário.

Também não têm campo aqui: se a pergunta é obrigatória, a descrição dela, a pontuação das opções e a escala de resultado do questionário.

Buscar

GET
/fhir/resources/Questionnaire
curl -G https://landing-zone-api.nilo.services/fhir/resources/Questionnaire \
-H "x-api-key: <apiKey>" \
-d _count=50 \
-d _lastUpdated=eq2013-01-14 \
-d date=ge2026-01-01 \
--data-urlencode "description=saúde mental" \
--data-urlencode identifier=https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/inquisition-api--questionnaire|2071 \
-d status=active \
-d title=Rastreio

A resposta é sempre um Bundle do tipo searchset:

Response
{
"resourceType": "Bundle",
"type": "searchset",
"entry": [
{
"fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Questionnaire/1c8b34a7-6e02-4f95-a3d1-b7c5e0286f41",
"resource": {
"resourceType": "Questionnaire",
"identifier": [
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/inquisition-api--questionnaire",
"value": "2071",
"use": "usual"
}
],
"name": "Rastreio de sintomas depressivos",
"title": "Rastreio de sintomas depressivos",
"status": "active",
"subjectType": [
"Questionnaire"
],
"date": "2026-02-11T14:07:32+00:00",
"id": "1c8b34a7-6e02-4f95-a3d1-b7c5e0286f41",
"meta": {
"lastUpdated": "2026-02-11T14:07:33.201000Z",
"versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
},
"description": "Aplicado a cada três meses aos pacientes da linha de saúde mental.",
"lastReviewDate": "2026-02-11",
"approvalDate": "2025-11-04",
"item": [
{
"linkId": "80431",
"type": "choice",
"text": "Nas últimas duas semanas, com que frequência você se sentiu para baixo?",
"answerOption": [
{
"valueString": "Nenhuma vez"
},
{
"valueString": "Vários dias"
},
{
"valueString": "Mais da metade dos dias"
},
{
"valueString": "Quase todos os dias"
}
]
},
{
"linkId": "80432",
"type": "text",
"text": "Você gostaria de comentar alguma coisa?"
}
]
},
"search": {
"mode": "match"
}
}
],
"link": []
}

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
{
"resourceType": "Bundle",
"type": "searchset",
"entry": [],
"link": []
}

Parâmetros de busca suportados

NomeTipoDescriçãoExpressão
identifiertokenIdentificador do questionário, em system|valueQuestionnaire.identifier
statustokendraft, active, retired ou unknownQuestionnaire.status
titlestringNome do questionário, casando pelo inícioQuestionnaire.title
descriptionstringDescrição do questionárioQuestionnaire.description
datedateData da última alteração, com os prefixos eq, ge, leQuestionnaire.date
_lastUpdateddateData da última gravação no store, com os prefixos eq, ge, le—

name também é um parâmetro canônico do Questionnaire, e aqui ele encontra o mesmo que title — os dois campos trazem o mesmo texto.

Os demais parâmetros canônicos existem e não encontram nada, porque a plataforma não preenche o campo correspondente: version, url, publisher, context, jurisdiction, code, definition e effective. Repare em url: este recurso não tem url canônica — a canônica que a resposta do paciente carrega é montada a partir do id.

subject-type é a exceção: ele encontra, e encontra errado. Como o campo é sempre a constante Questionnaire, subject-type=Questionnaire devolve tudo e subject-type=Patient não devolve nada. Não é filtro útil.

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

Há um segundo caminho para chegar a um questionário: a Tarefa. O item questionnaire de output[] traz o identificador do questionário, não a canônica — então o caminho é buscar por identifier=…|{valor}, e não ler por id.

Ler por ID

É este o caminho que a canônica do questionário respondido aponta. Use a URL que veio no campo questionnaire da resposta, tal como ela veio.

GET
/fhir/resources/Questionnaire/:id
curl https://landing-zone-api.nilo.services/fhir/resources/Questionnaire/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 o questionário está em resource. Ler item na raiz da resposta não encontra nada.

Response
{
"fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Questionnaire/1c8b34a7-6e02-4f95-a3d1-b7c5e0286f41",
"resource": {
"resourceType": "Questionnaire",
"identifier": [
{
"system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/inquisition-api--questionnaire",
"value": "2071",
"use": "usual"
}
],
"name": "Rastreio de sintomas depressivos",
"title": "Rastreio de sintomas depressivos",
"status": "active",
"subjectType": [
"Questionnaire"
],
"date": "2026-02-11T14:07:32+00:00",
"id": "1c8b34a7-6e02-4f95-a3d1-b7c5e0286f41",
"meta": {
"lastUpdated": "2026-02-11T14:07:33.201000Z",
"versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
},
"lastReviewDate": "2026-02-11",
"approvalDate": "2025-11-04",
"item": [
{
"linkId": "80431",
"type": "choice",
"text": "Nas últimas duas semanas, com que frequência você se sentiu para baixo?",
"answerOption": [
{
"valueString": "Nenhuma vez"
},
{
"valueString": "Vários dias"
},
{
"valueString": "Mais da metade dos dias"
},
{
"valueString": "Quase todos os dias"
}
]
}
]
},
"search": {
"mode": "match"
}
}

A canônica não é versionada. O que você lê por aqui é o questionário como ele está hoje — perguntas podem ter sido reescritas, acrescentadas ou removidas depois de o paciente responder.

Casando linkId entre o questionário e uma resposta antiga, pode não haver correspondência: uma pergunta removida some daqui e continua na resposta. Trate a ausência como “pergunta que não existe mais”, não como erro.

Cadastrar ou atualizar

Não existe. Este recurso não tem caminho de escrita nesta API — nem para criar, nem para atualizar, nem para apagar.

Um POST /fhir/resources/Questionnaire não é uma operação suportada e não devolve um erro de validação tratável: a chamada falha com erro inesperado do servidor (500). Não escreva tratamento em cima desse comportamento — ele não é contrato, e nada é gravado de qualquer forma.

Dentro de uma carga em lote o erro é limpo, e igualmente definitivo: a entrada é recusada com Resource Questionnaire not supported.

O que a integração não cobre

Além da escrita, vários dados que a plataforma guarda não têm campo aqui:

  • as seções do formulário (a ordem das perguntas, essa, é preservada);
  • se a pergunta é obrigatória, e a descrição dela;
  • a pontuação de cada opção e a escala de resultado do questionário;
  • as opções de campo aberto;
  • a distinção entre escolha única e escolha múltipla, e os seis tipos de pergunta que caem em text;
  • a versão do questionário — não há histórico de versões deste recurso, e a canônica aponta sempre para o estado atual.

Para o que o paciente respondeu, veja Questionário respondido; para o questionário atribuído a um paciente como tarefa, Tarefa.