> ## 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 campanha de WhatsApp Oficial como rascunho

> Cria uma campanha de WhatsApp Oficial como rascunho, com um template novo, e envia o template para análise da Meta. Nenhuma mensagem é enviada: depois da aprovação, uma pessoa escolhe o público e dispara a campanha na Bevits. Com validate_only, apenas valida a campanha, sem salvar nada nem contatar a Meta. Cada chamada salva envia um template para a Meta; não repita uma chamada que deu certo. Exige uma API key com o escopo write.



## OpenAPI

````yaml /openapi.json post /v1/whatsapp-campaigns
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, criar automações como rascunho para revisão e ativação e
    criar campanhas de WhatsApp Oficial como rascunho.
  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/whatsapp-campaigns:
    post:
      tags:
        - Campanhas
      summary: Criar campanha de WhatsApp Oficial como rascunho
      description: >-
        Cria uma campanha de WhatsApp Oficial como rascunho, com um template
        novo, e envia o template para análise da Meta. Nenhuma mensagem é
        enviada: depois da aprovação, uma pessoa escolhe o público e dispara a
        campanha na Bevits. Com validate_only, apenas valida a campanha, sem
        salvar nada nem contatar a Meta. Cada chamada salva envia um template
        para a Meta; não repita uma chamada que deu certo. Exige uma API key com
        o escopo write.
      operationId: createWhatsAppCampaign
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WhatsAppCampaignSpec'
            example:
              name: Black Friday VIP
              template:
                category: marketing
                header:
                  type: image
                  url: https://cdn.loja.com/bf.png
                body: >-
                  Oi {{1}}! A Black Friday começou: {{2}} em toda a loja.
                  Aproveite 👇
                variables:
                  - example: Maria
                    fill:
                      type: first_name
                      fallback: cliente
                  - example: 30% off
                    fill:
                      type: fixed_text
                      text: 30% off
                footer: Responda SAIR para não receber
                buttons:
                  - type: url
                    text: Ver ofertas
                    url: https://loja.com/black-friday
      responses:
        '200':
          $ref: '#/components/responses/WhatsAppCampaignDraft'
        '400':
          $ref: '#/components/responses/InvalidBody'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/WriteScopeRequired'
        '409':
          $ref: '#/components/responses/IdempotencyConflict'
        '422':
          $ref: '#/components/responses/WhatsAppCampaignValidationError'
        '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:
    WhatsAppCampaignSpec:
      type: object
      required:
        - name
        - template
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 120
          description: Nome da campanha na Bevits; também dá nome ao template.
        official_account_id:
          type: string
          pattern: ^waa_[A-Za-z0-9_-]+$
          description: >-
            Número de WhatsApp que envia a campanha. Só é necessário quando a
            loja tem vários números e nenhum é o padrão; nesse caso, o erro
            lista as opções.
        template:
          $ref: '#/components/schemas/WhatsAppCampaignTemplateSpec'
        validate_only:
          type: boolean
          default: false
          description: >-
            Se true, apenas valida a campanha e o template, sem salvar nada nem
            contatar a Meta.
    WhatsAppCampaignTemplateSpec:
      type: object
      required:
        - body
      properties:
        category:
          type: string
          enum:
            - marketing
            - utility
          default: marketing
          description: >-
            Promoções são marketing; a Meta recategoriza ou rejeita templates de
            utilidade com conteúdo promocional.
        language:
          type: string
          enum:
            - pt_BR
            - en_US
          default: pt_BR
        header:
          description: 'Cabeçalho opcional: texto ou mídia.'
          oneOf:
            - $ref: '#/components/schemas/WhatsAppTemplateTextHeader'
            - $ref: '#/components/schemas/WhatsAppTemplateMediaHeader'
        body:
          type: string
          minLength: 1
          maxLength: 1024
          description: >-
            Texto da mensagem. Aceita a formatação do WhatsApp (*negrito*,
            _itálico_) e emojis. As variáveis são {{1}}, {{2}}… em ordem, nunca
            no começo nem no fim do texto.
        variables:
          type: array
          maxItems: 20
          default: []
          description: Uma entrada por {{n}} do texto, na mesma ordem.
          items:
            $ref: '#/components/schemas/WhatsAppCampaignVariable'
        footer:
          type: string
          minLength: 1
          maxLength: 60
          description: Rodapé em texto simples, sem emojis, formatação ou variáveis.
        buttons:
          type: array
          maxItems: 10
          default: []
          description: >-
            Até 10 botões, com no máximo 2 de link, 1 de telefone e 1 de copiar
            código.
          items:
            oneOf:
              - $ref: '#/components/schemas/WhatsAppTemplateUrlButton'
              - $ref: '#/components/schemas/WhatsAppTemplateQuickReplyButton'
              - $ref: '#/components/schemas/WhatsAppTemplatePhoneButton'
              - $ref: '#/components/schemas/WhatsAppTemplateCopyCodeButton'
    WhatsAppCampaignDraft:
      type: object
      required:
        - object
        - validate_only
        - name
        - status
        - template
        - pending
        - next_step
      properties:
        object:
          type: string
          const: whatsapp_campaign_draft
        validate_only:
          type: boolean
          description: >-
            true quando a campanha foi apenas validada; nada foi salvo nem
            enviado à Meta.
        id:
          type: string
          pattern: ^tcp_[A-Za-z0-9_-]+$
        name:
          type: string
        status:
          type: string
          const: draft
        html_url:
          type: string
          format: uri
          description: >-
            Link da campanha na Bevits, onde uma pessoa escolhe o público e faz
            o envio.
        template:
          type: object
          required:
            - category
            - language
            - preview
          properties:
            id:
              type: string
              pattern: ^wtp_[A-Za-z0-9_-]+$
            category:
              type: string
              enum:
                - marketing
                - utility
            language:
              type: string
            status:
              type: string
              description: >-
                Status da análise da Meta: pending, approved ou rejected.
                Ausente quando a campanha foi apenas validada.
            preview:
              type: string
              description: >-
                Texto com os exemplos no lugar de cada {{n}}, como a Meta vê na
                análise.
        pending:
          type: array
          description: >-
            O que ainda falta antes do envio, como a aprovação da Meta e a
            escolha do público.
          items:
            type: string
        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.
    WhatsAppTemplateTextHeader:
      type: object
      required:
        - type
        - text
      properties:
        type:
          type: string
          const: text
        text:
          type: string
          minLength: 1
          maxLength: 60
          description: >-
            Texto simples: sem emojis, *formatação*, quebras de linha nem
            variáveis.
    WhatsAppTemplateMediaHeader:
      type: object
      required:
        - type
        - url
      properties:
        type:
          type: string
          enum:
            - image
            - video
            - document
        url:
          type: string
          format: uri
          maxLength: 512
          description: >-
            URL HTTPS pública do arquivo (imagem: JPEG ou PNG até 5 MB; vídeo:
            MP4 até 16 MB; documento: PDF até 100 MB). É enviada à Meta como
            exemplo para a análise e usada como mídia da campanha.
        filename:
          type: string
          minLength: 1
          maxLength: 255
          description: Nome do documento exibido aos clientes.
    WhatsAppCampaignVariable:
      type: object
      required:
        - example
      properties:
        example:
          type: string
          minLength: 1
          maxLength: 200
          description: >-
            Valor de exemplo que a Meta mostra a quem analisa o template.
            Obrigatório para cada {{n}}.
        fill:
          description: >-
            O que cada cliente recebe: o primeiro nome dele ou o mesmo texto
            para todos. Omita para escolher depois no editor da campanha.
          oneOf:
            - type: object
              required:
                - type
              properties:
                type:
                  type: string
                  const: first_name
                fallback:
                  type: string
                  minLength: 1
                  maxLength: 60
                  description: Enviado quando o cliente não tem nome, como "cliente".
            - type: object
              required:
                - type
                - text
              properties:
                type:
                  type: string
                  const: fixed_text
                text:
                  type: string
                  minLength: 1
                  maxLength: 200
    WhatsAppTemplateUrlButton:
      type: object
      required:
        - type
        - text
        - url
      properties:
        type:
          type: string
          const: url
        text:
          type: string
          minLength: 1
          maxLength: 25
        url:
          type: string
          format: uri
          maxLength: 2000
          description: >-
            Destino real do botão. A Bevits envia à Meta o link curto que
            rastreia os cliques.
    WhatsAppTemplateQuickReplyButton:
      type: object
      required:
        - type
        - text
      properties:
        type:
          type: string
          const: quick_reply
        text:
          type: string
          minLength: 1
          maxLength: 25
    WhatsAppTemplatePhoneButton:
      type: object
      required:
        - type
        - text
        - phone_number
      properties:
        type:
          type: string
          const: phone_number
        text:
          type: string
          minLength: 1
          maxLength: 25
        phone_number:
          type: string
          pattern: ^\+\d{8,15}$
          description: Telefone no formato internacional, como +5511999999999.
    WhatsAppTemplateCopyCodeButton:
      type: object
      required:
        - type
        - code
      properties:
        type:
          type: string
          const: copy_code
        code:
          type: string
          minLength: 1
          maxLength: 15
          description: Código do cupom que o cliente copia.
    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:
    WhatsAppCampaignDraft:
      description: >-
        Campanha validada ou salva como rascunho, com o template enviado para
        análise da Meta.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/WhatsAppCampaignDraft'
    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'
    WhatsAppCampaignValidationError:
      description: >-
        A campanha não pode ser criada. A mensagem lista todos os problemas,
        cada um com o caminho do campo, ou traz o motivo da recusa da Meta.
        Quando a loja tem vários números de WhatsApp e nenhum é o padrão, a
        mensagem lista as opções de official_account_id.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              type: validation_error
              message: >-
                The campaign has 1 problem; fix all of them and retry:

                - template.variables: The body has 2 variables but
                template.variables has 1 entry. Give exactly one per {{n}}, in
                order.
              param: template.variables
              request_id: req_07f6cdc3c20249d6afcd90b4
    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.