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

# Criar flow como rascunho

> Cria um flow de automação a partir de uma descrição declarativa. O flow é sempre salvo como rascunho e não envia nada até ser ativado. Com validate_only, apenas valida e devolve o resumo, sem salvar. Exige uma API key com o escopo write.



## OpenAPI

````yaml /openapi.json post /v1/flows
openapi: 3.1.0
info:
  title: Bevits API
  version: 1.0.0
  description: >-
    API pública para consultar dados de CRM, compras e automação de uma
    organização Bevits e criar automações como rascunho para revisão e ativação.
  license:
    name: Proprietary
    identifier: LicenseRef-Proprietary
servers:
  - url: https://api.bevits.com
    description: Produção
security:
  - bearerAuth: []
tags:
  - name: Sistema
    description: Disponibilidade da API.
  - name: Identidade
    description: Identidade da organização e da API key.
  - name: Clientes
    description: Clientes e suas relações.
  - name: Segmentos
    description: Segmentos de clientes.
  - name: Compras
    description: Compras importadas das integrações.
  - name: Dados do CRM
    description: Tags e definições de atributos.
  - name: Automações
    description: Flows de automação.
  - name: Campanhas
    description: Campanhas de e-mail.
paths:
  /v1/flows:
    post:
      tags:
        - Automações
      summary: Criar flow como rascunho
      description: >-
        Cria um flow de automação a partir de uma descrição declarativa. O flow
        é sempre salvo como rascunho e não envia nada até ser ativado. Com
        validate_only, apenas valida e devolve o resumo, sem salvar. Exige uma
        API key com o escopo write.
      operationId: createFlowDraft
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FlowSpec'
            example:
              name: Boleto a pagar
              trigger:
                platform: nuvemshop
                event: order_created
              start: is_boleto
              nodes:
                - key: is_boleto
                  type: condition
                  field: order.paymentMethod
                  operator: equals
                  value: boleto
                  if_true: wait_1_day
                - key: wait_1_day
                  type: wait
                  amount: 1
                  unit: days
                  next: still_pending
                - key: still_pending
                  type: condition
                  field: order.paymentStatus
                  operator: equals
                  value: pending
                  if_true: remind
                - key: remind
                  type: send_whatsapp
                  template_id: wtp_...
      responses:
        '200':
          $ref: '#/components/responses/FlowDraft'
        '400':
          $ref: '#/components/responses/InvalidBody'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/WriteScopeRequired'
        '409':
          $ref: '#/components/responses/IdempotencyConflict'
        '422':
          $ref: '#/components/responses/FlowValidationError'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      description: >-
        Chave única da operação. Repetir a mesma chave com o mesmo corpo devolve
        a resposta original em vez de executar de novo.
      schema:
        type: string
  schemas:
    FlowSpec:
      type: object
      required:
        - name
        - trigger
        - start
        - nodes
      additionalProperties: false
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 256
        description:
          type: string
          maxLength: 2000
        trigger:
          type: object
          description: Gatilho do flow, como listado no catálogo.
          required:
            - platform
            - event
          additionalProperties: false
          properties:
            platform:
              type: string
              example: nuvemshop
            event:
              type: string
              example: order_created
        start:
          $ref: '#/components/schemas/FlowNodeKey'
        nodes:
          type: array
          minItems: 1
          maxItems: 50
          items:
            oneOf:
              - $ref: '#/components/schemas/FlowConditionNode'
              - $ref: '#/components/schemas/FlowWaitNode'
              - $ref: '#/components/schemas/FlowMessageNode'
              - $ref: '#/components/schemas/FlowUpdateTagsNode'
              - $ref: '#/components/schemas/FlowCreateCouponNode'
        validate_only:
          type: boolean
          default: false
          description: Se true, apenas valida o flow e devolve o resumo, sem salvar nada.
    FlowNodeKey:
      type: string
      description: >-
        Chave do bloco: letras minúsculas, números e sublinhados, começando por
        letra.
      pattern: ^[a-z][a-z0-9_]{0,63}$
      example: wait_1_day
    FlowConditionNode:
      type: object
      description: Divide o caminho conforme um campo dos dados do gatilho.
      required:
        - key
        - type
        - field
        - operator
      additionalProperties: false
      properties:
        key:
          $ref: '#/components/schemas/FlowNodeKey'
        type:
          type: string
          const: condition
        field:
          type: string
          example: order.paymentStatus
        operator:
          $ref: '#/components/schemas/FlowConditionOperator'
        value:
          description: Omita para is_empty e is_not_empty.
          type:
            - string
            - number
            - boolean
        if_true:
          $ref: '#/components/schemas/FlowNodeLink'
        if_false:
          $ref: '#/components/schemas/FlowNodeLink'
    FlowWaitNode:
      type: object
      description: Pausa o flow.
      required:
        - key
        - type
        - amount
        - unit
      additionalProperties: false
      properties:
        key:
          $ref: '#/components/schemas/FlowNodeKey'
        type:
          type: string
          const: wait
        amount:
          type: integer
          minimum: 1
          maximum: 10000
        unit:
          type: string
          enum:
            - minutes
            - hours
            - days
        next:
          $ref: '#/components/schemas/FlowNodeLink'
    FlowMessageNode:
      type: object
      description: >-
        Envia um template: send_whatsapp e send_whatsapp_unofficial usam wtp_,
        send_email usa etp_ e send_sms usa stp_.
      required:
        - key
        - type
        - template_id
      additionalProperties: false
      properties:
        key:
          $ref: '#/components/schemas/FlowNodeKey'
        type:
          type: string
          enum:
            - send_whatsapp
            - send_whatsapp_unofficial
            - send_email
            - send_sms
        template_id:
          type: string
          description: ID retornado na listagem de templates de mensagem.
        next:
          $ref: '#/components/schemas/FlowNodeLink'
    FlowUpdateTagsNode:
      type: object
      description: Adiciona ou remove tags do cliente.
      required:
        - key
        - type
        - action
        - tag_ids
      additionalProperties: false
      properties:
        key:
          $ref: '#/components/schemas/FlowNodeKey'
        type:
          type: string
          const: update_tags
        action:
          type: string
          enum:
            - add
            - remove
        tag_ids:
          type: array
          minItems: 1
          maxItems: 20
          items:
            type: string
            pattern: ^tag_[A-Za-z0-9_-]+$
        next:
          $ref: '#/components/schemas/FlowNodeLink'
    FlowCreateCouponNode:
      type: object
      description: >-
        Cria um cupom único para o cliente, disponível nas mensagens seguintes.
        Libera condições coupon.* depois dele.
      required:
        - key
        - type
        - discount_type
        - discount_value
        - valid_for_days
      additionalProperties: false
      properties:
        key:
          $ref: '#/components/schemas/FlowNodeKey'
        type:
          type: string
          const: create_coupon
        discount_type:
          type: string
          enum:
            - percentage
            - fixed
        discount_value:
          type: number
          exclusiveMinimum: 0
          description: Percentual (até 100) ou valor fixo do desconto.
        valid_for_days:
          type: integer
          minimum: 1
          maximum: 365
        code_prefix:
          type: string
          pattern: ^[A-Z0-9]{1,12}$
          description: Prefixo do código, com até 12 letras maiúsculas ou números.
        next:
          $ref: '#/components/schemas/FlowNodeLink'
    FlowDraft:
      type: object
      required:
        - object
        - validate_only
        - status
        - trigger
        - outline
        - warnings
        - next_step
      properties:
        object:
          type: string
          const: flow_draft
        validate_only:
          type: boolean
          description: true quando o flow foi apenas validado; nada foi salvo.
        id:
          type: string
          pattern: ^flw_[A-Za-z0-9_-]+$
        status:
          type: string
          const: draft
        revision:
          type: string
          description: >-
            Revisão do rascunho salvo. Informe-a ao ativar o flow depois da
            revisão.
        html_url:
          type: string
          format: uri
          description: Link do flow no editor da Bevits, para revisão.
        trigger:
          type: object
          required:
            - platform
            - event
          properties:
            platform:
              type: string
            event:
              type: string
        outline:
          type: array
          description: Passos do flow em linguagem simples.
          items:
            type: string
        warnings:
          type: array
          description: >-
            Avisos que não impedem o rascunho, como um template de WhatsApp
            ainda em análise pela Meta.
          items:
            $ref: '#/components/schemas/FlowBuildIssue'
        next_step:
          type: string
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/Error'
    RateLimitErrorResponse:
      allOf:
        - $ref: '#/components/schemas/ErrorResponse'
        - type: object
          required:
            - retry_after
          properties:
            retry_after:
              type: integer
              minimum: 1
              description: Segundos até uma nova tentativa.
    FlowConditionOperator:
      type: string
      enum:
        - equals
        - not_equals
        - greater_than
        - less_than
        - greater_than_or_equal
        - less_than_or_equal
        - contains
        - not_contains
        - starts_with
        - ends_with
        - is_empty
        - is_not_empty
        - includes
        - not_includes
    FlowNodeLink:
      description: Chave do próximo bloco. Omita para encerrar o caminho.
      anyOf:
        - $ref: '#/components/schemas/FlowNodeKey'
        - type: 'null'
    FlowBuildIssue:
      type: object
      required:
        - code
        - path
        - message
      properties:
        code:
          type: string
        path:
          type: string
          description: Caminho na descrição do flow, como nodes[2].field.
        node_key:
          type: string
        message:
          type: string
    Error:
      type: object
      required:
        - type
        - message
        - request_id
      properties:
        type:
          type: string
          enum:
            - authentication_error
            - conflict
            - internal_error
            - invalid_request
            - not_found
            - permission_denied
            - rate_limited
            - validation_error
        message:
          type: string
        param:
          type: string
        request_id:
          type: string
          pattern: ^req_[a-f0-9]{24}$
  responses:
    FlowDraft:
      description: Flow validado ou salvo como rascunho.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/FlowDraft'
    InvalidBody:
      description: >-
        Corpo da requisição ausente, que não é um objeto JSON, ou parâmetro de
        rota inválido.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: API key ausente, inválida, expirada ou revogada.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              type: authentication_error
              message: Invalid API key.
              request_id: req_07f6cdc3c20249d6afcd90b4
    WriteScopeRequired:
      description: A API key não tem o escopo write.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              type: permission_denied
              message: This API key does not have the required "write" scope.
              param: scope
              request_id: req_07f6cdc3c20249d6afcd90b4
    IdempotencyConflict:
      description: A Idempotency-Key já foi usada com outro corpo de requisição.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    FlowValidationError:
      description: >-
        O flow não pode ser criado ou ativado. A mensagem lista todos os
        problemas, cada um com o caminho, a chave do bloco e as opções válidas.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    RateLimited:
      description: Limite de requisições excedido.
      headers:
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
        X-RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimitErrorResponse'
    InternalError:
      description: Erro inesperado no servidor.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  headers:
    RetryAfter:
      description: Segundos até uma nova tentativa.
      schema:
        type: integer
        minimum: 1
    RateLimitLimit:
      description: Limite total da janela atual.
      schema:
        type: integer
        example: 600
    RateLimitRemaining:
      description: Requisições restantes na janela atual.
      schema:
        type: integer
        example: 599
    RateLimitReset:
      description: Instante UTC em que a janela atual termina.
      schema:
        type: string
        format: date-time
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: bvt_live_...
      description: API key criada nas configurações da organização.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.