Skip to content

Bundles

GET /skills/bundle/{skill_id}/{sha}

The whole skill directory as a zip: SKILL.md plus every bundle file, with assets fetched from storage. This is what pm-skills pull writes to disk. Available on SaaS and on-prem.

It is the one endpoint on this surface that returns application/zip rather than JSON, and the one that authorises differently from everything else.

Request

bash
curl -s -o skill.zip \
  "$IM_URL/skills/bundle/a0132e30-e7c4-4b78-8719-d8e20cbe44bb/a28b804cda57" \
  -H "X-API-Key: $IM_KEY"
ParameterRequiredNotes
skill_idyespath segment — the id, not the name
shayespath segment; must belong to that skill

Both forms of the key work here, as on the read endpoints.

Addressed by id, not by name

Every other read endpoint takes a project_id and a name, and resolves within that project. This one takes the skill's own id — so get the skill_id and sha from resolve or by-name first.

Response

HTTP/1.1 200 OK
content-type: application/zip
content-disposition: attachment; filename="test-a28b804cda57.zip"
x-content-type-options: nosniff

The filename is <skill-name>-<sha>.zip. Inside, everything sits under a single directory named after the skill:

test/
└── SKILL.md

SKILL.md is the frontmatter and body recombined into the on-disk format, with empty fields dropped:

markdown
---
name: test
description: aad
---

adfasdf

A skill carrying resources gets them alongside, at the paths recorded in its resources manifest — scripts/, references/, assets/ — with binary assets pulled from object storage as the archive is built.

Authorization

This endpoint does not check project membership. It authorises on read access to the skill itself, so it also serves organisation-tier and global-tier skills, which do not belong to any single project.

That is why it takes no project_id: there is no project context to resolve in.

Authorises on
resolve, by-name, diff, GET /skillsmembership of the project
bundleread access to the skill

Practically: a skill_id you obtained from a project you can reach will download. One you guessed will not.

Errors

StatusWhen
401key missing, invalid or revoked
403the owner may not read that skill
404no such skill_id, or the sha belongs to a different skill

The last case matters when you are iterating over several skills: pairing skill A's id with skill B's sha is a 404 rather than a wrong download.

Next

Copyright © 2026 elsai foundry.