---
title: "Get Bootstrap"
method: GET
path: "/v1/bootstrap"
tags: ["bootstrap"]
---

# Get Bootstrap

`GET /v1/bootstrap`

Return the deployment context the dashboard shell renders from.

Public: the shell fetches this before it knows whether it can authenticate.
That is also why ``sign_in_methods`` is answered here rather than behind a
credential, and it publishes nothing an unauthenticated caller could not
already learn by trying both credentials against the sign-in endpoint.

The database read is two primary-key lookups: the ``tenancy_bootstrap_user_id``
marker, and the identity it names, to answer whether *that* identity holds a
password (#702). It runs only in standalone mode: a hybrid gateway has no session to describe,
and ``get_db_if_needed`` hands it no session to read one from.

## Response `200`

Successful Response

- DeploymentBootstrap — What the dashboard shell needs before it can render anything.
  - `data_plane_url` string, nullable, required — Where this deployment's inference traffic belongs, when it is not served here. The mirror of management_url: that one says where management lives when this deployment is not the control plane, this one says where the data plane is when this deployment is not it. Set only by a hosted control plane, which serves the dashboard but not inference (otari#822); null for standalone and hybrid, both of which serve inference at the address that reached this page. Not a human link target like management_url: it is the gateway's bare address, which the dashboard suffixes with /v1 to build its request snippets. So it must carry no /v1 path segment anywhere (a value ending in /v1, or a whole endpoint like /v1/chat/completions, renders that path twice) and no credential, since this response is unauthenticated. This gateway refuses both at startup; any deployment serving this contract should publish the same shape. Null on a hosted deployment means unconfigured, and the dashboard then shows no snippet rather than one naming this host.
  - `deployment_type` 'standalone' | 'hosted' | 'hybrid', required — Which deployment serves this URL. 'standalone' owns its own data and serves one tenant; 'hosted' owns its own data and serves many (otari.ai, or any deployment run as a control plane), which is why its management surfaces are the per-organization ones; 'hybrid' is a gateway attached to otari.ai, which is data-plane only and holds no management surface of its own.
  - `docs_url` string, nullable, required — Where this deployment's documentation lives, when it is not the operator guide bundled with the gateway. Set, the dashboard's Documentation links open it in a new tab; null, they go to the bundled guide at /#/docs, which stays served either way. A link target an operator configured, validated at startup as an absolute http(s) URL.
  - `mail_ready` boolean, required — Whether this deployment can deliver a message carrying a link back to itself (an invitation's accept link, and the verification and reset links to come), not merely whether a transport is configured: it also needs to know its own public URL to put in one. Lets the dashboard disable or hide a mail-dependent affordance instead of offering one that would fail at send time. Every message this control plane sends carries such a link, which is why this is one flag and not one per feature. False for a hybrid gateway, whose control plane is otari.ai and which sends no mail of its own.
  - `maintenance_mode` boolean, required — Whether this deployment is refusing new dashboard sign-ins while an operator redeploys it. The sign-in screen says so rather than presenting a form whose only outcome is a 503. Sessions already issued keep working, and the management API and the data plane are unaffected. False for a hybrid gateway, which issues no session.
  - `management_url` string, nullable, required — Where the authoritative control plane lives when it is not this deployment. Set for a hybrid gateway so its landing page can link to otari.ai; null otherwise.
  - `oauth_providers` string[], required — OAuth providers this deployment can sign somebody in with, sorted, one entry per provider with a client ID, a client secret and a public_base_url to build a redirect URI from. The sign-in screen renders a button per entry and none at all when the list is empty, so a provider nobody configured is absent rather than offered and then refused. Additive to sign_in_methods rather than part of it: an OAuth sign-in coexists with whichever typed credential is current, the way a passkey does. Empty for a hybrid gateway, which issues no session.
  - `passkeys_ready` boolean, required — Whether this deployment can run a passkey ceremony at all: it has a relying-party ID (webauthn_rp_id, or derived from public_base_url) and an origin to serve one from. Distinct from 'passkey' in sign_in_methods, which is narrower and answers whether a registered passkey could sign somebody in *right now*: an operator with none yet needs this one, or the page that registers the first would be hidden from them. False for a hybrid gateway, which issues no session of its own.
  - `session_type` 'local_operator' | 'hosted_user' | 'none', required — The kind of session this deployment issues, not whether the caller holds one. 'local_operator' is the standalone operator sign-in (see sign_in_methods for which credential it currently accepts), 'hosted_user' an otari.ai account, and 'none' a deployment that issues no management session at all.
  - `sign_in_methods` string[], required — How POST /v1/auth/session may be authenticated right now, sorted. 'master_key' is the first-boot credential and is offered until the operator identity has a password, which is what claiming the deployment means; 'password' replaces it from then on, and the master key stays the credential for the management API. 'passkey' appears alongside either one when this deployment is configured for WebAuthn and holds at least one passkey that its current relying-party ID can assert. Empty for a hybrid gateway, which issues no session. The login page renders from this rather than trying a credential to find out.
  - `surfaces` string[], required — Management API groups this deployment serves, sorted, which is what its dashboard pages gate on. Named surfaces, not capabilities: capability is otari.ai's word for the entitlement (licensing) axis, and this is the deployment (topology) axis. Empty for a hybrid gateway.

## Changes

- **2026-08-27** `d309f991085f` — 1 info
  - added the required property `data_plane_url` to the response with the `200` status
- **2026-08-25** `0e52dff6b641` — 1 info
  - added the required property `oauth_providers` to the response with the `200` status
- **2026-08-25** `e3ee25bc9070` — 1 info
  - added the required property `docs_url` to the response with the `200` status
- **2026-08-25** `1725b1abe9a0` — 1 breaking
  - removed the required property `docs_url` from the response with the `200` status
- **2026-08-24** `6d9979b0b62b` — 1 info
  - added the required property `docs_url` to the response with the `200` status

[Full history](https://skmtc.dev/mozilla-ai/apis/otari/changes/v1/bootstrap/get.md)

---

[API](https://skmtc.dev/mozilla-ai/apis/otari.md) · [All operations](https://skmtc.dev/mozilla-ai/apis/otari/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/mozilla-ai/otari/revisions/7f178e92b56c/schema)
