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
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 |