API v1
Basis: https://eclair.kayzen-lyon.com/api/v1. Overal JSON, antwoorden worden nooit gecachet. Binaire gegevens zijn base64url zonder opvulling. openapi.json
Gouden regel: versleutel vóór het aanroepen van de API. Stuur nooit de linksleutel, de PIN of platte tekst. Het eenvoudigst is onze JavaScript-client (package api-client) of de CLI te gebruiken.
Routes
| Methode | Route | Doel |
|---|---|---|
POST | /secrets | Stocker un secret déjà chiffré |
POST | /secrets/{id}/preview | Libellé chiffré et indicateurs, sans le contenu |
POST | /secrets/{id}/reveal | Révéler (consomme une lecture) |
GET | /manage/{id} | Statut et historique (accusé de lecture) |
DELETE | /manage/{id} | Détruire avant lecture |
POST | /uploads | Ouvrir un envoi de fichiers chiffrés |
POST | /uploads/{id}/parts | URL présignée (5 min) pour une partie |
POST | /requests | Créer une demande de secret (lien de dépôt) |
POST | /requests/{id}/deposits | Déposer un contenu chiffré pour le demandeur |
GET | /requests/{id}/deposits | Lister les dépôts (demandeur) ou vérifier que le lien est ouvert (sans jeton) |
DELETE | /requests/{id} | Fermer la demande et supprimer les dépôts |
POST | /abuse | Signaler un lien abusif |
POST | /webhooks | Enregistrer un webhook https |
DELETE | /webhooks/{id} | Supprimer un webhook |
POST | /domains | Réserver un domaine personnalisé |
GET | /domains/{domain} | État d'un domaine |
POST | /domains/{domain} | Vérifier l'enregistrement TXT et rattacher le domaine |
DELETE | /domains/{domain} | Libérer le domaine |
GET | /config | Limites de l'instance |
GET | /health | Santé du service |
Voorbeeld (TypeScript, lokale versleuteling)
import { sendSecret, parseSecretLink, receiveSecret } from "@sesame-eclair/api-client";
const options = { baseUrl: "https://eclair.kayzen-lyon.com" };
// Encrypts in this process, then uploads only the ciphertext.
const sent = await sendSecret(options, {
content: { v: 1, type: "text", text: "DB_PASSWORD=..." },
views: 1,
ttlSeconds: 3600,
});
if (sent.ok) console.log(sent.url, sent.manageUrl);
// Recipient side: the key comes from the link fragment.
const link = parseSecretLink(sent.ok ? sent.url : "")!;
const received = await receiveSecret(options, link);Statuscodes
404— hetzelfde antwoord voor onbekende, verlopen, al gelezen of vernietigde geheimen.401— foute PIN, met attemptsLeft.403— access_denied: het netwerk of land van de lezer voldoet niet aan de beperkingen van het geheim. Het geheim blijft intact.423— nog niet leesbaar (uitgestelde onthulling), met availableAt.429— te veel verzoeken, probeer het over een uur opnieuw.
Webhooks
Registreer een https-URL met POST /webhooks en geef daarna webhookId mee bij het aanmaken van het geheim. U ontvangt { event, secretId, at } voor created, revealed, burned, revoked en expired: nooit de inhoud. Het signingSecret wordt één keer getoond; controleer elke aanroep als volgt:
import { createHmac, timingSafeEqual } from "node:crypto";
// header = request.headers["eclair-signature"], body = raw request body (string)
function verify(header: string, body: string, signingSecret: string): boolean {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; // replay window
const expected = createHmac("sha256", Buffer.from(signingSecret, "base64url"))
.update(`${t}.${body}`)
.digest();
return timingSafeEqual(expected, Buffer.from(v1, "hex"));
}Toegangsbeperkingen
accessRules: { cidrs: ["203.0.113.0/24"], countries: ["FR"] } beperkt het openen tot netwerken of landen (elk maximaal 20 items). De controle gebeurt voordat er versleutelde gegevens worden verzonden; een onbekend land wordt geweigerd zodra er een landregel bestaat.
Eigen domein
POST /domains claimt een domein en geeft een TXT-verificatierecord en een CNAME terug. Zodra die zijn aangemaakt, controleert POST /domains/{domain} het TXT-record en koppelt het domein; het TLS-certificaat wordt automatisch uitgegeven. De pagina Eigen domein doet dit allemaal voor u.