REST API v1

Conversielek API

Trigger audits vanuit je eigen tooling, CI/CD-pipeline of dashboard. Bearer-token auth, JSON in/uit. Eén endpoint.

Quick start

Drie stappen om je eerste programmatic audit te triggeren:

  1. 1Maak een API-key aan op /account/api-keys. Bewaar de plain key — wordt éénmaal getoond.
  2. 2Base64-encode 1-5 screenshots van je webshop (PNG/JPG/WebP).
  3. 3POST naar /api/v1/audits met Bearer-header en JSON-payload.

Authenticatie

Alle requests vereisen een Bearer-token in de Authorization-header. Plain keys hebben format cl_<32 hex chars>.

Authorization: Bearer cl_a1b2c3d4e5f6...
  • · Keys zijn revocable via /account/api-keys.
  • · Hashing: SHA-256 server-side. Plain key wordt nooit opgeslagen.
  • · Per-key usage-tracking (last_used_at + count).

POST /api/v1/audits

Triggert een nieuwe audit. Synchroon: response na succesvolle AI-call (kan 30-90s duren). Output wordt opgeslagen in je account.

Request body

{
  "flowType": "checkout",
  "webshopName": "Mijn Webshop",
  "webshopUrl": "https://mijnwebshop.nl",
  "productCategory": "fashion",
  "targetAudience": "vrouwen 25-45 jaar",
  "currentChallenge": "hoge cart abandonment in checkout",
  "screenshots": [
    {
      "name": "step1.png",
      "type": "image/png",
      "base64": "iVBORw0KGgoAAAANS..."
    }
  ]
}

Veld-beschrijvingen

flowType
stringrequired
Welke flow. Eén van: homepage, product, cart, checkout, mobile
webshopName
stringrequired
Naam van de webshop (zichtbaar in rapport).
webshopUrl
stringoptional
Volledige URL inclusief https://.
productCategory
stringrequired
Productcategorie (bv. "fashion", "electronics").
targetAudience
stringoptional
Korte beschrijving doelgroep. Maakt audit relevanter.
currentChallenge
stringoptional
Wat probeert je shop op te lossen? (1-2 zinnen).
screenshots
arrayrequired
1-5 screenshots als base64. Elke item: { name?, type, base64 }.

Response (200 OK)

{
  "ok": true,
  "auditId": "550e8400-e29b-41d4-a716-446655440000",
  "result": {
    "overall_score": 6.8,
    "summary": "Sterke productpagina's, maar checkout verliest vertrouwen...",
    "trust_score": 7.2,
    "issues": [...],
    "quick_wins": [...],
    "nl_specific_checks": {...},
    "nl_deep_checks": [...],
    "avg_deep_checks": [...]
  }
}

Foutcodes

401
AUTH_MISSING / AUTH_INVALID
Bearer-header ontbreekt of key ongeldig/ingetrokken.
400
BAD_FLOW / BAD_INPUT / NO_SCREENSHOTS
Validation. Zie error-veld voor detail.
413
BODY_TOO_LARGE
Request body >25 MB. Comprimeer screenshots.
502
AI_ERROR / AI_PARSE_FAIL
AI-provider down of returnde non-JSON. Retry na 30s.
500
NO_AI_KEY
Server-misconfiguratie. Mail support.

Voorbeelden

cURL

curl -X POST https://conversielek.nl/api/v1/audits \
  -H "Authorization: Bearer cl_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "flowType": "checkout",
    "webshopName": "Mijn Shop",
    "productCategory": "fashion",
    "screenshots": [
      { "type": "image/png", "base64": "'"$(base64 -i screenshot.png)"'" }
    ]
  }'

Node.js (fetch)

import fs from 'node:fs/promises';

const screenshot = await fs.readFile('screenshot.png');
const base64 = screenshot.toString('base64');

const res = await fetch('https://conversielek.nl/api/v1/audits', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer cl_YOUR_KEY_HERE',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    flowType: 'checkout',
    webshopName: 'Mijn Shop',
    productCategory: 'fashion',
    screenshots: [{ type: 'image/png', base64 }],
  }),
});

const { ok, auditId, result } = await res.json();
console.log('Score:', result.overall_score);

Python (requests)

import base64
import requests

with open('screenshot.png', 'rb') as f:
    b64 = base64.b64encode(f.read()).decode()

r = requests.post(
    'https://conversielek.nl/api/v1/audits',
    headers={'Authorization': 'Bearer cl_YOUR_KEY_HERE'},
    json={
        'flowType': 'checkout',
        'webshopName': 'Mijn Shop',
        'productCategory': 'fashion',
        'screenshots': [{'type': 'image/png', 'base64': b64}],
    },
)
data = r.json()
print('Score:', data['result']['overall_score'])

Belangrijk om te weten

  • Audits zijn synchroon — verwacht 30-90s response-tijd. Configureer je client-side timeout op minstens 120s.
  • Rate-limit: gedeelde Anthropic-quota geldt. Bij 429-responses: exponential backoff.
  • Output wordt opgeslagen in je account en is zichtbaar via de webapp. Goed voor team-collab en historie-tracking.
  • API-versionering: huidig: v1. Breaking changes krijgen v2 op aparte path. Geen sunset-policy voor v1 voorlopig.
  • Support: mail info@trofsof.com voor bugs of feature-requests.