API tesserati UISP Bolognadocumentazione per i gestionali esterni

API tesserati UISP Bologna — documentazione per i client

Base URL: https://api.tex-uispbologna.app. Solo HTTPS, solo GET, solo JSON. Versione nel percorso: /v1.

Autenticazione

Ogni richiesta ai dati porta il token che vi è stato consegnato:

Authorization: Bearer tex_…

Il token identifica il vostro perimetro: quali tesserati vedete e con quali colonne. Non va mai in un browser né in un repository: è come una password. Senza token o con un token sbagliato la risposta è 401 in JSON.

Le tre richieste

Richiesta Cosa restituisce
GET /v1/tesseramento tutto il vostro perimetro: una riga per tessera
GET /v1/tesserato?cf=<codice fiscale> le righe di una persona (una per tessera, anche zero)
GET /v1/tesserato?tessera=<numero> la riga di una tessera (404 se non esiste)

L’unico parametro aggiuntivo è anno (vedi “Il 2 settembre”): qualunque altro parametro produce 400. I dati si filtrano in locale, dopo lo scarico.

Esempio:

curl -s -H "Authorization: Bearer $TOKEN" https://api.tex-uispbologna.app/v1/tesseramento
curl -s -H "Authorization: Bearer $TOKEN" "https://api.tex-uispbologna.app/v1/tesserato?tessera=270000000"

La risposta

{
  "anno_sportivo": 2027,
  "dati_aggiornati_al": "2026-09-03T02:31:37+02:00",
  "record_totali": 3328,
  "tesserati": [
    { "tessera": "270000000", "cf_socio": "…", "cognome": "…", "nome": "…", "data_nascita": "1972-08-20", "scad_certificato": null, "…": "…" }
  ]
}

Errori

Sempre JSON: {"errore": "…"}.

Codice Quando
400 parametro sconosciuto, cf e tessera insieme o nessuno dei due, anno malformato o non disponibile
401 token assente o non riconosciuto
403 anno non ammesso per il vostro token
404 tessera inesistente; oppure anno di un database che esiste ma non ha ancora ricevuto alcun caricamento
405 metodo diverso da GET
503 dati non pronti (sotto) o database non raggiungibile

Il 503 notturno: quando sincronizzare

Ogni notte la UISP regionale svuota e ricarica i dati, di norma fra l’1:30 e le 3:10. Fra le 01:00 e le 04:00, finché il caricamento di oggi non è finito, l’API risponde 503 con l’header Retry-After (secondi) e un messaggio esplicito: non serve dati a metà. Quindi:

Contate i record prima di sostituire la tabella

L’API non confronta i giorni fra loro: se un caricamento notturno della regionale fallisce a metà (raro, ma possibile), potreste ricevere 200 con molte meno righe del solito. Prima di sostituire la vostra tabella, confrontate record_totali con il numero di righe che avete già: se cala in modo anomalo, tenete i dati vecchi e riprovate il giorno dopo.

Il 2 settembre

Il 2 settembre l’API passa da sola all’anno sportivo nuovo, che quel giorno contiene poche decine di tesserati: quelli già rinnovati. Non è un errore, è l’anno nuovo. Se il vostro gestionale ha bisogno di vedere ancora l’anno vecchio durante la transizione, chiedete di essere abilitati al parametro anno:

curl -s -H "Authorization: Bearer $TOKEN" "https://api.tex-uispbologna.app/v1/tesseramento?anno=2026"

anno sceglie solo l’anno sportivo (quattro cifre, non oltre quello corrente); senza abilitazione risponde 403. Un anno precedente non ha la finestra notturna: si serve sempre.

Note pratiche

Esempio in PHP

Tutto quello che serve per chiamare l’API e vedere i dati: curl e il token in una variabile d’ambiente. Cosa farne dopo, tabella locale compresa, è affar vostro.

<?php
// esempio.php — la chiamata all'API tesserati UISP Bologna e i dati che tornano.
// Uso:  TEX_API_TOKEN=tex_… php esempio.php
// Le altre due richieste cambiano solo l'URL: /v1/tesserato?cf=… e /v1/tesserato?tessera=…

$token = getenv('TEX_API_TOKEN');
if ($token === false || $token === '') { fwrite(STDERR, "manca TEX_API_TOKEN\n"); exit(1); }

$ch = curl_init('https://api.tex-uispbologna.app/v1/tesseramento');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING       => '',                                     // accetta gzip
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $token],
]);
$corpo = curl_exec($ch);
$stato = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($corpo === false || $stato !== 200) {                             // 401: token; 503: dati non pronti, riprovare
    fwrite(STDERR, "risposta $stato: " . ($corpo === false ? curl_error($ch) : rtrim($corpo)) . "\n");
    exit(1);
}

$dati = json_decode($corpo, true);
echo "anno sportivo {$dati['anno_sportivo']}, dati aggiornati al {$dati['dati_aggiornati_al']}, record {$dati['record_totali']}\n";
echo json_encode($dati['tesserati'][0] ?? null, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), "\n";   // la prima riga, con tutte le colonne del vostro perimetro