skills-guide changedbuild-with-claude/skills-guide
Nearest release: v2.1.237, published an hour after this site recorded the change. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.
Recorded here
Lines+22added
Lines−155removed
From line
47
where the diff opens
First seen
14 Aug 2026
this site's first read of the page
Recorded edits21to this page, all time
The whole hunk
from line 47, old and new numbered
/
from line 47
4747| ------------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
4848| **Type value** | `anthropic` | `custom` |
4949| **Skill IDs** | Short names: `pptx`, `xlsx`, `docx`, `pdf` | Generated: `skill_01AbCdEfGhIjKlMnOpQrStUv` |
50| **Version format** | Date-based: `20251013` or `latest` | Epoch timestamp: `1759178010641129` or `latest` |
50| **Version format** | Date-based: `20251013` or `latest` | Version ID: `skver_01AbCdEfGhIjKlMnOpQrStUv` or `latest` |
5151| **Management** | Pre-built and maintained by Anthropic | Upload and manage through the [Skills API](https://platform.claude.com/docs/en/api/beta/skills/create) |
5252| **Availability** | Available to all users | Private to your workspace |
5353
from line 58
5858To use Skills, you need:
5959
60601. **Claude API key** from the [Claude Console](https://platform.claude.com/settings/keys)
612. **[Code execution tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool)** enabled in your requests
6162
622. **Beta headers:**
63Skills are generally available on the Claude API and don't require an `anthropic-beta` header, either for the Skills API or for `container.skills` in Messages requests. The examples in this guide still send the `skills-2025-10-02` beta header (plus `code-execution-2025-08-25` in Messages requests) and use the SDKs' `beta` namespace. Both headers remain valid opt-ins, so the examples work as written, and you can omit them in your own requests.
6364
64 * `code-execution-2025-08-25` - Enables code execution (required for Skills)
65 * `skills-2025-10-02` - Enables Skills API
66 * `files-api-2025-04-14` - Required only when you use the [Files API](https://platform.claude.com/docs/en/build-with-claude/files) to upload input files or download files a Skill produces
67
683. **[Code execution tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool)** enabled in your requests
69
7065Skills require the code execution tool, so use a model from its [model compatibility list](https://platform.claude.com/docs/en/agents-and-tools/tool-use/code-execution-tool#model-compatibility).
7166
7267***
from line 70
7570
7671### Container parameter
7772
78Skills are specified using the `container` parameter in the Messages API. You can include up to 8 Skills for each request.
73Skills are specified using the `container` parameter in the Messages API. You can include up to 20 Skills for each request.
7974
8075The structure is identical for both Anthropic and custom Skills. Specify the required `type` and `skill_id`, and optionally include `version` to pin to a specific version:
8176
from line 2251
22562251
22572252Upload your custom Skill to make it available in your workspace. You can upload a zip archive or individual file objects. The Python SDK also provides a `files_from_dir` helper that accepts a directory path.
22582253
2259Files are identified by the filename you attach. Per-file uploads must keep a common top-level directory in their paths (the `;filename=` suffix in the cURL example and the filename arguments in the SDK examples). A zip archive must contain the skill directory as its single top-level entry. For the walkthrough's skill, create one with `zip -r financial_skill.zip financial_skill/` and substitute it for the `example_skill.zip` placeholder in the zip-upload options.
2254Files are identified by the filename you attach (the `;filename=` suffix in the cURL example and the filename arguments in the SDK examples). For the walkthrough's skill, create a zip with `zip -r financial_skill.zip financial_skill/` and substitute it for the `example_skill.zip` placeholder in the zip-upload options.
22602255
22612256<CodeGroup defaultLanguage="CLI">
22622257 ```bash cURL
from line 2521
25262521
25272522**Requirements:**
25282523
2529* Must include a `SKILL.md` file at the top level
2524* Must include a `SKILL.md` file at the upload root (or at the top of a single enclosing folder)
25302525
2531* All files must specify a common root directory in their paths
2526* `display_name` is optional: when omitted, it derives from the `SKILL.md` `name`; an explicit value may be up to 255 characters and does not need to be unique within the workspace
25322527
2533* The top-level directory name must match the `name` in `SKILL.md` frontmatter (case and underscore insensitive: `Financial_Skill` matches `financial-skill`)
2534
2535* `display_title` is optional: when omitted, it derives from the `SKILL.md` `name`; an explicit value must be unique among the custom skills in your workspace
2536
25372528* Total upload size must be under 30 MB (uncompressed)
25382529
25392530* YAML frontmatter requirements:
from line 2787
27962787
27972788### Deleting a Skill
27982789
2799To delete a Skill, you must first delete all its versions:
2790Deleting a Skill also removes all of its versions. The cascade is GA-only behavior, so unlike the other examples in this guide, these call the GA surface directly rather than the `beta` namespace.
28002791
28012792<CodeGroup defaultLanguage="CLI">
28022793 ```bash cURL
2803 # Step 1: List the versions, then delete each one
2804 curl "https://api.anthropic.com/v1/skills/skill_01AbCdEfGhIjKlMnOpQrStUv/versions" \
2805 -H "x-api-key: $ANTHROPIC_API_KEY" \
2806 -H "anthropic-version: 2023-06-01" \
2807 -H "anthropic-beta: skills-2025-10-02"
2808
2809 # Repeat for each version the list returned
2810 curl -X DELETE "https://api.anthropic.com/v1/skills/skill_01AbCdEfGhIjKlMnOpQrStUv/versions/1759178010641129" \
2811 -H "x-api-key: $ANTHROPIC_API_KEY" \
2812 -H "anthropic-version: 2023-06-01" \
2813 -H "anthropic-beta: skills-2025-10-02"
2814
2815 # Step 2: Delete the Skill
28162794 curl -X DELETE "https://api.anthropic.com/v1/skills/skill_01AbCdEfGhIjKlMnOpQrStUv" \
28172795 -H "x-api-key: $ANTHROPIC_API_KEY" \
2818 -H "anthropic-version: 2023-06-01" \
2819 -H "anthropic-beta: skills-2025-10-02"
2796 -H "anthropic-version: 2023-06-01"
28202797 ```
28212798
28222799 ```bash CLI
2823 # Step 1: List the versions, then delete each one
2824 ant beta:skills:versions list \
2825 --skill-id skill_01AbCdEfGhIjKlMnOpQrStUv \
2826 --transform version \
2827 --raw-output
2828
2829 # Repeat for each version id the list returned
2830 ant beta:skills:versions delete \
2831 --skill-id skill_01AbCdEfGhIjKlMnOpQrStUv \
2832 --version 1759178010641129 >/dev/null
2833
2834 # Step 2: Delete the Skill
2835 ant beta:skills delete \
2800 ant skills delete \
28362801 --skill-id skill_01AbCdEfGhIjKlMnOpQrStUv >/dev/null
28372802 ```
28382803
from line 2804
28392804 ```python Python
28402805 client = anthropic.Anthropic()
28412806
2842 # Step 1: Delete all versions
2843 for version in client.beta.skills.versions.list(
2844 skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv"
2845 ):
2846 client.beta.skills.versions.delete(
2847 skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
2848 version=version.version,
2849 )
2850
2851 # Step 2: Delete the Skill
2852 client.beta.skills.delete(skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv")
2807 client.skills.delete(skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv")
28532808 ```
28542809
28552810 ```typescript TypeScript
28562811 const client = new Anthropic();
28572812
2858 // Step 1: Delete all versions
2859 for await (const version of client.beta.skills.versions.list(
2860 "skill_01AbCdEfGhIjKlMnOpQrStUv"
2861 )) {
2862 await client.beta.skills.versions.delete(version.version, {
2863 skill_id: "skill_01AbCdEfGhIjKlMnOpQrStUv"
2864 });
2865 }
2866
2867 // Step 2: Delete the Skill
2868 await client.beta.skills.delete("skill_01AbCdEfGhIjKlMnOpQrStUv");
2813 await client.skills.delete("skill_01AbCdEfGhIjKlMnOpQrStUv");
28692814 ```
28702815
28712816 ```csharp C#
2872 using Anthropic.Models.Beta.Skills.Versions;
2873 // ...
28742817 AnthropicClient client = new();
28752818
2876 // Step 1: Delete all versions
2877 await foreach (var version in (await client.Beta.Skills.Versions.List("skill_01AbCdEfGhIjKlMnOpQrStUv")).Paginate())
2878 {
2879 await client.Beta.Skills.Versions.Delete(
2880 version.Version,
2881 new VersionDeleteParams { SkillID = "skill_01AbCdEfGhIjKlMnOpQrStUv" }
2882 );
2883 }
2884
2885 // Step 2: Delete the Skill
2886 await client.Beta.Skills.Delete("skill_01AbCdEfGhIjKlMnOpQrStUv");
2819 await client.Skills.Delete("skill_01AbCdEfGhIjKlMnOpQrStUv");
28872820 ```
28882821
28892822 ```go Go
28902823 client := anthropic.NewClient()
28912824
2892 // Step 1: Delete all versions
2893 versions := client.Beta.Skills.Versions.ListAutoPaging(
2825 _, err := client.Skills.Delete(
28942826 context.TODO(),
28952827 "skill_01AbCdEfGhIjKlMnOpQrStUv",
2896 anthropic.BetaSkillVersionListParams{},
28972828 )
2898
2899 for versions.Next() {
2900 version := versions.Current()
2901 _, err := client.Beta.Skills.Versions.Delete(
2902 context.TODO(),
2903 version.Version,
2904 anthropic.BetaSkillVersionDeleteParams{
2905 SkillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
2906 },
2907 )
2908 if err != nil {
2909 log.Fatal(err)
2910 }
2911 }
2912 if versions.Err() != nil {
2913 log.Fatal(versions.Err())
2914 }
2915
2916 // Step 2: Delete the Skill
2917 _, err := client.Beta.Skills.Delete(
2918 context.TODO(),
2919 "skill_01AbCdEfGhIjKlMnOpQrStUv",
2920 anthropic.BetaSkillDeleteParams{},
2921 )
29222829 if err != nil {
29232830 log.Fatal(err)
29242831 }
from line 2832
29252832 ```
29262833
29272834 ```java Java
2928 import com.anthropic.models.beta.skills.versions.VersionListPage;
2929 import com.anthropic.models.beta.skills.versions.VersionDeleteParams;
2930 // ...
29312835 void main() {
29322836 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
29332837
2934 // Step 1: Delete all versions
2935 VersionListPage versions = client.beta().skills().versions().list("skill_01AbCdEfGhIjKlMnOpQrStUv");
2936
2937 for (var version : versions.autoPager()) {
2938 client.beta().skills().versions().delete(
2939 version.version(),
2940 VersionDeleteParams.builder()
2941 .skillId("skill_01AbCdEfGhIjKlMnOpQrStUv")
2942 .build()
2943 );
2944 }
2945
2946 // Step 2: Delete the Skill
2947 client.beta().skills().delete("skill_01AbCdEfGhIjKlMnOpQrStUv");
2838 client.skills().delete("skill_01AbCdEfGhIjKlMnOpQrStUv");
29482839 }
29492840 ```
29502841
from line 2842
29512842 ```php PHP
29522843 $client = new Client();
29532844
2954 // Step 1: Delete all versions
2955 $versions = $client->beta->skills->versions->list(
2845 $client->skills->delete(
29562846 skillID: 'skill_01AbCdEfGhIjKlMnOpQrStUv',
29572847 );
2958
2959 foreach ($versions->pagingEachItem() as $version) {
2960 $client->beta->skills->versions->delete(
2961 skillID: 'skill_01AbCdEfGhIjKlMnOpQrStUv',
2962 version: $version->version,
2963 );
2964 }
2965
2966 // Step 2: Delete the Skill
2967 $client->beta->skills->delete(
2968 skillID: 'skill_01AbCdEfGhIjKlMnOpQrStUv',
2969 );
29702848 ```
29712849
29722850 ```ruby Ruby
29732851 client = Anthropic::Client.new
29742852
2975 # Step 1: Delete all versions
2976 client.beta.skills.versions.list("skill_01AbCdEfGhIjKlMnOpQrStUv").auto_paging_each do |version|
2977 client.beta.skills.versions.delete(
2978 version.version,
2979 skill_id: "skill_01AbCdEfGhIjKlMnOpQrStUv"
2980 )
2981 end
2982
2983 # Step 2: Delete the Skill
2984 client.beta.skills.delete("skill_01AbCdEfGhIjKlMnOpQrStUv")
2853 client.skills.delete("skill_01AbCdEfGhIjKlMnOpQrStUv")
29852854 ```
29862855</CodeGroup>
29872856
2988Attempting to delete a Skill with existing versions returns a 400 error.
2989
29902857### Versioning
29912858
29922859Skills support versioning to manage updates safely:
from line 2866
29992866
30002867**Custom Skills:**
30012868
3002* Auto-generated epoch timestamps: `1759178010641129`
2869* Auto-generated version IDs: `skver_01AbCdEfGhIjKlMnOpQrStUv`
30032870* Use `"latest"` to always get the most recent version
30042871* Create new versions when updating Skill files
30052872
3006A new version is a complete snapshot, not a delta: upload the Skill's full file set each time, under the same top-level directory name used at creation. Files you omit are not carried over. The following examples re-upload the complete `financial_skill/` bundle from [Creating a Skill](https://platform.claude.com/docs/en/build-with-claude/skills-guide#creating-a-skill).
2873A new version is a complete snapshot, not a delta: upload the Skill's full file set each time. Files you omit are not carried over, and the `name` in the new version's `SKILL.md` must match the Skill's existing name. The following examples re-upload the complete `financial_skill/` bundle from [Creating a Skill](https://platform.claude.com/docs/en/build-with-claude/skills-guide#creating-a-skill).
30072874
30082875<CodeGroup defaultLanguage="CLI">
30092876 ```bash cURL
from line 3769
39023769
39033770### Request limits
39043771
3905* **Maximum Skills per request:** 8
3772* **Maximum Skills per request:** 20
39063773
39073774* **Maximum Skill upload size:** 30 MB (all files combined, uncompressed)
39083775
No line in this hunk matches that.