Library

Release a new version with an explicit label

Power-user override for the auto-bump in POST /api/v1/library. Releases a new skill_versions row for an existing skill with the caller-supplied version label, bypassing the server's default N+1.0 / major.N+1 classification.

When to use this. Most callers should use POST /library (multipart upsert) — that endpoint creates the skill on first push and releases new versions thereafter with an auto-classified label. Reach for /versions only when:

  • You are importing a skill with pre-existing external version history (e.g., 2.3.7) and want the new release to keep that numbering.
  • You coordinate version labels with an external system (e.g., a skill that mirrors a tool's own versions).
  • You want a human-authored changelog string instead of the auto-generated Contract changed: ... text.

Update-only. The skill must already exist in the caller's account (404 skill_not_found otherwise). To create a new skill, use POST /api/v1/library.

Owner-addressed. {owner} is the skill's published attribution. For a skill you CLAIMED whose attribution differs from your account slug (e.g. releasing anthropics/my-skill from an account slugged alice), address it by that published attribution — the release updates the skill you own at that path, and the response echoes the attribution as owner. POST /api/v1/library differs: it is name-addressed and always targets your own namespace.

Unchanged content. If the SKILL.md + files are byte-identical to the current version, the response is 200 with action: "unchanged" and the current skill state — no new version is written and the caller-supplied version label is ignored. Same shape as POST /library for an unchanged push, so retries from CI scripts that don't bother editing first succeed idempotently rather than failing with a build-breaking 4xx (#1490, parity with POST /library).

Version label format. 1-64 characters, must start with an alphanumeric, body may include ., -, +. Permits semver, semver pre-release tags, build metadata, and plain labels. No monotonicity check — 3.0.0-rc1 after 2.3.7 is accepted. Duplicate labels for the same skill return 409 version_conflict.

File-path encoding. Same as POST /library: each file part's in-skill relative path travels via the multipart Content-Disposition: filename parameter (RFC 7578). Root SKILL.md is required and identified by exact-match filename=SKILL.md.

Payload size. Total multipart body capped at 4.5 MB.

Idempotency. Supports the optional Idempotency-Key header. Same semantics as POST /library — retries with the same key + same body return the cached response with Idempotent-Replayed: true; retries with a different body return 422 idempotency_key_reused.

Error codes: missing_version, invalid_version, missing_skill_md, invalid_skill_md, invalid_path, duplicate_path, invalid_multipart, name_mismatch, payload_too_large, skill_not_found, version_conflict, source_conflict, rate_limited, idempotency_key_too_long, idempotency_key_in_progress, idempotency_key_reused.

post/api/v1/library/{owner}/{name}/versions

Request

  • Base URL: https://skillrepo.dev
  • URL: https://skillrepo.dev/api/v1/library/{owner}/{name}/versions
  • Auth: HTTP bearer

Path parameters

ownerstring required
namestring required

Headers

Idempotency-Keystring

Client-supplied idempotency key (max 255 chars). Retries with the same key + same request body return the cached response (with Idempotent-Replayed: true) instead of re-executing the handler. Retries with the same key + a different body return 422 idempotency_key_reused. Concurrent retries while the original is in-flight return 409 idempotency_key_in_progress. Cached responses live for 24 hours.

Response

Either a new version was released (action: "updated", skill.version carries the caller-supplied label) or the uploaded content was byte-identical to the current version (action: "unchanged", skill echoes the current state, bump is null, no new row was written). The unchanged outcome mirrors POST /library for parity (#1490) so idempotent retries from CI tooling don't break builds. On Idempotency-Key replays the same body is returned with Idempotent-Replayed: true.

action'updated' | 'unchanged' required

Server-detected outcome. updated = a new skill_versions row was released with the caller-supplied version label. unchanged = uploaded SKILL.md + files were byte-identical to the current version; no new row was written and the response echoes the current state. created is unreachable — the endpoint requires the skill already exist (404 otherwise).

bump'major' | 'minor' nullable required

Server-classified bump from the contract-field diff (description, allowed-tools, compatibility) on updated. The label on the new skill_versions row is the caller-supplied version, NOT the server-computed bump label — bump is informational about the scope of contract change for clients that want to surface it. Null on unchanged.

Example response

{
  "skill": {
    "files": [
      {
        "contentType": "text/markdown"
      }
    ]
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.