---
title: "Create a skill section."
method: POST
path: "/v1/skill-sections"
tags: ["skills"]
---

# Create a skill section.

`POST /v1/skill-sections`

## Request

- Base URL: `http://localhost:8080`
- URL: `http://localhost:8080/v1/skill-sections`
- Auth: one of:
  - API key in cookie `dvt_session`
  - HTTP bearer

Creates an org-scoped, admin-curated grouping taxonomy entry (DVT-943 M3). Requires `skill:manage`.

## Request body

- CreateSkillSectionRequest
  - `name` string, required: Display name, e.g. 'Marketing'. Must be a single line.
  - `sortOrder` integer: Display ordering among sibling sections.
  - `parentId` string, uuid, nullable: Optional parent section id (DVT-1143). Omit or null for a top-level section. The parent must be a live section in your organization with no skills filed directly on it (a populated section can't gain a child), and the resulting depth must not exceed 8 levels.

## Response `201`

Skill section created.

- SkillSectionEnvelope
  - `data` SkillSection, required: An org-scoped, admin-curated grouping taxonomy for skills (DVT-943 M3), now an adjacency-list tree of arbitrary depth (DVT-1143, capped at 8 levels): a section may optionally have a parent section. Every member of the organization sees the same set of sections (tenancy is org-wide, like Folder). The tree is returned flat (id + parentId); clients assemble the hierarchy. Only leaf sections (no live children) may have skills filed on them directly.
    - `id` string, uuid, required
    - `orgId` string, uuid, required
    - `parentId` string, uuid, nullable: The parent section's id, or null for a top-level section.
    - `name` string, required
    - `sortOrder` integer, required: Display ordering among sibling sections.
    - `version` integer, required: Optimistic-concurrency version. Pass this back on PATCH.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `meta` Meta, required: Response metadata.
    - `requestId` string, required: Correlates with the X-Request-Id header.
    - `total` integer: Item count, present on collection responses.
    - `nextCursor` string, nullable: Opaque keyset-pagination cursor, present on paginated responses (e.g. GET /v1/dashboards) when more rows exist beyond this page. Pass it back as the `cursor` query param to fetch the next page; absent or null on the last page.
    - `roleResolveDegraded` boolean: Snowflake mode only (DVT-2260), on GET /v1/dashboards: present and true when the caller's live Snowflake role resolution failed or was unavailable — role-shared dashboards may be missing from this page. Omitted (not merely false) whenever resolution succeeded or the role-share arm does not apply (off snowflake mode, an org admin/owner, or off the ingress listener).

## Other responses

- `400`: Malformed request.
- `401`: Missing, invalid, or expired session.
- `403`: The caller's role does not permit this action.
- `409`: A skill section with this name already exists among its siblings (same `orgId` + `parentId`), or `parentId` refers to a section that has skills filed directly on it (populated parents may not have children — DVT-1143).
- `422`: Creating this section under `parentId` would exceed the maximum nesting depth (8 levels).

---

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