{"revision":"0ed62d2c742f8e20","language":"it","entry":{"id":"publish-statement","kind":"endpoint","group":"manage","title":"Pubblica una dichiarazione firmata","method":"POST","path":"/v1/identities/{n}/statements","paths":[],"summary":"Una persona o un’organizzazione pubblica una dichiarazione con titolo, testo e un link facoltativo, o ne ritira una precedente. I testimoni del registro le danno una data.","response":"201 con la dichiarazione come la danno le pagine della scheda, con la voce del registro e la prova.","parameters":[{"name":"n","description":"Numero permanente positivo della scheda.","in":"path","required":true}],"sample":"/v1/identities/1/statements","access":"signed","base":"directory","notes":["Una persona firma con una sua chiave di dispositivo; un’organizzazione tramite un proprietario o un amministratore, con una chiave della propria scheda, come per le sue versioni.","Al più 10 dichiarazioni per scheda in 24 ore, ritiri compresi. GET su questo percorso è la pagina delle dichiarazioni dello staff (from, size)."],"errors":["400 invalid_json","400 invalid_nonce","400 invalid_parameter","400 invalid_signature_alg","400 invalid_timestamp","400 wrong_format","401 invalid_signature","401 missing_signature","401 stale_timestamp","403 identity_banned","403 key_banned","403 key_mismatch","403 role_not_allowed","404 not_found","409 already_retracted","409 erase_pending","409 replayed_nonce","409 signer_stale","410 erased","413 payload_too_large","422 bad_entry","422 invalid_statement","429 rate_limited","429 statement_quota","500 internal_error","503 busy","503 log_unavailable"],"related":["card-statements","statement","statements-feed","signed-requests"],"sections":[{"kind":"code","language":"shell","code":"curl -fsS -X POST \\\n  -H \"X-Public-Key: $PUBLIC_KEY\" \\\n  -H \"X-Signature: $REQUEST_SIGNATURE\" --json @request.json \\\n  \"https://veil.rip/v1/identities/1/statements\""}],"live":false,"bodyFields":[{"name":"statement","description":"{link, retracts, text, time, title, type: \"statement\", v: 1}: un titolo da 1 a 200 caratteri, un testo da 1 a 4 000, un link https o null, e l’id della dichiarazione che ritira o null.","in":"body","required":true},{"name":"salt","description":"32 byte casuali in 64 caratteri hex minuscoli, scelti dal browser.","in":"body","required":true},{"name":"entry","description":"{text, signature}: la voce {c, key, kind, signer, time, token, v: 2} in JSON canonico senza firma, e la firma di \"veil-rubrica:card-entry:v2\\n\" + text con X-Public-Key.","in":"body","required":true}],"responses":[{"status":201,"contentType":"application/json","description":"La dichiarazione, la sua voce e la sua prova.","fields":[{"name":"id","type":"integer","description":"La posizione della voce nel registro: l’id permanente della dichiarazione."},{"name":"kind","type":"string","description":"statement oppure alert."},{"name":"n","type":"integer","description":"La scheda che fa la dichiarazione."},{"name":"signer","type":"object","description":"n e token della scheda di persona la cui chiave ha firmato: la scheda stessa, o un proprietario o amministratore di un’organizzazione."},{"name":"statement","type":"string","description":"La dichiarazione come è stata firmata, in JSON canonico. I suoi campi sono ripetuti sotto per mostrarli."},{"name":"salt","type":"string","description":"32 byte in hex: c della voce è SHA-256(salt ‖ statement)."},{"name":"entry","type":"string","description":"La voce del registro con la firma, come il registro la tiene."},{"name":"i","type":"integer","description":"La posizione della voce nel registro (la stessa di id)."},{"name":"publishedAt","type":"string | null","description":"La prima controfirma sul primo checkpoint che contiene la voce."},{"name":"checkpoint","type":"object | null","description":"size e note del checkpoint controfirmato che data la voce. Null quando il registro non si legge."},{"name":"inclusion","type":"array<string> | null","description":"La prova di inclusione RFC 6962 della voce in quel checkpoint, in hex, dal più profondo."},{"name":"title","type":"string","description":"Il titolo, da 1 a 200 caratteri."},{"name":"text","type":"string","description":"Il testo, da 1 a 4 000 caratteri, con gli a capo."},{"name":"link","type":"string | null","description":"Un link https facoltativo."},{"name":"retracts","type":"integer | null","description":"L’id della dichiarazione che questa ritira."},{"name":"retractedBy","type":"object | null","description":"id, publishedAt e title della dichiarazione che ritira questa."},{"name":"url","type":"string","description":"La pagina della dichiarazione."}]}],"responseObjects":[],"errorFormat":"json","responseHeaders":[{"name":"Content-Type","value":"application/json","description":"Usa il tipo dichiarato per scegliere come leggere il corpo."},{"name":"Date","value":"HTTP date","description":"Ora del server. Confrontala con il tuo orologio per firmare le richieste."},{"name":"Cache-Control","value":"no-store","description":"Richiedila ogni volta: una dichiarazione o un avviso nuovi si vedono subito."}],"errorDetails":[{"status":400,"code":"invalid_json","description":"Il corpo non è un oggetto JSON, contiene chiavi duplicate o dati finali.","action":"Invia un solo oggetto JSON valido con `Content-Type` application/json.","scope":"common"},{"status":400,"code":"invalid_nonce","description":"Il nonce della richiesta firmata ha un formato errato.","action":"Genera un nuovo nonce da 16 a 128 caratteri usando lettere, cifre, _ o -.","scope":"common"},{"status":400,"code":"invalid_parameter","description":"Un campo del percorso, della query o del corpo manca, è malformato o fuori intervallo.","action":"Correggi il campo indicato in `error.message` prima di inviare di nuovo.","scope":"endpoint"},{"status":400,"code":"invalid_signature_alg","description":"`X-Signature-Alg` non è supportato.","action":"Usa un algoritmo di firma supportato e la codifica corretta per chiave e firma.","scope":"common"},{"status":400,"code":"invalid_timestamp","description":"Il timestamp della richiesta firmata non è espresso in millisecondi Unix.","action":"Usa un timestamp Unix intero in millisecondi e firma la richiesta corretta.","scope":"common"},{"status":400,"code":"wrong_format","description":"La richiesta o la lettura appartiene all’altro formato del registro di questo server: un record v1 su un registro in formato 2, o una lettura del formato 2 su un registro in formato 1.","action":"Leggi `format` in GET /v1/log (assente vuol dire 1) e manda la forma di quel formato.","scope":"endpoint"},{"status":401,"code":"invalid_signature","description":"La firma della richiesta HTTP non è valida.","action":"Firma metodo, percorso e byte del corpo esatti, senza modificarli dopo.","scope":"common"},{"status":401,"code":"missing_signature","description":"La richiesta richiede una firma del dispositivo e le intestazioni mancano o non sono leggibili.","action":"Invia `X-Public-Key`, `X-Signature` e i metadati della richiesta firmata. Una chiave API non sostituisce la firma del dispositivo.","scope":"common"},{"status":401,"code":"stale_timestamp","description":"Il timestamp firmato è fuori dalla finestra temporale ammessa.","action":"Confronta l’intestazione Date del server con il tuo orologio, poi genera nuovi nonce, timestamp e firma.","scope":"common"},{"status":403,"code":"identity_banned","description":"La scheda che agisce è sospesa dallo staff di Veil.","action":"Attendi la fine della restrizione o chiedi allo staff di riesaminarla.","scope":"endpoint"},{"status":403,"code":"key_banned","description":"La chiave del dispositivo che firma è sospesa dallo staff di Veil.","action":"Usa una chiave attiva autorizzata o chiedi allo staff di riesaminare la restrizione.","scope":"endpoint"},{"status":403,"code":"key_mismatch","description":"La chiave di firma non è autorizzata per questa scheda o operazione.","action":"Usa una chiave di dispositivo attiva con il ruolo di titolare o membro richiesto.","scope":"endpoint"},{"status":403,"code":"role_not_allowed","description":"Il ruolo che firma non può eseguire questa modifica.","action":"Usa una chiave con il ruolo richiesto.","scope":"endpoint"},{"status":404,"code":"not_found","description":"La scheda, la chiave, l’alias, il codice o la risorsa richiesti non sono stati trovati.","action":"Controlla l’identificatore. Codici e anteprime temporanei potrebbero essere scaduti o già usati.","scope":"endpoint"},{"status":409,"code":"already_retracted","description":"La dichiarazione indicata in `retracts` è già ritirata.","action":"Pubblica invece una dichiarazione nuova.","scope":"endpoint"},{"status":409,"code":"erase_pending","description":"Su un registro in formato 2 la scheda ha una cancellazione in attesa. La sua chiusura firmata nomina la versione corrente, quindi la scheda non pubblica finché la cancellazione non è annullata.","action":"Annulla la cancellazione con POST /v1/identities/{n}/erase/cancel, poi pubblica la versione.","scope":"endpoint"},{"status":409,"code":"replayed_nonce","description":"La chiave di firma ha già usato questo nonce.","action":"Controlla se la richiesta precedente è riuscita prima di crearne una nuova firmata.","scope":"common"},{"status":409,"code":"signer_stale","description":"Su un registro in formato 2 `signer.n` di una voce firmata è indietro rispetto alla versione corrente della scheda che firma.","action":"Rileggi la scheda che firma e firma di nuovo la voce con la sua versione corrente in `signer.n`.","scope":"endpoint"},{"status":410,"code":"erased","description":"La scheda esisteva ed è stata cancellata o rimossa. La risposta contiene anche la ricevuta pubblica di cancellazione.","action":"Smetti di usare questa scheda come autorità corrente. Conserva soltanto la ricevuta pubblica se serve.","scope":"endpoint"},{"status":413,"code":"payload_too_large","description":"Il corpo della richiesta supera il limite in byte dell’endpoint.","action":"Riduci il corpo codificato. La gestione delle chiavi API ammette al massimo 8 KiB.","scope":"common"},{"status":422,"code":"bad_entry","description":"Su un registro in formato 2 `salt`, `entry` o `closing` di una richiesta non vanno bene. `error.message` nomina il campo.","action":"Correggi il campo indicato, firma di nuovo la voce con la chiave della richiesta e manda una nuova richiesta firmata.","scope":"endpoint"},{"status":422,"code":"invalid_statement","description":"Un avviso o una dichiarazione di una scheda non rispetta lo schema: un campo mancante o in più, un testo troppo lungo o con caratteri nascosti, un link non https, una data nel futuro.","action":"Correggi il campo indicato in `error.message` e firma di nuovo la dichiarazione e la sua voce.","scope":"endpoint"},{"status":429,"code":"rate_limited","description":"È stato superato un limite anonimo, delle richieste firmate o della chiave API.","action":"Attendi almeno i secondi indicati da `Retry-After`. Condividi coda e budget dei tentativi tra i tuoi processi.","scope":"common"},{"status":429,"code":"statement_quota","description":"La scheda ha pubblicato 10 dichiarazioni nelle ultime 24 ore, ritiri compresi.","action":"Aspetta i secondi indicati da `Retry-After`.","scope":"endpoint"},{"status":500,"code":"internal_error","description":"Si è verificato un errore imprevisto del server. I dettagli interni non vengono restituiti.","action":"Riprova le letture con attese crescenti e un limite. Controlla l’esito delle scritture prima di inviare una nuova operazione firmata.","scope":"common"},{"status":503,"code":"busy","description":"L’applicazione ha raggiunto un limite temporaneo di concorrenza o del database.","action":"Attendi i secondi indicati da `Retry-After` e riprova con attese crescenti e un limite.","scope":"common"},{"status":503,"code":"log_unavailable","description":"Al momento il registro pubblico non può essere letto, verificato o usato per pubblicare.","action":"Per le letture, considera il risultato non verificato e riprova più tardi. Prima di ripetere una scrittura, leggi la scheda per controllare se la pubblicazione è terminata.","scope":"endpoint"}],"documentationUrl":"https://veil.rip/docs/publish-statement?lang=it","supportsBrowserFetch":false,"browserMode":"local-or-server"}}