DocsTake payments
Checkout sessions
A checkout session is the simplest way to take a payment in Iceland with Kling. Your server creates it with an amount or products, and the customer pays on a Kling checkout page or in an overlay on your site.
A checkout session is one payment attempt by one customer. Your server creates it with your secret key; Kling returns a url for a hosted checkout page and an id you can open as an overlay on your own site with the payment window. Card details go straight to Kling's checkout and never touch your server.
Create a session
POST /v1/checkout/sessions. Set the amount in one of three ways (use only one):
| Field | Use it when |
|---|---|
amount |
You just need to charge a sum, e.g. 4990 for 4.990 kr. |
product_id |
You sell a product set up in Kling. A subscription product starts a subscription. |
items |
You want a receipt with lines: each item has a product_id, or a description and amount, plus quantity and tax_rate (0, 11 or 24, VAT included in the amount) |
curl -X POST https://api.kling.is/v1/checkout/sessions \
-H "Authorization: Bearer $KLING_SECRET_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042" \
-d '{
"items": [
{ "description": "T-shirt", "amount": 3990, "quantity": 2, "tax_rate": 24 }
],
"currency": "ISK",
"customer_email": "anna@example.is",
"success_url": "https://example.is/thanks",
"cancel_url": "https://example.is/cart",
"metadata": { "order_id": "1042" }
}'Useful optional fields:
success_url,cancel_url: where the customer goes afterwards. Kling adds?session_id=...to the success URL.locale:isorenfor the checkout language.customer_id, orcustomer_email,customer_name,customer_phoneto pre-fill.promotion_code: apply a discount code.save_payment_method: keep the card for later charges.capture: false: authorise now and capture later, see Payments.payment_method_type:cardorbank_claim(an online bank claim).allow_custom_amountandminimum_amount: let the customer choose the amount.metadata: your own keys and values, such as an order number.
What comes back
The response includes id, url, status, payment_status, amount, currency, expires_at and the fields you sent. Send the customer to url, or open the session in the overlay with its id.
status:openwhile waiting,completewhen finished,expiredafter 24 hours.payment_status:paid,unpaid,awaiting_claim(a bank claim was issued and the customer pays it in their online bank) orno_payment_required.
Confirm the payment on your server
Don't treat the redirect to success_url as proof of payment. Either listen for the checkout.session.completed webhook, or fetch the session with GET /v1/checkout/sessions/{id} and check payment_status. For bank claims, ship when payment_intent.captured arrives: that is when the customer has paid.
GET /v1/checkout/sessions lists sessions, filtered by status and paginated with limit and starting_after.
Amounts and currency
Amounts are integers. ISK has no decimals, so 4990 is 4.990 kr. Euros and US dollars can be switched on for your account; ask us at hallo@kling.is.