> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.partnerpage.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.partnerpage.io/_mcp/server.

# List and search a directory's partners

GET https://v1.api.partnerpage.io/api/search/v1alpha/directories/{directoryId}/entries/

Lists the partners and apps a directory shows to its visitors, the same reads the directory's own pages use. No API key is needed.

Which listings come back: without `search` or `filters`, only `public` listings. Once either is set, `searchable` listings are included too. `hidden` and `inactive` listings are never returned.

Add `include=filter_options` to also get each listing's `status` and `assignedFilterOptions`, so a site can show and filter partner cards without one details request per partner. With `page_size=120`, a directory of up to 120 listings comes back in one request; larger directories page with `next`.

Replace `DIRECTORY_ID` with your directory's ID in this minimal request:

```sh
curl 'https://v1.api.partnerpage.io/api/search/v1alpha/directories/DIRECTORY_ID/entries/?entry_type=partner&include=filter_options&page_size=120'
```

Omit optional parameters you do not use. Empty `include`, `ordering` or `page_size` values are invalid; an empty `page` returns 404.

Results can trail an edit by a few seconds. The partner details endpoint always reads the latest approved profile.

To page through `ordering=random`, follow the `next` links or pass a `seed`. Without one, every request gets a fresh shuffle. An unknown directory returns an empty list.

Reference: https://docs.partnerpage.io/api-reference/directory/public-directory/list-and-search-a-directorys-partners

## Request

### Path parameters

- `directoryId` (string, required) — ID of the directory

### Query parameters

- `availability` (boolean, optional) — true (or 1): only partners marked available. Apps have no availability and stay in the results. Blank is ignored; a value other than true, 1 or false is a 400.
- `entry_type` (enum, optional) — Only partners, or only apps. Lookup suffixes such as `entry_type__in` are not supported and are ignored.
  - Allowed values: `app`, `partner`
- `featured` (boolean, optional) — true or false: only featured, or only not featured, listings. Blank is ignored; any other value is a 400.
- `filters` (string, optional) — Filter option slugs in brackets, from the filters endpoint. A listing must match every bracket and any slug inside one: `(cross-industry,education)(global)` returns listings with cross-industry or education, and global. Includes searchable listings. A malformed value is a 400 with `{"error": "Filter query parameter is incorrect"}`.
- `include` (enum, optional) — `filter_options` adds `status` and `assignedFilterOptions` to every listing. Any other value, or an empty one, is a 400.
  - Allowed values: `filter_options`
- `ordering` (enum, optional) — Sort order. Without one, a search sorts by relevance. Empty or unknown values return a 400 naming ordering. Repeat the parameter to supply more than one sort value.
  - Allowed values: `-tier`, `-tier_review`, `-tier_review_average`, `-title`, `random`, `recommended`, `relevance`, `tier`, `tier_review`, `tier_review_average`, `title`
- `page` (integer, optional) — Page number, starting at 1. Empty, non-numeric and out-of-range values return 404. Follow `next` to page through the results.
- `page_size` (integer, optional) — Listings per page: a positive integer, 5 by default, at most 120. A larger value returns the maximum.
- `search` (string, optional) — Words to look for in names, headlines, descriptions, keywords, tier names and filter option names. Includes searchable listings.
- `seed` (string, optional) — A non-empty string keeps `ordering=random` the same across pages. Missing or blank generates a fresh shuffle.

## Response

### 200

One page of listings

- `count` (integer, required)
- `results` (list of SearchEntryResult, required)
- `next` (string, optional, nullable)
- `previous` (string, optional, nullable)
- `facets` (PaginatedSearchEntryResultListFacets, optional) — Not used by the listing; always empty.

## Errors

### 400 Bad Request Error

A malformed parameter, named in the body, for example `{"include": ["\"x\" is not a valid choice."]}` or `{"featured": ["Must be true or false"]}`. A malformed `filters` answers `{"error": "Filter query parameter is incorrect"}`.

- `any`

### 404 Not Found Error

A `page` past the last one, or not a page number

- `any`

## Types

### SearchEntryResult

- `id` (string, required)
- `title` (string, required)
- `slug` (string, required) — For a partner, pass it to the partner profile read.
- `icon` (string, required, nullable) — Logo URL.
- `image` (string, required, nullable) — Cover image URL.
- `headline` (string, required, nullable)
- `description` (string, required, nullable)
- `entryType` (enum, required) — * `partner` - partner * `app` - app
  - Allowed values: `partner`, `app`
- `featured` (boolean, required)
- `callouts` (list of SearchEntryCallout, required)
- `tier` (SearchEntryTier, required) — The listing's tier, or an empty object when it has none.
- `highlightedTitle` (string, required) — With a search, the HTML-escaped title in a \<div> with the matching words in \<b> tags. Empty without a search.
- `highlightedDescription` (string, required) — With a search, the first matching text, HTML-escaped, in a \<div>, matching words in \<b> tags. Empty without a search.
- `availability` (boolean, optional) — Partners only.
- `website` (string, optional, nullable)
- `verifications` (list of SearchEntryVerification, optional, nullable) — Partners only. Null when the partner has none.
- `rating` (double, optional, nullable) — Partners only.
- `numberOfReviews` (integer, optional, nullable) — Partners only.
- `status` (enum, optional) — Only with include=filter_options. * `public` - public * `searchable` - searchable
  - Allowed values: `public`, `searchable`
- `assignedFilterOptions` (list of SearchEntryFilterOption, optional) — Only with include=filter_options. The filter options the listing has, from the filters the directory shows in its filter bar or on profiles.

### PaginatedSearchEntryResultListFacets

Not used by the listing; always empty.

### SearchEntryCallout

- `id` (string, required)
- `name` (string, required)
- `textColor` (string, required, nullable)
- `backgroundColor` (string, required, nullable)
- `order` (integer, required)

### SearchEntryTier

- `title` (string, optional)
- `image` (string, optional, nullable)

### SearchEntryVerification

- `id` (string, required)
- `title` (string, required)

### SearchEntryFilterOption

- `id` (string, required)
- `name` (string, required)
- `slug` (string, required)
- `image` (string, required, nullable)
- `order` (integer, required)
- `filter` (string, required) — ID of the option's filter.

## Examples

**Response**

```json
{
  "count": 2,
  "results": [
    {
      "id": "eda239ce-813f-43d8-b78b-b38ae62536b8",
      "title": "A very nice partner",
      "slug": "a-very-nice-partner",
      "icon": "https://admin.partnerpage.io/media/directories/icons/eda239ce-813f-43d8-b78b-b38ae62536b8/e9c13a85-250b-4d3d-beb7-6a7d205aae92.png",
      "image": "https://admin.partnerpage.io/media/directories/images/eda239ce-813f-43d8-b78b-b38ae62536b8/c9e0f039-7b26-485e-b453-efc79d6b3bb9.png",
      "headline": "A very nice partner to have.",
      "description": "We help teams roll out AI.",
      "entryType": "partner",
      "featured": false,
      "callouts": [
        {
          "id": "52c28cb1-491d-4db8-89ba-411600e1f718",
          "name": "Accounting",
          "textColor": null,
          "backgroundColor": null,
          "order": 0
        }
      ],
      "tier": {
        "title": "Gold",
        "image": "https://admin.partnerpage.io/media/directories/tiers/gold.png"
      },
      "highlightedTitle": "",
      "highlightedDescription": "",
      "availability": true,
      "website": "https://a-very-nice-partner.com",
      "verifications": null,
      "rating": null,
      "numberOfReviews": null,
      "status": "public",
      "assignedFilterOptions": [
        {
          "id": "2c711188-b227-416b-9883-fa18798b4130",
          "name": "Cross-industry",
          "slug": "cross-industry",
          "image": null,
          "order": 0,
          "filter": "13484f55-bf4f-4aab-81bf-69e6d0b46c15"
        }
      ],
      "iconDark": "https://admin.partnerpage.io/media/directories/icons-dark/eda239ce-813f-43d8-b78b-b38ae62536b8/4c1d3f46-8d1b-4a6c-9e40-2e5e1d6a7b3c.png",
      "imageDark": "https://admin.partnerpage.io/media/directories/images-dark/eda239ce-813f-43d8-b78b-b38ae62536b8/0a4f0d1e-7a3b-4b6d-8d0e-9c2f4e5a6b7c.png"
    },
    {
      "id": "25a46489-9a7e-46c6-ba88-6958c3bc4fd9",
      "title": "Acme App",
      "slug": "acme-app",
      "icon": null,
      "image": "https://admin.partnerpage.io/media/directories/images/fc91ca3b-2256-48bf-a913-573f7be764cf/402bd2fd-27b5-4a62-90ac-b021eb329de6.png",
      "headline": "Some app headline",
      "description": "A professional application for all your needs",
      "entryType": "app",
      "featured": false,
      "callouts": [],
      "tier": {},
      "highlightedTitle": "",
      "highlightedDescription": "",
      "website": "https://some.website.com/page/",
      "status": "public",
      "assignedFilterOptions": [],
      "iconDark": null,
      "imageDark": null
    }
  ],
  "next": null,
  "previous": null,
  "facets": {}
}
```

**SDK Code**

```python Example response
import requests

url = "https://v1.api.partnerpage.io/api/search/v1alpha/directories/directoryId/entries/"

querystring = {"filters":"(cross-industry,education)(global)","include":"filter_options","ordering":"title","page":"1","page_size":"120","seed":"42"}

response = requests.get(url, params=querystring)

print(response.json())
```

```javascript Example response
const url = 'https://v1.api.partnerpage.io/api/search/v1alpha/directories/directoryId/entries/?filters=%28cross-industry%2Ceducation%29%28global%29&include=filter_options&ordering=title&page=1&page_size=120&seed=42';
const options = {method: 'GET'};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```