API Trovavio
Analizza i tuoi siti dal tuo codice
Lanci l'analisi di un sito, rileggi i punteggi in JSON e fai scrivere a Trovavio titoli e descrizioni migliori. È quello che fai dalla dashboard, ma da uno script, da una pipeline di rilascio o dal tuo gestionale. Quattro endpoint REST, dal piano Pro. Base URL https://trovavio.com
- Disponibile dal piano
- Pro
- Chiamate al mese, Pro
- 500
- Chiamate al mese, Agenzia
- 2.000
- Endpoint, in JSON
- 4
Salta a
Cosa puoi fare con l'API
Sei usi che tornano, dai più semplici ai più completi. Su ogni scheda trovi gli endpoint che servono.
-
Rileggere i punteggi ogni notte
Un cron chiede l'elenco dei siti e scrive i punteggi dove li guardi già: un foglio, un database, il tuo cruscotto.
GET /sites -
Fermare un rilascio che peggiora il sito
Dopo ogni pubblicazione la pipeline lancia l'analisi e interrompe la build se il punteggio scende sotto la soglia o compare un problema grave.
POST /audit -
Avvisare il team quando un sito perde punti
Confronti il punteggio con quello dell'analisi precedente e, se è calato, mandi un messaggio su Slack o una email.
GET /sites -
Portare i problemi nel tuo gestionale
Ogni problema arriva con titolo, gravità, spiegazione e pagine interessate: lo trasformi in un'attività su Jira, Notion o Trello.
GET /sites/:domain -
Far scrivere i testi all'AI
Per un sito già analizzato chiedi titolo, descrizione, H1, testi alternativi, dati strutturati, FAQ o llms.txt, pronti da rivedere e pubblicare.
POST /ai -
Analizzare un cliente appena arriva
Quando aggiungi un sito nel tuo CRM, lanci la prima analisi e hai subito il punteggio da citare nella proposta.
POST /auditGET /sites/:domain
Cosa l'API non fa. Analizza e propone, non modifica il sito: per applicare le correzioni su WordPress c'è il plugin Trovavio. Non genera il report in PDF, che si scarica dalla dashboard, non gestisce team, etichette o marchio bianco e non manda webhook: i risultati si leggono quando servono.
Tre esempi pronti da copiare
Sono script completi. Cambia il dominio, metti la chiave nella variabile TROVAVIO_KEY e girano.
Serve curl e jq. Analizza tutto il sito, stampa i problemi gravi e termina con errore se il punteggio è sotto la soglia. La scansione di un sito intero può durare qualche minuto: il timeout è di 300 secondi.
#!/usr/bin/env bash
set -euo pipefail
SOGLIA=70
RISPOSTA=$(curl -sS --max-time 300 -X POST https://trovavio.com/api/v1/audit \
-H "Authorization: Bearer $TROVAVIO_KEY" \
-H "Content-Type: application/json" \
-d '{"domain":"ilmiosito.it","mode":"site"}')
PUNTEGGIO=$(echo "$RISPOSTA" | jq -e '.score')
echo "Punteggio: $PUNTEGGIO"
echo "$RISPOSTA" | jq -r '.issues[] | select(.severity=="high") | "- \(.title)"'
[ "$PUNTEGGIO" -ge "$SOGLIA" ] || { echo "Sotto la soglia di $SOGLIA"; exit 1; }
Da Node 18, senza dipendenze. prevScore è il punteggio dell'analisi precedente: resta vuoto alla prima analisi e quando cambia il metodo di calcolo, e in quei casi il confronto salta da solo.
const risposta = await fetch("https://trovavio.com/api/v1/sites", {
headers: { Authorization: `Bearer ${process.env.TROVAVIO_KEY}` },
});
if (!risposta.ok) throw new Error(`Trovavio ha risposto ${risposta.status}`);
const { sites } = await risposta.json();
const calati = sites.filter((s) => s.prevScore != null && s.score < s.prevScore);
if (calati.length) {
await fetch(process.env.SLACK_WEBHOOK, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: calati.map((s) => `${s.domain}: da ${s.prevScore} a ${s.score}`).join("\n"),
}),
});
}
Solo libreria standard. Al posto della print crei l'attività con le API del tuo tracker: ogni problema ha già il titolo e l'elenco delle pagine.
import json, os, urllib.request
richiesta = urllib.request.Request(
"https://trovavio.com/api/v1/sites/ilmiosito.it",
headers={"Authorization": "Bearer " + os.environ["TROVAVIO_KEY"]},
)
sito = json.load(urllib.request.urlopen(richiesta))
for problema in sito["issues"]:
if problema["severity"] == "high":
print(problema["title"], problema["pages"]) # qui crei l'attività
Autenticazione
Gli endpoint sono per chi ha il piano Pro o Agenzia, prova gratuita compresa. Genera la chiave da Account, sezione API Keys: ha il prefisso trv_ seguito da 32 caratteri esadecimali e viene mostrata una sola volta, quindi salvala in un posto sicuro, per esempio fra le variabili segrete della tua pipeline. Nel database Trovavio ne conserva solo l'hash, mai la chiave in chiaro.
Ogni richiesta deve includere l'header Authorization. Tutte le risposte sono in formato JSON. Puoi tenere fino a 20 chiavi attive, una per integrazione, e revocarne una senza toccare le altre. La chiave legge i siti dello spazio di lavoro del tuo account: se lavori in agenzia con più persone, tutti vedono gli stessi siti e le chiamate si sommano sulla stessa quota.
curl -H "Authorization: Bearer trv_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
https://trovavio.com/api/v1/sites
Piani e limiti
L'API è inclusa nei piani Pro e Agenzia. Free e Solo non la includono: con la chiave di un account su uno di questi piani ogni endpoint risponde 401. Non ci sono limiti al minuto: contano il tetto mensile di chiamate e, per le analisi, il tetto giornaliero del piano.
| Cosa cambia | Pro | Agenzia |
|---|---|---|
| Chiamate API al mese | 500 | 2.000 |
| Siti nel tuo spazio | 3 | 15 |
Pagine per analisi, in modalità site | 50 | 200 |
| Analisi al giorno | 30 | 60 |
Crediti AI al mese, solo per POST /api/v1/ai | 500 | 2.000 |
| Modello AI | Sonnet | Sonnet |
Le chiamate API si azzerano il primo di ogni mese. I crediti AI sono gli stessi della dashboard, un solo conteggio: durante la prova gratuita del Pro sono 60. Le analisi al giorno sono condivise con la dashboard: una analisi lanciata dall'API vale come una lanciata a mano.
Costo per endpoint
| Endpoint | Chiamate API | Altro |
|---|---|---|
| GET /api/v1/sites | 1 | Niente |
| GET /api/v1/sites/:domain | 1 | Niente |
| POST /api/v1/audit | 1 | 1 analisi del giorno. Se il dominio è nuovo, 1 sito del piano. Nessun credito AI. |
| POST /api/v1/ai | 1 | 1 credito AI per azione, restituito se la generazione fallisce. |
Ogni risposta espone tre header: X-RateLimit-Limit (il tetto del mese), X-RateLimit-Remaining (le chiamate che restano) e X-RateLimit-Reset (quando il conteggio si azzera). Superato il tetto ricevi 429 fino a quella data.
Endpoint
Elenca tutti i siti del tuo spazio con i punteggi dell'ultima analisi salvata. È la chiamata da usare per un cruscotto o per un controllo periodico: non richiede parametri e non lancia nessuna scansione.
curl -H "Authorization: Bearer trv_xxx" \
https://trovavio.com/api/v1/sites
{
"sites": [
{
"domain": "ilmiosito.it",
"score": 74,
"seoScore": 78,
"geoScore": 70,
"prevScore": 71,
"metodoPunteggio": 2,
"lastScanAt": "2026-07-01T08:00:00.000Z"
}
],
"total": 1
}
| 401 | INVALID_API_KEY: chiave mancante, non valida o account su un piano senza API. |
| 429 | API_RATE_LIMIT_EXCEEDED: superato il tetto di chiamate del mese. |
Dettaglio dell'ultima analisi di un sito: punteggi SEO e GEO, variazione rispetto all'analisi precedente ed elenco dei problemi, ognuno con le pagine interessate.
| Nome | Tipo | Descrizione |
|---|---|---|
| domain obbligatorio | string | Dominio del sito, senza protocollo né www (es. ilmiosito.it). |
curl -H "Authorization: Bearer trv_xxx" \
https://trovavio.com/api/v1/sites/ilmiosito.it
{
"domain": "ilmiosito.it",
"score": 74,
"seoScore": 78,
"geoScore": 70,
"prevScore": 71,
"metodoPunteggio": 2,
"lastScanAt": "2026-07-01T08:00:00.000Z",
"issues": [
{
"title": "Title troppo corto",
"simpleTitle": "Il titolo della pagina è troppo corto",
"category": "seo",
"severity": "high",
"description": "Il tag title è sotto i 10 caratteri.",
"pages": ["/servizi"]
}
]
}
| Campo | Tipo | Cosa contiene |
|---|---|---|
| score, seoScore, geoScore | number | Punteggio complessivo, SEO e GEO, da 0 a 100. |
| prevScore | number | null | Il punteggio complessivo dell'analisi precedente. null alla prima analisi e quando il metodo di calcolo è cambiato. |
| metodoPunteggio | number | La versione del metodo con cui è calcolato il punteggio. Due punteggi di metodi diversi non si confrontano. |
| lastScanAt | string | Data e ora dell'analisi, in formato ISO 8601. |
| issues[].severity | string | high, medium o low: quanto pesa il problema. |
| issues[].category | string | seo, geo o local (SEO locale, per le attività con una sede). |
| issues[].title, simpleTitle, description | string | Il problema in termini tecnici, in parole semplici e la spiegazione. |
| issues[].pages | string[] | I percorsi delle pagine interessate, come /servizi. |
| 400 | BAD_REQUEST: dominio mancante o non valido. |
| 401 | INVALID_API_KEY: chiave non valida o account su un piano senza API. |
| 404 | NOT_FOUND: nessuna analisi salvata per quel dominio. Lanciala con POST /api/v1/audit. |
| 429 | API_RATE_LIMIT_EXCEEDED: superato il tetto di chiamate del mese. |
Lancia l'analisi SEO e GEO di un dominio e restituisce il risultato nella stessa forma di GET /api/v1/sites/:domain. La risposta arriva a scansione finita e il risultato resta salvato: lo ritrovi nella dashboard e con GET /api/v1/sites. Costa 1 chiamata API e nessun credito AI.
La modalità single risponde in pochi secondi. La modalità site legge fino a 50 pagine sul Pro e 200 sull'Agenzia e può durare alcuni minuti: imposta un timeout di almeno 300 secondi.
| Nome | Tipo | Descrizione |
|---|---|---|
| domain obbligatorio | string | Dominio da analizzare, senza protocollo né www (es. ilmiosito.it). Stesso formato di GET /api/v1/sites/:domain. |
| url alias deprecato | string | Accettato per retrocompatibilità al posto di domain. Se usato, la risposta include deprecation_warning. Usa domain. |
| mode opzionale | string | single (default) analizza una pagina; site legge il sito intero, fino al limite di pagine del piano. |
curl -X POST https://trovavio.com/api/v1/audit \
-H "Authorization: Bearer trv_xxx" \
-H "Content-Type: application/json" \
-d '{"domain":"ilmiosito.it","mode":"single"}'
{
"domain": "ilmiosito.it",
"score": 74,
"seoScore": 78,
"geoScore": 70,
"prevScore": 71,
"metodoPunteggio": 2,
"lastScanAt": "2026-07-05T09:12:00.000Z",
"issues": [ ... ]
}
| 400 | BAD_REQUEST: manca domain (o l'alias url). URL_INVALID: l'indirizzo non è valido. |
| 401 | INVALID_API_KEY: chiave non valida o account su un piano senza API. |
| 403 | PLAN_SITES_LIMIT_REACHED: il dominio è nuovo e hai già i siti previsti dal piano (3 sul Pro, 15 sull'Agenzia). La risposta include current e limit. |
| 429 | API_RATE_LIMIT_EXCEEDED: superato il tetto di chiamate del mese. USER_AUDIT_DAILY_CAP: superate le analisi del giorno (30 sul Pro, 60 sull'Agenzia); la risposta include resetAt. |
| 500 | INTERNAL_ERROR: il sito non è raggiungibile o l'analisi è fallita. L'analisi del giorno non viene scalata. |
Genera un contenuto ottimizzato con «Scrivi con l'AI» per un dominio già analizzato, partendo dal contenuto vero della pagina. Restituisce una proposta da rivedere: non la pubblica. Consuma 1 chiamata API e 1 credito AI per azione. Devi prima aver analizzato il dominio.
| Nome | Tipo | Descrizione |
|---|---|---|
| domain obbligatorio | string | Dominio già presente in un'analisi (es. ilmiosito.it). |
| action obbligatorio | string | Cosa generare. title, description, h1 e alts restituiscono un elenco proposals. schema, schema_org e faq_schema restituiscono dati strutturati JSON-LD da incollare nell'head. llms_txt restituisce il file llms.txt. checklist restituisce da 5 a 8 azioni da fare in ordine di priorità, ognuna con il motivo e il tempo stimato. |
| vertical opzionale | string | Settore per calibrare il tono (es. avvocato, medico). Default generico. |
curl -X POST https://trovavio.com/api/v1/ai \
-H "Authorization: Bearer trv_xxx" \
-H "Content-Type: application/json" \
-d '{"domain":"ilmiosito.it","action":"title","vertical":"avvocato"}'
{
"result": {
"proposals": [
"Studio Legale Rossi, Avvocato Civilista a Milano"
]
}
}
| 400 | BAD_REQUEST: domain o action mancante, oppure azione non valida (la risposta include allowedActions). |
| 401 | INVALID_API_KEY: chiave non valida o account su un piano senza API. |
| 402 | CREDITS_EXHAUSTED: crediti AI del mese esauriti (la risposta include aiCredits). |
| 404 | NOT_FOUND: nessuna analisi per quel dominio, lancia prima POST /api/v1/audit. |
| 429 | API_RATE_LIMIT_EXCEEDED: superato il tetto di chiamate del mese. |
| 500, 502, 503 | INTERNAL_ERROR o AI_EMPTY: generazione fallita o senza un risultato utilizzabile. AI_BUSY (503): il modello è molto richiesto, riprova dopo il tempo indicato in Retry-After. In tutti questi casi il credito AI viene restituito. |
Tutti gli errori in un posto
Gli errori hanno sempre un codice leggibile dalla macchina nel campo error; dove serve, message lo spiega in italiano.
| Stato | Codice | Cosa fare |
|---|---|---|
| 401 | INVALID_API_KEY | Controlla la chiave e il piano dell'account: Free e Solo non hanno l'API. |
| 402 | CREDITS_EXHAUSTED | I crediti AI del mese sono finiti: tornano il primo del mese. |
| 403 | PLAN_SITES_LIMIT_REACHED | Hai già i siti del piano: rimuovine uno dall'archivio o passa al piano superiore. |
| 404 | NOT_FOUND | Il dominio non è stato ancora analizzato. |
| 429 | API_RATE_LIMIT_EXCEEDED | Aspetta l'azzeramento indicato in X-RateLimit-Reset. |
| 429 | USER_AUDIT_DAILY_CAP | Le analisi del giorno sono finite: riprova dopo resetAt. |
| 5xx | INTERNAL_ERROR, AI_EMPTY, AI_BUSY | Riprova. Se la richiesta non ha prodotto un risultato, il credito AI e l'analisi del giorno vengono restituiti; la chiamata API resta conteggiata. |
Domande frequenti
Che piano serve per usare l'API?
Come ottengo una API key Trovavio?
trv_ e viene mostrata una sola volta.Quante richieste posso fare al mese?
Chiamate API e crediti AI sono la stessa cosa?
POST /api/v1/ai consuma anche un credito AI, lo stesso pool della dashboard: 500 al mese sul Pro, 2.000 sull'Agenzia.Cosa succede se supero il limite?
L'API Trovavio supporta l'audit GEO?
Posso applicare le correzioni sul sito dall'API?
POST /api/v1/ai restituisce testi e dati strutturati da rivedere, non li pubblica. Per applicare le correzioni su WordPress c'è il plugin Trovavio.Prima di scrivere codice, guarda che dati escono
Il JSON che restituisce l'API è lo stesso report che vedi a schermo. Analizza un sito e leggilo, poi decidi se ti serve la chiave.