Guías de integración
Crear un directorio público de campañas reales
Lea el endpoint desde su servidor, exponga una respuesta limitada y enlace al recorrido real.
Antes de empezar
- Node 20+ con fetch, Python 3 con urllib o PHP con cURL y JSON en su servidor.
- Origen HTTPS del Server y país realmente disponible; esta lectura no necesita secretos de cuenta.
- Interfaz que muestre texto de forma segura y gestione resultados vacíos o no disponibles.
Elegir un tipo explícito
GET /api/public/homepage/discovery admite type=all|ticketing|voting|donation, country, q, location, status, date, sort, page y limit. El ejemplo lee entradas de Ghana, sin habilitar pagos.
Fije el destino HTTPS en el servidor. Compruebe estado HTTP y success con un tiempo máximo.
export async function readPublicCampaigns() {
const url = new URL('/api/public/homepage/discovery', 'https://api.sparkglim.net');
url.search = new URLSearchParams({ type: 'ticketing', country: 'GH', sort: 'latest', page: '1', limit: '12' }).toString();
const response = await fetch(url, { headers: { accept: 'application/json' }, signal: AbortSignal.timeout(12000) });
const payload = await response.json();
if (!response.ok || payload.success !== true || !payload.data) throw new Error(payload.error || 'Discovery unavailable');
return payload.data;
}import json
import urllib.parse
import urllib.request
def read_public_campaigns():
query = urllib.parse.urlencode({"type": "ticketing", "country": "GH", "sort": "latest", "page": "1", "limit": "12"})
request = urllib.request.Request("https://api.sparkglim.net/api/public/homepage/discovery?" + query, headers={"Accept": "application/json"})
with urllib.request.urlopen(request, timeout=12) as response:
payload = json.load(response)
if payload.get("success") is not True or not isinstance(payload.get("data"), dict):
raise RuntimeError("Discovery unavailable")
return payload["data"]<?php
function read_public_campaigns(): array {
$query = http_build_query(['type'=>'ticketing','country'=>'GH','sort'=>'latest','page'=>1,'limit'=>12], '', '&', PHP_QUERY_RFC3986);
$handle = curl_init('https://api.sparkglim.net/api/public/homepage/discovery?' . $query);
curl_setopt_array($handle, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>12, CURLOPT_HTTPHEADER=>['Accept: application/json']]);
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false || $status < 200 || $status >= 300) throw new RuntimeException($error ?: 'Discovery unavailable');
$payload = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
if (($payload['success'] ?? false) !== true || !is_array($payload['data'] ?? null)) throw new RuntimeException('Discovery unavailable');
return $payload['data'];
}Crear un proxy de lectura limitado
Guarde la función TypeScript en read-public-campaigns.ts. El siguiente ejemplo es un manejador Next.js para el directorio API previsto de su aplicación.
Use caché breve para datos públicos correctos y no-store en errores. No acepte destinos externos arbitrarios del visitante.
import { readPublicCampaigns } from './read-public-campaigns';
export async function GET() {
try {
const data = await readPublicCampaigns();
return Response.json({ success: true, data }, { headers: { 'Cache-Control': 'public, max-age=60' } });
} catch {
return Response.json({ success: false, error: 'Discovery unavailable' }, { status: 503, headers: { 'Cache-Control': 'no-store' } });
}
}Mostrar datos verdaderos
Lea data.entries, data.available y data.pagination. Una lista vacía, indisponibilidad y error son estados distintos; no los sustituya por eventos ficticios.
Muestre títulos como texto y use tipo y slug reales para entradas, votación o donaciones. Preserve país e idioma sin incrustar el pago en un iframe.
Compruebe su integración
- Comprobar datos, ausencia de resultados y error 503 sin transacciones.
- Mantener tipo, paginación, moneda, fechas y visibilidad reales.