In questa pagina
Per iniziare
Panoramica
L’API ha la versione nel percorso, /api/v1. Ogni endpoint accetta un POST con un corpo JSON e risponde in JSON, anche in caso di errore.
URL di base https://blurwrite.com
- POST /api/v1/detectAnalizza un testo
- POST /api/v1/detect/batchAnalizza più testi
- POST /api/v1/humanizeUmanizza un testo
- POST /api/v1/paraphraseParafrasa un testo
- POST /api/v1/summarizeRiassumi un testo
- POST /api/v1/grammarControlla la grammatica
Solo sul sito, non nell’API: il contatore di parole, il contatore di caratteri, il rilevatore di plagio e l’opzione "Più tempo per la riscrittura" dell’humanizer.
Generato dal documento OpenAPI, elenca esattamente le route e i campi accettati dall’API. Il documento OpenAPI
La tua prima chiamata
Un testo deve contenere almeno 50 parole.
Controlla "calibrated" prima di tutto: quando è false, la lingua non ha ancora una curva calibrata, quindi il valore non deve essere usato come risultato.
Per ogni valore viene mostrato il tipo. Una risposta reale contiene la valutazione del tuo testo.
curl -X POST https://blurwrite.com/api/v1/detect \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."}'const res = await fetch('https://blurwrite.com/api/v1/detect', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/detect",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"figure": "number, da 0 a 100",
"low": "number, da 0 a 100",
"high": "number, da 0 a 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, da 0 a 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}Autenticazione
Invia la tua chiave nell’header Authorization come token bearer. Una chiave nell’URL viene rifiutata.
Una chiave ha ambiti di autorizzazione: detect, rewrite, summarize e grammar. Una route risponde con 403 out_of_scope quando la chiave non dispone dell’ambito richiesto.
Authorization: Bearer YOUR_API_KEYEndpoint
POST /api/v1/detect
Analizza un testo. La valutazione del rilevatore per un testo: un valore da 0 a 100, l’intervallo attorno al valore, una valutazione per frase e l’indicazione della calibrazione della lingua.
Ambito della chiave: detect
Corpo della richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| text | string | sì | Il testo da analizzare o riscrivere. |
| language | string | no | Il codice della lingua, ad esempio "en" o "de". Se omesso, viene rilevato dal testo. |
| contentType | string | no | Il tipo di testo, ad esempio "essay" o "email", quando l’analisi deve usare la curva di quel tipo di testo. |
Risposta
| Campo | Tipo | Descrizione |
|---|---|---|
| figure | number | La valutazione da 0 a 100: quanto è probabile che il testo sia stato scritto da una macchina. |
| low | number | Il limite inferiore dell’intervallo attorno al valore. |
| high | number | Il limite superiore dell’intervallo attorno al valore. |
| uncertainty | number | Metà dell’ampiezza dell’intervallo, in punti. |
| verdict | string | La fascia in cui rientra il valore; una fascia, mai una conclusione su chi ha scritto il testo. Uno tra: human, uncertain, ai. |
| confidence | string | Quanto è affidabile la valutazione. Uno tra: low, medium, high. |
| sentences | array di SentenceScore | Una valutazione per frase. |
| words | integer | Le parole analizzate. |
| language | string | La lingua usata per analizzare il testo. |
| model | string | Il modello che ha prodotto la valutazione. |
| calibrated | boolean | Indica se la lingua ha una curva calibrata. Quando è false, il valore non deve essere usato come risultato. |
| bandHumanFlagRate | number | null | La frequenza con cui i testi umani in questa fascia sono stati classificati come generati da una macchina nelle nostre misurazioni, oppure null. |
| usage | Usage | Il consumo conteggiato per questa chiamata. |
Errori aggiuntivi di questa route
| Stato | Codice | Significato |
|---|---|---|
| 400 | no_text | Il corpo non contiene "text". |
| 422 | too_short | Il testo è più corto della lunghezza minima. |
| 413 | text_too_long | Il testo è più lungo di quanto il motore possa analizzare in una chiamata. Dividilo. Nessuna parola è stata conteggiata. |
| 422 | not_calibrated | Questa lingua non può ancora essere analizzata. |
| 503 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
| 502 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
| 503 | engine_starting | Il motore è in fase di avvio e non è stato pronto in tempo. Nessuna parola è stata conteggiata. Riprova tra un minuto. |
| 503 | engine_busy | Il motore era occupato e l’analisi non è potuta iniziare in tempo; le analisi Pro sul sito hanno la precedenza sulle chiamate API. Nessuna parola è stata conteggiata. Riprova tra poco. |
| 504 | engine_timeout | Il motore non ha completato l’analisi del testo in tempo. Nessuna parola è stata conteggiata. Riprova o invia un testo più breve. |
| 429 | concurrency_limited | Questa chiave ha già raggiunto il massimo di chiamate simultanee di questo tipo. Attendi che una termini o che trascorra il tempo indicato in Retry-After. |
curl -X POST https://blurwrite.com/api/v1/detect \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."}'const res = await fetch('https://blurwrite.com/api/v1/detect', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/detect",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"figure": "number, da 0 a 100",
"low": "number, da 0 a 100",
"high": "number, da 0 a 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, da 0 a 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/detect/batch
Analizza più testi. Più testi in una sola chiamata, fino al limite del batch. La chiamata richiede in anticipo una quota sufficiente per le parole di ogni testo che può analizzare (50 parole o più); le parole dei testi che non restituiscono una valutazione vengono riaccreditate in seguito. L’errore di un testo non fa mai fallire l’intero batch.
Ambito della chiave: detect
Corpo della richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| items | array di object | sì | I testi, ciascuno con il proprio "text" e i campi facoltativi "id", "language" e "contentType". |
| items[].id | string | no | Il tuo id per l’elemento, restituito insieme al risultato. Se omesso, viene usata la posizione dell’elemento. |
| items[].text | string | sì | Il testo da analizzare o riscrivere. |
| items[].language | string | no | Il codice della lingua, ad esempio "en" o "de". Se omesso, viene rilevato dal testo. |
| items[].contentType | string | no | Il tipo di testo, ad esempio "essay" o "email", quando l’analisi deve usare la curva di quel tipo di testo. |
Risposta
| Campo | Tipo | Descrizione |
|---|---|---|
| results | array di BatchResult | Un risultato per elemento, nell’ordine di invio. |
| usage | Usage | Il consumo conteggiato per questa chiamata. |
Errori aggiuntivi di questa route
| Stato | Codice | Significato |
|---|---|---|
| 400 | batch_empty | Il corpo non contiene "items" oppure l’elenco è vuoto. |
| 413 | batch_too_large | Il batch contiene più elementi del limite consentito. |
| 429 | concurrency_limited | Questa chiave ha già raggiunto il massimo di chiamate simultanee di questo tipo. Attendi che una termini o che trascorra il tempo indicato in Retry-After. |
curl -X POST https://blurwrite.com/api/v1/detect/batch \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"items":[{"id":"1","text":"Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."},{"id":"2","text":"Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."}]}'const res = await fetch('https://blurwrite.com/api/v1/detect/batch', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"items": [
{
"id": "1",
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."
},
{
"id": "2",
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."
}
]
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/detect/batch",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"items": [
{
"id": "1",
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio.",
},
{
"id": "2",
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio.",
},
],
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"results": [
{
"id": "string",
"detection": {
"figure": "number, da 0 a 100",
"low": "number, da 0 a 100",
"high": "number, da 0 a 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, da 0 a 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"error": {
"code": "string",
"message": "string"
}
}
],
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/humanize
Umanizza un testo. L’humanizer con le sue verifiche dei fatti: numeri, nomi e citazioni vengono conservati, mentre una riscrittura che altera un fatto viene corretta o segnalata. La modalità "custom" (Pro) scrive nel tuo stile, ricavato da un campione della tua scrittura.
Tramite l’API l’humanizer esegue la riscrittura standard. "Più tempo per la riscrittura" è disponibile solo sul sito.
Ambito della chiave: rewrite
Corpo della richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| text | string | sì | Il testo da analizzare o riscrivere. |
| mode | string | no | La modalità di riscrittura. Uno tra: natural, formal, simple, academic, creative, shorten, expand, custom. Predefinito: natural. |
| style_sample | string | no | Con la modalità "custom": un campione della tua scrittura, da 150 a 2000 parole, analizzato sul server. Se omesso, viene usato il campione salvato nel tuo account. |
| tab | string | no | La scheda dell'humanizer: il registro usato nella riscrittura. Standard mantiene il registro del testo originale. Uno tra: standard, academic, professional, casual. Predefinito: standard. |
| strength | string | no | Regolare mantiene il contenuto e il registro. Aggressiva può riordinare il testo e tralasciare gli approfondimenti, ma conserva tutti i punti principali; alcune parti potrebbero risultare insolite. Uno tra: regular, aggressive. Predefinito: regular. |
| ownTouch | string | no | Un dettaglio, un esempio o un’opinione con parole tue, fino a 400 caratteri, da integrare nella riscrittura. |
| language | string | no | Il codice della lingua, ad esempio "en" o "de". Se omesso, viene rilevato dal testo. |
Risposta
| Campo | Tipo | Descrizione |
|---|---|---|
| text | string | Il testo riscritto. |
| before | Detection | La valutazione del rilevatore sul tuo testo, oppure null se non disponibile. |
| after | Detection | La valutazione del rilevatore sulla riscrittura, oppure null. |
| passes | integer | Quante riscritture sono state prodotte prima di scegliere questa. |
| facts | object | Cosa hanno rilevato le verifiche dei fatti e, in caso di problemi, perché la riscrittura non le ha superate. |
| late | boolean | True quando la riscrittura è stata restituita al raggiungimento del limite di tempo, con le verifiche incomplete. |
| usage | Usage | Il consumo conteggiato per questa chiamata. |
Errori aggiuntivi di questa route
| Stato | Codice | Significato |
|---|---|---|
| 400 | no_text | Il corpo non contiene "text". |
| 422 | too_short | Il testo è più corto della lunghezza minima. |
| 400 | unknown_mode | La modalità non è tra quelle offerte da questa route. |
| 400 | unknown_option | La scheda o l’intensità non è disponibile per questo endpoint. |
| 402 | plan_required | La modalità, la scheda, l’intensità o il tocco personale richiedono un piano che l’account non ha; la modalità "custom" richiede Pro. Nessuna parola è stata conteggiata. |
| 400 | no_sample | La modalità "custom" richiede un campione di scrittura, inviato o salvato nell’account. |
| 400 | sample_too_short | Il campione di scrittura è più corto della lunghezza minima. |
| 400 | sample_too_long | Il campione di scrittura supera la lunghezza massima. |
| 429 | concurrency_limited | Questa chiave ha già raggiunto il massimo di chiamate simultanee di questo tipo. Attendi che una termini o che trascorra il tempo indicato in Retry-After. |
| 422 | no_rewrite | Il motore ha risposto, ma nessuna bozza ha superato i controlli (vuota, un rifiuto o una copia del testo). Nessuna parola è stata conteggiata. |
| 503 | timeout | La riscrittura ha impiegato troppo tempo ed è stata interrotta. Nessuna parola è stata conteggiata. |
| 503 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
| 502 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
curl -X POST https://blurwrite.com/api/v1/humanize \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."}'const res = await fetch('https://blurwrite.com/api/v1/humanize', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/humanize",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"before": {
"figure": "number, da 0 a 100",
"low": "number, da 0 a 100",
"high": "number, da 0 a 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, da 0 a 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"after": {
"figure": "number, da 0 a 100",
"low": "number, da 0 a 100",
"high": "number, da 0 a 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, da 0 a 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"passes": "integer",
"facts": "object",
"late": "boolean",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/paraphrase
Parafrasa un testo. Lo strumento di parafrasi, con lo stesso elenco di modalità dello strumento sul sito.
Ambito della chiave: rewrite
Corpo della richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| text | string | sì | Il testo da analizzare o riscrivere. |
| mode | string | no | La modalità di riscrittura. Uno tra: standard, fluency, formal, academic, simple, creative, expand, shorten. Predefinito: standard. |
| strength | string | no | Quanto la riscrittura può discostarsi dall’originale. Uno tra: readable, balanced, strong. Predefinito: balanced. |
| readability | string | no | Il registro da usare nella scrittura. Uno tra: casual, professional, academic, creative. Predefinito: professional. |
| purpose | string | no | Lo scopo del testo. Uno tra: general, essay, article, email, marketing, report, story. Predefinito: general. |
| synonyms | string | no | Quanto liberamente si possono sostituire le parole. Uno tra: few, some, many. Predefinito: some. |
| freezeWords | array di string | no | Parole e frasi che devono essere restituite esattamente come scritte: al massimo 25, ciascuna fino a 60 caratteri. Le loro parole rientrano nel conteggio della chiamata. |
| customInstruction | string | no | Una tua breve istruzione per la riscrittura, fino a 500 caratteri. Le sue parole rientrano nel conteggio della chiamata. |
| language | string | no | Il codice della lingua, ad esempio "en" o "de". Se omesso, viene rilevato dal testo. |
| closedLoop | boolean | no | Imposta false per saltare il ciclo di verifica. Predefinito: true. |
Risposta
| Campo | Tipo | Descrizione |
|---|---|---|
| text | string | Il testo riscritto. |
| before | Detection | La valutazione del rilevatore sul tuo testo, oppure null se non disponibile. |
| after | Detection | La valutazione del rilevatore sulla riscrittura, oppure null. |
| passes | integer | Quante riscritture sono state prodotte prima di scegliere questa. |
| facts | object | Cosa hanno rilevato le verifiche dei fatti e, in caso di problemi, perché la riscrittura non le ha superate. |
| late | boolean | True quando la riscrittura è stata restituita al raggiungimento del limite di tempo, con le verifiche incomplete. |
| usage | Usage | Il consumo conteggiato per questa chiamata. |
Errori aggiuntivi di questa route
| Stato | Codice | Significato |
|---|---|---|
| 400 | no_text | Il corpo non contiene "text". |
| 422 | too_short | Il testo è più corto della lunghezza minima. |
| 400 | unknown_mode | La modalità non è tra quelle offerte da questa route. |
| 400 | option_invalid | freezeWords non è un elenco di parole o frasi. Non è stato conteggiato nulla. |
| 400 | option_too_long | freezeWords o customInstruction supera il proprio limite. Non è stato conteggiato nulla. |
| 429 | concurrency_limited | Questa chiave ha già raggiunto il massimo di chiamate simultanee di questo tipo. Attendi che una termini o che trascorra il tempo indicato in Retry-After. |
| 422 | no_rewrite | Il motore ha risposto, ma nessuna bozza ha superato i controlli (vuota, un rifiuto o una copia del testo). Nessuna parola è stata conteggiata. |
| 503 | timeout | La riscrittura ha impiegato troppo tempo ed è stata interrotta. Nessuna parola è stata conteggiata. |
| 503 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
| 502 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
curl -X POST https://blurwrite.com/api/v1/paraphrase \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."}'const res = await fetch('https://blurwrite.com/api/v1/paraphrase', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/paraphrase",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"before": {
"figure": "number, da 0 a 100",
"low": "number, da 0 a 100",
"high": "number, da 0 a 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, da 0 a 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"after": {
"figure": "number, da 0 a 100",
"low": "number, da 0 a 100",
"high": "number, da 0 a 100",
"uncertainty": "number",
"verdict": "human | uncertain | ai",
"confidence": "low | medium | high",
"sentences": [
{
"text": "string",
"score": "number, da 0 a 1",
"verdict": "human | uncertain | ai"
}
],
"words": "integer",
"language": "string",
"model": "string",
"calibrated": "boolean",
"bandHumanFlagRate": "number | null"
},
"passes": "integer",
"facts": "object",
"late": "boolean",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/summarize
Riassumi un testo. Lo strumento di riassunto, con frasi chiave, un paragrafo o un elenco puntato.
Ambito della chiave: summarize
Corpo della richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| text | string | sì | Il testo da analizzare o riscrivere. |
| mode | string | no | La forma del riassunto. Uno tra: key-sentences, paragraph, bullets. Predefinito: key-sentences. |
| length | string | no | La lunghezza del riassunto. Uno tra: short, medium, long. Predefinito: medium. |
Risposta
| Campo | Tipo | Descrizione |
|---|---|---|
| text | string | Il riassunto. |
| usage | Usage | Il consumo conteggiato per questa chiamata. |
Errori aggiuntivi di questa route
| Stato | Codice | Significato |
|---|---|---|
| 400 | no_text | Il corpo non contiene "text". |
| 422 | too_short | Il testo è più corto della lunghezza minima. |
| 429 | concurrency_limited | Questa chiave ha già raggiunto il massimo di chiamate simultanee di questo tipo. Attendi che una termini o che trascorra il tempo indicato in Retry-After. |
| 503 | timeout | La riscrittura ha impiegato troppo tempo ed è stata interrotta. Nessuna parola è stata conteggiata. |
| 503 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
| 502 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
curl -X POST https://blurwrite.com/api/v1/summarize \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."}'const res = await fetch('https://blurwrite.com/api/v1/summarize', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/summarize",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"text": "string",
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}POST /api/v1/grammar
Controlla la grammatica. Problemi di grammatica, ortografia, punteggiatura e stile, ciascuno con la sua posizione nel testo e le sostituzioni suggerite.
Ambito della chiave: grammar
Corpo della richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| text | string | sì | Il testo da analizzare o riscrivere. |
| language | string | no | Il codice della lingua per il controllo, ad esempio "en-US" o "de-DE". Predefinito: en-US. |
Risposta
| Campo | Tipo | Descrizione |
|---|---|---|
| issues | array di GrammarIssue | I problemi rilevati, nell’ordine in cui compaiono. |
| usage | Usage | Il consumo conteggiato per questa chiamata. |
Errori aggiuntivi di questa route
| Stato | Codice | Significato |
|---|---|---|
| 400 | no_text | Il corpo non contiene "text". |
| 503 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
| 502 | engine_unavailable | Il motore non ha risposto. Nessuna parola è stata conteggiata. |
| 503 | engine_starting | Il motore è in fase di avvio e non è stato pronto in tempo. Nessuna parola è stata conteggiata. Riprova tra un minuto. |
| 504 | engine_timeout | Il motore non ha completato l’analisi del testo in tempo. Nessuna parola è stata conteggiata. Riprova o invia un testo più breve. |
curl -X POST https://blurwrite.com/api/v1/grammar \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."}'const res = await fetch('https://blurwrite.com/api/v1/grammar', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio."
}),
})
const data = await res.json()
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`)import os
import requests
res = requests.post(
"https://blurwrite.com/api/v1/grammar",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={
"text": "Il comitato si è riunito martedì per esaminare il progetto della nuova biblioteca. I membri hanno concordato che la sala lettura dovrebbe restare aperta più a lungo nei giorni feriali e hanno chiesto al personale di preparare un budget per le ore aggiuntive. La prossima riunione esaminerà i costi, il numero previsto di visitatori e l’impatto sul resto dell’edificio.",
},
timeout=90,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}"){
"issues": [
{
"offset": "integer",
"length": "integer",
"message": "string",
"shortMessage": "string",
"category": "grammar | spelling | punctuation | style | typography",
"replacements": [
"string"
],
"context": "string"
}
],
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}Riferimento
Errori
Un errore risponde con il suo stato HTTP e un corpo in questa forma. Basati sul codice; il messaggio dice cosa non ha funzionato e cosa fare dopo.
Errori che ogni route può restituire
| Stato | Codice | Significato |
|---|---|---|
| 401 | key_in_url | La chiave è stata inviata nell’URL. Inviala nell’header Authorization. |
| 401 | no_key | Non è stata inviata alcuna chiave. |
| 401 | bad_key | La chiave non è valida o è stata revocata. |
| 403 | out_of_scope | La chiave non dispone dell’ambito richiesto da questa route. |
| 429 | rate_limited | Troppe richieste per questa chiave. Attendi il tempo indicato in Retry-After. |
| 403 | plan_lapsed | Il piano dell’account non include più l’API. |
| 413 | too_large | La richiesta è troppo grande. |
| 400 | bad_body | Il corpo non è un oggetto JSON. |
| 413 | too_many_words | La chiamata contiene più parole di quante ne accetti una singola chiamata. Suddividila. Non è stato conteggiato nulla. |
| 402 | quota_exhausted | Le parole API del piano per questo periodo di fatturazione sono esaurite e il saldo delle ricariche è vuoto. Nessuna parola è stata conteggiata. |
| 402 | quota_short | La chiamata richiede più parole di quelle disponibili nella quota API del piano e nel saldo delle ricariche messi insieme. Nessuna parola è stata conteggiata. |
| 402 | monthly_ceiling | L’account ha raggiunto il limite dell’API per questo periodo di fatturazione, che si applica indipendentemente dal saldo. Nessuna parola è stata conteggiata. |
| 503 | store_unavailable | Al momento non è stato possibile leggere la chiave, il conteggio delle parole dell’account o il campione di scrittura salvato, oppure questa istanza non dispone di un archivio degli account. Nessuna operazione è stata eseguita e nessuna parola è stata conteggiata. |
Una chiamata riserva le parole prima di essere eseguita e le restituisce se non riesce. Se in quel momento non è possibile aggiornare il conteggio, le parole restano addebitate: una chiamata non riuscita lo segnala e include "recorded": false nei dati di utilizzo, un batch risponde con "recorded": false nei dati di utilizzo e il conteggio delle parole non viene stimato.
{
"error": {
"code": "string",
"message": "string",
"docs": "string",
"available": "integer"
},
"usage": {
"recorded": "boolean",
"words": "integer",
"source": "plan | balance | plan_and_balance",
"fromPlan": "integer",
"fromBalance": "integer",
"allowanceLeft": "integer | null",
"balance": "integer"
}
}Limiti
Tutti i valori riportati qui sono quelli applicati dall’API.
- Ogni chiave può effettuare al massimo 60 richieste ogni 60 secondi.
- Ogni chiave può avere al massimo 4 chiamate di rilevamento (un batch conta come una sola chiamata) e 2 chiamate di umanizzazione, parafrasi o riassunto in esecuzione contemporaneamente; una chiamata aggiuntiva riceve la risposta 429 concurrency_limited con un header Retry-After.
- Quando i motori sono occupati, le analisi degli account Pro del sito hanno la precedenza sulle chiamate API, quindi una chiamata API potrebbe dover attendere il proprio turno.
- Un batch può contenere al massimo 50 testi.
- Ogni chiamata accetta al massimo 20.000 parole, in un singolo testo o in un intero gruppo di testi.
- Il rilevatore legge un testo di massimo 90.000 caratteri, circa 10.000 parole, con qualsiasi piano. Un testo più lungo restituisce 413 text_too_long, anche se rientra nel limite di parole della chiamata.
- Un account può avere fino a 5 chiavi attive, così puoi sostituire una chiave senza interruzioni del servizio.
Oggetti di risposta
Gli oggetti restituiti dagli endpoint, campo per campo.
Detection
| Campo | Tipo | Descrizione |
|---|---|---|
| figure | number | La valutazione da 0 a 100: quanto è probabile che il testo sia stato scritto da una macchina. |
| low | number | Il limite inferiore dell’intervallo attorno al valore. |
| high | number | Il limite superiore dell’intervallo attorno al valore. |
| uncertainty | number | Metà dell’ampiezza dell’intervallo, in punti. |
| verdict | string | La fascia in cui rientra il valore; una fascia, mai una conclusione su chi ha scritto il testo. Uno tra: human, uncertain, ai. |
| confidence | string | Quanto è affidabile la valutazione. Uno tra: low, medium, high. |
| sentences | array di SentenceScore | Una valutazione per frase. |
| words | integer | Le parole analizzate. |
| language | string | La lingua usata per analizzare il testo. |
| model | string | Il modello che ha prodotto la valutazione. |
| calibrated | boolean | Indica se la lingua ha una curva calibrata. Quando è false, il valore non deve essere usato come risultato. |
| bandHumanFlagRate | number | null | La frequenza con cui i testi umani in questa fascia sono stati classificati come generati da una macchina nelle nostre misurazioni, oppure null. |
SentenceScore
| Campo | Tipo | Descrizione |
|---|---|---|
| text | string | La frase. |
| score | number | Da 0 a 1, quanto è probabile che la frase sia stata scritta da una macchina. |
| verdict | string | La fascia in cui rientra la frase. Uno tra: human, uncertain, ai. |
Usage
| Campo | Tipo | Descrizione |
|---|---|---|
| recorded | boolean | True quando il conteggio è stato registrato. False solo quando non è stato possibile riaccreditare le parole non analizzate di un batch; in quel caso è presente solo "words". |
| words | integer | Le parole conteggiate per questa chiamata. |
| source | string | Da dove provengono: dalle parole API del piano, dal saldo delle ricariche o da entrambi. Uno tra: plan, balance, plan_and_balance. |
| fromPlan | integer | Le parole prelevate dalla quota API del piano. Presente quando recorded è true. |
| fromBalance | integer | Le parole prelevate dal saldo delle ricariche. Presente quando recorded è true. |
| allowanceLeft | integer | null | Le parole del piano rimaste per questo strumento dopo la chiamata, nel periodo di fatturazione corrente. Null per uno strumento senza quota in questo piano. Presente quando recorded è true. |
| balance | integer | Il saldo delle ricariche rimasto dopo questa chiamata. Presente quando recorded è true. |
RewriteResult
| Campo | Tipo | Descrizione |
|---|---|---|
| text | string | Il testo riscritto. |
| before | Detection | La valutazione del rilevatore sul tuo testo, oppure null se non disponibile. |
| after | Detection | La valutazione del rilevatore sulla riscrittura, oppure null. |
| passes | integer | Quante riscritture sono state prodotte prima di scegliere questa. |
| facts | object | Cosa hanno rilevato le verifiche dei fatti e, in caso di problemi, perché la riscrittura non le ha superate. |
| late | boolean | True quando la riscrittura è stata restituita al raggiungimento del limite di tempo, con le verifiche incomplete. |
GrammarIssue
| Campo | Tipo | Descrizione |
|---|---|---|
| offset | integer | Dove inizia il problema nel testo inviato, in unità di codice UTF-16 (un indice di stringa JavaScript). |
| length | integer | Quante unità di codice UTF-16 del testo inviato copre il problema. |
| message | string | La spiegazione dell’errore. |
| shortMessage | string | La stessa spiegazione, in poche parole. |
| category | string | Il tipo di problema. Uno tra: grammar, spelling, punctuation, style, typography. |
| replacements | array di string | Sostituzioni suggerite, dalla migliore. |
| context | string | Il testo attorno al problema. |
BatchResult
| Campo | Tipo | Descrizione |
|---|---|---|
| id | string | L’id dell’elemento. |
| detection | Detection | La valutazione, quando l’elemento ne ha restituita una. |
| error | object | Perché l’elemento non ha restituito una valutazione. |
Error
| Campo | Tipo | Descrizione |
|---|---|---|
| error | object | |
| usage | Usage | Il consumo conteggiato per questa chiamata. |
Il server MCP
Un agente può chiamare gli stessi strumenti tramite il Model Context Protocol. Il server è solo un client di questa API, quindi l'agente ottiene esattamente la stessa valutazione fornita dal sito.
- detect_textAnalizza un testo.
- detect_batchAnalizza più testi.
- humanize_textUmanizza un testo verificandone i fatti.
- paraphrase_textParafrasa un testo.
- summarize_textRiassume un testo.
- check_grammarControlla grammatica e ortografia.
Claude Code Si connette online
Salva la tua chiave API in una variabile d’ambiente chiamata BLURWRITE_API_KEY, dove viene eseguito il client:
Esegui questo comando in un terminale:
Oppure inserisci questo in .mcp.json:
.mcp.json{ "mcpServers": { "blurwrite": { "type": "http", "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${BLURWRITE_API_KEY}" } } } }Verifica che funzioni: chiedi al tuo assistente "Controlla questo paragrafo con Blurwrite e dimmi l’intervallo e il livello di affidabilità."
La tua chiave API si trova nella dashboard, alla voce API. Non inserire mai una chiave in un file condiviso o in un repository.
Claude Desktop Esegue il file del server
Scarica il file del server e annota dove l’hai salvato. Richiede Node.js.
Scarica il file del serverNell’app: Settings > Developer > Edit Config.
Aggiungi questo a claude_desktop_config.json:
claude_desktop_config.json{ "mcpServers": { "blurwrite": { "command": "node", "args": [ "/path/to/server.mjs" ], "env": { "BLURWRITE_API_KEY": "YOUR_API_KEY" } } } }Chiudi e riapri Claude Desktop per fargli caricare il server.
Verifica che funzioni: chiedi al tuo assistente "Controlla questo paragrafo con Blurwrite e dimmi l’intervallo e il livello di affidabilità."
La tua chiave API si trova nella dashboard, alla voce API. Non inserire mai una chiave in un file condiviso o in un repository.
Claude (claude.ai) Prossimamente
Presto potrai collegare claude.ai accedendo al tuo account Blurwrite. Nel frattempo gli stessi strumenti funzionano già oggi in Claude Desktop con il file del server, oppure in Claude Code, con la configurazione nelle rispettive schede.
Solo se la tua organizzazione ha l’opzione degli header di richiesta per i connettori personalizzati: aggiungi l’indirizzo con questo header.
ChatGPT Prossimamente
Presto potrai collegare ChatGPT accedendo al tuo account Blurwrite. Nel frattempo gli stessi strumenti funzionano già oggi in Codex e Claude Code, con la configurazione nelle rispettive schede.
Codex Si connette online
Salva la tua chiave API in una variabile d’ambiente chiamata BLURWRITE_API_KEY, dove viene eseguito il client:
Esegui questo comando in un terminale:
Oppure inserisci questo in ~/.codex/config.toml:
~/.codex/config.toml[mcp_servers.blurwrite] url = "https://blurwrite.com/api/mcp" bearer_token_env_var = "BLURWRITE_API_KEY"Nell’app: MCP servers > Add server > Streamable HTTP.
Verifica che funzioni: chiedi al tuo assistente "Controlla questo paragrafo con Blurwrite e dimmi l’intervallo e il livello di affidabilità."
La tua chiave API si trova nella dashboard, alla voce API. Non inserire mai una chiave in un file condiviso o in un repository.
Cursor Si connette online
Salva la tua chiave API in una variabile d’ambiente chiamata BLURWRITE_API_KEY, dove viene eseguito il client:
Aggiungi questo a ~/.cursor/mcp.json:
~/.cursor/mcp.json{ "mcpServers": { "blurwrite": { "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }Verifica che funzioni: chiedi al tuo assistente "Controlla questo paragrafo con Blurwrite e dimmi l’intervallo e il livello di affidabilità."
La tua chiave API si trova nella dashboard, alla voce API. Non inserire mai una chiave in un file condiviso o in un repository.
VS Code (Copilot) Si connette online
Aggiungi questo a .vscode/mcp.json:
.vscode/mcp.json{ "inputs": [ { "type": "promptString", "id": "blurwrite-key", "description": "Blurwrite API key", "password": true } ], "servers": { "blurwrite": { "type": "http", "url": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${input:blurwrite-key}" } } } }All’avvio del server, VS Code ti chiede la chiave una sola volta e la conserva.
Verifica che funzioni: chiedi al tuo assistente "Controlla questo paragrafo con Blurwrite e dimmi l’intervallo e il livello di affidabilità."
La tua chiave API si trova nella dashboard, alla voce API. Non inserire mai una chiave in un file condiviso o in un repository.
Windsurf Si connette online
Salva la tua chiave API in una variabile d’ambiente chiamata BLURWRITE_API_KEY, dove viene eseguito il client:
Nell’app: Cascade > ... > Open MCP config file.
Aggiungi questo a mcp_config.json:
mcp_config.json{ "mcpServers": { "blurwrite": { "serverUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer ${env:BLURWRITE_API_KEY}" } } } }Chiudi e riapri Windsurf per fargli caricare il server.
Verifica che funzioni: chiedi al tuo assistente "Controlla questo paragrafo con Blurwrite e dimmi l’intervallo e il livello di affidabilità."
La tua chiave API si trova nella dashboard, alla voce API. Non inserire mai una chiave in un file condiviso o in un repository.
Gemini CLI Si connette online
Salva la tua chiave API in una variabile d’ambiente chiamata BLURWRITE_API_KEY, dove viene eseguito il client:
Esegui questo comando in un terminale:
Oppure inserisci questo in ~/.gemini/settings.json:
~/.gemini/settings.json{ "mcpServers": { "blurwrite": { "httpUrl": "https://blurwrite.com/api/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } }Verifica che funzioni: chiedi al tuo assistente "Controlla questo paragrafo con Blurwrite e dimmi l’intervallo e il livello di affidabilità."
La tua chiave API si trova nella dashboard, alla voce API. Non inserire mai una chiave in un file condiviso o in un repository.
Other clients Online, con bridge o file
Un client che si connette a server MCP remoti via HTTP ha bisogno solo di questi due valori:
Un client che avvia solo server locali può raggiungere l’indirizzo tramite il bridge open source mcp-remote (richiede Node.js):
Oppure esegui tu il nostro file del server:
Scarica il file del server
La tua chiave API si trova nella dashboard, alla voce API. Non inserire mai una chiave in un file condiviso o in un repository.
Ogni valutazione ricevuta da un agente include il valore, il relativo margine di incertezza e lo stato della calibrazione, così l'agente può spiegare cosa significa la valutazione e quando non deve essere usata.
La tua chiave
Accedi, poi crea una chiave dalla tua dashboard.
Ottieni la tua chiave nella dashboard
Le chiavi non vengono mai create su questa pagina.
Cosa fanno l’API e il server MCP