---
title: "Batch read: up to 25 published providers by slug or id in one request"
method: POST
path: "/api/v1/providers/batch"
tags: ["Providers"]
---

# Batch read: up to 25 published providers by slug or id in one request

`POST /api/v1/providers/batch`

## Request

- Base URL: `https://saaskly.com`
- URL: `https://saaskly.com/api/v1/providers/batch`
- Auth: none declared

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `slugs` string[]: Provider slugs (preferred)
  - `ids` integer[]
  - `depth` integer

## Response `200`

The published providers that matched, plus the requested keys that did not

- ProviderBatch
  - `docs` Provider[], required
    - `id` integer, required
    - `name` string, required
    - `slug` string, required
    - `category` 'cloud-management' | 'email' | 'voip' | 'seo-geo-aeo' | 'social-media-management' | 'domain-names' | 'vpn' | 'crm' | 'content-creation' | 'vps-hosting' | 'password-managers' | 'accounting-software' | 'antivirus' | 'cms-website-builders' | 'gpu-compute', required
    - `website` string, nullable
    - `shortDescription` string, nullable
    - `description` RichText: Lexical editor JSON. Prefer the `.md` mirror for prose.
    - `overallRating` number, nullable: Editorial score
    - `pros` object[]
      - `text` string
    - `cons` object[]
      - `text` string
    - `pricingTiers` PricingTier[]: First tier = entry plan
      - `tierName` string
      - `price` number, nullable: Price at the committed (usually annual) term
      - `priceMonthlyTerm` number, nullable: Month-to-month price; null = vendor does not publish one
      - `currency` 'usd' | 'eur' | 'gbp'
      - `billingPeriod` 'monthly' | 'yearly' | 'one-time'
      - `seats` integer, nullable
      - `features` object[]
        - `feature` string
    - `commercial` Commercial
      - `minSeats` integer, nullable
      - `minContractMonths` integer, nullable: 0 = month-to-month at the listed price
      - `monthlyTermPremiumPercent` number, nullable
      - `salesModel` 'direct' | 'partner-only' | 'null', nullable
      - `trustpilotScore` number, nullable
      - `trustpilotReviews` integer, nullable
    - `sponsored` boolean: Disclosed marketing partner; score unaffected
    - `sponsorName` string, nullable
    - `sponsorDisclosure` string, nullable
    - `featured` boolean
    - `status` 'published', required
    - `updatedAt` string, date-time
    - `createdAt` string, date-time
  - `requested` integer, required
  - `returned` integer, required
  - `missing` string[], required: Requested slugs/ids that are not published

## Other responses

- `400`: Error
- `422`: Idempotency-Key reused with a different body
- `429`: Too many requests — 300 per 60 s per client IP. Wait `Retry-After` seconds.
- `500`: Error

---

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