Documentazione API
Un'API REST per creare, visualizzare e gestire segreti. Tutte le richieste e le risposte utilizzano JSON e tutta la crittografia e la decrittografia avvengono dalla vostra parte, quindi il testo in chiaro non raggiunge mai i nostri server.
Panoramica
L'URL di base per tutti gli endpoint dell'API è:
https://password.link/api
È possibile utilizzare l'API per gestire sia la crittografia che la decrittografia del segreto al di fuori del nostro servizio, senza dover caricare alcuna risorsa da noi. Inoltre, è possibile utilizzare qualsiasi tipo di metodo di consegna per la parte della password pubblica (metà della password che viene utilizzata per ricavare la chiave di crittografia del segreto) e, in pratica, creare qualsiasi tipo di configurazione personalizzata per la visualizzazione del segreto.
Per un codice completo e funzionante, consultate gli Esempi di API.
Autenticazione
Ogni richiesta deve essere autenticata con una chiave API, inviata nell'header Authorization:
Authorization: ApiKey public_key_abcd...
Esistono due tipi di chiavi API:
| Tipo di chiave | Descrizione |
|---|---|
| Chiave API pubblica | Pensata per creare una pagina personalizzata self-hosted per visualizzare i segreti. Può essere utilizzata in script pubblici. Consente solo di visualizzare e confermare i segreti. |
| Chiave API privata | Richiesta per tutte le altre azioni dell'API. Deve sempre rimanere privata. |
Entrambe le chiavi API contengono il tipo di chiave nella chiave stessa, in modo da poterle distinguere facilmente.
Ogni endpoint qui sotto indica quale tipo di chiave richiede.
Errori
Quando una richiesta fallisce, la risposta contiene un oggetto di errore:
{
"data": null,
"metadata": null,
"error": {
"message": "Ciphertext can't be blank",
"field": "ciphertext"
}
}
| Campo | Descrizione |
|---|---|
message |
Il messaggio di errore completo. |
field |
Il campo a cui si riferisce l'errore, quando si tratta di un errore di validazione. |
Il codice di stato HTTP della risposta indica anche il tipo di errore:
| Codice di stato | Descrizione |
|---|---|
403 Forbidden |
La richiesta non è stata consentita, ad esempio a causa di una chiave API non valida. |
404 Not Found |
La risorsa richiesta non è stata trovata. |
422 Unprocessable Content |
La richiesta è stata compresa ma non ha superato la validazione, ad esempio a causa di un parametro mancante o non valido. |
Crittografia dei segreti
I segreti vengono crittografati lato client prima di essere inviati all'API. Questa sezione descrive i formati della password e del testo cifrato attesi dal servizio.
Le parti della password
La password utilizzata per criptare il segreto in AES deve essere composta da due stringhe di 18 caratteri. La chiave di crittografia vera e propria sarà la concatenazione di queste due stringhe ("parte privata" + "parte pubblica") ed è derivata dalla password utilizzando PBKDF2.
Password: fkgjbnvlakwiejgutnFIGKEOTIRUBNAKQJRL
=> Private part: fkgjbnvlakwiejgutn
=> Public part: FIGKEOTIRUBNAKQJRL
La parte privata viene inviata all'API (codificata in Base64) e memorizzata con il segreto. La parte pubblica non viene mai inviata all'API e di solito viene consegnata nel link stesso, quindi noi non possiamo mai decrittografare il segreto.
Se utilizzate la pagina di visualizzazione del segreto fornita da noi, dovete codificare in Base64 anche la parte pubblica. Se utilizzate una pagina di visualizzazione self-hosted, potete usare lo stesso metodo o crearne uno vostro. Consultate gli Esempi di API per implementazioni di riferimento.
Formato del testo cifrato
Il testo cifrato è un oggetto JSON, codificato in Base64:
{
"cipher": "<Base64 encoded AES-GCM ciphertext>",
"iv": "<Base64 encoded 12-byte initialization vector>",
"salt": "<Base64 encoded 16-byte PBKDF2 salt>",
"iter": 10000
}
Per la crittografia del segreto è necessario utilizzare le seguenti impostazioni per AES:
| Impostazione | Valore |
|---|---|
| Modalità | AES-GCM con un tag di autenticazione a 128 bit aggiunto alla fine del testo cifrato (impostazione predefinita di Web Crypto) |
| Dimensione della chiave | 256 bits |
| Derivazione della chiave | PBKDF2 con SHA-256 |
| Iterazioni PBKDF2 | Il valore del campo iter. Intervallo consentito 1000-1000000, consigliamo 10000. |
| Vettore di inizializzazione | 12 byte casuali |
| Salt | 16 byte casuali |
Formato SJCL legacy (deprecato)
I testi cifrati creati con la Stanford Javascript Crypto Library (SJCL) sono ancora accettati: una stringa JSON di testo cifrato compatibile con SJCL codificata in Base64, che utilizza AES-GCM ("mode:gcm"), una chiave a 256 bit ("ks:256") e 10000 iterazioni PBKDF2 ("iter:10000"). Questo formato è deprecato e il suo supporto verrà rimosso in futuro.
Decrittografia dei segreti
L'API Visualizza il Segreto restituisce il testo cifrato esattamente come è stato memorizzato. I segreti creati nell'applicazione web utilizzano il formato Web Crypto descritto sopra. I segreti creati da client API più vecchi, dall'estensione per Chrome o da link ancora non aperti possono utilizzare il formato SJCL legacy.
Una pagina di visualizzazione self-hosted deve gestire entrambi i formati. Dopo aver decodificato il testo cifrato da Base64 a JSON, verificare la presenza di una chiave ct: se è presente, decrittografare con SJCL, altrimenti decrittografare con Web Crypto. Vedere l'esempio Visualizza il Segreto.
I client API che si limitano a creare segreti non richiedono modifiche: i testi cifrati SJCL continuano a essere accettati in fase di creazione. I client che decrittografano segreti recuperati dall'API devono aggiungere il supporto per Web Crypto, altrimenti falliranno sui segreti creati nell'applicazione web.
Creare un segreto
Crea un segreto crittografato e ne restituisce l'ID. Il testo cifrato deve essere creato come descritto in Crittografia dei segreti. Restituisce 201 Created in caso di successo.
Parametri della richiesta
| Parametro | Tipo | Descrizione |
|---|---|---|
ciphertextobbligatorio |
string |
Una stringa JSON di testo cifrato del segreto compatibile con Web Crypto, codificata in Base64. Sono accettati anche i testi cifrati legacy compatibili con SJCL (deprecato). |
password_part_privateobbligatorio |
string |
La parte privata della password utilizzata per crittografare il segreto, codificata in Base64. |
password_part_public |
string |
La parte pubblica della password, codificata in Base64. Richiesta solo quando si usa email_to affinché l'API possa inviare via email il link ospitato del segreto. |
description |
string |
Una descrizione per il segreto. Non è visibile durante la visualizzazione del segreto. |
message |
string |
Un messaggio per il segreto. Verrà mostrato insieme al segreto. |
expiration |
integer |
Un tempo di scadenza per il segreto, in ore. Valori possibili: 1-500. |
view_button |
boolean |
Mostra un pulsante per visualizzare il segreto invece di mostrare il segreto immediatamente dopo l'apertura del link. |
captcha |
boolean |
Mostra un semplice CAPTCHA prima di mostrare il segreto, principalmente per bloccare gli scanner automatici. |
password |
string |
Una password per il segreto. |
max_views |
integer |
Quante volte il segreto può essere visualizzato. Valori possibili: 1-100. |
email_to |
string |
Destinatari email separati da virgole che devono ricevere il link del segreto creato. Richiede password_part_public. |
otp_email_recipient |
string |
Indirizzo email che riceve una password monouso. Quando impostato, il destinatario deve inserire il codice inviato via email prima che il Secret possa essere visualizzato. |
otp_recipient |
string |
Accettato come alias di otp_email_recipient. Preferite otp_email_recipient per le nuove integrazioni. |
otp_sms_recipient |
string |
Numero di telefono che riceve una password monouso via SMS, in formato internazionale che inizia con + e senza spazi. |
allowed_ips |
string |
Indirizzi IP o intervalli CIDR separati da virgole autorizzati a visualizzare il Secret. |
allowed_locations |
array |
Array di codici paese ISO 3166-1 alpha-2 autorizzati a visualizzare il Secret. |
available_after |
datetime |
Data e ora prima delle quali il Secret non può essere visualizzato. |
secret_folder_id |
string |
ID di una cartella di Secret esistente di proprietà dell'utente della chiave API. |
reply_enabled |
boolean |
Abilitare una risposta monouso dal destinatario dopo che il Secret è stato visualizzato. |
ack_required |
boolean |
Richiedere la conferma del destinatario prima che il Secret possa essere visualizzato. |
ack_mode |
string |
Modalità di conferma. Usate checkbox o phrase. |
ack_phrase |
string |
Frase che il destinatario deve digitare. Obbligatoria quando ack_required è true e ack_mode è phrase. |
ack_disclosure_text |
string |
Testo di dichiarazione mostrato al destinatario, fino a 500 caratteri. |
ack_collect_name |
boolean |
raccogliere il nome del destinatario con la conferma. |
ack_name_required |
boolean |
Richiedere il nome del destinatario. Questo attiva anche ack_collect_name. |
ack_collect_org |
boolean |
raccogliere l'organizzazione del destinatario con la conferma. |
attachment |
object |
Metadati per un allegato crittografato, vedere Allegati. Richiede un piano attivo. |
attachment.file_name |
string |
Il nome file originale mostrato al destinatario. Obbligatorio quando viene fornito un allegato. |
attachment.file_type |
string |
Il tipo MIME originale, ad esempio text/plain o application/pdf. Obbligatorio quando viene fornito un allegato. |
attachment.file_size |
integer |
La dimensione originale non crittografata del file in byte. Obbligatorio quando viene fornito un allegato. |
Le impostazioni dei Secret del team possono disabilitare, richiedere o imporre valori predefiniti per le opzioni di Secret supportate. L'API applica queste regole del team quando crea un Secret.
Esempio di richiesta
curl -H "Authorization: ApiKey private_key_abcd" \
-H "Content-Type: application/json" \
-X POST https://password.link/api/secrets \
-d '{
"ciphertext": "eyJjaXBoZXIiOiJRc3hxsN3...aXRlciI6MTAwMDB9",
"password_part_private": "ZmtnamJudmxha3dpZWpndXRu",
"description": "Database credentials",
"expiration": 24,
"view_button": true,
"max_views": 1
}'
Esempio di risposta
{
"data": {
"id": "dT5g"
},
"metadata": {
"secrets_total": 70,
"secrets_usage": 25,
"secrets_allowance": 100,
"secret_requests_total": 10,
"secret_requests_allowance": 100
}
}
Il link al segreto si forma combinando l'URL della pagina di visualizzazione ospitata, l'ID del segreto e la parte pubblica della password codificata in Base64:
https://password.link/<id>/#<public password part, Base64>
Allegati
Il caricamento di un allegato è un processo in due fasi: prima si crea il segreto con i metadati dell'allegato (vedere Creare un segreto), poi si crittografa e si carica il payload crittografato dell'allegato all'URL di caricamento restituito.
Il contenuto del segreto e il contenuto dell'allegato vengono crittografati separatamente. Entrambi utilizzano dati AES-GCM compatibili con Web Crypto, codificati in Base64, ma i campi del payload sono codificati in modo diverso: il payload del segreto contiene campi codificati in Base64 e un campo iter, mentre il payload dell'allegato contiene campi di stringhe binarie grezze.
Crittografia dell'allegato
Prima della crittografia, rappresenta il file come URL di dati:
data:<mime-type>;base64,<base64 file bytes>
La password di crittografia dell'allegato è la parte privata grezza della password concatenata con la parte pubblica grezza (senza codifica Base64).
Crittografate quella stringa data URL con AES-GCM usando PBKDF2-SHA256, 10000 iterazioni, una chiave derivata a 256 bit, un salt casuale di 16 byte e un IV casuale di 12 byte. Memorizzate il payload crittografato dell'allegato come oggetto JSON, quindi codificate la stringa JSON in Base64:
{
"cipher": "<binary string>",
"iv": "<binary string>",
"salt": "<binary string>"
}
Caricamento del file crittografato
Quando è incluso un allegato, la risposta di creazione del segreto contiene una destinazione di caricamento in data.attachment.upload:
{
"data": {
"id": "dT5g",
"attachment": {
"file_name": "example.txt",
"upload": {
"url": "/api/secrets/dT5g/attachment",
"fields": {},
"metadata": {}
}
}
},
"metadata": {}
}
Caricate il JSON crittografato codificato in Base64 come text/plain usando multipart/form-data all'upload.url restituito. Aggiungete tutte le coppie chiave/valore restituite in upload.metadata o upload.fields ai dati del modulo prima di aggiungere il file crittografato. Il campo del file crittografato deve chiamarsi file.
Per gli URL di caricamento Password.link, includi la stessa chiave API privata nell'intestazione Authorization: ApiKey <key>. Gli URL di caricamento diretto su storage, come gli URL S3 prefirmati, devono ricevere solo i campi del modulo restituiti e il campo file crittografato.
Gli URL di caricamento ospitati su Password.link includono un oggetto fields vuoto. Gli URL di caricamento diretto su storage, come gli URL S3 pre-firmati, restituiscono i campi di firma in metadata.
I limiti di dimensione degli allegati dipendono dalla quota dell'account o del team e il caricamento crittografato è più grande del file originale perché il file viene convertito in Base64 e crittografato.
Visualizza il Segreto
Recupera il testo cifrato, la parte privata della password e altri dettagli di un segreto. Questo endpoint può essere utilizzato per creare una pagina personalizzata self-hosted per visualizzare il segreto che non carica script o altre risorse dal nostro servizio. Restituisce 200 OK in caso di successo.
Se il recupero di un segreto avviene con successo, esso viene automaticamente contrassegnato come visualizzato e quindi eliminato dal nostro database il testo cifrato e la parte della password privata, rendendo impossibile una nuova visualizzazione del segreto.
Il testo cifrato può essere nel formato Web Crypto o nel formato SJCL legacy. I payload SJCL si riconoscono da una chiave ct nel JSON decodificato. Vedere Decrittografia dei segreti.
Esempio di richiesta
curl -H "Authorization: ApiKey public_key_abcd" \
https://password.link/api/secrets/dT5g
Esempio di risposta
{
"data": {
"id": "dT5g",
"ciphertext": "eyJjaXBoZXIiOiJRc3hxsN3...aXRlciI6MTAwMDB9",
"password_part_private": "ZmtnamJudmxha3dpZWpndXRu",
"message": "Here are the credentials we talked about"
},
"metadata": null
}
Conferma Secret
Invia la conferma del destinatario per un segreto creato con ack_required e restituisce gli stessi dati del segreto di View Secret quando la conferma è valida. Restituisce 200 OK in caso di successo.
Se è richiesta la conferma, GET /api/secrets/<id> restituisce 403 Forbidden con secret_status impostato su ack_required finché non viene utilizzato questo endpoint.
I payload di conferma non validi o incompleti restituiscono anch'essi 403 Forbidden. Non vengono restituiti come errori di validazione.
Parametri della richiesta
| Parametro | Tipo | Descrizione |
|---|---|---|
ack_confirmed |
boolean |
Impostare su true per la conferma tramite casella di controllo. |
ack_phrase |
string |
Richiesto per la conferma con frase e deve corrispondere alla frase configurata per il Secret. |
ack_signer_name |
string |
Nome del destinatario, richiesto quando la raccolta del nome è abilitata e contrassegnata come obbligatoria. |
ack_signer_org |
string |
Organizzazione del destinatario, salvata quando la raccolta dell'organizzazione è abilitata. |
Esempio di richiesta
curl -H "Authorization: ApiKey public_key_abcd" \
-H "Content-Type: application/json" \
-X POST https://password.link/api/secrets/dT5g/acknowledge \
-d '{"ack_confirmed": true, "ack_signer_name": "Jane Doe"}'
Elenco Segreti
Recupera un elenco di segreti. Non contiene i testi cifrati né le parti private delle password, solo ID, descrizioni e simili. Restituisce 200 OK in caso di successo.
Il numero massimo di risultati restituiti per ogni interrogazione è limitato a 50. Potete controllare l'offset con il parametro opzionale offset, ad esempio: /api/secrets?offset=50
Esempio di richiesta
curl -H "Authorization: ApiKey private_key_abcd" \
https://password.link/api/secrets
Esempio di risposta
{
"data": [
{
"id": "dT5g",
"created_at": "2026-07-02T10:00:00.000Z",
"message": "Here are the credentials we talked about",
"description": "Database credentials",
"view_button": true,
"captcha": false,
"password": false,
"expiration": 24,
"expired": false,
"view_times": 1,
"max_views": 1,
"secret_folder_id": "5e976e6e-d205-4f58-8df9-5ac0048bc702",
"views": [
{
"viewed_at": "2026-07-02T12:34:56.000Z",
"viewed_by_ip": "192.0.2.10",
"viewed_by_user_agent": "Mozilla/5.0 ..."
}
]
}
],
"metadata": {
"secrets_total": 70,
"secrets_usage": 25,
"secrets_allowance": 100,
"secret_requests_total": 10,
"secret_requests_allowance": 100
}
}
Aggiorna Secret
Aggiorna le impostazioni e i metadati supportati di un segreto esistente. Restituisce 204 No Content in caso di successo.
PATCH non sostituisce il contenuto crittografato del segreto, non invia nuovamente le email di consegna e non crea metadati di caricamento degli allegati. Usate Create Secret per il testo cifrato, le parti della password, la consegna del link e gli allegati.
I seguenti parametri possono essere aggiornati, con lo stesso significato di Create Secret:
description, message, expiration, max_views,
view_button, captcha, password,
otp_email_recipient, otp_recipient, otp_sms_recipient,
allowed_ips, allowed_locations, available_after,
secret_folder_id, reply_enabled,
ack_required, ack_mode, ack_phrase, ack_disclosure_text,
ack_collect_name, ack_name_required, ack_collect_org
ciphertext, password_part_private, password_part_public, email_to e i metadati degli allegati possono essere impostati solo alla creazione. Vengono ignorati da PATCH.
Esempio di richiesta
curl -H "Authorization: ApiKey private_key_abcd" \
-H "Content-Type: application/json" \
-X PATCH https://password.link/api/secrets/dT5g \
-d '{"description": "Updated description", "otp_email_recipient": "recipient@example.com"}'
Cancellare il segreto
Elimina un segreto. Restituisce 200 OK in caso di successo.
Esempio di richiesta
curl -H "Authorization: ApiKey private_key_abcd" \
-X DELETE https://password.link/api/secrets/dT5g
Esempio di risposta
{
"data": null,
"metadata": {
"secrets_total": 69,
"secrets_usage": 24,
"secrets_allowance": 100,
"secret_requests_total": 10,
"secret_requests_allowance": 100
}
}
Crea cartella di Secret
Crea una cartella di segreti. Restituisce 201 Created in caso di successo.
Parametri della richiesta
| Parametro | Tipo | Descrizione |
|---|---|---|
nameobbligatorio |
string |
Nome della cartella. |
description |
string |
Descrizione della cartella. |
Esempio di risposta
{
"data": {
"id": "5e976e6e-d205-4f58-8df9-5ac0048bc702"
},
"metadata": {
"secrets_total": 70,
"secrets_usage": 25,
"secrets_allowance": 100,
"secret_requests_total": 10,
"secret_requests_allowance": 100
}
}
Elenca cartelle di Secret
Recupera un elenco di cartelle di segreti. Restituisce 200 OK in caso di successo.
Esempio di risposta
{
"data": [
{
"id": "5e976e6e-d205-4f58-8df9-5ac0048bc702",
"name": "Clients",
"description": "Client credentials",
"created_at": "2026-07-02T10:00:00.000Z",
"updated_at": "2026-07-02T10:00:00.000Z"
}
],
"metadata": {
"secrets_total": 70,
"secrets_usage": 25,
"secrets_allowance": 100,
"secret_requests_total": 10,
"secret_requests_allowance": 100
}
}
Aggiorna cartella di Secret
Aggiorna il nome e la descrizione di una cartella di segreti. Accetta gli stessi parametri di Create Secret Folder e restituisce 204 No Content in caso di successo.
Cancellare la cartella segreta
Elimina una cartella di segreti. Restituisce 200 OK in caso di successo.
Creare una richiesta segreta
Crea una nuova richiesta di segreto. Restituisce 201 Created in caso di successo.
Parametri della richiesta
| Parametro | Tipo | Descrizione |
|---|---|---|
description |
string |
Descrizione per la Richiesta segreta. |
message |
string |
Per il visualizzatore di richieste segrete. |
expiration |
integer |
Tempo di scadenza della richiesta segreta, in ore. |
limit |
integer |
Limite di utilizzo per la Richiesta segreta. |
send_request_to_email |
string |
Invia il link della richiesta segreta creata all'indirizzo e-mail indicato. |
send_request_to_sms |
string |
Inviare il link della Secret Request creata al numero di telefono indicato. |
send_to_email |
string |
Invia il link segreto creato con la Richiesta segreta all'indirizzo e-mail indicato. |
secret_description |
string |
Descrizione del segreto creato con la richiesta di segreto. |
secret_message |
string |
Per il segreto creato con la richiesta di segreto. |
secret_expiration |
integer |
Tempo di scadenza del segreto creato con la richiesta di segreto, in ore. |
secret_password |
string |
Password per il Secret creato usando la Secret Request. |
secret_max_views |
integer |
Limite di visualizzazione per il segreto creato con la richiesta di segreto. |
template_id |
string |
ID del modello di richiesta da usare. |
secret_allowed_emails |
string |
Indirizzi email o domini separati da virgole autorizzati ad aprire i Secret creati con questa Secret Request. |
secret_allowed_ips |
string |
Indirizzi IP o intervalli CIDR separati da virgole autorizzati ad aprire i Secret creati con questa Secret Request. |
Esempio di richiesta
curl -H "Authorization: ApiKey private_key_abcd" \
-H "Content-Type: application/json" \
-X POST https://password.link/api/secret_requests \
-d '{"description": "Request for VPN credentials", "expiration": 48}'
Esempio di risposta
{
"data": {
"id": "5e976e6e-d205-4f58-8df9-5ac0048bc702"
},
"metadata": {
"secrets_total": 70,
"secrets_usage": 25,
"secrets_allowance": 100,
"secret_requests_total": 10,
"secret_requests_allowance": 100
}
}
Elenco Richieste segrete
Recupera un elenco di richieste di segreto. Restituisce 200 OK in caso di successo.
Il numero massimo di risultati restituiti per ogni interrogazione è limitato a 50. Potete controllare l'offset con il parametro opzionale offset, ad esempio: /api/secret_requests?offset=50
La risposta dell'elenco non include secret_allowed_emails né secret_allowed_ips.
Esempio di richiesta
curl -H "Authorization: ApiKey private_key_abcd" \
https://password.link/api/secret_requests
Esempio di risposta
{
"data": [
{
"id": "5e976e6e-d205-4f58-8df9-5ac0048bc702",
"description": "Request for VPN credentials",
"message": "Please send me the VPN credentials",
"expiration": 48,
"limit": 1,
"send_request_to_email": "request-recipient@example.com",
"send_request_to_sms": "+358401234567",
"send_to_email": "example@example.com",
"secret_description": "VPN credentials",
"secret_message": null,
"secret_expiration": 24,
"secret_max_views": 1,
"secret_password": false,
"template_id": null
}
],
"metadata": {
"secrets_total": 70,
"secrets_usage": 25,
"secrets_allowance": 100,
"secret_requests_total": 10,
"secret_requests_allowance": 100
}
}
Eliminazione della richiesta segreta
Elimina una richiesta di segreto. Restituisce 200 OK in caso di successo.
Esempio di richiesta
curl -H "Authorization: ApiKey private_key_abcd" \
-X DELETE https://password.link/api/secret_requests/5e976e6e-d205-4f58-8df9-5ac0048bc702