Visão Geral
Este endpoint permite atualizar uma campanha que esteja com status DRAFT (rascunho). Você pode modificar:
- Nome e descrição
- Lista de contatos
- Mensagem e mídia
- Intervalos de envio
- Agendamento
- Telefone de notificação
- Configurações da Evolution API
Requisitos
- Token de acesso válido
- ID da campanha a ser atualizada
- A campanha deve estar em status DRAFT
- A campanha deve pertencer à empresa do usuário
Parâmetros
ID da campanha a ser atualizada
Conteúdo da mensagem (obrigatório se não for enquete)
Lista de contatos para a campanha[
{
"phoneNumber": "5511999887766",
"name": "João Silva"
}
]
Configuração Evolution API
API Key da sua Evolution API
Nome da instância do WhatsApp conectada
ID de uma configuração Evolution salva (alternativa aos campos acima)
Agendamento e Intervalos
Data/hora para agendamento (ISO 8601)
Intervalo mínimo entre mensagens (padrão: 10)
Intervalo máximo entre mensagens (padrão: 30)
Telefone para notificação de conclusão
Mídia e Enquetes
URL da mídia a ser enviada
Tipo de mídia: image, video, audio, document
Legenda para mídia (imagens e vídeos)
Nome do arquivo para documentos
Dados da enquete{
"name": "Pergunta da enquete",
"options": ["Opção 1", "Opção 2"],
"selectableCount": 1
}
Configurações Adicionais
Se true, mantém como rascunho. Se false, inicia/agenda a campanha
Se true, marca a campanha como teste
ID da configuração de banco para variáveis personalizadas
Cabeçalhos
Token de acesso da empresa
Exemplos de Uso
Atualizar e Manter como Rascunho
const response = await fetch('https://api.disparador.com/api/campaigns/123', {
method: 'PUT',
headers: {
'X-Access-Token': 'seu_token_aqui',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Campanha Atualizada',
message: 'Nova mensagem da campanha',
evolutionUrl: 'https://evolution-api.exemplo.com',
evolutionApiKey: 'sua-api-key',
evolutionInstance: 'whatsapp-01',
contacts: [
{ phoneNumber: '5511999887766', name: 'João' },
{ phoneNumber: '5511999887777', name: 'Maria' }
],
intervalMinSeconds: 5,
intervalMaxSeconds: 20,
isDraft: true
})
});
Atualizar e Iniciar Campanha
const response = await fetch('https://api.disparador.com/api/campaigns/123', {
method: 'PUT',
headers: {
'X-Access-Token': 'seu_token_aqui',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Promoção Relâmpago',
message: '⚡ Oferta válida apenas hoje!',
evolutionUrl: 'https://evolution-api.exemplo.com',
evolutionApiKey: 'sua-api-key',
evolutionInstance: 'whatsapp-01',
contacts: contactList,
isDraft: false // Inicia imediatamente
})
});
Atualizar usando Configuração Salva
const response = await fetch('https://api.disparador.com/api/campaigns/123', {
method: 'PUT',
headers: {
'X-Access-Token': 'seu_token_aqui',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Campanha com Config Salva',
message: 'Usando configuração Evolution predefinida',
evolutionConfigId: 5, // Usa configuração salva ao invés de especificar URL/Key/Instance
contacts: customerList,
isDraft: false
})
});
Atualizar e Agendar
const response = await fetch('https://api.disparador.com/api/campaigns/123', {
method: 'PUT',
headers: {
'X-Access-Token': 'seu_token_aqui',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Lembrete Agendado',
message: 'Não esqueça do nosso evento amanhã!',
evolutionUrl: 'https://evolution-api.exemplo.com',
evolutionApiKey: 'sua-api-key',
evolutionInstance: 'whatsapp-01',
contacts: eventParticipants,
scheduledFor: '2024-01-21T09:00:00',
isDraft: false
})
});
const response = await fetch('https://api.disparador.com/api/campaigns/123', {
method: 'PUT',
headers: {
'X-Access-Token': 'seu_token_aqui',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Lançamento com Vídeo',
message: 'Confira nosso novo produto em ação!',
mediaUrl: 'https://example.com/video.mp4',
mediaType: 'video',
caption: 'Novo produto revolucionário',
evolutionUrl: 'https://evolution-api.exemplo.com',
evolutionApiKey: 'sua-api-key',
evolutionInstance: 'whatsapp-01',
contacts: customerList,
isDraft: true
})
});
Atualizar para Enquete
const response = await fetch('https://api.disparador.com/api/campaigns/123', {
method: 'PUT',
headers: {
'X-Access-Token': 'seu_token_aqui',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Pesquisa de Satisfação',
pollData: {
name: 'Como você avalia nosso atendimento?',
options: ['Excelente', 'Bom', 'Regular', 'Ruim'],
selectableCount: 1
},
evolutionUrl: 'https://evolution-api.exemplo.com',
evolutionApiKey: 'sua-api-key',
evolutionInstance: 'whatsapp-01',
contacts: clientList,
isDraft: false
})
});
Resposta
A estrutura de resposta segue o mesmo padrão do endpoint de criação de campanhas.
Sucesso (200 OK)
Mantida como Rascunho
{
"id": 123,
"name": "Campanha Atualizada",
"description": null,
"status": "DRAFT",
"type": "TEXT",
"createdAt": "2024-01-20T10:30:00",
"scheduledFor": null,
"totalContacts": 50,
"sentContacts": 0,
"failedContacts": 0,
"pendingContacts": 50,
"progressPercentage": 0,
"successRate": 0,
"messageContent": "Nova mensagem da campanha",
"mediaType": null,
"mediaUrl": null,
"fileName": null,
"evolutionInstance": "whatsapp-01",
"minInterval": 5,
"maxInterval": 20,
"notificationPhone": null,
"pollData": null,
"evolutionConfig": {
"id": 1,
"name": "WhatsApp Principal",
"url": "https://evolution-api.exemplo.com",
"instance": "whatsapp-01"
},
"message": "Campanha atualizada com sucesso"
}
{
"id": 123,
"name": "Promoção Relâmpago",
"description": null,
"status": "ACTIVE",
"type": "TEXT",
"createdAt": "2024-01-20T10:30:00",
"startedAt": "2024-01-20T16:30:00",
"scheduledFor": null,
"totalContacts": 100,
"sentContacts": 0,
"failedContacts": 0,
"pendingContacts": 100,
"progressPercentage": 0,
"successRate": 0,
"messageContent": "⚡ Oferta válida apenas hoje!",
"mediaType": null,
"mediaUrl": null,
"fileName": null,
"evolutionInstance": "whatsapp-01",
"minInterval": 10,
"maxInterval": 30,
"notificationPhone": null,
"pollData": null,
"evolutionConfig": {
"id": 1,
"name": "WhatsApp Principal",
"url": "https://evolution-api.exemplo.com",
"instance": "whatsapp-01"
}
}
Agendada
{
"id": 123,
"name": "Lembrete Agendado",
"description": null,
"status": "SCHEDULED",
"type": "TEXT",
"createdAt": "2024-01-20T10:30:00",
"scheduledFor": "2024-01-21T09:00:00",
"totalContacts": 75,
"sentContacts": 0,
"failedContacts": 0,
"pendingContacts": 75,
"progressPercentage": 0,
"successRate": 0,
"messageContent": "Não esqueça do nosso evento amanhã!",
"mediaType": null,
"mediaUrl": null,
"fileName": null,
"evolutionInstance": "whatsapp-01",
"minInterval": 10,
"maxInterval": 30,
"notificationPhone": null,
"pollData": null,
"evolutionConfig": {
"id": 1,
"name": "WhatsApp Principal",
"url": "https://evolution-api.exemplo.com",
"instance": "whatsapp-01"
}
}
Erros Comuns
400 Bad Request - Campanha não encontrada
{
"message": "Campanha não encontrada"
}
403 Forbidden - Acesso negado
{
"message": "Acesso negado"
}
400 Bad Request - Status inválido
{
"message": "Apenas campanhas em rascunho podem ser editadas"
}
400 Bad Request - Validação
{
"message": "Mensagem é obrigatória quando não for enquete ou rascunho"
}
Validações
Regras de Validação:
- Nome é sempre obrigatório
- Mensagem é obrigatória exceto para enquetes ou quando
isDraft = true
- Intervalos devem respeitar: 1 ≤ min ≤ 300 e min ≤ max ≤ 600
- Para enquetes,
pollData
deve ter no mínimo 2 opções e no máximo 10
- Contatos bloqueados são automaticamente filtrados
- Evolution API deve ter credenciais válidas ou evolutionConfigId válido
Limitações:
- Apenas campanhas em status DRAFT podem ser atualizadas
- Após iniciar, a campanha não pode mais ser editada
- Máximo de 600 segundos (10 minutos) para intervalo entre mensagens
Fluxo de Trabalho
1. Criar e Refinar Rascunho
// Criar rascunho inicial
const draft = await createCampaign({
name: 'Campanha Inicial',
message: 'Texto básico',
evolutionUrl: 'https://evolution-api.exemplo.com',
evolutionApiKey: 'sua-api-key',
evolutionInstance: 'whatsapp-01',
contacts: [],
isDraft: true
});
// Refinar mensagem
await updateCampaign(draft.id, {
message: 'Mensagem melhorada com emojis 🎉',
isDraft: true
});
// Adicionar contatos
await updateCampaign(draft.id, {
contacts: await loadContacts(),
isDraft: true
});
// Finalmente, iniciar
await updateCampaign(draft.id, {
isDraft: false
});
2. Converter Tipos de Campanha
// Converter de texto para mídia
await updateCampaign(campaignId, {
mediaUrl: 'https://example.com/promo.jpg',
mediaType: 'image',
caption: 'Super promoção!',
isDraft: true
});
// Converter para enquete
await updateCampaign(campaignId, {
pollData: {
name: 'Qual seu sabor favorito?',
options: ['Chocolate', 'Morango', 'Baunilha'],
selectableCount: 1
},
isDraft: true
});
3. Preparar Campanha Complexa
// Atualizar com variáveis personalizadas
await updateCampaign(campaignId, {
message: 'Olá {PrimeiroNome}, sua fatura de {{valor}} vence em {{data}}',
databaseConfigId: 123,
contacts: clientsWithCustomData,
isDraft: true
});
// Revisar e agendar
await updateCampaign(campaignId, {
scheduledFor: '2024-02-01T08:00:00',
notificationPhone: '5511999887766',
isDraft: false
});