---
title: "Find alternatives to a product"
method: GET
path: "/api/v1/products/{slug}/alternatives"
tags: ["Alternatives"]
---

# Find alternatives to a product

`GET /api/v1/products/{slug}/alternatives`

## Request

- Base URL: `https://peerpush.com`
- URL: `https://peerpush.com/api/v1/products/{slug}/alternatives`
- Auth: one of:
  - API key in header `X-PeerPush-Api-Key`
  - API key in query parameter `api_key`

## Path parameters

- `slug` string, required

## Query parameters

- `pricingType` 'Free' | 'Freemium' | 'Subscription' | 'OneTime' | 'Paid'
- `platforms` string
- `audience` string
- `limit` integer
- `offset` integer

## Response `200`

Find alternatives to a product

- object
  - `data` AlternativesResult, required
    - `product` object, required: The product alternatives were requested for
      - `name` string
      - `slug` string
    - `alternatives` Product[], required
      - `id` string
      - `slug` string
      - `name` string
      - `tagline` string
      - `description` string
      - `websiteUrl` string, uri: PeerPush redirect to the product website, attributed to your API key. Use it for every link you render; it lands on the product site with PeerPush UTM tags.
      - `domain` string, nullable: Bare hostname of the product website (e.g. "example.com"), for display and matching
      - `appStoreUrl` string, uri, nullable: PeerPush redirect to the Apple App Store listing, attributed to your API key, or null
      - `playStoreUrl` string, uri, nullable: PeerPush redirect to the Google Play Store listing, attributed to your API key, or null
      - `mcpServerUrl` string, uri, nullable: Remote MCP server endpoint or registry/install page URL (raw, connect or install directly), or null
      - `cliInstallCommand` string, nullable: One-line CLI install command (e.g. "npm install -g foo"), or null
      - `apiDocsUrl` string, uri, nullable: API documentation link (UTM-tagged), or null
      - `peerpushUrl` string, uri: URL to the product page on PeerPush
      - `logoUrl` string, uri
      - `pricing` object
        - `type` 'Free' | 'Freemium' | 'Subscription' | 'OneTime' | 'Paid' | 'null', nullable
        - `startingPrice` number, nullable
      - `platforms` string[]
      - `useCases` string[]
      - `audiences` string[]
      - `categories` string[]
      - `community` object
        - `upvotes` integer
        - `followers` integer
        - `comments` integer
        - `rating` object, nullable: Aggregate rating across public (non-owner) reviews; null when there are no public ratings
          - `average` number, required: Raw average star rating (1–5) over public reviews
          - `count` integer, required: Number of public (non-owner) ratings
          - `weighted` number, required: Confidence-weighted Bayesian rating that pulls low-sample ratings toward a global prior. Use this when ranking or recommending products by rating; it prevents a single 5★ from beating a 50×4.8★ average.
        - `peerPushScore` number
        - `totalScore` number
      - `badges` object
        - `current` 'Live' | 'Trending' | 'ProductOfTheDay' | 'ProductOfTheWeek' | 'ProductOfTheMonth'
        - `productOfTheDay` string, date-time, nullable
        - `productOfTheWeek` string, date-time, nullable
        - `productOfTheMonth` string, date-time, nullable
      - `social` object
        - `twitterUsername` string, nullable
        - `linkedinUrl` string, nullable
      - `publishedAt` string, date-time, nullable
      - `lastUpdatedAt` string, date-time, nullable
      - `uptime` object: Result of the most recent uptime probes.
        - `status` 'Unknown' | 'Online' | 'Degraded' | 'Offline', required: Online (all recent probes succeeded), Degraded (mixed results), Offline (all recent probes failed), Unknown (no probes recorded yet).
        - `checkedAt` string, date-time, nullable, required
      - `activeDeals` object[]
        - `title` string
        - `percentOff` integer
        - `validUntil` string, date-time
      - `recentUpdates` object[]: Up to 10 most recent product updates, newest first. Empty when the owner has posted none.
        - `title` string, required
        - `content` string, required
        - `createdAt` string, date-time, required
        - `engagement` object, required
          - `upvotes` integer, required
          - `comments` integer, required
    - `externalAlternatives` ExternalAlternative[], required: Not paginated; returned on the first page only (empty when offset > 0)
      - `id` string, required
      - `name` string, required
      - `websiteUrl` string, uri, required: PeerPush redirect to the product website, attributed to your API key
      - `domain` string, nullable, required: Bare hostname of the product website
      - `iconUrl` string, uri, nullable, required

## Other responses

- `400`: Invalid query parameters (code: VALIDATION_ERROR)
- `401`: Missing, unknown, or revoked API key (code: UNAUTHORIZED or INVALID_API_KEY)
- `404`: Resource not found (code: NOT_FOUND)
- `429`: Hourly per-key quota exhausted (code: RATE_LIMITED)
- `500`: Unexpected server error (code: INTERNAL_ERROR)

---

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