# Create a skill

> POST /skills

Source: https://mockflow.com/developers/reference/skills/create-skill

**POST** `https://api.mockflow.com/v1/skills`  
Scopes: `ai:generate`

**curl**

```bash
curl https://api.mockflow.com/v1/skills \
  -X POST \
  -H "Authorization: Bearer $MOCKFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Q4 Launch Planning",
  "description": "string",
  "outputType": "string",
  "category": "general",
  "systemPrompt": "string",
  "placeholder": "string",
  "tags": [
    "string"
  ],
  "model": "string"
}'
```

**JavaScript**

```javascript
const response = await fetch("https://api.mockflow.com/v1/skills", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.MOCKFLOW_API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
  "name": "Q4 Launch Planning",
  "description": "string",
  "outputType": "string",
  "category": "general",
  "systemPrompt": "string",
  "placeholder": "string",
  "tags": [
    "string"
  ],
  "model": "string"
})
});

const data = await response.json();
```

**Python**

```python
import os, requests

response = requests.post(
    "https://api.mockflow.com/v1/skills",
    headers={"Authorization": f"Bearer {os.environ['MOCKFLOW_API_KEY']}"},
    json={
  "name": "Q4 Launch Planning",
  "description": "string",
  "outputType": "string",
  "category": "general",
  "systemPrompt": "string",
  "placeholder": "string",
  "tags": [
    "string"
  ],
  "model": "string"
},
)

response.raise_for_status()
data = response.json()
```

**201**

```json
{
  "id": "string",
  "slug": "string",
  "name": "Q4 Launch Planning",
  "description": "string",
  "outputType": "string",
  "category": "string"
}
```

**402**

```json
{
  "error": {
    "code": "plan_limit",
    "message": "AI credits exhausted. 0 of 2000 remaining this month.",
    "upgradeUrl": "https://mockflow.com/pricing"
  },
  "requestId": "req_01ja"
}
```

**429**

```json
{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests.",
    "docsUrl": "https://mockflow.com/developers/concepts/errors#rate_limited"
  },
  "requestId": "req_45d49816999bac40"
}
```

Plus and Max only. The skill is private to your workspace until the MockFlow team approves it for the library.

### Authorization

- `Authorization` (string, required): `Bearer <key>`. The key needs `ai:generate` scope. Create and manage keys in the [developer console](/developers/console/); what each scope unlocks is on the [scopes page](/developers/concepts/scopes).

### Body

- `name` (string, required)
- `description` (string)
- `outputType` (string, required)
- `category` (enum<string>): One of `general`, `brainstorm`, `diagrams`, `planning` or `media`. Defaults to `general`.
- `systemPrompt` (string, required)
- `placeholder` (string)
- `tags` (string[])
- `model` (string)

### Response

- `id` (string)
- `slug` (string | null)
- `name` (string)
- `description` (string)
- `outputType` (string | null): The kind of item the skill shapes, in the skill library's own vocabulary (kanban, mindmap, markdown, swimlanediagram …).
- `category` (string)
- `tags` (string[])
- `placeholder` (string)
- `scope` (enum<string>): One of `public` or `team`.
- `author` (object): - `email` (string)
  - `name` (string)
- `iconUrl` (string | null)
- `uses` (integer)
- `systemPrompt` (string): Present on public skills and on your own.
- `createdAt` (string | null)

### Errors

- 402 `plan_limit`: The workspace plan does not allow this, or AI credits are exhausted.
- 429 `rate_limited`: Too many requests.
