---
title: "Search listings (/v1/ prefix)"
method: GET
path: "/v1/listings"
tags: ["catalog"]
---

# Search listings (/v1/ prefix)

`GET /v1/listings`

## Request

- Base URL: `https://skillselion.com`
- URL: `https://skillselion.com/v1/listings`
- Auth: none declared

Rewrite of GET /api/v1/listings. Same pagination envelope.

## Headers

- `API-Version` '1'

## Response `200`

Paginated listings.

- ListingPage
  - `items` Listing[], required
    - `id` string, required: Listing slug id (path-style ids are URL-encoded).
    - `type` 'skill' | 'marketplace' | 'plugin' | 'mcp' | 'workflow', required
    - `name` string, required
    - `author` string
    - `repo` string: GitHub owner/repo when known.
    - `description` string
    - `summary` string
    - `category` string
    - `stage` 'idea' | 'validate' | 'build' | 'ship' | 'launch' | 'grow' | 'operate'
    - `stars` integer
    - `installs` integer: Real install count from the skills.sh registry.
    - `votes` integer: Internal ranking tiebreak only; voting UI is retired.
    - `verifiedSafe` boolean
    - `trustScore` number
  - `limit` integer, required
  - `offset` integer, required
  - `hasMore` boolean, required
  - `next` string, nullable: Relative URL of the next page, or null. Uses the cursor query param.
  - `pageToken` string, required: Opaque next-page cursor. Empty string on the last page. Same value as cursor.
  - `cursor` string: Cursor-based next-page token (preferred). Same value as pageToken.

## Other responses

- `400`: Invalid query or body.
- `401`: Authentication required (staff routes only).
- `404`: No listing or route matches.
- `405`: Method not allowed.
- `429`: Rate limited. Retry-After and RateLimit headers are set.
- `500`: Upstream or server error.

---

[API](https://skmtc.dev/skillselion/apis/skillselion-public-api.md) · [All operations](https://skmtc.dev/skillselion/apis/skillselion-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/skillselion/apis/skillselion-public-api/revisions/e6e0c4d3d116?raw)
