Visão Geral
Este endpoint permite duplicar uma campanha existente, criando uma nova campanha com:
- Todas as configurações da campanha original
- Lista de contatos completa
- Mensagens e templates configurados
- Status inicial como DRAFT (rascunho)
A campanha duplicada receberá o sufixo ” (cópia)” no nome.
Requisitos
- Token de acesso válido
- ID da campanha a ser duplicada
- A campanha deve pertencer à empresa do usuário
Parâmetros
ID da campanha a ser duplicada
Cabeçalhos
Token de acesso da empresa
Exemplos de Uso
cURL
curl -X POST https://api.disparador.com/api/campaigns/123/duplicate \
-H "X-Access-Token: seu_token_aqui"
JavaScript
const response = await fetch('https://api.disparador.com/api/campaigns/123/duplicate', {
method: 'POST',
headers: {
'X-Access-Token': 'seu_token_aqui'
}
});
const duplicatedCampaign = await response.json();
console.log('Nova campanha:', duplicatedCampaign.name);
console.log('ID:', duplicatedCampaign.id);
console.log('Status:', duplicatedCampaign.status);
Python
import requests
url = "https://api.disparador.com/api/campaigns/123/duplicate"
headers = {
"X-Access-Token": "seu_token_aqui"
}
response = requests.post(url, headers=headers)
campaign = response.json()
print(f"Campanha duplicada: {campaign['name']}")
print(f"Nova ID: {campaign['id']}")
PHP
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.disparador.com/api/campaigns/123/duplicate");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-Access-Token: seu_token_aqui'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$campaign = json_decode($response, true);
echo "Campanha duplicada: " . $campaign['name'];
Resposta
Sucesso (200 OK)
A resposta segue a mesma estrutura completa do endpoint de criar/consultar campanhas:
Campos Principais
ID da nova campanha criada
Nome da campanha (original + ” (cópia)”)
Status da campanha (sempre “DRAFT”)
Tipo da campanha (TEXT, MEDIA, POLL)
Data/hora de criação da nova campanha
Estatísticas
Total de contatos duplicados
Dados da Campanha
Conteúdo da mensagem principal
Tipo de mídia (image, video, audio, document)
URL da mídia anexada (se houver)
Instância Evolution configurada
Intervalo mínimo entre mensagens
Intervalo máximo entre mensagens
Telefone para notificação
Dados da enquete (se for campanha de enquete)
Configuração Evolution completa
Exemplos de Resposta
Campanha de Texto
{
"id": 456,
"name": "Promoção Black Friday (cópia)",
"description": null,
"status": "DRAFT",
"type": "TEXT",
"createdAt": "2024-01-20T16:00:00",
"scheduledFor": null,
"startedAt": null,
"completedAt": null,
"pausedAt": null,
"totalContacts": 150,
"sentContacts": 0,
"failedContacts": 0,
"pendingContacts": 150,
"progressPercentage": 0,
"successRate": 0,
"estimatedCompletion": null,
"messageContent": "🎉 Black Friday chegou! Descontos de até 70%!",
"mediaType": null,
"mediaUrl": null,
"fileName": null,
"evolutionInstance": "whatsapp-01",
"minInterval": 5,
"maxInterval": 10,
"notificationPhone": null,
"pollData": null,
"evolutionConfig": {
"id": 1,
"name": "WhatsApp Principal",
"url": "https://evolution-api.exemplo.com",
"instance": "whatsapp-01"
}
}
{
"id": 457,
"name": "Lançamento Produto (cópia)",
"description": null,
"status": "DRAFT",
"type": "MEDIA",
"createdAt": "2024-01-20T16:00:00",
"scheduledFor": null,
"startedAt": null,
"completedAt": null,
"pausedAt": null,
"totalContacts": 200,
"sentContacts": 0,
"failedContacts": 0,
"pendingContacts": 200,
"progressPercentage": 0,
"successRate": 0,
"estimatedCompletion": null,
"messageContent": "Conheça nosso novo produto!",
"mediaType": "image",
"mediaUrl": "https://api.disparador.com/media/files/produto.jpg",
"fileName": "produto.jpg",
"evolutionInstance": "whatsapp-01",
"minInterval": 5,
"maxInterval": 10,
"notificationPhone": null,
"pollData": null,
"evolutionConfig": {
"id": 1,
"name": "WhatsApp Principal",
"url": "https://evolution-api.exemplo.com",
"instance": "whatsapp-01"
}
}
Campanha de Enquete
{
"id": 458,
"name": "Pesquisa Satisfação (cópia)",
"description": null,
"status": "DRAFT",
"type": "POLL",
"createdAt": "2024-01-20T16:00:00",
"scheduledFor": null,
"startedAt": null,
"completedAt": null,
"pausedAt": null,
"totalContacts": 100,
"sentContacts": 0,
"failedContacts": 0,
"pendingContacts": 100,
"progressPercentage": 0,
"successRate": 0,
"estimatedCompletion": null,
"messageContent": null,
"mediaType": null,
"mediaUrl": null,
"fileName": null,
"evolutionInstance": "whatsapp-01",
"minInterval": 5,
"maxInterval": 10,
"notificationPhone": null,
"pollData": {
"name": "Como você avalia nosso atendimento?",
"options": ["Excelente", "Bom", "Regular", "Ruim"],
"selectableCount": 1
},
"evolutionConfig": {
"id": 1,
"name": "WhatsApp Principal",
"url": "https://evolution-api.exemplo.com",
"instance": "whatsapp-01"
}
}
Erros Comuns
400 Bad Request
{
"message": "Campanha não encontrada"
}
403 Forbidden
{
"message": "Acesso negado"
}
401 Unauthorized
{
"message": "Access token inválido"
}
500 Internal Server Error
{
"message": "Erro ao duplicar campanha: [detalhes do erro]"
}
Observações Importantes
Comportamento da Duplicação:
- A nova campanha sempre inicia com status DRAFT
- Todos os contadores são zerados (mensagens enviadas, falhas, etc.)
- Os contatos são copiados integralmente
- As configurações de Evolution API são mantidas
- O histórico de execução não é copiado
Limites:
- Campanhas muito grandes podem demorar alguns segundos para duplicar
- Verifique se há espaço suficiente para duplicar campanhas com muitos contatos
- A duplicação não copia notificações já enviadas
Use Cases
1. Reutilizar Campanhas Sazonais
// Duplicar campanha de Natal do ano anterior
const lastYearCampaign = await getCampaign('natal-2023');
const newCampaign = await duplicateCampaign(lastYearCampaign.id);
// Atualizar mensagem e agendar
await updateCampaign(newCampaign.id, {
name: 'Natal 2024',
message: 'Feliz Natal 2024! 🎄',
scheduledFor: '2024-12-24T09:00:00',
isDraft: false
});
2. Criar Variações de Teste A/B
// Duplicar campanha para teste A/B
const originalId = 123;
const variantA = await duplicateCampaign(originalId);
const variantB = await duplicateCampaign(originalId);
// Modificar mensagens para teste
await updateCampaign(variantA.id, {
name: 'Teste A - Emoji',
message: '😍 Oferta Especial!',
isDraft: true
});
await updateCampaign(variantB.id, {
name: 'Teste B - Urgência',
message: 'ÚLTIMAS HORAS! Oferta Especial!',
isDraft: true
});
3. Templates de Campanha
// Usar campanha como template
const templateId = 789; // Campanha modelo
const campaigns = [];
for (const region of ['SP', 'RJ', 'MG']) {
const camp = await duplicateCampaign(templateId);
await updateCampaign(camp.id, {
name: `Promoção ${region}`,
contacts: await getContactsByRegion(region),
isDraft: true
});
campaigns.push(camp);
}