---
title: "Stand up a new Floorcast tenant"
method: POST
path: "/api/floorcast/provision"
tags: ["floorcast"]
---

# Stand up a new Floorcast tenant

`POST /api/floorcast/provision`

## Request

- Base URL: `https://www.immersivecommons.com`
- URL: `https://www.immersivecommons.com/api/floorcast/provision`
- Auth: HTTP bearer

Authorized by an `fco_` onboarding token, NOT by a Clerk session and NOT by an operator agt_ token — no operator exists yet for a floor that does not exist yet. CONSEQUENTIAL: it allocates the tenant and binds its first operator, so it defaults to a DRY RUN and only acts on `confirm: true`, which answers 201. The token is single-use. Minting one is a concierge step with no live route.

## Request body

- FloorcastProvisionRequest
  - `slug` string, required: The tenant slug to allocate.
  - `display_name` string, required: Human name for the floor.
  - `region` string
  - `confirm` boolean: Omit or false for the dry-run preview; true provisions. Default false.

## Response `200`

Dry run — what WOULD be provisioned. Nothing was written.

- FloorcastProvisionPreview
  - `ok` boolean, required
  - `dry_run` true, required
  - `would_provision` object: Exactly what a confirmed call would create.
  - `confirm_hint` string: How to re-send in order to act.

## Other responses

- `201`: The tenant now exists.
- `400`: invalid_slug or missing_display_name.
- `401`: invalid_onboarding_token, onboarding_token_expired, or onboarding_token_already_used.
- `403`: onboarding_token_wrong_tenant.
- `409`: slug_taken.
- `500`: provision_write_failed.

---

[API](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api.md) · [All operations](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api/revisions/be67c1f67c27?raw)
