DocsTake payments
Payment window (embedded checkout)
Open the Kling checkout as an overlay on your own website with @klingis/embed, so customers in Iceland pay by card without leaving your page.
The payment window opens Kling's checkout in an overlay on your site. Your server creates a checkout session with your secret key; the browser opens it with @klingis/embed. Card details go straight to Kling and never touch your site.
Install
npm install @klingis/embedOr use a script tag, no build step needed:
<script src="https://api.kling.is/v1/kling.js"></script>1. Create a session on your server
// e.g. a Next.js route handler: app/api/checkout/route.ts
export async function POST() {
const res = await fetch("https://api.kling.is/v1/checkout/sessions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KLING_SECRET_KEY}`,
"Content-Type": "application/json",
},
// ISK has no decimals: 5000 means 5.000 kr.
body: JSON.stringify({ amount: 5000, currency: "ISK" }),
});
const session = await res.json();
return Response.json({ sessionId: session.id });
}2. Open the overlay in the browser
import { Kling } from "@klingis/embed";
const kling = Kling.init({ locale: "is" });
const { sessionId } = await fetch("/api/checkout", { method: "POST" }).then((r) => r.json());
const result = await kling.checkout({
sessionId,
onSuccess: (res) => console.log("Paid", res.sessionId, res.paymentStatus),
onError: (err) => console.log("Failed", err.code, err.message),
onCancel: () => console.log("Closed"),
});With the script tag, Kling is a global:
<script src="https://api.kling.is/v1/kling.js"></script>
<script>
const kling = Kling.init();
kling.checkout({ sessionId: "cs_..." });
</script>Options
Kling.init(options):
| Option | Default | Description |
|---|---|---|
locale |
detected | is or en |
baseUrl |
https://pay.kling.is |
Checkout URL, for local development |
apiUrl |
https://api.kling.is |
API URL |
kling.checkout(options):
| Option | Description |
|---|---|
sessionId |
Required. The session your server created |
onSuccess |
Called when the payment succeeds |
onError |
Called when the payment fails |
onCancel |
Called when the customer closes the overlay |
showSuccessScreen |
Show Kling's success screen (default true) |
kling.checkout() returns a controller: await it for the result, or call .close() to close the overlay. kling.preload({ sessionId }) starts loading before the customer clicks, so the overlay opens faster.
Payment status in the browser
onSuccess and the result include paymentStatus:
paid: a card or wallet payment went through.awaiting_claim: an online bank claim was issued and the customer pays it later. Don't ship yet.
Treat the browser result as a hint for your UI. Fulfil orders from webhooks on your server.