---
title: "Validate skill bundle"
method: POST
path: "/api/skills/validation"
tags: ["Skills"]
---

# Validate skill bundle

`POST /api/skills/validation`

Validate a skill bundle without persisting it. Accepts a SKILL.md, .zip, or .skill upload and returns parsed metadata plus the normalized file layout.

## Response `200`

Successful response.

- PlatformSkillValidationResponse
  - `metadata` PlatformSkillValidationMetadata, required
    - `display_name` string, required — Skill name parsed from SKILL.md frontmatter.
    - `description` string, required — Skill description parsed from SKILL.md frontmatter.
  - `files` PlatformSkillValidationFile[], required — Normalized files in the bundle after stripping an optional single root folder.
    - `path` string, required — Normalized relative path in the skill bundle.
    - `size_bytes` integer, required — File size in bytes.
    - `is_manifest` boolean, required — Whether this file is the skill manifest.
  - `warnings` PlatformWarning[], required — Non-blocking validation warnings.
    - `code` string, required — Open snake_case warning code. Clients must tolerate unknown values; the set of codes is not a closed enum.
    - `message` string, required — Human-readable warning message.
  - `request_id` string, required — Platform-generated request ID for support correlation.

## Other responses

- `400` — Invalid request (malformed JSON, invalid parameter values, unknown fields).
- `401` — Missing or invalid authentication token.
- `403` — Token valid but lacks permission for the requested operation.
- `404` — Resource not found.
- `408` — Backend did not respond within the timeout window.
- `413` — Request body exceeds the maximum allowed size.
- `429` — Rate limit exceeded. Includes Retry-After header.
- `500` — Unexpected server-side failure.
- `503` — Backend temporarily unavailable.

## Changes

> 68 revisions in range; 6 could not be searched.

- **2026-08-07** `359f2d1c01a7` — 36 warning
  - added the new `spend_limit_exceeded` enum value to the `code` response property for the response status `400`
  - added the new `spend_limit_exceeded` enum value to the `code` response property for the response status `401`
  - added the new `spend_limit_exceeded` enum value to the `code` response property for the response status `403`
  - added the new `spend_limit_exceeded` enum value to the `code` response property for the response status `404`
  - …32 more
- **2026-08-05** `6c00d0b889b7` — 18 warning
  - added the new `tools_unauthorized` enum value to the `code` response property for the response status `400`
  - added the new `tools_unauthorized` enum value to the `code` response property for the response status `401`
  - added the new `tools_unauthorized` enum value to the `code` response property for the response status `403`
  - added the new `tools_unauthorized` enum value to the `code` response property for the response status `404`
  - …14 more
- **2026-07-20** `da9c4e548709` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/gleanwork/apis/glean-platform-api/changes/api/skills/validation/post.md)

---

[API](https://skmtc.dev/gleanwork/apis/glean-platform-api.md) · [All operations](https://skmtc.dev/gleanwork/apis/glean-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/gleanwork/glean-platform-api/revisions/46c121f70527/schema)
