← Torna alla Dashboard

Guida all'utilizzo delle API

Il microservizio Creditsafe History Gateway funge da middleware di intermediazione tra i sistemi aziendali interni e i server di Creditsafe, consentendo l'ottimizzazione del plafond licenze tramite il caching automatico dello storico delle interrogazioni.

📌 Indice degli Endpoint

1. Autenticazione

Consente di ottenere un token JWT stateless valido per 60 minuti da utilizzare per autorizzare le chiamate successive.

POST /api/auth/login

Richiesta JSON Body:

{
    "username": "admin",
    "password": "password_sicura"
}

Risposta JSON (HTTP 200 OK):

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
    "user": {
        "username": "admin",
        "role": "admin"
    }

        

1b. Cambio Password

Consente all'utente loggato tramite sessione JWT di aggiornare la propria password di accesso.

POST /api/auth/change-password

Headers di Autorizzazione (Obbligatorio):

Authorization: Bearer [JWT_TOKEN]

Richiesta JSON Body:

{
    "old_password": "password_attuale",
    "new_password": "nuova_password_sicura"
}

Risposta JSON (HTTP 200 OK):

{
    "message": "Password aggiornata con successo."
}

2. Recupero Report Aziendale

Esegue la consultazione del database storico interno. Se presente ed entro il limite di validità (CACHE_TTL_DAYS, predefinito a 365 giorni), restituisce i dati locali senza effettuare una chiamata a pagamento verso Creditsafe. In caso di cache miss, scarica automaticamente il report, aggiorna la cache e l'audit log.

GET /api/company/report

Parametri Query:

  • vat_number (Obbligatorio): Partita IVA o numero di registrazione dell'azienda (caratteri alfanumerici).
  • country (Opzionale, default: IT): Codice ISO a 2 lettere della nazione di riferimento.
  • template (Opzionale, default: full): Tipologia di report desiderata. Valori supportati:
    • full (Tutte le informazioni comprese bilanci, soci, pregiudizievoli e protesti).
    • summary (Anagrafica sintetica, score e limite di credito).
    • financial (Dati di bilancio storici ed anagrafica).
    • score (Solo classe di rischio, score locale e limite di credito).
    • onboardingnoscore (Dati anagrafici e di gruppo senza indicatori di rischio).

Headers di Autorizzazione (Fornire almeno uno dei due):

Authorization: Bearer [JWT_TOKEN]

oppure:

X-Api-Key: [API_KEY]

Risposta JSON (HTTP 200 OK):

{
    "source": "CACHE_HIT",
    "data": {
        "companySummary": {
            "businessName": "ACME Anti-Gravity Technologies S.p.A.",
            "vatNo": "07589380968",
            ...
        },
        "creditScore": { ... }
    },
    "pdf": "JVBERi0xLjQKMSAwIG9...", // Stringa Base64 del PDF del report (se disponibile)
    "updated_at": "2026-07-10 14:15:30"
}

2b. Recupero Report Aziendale Sintetico

Restituisce una versione condensata e normalizzata del report societario, contenente esclusivamente le informazioni anagrafiche principali, il punteggio di rischio, una sintesi dell'ultimo bilancio disponibile e le eventuali note/commenti negativi.

GET /api/company/report/simplified

Parametri Query:

  • vat_number (Obbligatorio): Partita IVA o numero di registrazione dell'azienda (caratteri alfanumerici).
  • country (Opzionale, default: IT): Codice ISO a 2 lettere della nazione di riferimento.
  • template (Opzionale, default: full): Tipologia di report desiderata da interrogare. Valori supportati: anag, financial, full.

Headers di Autorizzazione (Fornire almeno uno dei due):

Authorization: Bearer [JWT_TOKEN]

oppure:

X-Api-Key: [API_KEY]

Risposta JSON (HTTP 200 OK):

{
    "source": "CACHE_HIT",
    "data": {
        "ragione_sociale": "ELETTROMECCANICA FORTIN DI FORTIN MORENO & C. S.N.C.",
        "partita_iva": "01655510285",
        "codice_fiscale": "01655510285",
        "stato": "Active",
        "indirizzo": {
            "via": "VIA ELISEA 13",
            "citta": "BATTAGLIA TERME",
            "cap": "35041",
            "provincia": "PD",
            "nazione": "IT"
        },
        "natura_giuridica": "SOCIETA' IN NOME COLLETTIVO",
        "settore_attivita": "Fabbricazione di motori, generatori e trasformatori elettrici",
        "punteggio_credito": {
            "valore": "1",
            "classe": "D",
            "descrizione": "Rischio Alto",
            "limite_credito": 0,
            "valuta_limite": "EUR"
        },
        "dati_finanziari_sintetici": {
            "anno": "2025",
            "fatturato": 12500000,
            "utile_netto": 1800000,
            "ebitda": 2400000,
            "patrimonio_netto": 8500000
        },
        "note_commenti": [
            {
                "testo": "Il punteggio di rischio di questa società è diminuito da 2 a 1.",
                "tipo": "Negative"
            }
        ]
    },
    "updated_at": "2026-07-13 09:02:27"
}

3. Visualizzazione Audit Logs

Restituisce lo storico degli ultimi 100 accessi eseguiti tramite il gateway. Riservato agli utenti con ruolo admin.

GET /api/admin/audit-logs

Headers di Autorizzazione (Richiesto ruolo admin):

Authorization: Bearer [ADMIN_JWT_TOKEN]

Risposta JSON (HTTP 200 OK):

{
    "audit_logs": [
        {
            "id": 12,
            "event_type": "CACHE_HIT",
            "vat_number": "07589380968",
            "country": "IT",
            "template": "full",
            "client_identity": "apikey:client_test",
            "response_time_ms": 3,
            "created_at": "2026-07-10 14:28:10"
        },
        ...
    ]
}

3b. Consumo e Addebito Costi

Restituisce il riepilogo aggregato del numero di nuove richieste fatturabili (chiamate live a Creditsafe di tipo CACHE_MISS_LIVE) e delle richieste totali effettuate da ciascun client (identificato da API Key o da utente JWT), raggruppate per tipologia di template di report. Supporta il filtro mensile tramite parametro query.

GET /api/admin/usage?month=YYYY-MM

Parametri Query:

  • month (opzionale): Il mese di riferimento in formato YYYY-MM (es. 2026-07). Se non specificato, restituisce i dati per il mese corrente.

Headers di Autorizzazione (Richiesto ruolo admin):

Authorization: Bearer [ADMIN_JWT_TOKEN]

Risposta JSON (HTTP 200 OK):

{
    "month": "2026-07",
    "usage": [
        {
            "client_identity": "apikey:client_test",
            "template": "full",
            "paid_requests": 3,
            "total_requests": 10,
            "unit_cost": 6.00,
            "total_cost": 18.00
        },
        {
            "client_identity": "username:admin",
            "template": "financial",
            "paid_requests": 1,
            "total_requests": 1,
            "unit_cost": 1.50,
            "total_cost": 1.50
        }
    ]
}

3c. Configurazione Tariffe Personalizzate

Consente di definire e visualizzare i costi unitari addebitabili per ciascun client (API Key o utente JWT) e per ogni tipologia di report (template). Riservato agli utenti con ruolo admin.

GET /api/admin/rates

Restituisce l'elenco di tutte le tariffe personalizzate configurate a database.

Risposta JSON (HTTP 200 OK):

{
    "rates": [
        {
            "client_identity": "apikey:client_test",
            "template": "full",
            "unit_cost": 6.00
        }
    ]
}
POST /api/admin/rates

Crea o aggiorna (upsert) la tariffa unitaria addebitabile ad un client specifico per una tipologia di report.

Richiesta JSON Body:

{
    "client_identity": "apikey:client_test",
    "template": "full",
    "unit_cost": 8.50
}

Risposta JSON (HTTP 200 OK):

{
    "message": "Tariffa configurata correttamente.",
    "client_identity": "apikey:client_test",
    "template": "full",
    "unit_cost": 8.50
}

4. Statistiche Cache e Plafond

Restituisce il riepilogo globale delle interrogazioni (cache hit vs miss) e il conteggio aggiornato dei crediti plafond consumati per ciascun tipo di dataset rispetto ai limiti contrattuali (configurati via .env).

GET /api/admin/stats

Headers di Autorizzazione (Richiesto utente autenticato):

Authorization: Bearer [JWT_TOKEN]

Risposta JSON (HTTP 200 OK):

{
    "hits": 14,
    "misses": 5,
    "fallbacks": 1,
    "limits": {
        "anag": {
            "used": 2,
            "limit": 5000
        },
        "financial": {
            "used": 1,
            "limit": 200
        },
        "full": {
            "used": 2,
            "limit": 30
        }
    }
}

5. Generazione API Key Client

Consente agli amministratori di generare nuove API Key sicure da configurare all'interno degli applicativi client per consentire l'interrogazione automatizzata del gateway. La chiave viene memorizzata a DB tramite hashing SHA-256 e mostrata in chiaro esclusivamente in fase di creazione.

POST /api/admin/api-keys

Richiesta JSON Body:

{
    "client_name": "ERP-TeamSystem",
    "role": "user"
}

Risposta JSON (HTTP 201 Created):

{
    "message": "API Key generata correttamente. Salvala ora, non sarà più possibile visualizzarla.",
    "client_name": "ERP-TeamSystem",
    "api_key": "cs_key_8f12a9b34c0d12e...",
    "role": "user"
}

5b. Gestione Utenti

Consente agli amministratori di recuperare l'elenco degli utenti o di registrare nuove credenziali d'accesso.

GET /api/admin/users

Risposta JSON (HTTP 200 OK):

{
    "users": [
        {
            "id": "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",
            "username": "admin",
            "role": "admin",
            "created_at": "2026-07-10 12:00:00"
        },
        {
            "id": "f8e7d6c5-b4a3-2f1e-0d9c-8b7a6f5e4d3c",
            "username": "mario.rossi",
            "role": "user",
            "created_at": "2026-07-13 18:00:00"
        }
    ]
}
POST /api/admin/users

Richiesta JSON Body:

{
    "username": "mario.rossi",
    "password": "password_sicura_123",
    "role": "user"
}

Risposta JSON (HTTP 201 Created):

{
    "message": "Utente creato correttamente.",
    "username": "mario.rossi",
    "role": "user"
}

6. Gestione degli Errori e Cache

Le risposte di errore seguono la convenzione descritta nel file di specifica:

Stato HTTP Errore JSON Causa
400 Bad Request {"error": "Bad Request", ...} Parametri di ricerca mancanti o non formattati correttamente (es. vat_number speciale).
401 Unauthorized {"error": "Unauthorized", ...} JWT Token o API Key mancante, non valida o scaduta.
403 Forbidden {"error": "Forbidden", ...} Chiamata ad endpoint amministrativi con privilegi non sufficienti.
404 Not Found {"error": "Not Found", ...} Azienda non censita o non trovata all'interno del DB globale Creditsafe.
502 Bad Gateway {"error": "Bad Gateway", ...} Creditsafe non è raggiungibile o ha risposto con errore, e non sono presenti dati storici per il fallback.

Algoritmo di Caching:

  1. Verifica se a database esiste una tupla che corrisponde a vat_number, country e template.
  2. Se la differenza in giorni tra l'ultimo aggiornamento (updated_at) e la data corrente è inferiore a CACHE_TTL_DAYS, restituisce il record memorizzato e registra l'evento CACHE_HIT (costo Creditsafe: 0).
  3. In caso di record scaduto o non presente:
    • Interroga Creditsafe live.
    • Salva/Aggiorna il report JSON nel database (la colonna `pdf_data` è stata rimossa per ridurre lo spazio occupato dal DB, ma il PDF viene comunque scaricato live e restituito in formato Base64 nella risposta corrente).
    • Tutti i record a database (compresi log e chiavi API) utilizzano identificativi univoci **UUID** (`VARCHAR(36)`) autogenerati per garantire robustezza e scalabilità.
    • Registra l'evento CACHE_MISS_LIVE.
  4. Se Creditsafe non è raggiungibile ed esiste una copia cache scaduta a DB, il gateway restituisce quest'ultima con un avviso (CACHE_FALLBACK_EXPIRED) per garantire la continuità aziendale.