Guias de integração
Criar um diretório público de campanhas reais
Leia o endpoint no servidor, exponha uma resposta limitada e ligue ao percurso verdadeiro.
Antes de começar
- Node 20+ com fetch, Python 3 com urllib ou PHP com cURL e JSON no servidor.
- Origem HTTPS do Server e país realmente disponível; esta leitura não exige segredos de conta.
- Interface que apresente texto com segurança e trate resultados vazios ou indisponíveis.
Escolher um tipo explícito
GET /api/public/homepage/discovery aceita type=all|ticketing|voting|donation, country, q, location, status, date, sort, page e limit. O exemplo lê bilhética do Gana e não ativa pagamentos.
Fixe o destino HTTPS no servidor. Verifique estado HTTP e success com um tempo 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'];
}Criar um proxy de leitura limitado
Guarde a função TypeScript em read-public-campaigns.ts. O exemplo seguinte é um handler Next.js para a pasta API pretendida na sua aplicação.
Use cache curto para dados públicos bem-sucedidos e no-store nos erros. Não aceite destinos externos arbitrários do 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' } });
}
}Apresentar dados verdadeiros
Leia data.entries, data.available e data.pagination. Lista vazia, indisponibilidade e erro são estados diferentes; não os substitua por eventos fictícios.
Apresente títulos como texto e use tipo e slug reais para bilhética, votação ou donativos. Preserve país e idioma sem colocar o pagamento numa iframe.
Verifique a sua integração
- Verificar dados, ausência de resultados e erro 503 sem transações.
- Manter tipo, paginação, moeda, datas e visibilidade reais.