API Reference
PerSeo Insights REST API v1.0
Base URL
https://insights.perseodesign.com/api/v1
L'API REST di PerSeo Insights permette di avviare scansioni SEO, leggere i risultati, esportare report e gestire i token di accesso in modo programmatico. Ideale per CI/CD, monitoring automatizzato e integrazioni con tool di terze parti. La v1.0.0 aggiunge punteggi di leggibilità, analisi keyword, scansione bulk (fino a 50 URL), webhook callback e auto-fallback HTTPS/HTTP.
Per creare la tua prima API key accedi alla Dashboard, sezione API & Token.
Autenticazione
Tutti gli endpoint richiedono un Bearer token nell'header HTTP:
API Key (permanente)
Token a lunga vita creati dalla Dashboard. Iniziano con sk_live_. Usali per script, automazioni e integrazioni server-side.
JWT (sessione 24h)
Token a breve vita emessi da POST /auth/login. Usali per client interattivi che richiedono login esplicito.
Scopes disponibili
| Scope | Descrizione |
|---|---|
| read | Accesso in lettura: profilo, history, lista token |
| scan | Avvia nuove scansioni (POST /scans) |
| export | Esporta risultati (GET /scans/{id}/export/{format}) |
Rate limits
I limiti API sono allineati ai limiti del sito web. Il reset avviene ogni 24h (finestra mobile).
| Tier | Single Scan/giorno | Sitemap Scan/giorno | Crawl/giorno | Report schedulati |
|---|---|---|---|---|
| Guest (non autenticato) | 1 | 1 | - | - |
| Free (registrato) | 5 | 5 | 1 | 1 |
| Pro | 50 | 10 | 10 | 10 |
Per maggiori dettagli sui piani e le funzionalità, visita la pagina dei Prezzi.
Response format
Tutte le risposte seguono il formato standard JSON:
Successo
Errore
Auth
/api/v1/auth/login
No auth
Autentica con email/password e riceve un JWT access token (24h).
Response 200
/api/v1/auth/verify
JWT Bearer
Verifica la validita' di un JWT token.
Token management
/api/v1/tokens
scope: read
Lista tutte le API key dell'utente autenticato.
/api/v1/tokens
scope: read
Crea una nuova API key. Il token viene mostrato una sola volta.
| Campo | Tipo | Req. | Descrizione |
|---|---|---|---|
| name | string | SI | Etichetta del token (max 100 char) |
| scopes | array | NO | Default ["read"]. Valori: read, scan, export |
token nella risposta viene mostrato una sola volta. Salvalo subito in modo sicuro.
/api/v1/tokens/{id}
scope: read
Revoca (disattiva) permanentemente un'API key.
Scansioni
/api/v1/scans
scope: scan
Avvia una scansione SEO asincrona. Risponde con 202 Accepted e un scan_id da usare per il polling.
| Campo | Tipo | Req. | Descrizione |
|---|---|---|---|
| url | string | SI | URL o dominio senza protocollo (es. example.com) |
| mode | string | NO | single (default) o sitemap |
| bypass_cache | bool | NO | Forza analisi fresh ignorando la cache 60 min (default false) |
| webhook_url | string | NO | URL HTTPS su cui fare POST al completamento (body JSON con scan_id, status, result) |
Response 202 Accepted
/api/v1/scans/{scan_id}
scope: read
Recupera stato e risultati di una scansione. Fai polling ogni 2-3 secondi finche' status != "running".
running
In corso
complete
Completata
error
Fallita
stopped
Interrotta
AI Overview
Recupera l'analisi AI Overview (readiness SGE) per una scansione singolo URL gia' salvata. Il punteggio misura quanto una pagina e' ottimizzata per apparire negli AI Overview di Google, in base a dati strutturati, profondita' dei contenuti, formato degli heading e altro.
/api/v1/scans/{scan_id}/ai-overview
scope: read
Restituisce score AI Overview, grade (A-F), dettaglio dei controlli e segnali strutturati per la scansione indicata. Disponibile solo per scansioni singolo URL. Se la scansione e' precedente alla feature, ri-scansiona l'URL per generare i dati.
Parametri path
scan_id |
ID numerico della scansione da /api/v1/history o dal campo scan_id_db restituito a scansione completata. |
Campi risposta
| Campo | Descrizione |
|---|---|
ai_overview.score | Score di readiness 0-100 |
ai_overview.grade | Voto letterale da A+ a F |
ai_overview.checks | Array di controlli: label, status (pass/fail/partial), score, max_score, detail |
ai_overview.signals | Flag booleani: has_faq_schema, has_speakable, has_howto, has_article_schema, question_heading_count |
Risposta di esempio
Codici errore
404 NOT_FOUND | Scansione non trovata o di un altro utente |
422 NO_DATA | Scansione precedente alla feature AI Overview: ri-scansiona per generare i dati |
Scansione bulk
/api/v1/scans/bulk
scope: scan
Avvia scansioni parallele per più URL (fino a 50). Restituisce un batch_id per monitorare il progresso.
| Campo | Tipo | Req. | Descrizione |
|---|---|---|---|
| urls | array | SI | Array di URL/domini da scansionare (max 50) |
| mode | string | NO | single (default) |
| bypass_cache | bool | NO | Forza analisi fresh per tutti gli URL |
Response 202 Accepted
/api/v1/scans/bulk/{batch_id}
scope: read
Monitora lo stato di un batch bulk. Restituisce risultati parziali man mano che le scansioni completano.
Response (in corso)
Storico
/api/v1/history
scope: read
Storico delle scansioni dell'utente con paginazione.
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
| page | int | 1 | Numero pagina |
| per_page | int | 20 | Risultati per pagina (max 50) |
Esportazione
/api/v1/scans/{id}/export/{format}
scope: export
Esporta i risultati di una scansione. Formati supportati: json, csv, pdf.
Crawl
Avvia e monitora crawl completi di un sito. I risultati vengono restituiti in modo asincrono tramite polling.
/api/v1/crawls
scope: scan
Avvia un crawl asincrono. Restituisce subito un task_id da usare per il polling.
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| domain | string | si | Dominio o URL da crawlare |
| max_pages | int | no | Pagine massime (limite piano: Free=1000, Pro=10000) |
| max_depth | int | no | Profondita' massima (limite piano: Free=4, Pro=8) |
Response 202
/api/v1/crawls/{task_id}
scope: read
Polling status del crawl. Lo stato puo' essere running, complete, error o stopped. Al completamento include job_id e report_url.
Response (complete)
/api/v1/crawls
scope: read
Lista i crawl dell'utente autenticato (max 100).
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
| limit | int | 20 | Risultati massimi (max 100) |
Report schedulati
Crea e gestisci report SEO automatici inviati via email con cadenza settimanale o mensile.
/api/v1/scheduled-reports
scope: read
Elenca tutti i report schedulati dell'utente autenticato.
/api/v1/scheduled-reports
scope: write
Crea un nuovo report schedulato.
| Campo | Type | Obbligatorio | Descrizione |
|---|---|---|---|
| url | string | si | URL della pagina da scansionare |
| schedule_type | string | si | weekly o monthly |
| day_of_week | int | se weekly | 0 (Lun) a 6 (Dom) |
| day_of_month | int | se monthly | 1 a 28 |
| label | string | no | Etichetta opzionale |
| notify_email | string | no | Email di notifica (default: email account) |
/api/v1/scheduled-reports/{id}
scope: write
Aggiorna un report schedulato. Accetta gli stessi campi del POST.
/api/v1/scheduled-reports/{id}/toggle
scope: write
Attiva o disattiva un report schedulato (is_active).
/api/v1/scheduled-reports/{id}
scope: write
Elimina definitivamente un report schedulato.
Utente
/api/v1/user/profile
scope: read
Restituisce il profilo dell'utente autenticato.
/api/v1/user/usage
scope: read
Statistiche di utilizzo: scan oggi, richieste API, limiti del piano.
Codici di errore
| Codice | HTTP | Descrizione |
|---|---|---|
MISSING_AUTH |
401 | Header Authorization assente o malformato |
INVALID_TOKEN |
401 | Token non valido, scaduto o revocato |
INSUFFICIENT_SCOPE |
403 | Il token non ha lo scope richiesto |
INVALID_CREDENTIALS |
401 | Email/password errate |
ACCOUNT_DISABLED |
403 | Account disabilitato |
RATE_LIMIT_EXCEEDED |
429 | Limite scan o richieste superato |
INVALID_REQUEST |
400 | Parametri mancanti o malformati |
INVALID_URL |
400 | URL non valido |
INVALID_SCOPES |
400 | Scope non riconosciuti |
NOT_FOUND |
404 | Risorsa non trovata |
FORBIDDEN |
403 | Accesso negato (risorsa di un altro utente) |
INTERNAL_ERROR |
500 | Errore interno del server |