> ## Documentation Index
> Fetch the complete documentation index at: https://docs.olie.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Salvar versão das respostas

> Congela as respostas atuais de um formulário em uma nova [versão](https://docs.olie.ai/guides/forms/loose-forms) do histórico; com `clean_edges`, os campos são esvaziados em seguida para o próximo ciclo. O formulário é identificado pelo [pivot](https://docs.olie.ai/api-reference/general/form-answer-pivot), em que `father_class` e `father_id` são obrigatórios.



## OpenAPI

````yaml /api-reference/openapi.json post /api/management/answers-history
openapi: 3.0.0
info:
  title: Olie API
  version: 1.0.0
  description: >
    # Introdução 👋


    Olá! Esta é a documentação oficial da API da [olie.ai](https://olie.ai/).
    Aqui você encontra as referências e exemplos de uso dos nossos endpoints.


    Para uma visão completa, recomendamos fortemente que você leia a
    [documentação oficial](https://docs.olie.ai/api-reference/introduction). Lá
    estão detalhados tópicos essenciais como
    [autenticação](https://docs.olie.ai/api-reference/introduction/authentication),
    [estrutura de
    respostas](https://docs.olie.ai/api-reference/general/response-structure),
    [paginação](https://docs.olie.ai/api-reference/general/pagination) e outros
    guias de integração.


    No Postman, esta coleção foca nas informações específicas de cada requisição
    (endpoints, parâmetros e exemplos), servindo como apoio rápido para testes e
    desenvolvimento.
servers:
  - url: https://api.olie.ai
security:
  - BearerAuth: []
paths:
  /api/management/answers-history:
    post:
      tags:
        - answers-history
      summary: Salvar versão das respostas
      description: >-
        Congela as respostas atuais de um formulário em uma nova
        [versão](https://docs.olie.ai/guides/forms/loose-forms) do histórico;
        com `clean_edges`, os campos são esvaziados em seguida para o próximo
        ciclo. O formulário é identificado pelo
        [pivot](https://docs.olie.ai/api-reference/general/form-answer-pivot),
        em que `father_class` e `father_id` são obrigatórios.
      operationId: criarHistRicoDeRespostasDeUmFormulRio
      requestBody:
        content:
          application/json:
            schema:
              type: object
              description: Endereço (pivot) do formulário a versionar.
              required:
                - pivot_class
                - form_id
                - father_class
                - father_id
              properties:
                pivot_class:
                  type: string
                  description: >-
                    Tipo de vínculo do formulário (ex.:
                    App\Models\ProjectLooseForm). Define quais atributos de
                    endereço são obrigatórios.
                form_id:
                  type: integer
                  description: ID do formulário.
                project_id:
                  type: string
                  description: >-
                    Atributo de endereço: ID do projeto, para vínculos de funil,
                    etapa e avulso.
                  format: uuid
                  nullable: true
                id:
                  description: >-
                    Atributo de endereço: ID do registro (projeto, cliente,
                    contato, usuário da conta ou formulário avulso).
                  nullable: true
                  anyOf:
                    - type: string
                    - type: integer
                project_funnel_id:
                  type: integer
                  description: >-
                    Atributo de endereço: ID do funil, para
                    App\Models\ProjectFunnelAssignment.
                  nullable: true
                funnel_step_id:
                  type: integer
                  description: >-
                    Atributo de endereço: ID da etapa, para
                    App\Models\ProjectStepForm.
                  nullable: true
                father_class:
                  type: string
                  description: >-
                    Tipo do registro de origem, quase sempre App\Models\Project.
                    Usado para conferir se o formulário está anexado ali.
                father_id:
                  type: string
                  description: ID do registro de origem.
                clean_edges:
                  type: boolean
                  description: >-
                    Se true, esvazia as respostas do formulário depois de salvar
                    a versão. Padrão: false.
                  nullable: true
            example:
              pivot_class: App\Models\ProjectLooseForm
              form_id: null
              project_id: null
              id: null
              father_class: App\Models\Project
              father_id: null
              clean_edges: false
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                type: object
                description: Versão criada.
                properties:
                  response:
                    type: boolean
                    description: >-
                      Indicador de sucesso da requisição. Sempre true nas
                      respostas bem-sucedidas.
                  answer_history:
                    type: object
                    description: Versão das respostas.
                    properties:
                      user_id:
                        type: string
                        description: >-
                          ID do usuário que salvou a versão. Nulo quando feita
                          por aplicação.
                        format: uuid
                        nullable: true
                      frame_id:
                        type: string
                        description: ID da conta.
                        format: uuid
                      form_id:
                        type: integer
                        description: ID do formulário versionado.
                      model_class:
                        type: string
                        description: >-
                          Tipo de vínculo (pivot_class) onde o formulário está
                          anexado.
                      model_id:
                        description: >-
                          ID do registro de vínculo onde o formulário está
                          anexado.
                        anyOf:
                          - type: string
                          - type: integer
                      updated_at:
                        type: string
                        description: Data da última alteração.
                        format: date-time
                      created_at:
                        type: string
                        description: Data em que a versão foi salva.
                        format: date-time
                      id:
                        type: integer
                        description: ID da versão.
                      answers:
                        type: array
                        description: Campos do formulário com as respostas congeladas.
                        items:
                          type: object
                          description: >-
                            Campo do formulário com a resposta congelada nesta
                            versão.
                          properties:
                            id:
                              type: integer
                              description: ID do campo.
                            type:
                              type: string
                              description: Tipo do campo.
                              enum:
                                - short_text
                                - long_text
                                - rich_text
                                - attachment
                                - checkbox
                                - date
                                - date_and_time
                                - email
                                - phone
                                - select
                                - radio
                                - currency
                                - number
                                - link
                                - time
                                - matrix
                                - user
                                - contact
                                - customer
                                - project
                                - counter
                            label:
                              type: string
                              description: Rótulo do campo.
                            index:
                              type: integer
                              description: >-
                                Posição do campo no formulário (ordem
                                crescente).
                            help_text:
                              type: string
                              description: Texto de ajuda exibido junto ao campo.
                              nullable: true
                            description:
                              type: string
                              description: Descrição do campo.
                              nullable: true
                            options:
                              description: >-
                                Opções do campo: lista de textos para select,
                                radio e checkbox; objeto com rows/columns para
                                matrix; lista vazia nos demais tipos.
                              items:
                                type: string
                                description: Texto de uma opção.
                              anyOf:
                                - type: array
                                  items: {}
                                - type: object
                            initial_value:
                              description: >-
                                Valor pré-preenchido do campo, no mesmo formato
                                de uma resposta daquele tipo.
                              nullable: true
                              anyOf:
                                - type: string
                                - type: number
                                - type: array
                                  items: {}
                                - type: object
                            required:
                              type: boolean
                              description: Se o preenchimento é obrigatório.
                            custom_validation:
                              type: string
                              description: >-
                                Expressão regular que a resposta precisa
                                atender.
                              nullable: true
                            conditional:
                              description: >-
                                Campo legado, sempre nulo. As regras ficam em
                                conditionals.
                              nullable: true
                            form_id:
                              type: integer
                              description: ID do formulário ao qual o campo pertence.
                            created_at:
                              type: string
                              description: Data de criação do campo.
                              format: date-time
                            updated_at:
                              type: string
                              description: Data da última alteração do campo.
                              format: date-time
                            deleted_at:
                              type: string
                              description: >-
                                Data em que o campo foi arquivado. Nulo quando
                                ativo.
                              format: date-time
                              nullable: true
                            is_multiple:
                              type: boolean
                              description: >-
                                Se o campo aceita mais de um valor (ex.: vários
                                links).
                            logical_operator:
                              type: string
                              description: >-
                                Como as regras condicionais do campo se
                                combinam.
                              enum:
                                - and
                                - or
                            is_migrated:
                              type: boolean
                              description: >-
                                Marcador interno de migração de dados. Pode ser
                                ignorado.
                            conditional_action:
                              type: string
                              description: >-
                                O que acontece com o campo quando as regras são
                                atendidas: show (exibe) ou hide (oculta). Nulo
                                quando não há lógica condicional.
                              enum:
                                - show
                                - hide
                                - null
                              nullable: true
                            answer:
                              description: >-
                                Resposta do campo no momento da versão. Nulo
                                quando vazio.
                              nullable: true
                              anyOf:
                                - type: string
                                - type: number
                                - type: boolean
                                - type: array
                                  items: {}
                                - type: object
                            answered_by:
                              type: string
                              description: ID do usuário que deu a resposta.
                              format: uuid
                              nullable: true
                      user:
                        type: object
                        description: Usuário que salvou a versão.
                        properties:
                          id:
                            type: string
                            description: ID do usuário.
                            format: uuid
                          name:
                            type: string
                            description: Nome do usuário.
                          avatar_url:
                            type: string
                            description: URL da foto do usuário.
                            nullable: true
                        nullable: true
              example:
                response: true
                answer_history:
                  answers:
                    - id: 115
                      type: short_text
                      label: Nome completo
                      index: 0
                      help_text: null
                      description: null
                      options: []
                      initial_value: null
                      required: true
                      custom_validation: null
                      conditional: null
                      form_id: 70
                      created_at: '2026-09-22T22:00:15.000000Z'
                      updated_at: '2026-09-22T22:01:40.000000Z'
                      deleted_at: null
                      is_multiple: false
                      logical_operator: and
                      is_migrated: false
                      conditional_action: null
                      answer: Ana Souza
                      answered_by: 01a0252b-d7a0-7242-9420-bacbd51f678b
                    - id: 116
                      type: email
                      label: E-mail
                      index: 1
                      help_text: null
                      description: null
                      options: []
                      initial_value: null
                      required: true
                      custom_validation: null
                      conditional: null
                      form_id: 70
                      created_at: '2026-09-22T22:00:15.000000Z'
                      updated_at: '2026-09-22T22:01:40.000000Z'
                      deleted_at: null
                      is_multiple: false
                      logical_operator: and
                      is_migrated: false
                      conditional_action: null
                      answer: ana.souza@exemplo.com.br
                      answered_by: 01a0252b-d7a0-7242-9420-bacbd51f678b
                    - id: 117
                      type: phone
                      label: Telefone
                      index: 2
                      help_text: null
                      description: null
                      options: []
                      initial_value: null
                      required: false
                      custom_validation: null
                      conditional: null
                      form_id: 70
                      created_at: '2026-09-22T22:00:15.000000Z'
                      updated_at: '2026-09-22T22:01:40.000000Z'
                      deleted_at: null
                      is_multiple: false
                      logical_operator: and
                      is_migrated: false
                      conditional_action: null
                      answer: '+5511999998888'
                      answered_by: 01a0252b-d7a0-7242-9420-bacbd51f678b
                    - id: 118
                      type: select
                      label: Como conheceu o evento
                      index: 3
                      help_text: null
                      description: null
                      options:
                        - Indicação
                        - Redes sociais
                        - Site
                      initial_value: null
                      required: false
                      custom_validation: null
                      conditional: null
                      form_id: 70
                      created_at: '2026-09-22T22:00:15.000000Z'
                      updated_at: '2026-09-22T22:01:40.000000Z'
                      deleted_at: null
                      is_multiple: false
                      logical_operator: and
                      is_migrated: false
                      conditional_action: null
                      answer: Site
                      answered_by: 01a0252b-d7a0-7242-9420-bacbd51f678b
                    - id: 119
                      type: user
                      label: Responsável interno
                      index: 4
                      help_text: null
                      description: null
                      options: []
                      initial_value: null
                      required: false
                      custom_validation: null
                      conditional: null
                      form_id: 70
                      created_at: '2026-09-22T22:00:15.000000Z'
                      updated_at: '2026-09-22T22:00:15.000000Z'
                      deleted_at: null
                      is_multiple: false
                      logical_operator: and
                      is_migrated: false
                      conditional_action: null
                      answer: null
                  user_id: 01a0252b-d7a0-7242-9420-bacbd51f678b
                  frame_id: 01a0252b-d865-71af-a0a2-d4e168d1ffe5
                  form_id: 70
                  model_class: App\Models\ProjectLooseForm
                  model_id: 14
                  updated_at: '2026-09-22T22:01:47.000000Z'
                  created_at: '2026-09-22T22:01:47.000000Z'
                  id: 2
                  user:
                    id: 01a0252b-d7a0-7242-9420-bacbd51f678b
                    name: Test User
                    avatar_url: https://exemplo.com.br/avatars/usuario.png
        '404':
          description: Registro de origem não encontrado
          content:
            application/json:
              schema:
                type: object
                description: Resposta de erro.
                properties:
                  response:
                    type: boolean
                    description: Indicador de sucesso da requisição. Sempre false em erros.
                  message:
                    type: string
                    description: >-
                      Código do erro para tratamento no cliente:
                      <modelo>_model_not_found (ex.: project_model_not_found)
                      quando o registro de origem ou o formulário não existe na
                      conta.
                  error:
                    type: string
                    description: Descrição legível do erro.
              example:
                response: false
                message: project_model_not_found
                error: >-
                  No query results for model [App\Models\Project]
                  00000000-0000-0000-0000-000000000000
        '422':
          description: Validação falhou
          content:
            application/json:
              schema:
                type: object
                description: Resposta de erro.
                properties:
                  response:
                    type: boolean
                    description: Indicador de sucesso da requisição. Sempre false em erros.
                  message:
                    type: string
                    description: >-
                      Código do erro para tratamento no cliente:
                      validation_errors.
                  error:
                    type: string
                    description: Descrição legível do erro.
                  validation:
                    type: object
                    description: >-
                      Mensagens de erro agrupadas pelo nome do atributo
                      inválido.
                    additionalProperties:
                      type: array
                      description: Mensagens do atributo.
                      items:
                        type: string
                        description: Mensagem de erro.
              example:
                response: false
                message: validation_errors
                error: The father class field is required. (and 2 more errors)
                validation:
                  father_class:
                    - The father class field is required.
                  father_id:
                    - The father id field is required.
                  clean_edges:
                    - The clean edges field must be true or false.
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer

````