📣 Campañas masivas con /api/bulk

Rate limit, paralelismo, idempotencia y control del job.

1) Crear campaña

Envía tu lista de items. Controla el throughput con rateLimitPerMinute (default 600) y parallelism (default 5). Usa dryRun para validar sin enviar.

POST /api/bulk
Content-Type: application/json
Idempotency-Key: camp-julio-001

{
  "instanceId": 123,
  "token": "TOKEN",
  "items": [
    { "to": "573001112233", "type": "text", "message": "¡Promo de julio! 🎉" },
    { "to": "573009998877", "type": "text", "message": "Envío gratis hoy 🚚" }
  ],
  "rateLimitPerMinute": 900,
  "parallelism": 8,
  "skipOptOut": false,
  "dryRun": false
}

2) Estado del job y control

Consultar estado

GET /api/bulk/BULK_JOB_ID

Respuesta incluye status, counts (total, sent, failed, pending).

Pausar / Reanudar / Cancelar

POST /api/bulk/BULK_JOB_ID/pause
POST /api/bulk/BULK_JOB_ID/resume
POST /api/bulk/BULK_JOB_ID/cancel

3) Opt-out

Si el número existe en la tabla optouts, el ítem se marcará skipped. Puedes forzar envío con skipOptOut: true (no recomendado).