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 è:

URL
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:

HTTP
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:

JSON
{
  "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.

Esempio
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:

JSON
{
  "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

POST /api/secrets Chiave API privata

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
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

JSON
{
  "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:

URL
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:

URL
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:

JSON
{
  "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:

JSON
{
  "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

GET /api/secrets/<id> Chiave API pubblica

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
curl -H "Authorization: ApiKey public_key_abcd" \
     https://password.link/api/secrets/dT5g

Esempio di risposta

JSON
{
  "data": {
    "id": "dT5g",
    "ciphertext": "eyJjaXBoZXIiOiJRc3hxsN3...aXRlciI6MTAwMDB9",
    "password_part_private": "ZmtnamJudmxha3dpZWpndXRu",
    "message": "Here are the credentials we talked about"
  },
  "metadata": null
}

Conferma Secret

POST /api/secrets/<id>/acknowledge Chiave API pubblica

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
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

GET /api/secrets Chiave API privata

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
curl -H "Authorization: ApiKey private_key_abcd" \
     https://password.link/api/secrets

Esempio di risposta

JSON
{
  "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

PATCH /api/secrets/<id> Chiave API privata

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
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

DELETE /api/secrets/<id> Chiave API privata

Elimina un segreto. Restituisce 200 OK in caso di successo.

Esempio di richiesta

cURL
curl -H "Authorization: ApiKey private_key_abcd" \
     -X DELETE https://password.link/api/secrets/dT5g

Esempio di risposta

JSON
{
  "data": null,
  "metadata": {
    "secrets_total": 69,
    "secrets_usage": 24,
    "secrets_allowance": 100,
    "secret_requests_total": 10,
    "secret_requests_allowance": 100
  }
}

Crea cartella di Secret

POST /api/secret_folders Chiave API privata

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

JSON
{
  "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

GET /api/secret_folders Chiave API privata

Recupera un elenco di cartelle di segreti. Restituisce 200 OK in caso di successo.

Esempio di risposta

JSON
{
  "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

PATCH /api/secret_folders/<id> Chiave API privata

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

DELETE /api/secret_folders/<id> Chiave API privata

Elimina una cartella di segreti. Restituisce 200 OK in caso di successo.

Creare una richiesta segreta

POST /api/secret_requests Chiave API privata

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
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

JSON
{
  "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

GET /api/secret_requests Chiave API privata

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
curl -H "Authorization: ApiKey private_key_abcd" \
     https://password.link/api/secret_requests

Esempio di risposta

JSON
{
  "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

DELETE /api/secret_requests/<id> Chiave API privata

Elimina una richiesta di segreto. Restituisce 200 OK in caso di successo.

Esempio di richiesta

cURL
curl -H "Authorization: ApiKey private_key_abcd" \
     -X DELETE https://password.link/api/secret_requests/5e976e6e-d205-4f58-8df9-5ac0048bc702