> ## 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.

# Crear campaña de WhatsApp Oficial como borrador

> Crea una campaña de WhatsApp Oficial como borrador, con una plantilla nueva, y envía la plantilla a revisión de Meta. No se envía ningún mensaje: después de la aprobación, una persona elige el público y envía la campaña en Bevits. Con validate_only, solo valida la campaña, sin guardar nada ni contactar a Meta. Cada llamada guardada envía una plantilla a Meta; no repitas una llamada que funcionó. Requiere una clave API con el alcance write.



## OpenAPI

````yaml /openapi.es.json post /v1/whatsapp-campaigns
openapi: 3.1.0
info:
  title: API de Bevits
  version: 1.0.0
  description: >-
    API pública para consultar datos de CRM, compras y automatización de una
    organización de Bevits, crear automatizaciones como borrador para revisarlas
    y activarlas, y crear campañas de WhatsApp Oficial como borrador.
  license:
    name: Proprietary
    identifier: LicenseRef-Proprietary
servers:
  - url: https://api.bevits.com
    description: Producción
security:
  - bearerAuth: []
tags:
  - name: Sistema
    description: Disponibilidad de la API.
  - name: Identidad
    description: Identidad de la organización y de la clave API.
  - name: Clientes
    description: Clientes y sus relaciones.
  - name: Segmentos
    description: Segmentos de clientes.
  - name: Compras
    description: Compras importadas desde las integraciones.
  - name: Datos del CRM
    description: Etiquetas y definiciones de atributos.
  - name: Automatizaciones
    description: Flows de automatización.
  - name: Campañas
    description: Campañas de email.
paths:
  /v1/whatsapp-campaigns:
    post:
      tags:
        - Campañas
      summary: Crear campaña de WhatsApp Oficial como borrador
      description: >-
        Crea una campaña de WhatsApp Oficial como borrador, con una plantilla
        nueva, y envía la plantilla a revisión de Meta. No se envía ningún
        mensaje: después de la aprobación, una persona elige el público y envía
        la campaña en Bevits. Con validate_only, solo valida la campaña, sin
        guardar nada ni contactar a Meta. Cada llamada guardada envía una
        plantilla a Meta; no repitas una llamada que funcionó. Requiere una
        clave API con el alcance 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: >-
        Clave única de la operación. Repetir la misma clave con el mismo cuerpo
        devuelve la respuesta original en lugar de ejecutarla de nuevo.
      schema:
        type: string
  schemas:
    WhatsAppCampaignSpec:
      type: object
      required:
        - name
        - template
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 120
          description: Nombre de la campaña en Bevits; también da nombre a la plantilla.
        official_account_id:
          type: string
          pattern: ^waa_[A-Za-z0-9_-]+$
          description: >-
            Número de WhatsApp que envía la campaña. Solo es necesario cuando la
            tienda tiene varios números y ninguno es el predeterminado; en ese
            caso, el error enumera las opciones.
        template:
          $ref: '#/components/schemas/WhatsAppCampaignTemplateSpec'
        validate_only:
          type: boolean
          default: false
          description: >-
            Si es true, solo valida la campaña y la plantilla, sin guardar nada
            ni contactar a Meta.
    WhatsAppCampaignTemplateSpec:
      type: object
      required:
        - body
      properties:
        category:
          type: string
          enum:
            - marketing
            - utility
          default: marketing
          description: >-
            Las promociones son marketing; Meta recategoriza o rechaza
            plantillas de utilidad con contenido promocional.
        language:
          type: string
          enum:
            - pt_BR
            - en_US
          default: pt_BR
        header:
          description: 'Encabezado opcional: texto o multimedia.'
          oneOf:
            - $ref: '#/components/schemas/WhatsAppTemplateTextHeader'
            - $ref: '#/components/schemas/WhatsAppTemplateMediaHeader'
        body:
          type: string
          minLength: 1
          maxLength: 1024
          description: >-
            Texto del mensaje. Acepta el formato de WhatsApp (*negrita*,
            _cursiva_) y emojis. Las variables son {{1}}, {{2}}… en orden, nunca
            al principio ni al final del texto.
        variables:
          type: array
          maxItems: 20
          default: []
          description: Una entrada por cada {{n}} del texto, en el mismo orden.
          items:
            $ref: '#/components/schemas/WhatsAppCampaignVariable'
        footer:
          type: string
          minLength: 1
          maxLength: 60
          description: Pie de página en texto simple, sin emojis, formato ni variables.
        buttons:
          type: array
          maxItems: 10
          default: []
          description: >-
            Hasta 10 botones, con un máximo de 2 de enlace, 1 de teléfono y 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 cuando la campaña solo se validó; no se guardó nada ni se envió
            a 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: >-
            Enlace de la campaña en Bevits, donde una persona elige el público y
            hace el envío.
        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: >-
                Estado de la revisión de Meta: pending, approved o rejected.
                Ausente cuando la campaña solo se validó.
            preview:
              type: string
              description: >-
                Texto con los ejemplos en lugar de cada {{n}}, como lo ve Meta
                en la revisión.
        pending:
          type: array
          description: >-
            Lo que aún falta antes del envío, como la aprobación de Meta y la
            elección del 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 antes de volver a intentarlo.
    WhatsAppTemplateTextHeader:
      type: object
      required:
        - type
        - text
      properties:
        type:
          type: string
          const: text
        text:
          type: string
          minLength: 1
          maxLength: 60
          description: 'Texto simple: sin emojis, *formato*, saltos de línea ni variables.'
    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 del archivo (imagen: JPEG o PNG hasta 5 MB; video:
            MP4 hasta 16 MB; documento: PDF hasta 100 MB). Se envía a Meta como
            ejemplo para la revisión y se usa como multimedia de la campaña.
        filename:
          type: string
          minLength: 1
          maxLength: 255
          description: Nombre del documento que ven los clientes.
    WhatsAppCampaignVariable:
      type: object
      required:
        - example
      properties:
        example:
          type: string
          minLength: 1
          maxLength: 200
          description: >-
            Valor de ejemplo que Meta muestra a quien revisa la plantilla.
            Obligatorio para cada {{n}}.
        fill:
          description: >-
            Lo que recibe cada cliente: su primer nombre o el mismo texto para
            todos. Omítelo para elegirlo después en el editor de la campaña.
          oneOf:
            - type: object
              required:
                - type
              properties:
                type:
                  type: string
                  const: first_name
                fallback:
                  type: string
                  minLength: 1
                  maxLength: 60
                  description: Se envía cuando el cliente no tiene nombre, 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 del botón. Bevits envía a Meta el enlace corto que
            rastrea los clics.
    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: Teléfono en 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 del cupón que copia el cliente.
    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: >-
        Campaña validada o guardada como borrador, con la plantilla enviada a
        revisión de Meta.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/WhatsAppCampaignDraft'
    InvalidBody:
      description: >-
        Cuerpo de la solicitud ausente, que no es un objeto JSON, o parámetro de
        ruta inválido.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: Clave API ausente, inválida, expirada o revocada.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              type: authentication_error
              message: Invalid API key.
              request_id: req_07f6cdc3c20249d6afcd90b4
    WriteScopeRequired:
      description: La clave API no tiene el permiso 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: La Idempotency-Key ya se usó con otro cuerpo de solicitud.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    WhatsAppCampaignValidationError:
      description: >-
        No se puede crear la campaña. El mensaje enumera todos los problemas,
        cada uno con la ruta del campo, o indica el motivo del rechazo de Meta.
        Cuando la tienda tiene varios números de WhatsApp y ninguno es el
        predeterminado, el mensaje enumera las opciones 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: Límite de solicitudes superado.
      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: Error inesperado en el servidor.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  headers:
    RetryAfter:
      description: Segundos antes de volver a intentarlo.
      schema:
        type: integer
        minimum: 1
    RateLimitLimit:
      description: Límite total de la ventana actual.
      schema:
        type: integer
        example: 600
    RateLimitRemaining:
      description: Solicitudes restantes en la ventana actual.
      schema:
        type: integer
        example: 599
    RateLimitReset:
      description: Instante UTC en que termina la ventana actual.
      schema:
        type: string
        format: date-time
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: bvt_live_...
      description: Clave API creada en la configuración de la organización.

````

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