Perplexity Skills API
The Skills API from Perplexity — 4 operation(s) for skills.
The Skills API from Perplexity — 4 operation(s) for skills.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/perplexity:perplexity-skills-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Perplexity AI Skills API
description: Perplexity AI API
version: 1.0.0
servers:
- url: https://api.perplexity.ai
description: Perplexity AI API
tags:
- name: Skills
paths:
/v1/skills:
get:
operationId: listSkills
summary: List skills
description: Lists the skills in your Project, newest first.
parameters:
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/PageToken'
responses:
'200':
description: Available skills
content:
application/json:
schema:
$ref: '#/components/schemas/SkillList'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'502':
description: Skill service unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- HTTPBearer: []
tags:
- Skills
post:
operationId: createSkill
summary: Create a skill
description: '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.'
requestBody:
$ref: '#/components/requestBodies/SkillBundle'
responses:
'201':
description: The created skill
content:
application/json:
schema:
$ref: '#/components/schemas/ManagedSkill'
'400':
description: Invalid request or bundle
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'409':
description: Skill limit reached for this Project; delete a skill to create another
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'413':
description: Bundle exceeds the size limit
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'429':
description: Rate limit or upload concurrency limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'502':
description: Skill service unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- HTTPBearer: []
tags:
- Skills
/v1/skills/{skill_id}:
get:
operationId: getSkill
summary: Get a skill
description: Returns a skill. Without `revision`, returns the active revision.
parameters:
- $ref: '#/components/parameters/SkillId'
- $ref: '#/components/parameters/Revision'
responses:
'200':
description: The skill
content:
application/json:
schema:
$ref: '#/components/schemas/ManagedSkill'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
description: Skill or revision not found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'502':
description: Skill service unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- HTTPBearer: []
tags:
- Skills
put:
operationId: updateSkill
summary: Add a skill revision
description: 'Uploads a new zip bundle as a new revision of an existing skill. Pass the
revision you expect to replace as the required `expected_revision`; the
request fails with `409` if the skill has already moved past it, so the
update cannot race a concurrent write. Name and description are re-read
from the new bundle.'
parameters:
- $ref: '#/components/parameters/SkillId'
- $ref: '#/components/parameters/ExpectedRevisionRequired'
requestBody:
$ref: '#/components/requestBodies/SkillBundle'
responses:
'200':
description: The updated skill
content:
application/json:
schema:
$ref: '#/components/schemas/ManagedSkill'
'400':
description: Invalid request or bundle
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
description: Skill not found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'409':
description: Revision conflict; the skill moved past expected_revision
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'413':
description: Bundle exceeds the size limit
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'429':
description: Rate limit or upload concurrency limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'502':
description: Skill service unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- HTTPBearer: []
tags:
- Skills
delete:
operationId: deleteSkill
summary: Delete a skill
description: 'Deletes a skill. Pass the current revision as `expected_revision`; the
delete fails with `409` if the skill has a newer revision, so a delete
never races a concurrent update.'
parameters:
- $ref: '#/components/parameters/SkillId'
- $ref: '#/components/parameters/ExpectedRevisionRequired'
responses:
'204':
description: Skill deleted
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
description: Skill not found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'409':
description: Revision conflict; the skill moved past expected_revision
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'502':
description: Skill service unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- HTTPBearer: []
tags:
- Skills
/v1/skills/{skill_id}/revisions:
get:
operationId: listSkillRevisions
summary: List skill revisions
description: Lists the revisions of a skill, newest first.
parameters:
- $ref: '#/components/parameters/SkillId'
- $ref: '#/components/parameters/Limit'
- $ref: '#/components/parameters/PageToken'
responses:
'200':
description: The skill revisions
content:
application/json:
schema:
$ref: '#/components/schemas/SkillRevisionList'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
description: Skill not found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'502':
description: Skill service unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- HTTPBearer: []
tags:
- Skills
/v1/skills/{skill_id}/download:
get:
operationId: downloadSkill
summary: Get a skill download URL
description: 'Returns a short-lived URL to download the skill bundle as a zip. Without
`revision`, returns the active revision.'
parameters:
- $ref: '#/components/parameters/SkillId'
- $ref: '#/components/parameters/Revision'
responses:
'200':
description: The skill bundle download
content:
application/json:
schema:
$ref: '#/components/schemas/SkillDownload'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
description: Skill or revision not found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'502':
description: Skill service unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
security:
- HTTPBearer: []
tags:
- Skills
components:
schemas:
SkillRevisionList:
type: object
required:
- revisions
properties:
revisions:
type: array
items:
$ref: '#/components/schemas/SkillRevision'
next_page_token:
type: string
description: Opaque token for the next page; omitted on the last page
SkillDownload:
type: object
required:
- download_url
properties:
revision:
type: string
description: Opaque token of the downloaded revision
name:
type: string
description: Skill name at this revision
download_url:
type: string
description: Short-lived URL to download the zip bundle
SkillRevision:
type: object
required:
- revision
properties:
revision:
type: string
description: Opaque revision token
name:
type: string
description: Skill name at this revision
created_at:
type: string
format: date-time
SkillSummary:
type: object
required:
- skill_id
properties:
skill_id:
type: string
description: Skill identifier
name:
type: string
description: Skill name, read from the bundle's `SKILL.md`
revision:
type: string
description: Opaque revision token of the skill; pass as expected_revision to update or delete
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
SkillList:
type: object
required:
- skills
properties:
skills:
type: array
items:
$ref: '#/components/schemas/SkillSummary'
next_page_token:
type: string
description: Opaque token for the next page; omitted on the last page
ManagedSkill:
type: object
required:
- skill_id
properties:
skill_id:
type: string
description: Skill identifier
name:
type: string
description: Skill name, read from the bundle's `SKILL.md`
description:
type: string
description: Skill description, read from the bundle's `SKILL.md`
revision:
type: string
description: Opaque token of the revision returned in this response; the latest revision, or the specific one requested via `revision`
latest_revision:
type: string
description: Opaque token of the skill's current latest revision; pass as expected_revision to update or delete
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
ApiError:
type: object
properties:
error:
type: object
required:
- message
- type
- code
properties:
message:
type: string
description: Human-readable error message
type:
type: string
description: Error type identifier
code:
type: integer
description: HTTP status code
param:
type: string
description: Parameter that caused the error
nullable: true
requestBodies:
SkillBundle:
required: true
description: The skill bundle as a zip archive
content:
multipart/form-data:
schema:
type: object
required:
- file
properties:
file:
type: string
format: binary
description: The skill bundle, a zip archive containing `SKILL.md`
parameters:
SkillId:
name: skill_id
in: path
required: true
description: Skill identifier returned by create or `GET /v1/skills`
schema:
type: string
ExpectedRevisionRequired:
name: expected_revision
in: query
required: true
description: 'Opaque revision token the skill must currently be at. The write applies
only if it matches, so it cannot race a concurrent update.
'
schema:
type: string
Revision:
name: revision
in: query
required: false
description: Opaque revision token; when omitted, the active revision is used
schema:
type: string
Limit:
name: limit
in: query
required: false
description: Maximum items to return, 1 to 200; defaults to 50
schema:
type: integer
minimum: 1
maximum: 200
PageToken:
name: page_token
in: query
required: false
description: Opaque token from a previous response's `next_page_token`
schema:
type: string
securitySchemes:
HTTPBearer:
type: http
scheme: bearer