Inkr API

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