Inkr API

Quickstart

Crée un compte développeur, génère une clé sk_test et signe ton premier PDF en 10 minutes.

Ce guide te 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)

Va sur developers.getinkr.eu/dev/onboarding, saisis ton SIREN et la raison sociale de ta société, valide ton email. Tu arrives sur le dashboard.

2. Générer une clé API test (30 s)

Sur developers.getinkr.eu/dev/api-keys, clique Créer une clé test. La clé sk_test_xxx s'affiche une seule fois. Copie-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",
        "pdf_base64": "JVBERi0xLjQK..."
      }
    ],
    "submitters": [
      {
        "role": "Partenaire",
        "email": "alice@example.com",
        "name": "Alice Dupont",
        "fields": [
          {
            "name": "signature_partenaire",
            "type": "signature",
            "required": true,
            "areas": [
              { "page": 0, "x": 0.6, "y": 0.85, "w": 0.3, "h": 0.05 }
            ]
          }
        ]
      }
    ],
    "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', pdf_base64: pdfBase64 }],
    submitters: [
      {
        role: 'Partenaire',
        email: 'alice@example.com',
        name: 'Alice Dupont',
        fields: [
          {
            name: 'signature_partenaire',
            type: 'signature',
            required: true,
            areas: [{ page: 0, x: 0.6, y: 0.85, w: 0.3, h: 0.05 }],
          },
        ],
      },
    ],
    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', 'pdf_base64': pdf_base64}],
        'submitters': [{
            'role': 'Partenaire',
            'email': 'alice@example.com',
            'name': 'Alice Dupont',
            'fields': [{
                'name': 'signature_partenaire',
                'type': 'signature',
                'required': True,
                'areas': [{'page': 0, 'x': 0.6, 'y': 0.85, 'w': 0.3, 'h': 0.05}],
            }],
        }],
        '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', pdf_base64: pdf_base64 }],
  submitters: [{
    role: 'Partenaire',
    email: 'alice@example.com',
    name: 'Alice Dupont',
    fields: [{
      name: 'signature_partenaire',
      type: 'signature',
      required: true,
      areas: [{ page: 0, x: 0.6, y: 0.85, w: 0.3, h: 0.05 }],
    }],
  }],
  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: 0 désigne la première page (convention 0-indexée). 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. Tu peux aussi positionner en points PDF absolus si tu préfères la précision native du format PDF. Détails dans Positionnement des champs.

Réponse attendue (extrait) :

{
  "id": "sub_01J5HZ...",
  "status": "sent",
  "template_id": "tpl_01J5HZ...",
  "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 ton signataire peut ouvrir directement. Le embed_src contient un JWT pour l'embed iframe (TTL 24h par défaut).

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 ton signataire.

Si send_email: true, Inkr envoie automatiquement un mail au signataire avec cette URL. Sinon, c'est à toi 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 une URL Supabase signée (TTL 1h) pour télécharger le PDF avec les signatures embedded 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.pdf

Le PDF d'audit liste tous les événements (envoi, ouverture, IP, user-agent, signature, hash SHA-256) avec horodatages UTC ISO 8601.

Suite