Who this is for. These endpoints serve storefronts that run their own checkout funnel and provision through the provider-initiated API — the shopper types an address on your site and you need to know whether, and what, you can sell there. Marketplace-originated external checkout (CKO-03) never uses them: the shopper’s address, building and unit are resolved on the kurnl marketplace, and the checkout session your page reads already carries them.

Endpoints

Together they are the address funnel: autocomplete turns keystrokes into addresses, check turns one address into a building_id and the plans you can sell there, and units turns that building_id into the premises inside it — the suite a customer picks, which is what provider-initiated provisioning needs when the premise has no live port yet. Auth: X-API-Key: krnl_... on both. Results are automatically scoped to your provider — there is no parameter to query another provider’s coverage, and none is accepted. Rate limits: autocomplete 300 / minute, check 120 / minute, units 300 / minute (per API key).
Serviceability answers are advisory: they come from a coverage index that the kurnl operator refreshes after footprint or plan changes. Checkout and provisioning re-validate every order fail-closed, so a stale index can never place an order at an unserved address — but a very recent footprint change may take until the next index refresh to appear here.

GET /serviceability/autocomplete

Address suggestions for a storefront search box. House-number suffixes may be written fused or separated — 68a and 68 a both match.

Response — 200 OK

At most 15 suggestions, deduplicated by display string:
orderable: true means connected and orderable now; false means the building is in your coverage but still in build-out (pre-order territory). line_type is the building’s line type: first, second, third, or null when the building is not classified yet. earliest_service_date is the building’s planned occupancy date while it is still ahead: a customer’s move-in date cannot be earlier, and checkout refuses one that is. On a first-line building, a kurnl checkout with a later move-in date holds the order and starts it on that day. presale: true marks a build-out building opened for pre-orders; it may now be a first-line building.

POST /serviceability/check

Availability verdict for one concrete address.

Request body

Send free text, or structured fields (structured wins when both are present; one of address / street is required, otherwise 422):
German (5-digit PLZ) and Canadian (A1A 1A1) postal formats are recognized.
A provided house number must match exactly, suffix included — 68a and 68 are different premises. An invented house number on a real street returns serviceable: false.

Response — 200 OK

Example of a bulk building (bulk: true):
No match returns 200 with serviceable: false, match: null, plans: [].

GET /serviceability/units

The premises inside one building in your coverage — the suite picker for your checkout page.

Response — 200 OK

A suite with several connections is one entry, not one per connection. Its id and unit_number are those of the suite’s first free connection, by the same rule an order on the suite is placed by (the first one when none is free), so the id can be a different connection than the one listed on an earlier call. Send that id as unit_id — kurnl re-anchors the order to a free connection itself (see provider-initiated provisioning).
available is the only occupancy signal, and it is the one to use. A unit is taken when a non-terminal subscription (pending, pending-install or active) references it. Do not infer occupancy from anything else you may have stored about a unit — a suite with an order still in flight looks untouched by every other measure, and offering it again double-books it.
Render unavailable units disabled rather than hiding them: a customer who knows their own suite number is in the building reads a gap in the list as your site being broken.
A building that is not in your coverage returns 404, exactly as an unknown id does. The response never confirms that a building you cannot serve exists.

Errors