Quickstart
Créez un compte développeur, générez une clé sk_test et signez votre premier PDF en 10 minutes.
Ce guide vous fait passer de zéro à une première signature PDF en 10 minutes, dans le scénario d'un SaaS qui veut faire signer un contrat à un partenaire.
Prérequis : un compte développeur sur developers.getinkr.eu/dev/onboarding (1 min à créer, aucune carte bancaire requise).
1. Créer un compte développeur (1 min)
Allez sur developers.getinkr.eu/dev/onboarding, saisissez votre SIREN et la raison sociale de votre société, validez votre email. Vous arrivez sur le dashboard.
2. Générer une clé API test (30 s)
Sur developers.getinkr.eu/dev/api-keys, cliquez Créer une clé test. La clé sk_test_xxx s'affiche une seule fois. Copiez-la dans un gestionnaire de secrets.
Format clé : sk_test_[A-Za-z0-9]{32} ou sk_live_[A-Za-z0-9]{32}. Les clés test n'engendrent aucune facturation et utilisent un environnement isolé.
export INKR_API_KEY="sk_test_xxx..."3. Créer une submission depuis un PDF inline (3 min)
L'endpoint POST /v1/submissions/from_pdf accepte un PDF en base64 ou via URL, plus la position des champs signature. Pas besoin de pré-créer un template figé.
curl -X POST https://api.getinkr.eu/v1/submissions/from_pdf \
-H "Authorization: Bearer $INKR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"documents": [
{
"name": "Contrat partenariat",
"file": "JVBERi0xLjQK...",
"fields": [
{
"name": "signature_partenaire",
"type": "signature",
"role": "Partenaire",
"required": true,
"areas": [
{ "page": 1, "x": 0.6, "y": 0.85, "w": 0.3, "h": 0.05 }
]
}
]
}
],
"submitters": [
{
"role": "Partenaire",
"email": "alice@example.com",
"name": "Alice Dupont"
}
],
"send_email": true
}'import { randomUUID } from 'node:crypto'
import { readFileSync } from 'node:fs'
const pdfBase64 = readFileSync('./contrat.pdf').toString('base64')
const res = await fetch('https://api.getinkr.eu/v1/submissions/from_pdf', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.INKR_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': randomUUID(),
},
body: JSON.stringify({
documents: [
{
name: 'Contrat partenariat',
file: pdfBase64,
fields: [
{
name: 'signature_partenaire',
type: 'signature',
role: 'Partenaire',
required: true,
areas: [{ page: 1, x: 0.6, y: 0.85, w: 0.3, h: 0.05 }],
},
],
},
],
submitters: [
{ role: 'Partenaire', email: 'alice@example.com', name: 'Alice Dupont' },
],
send_email: true,
}),
})
const submission = await res.json()
console.log(submission.id)import base64
import uuid
import requests
with open('contrat.pdf', 'rb') as f:
pdf_base64 = base64.b64encode(f.read()).decode('ascii')
res = requests.post(
'https://api.getinkr.eu/v1/submissions/from_pdf',
headers={
'Authorization': f'Bearer {INKR_API_KEY}',
'Idempotency-Key': str(uuid.uuid4()),
},
json={
'documents': [{
'name': 'Contrat partenariat',
'file': pdf_base64,
'fields': [{
'name': 'signature_partenaire',
'type': 'signature',
'role': 'Partenaire',
'required': True,
'areas': [{'page': 1, 'x': 0.6, 'y': 0.85, 'w': 0.3, 'h': 0.05}],
}],
}],
'submitters': [{
'role': 'Partenaire',
'email': 'alice@example.com',
'name': 'Alice Dupont',
}],
'send_email': True,
},
)
submission = res.json()
print(submission['id'])require 'base64'
require 'json'
require 'net/http'
require 'securerandom'
pdf_base64 = Base64.strict_encode64(File.read('contrat.pdf'))
uri = URI('https://api.getinkr.eu/v1/submissions/from_pdf')
req = Net::HTTP::Post.new(uri)
req['Authorization'] = "Bearer #{ENV['INKR_API_KEY']}"
req['Content-Type'] = 'application/json'
req['Idempotency-Key'] = SecureRandom.uuid
req.body = JSON.generate({
documents: [{
name: 'Contrat partenariat',
file: pdf_base64,
fields: [{
name: 'signature_partenaire',
type: 'signature',
role: 'Partenaire',
required: true,
areas: [{ page: 1, x: 0.6, y: 0.85, w: 0.3, h: 0.05 }],
}],
}],
submitters: [{
role: 'Partenaire',
email: 'alice@example.com',
name: 'Alice Dupont',
}],
send_email: true,
})
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
submission = JSON.parse(res.body)
puts submission['id']Comprendre les coordonnées : dans l'exemple ci-dessus, page: 1 désigne la première page. x: 0.6, y: 0.85, w: 0.3, h: 0.05 sont des fractions 0-1 de la dimension de la page (60 % depuis la gauche, 85 % depuis le haut, 30 % de largeur, 5 % de hauteur). L'origine (0,0) est en haut-gauche, comme un écran. Vous pouvez aussi positionner en points PDF absolus si vous préférez la précision native du format PDF. Détails dans Positionnement des champs.
Réponse attendue (extrait) :
{
"id": "sub_01J5HZ...",
"template_id": "tpl_01J5HZ...",
"status": "sent",
"signing_order": "preserved",
"audit_log_url": null,
"submitters": [
{
"id": "sbm_01J5HZ...",
"role": "Partenaire",
"email": "alice@example.com",
"status": "pending",
"signing_url": "https://sign.getinkr.eu/s/abc123",
"embed_src": "https://sign.getinkr.eu/s/abc123?embed_token=eyJ..."
}
]
}Le signing_url est le lien que votre signataire peut ouvrir directement. audit_log_url reste null tant que la submission n'est pas completed. Sur embed_src, lisez Embedded signing avant de bâtir dessus.
4. Récupérer l'URL de signing (déjà fait)
Dans la réponse de l'étape 3, le champ submitters[0].signing_url est l'URL à laquelle envoyer votre signataire.
Si send_email: true, Inkr envoie automatiquement un mail au signataire avec cette URL. Sinon, c'est à vous de la transmettre (SMS, Slack, in-app, etc.).
5. Signer le PDF côté signataire (étape humaine)
Le signataire ouvre l'URL, dessine sa signature dans la zone, clique Signer. Status de la submission passe de sent à completed (ou partially_signed s'il y a plusieurs signataires en signing_order preserved).
Pour vérifier le status :
curl https://api.getinkr.eu/v1/submissions/sub_01J5HZ... \
-H "Authorization: Bearer $INKR_API_KEY"6. Télécharger le PDF signé (1 min)
Une fois status: "completed", le PDF final est téléchargeable :
curl https://api.getinkr.eu/v1/submissions/sub_01J5HZ.../documents \
-H "Authorization: Bearer $INKR_API_KEY"La réponse retourne original_pdf_url et signed_pdf_url, deux URLs signées valables 1h, plus url_expires_at. Le PDF signé porte les signatures incrustées et le footer eIDAS SES.
7. Récupérer l'audit log eIDAS (1 min)
Pour la traçabilité juridique :
curl https://api.getinkr.eu/v1/submissions/sub_01J5HZ.../audit_log \
-H "Authorization: Bearer $INKR_API_KEY" \
-o audit.pdfLe PDF d'audit liste tous les événements (envoi, ouverture, IP, user-agent, signature, hash SHA-256) avec horodatages UTC ISO 8601.
Suite
- Authentification : rotation des clés, environnements test/live, rate limits.
- Webhooks : recevoir
submission.completeden push plutôt qu'en polling. - Embedded signing : intégrer la signature en iframe dans votre SaaS.
- Erreurs et retries : enveloppe d'erreur normée + idempotence.