openapi.yaml llms.txt llms-full.txt
Autofatture estere · FatturaPA

Da un PDF estero all'autofattura, via API.

Invii il PDF di una fattura estera. Noi facciamo OCR, AI, riconoscimento e validazione e ti restituiamo l'XML FatturaPA pronto all'invio, con il codice TD corretto. L'invio a SDI e la conservazione restano a carico tuo.

Panoramica

Optlyx Partner API è un motore di conversione: un solo endpoint trasforma un documento estero (es. Anthropic, OpenAI, AWS) nell'autofattura italiana corrispondente — integrazione reverse charge (TD17) o acquisto di beni (TD18/TD19), con eventuale companion TD01 per la contabilizzazione automatica.

i
Optlyx è un puro processore dati (OCR/AI). Il titolare fiscale e il soggetto che trasmette a SDI è sempre l'azienda cliente finale. Non tocchiamo il tuo canale SDI.

Confine di responsabilità

Optlyx — questa API
OCR → AI → riconoscimento
→ validazione (VIES, cambio)
generazione XML FatturaPA
Recivu — cliente finale
firma (CAdES .p7m)
+ invio a SDI · ricevute
+ conservazione a norma

La conservazione potrà arrivare come add-on Optlyx in futuro. In questa versione è fuori scope.

Autenticazione

Ogni richiesta richiede una API key per partner nell'header Authorization. La key è "super-partner": agisce per conto di più aziende; l'azienda target va indicata nel campo studioId del body di ogni chiamata.

header http
Authorization: Bearer pk_live_xxxxxxxxxxxxxxxxxxxxxxxx

Le key pk_test_… operano in sandbox, le pk_live_… in produzione. Una key non abilitata per lo studioId indicato riceve 403 TENANT_FORBIDDEN.

Ambienti

AmbientePrefisso keyBase URL
Sandboxpk_test_……/partnerApi/v1
Produzionepk_live_……/partnerApi/v1

Host attuale: https://europe-west1-playground-optlyx.cloudfunctions.net/partnerApi/v1. Prima del go-live forniremo un alias di dominio (es. https://api.optlyx.com/v1); i path restano identici.

Idempotenza

Su tutte le POST puoi passare un header Idempotency-Key: ripetere la stessa richiesta con la stessa key restituisce la risposta originale senza rilavorare il documento — sicuro sui retry di rete.

header http
Idempotency-Key: 7f3c2b1a-9e44-4c01-8b2a-1d6f0e9a2c33

Rate limit

60 richieste al minuto per API key. Oltre soglia: 429 RATE_LIMITED con details.retry_after_ms (millisecondi da attendere).

Soglia di confidenza

Se l'OCR ha confidenza < 0.95 (configurabile via options.requireConfidence) o emergono blockingIssues, la risposta ha status: "needs_review" e non viene prodotto un XML autoritativo. Mostra i campi all'operatore per conferma, poi usa POST /v1/autofatture con i dati corretti.

Recognize

POST/v1/documents:recognizedisponibile

Carichi un PDF, ottieni i dati estratti, la confidence e il TD suggerito. Non genera l'XML: è lo step di anteprima e validazione.

richiesta · json
{
  "studioId": "azienda-123",
  "fileBase64": "<PDF in base64>",
  "mimeType": "application/pdf",
  "fileName": "anthropic.pdf"
}
risposta · 200
{
  "status": "ok",      // "needs_review" se < 0.95
  "confidence": 0.97,
  "suggestedTd": "TD17",
  "extracted": { "supplierName": "Anthropic PBC" },
  "blockingIssues": []
}

Process → XML

POST/v1/autofatture:processdisponibile

Il "fai tutto": carichi il PDF e ottieni l'autofattura con l'XML FatturaPA pronto all'invio. Incapsula l'intero motore. Se non passi cessionario, vengono usati i dati dell'azienda.

richiesta · json
{
  "studioId": "azienda-123",
  "fileBase64": "<PDF base64>",
  "mimeType": "application/pdf",
  "cessionario": { "denominazione": "Alfa S.r.l." },
  "options": { "generateTd01": true }
}
risposta · 200
{
  "status": "ok",
  "autofatturaId": "AF/2026/00001",
  "td": "TD17",
  "xml": "<?xml …>",          // non firmato
  "companionTd01Xml": "<?xml …>",
  "importoTotaleCents": 12200
}
!
L'XML è non firmato. La firma (CAdES .p7m) e l'invio a SDI sono a carico tuo.

Create

POST/v1/autofatturedisponibile

Se hai già i dati strutturati (estratti da recognize e corretti dall'operatore), generi l'XML senza ripassare dall'OCR.

richiesta · json
{
  "studioId": "azienda-123",
  "fatturaData": {
    "tipo": "TD17",
    "fornitoreEstero": { "denominazione": "Anthropic PBC", "paese": "US" },
    "linee": [{ "descrizione": "API usage", "prezzoUnitario": 100, "aliquotaIva": 22 }]
  }
}

Risposta identica a :process (con xml e companionTd01Xml).

Gestione & webhook

Le autofatture create vengono persistite e sono recuperabili; gli eventi sono notificabili via webhook.

GET/v1/autofatturedisponibile
GET/v1/autofatture/{id}disponibile
GET/v1/autofatture/{id}/courtesy-pdfdisponibile
POST/v1/webhooksdisponibile

Registra un URL HTTPS con POST /v1/webhooks: ricevi un secret e, ad ogni autofattura creata, un evento autofattura.created firmato (header X-Optlyx-Signature = HMAC-SHA256 del body).

POST/v1/autofatture/{id}:correctionsin arrivo

Dati dell'azienda cliente (cessionario)

In un'autofattura l'azienda italiana è il CessionarioCommittente; il fornitore estero è il CedentePrestatore (estratto dal PDF, non lo configuri tu). Devi quindi fornire i dati fiscali dell'azienda — gli stessi che metterebbe su una sua fattura.

Due modi: passa l'oggetto cessionario direttamente nella call :process / autofatture (consigliato, nessuna config lato Optlyx), oppure registra l'azienda come tenant studioId con questi campi.

CampoObbligatorioNote
partitaIva11 cifre, senza IT né spazi — è l'IdFiscaleIVA
denominazioneRagione sociale — oppure nome+cognome per ditta individuale
sede.indirizzo / cap / comune / provincia / nazioneCAP 5 cifre, provincia 2 lettere, nazione IT
codiceFiscaleconsigliatoPer le società = P.IVA; persone fisiche CF 16 caratteri
regimeFiscaleconsigliatoRF01 ordinario, RF19 forfettario… (default RF01)
pecopzionaleRecapito dell'azienda
codiceDestinatarioIgnorato: nell'autofattura è sempre 0000000 (auto-fatturazione)

Non serve all'azienda: canale/credenziali SDI (l'invio lo fai tu), firma digitale, dati del fornitore estero (estratti dal PDF), numerazione protocollo (automatica per tenant/anno/tipo; forzabile con numeroOverride).

Esempi JSON completi (società + ditta individuale) e troubleshooting degli scarti SDI tipici: configurazione-azienda.md.

Codici TD gestiti

TDQuandoNote
TD17Integrazione/autofattura per servizi da fornitore esteroObbligatoria · reverse charge
TD18Acquisto intracomunitario di beniUE
TD19Acquisto beni ex art.17 c.2 (fornitore estero, beni in IT)incl. San Marino
TD01Fattura ordinaria (companion volontario)contabilizzazione automatica

Errori

Tutte le risposte di errore hanno la forma { "error": { "code", "message", "details?" } }. Il campo code è stabile: gestiscilo programmaticamente, non parsare message.

HTTPcodeSignificato
400BAD_REQUESTPayload mancante o malformato
401UNAUTHORIZEDAPI key assente / non valida / revocata
403TENANT_FORBIDDENLa key non è abilitata per quello studioId
409IDEMPOTENCY_CONFLICTStessa Idempotency-Key ancora in elaborazione
422OCR_LOW_CONFIDENCEScansione illeggibile / sotto soglia
422VIES_FAILED · INVALID_TDVAT UE non validabile · TD non coerente
429RATE_LIMITEDTroppe richieste (vedi retry_after_ms)

Esempio completo

Da PDF a XML emettibile in una sola chiamata:

bash · curl
curl -X POST '…/partnerApi/v1/autofatture:process' \
  -H 'Authorization: Bearer pk_test_xxx' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3c-...' \
  -d '{
    "studioId": "azienda-123",
    "fileBase64": "'"$(base64 -i anthropic.pdf)"'",
    "mimeType": "application/pdf"
  }'

Ricevi l'XML, lo firmi e lo invii a SDI dal tuo canale. Fine.

Per LLM & agenti

La documentazione è pubblicata anche in formato leggibile dalle macchine:

RisorsaUso
openapi.yamlSpecifica OpenAPI 3.1 con esempi e code samples — importabile in Postman / Insomnia.
llms.txtIndice conciso (standard llmstxt.org) per orientare un agente.
llms-full.txtRiferimento completo in un unico markdown: un LLM lo ingerisce e scrive l'integrazione.
configurazione-azienda.mdQuali dati deve avere l'azienda cliente (cessionario) per un'autofattura valida — campi, esempi, troubleshooting SDI.