Documentazione

API per sviluppatori.

Una sola chiave, un solo endpoint, tutti i modelli. L'API è OpenAI-compatible: se usi già una libreria OpenAI, ti basta cambiare il base_url.

API OpenAI-compatible
Base URL: https://iq.enesi.it/v1 — usa qualsiasi SDK OpenAI impostando questo base_url e la tua chiave llmr_....

Autenticazione

Ogni richiesta va autenticata con la tua chiave API nell'header Authorization, in formato Bearer. Le chiavi iniziano con llmr_ e si generano dalla dashboard.

Authorization: Bearer llmr_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

Tratta la chiave come una password: non includerla nel codice client né nei repository pubblici.

Chat completions

POST /v1/chat/completions

Genera una risposta da un modello conversazionale. Imposta model sull'identificativo del modello (l'elenco è nell'area cliente, sezione Modelli) e passa la lista dei messages.

curl https://iq.enesi.it/v1/chat/completions \
  -H "Authorization: Bearer llmr_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4.6",
    "messages": [
      { "role": "system", "content": "Sei un assistente conciso." },
      { "role": "user", "content": "Riassumi la conformità GDPR in una frase." }
    ]
  }'
<?php
$ch = curl_init("https://iq.enesi.it/v1/chat/completions");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer llmr_...",
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "model" => "claude-sonnet-4.6",
        "messages" => [
            ["role" => "system", "content" => "Sei un assistente conciso."],
            ["role" => "user", "content" => "Riassumi la conformità GDPR in una frase."],
        ],
    ]),
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
const res = await fetch("https://iq.enesi.it/v1/chat/completions", {
  method: "POST",
  headers: {
    "Authorization": "Bearer llmr_...",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    model: "claude-sonnet-4.6",
    messages: [
      { role: "system", content: "Sei un assistente conciso." },
      { role: "user", content: "Riassumi la conformità GDPR in una frase." }
    ]
  })
});
const data = await res.json();
console.log(data.choices[0].message.content);

Passa "web_search": true per abilitare la ricerca web del modello, tradotta automaticamente nella forma corretta per il provider instradato. Su OpenAI funziona solo con i modelli di ricerca dedicati; su un modello che non lo supporta la richiesta risponde 400 web_search_unsupported prima di qualunque addebito.

curl https://iq.enesi.it/v1/chat/completions \
  -H "Authorization: Bearer llmr_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4.6",
    "messages": [
      { "role": "user", "content": "Quali sono le ultime notizie sul mercato dei camper usati in Italia?" }
    ],
    "web_search": true
  }'

Nota: sui modelli Anthropic, eventuali citazioni/fonti strutturate della ricerca non sono ancora esposte nella risposta — arriva solo il testo finale del modello.

Embeddings

POST /v1/embeddings

Trasforma un testo in un vettore numerico, utile per ricerca semantica e classificazione. Passa model e input (stringa o array di stringhe).

curl https://iq.enesi.it/v1/embeddings \
  -H "Authorization: Bearer llmr_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "embedding-small",
    "input": "Gateway API con credito prepagato."
  }'
<?php
$ch = curl_init("https://iq.enesi.it/v1/embeddings");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer llmr_...",
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "model" => "embedding-small",
        "input" => "Gateway API con credito prepagato.",
    ]),
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
const res = await fetch("https://iq.enesi.it/v1/embeddings", {
  method: "POST",
  headers: {
    "Authorization": "Bearer llmr_...",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    model: "embedding-small",
    input: "Gateway API con credito prepagato."
  })
});
const data = await res.json();
console.log(data.data[0].embedding.length);

Lista modelli

GET /v1/models

Restituisce i modelli abilitati per la tua chiave, con identificativo e disponibilità.

curl https://iq.enesi.it/v1/models \
  -H "Authorization: Bearer llmr_..."
<?php
$ch = curl_init("https://iq.enesi.it/v1/models");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer llmr_..."],
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
const res = await fetch("https://iq.enesi.it/v1/models", {
  headers: { "Authorization": "Bearer llmr_..." }
});
const data = await res.json();
data.data.forEach(m => console.log(m.id));

Codici di errore

Gli errori seguono lo standard HTTP e includono un campo error.code testuale.

Stato Codice Significato
401invalid_api_keyChiave API mancante, errata o revocata.
402insufficient_creditCredito esaurito. Ricarica il saldo per riprendere. Le API REST di FonteIQ rispondono 402 con lo stesso codice quando i crediti FonteIQ sono attivi sull'account; i tool MCP lo restituiscono come errore del tool ([insufficient_credit], HTTP 200); il limite di spesa della chiave resta distinto (budget_exhausted, budget_blocked).
403model_not_allowedIl modello richiesto non è abilitato per questa chiave.
404model_not_foundL'identificativo del modello non esiste.
400web_search_unsupportedweb_search: true su un modello/provider che non lo supporta.
429rate_limit_exceededTroppe richieste. Rallenta e riprova dopo qualche istante.
502upstream_errorErrore dal provider del modello a monte.
503provider_unavailableIl provider del modello è temporaneamente non disponibile.
Accedi