Ga naar de inhoud

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.

Als Markdown ↗

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.

VeldTypeVerplichtToelichting
titlestringjaTitel op de checkout, bijvoorbeeld Bestelling #1042
kindstringneefixed (standaard) of subscription
linesarraybij fixed1 tot 100 regels, zelfde vorm als facturen. Optioneel fulfillment: goods, digital of service
lines[].detailstringneeTweede regel onder de omschrijving op het besteloverzicht, bijvoorbeeld een variant. Komt niet op de factuur
lines[].compareAtCentsintegerneeOude prijs incl. btw, doorgestreept naast de echte prijs. Alleen weergave: de betaler betaalt unitPriceCents
options[].featuresstring[]neeBij subscription: maximaal 6 punten die laten zien wat een optie bevat
options[].highlightbooleanneeBij subscription: markeert de optie die je aanraadt
descriptionstringneeEen of twee zinnen onder de titel op het besteloverzicht
customerTypestringneebusiness vraagt altijd bedrijfsnaam, btw-nummer en KvK. consumer nooit. choose (standaard) laat de betaler aangeven dat hij zakelijk bestelt
customerobjectneeVooraf ingevulde factuurgegevens van de betaler
cancelUrlurlneeWaar "Terug naar de winkel" heen leidt. De checkout toont het domein
redirectUrlurlneeWaar de betaler na betaling heen gaat
methodsstring[]neeMollie-methoden die je aanbiedt; standaard alles wat aan staat
profileIduuidneeCijfr-profiel voor huisstijl en Mollie-websiteprofiel; standaard het profiel van de sleutel
metadataobjectneeVrije sleutel-waarde-paren (strings) op de sessie
requiresShippingbooleanneeStandaard false. Genegeerd als elke regel expliciet digital of service is
expiresInHoursintegernee1 tot 720, standaard 72
Voorbeeld
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}
    ]
  }'
201
{
  "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.

VeldTypeVerplichtToelichting
optionsarrayja1 tot 12 opties. id is a-z, 0-9, _ of -, maximaal 64 tekens
options[].rankintegerja0 tot 1000. Een hoger getal is een hoger pakket
options[].intervalstringjaweek, month, quarter of year
options[].unitPriceCentsintegerjaPrijs excl. btw, in centen. 0 is gratis
options[].fulfillmentstringneegoods, digital of service. Standaard service
allowDowngradebooleanneeStandaard false. true laat een lager pakket bevestigen zonder betaling
currentOptionIdstringneeOptie die de betaler al heeft. Die keuze is grijs en kan niet nog eens gekocht worden
currentIntervalstringneeInterval van de huidige optie. Zonder interval geldt elke interval van die id als huidig
scheduleRenewalbooleanneeStandaard true. Na betaling plant Cijfr de volgende factuur. Er gaat niets automatisch van de rekening
Voorbeeld
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.

Hosted checkout · Cijfr