openapi: 3.2.0 info: title: imgauth — API di attestazione opere digitali Cert Pdf API version: 1.34.1 description: 'Motore di attestazione Spazio Genesi ETS. Full privacy: l''impronta SHA-256 si calcola sul client, il file non viene mai inviato al server. Contratto reale in italiano (non tradurre i nomi campo). Vedi https://attestazione.spaziogenesi.org per l''interfaccia utente e https://github.com/SPAZIO-GENESI/imgauth per il codice sorgente (AGPL-3.0).' contact: name: Spazio Genesi ETS url: https://spaziogenesi.org license: name: AGPL-3.0-only url: https://github.com/SPAZIO-GENESI/imgauth/blob/main/LICENSE servers: - url: https://imgauth.spaziogenesi.org description: produzione tags: - name: Cert Pdf paths: /api/cert-pdf: post: summary: Genera il certificato PDF firmato description: 'Riceve l''oggetto restituito da POST /api/hash (deve includere `attestazione` + `hmac`, verificati server-side prima di firmare). Chiama authart server-to-server per la firma crittografica; archivia copia in R2. Campo facoltativo `lang` (it|en, P41): sceglie la lingua dei messaggi d''errore e della prosa disegnata a runtime nel PDF (stringa di attestazione, dati dichiarati, dettagli tecnici, data leggibile). Le etichette del template AcroForm (TITOLO, DIMENSIONE, MIME, SHA-256…) restano italiane. Non influisce sul contenuto attestato né sulla firma HMAC: lo stesso token è valido in entrambe le lingue.' security: - agentBearer: [] - voucherHeader: [] - {} requestBody: required: true content: application/json: schema: type: object description: Oggetto completo restituito da POST /api/hash responses: '200': description: PDF firmato content: application/pdf: schema: type: string format: binary '400': description: attestazione incoerente con sha256/timestamp_iso '403': description: HMAC non valido '429': description: 'Rate limit per-IP (10/60s, il più basso dell''API: endpoint costoso)' '503': description: HMAC_SECRET non configurato (fail-closed), oppure firma temporaneamente non disponibile (es. deploy del firmatario in corso) — messaggio generico, riprovare tra qualche minuto tags: - Cert Pdf components: securitySchemes: agentBearer: type: http scheme: bearer bearerFormat: sg_k__ oppure sg_s__ description: 'Credenziale agente (P21): API key per convenzioni o session token da device flow. Sblocca SOLO il bypass della challenge Turnstile su POST /api/hash — HMAC, timestamp server e rate limit per-IP restano invariati. Facoltativa: senza header, il percorso Turnstile è identico a prima.' voucherHeader: type: apiKey in: header name: X-SG-Voucher description: 'Voucher firmato stateless (P25 §2.7): ottenuto SOLO tramite il flusso OAuth "Attesta con la tua email" sul sito — non c''è un endpoint pubblico in questo contratto che lo emette. TTL 8h. Bypassa il solo Turnstile su /api/hash e /api/cert-pdf, applica pool/tetto di un''eventuale convenzione o la fascia Professionale — stesso principio del bearer agente.'