---
title: "Create a personal access token (shown exactly once). Requires a workspace with paid-feature access (403 pro_plan_required otherwise); at most 10 active keys per user (409 invalid_request)."
method: POST
path: "/v1/api-keys"
---

# Create a personal access token (shown exactly once). Requires a workspace with paid-feature access (403 pro_plan_required otherwise); at most 10 active keys per user (409 invalid_request).

`POST /v1/api-keys`

## Request

- Base URL: `https://api.usebubbles.com`
- URL: `https://api.usebubbles.com/v1/api-keys`
- Auth: HTTP bearer

## Request body

- CreateApiKeyRequest: POST /v1/api-keys request body.
  - `name` string, required: A human-readable name for the key (1–100 chars).

## Response `201`

Created.

- ApiKeyCreated: POST /v1/api-keys 201 response — the full token is shown exactly once.
  - `id` string, required: The key id.
  - `name` string, required: The key name.
  - `token` string, required: The full personal access token (bbls_pat_…) — shown ONCE; store it now.
  - `token_preview` string, required: A safe-to-show token preview.
  - `created_at` string, required: Creation instant (ISO-8601 UTC).

## Other responses

- `400`: A query parameter or request body was malformed (invalid_request).
- `401`: Missing, malformed, or wrong-kind credential (unauthorized / token_revoked / account_deleted).
- `403`: The workspace cannot access paid features (pro_plan_required).
- `409`: Constraint conflict, e.g. the active-key cap (invalid_request).
- `500`: An unexpected server error occurred (internal_error).

---

[API](https://skmtc.dev/usebubbles/apis/bubbles-public-api.md) - [All operations](https://skmtc.dev/usebubbles/apis/bubbles-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/usebubbles/apis/bubbles-public-api/revisions/31570f5d4b05?raw)
