These endpoints are called from your checkout UI before the subscriber completes their order. All three are public (no auth required).

Check email availability

Check whether an email address is already registered as a kurnl account. The check is platform-wide — it is not scoped to your provider.

Request body

Response

Mind the polarity: is_taken: true means the email is already registered. Your checkout UI should then prompt the subscriber to log in instead of creating a new account.

Check subscription at location

Check whether a location already has an active subscription. Used to block booking a second product at the same connection.

Query parameters

Pass one of the two (there is no provider parameter):

Response

has_active_subscription: true means the location already has an active subscription — your checkout UI should show an error or redirect.
This endpoint fails open: malformed input, an unknown location, or a backend error all return false. Treat false as “no conflict found”, not as a guaranteed negative — the provisioning endpoints enforce the authoritative checks.

Validate discount code

Validate a discount code and return its terms so you can display them in the checkout UI.

Request body

Response — 200 OK (valid)

Response — 200 OK (invalid)

error is free text (e.g. "Plan version not found", "Invalid or expired discount code").
The lookup matches on the code alone (non-archived): it is not scoped to the plan’s provider — another provider’s code can validate — and the data model has no expiry window, so “expired” never actually occurs. Treat a valid: true as advisory.
Discounts apply automatically at kurnl-billed checkout. No partner provisioning endpoint accepts a discount field — there is currently no way to attach a discount to a subscription via the partner API.

Payments not configured (409)

The checkout-creation step that follows these helper calls — and the subscriber payment-method routes (see Subscriber Self-Service) — needs the provider’s own Stripe account. If that provider has not connected one, it returns 409:
Only the Kurnl marketplace checkout needs Stripe — a provider using the external checkout is unaffected. Check service_providers.tenant_configs.stripe_connected on the plan version (see Plans) before offering the Kurnl checkout in your UI.