# GET /v1/skills/{skill_id}

> One skill and its files.

In [Skills API](https://vestra.ai/developers/reference/api/skills.md): Skills your Bash may use: upload one, give it new versions, list them.

Send `Authorization: Bearer vk_test_...` on every call.

One skill and its files.

Your API key, scope `setup` or `all`. On the card: [`deploy`](https://vestra.ai/developers/deploy.md). Over HTTP it is made from the contract: fill in each {…} and every value.

## Request

Path:

- `skill_id` (`string`, required): The skill's id (`skl_...`).

## Answers 200

- `object` (`"skill"`): Always `skill`.
- `id` (`string | null`): The skill's id (`skl_`); null for a skill Bash already has.
- `source` (`"company" | "built_in"`): `company`: one you uploaded. `built_in`: one Bash already has.
- `slug` (`string`): Its name in a deployment: what `skills` takes for one Bash already has.
- `name` (`string`): Its name, from its SKILL.md.
- `description` (`string`): What it does, from its SKILL.md: Bash reads this to know when to use it.
- `version` (`string | null`): The current version's content hash; null for a skill Bash already has.
- `sha256` (`string | null`): A hash of the files as uploaded, which the SDKs and the CLI compute over a folder the same way, to upload only a folder that changed. Null for a skill Bash already has, and for one uploaded before this field.
- `files` (`object[]`, may be absent): Its files, on GET /v1/skills/{skill_id}; absent in lists.
  - `path` (`string`): The file's path inside the skill.
  - `bytes` (`integer`): Its size, in bytes.
  - `content` (`string`): Its text.
- `created_at` (`string | null`): When it was uploaded; null for a skill Bash already has.
- `updated_at` (`string | null`): When its newest version was uploaded; null for a skill Bash already has.

## Code

**HTTP**

```bash
curl "$VESTRA_BASE_URL/v1/skills/{skill_id}" \
  -H "Authorization: Bearer $VESTRA_API_KEY"
```

**TypeScript, Python, CLI, MCP**: No sample in your language for this route, so here it is over HTTP.
