{"revision":"6ba549855354e504","language":"it","entry":{"id":"start-move","kind":"endpoint","group":"manage","title":"Comincia a spostare un browser","method":"POST","path":"/v1/moves","paths":[],"summary":"Chiedi un trasloco per la chiave nuova di questo browser, firmato da quella chiave. Il trasloco resta aperto dieci minuti.","response":"201 con nonce, key, expiresAt e approve, l’indirizzo della pagina vecchia che lo approva (solo dati pubblici).","parameters":[],"sample":"/v1/moves","access":"signed","base":"directory","notes":["Spostare un browser dal vecchio indirizzo della rubrica al nuovo (dal 6 novembre 2026): una chiave vive sull’origine che l’ha fatta, quindi il nuovo indirizzo fa una chiave sua e la scheda la aggiunge con una versione firmata al vecchio indirizzo, nello stesso browser. La versione resta da parte finché la chiave nuova non torna con il segreto.","Al più 10 all’ora per IP, come i codici di accoppiamento. Una chiave già su una scheda non ha niente da spostare."],"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 key_banned","404 no_move","409 key_already_used","409 replayed_nonce","413 payload_too_large","429 rate_limited","500 internal_error","503 busy"],"related":["signed-requests"],"bodyFields":[],"live":false,"responseObjects":[],"errorFormat":"json","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":"endpoint"},{"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":"endpoint"},{"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":"endpoint"},{"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":"endpoint"},{"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":"endpoint"},{"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":"endpoint"},{"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":"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":404,"code":"no_move","description":"Questa rubrica ha un indirizzo solo, quindi non c’è un browser da spostare.","action":"Fai una scheda o accedi a questo indirizzo.","scope":"endpoint"},{"status":409,"code":"key_already_used","description":"Una chiave del dispositivo appartiene già a un’identità e non può essere riusata da un’altra.","action":"Usa la scheda esistente oppure genera una nuova chiave del dispositivo.","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":"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":"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":"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":"endpoint"},{"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":"endpoint"}],"sections":[{"kind":"code","language":"shell","code":"curl -fsS -X POST 'https://veil.pub/v1/moves' \\\n  -H \"X-Public-Key: $NEW_KEY\" -H \"X-Signature: $REQUEST_SIGNATURE\" --json @request.json"}],"responses":[{"status":201,"contentType":"application/json","description":"201 con nonce, key, expiresAt e approve, l’indirizzo della pagina vecchia che lo approva (solo dati pubblici).","fields":[{"name":"nonce","type":"string","description":"Il nome del trasloco negli indirizzi delle due pagine."},{"name":"key","type":"string","description":"La chiave nuova, Ed25519 in hex."},{"name":"expiresAt","type":"string","description":"Quando il trasloco si chiude, ISO 8601."},{"name":"approve","type":"string","description":"La pagina del vecchio indirizzo che lo approva."}]}],"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":"Non conservare le risposte private o temporanee in una cache condivisa."},{"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.pub/docs/start-move?lang=it","supportsBrowserFetch":false,"browserMode":"local-or-server"}}