Requêtes par minute
30 requêtes/minute en continu (burst : 30). Au-delà, la réponse est 429 rate_limited avec un en-tête Retry-After.
L'API REST d'InstantProof vous permet de certifier n'importe quelle URL publique de façon programmatique. Authentifiez-vous avec une clé API Bearer, envoyez une URL en POST et recevez un certificat PDF signé accompagné d'un dossier de preuves complet — le même horodatage RFC 3161 et la même signature Ed25519 que l'interface web.
Trois étapes pour passer de zéro à un certificat PDF signé.
Connectez-vous, accédez à Développeur → Clés API, puis cliquez sur Créer une clé API. Copiez la clé — elle n'est affichée qu'une seule fois.
Envoyez une requête POST avec votre URL :
curl -X POST https://secure.instantproof.legal/api/v1/certificates \
-H "Authorization: Bearer ip_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/page-to-certify"}'
Réponse 201 Created :
{
"certificateId": "abc123…",
"recordingId": "def456…",
"url": "https://example.com/page-to-certify",
"finalUrl": "https://example.com/page-to-certify",
"status": "ready",
"links": {
"self": "/api/v1/certificates/def456…",
"certificate": "/api/v1/certificates/def456…/download"
}
}
Suivez l'URL links.certificate avec votre clé API. Le serveur renvoie une redirection 302 vers une URL de téléchargement pré-signée :
curl -L \
-H "Authorization: Bearer ip_live_xxxxxxxxxxxxxxxx" \
"https://secure.instantproof.legal/api/v1/certificates/def456…/download" \
-o certificate.pdf
Le PDF téléchargé est le même certificat PDF signé que celui produit par l'interface web, vérifiable sur /fr/certificate.html.
URL de base : https://secure.instantproof.legal
Tous les points de terminaison renvoient du JSON. Authentification : Authorization: Bearer <key>.
Créer un nouveau certificat de site web. La plateforme capture l'URL dans un navigateur headless, produit un journal réseau HAR et une capture d'écran, signe le manifeste avec Ed25519 et l'ancre à un horodatage qualifié RFC 3161. L'opération prend de 10 à 60 secondes.
| Champ | Type | Description | |
|---|---|---|---|
url | string | requis | Une URL https:// valide à certifier. Elle doit être accessible publiquement. |
| Champ | Type | Description |
|---|---|---|
certificateId | string | Identifiant de certificat lisible (affiché sur le PDF). |
recordingId | string | UUID interne de l'enregistrement. À utiliser dans les appels API ultérieurs. |
url | string | L'URL que vous avez soumise. |
finalUrl | string | L'URL après d'éventuelles redirections, telle que vue par le navigateur. |
status | string | "ready" — le certificat est immédiatement disponible. |
links.self | string | Chemin pour récupérer les métadonnées de ce certificat. |
links.certificate | string | Chemin pour télécharger le PDF. Nécessite une authentification. |
| Statut | error | Signification |
|---|---|---|
| 400 | invalid_url | Le champ url est absent ou n'est pas une adresse https:// valide. |
| 400 | invalid_json | Le corps de la requête n'est pas un JSON valide. |
| 401 | invalid_api_key | En-tête Authorization absent ou invalide. |
| 402 | api_access_required | Votre compte ne dispose pas du forfait Pro. Abonnez-vous. |
| 403 | subscription_required | Les certificats web nécessitent un abonnement forfaitaire. |
| 403 | insufficient_scope | La clé API ne dispose pas de la portée certificates:write. |
| 413 | payload_too_large | Le corps de la requête dépasse 64 Ko. |
| 429 | quota_exceeded | Quota quotidien de captures API atteint. Réinitialisé chaque jour. |
| 429 | rate_limited | Trop de requêtes. Consultez l'en-tête Retry-After. |
| 429 | service_busy | Service de capture saturé. Réessayez après environ 30 secondes. |
| 502 | capture_failed | Le navigateur n'a pas pu charger l'URL. |
| 502 | certification_failed | La capture n'a produit aucune preuve exploitable (par ex. HAR vide). |
Récupérer les métadonnées d'un certificat que vous avez créé précédemment.
| Paramètre | Description | |
|---|---|---|
recordingId | requis | Le recordingId renvoyé par POST /api/v1/certificates. |
| Champ | Type | Description |
|---|---|---|
certificateId | string | Identifiant de certificat lisible. |
recordingId | string | UUID interne de l'enregistrement. |
type | string | Type d'enregistrement (par ex. "webcapture"). |
status | string | "ready" une fois le certificat disponible. |
url | string | L'URL qui a été certifiée. |
createdAt | string | Horodatage de création au format ISO 8601. |
links | object | Chemins self et certificate. |
Télécharger le certificat PDF signé. Renvoie 302 Found — suivez la redirection pour recevoir le fichier. Utilisez curl -L ou requests.get(..., allow_redirects=True).
Toutes les requêtes API doivent inclure :
Authorization: Bearer ip_live_xxxxxxxxxxxxxxxx
Les clés sont créées depuis Paramètres → Développeur → Clés API. Une clé authentifie en tant que votre compte — traitez-la comme un mot de passe. Révoquez-la immédiatement en cas de fuite.
Les clés sont préfixées par ip_live_ pour les comptes en production. Ce préfixe vous aide à les identifier dans le code ou les fichiers d'environnement.
30 requêtes/minute en continu (burst : 30). Au-delà, la réponse est 429 rate_limited avec un en-tête Retry-After.
Le forfait Pro accorde un nombre fixe de créations de certificats par jour. Le quota est réinitialisé chaque jour. Le dépassement renvoie 429 quota_exceeded.
Le corps JSON de la requête ne doit pas dépasser 64 Ko. En pratique, une URL reste largement en dessous de cette limite.
import requests
API_KEY = "ip_live_xxxxxxxxxxxxxxxx"
BASE = "https://secure.instantproof.legal"
# Créer un certificat
resp = requests.post(
f"{BASE}/api/v1/certificates",
json={"url": "https://example.com"},
headers={"Authorization": f"Bearer {API_KEY}"},
)
resp.raise_for_status()
data = resp.json()
recording_id = data["recordingId"]
# Télécharger le PDF
pdf = requests.get(
f"{BASE}/api/v1/certificates/{recording_id}/download",
headers={"Authorization": f"Bearer {API_KEY}"},
allow_redirects=True,
)
pdf.raise_for_status()
with open("certificate.pdf", "wb") as f:
f.write(pdf.content)
print(f"Certificat enregistré ({len(pdf.content)} octets)")
const API_KEY = process.env.INSTANTPROOF_API_KEY;
const BASE = "https://secure.instantproof.legal";
// Créer un certificat
const res = await fetch(`${BASE}/api/v1/certificates`, {
method: "POST",
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com" }),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const { recordingId, links } = await res.json();
// Télécharger le PDF
const pdf = await fetch(`${BASE}${links.certificate}`, {
headers: { "Authorization": `Bearer ${API_KEY}` },
redirect: "follow",
});
const buffer = Buffer.from(await pdf.arrayBuffer());
require("fs").writeFileSync("certificate.pdf", buffer);
# Définissez votre clé
export INSTANTPROOF_API_KEY="ip_live_xxxxxxxxxxxxxxxx"
# Créer
CERT=$(curl -sf -X POST https://secure.instantproof.legal/api/v1/certificates \
-H "Authorization: Bearer $INSTANTPROOF_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com"}')
echo "$CERT" | python3 -m json.tool
RECORDING_ID=$(echo "$CERT" | python3 -c "import sys,json; print(json.load(sys.stdin)['recordingId'])")
# Télécharger
curl -sfL \
-H "Authorization: Bearer $INSTANTPROOF_API_KEY" \
"https://secure.instantproof.legal/api/v1/certificates/$RECORDING_ID/download" \
-o certificate.pdf
ls -lh certificate.pdf
En général de 10 à 60 secondes, selon le temps de chargement de la page cible. La requête POST reste bloquante jusqu'à ce que le certificat soit prêt — il n'y a pas d'étape d'interrogation (polling).
L'API actuelle prend uniquement en charge la certification de sites web (URL). Le téléversement de fichiers est disponible via l'interface web sur secure.instantproof.legal/certificates/new.
Oui. Le PDF produit par l'API est identique à celui créé via l'interface web. Glissez-le sur instantproof.legal/fr/certificate.html pour vérifier la signature Ed25519 et la chaîne d'horodatage RFC 3161.
Le service de capture renvoie une erreur 502 capture_failed. Votre quota quotidien n'est pas consommé.
Oui. Chaque certificat créé via l'API apparaît dans votre tableau de bord Certificats sous Mes certificats de sites web, aux côtés des certificats créés via l'interface web.