Criar nova campanha (Simples)

POST /sender/simple

Cria uma campanha para enviar a mesma mensagem a vários destinatários com intervalo controlado. Acompanhe a execução em GET /sender/stats.

Status de grupo: com groupStatus: true, a campanha publica a mensagem no status de cada grupo da lista, como o POST /send/status com group, em vez de mandar no chat. Todos os numbers precisam ser grupos (@g.us): se houver algum que não é, a campanha não é criada e o 400 lista quais são. Só text, image e video; em texto, background_color e font escolhem a cor e a fonte. Áudio e outros tipos retornam 400. Agendamento, pausa, cancelamento, GET /sender/listmessages e GET /sender/stats funcionam como numa campanha comum. Cada status fica registrado na conversa do grupo com messageType: "GroupStatusMessage" (no celular ele não aparece na conversa, só no status): não dá para reagir, editar, fixar nem responder a ele.

Autenticação

[
  {
    "token": []
  }
]
{
  "token": {
    "name": "token",
    "type": "apiKey",
    "in": "header"
  }
}

Corpo da requisição

{
  "required": true,
  "content": {
    "application/json": {
      "schema": {
        "type": "object",
        "required": [
          "numbers",
          "type",
          "delayMin",
          "delayMax",
          "scheduled_for"
        ],
        "properties": {
          "numbers": {
            "type": "array",
            "description": "Lista de números para envio",
            "items": {
              "type": "string"
            },
            "example": [
              "5511999999999@s.whatsapp.net"
            ]
          },
          "type": {
            "type": "string",
            "description": "Tipo da mensagem",
            "enum": [
              "text",
              "image",
              "video",
              "videoplay",
              "audio",
              "document",
              "contact",
              "location",
              "list",
              "button",
              "poll",
              "carousel"
            ]
          },
          "folder": {
            "type": "string",
            "description": "Nome da campanha de envio",
            "example": "Campanha Janeiro"
          },
          "delayMin": {
            "type": "integer",
            "description": "Delay mínimo entre mensagens em segundos",
            "minimum": 1,
            "example": 10
          },
          "delayMax": {
            "type": "integer",
            "description": "Delay máximo entre mensagens em segundos",
            "minimum": 1,
            "example": 30
          },
          "scheduled_for": {
            "type": "integer",
            "description": "Timestamp em milissegundos ou minutos a partir de agora para agendamento",
            "example": 1706198400000
          },
          "info": {
            "type": "string",
            "description": "Informações adicionais sobre a campanha"
          },
          "delay": {
            "type": "integer",
            "description": "Delay fixo entre mensagens (opcional)"
          },
          "mentions": {
            "type": "string",
            "description": "Menções na mensagem em formato JSON"
          },
          "text": {
            "type": "string",
            "description": "Texto da mensagem"
          },
          "linkPreview": {
            "type": "boolean",
            "description": "Habilitar preview de links em mensagens de texto. O preview será gerado automaticamente a partir da URL contida no texto."
          },
          "linkPreviewTitle": {
            "type": "string",
            "description": "Título personalizado para o preview do link (opcional). Vazio usa o título do link; só com espaço (`\" \"`), o preview sai sem título."
          },
          "linkPreviewDescription": {
            "type": "string",
            "description": "Descrição personalizada para o preview do link (opcional). Vazia usa a descrição do link; só com espaço (`\" \"`), o preview sai sem descrição."
          },
          "linkPreviewImage": {
            "type": "string",
            "description": "URL ou dados base64 da imagem para o preview do link (opcional)"
          },
          "linkPreviewLarge": {
            "type": "boolean",
            "description": "Se deve usar preview grande ou pequeno (opcional, padrão false)"
          },
          "file": {
            "type": "string",
            "description": "URL da mídia ou arquivo (quando type é image, video, audio, document, etc.). Com type button, a mídia do cabeçalho (imagem, vídeo ou documento)."
          },
          "docName": {
            "type": "string",
            "description": "Nome do arquivo (quando type é document, ou do documento no botão)"
          },
          "fullName": {
            "type": "string",
            "description": "Nome completo (quando type é contact)"
          },
          "phoneNumber": {
            "type": "string",
            "description": "Número do telefone (quando type é contact)"
          },
          "organization": {
            "type": "string",
            "description": "Organização (quando type é contact)"
          },
          "email": {
            "type": "string",
            "description": "Email (quando type é contact)"
          },
          "url": {
            "type": "string",
            "description": "URL (quando type é contact)"
          },
          "latitude": {
            "type": "number",
            "description": "Latitude (quando type é location)"
          },
          "longitude": {
            "type": "number",
            "description": "Longitude (quando type é location)"
          },
          "name": {
            "type": "string",
            "description": "Nome do local (quando type é location)"
          },
          "address": {
            "type": "string",
            "description": "Endereço (quando type é location)"
          },
          "footerText": {
            "type": "string",
            "description": "Texto do rodapé (quando type é list, button, poll ou carousel)"
          },
          "buttonText": {
            "type": "string",
            "description": "Texto do botão (quando type é list, button, poll ou carousel)"
          },
          "listButton": {
            "type": "string",
            "description": "Texto do botão da lista (quando type é list)"
          },
          "selectableCount": {
            "type": "integer",
            "description": "Quantidade de opções selecionáveis (quando type é poll)"
          },
          "choices": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Lista de opções (quando type é list, button, poll ou carousel). Para carousel, use formato específico com [texto], {imagem} e botões"
          },
          "groupStatus": {
            "type": "boolean",
            "description": "Publica a mensagem no status do grupo em vez de mandar no chat. Só para grupos (`@g.us`) e só `text`, `image` ou `video`.",
            "example": false
          },
          "background_color": {
            "type": "integer",
            "minimum": 1,
            "maximum": 19,
            "description": "Índice da cor de fundo do status em texto (com `groupStatus`).",
            "example": 7
          },
          "font": {
            "type": "integer",
            "enum": [
              0,
              1,
              2,
              6,
              7,
              8,
              9,
              10
            ],
            "description": "Fonte do status em texto (com `groupStatus`).",
            "example": 1
          }
        }
      }
    }
  }
}

Respostas

{
  "200": {
    "description": "campanha criada com sucesso",
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "folder_id": {
              "type": "string",
              "description": "ID único da campanha criada"
            },
            "count": {
              "type": "integer",
              "description": "Quantidade de mensagens agendadas"
            },
            "status": {
              "type": "string",
              "description": "Status da operação",
              "example": "queued"
            }
          }
        }
      }
    }
  },
  "400": {
    "description": "Erro nos parâmetros da requisição",
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "error": {
              "type": "string"
            }
          }
        }
      }
    }
  },
  "401": {
    "description": "Erro de autenticação",
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "error": {
              "type": "string"
            }
          }
        }
      }
    }
  },
  "409": {
    "description": "Conflito - campanha já existe",
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "error": {
              "type": "string"
            }
          }
        }
      }
    }
  },
  "500": {
    "description": "Erro interno do servidor",
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "error": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}

Guias relacionados

Autenticação · Erros e retries · Server URL