---
title: "create_domain"
method: POST
path: "/v1/domains"
tags: ["domains"]
---

# create_domain

`POST /v1/domains`

## Request

- Base URL: `https://ndi-api.nace.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://ndi-api.nace.ai/v1/domains`
- Auth: API key in header `X-API-Key`
- TypeScript: <https://skmtc.dev/nace/apis/ndi-service/docs/v1/domains/post.ts> (a function with typed inputs; its response is checked against the schema)

Create a tenant-owned draft. Cost class: fast.

The draft is editable and **unusable** until published. Validation runs on
every write and is returned every time, so a caller never has to guess
whether a publish will succeed.

Args:
    session: Database session.
    caller: The authenticated tenant, who will own the new domain.
    request: The slug, display name, and taxonomy.

Returns:
    The created draft and its validation.

Raises:
    PlatformError: ``reserved_domain_slug`` or ``domain_in_use``.

## Request body

- CreateDomainRequest: Creates a taxonomy ``draft`` at version 1 in the caller's tenant.
  - `slug` string, required
  - `display_name` string, required
  - `taxonomy` NdiServiceAppPlatformApiDomainsSchemasTaxonomy, required: The classification vocabulary.
    - `classes` TaxonomyClass[]
      - `group` string, required
      - `subgroup` string, required
      - `description` string, required: Written for the classifier — it IS the prompt.
      - `aliases` string[]: Renames land here so old folder paths stay resolvable.
    - `allow_other` true: Cannot be disabled: a document that fits nothing is labelled 'other', never force-fitted.

## Response `201`

Successful Response

- DomainResponse
  - `domain` Domain, required: A domain with its effective taxonomy already resolved. A caller reading a domain wants the taxonomy that will actually be applied, not a delta they have to merge themselves.
    - `domain_id` string, uuid, required
    - `slug` string, required
    - `display_name` string, required
    - `owner` 'platform' | 'tenant', required
    - `version` integer, required
    - `status` 'draft' | 'published', required
    - `parent_slug` string, nullable: Inheritance lineage for platform domains that extend a base vocabulary.
    - `class_count` integer, required
    - `selectable` boolean, required: True once published; a workspace may only pin a published version.
    - `taxonomy` TaxonomyOutput, required: The classification vocabulary.
      - `classes` TaxonomyClass[]
        - `group` string, required
        - `subgroup` string, required
        - `description` string, required: Written for the classifier — it IS the prompt.
        - `aliases` string[]: Renames land here so old folder paths stay resolvable.
      - `allow_other` true: Cannot be disabled: a document that fits nothing is labelled 'other', never force-fitted.
    - `published_at` string, date-time, nullable
  - `validation` DomainValidation, required: Returned on every domain write, so a caller never has to guess whether a publish will succeed.
    - `valid` boolean, required
    - `errors` DomainValidationError[]
      - `code` string, required
      - `path` string, required
      - `message` string, required
    - `effective_class_count` integer, required

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `402`: Payment Required
- `403`: Forbidden
- `404`: Not Found
- `409`: Conflict
- `410`: Gone
- `413`: Request Entity Too Large
- `422`: Unprocessable Entity
- `424`: Failed Dependency
- `429`: Too Many Requests
- `500`: Internal Server Error
- `501`: Not Implemented
- `503`: Service Unavailable
- `504`: Gateway Timeout

---

[API](https://skmtc.dev/nace/apis/ndi-service.md) - [All operations](https://skmtc.dev/nace/apis/ndi-service/llms.txt) - [OpenAPI document](https://skmtc.dev/nace/apis/ndi-service/revisions/d9d1f8ec2207?raw)
