Pular para conteúdo

Estrutura base do questionário (Form)

{
  "advise_surplus": <sempre true, pode ser ignorado>,
  "applied_by_ai": <true se for aplicado por AI, false caso contrario>,
  "archieved": <true se o questionario tiver sido arquivado, false caso contrario>,
  "cati_opening_text": "<texto de abertura do cati",
  "class_name": "<sempre Form, fixo>",
  "conditional_selections": [<array que indica as selecoes condicionais do questionario. para remover uma selecao condicional basta remover o objeto correspondente deste array. cada objeto tem a estrutura abaixo>
    {
      "form": <id do questionario, nao precisa ser especificada para novas selecoes condicionais>,
      "reference_question": <id da questao de referencia para a selecao condicional. este id deve OBRIGATORIAMENTE estar presente no json do questionario>,
      "target_question": <id da questao alvo da selecao condicional. este id deve OBRIGATORIAMENTE estar presente no json do questionario>,
      "selection_type": <SELECTED: traz as opcoes `selecionadas` da questao de referencia, NOT_SELECTED: traz as opcoes `nao selecionadas` da questao de referencia>,
    }
  ],
  "created": "<data de criacao no format ISO 8601, nunca deve ser editada, apenas preservada>",
  "date_end": "<data fim do questionario no format YYYY-MM-DD>",
  "deleted": <true se o questionario tiver sido deletado, false caso contrario>,
  "deleted_date": "<data de exclusao do questionario no formato YYYY-MM-DD>",
  "google_spreadsheet_id": <sempre null, nao esta sendo usado atualmente, pode ser ignorado>,
  "guardrail_only": <true se o questionario for aplicado via URL de campanha>,
  "harvest_changed": <sempre true, pode ser ignorado>,
  "harvest_webhook_url": "endereco da url de webhook para envio de dados de coletas, pode ser null se nao estiver configurada",
  "id": <id do questionario>,
  "name": "<nome do questionario>",
  "questions": [<array de questoes do questionario, descrito abaixo>],
  "url_online_target": <url de redirecionamento online, pode ser null se nao estiver configurada>,
  "url_variables": [<variaveis de url do questionario, descrito abaixo>],
  "user": <id do usuario dono do questionario>,
  "dkda_value": <string, valor para a opcao de "Nao sei / Nao respondi" (NSNR) para todo o questionario, caso exista. Se nao existir esta opcao para nenhuma questao do questionario, este campo pode ser null. valor padrao: NSNR>
}

Estrutura base de questao

Use esta base como referencia e preserve campos desconhecidos quando existirem no payload original.

{
  "class_name": "<tipo da questao: ChoiceQuestion: questao de escolha unica, MultipleChoiceQuestion: questao de escolha multipla, OpenQuestion: questao aberta, MatrixQuestion: questao matriz, ScaleQuestion: questao escala>",
  "created": "<data de criacao no format ISO 8601, nunca deve ser editada, apenas preservada>",
  "default_value": <sempre null>,
  "deleted": <true se a questao tiver sido deletada, false caso contrario>,
  "deleted_date": <data de exclusao da questao no formato YYYY-MM-DD>,
  "hidden": <true se a questao for oculta, false caso contrario>,
  "id": <id da questao. NUNCA envie um id quando estiver criando uma nova questao>,
  "key": "<chave da questao tambem chamada de variavel da questao>",
  "matrix_question_id": <id da questao matriz se for uma questao filha de matriz, null caso contrario>,
  "name": "<nome da questao>",
  "option_dkda": <true se a questao tiver opcao de "Nao sei / Nao respondi" (tambem chamada de `NSNR`), false caso contrario. somente aplicado em questoes de escolha unica>,
  "options": [<array de opcoes da questao, descrito abaixo>],
  "options_shuffle": <true se as opcoes devem ser embaralhadas, false caso contrario>,
  "options_validate_source_lookup": "<iexact, fixo>",
  "options_validate_value": <null, fixo>,
  "ordering": <posicao da questao no questionario, comecando em 0 para a primeira questao, logo a questao 1 eh 0, questao 2 eh 1, etc. esta ordem é a ordem oficial, não a posição que a questão aparece no array de questões>,
  "parent": <id do questionario>,
  "question_options_source": <null,fixo>,
  "question_title_source": <null,fixo>,
  "question_validate_source": <null,fixo>,
  "question_validate_source_lookup": "<iexact, fixo>",
  "readonly": <true se a questao for somente leitura, false caso contrario>,
  "required": <true se a questao for obrigatoria, false caso contrario>,
  "rules": [<regras de pulo e restricoes, descrito abaixo>],
  "show_as": "<modo de exibicao no caso de perguntas de escolha unica e escolha unica. radiobutton para questao de escolha unica e checkbox para questao de escolha multipla. null para questoes abertas>",
  "styles": {
    "bold_title": false,
    "color_title": "#000000",
    "italic_tile": false,
    "underline_title": false
  },
  "updated": "<data de atualizacao no format ISO 8601, deve ser atualizada para o momento da alteracao>",
  "start": <numero inteiro maior ou igual a 1, usado somente na questao escala>,
  "end": <numero inteiro maior ou igual a start, no maixmo 10, usado somente na questao escala>,
  "icon": "<string representando o nome do icone para questoes escala, OBRIGATORIO, valor default `Star`. valores possiveis: Star (estrela), CheckBoxOutlineBlank (quadrado), Favorite (estrela), ThumbUpAlt (joinha)>",
  "exist_subtitles": <true se a questao escala tiver subtitulos, false caso contrario. usado somente na questao escala>,
  "color": "<string representando a cor do icone para questoes escala, usado somente na questao escala, OBRIGATORIO, valor default #000000>",
  "subtitles": [ <array com os subtitulos da questao escala, usado somente na questao escala>
    {
      "subtitle": "<texto do subtitulo>",
      "order": <numero inteiro indicando a ordem do subtitulo, pode ser 0 (para o inicio da escala), 1 (para o meio da escala) ou 2 (para o final da escala)>
    }
  ],

  "choices_min": <numero inteiro maior ou igual a 1, usado somente em questoes de escolha multipla para indicar o numero minimo de escolhas que o respondente deve selecionar. pode ser null caso nao queira definir um numero minimo de escolhas>,
  "choices_max": <numero inteiro maior ou igual a choices_min, usado somente em questoes de escolha multipla para indicar o numero maximo de escolhas que o respondente pode selecionar. pode ser null caso nao queira definir um numero maximo de escolhas>,
  "widget_ordered_selection": <true se a questao de escolha multipla deve exibir as opcoes em um widget de selecao ordenada, com prioridade de selecao, false para exibir as opcoes normalmente. usado somente em questoes de escolha multipla>,
  "options_shuffle": <true se as opcoes da questao devem ser embaralhadas a cada exibicao do questionario, false para exibir as opcoes sempre na mesma ordem. usado somente em questoes de escolha unica e escolha multipla>,
  "option_none": <true se a questao deve ter uma opcao de exclusao (ex: "Nenhuma das anteriores", "Prefiro nao responder", etc), false caso contrario. usado somente em questoes de escolha multipla>,
  "option_none_label": "<string, o que sera exibido para o usuario para a opcao de exclusao caso o campo option_none seja true. se nao for informado, o valor padrao sera 'Nenhuma das anteriores'. este valor nao pode ser null>",
  "option_none_value": "<string, valor para a opcao de exclusao caso o campo option_none seja true. se nao for informado, o valor padrao sera 'NSNR'>",
  "conditioned_selection_type": "<string, usado para questoes matriz. indica que opcoes de uma questao escolha unica ou escolha multipla trazer como perguntas da matriz. SELECTED: traz as opcoes selecionadas, NOT_SELECTED: traz as opcoes nao selecionadas. pode ser null caso a questao matriz nao seja do tipo de selecao condicionada. para remover a selecao conditional da matriz basta enviar este campo como null. somente aplicado em questoes matriz>",
  "conditioned_target_question": "<id da questao alvo da selecao condicionada para questoes matriz. este id deve OBRIGATORIAMENTE estar presente no json do questionario. se `conditioned_selection_type` for null, este campo devera ser null. somente aplicado em questoes matriz>"
}

Regras:

Questoes novas

  • name eh obrigatorio, nao pode ser null nem vazio
  • key eh obrigatoria. se nao for informada ela sera preenchida automaticamente com o nome da questao, convertida para minusculo e com espacos substituidos por underline. ex: "Qual sua idade?" -> key: "qual_sua_idade". Remova os caracteres especiais do nome da questao ao gerar a key, deixando apenas letras, numeros e underline. ex: "Qual sua idade (anos)?" -> key: "qual_sua_idade_anos".
  • required por padrao eh true
  • uma questao aberta sempre deve ter pelo menos uma opcao chamada resposta, caso o usuario nao tenha informado nenhuma opcao para ela.
  • questoes de escolha unica e escolha multipla nao precisam enviar este campo caso nenhuma opcao tenha sido informada ainda

Questoes existentes

  • quando gerar o JSON para atualizar uma questao preserve todos os campos do JSON original da questao, mesmo os campos desconhecidos, e apenas atualize os campos que precisam ser alterados.

Regras para questoes escolha unica

  • por padrao o campo show_as deve ser radiobutton

Regras para questoes de escolha multipla

  • por padrao o campo show_as deve ser checkbox

Regras para questoes matriz

  • Uma questao matriz agrupa diferentes questoes de escolha unica sob as mesmas opcoes.
  • As opcoes sao definidas na questao matriz
  • As questoes filhas de uma matriz devem ter o campo matrix_question_id preenchido com o id da questao matriz a qual pertencem, e nao devem conter opcoes, pois as opcoes sao herdadas da questao matriz.
  • Sempre que criar uma questao matriz, primeiro crie a questao matriz em si (com o class_name = "MatrixQuestion") e depois crie as questoes filhas (com class_name = "ChoiceQuestion" e matrix_question_id preenchido com o id da questao matriz criada). Nunca crie as questoes filhas de uma questao matriz antes de criar a questao matriz, pois eh necessario saber o id da matriz para criar as filhas.
  • As questoes filhas de matriz tambem possuem o campo ordering que identifica sua ordem dentro da matriz em si, nao no questionario como um todo. Comeca em 0 para a primeira questao filha da matriz, 1 para a segunda. A questao matriz em si possui o campo ordering que identifica sua ordem dentro do questionario como um todo.

Estrutura de opcao

{
  "class_name": "<Option para opcoes fechadas de questoes escolha unica e questoes de escolha multipla, OtherOption para opcoes abertas de questoes de escolha unica e questoes de escolha multipla, OpenOption para opcoes de questoes abertas>",
  "created": "<data de criacao no format ISO 8601, nunca deve ser editada, apenas preservada>",
  "id": <id da opcao>,
  "name": "<nome da opcao>",
  "ordering": <posicao da opcao dentro da questao, comecando em 0 para a primeira opcao. esta ordem é a ordem oficial, não a posição que a opção aparece no array de opções>,
  "question": <id da questao>,
  "updated": "<data de atualizacao no format ISO 8601, deve ser atualizada para o momento da alteracao>",
  "value": "<SOMENTE para opcoes com class_name = Option. Numero inteiro maior ou igual a 1, unico dentro da questao. NAO existe em OtherOption nem em InputOption, veja a secao 'Quais opcoes tem value' abaixo>",
  "mask": "<text para texto normal (mask_custom = '', regex = '.*'), date para mascara de data (mask_custom = 99/99/9999, regex = '([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})'), time para hora (mask_custom = 99:99, regex = '([0-1][0-9]|[2][0-3])\\:([0-5][0-9])'), email (mask_custom = '', regex = '[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+')>, number para mascara numerica (mask_custom = '', regex = '(\\d+)'), decimal para valores decimais (mask_custom = '', regex = '^(\\d+)(\\.|\\,)(\\d+)$' sempre)> custom para mascara customizada (mask_custom representa a mascara e deve ser informado pelo usuario, regex = '.*'). valor padrao 'text'",
  "max_length": "<numero maximo de caracteres para opcoes de questoes abertas, null para opcoes de questoes de escolha unica e escolha multipla>",
  "prevent_paste": <true se deve prevenir colar texto para opcoes de questoes abertas, false para permitir, null para opcoes de questoes de escolha unica e escolha multipla>,
  "widget": "<usado em opcoes abertas de perguntas fechadas e pergunas abertas. single para linha unica, multiple para multiplas linhas, null para opcoes que nao sejam abertas. sempre envie single caso nao seja especificado>",
  "value_force_case": "none, para nao definido, upper para forcar maiusculo, lower para forcar minusculo, null para opcoes de questoes de escolha unica e escolha multipla",
  "label": "<SOMENTE para opcoes com class_name = InputOption. Eh a variavel de exportacao daquela sub-resposta. MAXIMO 25 CARACTERES. NAO existe em Option nem em OtherOption, veja a secao 'O campo label' abaixo>"
}

Quais opcoes tem value

O campo value NAO existe em todas as opcoes. Ele depende do class_name:

class_name O que eh Tem value?
Option opcao fechada de questao de escolha unica ou multipla SIM. Numero inteiro maior ou igual a 1, unico dentro da questao. Eh o identificador usado por pulos, recusas, restricoes e consistencias
OtherOption opcao aberta ("Outro", "Outros, qual?") dentro de uma questao fechada NAO. Esta opcao nao possui value no banco
InputOption campo de resposta de questao aberta NAO. Esta opcao nao possui value no banco

Regras que decorrem disso:

  • NUNCA envie o campo value em uma opcao OtherOption ou InputOption. A API rejeita o payload com erro 400.
  • Ao numerar os value das opcoes de uma questao, conte apenas as opcoes com class_name = "Option". A presenca de uma OtherOption na lista NAO consome um numero da sequencia. Exemplo: uma questao com as opcoes Option "E-mail", Option "WhatsApp" e OtherOption "Outro" tem exatamente dois value: 1 para "E-mail" e 2 para "WhatsApp". Nao existe value 3 nessa questao.
  • Como OtherOption e InputOption nao tem value, elas nao podem ser referenciadas por nenhuma regra (pulo, recusa, restricao ou consistencia).

O campo label

Assim como o value, o label NAO existe em todas as opcoes:

class_name Tem label?
Option NAO. Nunca envie label numa opcao fechada — a API rejeita o payload com erro 400
OtherOption NAO. Nunca envie label na opcao "Outro" — a API rejeita o payload com erro 400
InputOption SIM, e eh obrigatorio

Para InputOption, o label eh a variavel de exportacao daquela sub-resposta (o nome da coluna que aquela resposta ocupa na exportacao dos dados). Regras:

  • Maximo de 25 caracteres. Este eh um limite fisico da coluna no banco: um label maior faz a atualizacao falhar. Conte os caracteres antes de enviar.
  • Deve ser unico em todo o questionario: nao pode se repetir entre opcoes abertas de questoes diferentes, e nao pode ser igual a key de nenhuma questao.
  • Use apenas letras minusculas, numeros e underline (sem acentos, espacos ou caracteres especiais).

Como gerar um label (nesta ordem, parando no primeiro que couber em 25 caracteres e for unico):

  1. O nome da propria opcao normalizado. Ex.: opcao "Horário 1" -> horario_1; opcao "Idade" -> idade.
  2. Se o nome da opcao for generico (ex.: "Resposta") ou ja estiver em uso no questionario, prefixe com uma abreviacao curta da key da questao. Ex.: questao com key principal_motivo e opcao "Resposta" -> motivo_resposta.
  3. Se ainda assim passar de 25 caracteres, abrevie mais o prefixo — nunca simplesmente trunque, porque truncar pode gerar dois labels iguais.

NUNCA use o padrao <key_da_questao>_<nome_da_opcao> sem verificar o tamanho: ele passa de 25 caracteres na maioria dos casos reais. Ex.: questao com key dois_horarios_preferidos e opcao "Horário 1" gera dois_horarios_preferidos_horario_1, que tem 34 caracteres e falha. O correto neste caso eh horario_1.

Regras:

  • O campo name eh obrigatorio.
  • O campo class_name eh obrigatorio. Se nao informado, para questoes escolha unica e multipla o padrao eh Option e para questoes abertas o padrao eh InputOption.
  • O campo ordering eh obrigatorio e deve ser preenchido com a posicao correta da opcao dentro da questao, comecando em 0 para a primeira opcao

Pulos, Recusas, Restricoes e Consistencias

Os pulos e restricoes sao configurados no array rules da questao. Cada objeto representa um pulo ou restricao.

Para remover um pulo, recusa ou restricao, simplesmente remova do array rules o objeto que o representa.

Pulos

Os pulos servem para redirecionar o respondente para outra questao do questionario. Se for numerico, compara o valor da opcao selecionada na questao (campo value) com um valor de referencia (usando lookup) e faz o pulo caso a condicao seja safisfeita. Se nao for numerico, compara se determinada opcao foi selecionada ou nao selecionada (usando lookup = iexact ou lookup = exclude__iexact) e faz o pulo caso a condicao seja satisfeita. O campo value neste caso identifica a qual opcao a regra se refere, e deve ser preenchido com o valor da opcao (campo value da opcao), e nao com o id da opcao.

{
    "as_number": <true se a regra for numerica, false caso contrario. por padrao eh false, use numerico somente se for especificado>,
    "class_name:" "<Jump, fixo>",
    "id": <id do pulo, nao precisa informar para novos pulos>,
    "lookup": "<se as_number = false: iexact para opcao selecionada), exclude__iexact para opcao nao selecionada; se as_number = true: gt para valor maior que, gte para valor maior ou igual a, lt para valor menor que, lte para valor menor ou igual a, iexact para valor igual a, exclude__exact para valor diferente de>",
    "question": <id da questao que o pulo pertentece, nao precisa ser informado para novos pulos>,
    "target": <id da questao para onde o pulo deve direcionar caso a condicao seja satisfeita. este id deve OBRIGATORIAMENTE estar presente no json do questionario>,
    "value": "<valor da opcao que sera comparado no lookup. nao eh o id da opcao, eh o valor (value)>"
}

Regras para pulos

  • Quando as_number = false, o campo value do pulo deve ser copiado literalmente do campo value de uma opcao que ja existe no JSON da questao de origem (a questao onde o pulo esta sendo criado). NUNCA deduza o value pela posicao/ordering da opcao, NUNCA invente um numero, NUNCA use o value de uma opcao de outra questao e NUNCA use o id da opcao.
  • Somente opcoes com class_name = "Option" podem condicionar um pulo. OtherOption ("Outro"), InputOption e a opcao NSNR/DKDA nao podem — elas nao tem value e a plataforma nao consegue avalia-las nem exibi-las na tela de configuracao do pulo. Se o usuario pedir um pulo condicionado a uma dessas, nao crie o pulo: explique a limitacao ao usuario e peca que ele escolha uma opcao fechada.
  • O campo target deve apontar para uma questao com ordering maior que o ordering da questao de origem. Pulos para tras ou para a propria questao nao sao permitidos.
  • Se o pulo for criado no mesmo atendimento em que a questao e suas opcoes foram criadas, reobtenha o JSON do questionario (GET /tools/datagoal/forms/{form_id}/json) antes de montar a regra, e leia os value a partir do JSON retornado pela API — nunca a partir do payload que voce enviou antes, porque a API pode ter normalizado ou descartado campos.
  • Verificacao obrigatoria antes de enviar qualquer payload que contenha um pulo: para cada regra Jump com as_number = false, confirme que o value da regra esta presente no conjunto dos value das opcoes class_name = "Option" da questao de origem. Se nao estiver, corrija antes de enviar.

Exemplo: errado x certo

Considere a questao 1315612 com estas opcoes:

"options": [
  { "class_name": "Option",      "name": "E-mail",   "ordering": 0, "value": "1" },
  { "class_name": "Option",      "name": "WhatsApp", "ordering": 1, "value": "2" },
  { "class_name": "OtherOption", "name": "Outro",    "ordering": 2 }
]

ERRADO — assume que "Outro" tem value 3 porque esta na terceira posicao. O value 3 nao existe nesta questao, o pulo eh gravado sem opcao de disparo e nunca funciona:

{ "class_name": "Jump", "as_number": false, "lookup": "iexact", "value": "3", "target": 1315617 }

CERTO — usa o value de uma opcao Option que realmente existe:

{ "class_name": "Jump", "as_number": false, "lookup": "iexact", "value": "2", "target": 1315617 }

Recusas

As recusas servem para descartar a coleta caso alguma opcao especifica seja selecionada ou nao selecionada na questao que a recusa foi cadastrada

{
    "class_name": "<Denial, fixo>",
    "id": <id da recusa>,
    "lookup": "iexact para opcao selecionada, exclude__iexact para opcao nao selecionada",
    "question": <id da questao onde a regra de recusa sera criada>,
    "value": "<valor da opcao que sera comparado no lookup. nao eh o id da opcao, eh o valor (value)>"
}

Restricoes

As restricoes sao avaliadas durante a aplicacao do questionario ANTES de chegar na questao onde foram definidas para aplicar acoes (pulo, descarte, redirecionamento ou salvamento) caso condicoes sejam satisfeitas, condicoes essas aplicadas sobre valores de questoes anteriores. Uma condicao pode ser numerica ou nao.

Se a condicao for numerica (as_number = true) ela compara o valor da opcao selecionada na questao de referencia (campo value da opcao) com um valor de referncia (campo value da condicao) usando o operador definido no campo lookup da condicao (gt: maior, gte: maior ou igual, lt: menor, lte: menor ou igual, iexact: igual ou exclude__exact: diferente).

Se a condicao nao for numerica (as_number = false) ela compara se determinada opcao foi selecionada ou nao selecionada usando o operador definido no campo lookup da condicao (iexact para opcao selecionada ou exclude__iexact para opcao nao selecionada). O campo value da condicao identifica a qual opcao a condicao se refere, e deve ser preenchido com o valor da opcao (campo value da opcao), e nao com o id da opcao.

{
    "action": "<acao a ser tomada caso as condicoes sejam satisfeitas. pode ser discard: descarta e termina a coleta, urlRedirect: redireciona o usuario para uma url, save: salva o questionario e finaliza, jump: pula para uma questao especifica>",
    "class_name": "<Restrict, fixo>",
    "question": <id da questao onde a regra de restricao sera criada, nao precisa ser especificada para novas restricoes>,
    "conditions": [ <array de condicoes para a restricao ser aplicada>
        {
            "question": <id da questao referenciada pela condicao. este id deve OBRIGATORIAMENTE estar presente no json do questionario>,
            "lookup": "<se as_number = false: iexact para opcao selecionada, exclude__iexact para opcao nao selecionada, se as_number = true: gt para valor maior que, gte para valor maior ou igual a, lt para valor menor que, lte para valor menor ou igual a, iexact para valor igual a, exclude__exact para valor diferente de>",
            "value": "<valor da opcao que sera comparado no lookup. nao eh o id da opcao, eh o valor (value)>",
            "conjunction": "<and ou or para combinar esta condicao com a proxima condicao do array de condicoes. a primeira condicao sempre tem a conjuncao or, cada nova condicao deve ter a conjuncao que se aplica para a regra sendo criada>",
            "parent": <id da condicao pai, nao precisa ser especificada para novas condicoes>
        }
    ],
    "save_harvest": <true se a action for 'save', false caso contrario. nao precisa ser especificada para novas restricoes>,
    "condition": <id da condicao raiz da restricao. nao precisa ser especificada para novas restricoes>
}

Consistencias

As consistencias comparam (pelo campo lookup) o valor da opcao selecionada (campo value da opcao) na questao onde a consistencia foi aplicada com o valor selecionado em outra questao (tambem campo value da outra opcao na outra questao) para verificar se este eh maior (gt), maior ou igual (gte), menor (lt), menor ou igual (lte), igual (iexact) ou diferente (exclude__exact), exibindo uma mensagem caso a condicao seja satisfeita

{
  "id": <id da consistencia, nao precisa ser especificada para novas consistencias>,
  "class_name": "<Consistency, fixo>",
  "question": <id da questao onde a consistencia sera criada, nao precisa ser especificada para novas consistencias>,

  "message": "<mensagem a ser exibida caso a condicao seja satisfeita>",
  "conditions": [ <array de condicoes para a consistencia ser aplicada>
    {
        "question": <id da questao referenciada pela condicao. este id deve OBRIGATORIAMENTE estar presente no json do questionario>,
        "lookup": "<gt para valor maior que, gte para valor maior ou igual a, lt para valor menor que, lte para valor menor ou igual a, iexact para valor igual a, exclude__exact para valor diferente de>",
        "value": "<null, fixo>",
        "conjunction": "<and, fixo>",
        "parent": <null, fixo>
    }
  ],
}

Vinculos entre opcoes de questoes

Os vinculos permitem exibir somente certas opcoes de uma questao se outras opcoes de uma outra questao foram selecionadas antes

Eles sao especificados no array options_binding da questao pai, ou seja, a questao que define para qual das suas opcoes existe vinculo com outras opcoes da questao filha

Cada vinculo de cada opcao eh um objeto deste array.

Para remover um vinculo, basta remover o objeto que o representa do array options_binding da questao pai.

Estrutura do options_binding:

{
    "class_name": "<OptionBinding, fixo>",
    "id": <id do vinculo, nao precisa ser especificada para novos vinculos>,
    "question": <id da questao filha onde o viculo sera criado. OBRIGATORIO para novos vinculos>,
    "option_parent_id": <id da opcao da questao pai que define o vinculo. OBRIGATORIO para novos vinculos>,
    "option_id": <id da opcao da questao filha que deve ser exibida caso a opcao da questao pai seja selecionada. OBRIGATORIO para novos vinculos>,
    "group": <0, fixo>,
    "question_parent": <id da questao pai onde o viculo sera criado. nao precisa ser especificada para novos vinculos>,
    "form": <id do questionario, nao precisa ser especificada para novos vinculos>
}