Ontwikkelaars · Resources
Hosted checkout
GET en POST /api/v1/checkouts plus GET /{id}. Een betaallink op jouw huisstijl; na betaling staat de factuur er automatisch.
Hoe het werkt
POST /api/v1/checkouts maakt een sessie en geeft een url terug naar een door Cijfr gehoste checkout. De betaler kiest daar een betaalmethode, vult zijn factuurgegevens in en betaalt via jouw gekoppelde PSP. Daarna maakt Cijfr de factuur, mailt hem naar de betaler en stuurt invoice.paid en checkout.completed naar je webhooks.
Sessie aanmaken
POST /api/v1/checkouts vraagt checkouts:write en accepteert Idempotency-Key.
| Veld | Type | Verplicht | Toelichting |
|---|---|---|---|
title | string | ja | Titel op de checkout, bijvoorbeeld Bestelling #1042 |
kind | string | nee | fixed (standaard) of subscription |
lines | array | bij fixed | 1 tot 100 regels, zelfde vorm als facturen. Optioneel fulfillment: goods, digital of service |
lines[].detail | string | nee | Tweede regel onder de omschrijving op het besteloverzicht, bijvoorbeeld een variant. Komt niet op de factuur |
lines[].compareAtCents | integer | nee | Oude prijs incl. btw, doorgestreept naast de echte prijs. Alleen weergave: de betaler betaalt unitPriceCents |
options[].features | string[] | nee | Bij subscription: maximaal 6 punten die laten zien wat een optie bevat |
options[].highlight | boolean | nee | Bij subscription: markeert de optie die je aanraadt |
description | string | nee | Een of twee zinnen onder de titel op het besteloverzicht |
customerType | string | nee | business vraagt altijd bedrijfsnaam, btw-nummer en KvK. consumer nooit. choose (standaard) laat de betaler aangeven dat hij zakelijk bestelt |
customer | object | nee | Vooraf ingevulde factuurgegevens van de betaler |
cancelUrl | url | nee | Waar "Terug naar de winkel" heen leidt. De checkout toont het domein |
redirectUrl | url | nee | Waar de betaler na betaling heen gaat |
methods | string[] | nee | Mollie-methoden die je aanbiedt; standaard alles wat aan staat |
profileId | uuid | nee | Cijfr-profiel voor huisstijl en Mollie-websiteprofiel; standaard het profiel van de sleutel |
metadata | object | nee | Vrije sleutel-waarde-paren (strings) op de sessie |
requiresShipping | boolean | nee | Standaard false. Genegeerd als elke regel expliciet digital of service is |
expiresInHours | integer | nee | 1 tot 720, standaard 72 |
curl https://api.cijfr.com/api/v1/checkouts \
-H "Authorization: Bearer $CIJFR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042" \
-d '{
"title": "Bestelling #1042",
"redirectUrl": "https://shop.example.nl/bedankt",
"customer": {"email": "sanne@korenaar.nl", "companyName": "Bakkerij De Korenaar"},
"lines": [
{"description": "Workshop broodbakken", "quantity": 2, "unitPriceCents": 4500}
]
}'{
"data": {
"id": "cs_…",
"status": "open",
"url": "https://invoice.cijfr.com/checkout/cs_…",
"amountIncl": 10890,
"expiresAt": "2026-03-04T12:00:00.000Z"
}
}Abonnementen
kind: "subscription" is een keuzelijst. De betaler ziet de opties, niet een vast bedrag. Dezelfde id op twee intervallen is één product. amountIncl in het antwoord is de prijs van de eerste optie, inclusief btw. De betaler betaalt de optie die hij bevestigt.
| Veld | Type | Verplicht | Toelichting |
|---|---|---|---|
options | array | ja | 1 tot 12 opties. id is a-z, 0-9, _ of -, maximaal 64 tekens |
options[].rank | integer | ja | 0 tot 1000. Een hoger getal is een hoger pakket |
options[].interval | string | ja | week, month, quarter of year |
options[].unitPriceCents | integer | ja | Prijs excl. btw, in centen. 0 is gratis |
options[].fulfillment | string | nee | goods, digital of service. Standaard service |
allowDowngrade | boolean | nee | Standaard false. true laat een lager pakket bevestigen zonder betaling |
currentOptionId | string | nee | Optie die de betaler al heeft. Die keuze is grijs en kan niet nog eens gekocht worden |
currentInterval | string | nee | Interval van de huidige optie. Zonder interval geldt elke interval van die id als huidig |
scheduleRenewal | boolean | nee | Standaard true. Na betaling plant Cijfr de volgende factuur. Er gaat niets automatisch van de rekening |
curl https://api.cijfr.com/api/v1/checkouts \
-H "Authorization: Bearer $CIJFR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Lidmaatschap",
"kind": "subscription",
"allowDowngrade": true,
"currentOptionId": "plus",
"currentInterval": "month",
"options": [
{"id": "basis", "label": "Basis", "rank": 1, "interval": "month", "unitPriceCents": 900, "fulfillment": "service"},
{"id": "plus", "label": "Plus", "rank": 2, "interval": "month", "unitPriceCents": 1900}
]
}'De pagina grijst de huidige optie uit. Een optie met een lagere rank, of een goedkoper interval van dezelfde optie, is ook grijs, tenzij allowDowngrade aan staat. Een downgrade of een gratis optie schrijft niets af. Cijfr stuurt dan checkout.completed met action downgrade of subscribe en amount 0. Een betaalde keuze factureert alleen de gekozen optie en stuurt checkout.completed met action pay, plus optionId als die er is.
Bij scheduleRenewal komt na de periode een nieuwe factuur. Die betaalt de klant zelf. Er is geen automatische incasso en geen opgeslagen mandaat.
Cijfr gebruikt dezelfde regels voor de eigen pakketten Start, Plus, Pro en Max. Het pakket dat je al betaalt, op hetzelfde interval, kun je niet nog eens kopen. Van Max naar Pro, of naar Start, is een downgrade: die gaat in aan het einde van de betaalde periode, zonder nieuwe afschrijving. Maand naar jaar is een upgrade en wordt afgerekend. Jaar naar maand is een downgrade. Een proefperiode is geen gekocht pakket: Start, Plus, Pro en Max blijven kiesbaar.
Producten, digitaal en diensten
Elke regel en elke abonnementsoptie kan fulfillment hebben: goods (product), digital of service (dienst). Zonder fulfillment blijft een vaste checkout zich gedragen zoals voorheen: requiresShipping bepaalt of je een adres vraagt.
Staan alle regels of opties expliciet op digital of service, dan vraagt de checkout geen verzendadres, ook als requiresShipping aan staat. Een gekozen abonnementsoptie die geen goods is, zet verzending uit op het moment van betalen. Op de factuur wordt digital en service als dienst geboekt, goods als product.
Sessies ophalen
GET /api/v1/checkouts vraagt checkouts:read en pagineert met ?limit= en ?cursor=. Elke sessie heeft id, kind, status, title, amountIncl, url, redirectUrl, expiresAt en createdAt. kind is fixed of subscription. Status is onder andere open, paid of expired.