Skip to main content

Rivalwin API — Meta Political Ads

Descripción general

La API de Meta Political permite generar informes de publicidad política en la plataforma Meta (Facebook, Instagram) de forma programática. Los informes analizan los anuncios políticos de un rival durante un período determinado, proporcionando datos de creatividades, copys, inversión estimada, segmentación y análisis de IA.

Base URL: https://rivalwin.com/api/v1/meta/political/


Autenticación

Todas las peticiones requieren una API Key válida enviada en el header X-API-Key.

X-API-Key: tu_api_key_aqui

Rate Limiting

La API aplica dos tipos de limitación:

Rate limit por hora

Cada API Key tiene un límite de peticiones por hora configurado. Los headers de respuesta indican el estado:

X-RateLimit-Limit-Hour: 600
X-RateLimit-Remaining-Hour: 598

Si se excede el límite: 429 Too Many Requests con header Retry-After.

Cooldown entre informes

Existe un tiempo mínimo de espera entre la creación de informes consecutivos (por defecto 10 segundos, configurable por plan/empresa). Si intentas crear un informe antes de que transcurra este tiempo:

{
"error": "cooldown_active",
"message": "Please wait 7 seconds before creating another report.",
"cooldown_seconds": 10,
"retry_after": 7
}

Requisitos de la cuenta

  • Su cuenta de Rivalwin debe estar activa.
  • El plan contratado debe estar activo y no vencido (contrato o trial).
  • El plan debe incluir acceso a la API.

Si alguna de estas condiciones no se cumple, recibirás un error 403 Forbidden con el motivo específico.


Recepción de resultados

Existen dos formas de recibir los datos de un informe completado:

Polling

Consulta el endpoint report_status periódicamente (cada 15-30 segundos) hasta que el estado sea DONE. Es el método más simple y no requiere configuración adicional.

Webhook

Configura una URL de webhook en el módulo Integraciones & API Keys del sistema. Cuando un informe pase al estado DONE, la API enviará automáticamente un POST a la URL configurada con el payload completo del informe (mismo contenido que devuelve report_status en estado DONE).

De esta forma no necesitas hacer polling: simplemente esperas a recibir la notificación en tu servidor.


Endpoints

1. Crear un nuevo informe (new_report)

Crea un informe de publicidad política de Meta de forma asíncrona. La API devuelve inmediatamente un hash identificador que debes usar para consultar el estado del informe.

POST /api/v1/meta/political/new_report

Headers

HeaderTipoRequeridoDescripción
X-API-KeystringTu API Key
Idempotency-KeystringNoClave de idempotencia para evitar informes duplicados
Content-Typestringapplication/json

Body (JSON)

ParámetroTipoRequeridoDescripción
rival_refstringReferencia del rival
date_fromstringFecha inicio del período (formato YYYY-MM-DD)
date_tostringFecha fin del período (formato YYYY-MM-DD)
countrystringISO-2 (ES, AR, EU, etc.)

Ejemplo de petición

curl -X POST https://rivalwin.com/api/v1/meta/political/new_report \
-H "X-API-Key: tu_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: unique-key-123" \
-d '{
"rival_ref": "rvl_8f3b2c4a",
"date_from": "2026-03-01",
"date_to": "2026-03-31",
"country": "AR"
}'

Respuesta exitosa (202 Accepted)

{
"hash": "...",
"status": "PENDING",
"created_at": "2026-03-15 10:30:00"
}

Validaciones y restricciones

ReglaDetalle
Rango máximo de fechas60 días
Fecha fin máximaAyer (no se permite el día actual ni futuro)
Fecha inicio mínimaHasta 1 año atrás
Formato de fechaYYYY-MM-DD estricto
PaísCódigo ISO de 2 letras
CréditosSe descuentan al crear el informe

Idempotencia

Si envías el header Idempotency-Key con un valor que ya fue usado, la API devuelve el informe existente sin crear uno nuevo ni descontar créditos adicionales.


2. Consultar estado del informe (report_status)

Consulta el estado de un informe creado previamente. Cuando el informe está completado, devuelve los datos del reporte completo.

POST /api/v1/meta/political/report_status

Headers requeridos

HeaderTipoRequeridoDescripción
X-API-KeystringTu API Key
Content-Typestringapplication/json

Body (JSON)

ParámetroTipoRequeridoDescripción
hashstringHash del informe (obtenido de new_report)

Ejemplo de petición

curl -X POST https://rivalwin.com/api/v1/meta/political/report_status \
-H "X-API-Key: tu_api_key" \
-H "Content-Type: application/json" \
-d '{"hash": "..."}'

Respuesta según estado

PENDING — El informe está en cola:

{
"hash": "...",
"status": "PENDING",
"created_at": "2026-03-15 10:30:00",
"message": "The report is queued and will start processing shortly."
}

PROCESSING — El informe se está generando:

{
"hash": "...",
"status": "PROCESSING",
"created_at": "2026-03-15 10:30:00",
"started_at": "2026-03-15 10:30:05",
"message": "The report is being generated. Please check back in a few moments."
}

DONE — El informe está completo:

{
"hash": "...",
"status": "DONE",
"created_at": "2026-03-15 10:30:00",
"started_at": "2026-03-15 10:30:05",
"completed_at": "2026-03-15 10:31:20",
"report": {
"rival_name": "Candidato Ejemplo",
"campaign_start": "2026-03-01",
"campaign_end": "2026-03-31",
"country": "AR",
"kpis": {
"ads_total": 45,
"investment_min_ars": 150000,
"investment_max_ars": 320000,
"investment_min_usd": 150,
"investment_max_usd": 320,
"investment_min_eur": 138,
"investment_max_eur": 295,
"impressions_lower": 500000,
"impressions_upper": 1000000
},
"ads": [
{
"ad_id": "123456789",
"start_date": "2026-03-05",
"end_date": "2026-03-20",
"content": "Texto del anuncio político...",
"image_url": "https://...",
"video_url": null,
"platforms": ["facebook", "instagram"],
"demographics": {
"age": "25-54",
"gender": "All"
},
"regions": ["Buenos Aires", "Córdoba"],
"spend_min": 5000,
"spend_max": 10000,
"impressions_lower": 10000,
"impressions_upper": 50000
}
],
"gpt_analysis": {
"summary": "Análisis generado por IA sobre la estrategia publicitaria...",
"key_messages": ["Mensaje clave 1", "Mensaje clave 2"],
"tone": "Persuasivo y emocional",
"target_audience": "Adultos 25-54, zonas urbanas"
},
"pdf_url": "https://.../report_1234.pdf"
}
}

ERROR — Ocurrió un error durante la generación:

{
"hash": "...",
"status": "ERROR",
"created_at": "2026-03-15 10:30:00",
"completed_at": "2026-03-15 10:31:00",
"error_message": "Report failed during processing."
}

Campos del reporte (report)

CampoTipoDescripción
rival_namestringNombre del rival analizado
campaign_startstringFecha inicio del período analizado
campaign_endstringFecha fin del período analizado
countrystringPaís filtrado
kpisobjectIndicadores clave (ver tabla inferior)
adsarrayLista de anuncios encontrados en el período
gpt_analysisobjectAnálisis de IA sobre la estrategia publicitaria
pdf_urlstringURL firmada para descargar informe

KPIs disponibles

KPITipoDescripción
ads_totalintegerCantidad total de anuncios en el período
investment_min_arsnumberInversión mínima estimada (ARS)
investment_max_arsnumberInversión máxima estimada (ARS)
investment_min_usdnumberInversión mínima estimada (USD)
investment_max_usdnumberInversión máxima estimada (USD)
investment_min_eurnumberInversión mínima estimada (EUR)
investment_max_eurnumberInversión máxima estimada (EUR)
impressions_lowerintegerLímite inferior de impresiones estimadas
impressions_upperintegerLímite superior de impresiones estimadas

Campos de cada anuncio (ads[])

CampoTipoDescripción
ad_idstringID del anuncio en Meta Ad Library
start_datestringFecha de inicio del anuncio
end_datestringFecha de finalización (o última vez visto)
contentstringTexto/copy del anuncio
image_urlstringURL de la imagen del anuncio (puede ser null)
video_urlstringURL del video del anuncio (puede ser null)
platformsarrayPlataformas donde se mostró (facebook, instagram)
demographicsobjectSegmentación demográfica (edad, género)
regionsarrayRegiones geográficas donde se mostró
spend_minnumberInversión mínima del anuncio
spend_maxnumberInversión máxima del anuncio
impressions_lowerintegerImpresiones mínimas estimadas
impressions_upperintegerImpresiones máximas estimadas

Ejemplos de código

PHP

<?php
$apiKey = "tu_api_key";
$baseUrl = "https://rivalwin.com/api/v1/meta/political";

$rivalRef = "rvl_8f3b2c4a";

// 1. Crear informe
$report = apiCall("$baseUrl/new_report", [
'rival_ref' => $rivalRef,
'date_from' => '2026-03-01',
'date_to' => '2026-03-31',
'country' => 'AR',
], $apiKey);

$hash = $report['hash'];
echo "Informe creado: $hash\n";

// 2. Polling hasta que esté listo
do {
sleep(15);
$status = apiCall("$baseUrl/report_status", ['hash' => $hash], $apiKey);
echo "Estado: " . $status['status'] . "\n";
} while (in_array($status['status'], ['PENDING', 'PROCESSING']));

// 3. Obtener resultado
if ($status['status'] === 'DONE') {
$report = $status['report'];
echo "Anuncios encontrados: " . $report['kpis']['ads_total'] . "\n";
echo "Inversión estimada: $" . $report['kpis']['investment_min_usd'] . " - $" . $report['kpis']['investment_max_usd'] . "\n";
}

function apiCall(string $url, array $body, string $apiKey): array {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($body),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-API-Key: ' . $apiKey,
],
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}

Códigos de error

Código HTTPErrorDescripción
400missing_parametersFaltan parámetros requeridos
400invalid_date_fromFormato de fecha_from inválido
400invalid_date_toFormato de fecha_to inválido
400invalid_date_rangeRango de fechas inválido (futuro, invertido, >60 días)
400invalid_countryCódigo de país inválido
401missing_api_keyNo se envió el header X-API-Key
401invalid_api_keyLa API Key no es válida o está revocada
402insufficient_creditsCréditos insuficientes para generar el informe
403account_inactiveLa cuenta de la empresa está desactivada
403plan_inactiveEl plan contratado está desactivado
403contract_expiredEl contrato ha expirado
403trial_expiredEl período de prueba ha expirado
403api_not_in_planEl plan no incluye acceso a la API
404rival_not_foundEl rival_ref no existe o está inactivo
404job_not_foundNo se encontró un informe con el hash proporcionado
429rate_limit_exceededSe excedió el límite de peticiones por hora
429cooldown_activeDebe esperar antes de crear otro informe
500internal_errorError interno del servidor

Notas importantes

  • Los informes se generan de forma asíncrona. El endpoint new_report devuelve inmediatamente con un hash y el informe se procesa en segundo plano.
  • El tiempo de generación típico es de 1 a 3 minutos, dependiendo del volumen de anuncios del rival.
  • Cada informe consume créditos según el sistema.