---
title: "Bootstrap the caller's first workspace"
method: POST
path: "/v2/bootstrap"
tags: ["Identity"]
---

# Bootstrap the caller's first workspace

`POST /v2/bootstrap`

## Request

- Base URL: `https://api.infolang.ai`
- URL: `https://api.infolang.ai/v2/bootstrap`
- Auth: HTTP bearer

Idempotent first-run hydration. If the caller already holds a grant, returns the existing dashboard shell (200) and mints nothing. On first run, provisions a workspace and mints the first API key (201); the key `secret` is returned once, in this response only. The `usage` member includes the per-meter breakdown (`meters`).

## Request body

- object
  - `name` string
  - `env` 'live' | 'test'

## Response `200`

Already bootstrapped — existing shell

- object
  - `me` object, required
    - `principal` string, nullable, required
    - `email` string, email
    - `workspaces` object[], required
      - `workspace_id` string, required
      - `name` string, required
      - `role` 'Owner' | 'Admin' | 'Member' | 'ReadOnly', required
    - `stats` object, required
      - `requests_24h` integer, required
    - `capabilities` object, required
      - `canon` boolean, required
  - `workspace` object, required
    - `workspace_id` string, required
    - `name` string, required
    - `plan` string, required
    - `created` string, required
    - `role` 'Owner' | 'Admin' | 'Member' | 'ReadOnly', required
  - `members` object[], required
    - `principal` string, required
    - `email` string, email
    - `role` 'Owner' | 'Admin' | 'Member' | 'ReadOnly', required
    - `added` string, required
  - `keys` object[], required
    - `key_id` string, required
    - `env` 'live' | 'test', required
    - `prefix` string, required
    - `label` string, nullable
    - `created` string, required
    - `last_used` string, nullable
    - `secret` string
    - `scopes` string[]
    - `scoped_workspace_ids` string[]
    - `scoped_namespaces` string[]
    - `expires_at` string, nullable
    - `not_before` string, nullable
    - `principal` string
    - `principal_kind` 'user' | 'service'
  - `usage` object, required
    - `workspace_id` string, required
    - `month` string, required
    - `used` integer, required
    - `included` integer, required
    - `hard_cap` integer, nullable
    - `overage` object
      - `spend_cents_to_date` integer, required
      - `budget_cents` integer, required
      - `by_meter` object[], required
        - `meter` 'storage' | 'recall', required
        - `over_units` integer, required
        - `cents` integer, required
    - `account` union, required
      - object
        - `status` 'pooled', required
        - `account_id` string, required
        - `workspaces` string[], required
        - `tier` string, required
      - object
        - `status` 'unavailable', required
        - `reason` 'not_configured' | 'not_supported' | 'upstream_error', required
    - `meters` object[], required
      - `meter` 'recall' | 'memorize' | 'ingest' | 'storage' | 'egress' | 'chunks_ingested', required
      - `used` integer, required
      - `included` integer, required
      - `overage` integer, required
      - `account` object
        - `used` integer, required
        - `included` integer, nullable, required
        - `hard_cap` boolean, required
        - `period` string, required
        - `is_stock` boolean, required
        - `by_workspace` object[]
          - `workspace_id` string, required
          - `used` integer, required
    - `pricing` object, required
      - `currency` string, required
      - `per_unit` number, required
      - `amount` number, required
    - `namespaces` integer, required
    - `keys` object, required
      - `live` integer, required
      - `test` integer, required
      - `total` integer, required

## Other responses

- `201`: First run — includes the minted key secret
- `401`: Missing or invalid session token
- `403`: Caller lacks a grant on the workspace, or role too low. Or `lane_not_supported` — an `il_live_`/`il_test_`/`il_oauth_` credential, though valid, was presented to a route that accepts the session lane only
- `422`: Invalid body
- `502`: Upstream Kairos failure while building the usage view

---

[API](https://skmtc.dev/infolang/apis/infolang-api.md) · [All operations](https://skmtc.dev/infolang/apis/infolang-api/llms.txt) · [OpenAPI document](https://skmtc.dev/infolang/apis/infolang-api/revisions/d04bf6de72c8?raw)
