> ## 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 formulário

> Cria um formulário ou, quando `id` é enviado, atualiza o título e os campos de um existente. A lista `edges` é sempre a definição completa: campo existente que não vier no payload é removido definitivamente. Tipos de campo e lógica condicional estão em [Criar um formulário](https://docs.olie.ai/guides/forms/creating-forms).



## OpenAPI

````yaml /api-reference/openapi.json post /api/management/save-form
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/save-form:
    post:
      tags:
        - forms
      summary: Salvar formulário
      description: >-
        Cria um formulário ou, quando `id` é enviado, atualiza o título e os
        campos de um existente. A lista `edges` é sempre a definição completa:
        campo existente que não vier no payload é removido definitivamente.
        Tipos de campo e lógica condicional estão em [Criar um
        formulário](https://docs.olie.ai/guides/forms/creating-forms).
      operationId: salvarFormulRio
      requestBody:
        content:
          application/json:
            schema:
              type: object
              description: Definição completa do formulário.
              additionalProperties: false
              required:
                - title
                - edges
              properties:
                id:
                  type: integer
                  description: >-
                    ID do formulário a atualizar. Omita ou envie nulo para criar
                    um novo.
                  nullable: true
                title:
                  type: string
                  description: Título do formulário (3 a 255 caracteres).
                  minLength: 3
                  maxLength: 255
                edges:
                  type: array
                  description: >-
                    Lista completa de campos, na ordem desejada. Campos
                    existentes que não forem enviados são removidos
                    definitivamente.
                  minItems: 1
                  items:
                    type: object
                    description: Campo do formulário.
                    required:
                      - label
                      - type
                    properties:
                      id:
                        description: >-
                          ID do campo existente (número) para atualizá-lo. Em
                          campo novo, envie um ID temporário em texto (ex.:
                          "CREATE1") para poder referenciá-lo em
                          conditionals.target_id no mesmo payload.
                        nullable: true
                        anyOf:
                          - type: integer
                          - type: string
                      label:
                        type: string
                        description: Rótulo do campo (até 255 caracteres, sem HTML).
                        maxLength: 255
                      type:
                        type: string
                        description: Tipo do campo.
                        enum:
                          - short_text
                          - long_text
                          - rich_text
                          - attachment
                          - checkbox
                          - user
                          - date
                          - date_and_time
                          - email
                          - phone
                          - select
                          - radio
                          - currency
                          - number
                          - link
                          - time
                          - contact
                          - customer
                          - project
                          - counter
                          - matrix
                      index:
                        type: integer
                        description: Posição do campo no formulário.
                      required:
                        type: boolean
                        description: Se o preenchimento é obrigatório.
                      help_text:
                        type: string
                        description: Texto de ajuda (até 255 caracteres).
                        maxLength: 255
                        nullable: true
                      description:
                        type: string
                        description: Descrição do campo (até 255 caracteres).
                        maxLength: 255
                        nullable: true
                      custom_validation:
                        type: string
                        description: >-
                          Expressão regular que a resposta precisa atender (até
                          255 caracteres).
                        nullable: true
                      options:
                        description: >-
                          Opções do campo: lista de textos para select, radio e
                          checkbox; objeto com rows/columns para matrix. Opções
                          removidas são apagadas das respostas já dadas.
                        items:
                          type: string
                          description: Texto de uma opção.
                        properties:
                          rows:
                            type: array
                            description: Linhas da matriz (1 a 100).
                            items:
                              type: object
                              description: Linha da matriz.
                              properties:
                                key:
                                  type: string
                                  description: Chave única da linha (1 a 64 caracteres).
                                label:
                                  type: string
                                  description: >-
                                    Rótulo exibido na linha (1 a 255
                                    caracteres).
                          columns:
                            type: array
                            description: Colunas da matriz (1 a 20).
                            items:
                              type: object
                              description: Coluna da matriz.
                              properties:
                                key:
                                  type: string
                                  description: >-
                                    Chave única da coluna (1 a 64 caracteres). O
                                    tipo de uma coluna existente não pode mudar.
                                label:
                                  type: string
                                  description: >-
                                    Rótulo exibido na coluna (1 a 255
                                    caracteres).
                                type:
                                  type: string
                                  description: Tipo da célula. Aceita apenas tipos simples.
                                  enum:
                                    - short_text
                                    - long_text
                                    - number
                                    - currency
                                    - date
                                    - date_and_time
                                    - time
                                    - email
                                    - phone
                                    - link
                                    - select
                                    - radio
                                    - checkbox
                                options:
                                  type: array
                                  description: >-
                                    Opções da célula (1 a 50). Obrigatório para
                                    select, radio e checkbox; proibido nos
                                    demais tipos.
                                  items:
                                    type: string
                                    description: Texto de uma opção.
                                required:
                                  type: boolean
                                  description: Se a célula é obrigatória.
                                is_multiple:
                                  type: boolean
                                  description: >-
                                    Permite vários links na célula. Só para
                                    colunas do tipo link.
                                description:
                                  type: string
                                  description: Descrição da coluna (até 255 caracteres).
                                  nullable: true
                                help_text:
                                  type: string
                                  description: >-
                                    Texto de ajuda da coluna (até 255
                                    caracteres).
                                  nullable: true
                                custom_validation:
                                  type: string
                                  description: >-
                                    Expressão regular aplicada à célula. Só para
                                    short_text, long_text, email, phone,
                                    currency e number.
                                  nullable: true
                              required:
                                - key
                                - label
                                - type
                        anyOf:
                          - type: array
                            items: {}
                          - type: object
                      is_multiple:
                        type: boolean
                        description: Se o campo aceita mais de um valor.
                        nullable: true
                      initial_value:
                        description: >-
                          Valor pré-preenchido, no formato de uma resposta
                          daquele tipo. É validado como uma resposta.
                        nullable: true
                        anyOf:
                          - type: string
                          - type: number
                          - type: array
                            items: {}
                          - type: object
                      conditional_action:
                        type: string
                        description: >-
                          O que fazer com o campo quando as regras são
                          atendidas.
                        enum:
                          - show
                          - hide
                          - null
                        nullable: true
                      logical_operator:
                        type: string
                        description: >-
                          Como combinar as regras do campo: and (todas) ou or
                          (qualquer uma).
                        enum:
                          - and
                          - or
                          - null
                        nullable: true
                      conditionals:
                        type: array
                        description: >-
                          Regras que controlam a exibição do campo. Substituem
                          as regras anteriores a cada salvamento.
                        items:
                          type: object
                          description: Regra condicional.
                          required:
                            - target_id
                          properties:
                            target_id:
                              description: >-
                                Campo cuja resposta é avaliada: ID existente ou
                                ID temporário de um campo novo do mesmo payload.
                                Campos matrix não podem ser avaliados.
                              anyOf:
                                - type: integer
                                - type: string
                            operator:
                              type: string
                              description: 'Operador de comparação. Padrão: equals.'
                              enum:
                                - equals
                                - not_equals
                                - contains
                                - not_contains
                                - greater_than
                                - less_than
                                - is_empty
                                - is_not_empty
                                - starts_with
                                - ends_with
                                - greater_than_or_equals
                                - less_than_or_equals
                            value:
                              description: >-
                                Valor comparado. Lista aceita apenas textos ou
                                números.
                              items:
                                type: string
                                description: Um dos valores comparados.
                              nullable: true
                              anyOf:
                                - type: string
                                - type: number
                                - type: array
                                  items: {}
                      action:
                        type: string
                        description: >-
                          Ação sobre um campo existente: archive arquiva (oculta
                          sem apagar as respostas) e restore reativa um campo
                          arquivado.
                        enum:
                          - archive
                          - restore
            example:
              id: null
              title: Briefing de projeto
              edges:
                - id: CREATE1
                  label: Objetivo do projeto
                  type: short_text
                  index: 0
                  required: true
                  help_text: Descreva em uma frase.
                  description: null
                  custom_validation: null
                - id: CREATE2
                  label: Canal de venda
                  type: select
                  index: 1
                  required: false
                  options:
                    - Loja física
                    - E-commerce
                    - Marketplace
                - id: CREATE3
                  label: URL da loja
                  type: link
                  index: 2
                  required: false
                  conditional_action: show
                  logical_operator: and
                  conditionals:
                    - target_id: CREATE2
                      operator: equals
                      value: E-commerce
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                type: object
                description: Formulário salvo.
                properties:
                  response:
                    type: boolean
                    description: >-
                      Indicador de sucesso da requisição. Sempre true nas
                      respostas bem-sucedidas.
                  form:
                    type: object
                    description: Dados do formulário.
                    properties:
                      id:
                        type: integer
                        description: ID do formulário.
                      title:
                        type: string
                        description: Título do formulário.
                      frame_id:
                        type: string
                        description: ID da conta dona do formulário.
                        format: uuid
                      created_at:
                        type: string
                        description: Data de criação do formulário.
                        format: date-time
                      updated_at:
                        type: string
                        description: Data da última alteração do formulário.
                        format: date-time
                      deleted_at:
                        type: string
                        description: Data de exclusão do formulário. Nulo quando ativo.
                        format: date-time
                        nullable: true
                      edges:
                        type: array
                        description: Campos do formulário, ordenados por index.
                        items:
                          type: object
                          description: Campo do formulário.
                          properties:
                            id:
                              type: integer
                              description: ID do campo.
                            type:
                              type: string
                              description: Tipo do campo.
                              enum:
                                - short_text
                                - long_text
                                - rich_text
                                - attachment
                                - checkbox
                                - user
                                - date
                                - date_and_time
                                - email
                                - phone
                                - select
                                - radio
                                - currency
                                - number
                                - link
                                - time
                                - contact
                                - customer
                                - project
                                - counter
                                - matrix
                            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 ou usuários).
                            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
                            conditionals:
                              type: array
                              description: Regras condicionais do campo.
                              items:
                                type: object
                                description: Regra condicional do campo.
                                properties:
                                  id:
                                    type: integer
                                    description: ID da regra.
                                  form_edge_id:
                                    type: integer
                                    description: >-
                                      ID do campo que é mostrado ou ocultado
                                      pela regra.
                                  target_id:
                                    type: integer
                                    description: ID do campo cuja resposta é avaliada.
                                  operator:
                                    type: string
                                    description: Operador de comparação.
                                    enum:
                                      - equals
                                      - not_equals
                                      - contains
                                      - not_contains
                                      - greater_than
                                      - less_than
                                      - is_empty
                                      - is_not_empty
                                      - starts_with
                                      - ends_with
                                      - greater_than_or_equals
                                      - less_than_or_equals
                                  value:
                                    description: >-
                                      Valor comparado com a resposta do campo
                                      avaliado.
                                    items:
                                      type: string
                                      description: Um dos valores comparados.
                                    nullable: true
                                    anyOf:
                                      - type: string
                                      - type: number
                                      - type: array
                                        items: {}
                                  created_at:
                                    type: string
                                    description: Data de criação da regra.
                                    format: date-time
                                  updated_at:
                                    type: string
                                    description: Data da última alteração da regra.
                                    format: date-time
              example:
                response: true
                form:
                  title: Briefing de projeto
                  frame_id: 01a0252b-d865-71af-a0a2-d4e168d1ffe5
                  updated_at: '2026-09-22T21:40:47.000000Z'
                  created_at: '2026-09-22T21:40:47.000000Z'
                  id: 69
                  edges:
                    - id: 112
                      type: short_text
                      label: Objetivo do projeto
                      index: 0
                      help_text: Descreva em uma frase.
                      description: null
                      options: []
                      initial_value: null
                      required: true
                      custom_validation: null
                      conditional: null
                      form_id: 69
                      created_at: '2026-09-22T21:40:47.000000Z'
                      updated_at: '2026-09-22T21:40:47.000000Z'
                      deleted_at: null
                      is_multiple: false
                      logical_operator: and
                      is_migrated: false
                      conditional_action: null
                      conditionals: []
                    - id: 113
                      type: select
                      label: Canal de venda
                      index: 1
                      help_text: null
                      description: null
                      options:
                        - Loja física
                        - E-commerce
                        - Marketplace
                      initial_value: null
                      required: false
                      custom_validation: null
                      conditional: null
                      form_id: 69
                      created_at: '2026-09-22T21:40:47.000000Z'
                      updated_at: '2026-09-22T21:40:47.000000Z'
                      deleted_at: null
                      is_multiple: false
                      logical_operator: and
                      is_migrated: false
                      conditional_action: null
                      conditionals: []
                    - id: 114
                      type: link
                      label: URL da loja
                      index: 2
                      help_text: null
                      description: null
                      options: []
                      initial_value: null
                      required: false
                      custom_validation: null
                      conditional: null
                      form_id: 69
                      created_at: '2026-09-22T21:40:47.000000Z'
                      updated_at: '2026-09-22T21:40:47.000000Z'
                      deleted_at: null
                      is_multiple: false
                      logical_operator: and
                      is_migrated: false
                      conditional_action: show
                      conditionals:
                        - id: 1
                          form_edge_id: 114
                          target_id: 113
                          operator: equals
                          value: E-commerce
                          created_at: '2026-09-22T21:40:47.000000Z'
                          updated_at: '2026-09-22T21:40:47.000000Z'
        '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 caminho 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 título must be at least 3 characters. (and 1 more error)
                validation:
                  title:
                    - The título must be at least 3 characters.
                  edges:
                    - The edges must have at least 1 items.
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer

````