{"revision":"0ed62d2c742f8e20","language":"it","entry":{"id":"publish-alert","kind":"endpoint","group":"manage","title":"Dichiara un account rubato, abbandonato o spostato","method":"POST","path":"/v1/identities/{n}/alerts","paths":[],"summary":"Il proprietario firma un avviso su uno degli account collegati della scheda. Da quel momento ogni ricerca di quell’account si apre con l’avviso, finché un avviso regained non lo chiude.","response":"201 con l’avviso come lo dà GET /v1/identities/{n}/alerts, 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/alerts","access":"signed","base":"directory","notes":["Firmata da una chiave attiva della persona: una chiave di dispositivo o la chiave di recupero del file di backup, quella che resta quando un dispositivo è stato rubato insieme all’account.","Al più 10 avvisi per scheda in 24 ore. Le organizzazioni non ne hanno."],"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","404 not_found","409 action_pending","409 alert_in_force","409 alert_not_in_force","409 erase_pending","409 replayed_nonce","409 signer_stale","410 erased","413 payload_too_large","422 account_not_linked","422 bad_entry","422 invalid_statement","422 not_a_person","429 alert_quota","429 rate_limited","500 internal_error","503 busy","503 log_unavailable"],"related":["card-alerts","lookup","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/alerts\""}],"live":false,"bodyFields":[{"name":"statement","description":"{platform, since, state, subject, time, to, type: \"alert\", v: 1}. state è stolen (since una data, AAAA-MM-GG), abandoned, moved (to = {handle, subject}) oppure regained.","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":"L’avviso, 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":"platform","type":"string","description":"La piattaforma dell’account."},{"name":"subject","type":"string","description":"L’id stabile dell’account, come lo prende GET /v1/lookup."},{"name":"display","type":"string","description":"Il nome che la scheda mostra per l’account."},{"name":"state","type":"string","description":"stolen, abandoned, moved oppure regained."},{"name":"since","type":"string | null","description":"Per stolen: la data del furto, AAAA-MM-GG."},{"name":"to","type":"object | null","description":"Per moved: handle, e subject quando il nuovo account è collegato alla scheda."},{"name":"logIndex","type":"integer","description":"La posizione della voce nel registro."}]}],"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":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":"action_pending","description":"Un avviso precedente sullo stesso account, o un’azione dello staff della stessa famiglia, aspetta ancora il registro.","action":"Riprova quando è pubblicato, entro qualche minuto.","scope":"endpoint"},{"status":409,"code":"alert_in_force","description":"L’account ha già questo stesso avviso.","action":"Non serve altro. Per correggere la data o il nuovo account, manda l’avviso con i dati nuovi.","scope":"endpoint"},{"status":409,"code":"alert_not_in_force","description":"`regained` chiude un avviso, e l’account non ne ha uno in vigore.","action":"Leggi gli avvisi della scheda (GET /v1/identities/{n}/alerts) prima di chiuderne uno.","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":"account_not_linked","description":"L’avviso riguarda un account che la scheda non ha, oppure `to.subject` non è un altro account della scheda sulla stessa piattaforma.","action":"Indica un account collegato, oppure lascia `to.subject` null e scrivi il nuovo nome.","scope":"endpoint"},{"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":422,"code":"not_a_person","description":"La scheda è un’organizzazione dove è richiesta una persona.","action":"Usa l’endpoint delle organizzazioni oppure la scheda di una persona idonea.","scope":"endpoint"},{"status":429,"code":"alert_quota","description":"La scheda ha fatto 10 avvisi sugli account nelle ultime 24 ore.","action":"Aspetta i secondi indicati da `Retry-After`.","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":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-alert?lang=it","supportsBrowserFetch":false,"browserMode":"local-or-server"}}