Skip to main content
PUT
/
api
/
campaigns
/
{id}

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
number
required
ID da campanha a ser atualizada
name
string
required
Nome da campanha
message
string
Conteúdo da mensagem (obrigatório se não for enquete)
contacts
array
required
Lista de contatos para a campanha
[
  {
    "phoneNumber": "5511999887766",
    "name": "João Silva"
  }
]

Configuração Evolution API

evolutionUrl
string
required
URL completa da sua Evolution API (ex: https://evolution-api.exemplo.com)
evolutionApiKey
string
required
API Key da sua Evolution API
evolutionInstance
string
required
Nome da instância do WhatsApp conectada
evolutionConfigId
number
ID de uma configuração Evolution salva (alternativa aos campos acima)

Agendamento e Intervalos

scheduledFor
string
Data/hora para agendamento (ISO 8601)
intervalMinSeconds
number
Intervalo mínimo entre mensagens (padrão: 10)
intervalMaxSeconds
number
Intervalo máximo entre mensagens (padrão: 30)
notificationPhone
string
Telefone para notificação de conclusão

Mídia e Enquetes

mediaUrl
string
URL da mídia a ser enviada
mediaType
string
Tipo de mídia: image, video, audio, document
caption
string
Legenda para mídia (imagens e vídeos)
fileName
string
Nome do arquivo para documentos
pollData
object
Dados da enquete
{
  "name": "Pergunta da enquete",
  "options": ["Opção 1", "Opção 2"],
  "selectableCount": 1
}

Configurações Adicionais

isDraft
boolean
Se true, mantém como rascunho. Se false, inicia/agenda a campanha
isTest
boolean
Se true, marca a campanha como teste
databaseConfigId
number
ID da configuração de banco para variáveis personalizadas

Cabeçalhos

X-Access-Token
string
required
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
  })
});

Atualizar para Campanha com Mídia

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"
}

Iniciada Imediatamente

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