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
1curl -G https://landing-zone-api.nilo.services/fhir/resources/Questionnaire \
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 "description=saúde mental" \
8 --data-urlencode identifier=https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/inquisition-api--questionnaire|2071 \
9 -d status=active \
10 -d title=Rastreio

A resposta é sempre um Bundle do tipo searchset:

Response
1{
2 "resourceType": "Bundle",
3 "type": "searchset",
4 "entry": [
5 {
6 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Questionnaire/1c8b34a7-6e02-4f95-a3d1-b7c5e0286f41",
7 "resource": {
8 "resourceType": "Questionnaire",
9 "identifier": [
10 {
11 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/inquisition-api--questionnaire",
12 "value": "2071",
13 "use": "usual"
14 }
15 ],
16 "name": "Rastreio de sintomas depressivos",
17 "title": "Rastreio de sintomas depressivos",
18 "status": "active",
19 "subjectType": [
20 "Questionnaire"
21 ],
22 "date": "2026-02-11T14:07:32+00:00",
23 "id": "1c8b34a7-6e02-4f95-a3d1-b7c5e0286f41",
24 "meta": {
25 "lastUpdated": "2026-02-11T14:07:33.201000Z",
26 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
27 },
28 "description": "Aplicado a cada três meses aos pacientes da linha de saúde mental.",
29 "lastReviewDate": "2026-02-11",
30 "approvalDate": "2025-11-04",
31 "item": [
32 {
33 "linkId": "80431",
34 "type": "choice",
35 "text": "Nas últimas duas semanas, com que frequência você se sentiu para baixo?",
36 "answerOption": [
37 {
38 "valueString": "Nenhuma vez"
39 },
40 {
41 "valueString": "Vários dias"
42 },
43 {
44 "valueString": "Mais da metade dos dias"
45 },
46 {
47 "valueString": "Quase todos os dias"
48 }
49 ]
50 },
51 {
52 "linkId": "80432",
53 "type": "text",
54 "text": "Você gostaria de comentar alguma coisa?"
55 }
56 ]
57 },
58 "search": {
59 "mode": "match"
60 }
61 }
62 ],
63 "link": []
64}

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

Response
1{
2 "fullUrl": "https://landing-zone-api.nilo.services/fhir/resources/Questionnaire/1c8b34a7-6e02-4f95-a3d1-b7c5e0286f41",
3 "resource": {
4 "resourceType": "Questionnaire",
5 "identifier": [
6 {
7 "system": "https://landing-zone-api.nilo.services/fhir/resources/NamingSystem/inquisition-api--questionnaire",
8 "value": "2071",
9 "use": "usual"
10 }
11 ],
12 "name": "Rastreio de sintomas depressivos",
13 "title": "Rastreio de sintomas depressivos",
14 "status": "active",
15 "subjectType": [
16 "Questionnaire"
17 ],
18 "date": "2026-02-11T14:07:32+00:00",
19 "id": "1c8b34a7-6e02-4f95-a3d1-b7c5e0286f41",
20 "meta": {
21 "lastUpdated": "2026-02-11T14:07:33.201000Z",
22 "versionId": "MTc4NjAyMTQ1MjkwNTAwMDM2Nw"
23 },
24 "lastReviewDate": "2026-02-11",
25 "approvalDate": "2025-11-04",
26 "item": [
27 {
28 "linkId": "80431",
29 "type": "choice",
30 "text": "Nas últimas duas semanas, com que frequência você se sentiu para baixo?",
31 "answerOption": [
32 {
33 "valueString": "Nenhuma vez"
34 },
35 {
36 "valueString": "Vários dias"
37 },
38 {
39 "valueString": "Mais da metade dos dias"
40 },
41 {
42 "valueString": "Quase todos os dias"
43 }
44 ]
45 }
46 ]
47 },
48 "search": {
49 "mode": "match"
50 }
51}

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.