X-API-Key, otherwise per client IP. Over the limit kurnl answers 429 Too Many Requests; back off and retry (see Rate limits).
Check email availability
Request body
Response
Check subscription at location
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.
Validate discount code
Request body
Response — 200 OK (valid)
building_id and location_identifier (either names the building). The response
fields beyond discount:
With
applied: false (reason: "campaign_better"), label, promo_price_monthly and duration_months describe the plan’s campaign (the terms the order will get), while discount is still the operator’s. The comparison is on the monthly promo price only; a tie keeps the campaign.
A bulk plan answers valid: false: operator codes never apply to bulk plans.
Response — 200 OK (invalid)
error is free text (e.g. "Plan version not found", "Invalid or expired discount code").
Discounts are billed on kurnl-billed lines: the promotional price is charged from
activation for the duration’s full calendar months, then the plan’s price. At the
marketplace checkout a discount code replaces the plan’s campaign; the checkout
requests (location, home-drop and unit) take it as the optional
discount_code.
Partner provisioning accepts discount_code on the session create, complete,
anonymous-complete (both only in their explicit-fields, sessionless form; with a
session_id the session’s stored code is used and the body’s is ignored), provider-initiated and provisioning/bulk; without it, a
partner-created line gets the plan version’s campaign. discount_type is PERCENTAGE, FIXED_MONTHLY
(fixed amount off per month) or OVERWRITE_MONTHLY (fixed monthly price).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.