---
title: "Create daemon API key"
method: POST
path: "/api/v1/daemon-api-keys"
tags: ["Daemon API Keys"]
---

# Create daemon API key

`POST /api/v1/daemon-api-keys`

## Request

- Base URL: `https://app.scanopy.net`
- URL: `https://app.scanopy.net/api/v1/daemon-api-keys`
- Auth: one of:
  - API key in header `Authorization`
  - API key in cookie `session_id`

## Request body

- DaemonApiKey
  - `daemon_id` string, uuid, nullable: Daemon this key is bound to 1:1, when provisioned server-side. NULL for legacy site-shared keys created before 1:1 provisioning, which resolve daemon identity from the X-Daemon-ID header instead.
  - `expires_at` string, date-time, nullable: When this record stops being valid.
  - `is_enabled` boolean: Whether the key may still be used. Disabled keys are rejected.
  - `key` string, required: The stored key. Returned redacted except on creation and rotation.
  - `last_used` string, date-time, nullable, required: When a daemon last authenticated with this key.
  - `name` string, required: Human-facing name for this key.
  - `site_id` string, uuid, required: The site this entity belongs to.
  - `tags` string[], required: Tags assigned to this entity.
  - `created_at` string, date-time, required: When this record was first created.
  - `id` string, uuid, required: Server-assigned unique identifier.
  - `updated_at` string, date-time, required: When this record was last modified.

## Response `200`

Daemon API key created

- ApiResponseDaemonApiKeyResponse: Envelope for a successful response. Failures are sent with a non-2xx status and an `ApiErrorResponse` body instead.
  - `data` object: The result payload. Omitted on failure.
    - `api_key` DaemonApiKey, required
      - `daemon_id` string, uuid, nullable: Daemon this key is bound to 1:1, when provisioned server-side. NULL for legacy site-shared keys created before 1:1 provisioning, which resolve daemon identity from the X-Daemon-ID header instead.
      - `expires_at` string, date-time, nullable: When this record stops being valid.
      - `is_enabled` boolean: Whether the key may still be used. Disabled keys are rejected.
      - `key` string, required: The stored key. Returned redacted except on creation and rotation.
      - `last_used` string, date-time, nullable, required: When a daemon last authenticated with this key.
      - `name` string, required: Human-facing name for this key.
      - `site_id` string, uuid, required: The site this entity belongs to.
      - `tags` string[], required: Tags assigned to this entity.
      - `created_at` string, date-time, required: When this record was first created.
      - `id` string, uuid, required: Server-assigned unique identifier.
      - `updated_at` string, date-time, required: When this record was last modified.
    - `key` string, password, required: The plaintext API key - only returned once during creation or rotation.
  - `error` string, nullable: Not sent on a successful response. Failure messages arrive in an `ApiErrorResponse`.
  - `meta` ApiMeta, required: API metadata included in all responses
    - `api_version` integer, required: API version (integer, increments on breaking changes)
    - `server_version` string, required: Server version (semver)
  - `success` boolean, required: Always `true` on a successful response.

## Other responses

- `400`: Bad request
- `403`: Insufficient permissions (member+ required)
- `500`: Internal server error

## Changes

- **2026-10-26** `c9d9d46d1ae8`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/scanopy/apis/scanopy-api/changes/api/v1/daemon-api-keys/post.md)

---

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