{"revision":"0ed62d2c742f8e20","language":"it","entry":{"id":"person-card","kind":"endpoint","group":"cards","title":"Leggi la scheda di una persona","method":"GET","path":"/u/{card}.json","paths":["/u/{card}","/v1/identities/{n}"],"summary":"Leggi la scheda pubblica completa, il record firmato, la prova e la storia recente.","response":"La scheda contiene n, id, url, type, keys, links e proof. historyBefore indica la storia più vecchia. Una scheda cancellata restituisce una testimonianza pubblica con HTTP 410.","parameters":[{"name":"card","description":"Il numero permanente o l’alias corrente della scheda.","in":"path","required":true}],"sample":"/u/1.json","access":"public","base":"directory","notes":["Senza .json, manda Accept impostato a application/json. La variante /v1 richiede il numero permanente.","Su un registro in formato 2 la scheda aggiunge format, current, authority, authorityNext, state, index e standing, e proof porta la voce v2 al posto del record. index.statements è la prima pagina delle dichiarazioni dello staff sulla scheda, e index.statementsNext porta alla pagina dopo."],"errors":["400 invalid_parameter","401 invalid_api_key","403 api_key_scope","403 api_key_suspended","403 developer_suspended","404 not_found","410 erased","429 rate_limited","500 internal_error","503 busy"],"related":["statements","external-keys-file"],"sections":[{"kind":"code","language":"shell","code":"curl -fsS 'https://veil.rip/u/1.json'"},{"kind":"code","language":"javascript","code":"const response = await fetch(\"https://veil.rip/u/1.json\");\nconst result = await response.json();"}],"verify":"Verifica proof, la catena delle versioni e l’identità attesa. Il solo riepilogo non contiene questa prova.","live":true,"responses":[{"status":200,"contentType":"application/json","description":"La scheda contiene n, id, url, type, keys, links e proof. historyBefore indica la storia più vecchia. Una scheda cancellata restituisce una testimonianza pubblica con HTTP 410.","fields":[{"name":"n","type":"integer","description":"Numero permanente della scheda."},{"name":"url","type":"string","description":"URL permanente con il numero della scheda."},{"name":"name","type":"string","description":"Nome visualizzato corrente; un nome nascosto diventa Card seguito dal numero."},{"name":"initials","type":"string","description":"Iniziali da mostrare in assenza di un’immagine."},{"name":"since","type":"string","description":"Data della prima versione in YYYY-MM-DD UTC."},{"name":"id","type":"string","description":"Impegno della prima versione in hex, da cui deriva l’impronta."},{"name":"idSalt","type":"object | null","description":"Metà server e client del sale in hex. client può essere null."},{"name":"token","type":"string","description":"Pseudonimo stabile nel registro pubblico in base64url."},{"name":"version","type":"integer","description":"Versione pubblicata corrente."},{"name":"keys","type":"array<CardKey>","description":"Tutte le chiavi dei dispositivi e di recupero, incluse quelle revocate."},{"name":"links","type":"array<CardLink>","description":"Account collegati e subentri in attesa."},{"name":"orgs","type":"array<CardOrg>","description":"Affiliazioni accettate alle organizzazioni di una persona."},{"name":"events","type":"array<CardEvent>","description":"Pagina più recente della storia, ordinata al suo interno dalla più vecchia."},{"name":"witnesses","type":"object | null","description":"Conteggi signed, of e needed per la versione corrente. Sono controlli del server."},{"name":"nodes","type":"integer | null","description":"Numero di hash nel percorso di inclusione corrente."},{"name":"fingerprint","type":"Fingerprint","description":"Dodici parole per lingua e dodici gruppi di cinque cifre."},{"name":"proof","type":"CardProof | null","description":"Apertura e prova di inclusione correnti. Null indica che non è stato possibile verificare il registro; non considerarla verificata."},{"name":"erasure","type":"object | null","description":"requestedAt ed executesAt di una cancellazione in attesa."},{"name":"type","type":"string","description":"person o organization."},{"name":"members","type":"array<CardMember>, optional","description":"Presente per un’organizzazione, inclusi gli inviti in attesa."},{"name":"moderation","type":"object | null","description":"Stato e azioni pubbliche di moderazione."},{"name":"eventsTotal","type":"integer","description":"Totale degli eventi della storia in tutte le pagine."},{"name":"historyBefore","type":"integer | null","description":"Passalo come before all’endpoint della storia per leggere la pagina precedente."},{"name":"badges","type":"array<object>","description":"Badge attivi firmati o derivati."},{"name":"nameHidden","type":"object | null","description":"Motivo pubblico, since e logIndex del nome nascosto."},{"name":"logo","type":"object, optional","description":"Tipo e URL dell’immagine; omesso in assenza di un’immagine visibile."},{"name":"logoHidden","type":"object, optional","description":"Motivo pubblico del logo nascosto."},{"name":"alias","type":"string | null","description":"Alias corrente, che può cambiare."},{"name":"aliasUrl","type":"string | null","description":"Indirizzo dell’alias corrente. Usa n come identificatore permanente."},{"name":"format","type":"integer | optional","description":"2 su un registro in formato 2; assente nel formato 1."},{"name":"current","type":"V2Version | optional","description":"Formato 2: la versione corrente con label, body, signature, signedBy, logIndex, publishedAt ed entry."},{"name":"authority","type":"array<V2Version> | optional","description":"Formato 2: le versioni di autorità dalla 1, al più 50, ognuna con la sua voce del registro, i e la prova di inclusione sul checkpoint di index."},{"name":"authorityNext","type":"integer | null | optional","description":"Formato 2: da dove continua GET /v1/identities/{n}/authority?after=, o null."},{"name":"state","type":"object | optional","description":"Formato 2: head, keys, links, orgs, la prima pagina di members, external (le chiavi pubbliche di altri sistemi, [] senza) e le radici degli insiemi; roots.external c’è solo quando la scheda ha chiavi pubbliche di altri sistemi."},{"name":"external","type":"array<CardExternal> | optional","description":"Formato 2: le chiavi pubbliche di altri sistemi come la pagina le mostra, con il controllo del server in proofOk. Il tuo client rifà il controllo di ogni prova da state.external e non si affida a proofOk."},{"name":"index","type":"V2IndexBundle | null | optional","description":"Formato 2: il pacchetto d’indice della scheda sul checkpoint della prova, come il registro lo serve a /index/<token>, con in più statements e statementsNext. Null quando il registro non l’ha dato."},{"name":"standing","type":"integer | null | optional","description":"Formato 2: la posizione nel registro dell’ultima dichiarazione dello staff sulla scheda come la sa il server, o null. Il browser di un membro dello staff la mette in prev di una dichiarazione nuova. Il valore verificato è index.value.standing."},{"name":"alerts","type":"array<object> | optional","description":"Formato 2, una persona: gli avvisi in vigore sui suoi account collegati, uno per account (platform, subject, display, state, since, to, logIndex, publishedAt). La parola del server: controllali con GET /v1/identities/{n}/alerts."},{"name":"statements","type":"object | optional","description":"Formato 2: le dichiarazioni firmate della scheda in breve: total, latest (le tre più recenti: id, title, publishedAt, retracts, retracted, url), url e feed."}]},{"status":304,"contentType":"none","description":"Non modificato. La scheda ricostruita ha gli stessi byte dell’`ETag` che hai mandato. Riusa la scheda salvata con quell’ETag e verificala come sempre. Non c’è corpo nella risposta, e una scheda cancellata risponde comunque 410.","fields":[]}],"responseObjects":[{"id":"card-key","title":"Chiave del dispositivo","fields":[{"name":"id","type":"string","description":"Etichetta del dispositivo mostrata sulla scheda."},{"name":"alg","type":"string","description":"Nome leggibile dell’algoritmo."},{"name":"fp","type":"string","description":"Chiave pubblica completa presente nel record firmato."},{"name":"ed25519","type":"string","description":"Chiave Ed25519 o metà della chiave composita, in hex."},{"name":"since","type":"string","description":"Data di aggiunta della chiave."},{"name":"state","type":"string","description":"active, offline o revoked. Offline indica una chiave di recupero."},{"name":"revoked","type":"string | null","description":"Data di revoca, se revocata."},{"name":"role","type":"string","description":"Ruolo di firma assegnato alla chiave."},{"name":"addedIn","type":"integer","description":"Versione che ha aggiunto la chiave."},{"name":"revokedIn","type":"integer | null","description":"Versione che ha revocato la chiave."}],"typeName":"CardKey"},{"id":"card-link","title":"Account collegato","fields":[{"name":"service","type":"string","description":"Identificatore della piattaforma."},{"name":"handle","type":"string","description":"Nome visualizzato o account normalizzato."},{"name":"id","type":"string | null","description":"ID stabile del provider, quando distinto dal nome."},{"name":"how","type":"string","description":"Metodo di prova, per esempio oauth, dns_txt, well_known, emailCode o backlink."},{"name":"at","type":"string","description":"Data e ora del collegamento."},{"name":"state","type":"string","description":"active o pending."},{"name":"until","type":"string | null","description":"Scadenza del subentro in attesa."},{"name":"takeover","type":"integer | null","description":"ID del subentro in attesa."},{"name":"unicode","type":"string, optional","description":"Forma Unicode di un dominio internazionale. Usa il nome ASCII come identificatore."},{"name":"addedIn","type":"integer | null","description":"Versione che ha aggiunto il collegamento."},{"name":"logIndex","type":"integer | null","description":"Indice della versione nel registro, a partire da zero."},{"name":"check","type":"CardLinkCheck, optional","description":"Il ricontrollo periodico della prova fatto dal server (dal 30 ottobre 2026), per un collegamento attivo a un dominio, al Fediverso o a GitHub che ha controllato almeno una volta. È la sua parola, non fa parte della scheda firmata."}],"typeName":"CardLink"},{"id":"card-link-check","title":"Ricontrollo di una prova","fields":[{"name":"state","type":"string","description":"ok, failing (il posto ha risposto e la prova non c’è) o unreachable (nessuna risposta)."},{"name":"at","type":"string","description":"Data e ora dell’ultimo controllo che ha avuto una risposta."},{"name":"since","type":"string, optional","description":"Da quando la prova non si conferma. Manca finché è ok."},{"name":"reported","type":"boolean","description":"Vero quando sono passati 30 giorni senza conferma e il proprietario è stato avvisato. Il collegamento resta."}],"typeName":"CardLinkCheck"},{"id":"fingerprint","title":"Impronta della scheda","fields":[{"name":"words","type":"object","description":"en e it contengono le stesse dodici posizioni nelle rispettive liste di parole."},{"name":"digits","type":"array<string>","description":"Dodici gruppi di cinque cifre decimali."}],"typeName":"Fingerprint"},{"id":"card-org","title":"Affiliazione a un’organizzazione","fields":[{"name":"n","type":"integer","description":"Numero permanente della scheda."},{"name":"url","type":"string","description":"URL permanente della scheda."},{"name":"name","type":"string","description":"Nome visualizzato, soggetto a moderazione."},{"name":"role","type":"string","description":"Ruolo dell’affiliazione accettata."},{"name":"since","type":"string","description":"Data e ora di inizio dell’affiliazione."},{"name":"nameHidden","type":"boolean","description":"Indica se lo staff nasconde il nome."},{"name":"logo","type":"object | null","description":"Tipo e URL dell’immagine, se disponibile."}],"typeName":"CardOrg"},{"id":"card-member","title":"Membro dell’organizzazione","fields":[{"name":"n","type":"integer","description":"Numero permanente della scheda del membro."},{"name":"url","type":"string","description":"URL della scheda del membro."},{"name":"name","type":"string","description":"Nome visualizzato del membro."},{"name":"role","type":"string","description":"Ruolo del membro."},{"name":"state","type":"string","description":"Stato dell’affiliazione, inclusi gli inviti in attesa."},{"name":"since","type":"string | null","description":"Data e ora di accettazione, se accettato."},{"name":"icon","type":"string | null","description":"Icona del ruolo, se presente."},{"name":"nameHidden","type":"boolean","description":"Indica se lo staff nasconde il nome del membro."},{"name":"logo","type":"object | null","description":"Tipo e URL dell’immagine."}],"typeName":"CardMember"},{"id":"card-event","title":"Evento nella storia della scheda","fields":[{"name":"t","type":"string","description":"Data e ora di pubblicazione in ISO 8601 UTC."},{"name":"kind","type":"string","description":"Tipo di modifica, per esempio created, added, revoked, renamed o takeover."},{"name":"by","type":"object","description":"device, key e identity di chi firma, dove disponibili."},{"name":"n","type":"integer | null","description":"Versione della scheda, oppure null per un evento esterno."},{"name":"logIndex","type":"integer | null","description":"Indice nel registro a partire da zero."},{"name":"device","type":"string | null","description":"Dispositivo interessato dalla modifica."},{"name":"service","type":"string | null","description":"Piattaforma interessata dalla modifica."},{"name":"handle","type":"string | null","description":"Account interessato dalla modifica."},{"name":"changes","type":"array<string>","description":"Tutte le modifiche della versione, in ordine fisso."}],"typeName":"CardEvent"},{"id":"proof","title":"Prova della scheda","fields":[{"name":"version","type":"integer","description":"Versione coperta dalla prova."},{"name":"record","type":"string","description":"Testo JSON canonico esatto che è stato firmato. Non riformattarlo prima della verifica."},{"name":"salt","type":"string","description":"Sale dell’impegno in hex."},{"name":"serverSalt","type":"string","description":"Contributo del server al sale, in hex."},{"name":"clientSalt","type":"string | null","description":"Contributo del dispositivo al sale, in hex, se usato."},{"name":"commitment","type":"string","description":"SHA-256 dei byte del sale seguiti dai byte del record, in hex."},{"name":"signedBy","type":"string","description":"Chiave pubblica di firma."},{"name":"signature","type":"string","description":"Firma sul prefisso identity-version e sul record esatto."},{"name":"entry","type":"string","description":"Testo canonico esatto della voce del registro."},{"name":"logIndex","type":"integer","description":"Indice della foglia a partire da zero."},{"name":"leafHash","type":"string","description":"SHA-256 di 0x00 seguito dai byte della voce, in hex."},{"name":"checkpoint","type":"Checkpoint","description":"Checkpoint firmato con size, root e note."},{"name":"inclusion","type":"array<string>","description":"Hash del percorso di inclusione in hex, dal fratello più profondo."},{"name":"witnesses","type":"array<string>","description":"Righe delle controfirme dei testimoni, presenti anche in checkpoint.note."}],"typeName":"CardProof"},{"id":"checkpoint","title":"Checkpoint","fields":[{"name":"size","type":"integer","description":"Numero di foglie nell’albero firmato."},{"name":"root","type":"string","description":"Hash della radice in base64."},{"name":"note","type":"string","description":"Nota firmata completa, incluse le firme del registro e dei testimoni."}],"typeName":"Checkpoint"},{"id":"v2-version","title":"Versione nel formato 2","typeName":"V2Version","fields":[{"name":"label","type":"string","description":"L’intestazione canonica esattamente come firmata, dopo il prefisso veil-rubrica:identity-version:v2 e un a capo. Per un’organizzazione porta signer, la scheda del membro che firma e la sua versione. Il suo hash è il c che l’indice tiene per la versione."},{"name":"body","type":"string","description":"Il corpo canonico: le operazioni fuori da label.auth e il sale. Non porta mai signer. label.body è il suo hash."},{"name":"signature","type":"string","description":"La firma sul prefisso e sull’intestazione."},{"name":"signedBy","type":"string","description":"La chiave che ha firmato."},{"name":"logIndex","type":"integer | null","description":"Posizione della voce della versione nel registro, da zero."},{"name":"publishedAt","type":"string | null","description":"Prima controfirma sul primo checkpoint che la conteneva."},{"name":"entry","type":"string","description":"La voce della versione nel registro, come testo: key, label, signature e v. L’indice verifica la firma da questa sola voce."},{"name":"i","type":"integer, optional","description":"Nell’elenco authority di una scheda: la posizione della voce nel registro, uguale a logIndex."},{"name":"inclusion","type":"array<string>, optional","description":"Nell’elenco authority di una scheda: la prova di inclusione della voce in hex, dal fratello più profondo, sul checkpoint di index. Manca senza un registro verificato."}]},{"id":"v2-index","title":"Pacchetto d’indice","typeName":"V2IndexBundle","fields":[{"name":"checkpoint","type":"object","description":"note, il checkpoint firmato dal registro con le controfirme dei testimoni, e size."},{"name":"entry","type":"object","description":"L’ultima voce d’indice del checkpoint: i, entry e la sua prova di inclusione."},{"name":"value","type":"object | null","description":"Il valore della scheda nell’indice: auth, closed, latest e standing. Null quando la scheda non è nell’indice."},{"name":"proof","type":"object","description":"bitmap e siblings: la prova di value sotto la radice della voce d’indice."},{"name":"tail","type":"array<object>","description":"Le voci dopo la voce d’indice, ognuna con i, entry e inclusion. Applica tu a value quelle di questa scheda."},{"name":"statements","type":"array<StatementEntry> | null","description":"La prima pagina, al più 200, delle dichiarazioni dello staff contate per la scheda, dalla più recente. La prima è value.standing e ogni prev è la i della successiva. Un array vuoto vuol dire nessuna dichiarazione, null che il server non è riuscito a leggere o a provare la catena."},{"name":"statementsNext","type":"string | null","description":"L’indirizzo della pagina dopo delle dichiarazioni, o null quando la catena finisce qui."}]},{"id":"statement-entry","title":"Voce di una dichiarazione","typeName":"StatementEntry","fields":[{"name":"i","type":"integer","description":"La posizione della voce nel registro."},{"name":"entry","type":"string","description":"Il testo della voce come lo tiene il registro, firma compresa."},{"name":"inclusion","type":"array<string>","description":"Prova di inclusione in hex, dal fratello più profondo, sul checkpoint del pacchetto d’indice della scheda."},{"name":"by","type":"integer, optional","description":"Numero della scheda del membro dello staff che ha firmato. Un’indicazione per la pagina: conta il signer della voce."}]},{"id":"card-external","title":"Chiave pubblica di altri sistemi","fields":[{"name":"type","type":"string","description":"ssh-ed25519, ssh-ecdsa-p256, ssh-ecdsa-p384, ssh-rsa, pgp, minisign, ed25519, ml-dsa-44, ml-dsa-65 o ml-dsa-87."},{"name":"fp","type":"string","description":"L’impronta come la stampano i suoi strumenti: SHA256:… per SSH e ML-DSA, le 40 cifre esadecimali maiuscole dell’impronta di versione 4 per OpenPGP, l’ID di 16 cifre per minisign, la chiave in hex per Ed25519."},{"name":"label","type":"string","description":"Il nome che la persona ha dato alla chiave, fino a 40 caratteri."},{"name":"pub","type":"string","description":"La chiave pubblica nella sua forma canonica, senza commento. Per OpenPGP, la base64 dei suoi pacchetti: la chiave principale con le sue auto-firme, gli user ID che la persona ha tenuto, le sottochiavi di firma."},{"name":"ids","type":"array<string> | optional","description":"Solo OpenPGP, quando la chiave porta user ID: quelli che la persona ha scelto di tenere, come li scrive la chiave. Il tuo client li rilegge da pub e mostra solo quelli con un’auto-certificazione valida."},{"name":"addedIn","type":"integer","description":"La versione della scheda che ha aggiunto la chiave."},{"name":"since","type":"string","description":"Quando quella versione è stata pubblicata."},{"name":"logIndex","type":"integer | null","description":"La voce del registro di quella versione."},{"name":"proofOk","type":"boolean","description":"Il controllo della prova fatto dal server. Solo informativo."},{"name":"anchor","type":"object | null","description":"Il checkpoint citato: origin, size, root e signedAt, l’orario delle controfirme del quorum."},{"name":"consistency","type":"object | null","description":"Una prova di coerenza RFC 6962 {size, proof} dalla taglia citata alla taglia del checkpoint della scheda, o null."}]}],"errorFormat":"json","errorDetails":[{"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":401,"code":"invalid_api_key","description":"La credenziale Bearer è malformata, sconosciuta, scaduta o revocata.","action":"Usa una chiave attiva. Per l’accesso pubblico anonimo, rimuovi del tutto `Authorization`. Credenziali non valide non attivano automaticamente l’accesso anonimo.","scope":"optional-api-key"},{"status":403,"code":"api_key_scope","description":"La chiave API non ha il permesso read o verify, oppure l’endpoint non accetta chiavi Bearer.","action":"Usa il permesso corretto. Le modifiche alle schede e la gestione delle chiavi richiedono una firma del dispositivo.","scope":"optional-api-key"},{"status":403,"code":"api_key_suspended","description":"Questa chiave API è sospesa.","action":"Chiedi allo staff di ripristinarla; un’altra chiave non rimuove la sospensione dell’account.","scope":"optional-api-key"},{"status":403,"code":"developer_suspended","description":"L’account API del titolare è sospeso oppure la scheda titolare non è disponibile.","action":"Controlla l’account titolare e le restrizioni dello staff. Creare un’altra chiave non aggira la sospensione.","scope":"optional-api-key"},{"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":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":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"}],"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":"ETag","value":"W/\"<SHA-256 of the JSON bytes>\"","description":"Rimandalo in `If-None-Match`. Il server ricostruisce la scheda con visibilità, moderazione e prove correnti, e risponde 304 solo se i byte del JSON sono gli stessi."},{"name":"Cache-Control","value":"private, no-cache, must-revalidate","description":"Una cache condivisa non conserva la scheda, e un client la riconvalida prima di ogni riuso."},{"name":"Retry-After","value":"integer seconds, on rate_limited or busy","description":"Attendi almeno questo intervallo prima di riprovare. Altri codici 429/503 non lo includono necessariamente."}],"documentationUrl":"https://veil.rip/docs/person-card?lang=it","supportsBrowserFetch":true,"browserMode":"fetch"}}