SKILL.md plus every reference file — as a single zip archive. Works for both skill types: a single_file skill yields an archive holding just SKILL.md.POST/PUT: for the org's own skills, the archive this returns can be re-uploaded unchanged via PUT (or via POST to recreate it after a delete).skill_id: The id of the skill to download.200 OK — the raw zip archive, Content-Type: application/zip, with Content-Disposition: attachment; filename="<skill-name>.zip". This is the one success response in the API that is not wrapped in the {success, message, data} envelope.ErrorEnvelope (Content-Type: application/json), so branch on the status code (or Content-Type) before treating the body as a zip.403 system_curated_download_forbidden — the skill is system-curated (platform-owned) and cannot be downloaded. It remains viewable through the read endpoints.404 skill_not_found — no skill with this id exists.409 skill_content_missing — the skill is registered but has no stored content.409 skill_type_drift — the skill's record type disagrees with its stored files (single_file vs bundle).413 archive_too_large — the stored skill exceeds the 50 MB archive limit, so it cannot be packaged. Nothing is wrong with the request itself; retrying will not help until the skill is made smaller. This is the same ceiling archive uploads are held to.503: The service may be temporarily unavailable, or the skill may have changed while you were downloading it. Please try again shortly.curl --location --globoff 'https:///skills-service/api/v2/skills//archive' \
--header 'Ocp-Apim-Subscription-Key: ' \
--header 'Authorization: Bearer '{
"data": {
"context": {
"skill_name": "my-skill"
},
"error": {
"code": "skill_name_taken",
"details": "Skill name 'my-skill' is already taken"
}
},
"message": "Skill name 'my-skill' is already taken",
"success": false
}