Skip to main content
POST
/
api
/
campaigns
/
{id}
/
duplicate
{
  "id": 123,
  "name": "<string>",
  "description": "<string>",
  "status": "<string>",
  "type": "<string>",
  "createdAt": "<string>",
  "totalContacts": 123,
  "sentContacts": 123,
  "failedContacts": 123,
  "pendingContacts": 123,
  "progressPercentage": 123,
  "successRate": 123,
  "messageContent": "<string>",
  "mediaType": "<string>",
  "mediaUrl": "<string>",
  "fileName": "<string>",
  "evolutionInstance": "<string>",
  "minInterval": 123,
  "maxInterval": 123,
  "notificationPhone": "<string>",
  "pollData": {},
  "evolutionConfig": {}
}

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
number
required
ID da campanha a ser duplicada

Cabeçalhos

X-Access-Token
string
required
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
number
ID da nova campanha criada
name
string
Nome da campanha (original + ” (cópia)”)
description
string
Descrição da campanha
status
string
Status da campanha (sempre “DRAFT”)
type
string
Tipo da campanha (TEXT, MEDIA, POLL)
createdAt
string
Data/hora de criação da nova campanha

Estatísticas

totalContacts
number
Total de contatos duplicados
sentContacts
number
Sempre 0 (nova campanha)
failedContacts
number
Sempre 0 (nova campanha)
pendingContacts
number
Igual ao totalContacts
progressPercentage
number
Sempre 0 (nova campanha)
successRate
number
Sempre 0 (nova campanha)

Dados da Campanha

messageContent
string
Conteúdo da mensagem principal
mediaType
string
Tipo de mídia (image, video, audio, document)
mediaUrl
string
URL da mídia anexada (se houver)
fileName
string
Nome do arquivo de mídia
evolutionInstance
string
Instância Evolution configurada
minInterval
number
Intervalo mínimo entre mensagens
maxInterval
number
Intervalo máximo entre mensagens
notificationPhone
string
Telefone para notificação
pollData
object
Dados da enquete (se for campanha de enquete)
evolutionConfig
object
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"
  }
}

Campanha com Mídia

{
  "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);
}
I