Perplexity Skills API

The Skills API from Perplexity — 4 operation(s) for skills.

Operations 7

GET /v1/skills List skills #
POST /v1/skills Create a skill #
GET /v1/skills/{skill_id} Get a skill #
PUT /v1/skills/{skill_id} Add a skill revision #
DELETE /v1/skills/{skill_id} Delete a skill #
GET /v1/skills/{skill_id}/revisions List skill revisions #
GET /v1/skills/{skill_id}/download Get a skill download URL #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/perplexity:perplexity-skills-api"
All apis
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.

Get an API 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 Specification

perplexity-skills-api-openapi.yml Raw ↑
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