Manual de Usuario - API de Reportes de Clipping

Bienvenido a la documentación oficial. Esta API le permite acceder a reportes detallados de monitoreo de medios de comunicación de forma programática e integrarlos directamente en sus sistemas.

Versiónv1.0
ProtocoloHTTPS
AutenticaciónJWT (Bearer Token)
URL Base: https://clp.diuniversalcheck.net

🔐 Requisitos Previos

1. Obtener Credenciales

⚠️
IMPORTANTE: Esta es una API privada. Para acceder, debe contactar a la empresa para obtener sus credenciales. Nunca comparta estas credenciales con terceros.

Contacte al equipo de soporte para iniciar el proceso:

El equipo de soporte le proporcionará:

2. Herramientas Recomendadas

Para probar la API durante el desarrollo, recomendamos:

🔑 Autenticación (JWT)

La API utiliza JSON Web Tokens (JWT) para asegurar las peticiones. El proceso consta de dos pasos:

Paso 1: Obtener Token JWT

Intercambie sus credenciales permanentes por un token de acceso temporal.

POST /api/Auth/login

Request Body (JSON)

{
  "idUsuario": 123,
  "token": "ABC123XYZ456"
}

Respuesta Exitosa (200 OK)

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1laWQiOiIxMjMi...",
  "expiration": "2025-11-20T16:45:00",
  "idUsuario": 123,
  "codigoEmpresa": 5
}
ℹ️
Ciclo de Vida del Token: El token recibido es válido por 8 HORAS. Debe implementar una lógica en su aplicación para renovar el token (haciendo login nuevamente) antes de que expire.

Paso 2: Usar el Token en Peticiones

Todas las peticiones a los endpoints de reportes deben incluir el token obtenido en el header Authorization.

Formato del Header:

Authorization: Bearer {pegar_token_aqui}

Ejemplo:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

📡 Endpoints Disponibles

El recurso principal es el Reporte General. Puede acceder a él mediante POST (para consultas que requieran un cuerpo más complejo en el futuro).

2. Obtener Reporte de Clipping (POST)

Alternativa al GET. Los parámetros se envían en el cuerpo de la petición en formato JSON.

POST /api/v1/Reporte/reporte-general

Request Body (JSON)

{
  "pFechaInicial": "2025-11-20",
  "pFechaFinal": "2025-11-20",
  "pTipoMedio": "1,2,3"
}

📊 Parámetros y Valores Referenciales

Formato de Fechas

El formato requerido para todas las fechas es YYYY-MM-DD (ISO 8601).

Correcto: 2025-11-20
Incorrecto: 20/11/2025

Tipos de Medio (pTipoMedio)

Utilice los siguientes IDs para filtrar por tipo de medio. Puede combinar varios separándolos por comas (ej: 1,3).

Valor (ID) Descripción
'1'Televisión
'2'Radio
'3'Prensa Escrita
'4'Digital/Web
Vacío/NullTodos los medios (Default)

Validaciones y Reglas de Negocio

💻 Ejemplos de Integración

A continuación, se presentan ejemplos prácticos en los lenguajes de programación más comunes.

💡 Recurde reemplazar ABC123XYZ456 y {pegar_token_aqui} con sus credenciales reales.

cURL (Terminal)

1. Login y obtención del token

curl -X POST https://clp.diuniversalcheck.net/api/Auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "idUsuario": 123,
    "token": "ABC123XYZ456"
  }'

2. Obtener Reporte (Usando el token obtenido)

curl -X GET "https://clp.diuniversalcheck.net/api/v1/Reporte/reporte-general?pFechaInicial=2025-11-20&pFechaFinal=2025-11-20&pTipoMedio=1" \
  -H "Authorization: Bearer {pegar_token_aqui}"

JavaScript / Node.js (Fetch API)

// 1. Función para hacer Login
async function login() {
  const response = await fetch('https://clp.diuniversalcheck.net/api/Auth/login', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      idUsuario: 123,
      token: 'ABC123XYZ456' // SUS CREDENCIALES
    })
  });
  const data = await response.json();
  return data.token;
}

// 2. Función para Obtener Reporte
async function obtenerReporte(jwtToken) {
  const params = new URLSearchParams({
    pFechaInicial: '2025-11-20',
    pFechaFinal: '2025-11-20',
    pTipoMedio: '1'
  });
  
  const response = await fetch(
    `https://clp.diuniversalcheck.net/api/v1/Reporte/reporte-general?${params}`,
    {
      headers: {
        'Authorization': `Bearer ${jwtToken}` // Inyectar el token
      }
    }
  );
  return await response.json();
}

// Uso del flujo
const token = await login();
const reportes = await obtenerReporte(token);
console.log(reportes);

Python (Requests)

import requests

# 1. Login
def login():
    url = 'https://clp.diuniversalcheck.net/api/Auth/login'
    data = { 'idUsuario': 123, 'token': 'ABC123XYZ456' }
    response = requests.post(url, json=data)
    return response.json()['token']

# 2. Obtener Reporte
def obtener_reporte(jwt_token):
    url = 'https://clp.diuniversalcheck.net/api/v1/Reporte/reporte-general'
    headers = { 'Authorization': f'Bearer {jwt_token}' }
    params = {
        'pFechaInicial': '2025-11-20',
        'pFechaFinal': '2025-11-20',
        'pTipoMedio': '1'
    }
    response = requests.get(url, headers=headers, params=params)
    return response.json()

# Uso
token = login()
print(f"Token obtenido: {token[:20]}...")
reportes = obtener_reporte(token)
print(reportes)

(Nota: Se han omitido los ejemplos de C# y PHP por brevedad en esta vista, pero deberían seguir la misma estructura visual en la implementación final).

📋 Códigos de Respuesta HTTP

✅ Respuestas Exitosas

200 OK: La petición fue procesada correctamente. Devuelve un array JSON con los reportes.

[
  {
    "id": 1,
    "fecha": "2025-11-20T10:30:00",
    "medio": "Canal 1",
    "tipoMedio": "Televisión",
    "titulo": "Noticia de ejemplo",
    "contenido": "Resumen de la noticia...",
    "url": "https://ejemplo.com/noticia",
    ...
  }
]

❌ Respuestas de Error

Código Descripción Causa Común
400 Bad Request Parámetros inválidos. Formato de fecha erróneo, rango de fechas > 90 días, o fecha inicial > final.
401 Unauthorized No autenticado. Token JWT faltante, inválido, o expirado (más de 60 min).
429 Too Many Requests Límite excedido. Ha superado el límite de peticiones por minuto permitido.
500 Internal Server Error Error del servidor. Problema inesperado en el backend. Contacte a soporte.

⚠️ Límites y Restricciones (Rate Limiting)

Para asegurar la estabilidad del servicio, la API implementa límites de uso estrictos.

Límite: 3 peticiones por minuto

Cada usuario puede realizar un máximo de 3 peticiones a los endpoints de reportes en una ventana móvil de 60 segundos.

¿Qué pasa si excedo el límite?

Recibirá una respuesta 429 Too Many Requests. El cuerpo de la respuesta indicará cuánto tiempo debe esperar.

{
  "error": "Límite de peticiones excedido",
  "message": "Has superado el límite. Intenta nuevamente en 45 segundos.",
  "retryAfter": 45
}
Recomendación: Implemente en su código una lógica de "backoff" o espera automática si recibe un error 429, utilizando el valor de retryAfter.

🔧 Solución de Problemas Comunes

Recibo constantemente "401 Unauthorized"

El token JWT expira cada 60 minutos. Asegúrese de que su código solicite un nuevo token al endpoint /api/Auth/login si recibe un 401, o preventivamente cada 55 minutos.

Error "SSL certificate problem" en desarrollo local

Esto ocurre si su entorno local no confía en el certificado SSL de la API. En entornos de desarrollo solamente, puede deshabilitar temporalmente la verificación SSL en su cliente HTTP (ej. en Postman: Settings → OFF "SSL certificate verification"). ⚠️ Nunca haga esto en producción.

Error 400 en las fechas

Verifique que está enviando el formato exacto YYYY-MM-DD (ej. 2025-01-30) y no otros formatos como DD/MM/YYYY.


📞 Soporte y Preguntas Frecuentes

Contacto Técnico

Si encuentra problemas no cubiertos en esta documentación, contacte a nuestro equipo.

  • Email: soporte.clientes@diuniversalcheck.net
  • Horario: Lunes a Viernes, 9:00 AM - 6:00 PM

Al contactar, incluya:

  • Su ID de Usuario.
  • El código de error HTTP recibido.
  • La fecha y hora aproximada del fallo.
  • Un ejemplo de la petición que falla.

FAQ Rápido

¿Puedo compartir mi token o credenciales con otros desarrolladores?

No. Cada usuario debe tener sus propias credenciales. El uso compartido puede llevar a bloqueos de cuenta por exceder los límites de velocidad combinados.

¿Puedo consultar más de 90 días de datos?

No en una sola petición. Si necesita un rango mayor, su aplicación debe realizar múltiples peticiones dividiendo el rango en bloques de 90 días.