When to use this

Use the anonymous variant when:
  • You manage the end-user relationship entirely in your own system
  • You do not want kurnl to store subscriber PII
  • You use your own invoicing and billing — kurnl should not issue invoices on your behalf
With the anonymous variant, subscribers have no kurnl self-service portal access and kurnl cannot issue invoices on your behalf.
If you want kurnl to manage subscriber records and billing, use CKO-03 direct delivery instead.

How it works

When a subscriber selects a plan on the kurnl Marketplace, kurnl creates a checkout session and redirects them to your checkout URL with a session_id query parameter. Your checkout page reads this session to get the plan details, collects payment in your own system, then notifies kurnl to provision the port.

Step-by-step

1. Configure your checkout URL

Identical to direct delivery — see CKO-03 Direct: Step 1.

2. Read the session from the redirect URL

When the subscriber lands on your checkout page, the URL will contain ?session_id=<uuid>. Call the sessions endpoint to retrieve the plan details:
Response — 200 OK:
Use the returned plan_version_id to call GET /partner/marketplace/plans/{plan_version_id} if you want to display the plan name and price to the subscriber before they pay.
Sessions expire after 30 minutes. An expired (or cancelled) session returns 410 Gone — redirect the subscriber back to the Marketplace to start a fresh checkout.

3. Collect payment in your own system

Display the plan details and handle the full checkout and payment in your own system. kurnl receives no customer data.

4. Call kurnl after successful payment

Once payment succeeds, notify kurnl to provision the port. You have two options: The simplest path. kurnl reads the plan, location, and provider directly from the session — you only need to supply your own internal subscription identifier.

Option B — pass fields explicitly (legacy / non-Marketplace flows)

Use this when you are not going through a kurnl Marketplace session — for example, a direct link from your own website where you already know the plan and location.
Successful response — 200 OK (both options):
No subscriber_id is returned — no subscriber record is created. Store the subscription_id to correlate with webhook events.

5. Handle webhook events

At provisioning.completed, the subscriber’s internet is live. See Webhooks for signature verification and retry behaviour.

Field reference

GET /partner/external-checkout/sessions/{session_id}

POST /partner/external-checkout/anonymous-complete


Error handling

On 5xx errors or network timeout: Safe to retry — the request is idempotent. The same external_subscription_id (or session_id) returns the existing subscription_id rather than creating a duplicate.