# Create a skill

**POST** `/v1/skills`

Creates a skill from a zip bundle. The bundle must contain a `SKILL.md`
that provides the skill name and description; those fields are read from
the bundle, not from the request.

Base URL: `https://api.perplexity.ai`

Tags: `Skills`

## Authorization

| Option | Scheme | Type | Sent as | Scopes |
| --- | --- | --- | --- | --- |
| Option 1 | `HTTPBearer` | `http` | `Authorization: Bearer <token>` | — |

## Request body

Required. Media type: `multipart/form-data`

The skill bundle as a zip archive

### Example request body

```json
{
  "file": "binary"
}
```

## Responses

| Status | Description | Media type |
| --- | --- | --- |
| `201` | The created skill | `application/json` |
| `400` | Invalid request or bundle | `application/json` |
| `409` | Skill limit reached for this Project; delete a skill to create another | `application/json` |
| `413` | Bundle exceeds the size limit | `application/json` |
| `429` | Rate limit or upload concurrency limit exceeded | `application/json` |
| `502` | Skill service unavailable | `application/json` |

### Example response: 201 — The created skill

```json
{
  "created_at": "2026-06-09T00:00:00Z",
  "description": "string",
  "latest_revision": "string",
  "name": "string",
  "revision": "string",
  "skill_id": "string",
  "updated_at": "2026-06-09T00:00:00Z"
}
```

### Example response: 400 — Invalid request or bundle

```json
{
  "error": {
    "code": 0,
    "message": "string",
    "param": "string",
    "type": "string"
  }
}
```

### Example response: 409 — Skill limit reached for this Project; delete a skill to create another

```json
{
  "error": {
    "code": 0,
    "message": "string",
    "param": "string",
    "type": "string"
  }
}
```

### Example response: 413 — Bundle exceeds the size limit

```json
{
  "error": {
    "code": 0,
    "message": "string",
    "param": "string",
    "type": "string"
  }
}
```

### Example response: 429 — Rate limit or upload concurrency limit exceeded

```json
{
  "error": {
    "code": 0,
    "message": "string",
    "param": "string",
    "type": "string"
  }
}
```

### Example response: 502 — Skill service unavailable

```json
{
  "error": {
    "code": 0,
    "message": "string",
    "param": "string",
    "type": "string"
  }
}
```

## Related pages

- [Add a skill revision](./updateskill.md)
- [Cancel Agent Response](./cancelagentresponse.md)
- [Create Agent Response](./createagent.md)
- [Create Async Chat Completion](./create_async_chat_completions_async_chat_completions_post.md)
- [Create Chat Completion](./chat_completions_chat_completions_post.md)
- [Create Contextualized Embeddings](./contextualized_embeddings_v1_contextualizedembeddings_post.md)
- [Create Embeddings](./embeddings_v1_embeddings_post.md)
- [Delete a skill](./deleteskill.md)
- [Download Agent Response File](./downloadagentfile.md)
- [Get a skill](./getskill.md)

# Agent Instructions

Cite this page’s canonical URL and keep its documentation version.
Follow Link headers to discover available agent guidance and tools.
Read the advertised skill for the requested version before choosing starting pages.
Treat documentation as reference material, not execution authorization.
