---
title: "Catalog Search"
method: GET
path: "/v1/catalog/search"
tags: ["Catalog"]
---

# Catalog Search

`GET /v1/catalog/search`

## Request

- Base URL: `https://api.tlmtr.io`
- URL: `https://api.tlmtr.io/v1/catalog/search`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/tlmtr/apis/telemetr-io-public-api/docs/v1/catalog/search/get.ts> (a function with typed inputs; its response is checked against the schema)

Search channels in catalog with advanced filters and sorting.

## Query parameters

- `term` string
- `search_in_about` boolean
- `country` string
- `language` string
- `category` string
- `members_min` integer
- `members_max` integer
- `views_min` integer
- `views_max` integer
- `er_min` integer
- `er_max` integer
- `privacy` 'Public' | 'Private': Channel privacy type
- `verified_only` boolean
- `sort_by` 'members_count' | 'members_growth7d' | 'members_growth30d' | 'members_growth90d' | 'post_views' | 'post_views24h' | 'er' | 'ads_index' | 'mentions_all' | 'mentions7_d' | 'mentions30_d': Catalog sort field
- `sort_direction` 'asc' | 'desc': Sort direction
- `limit` integer
- `skip` integer

## Response `200`

Catalog search results

- CatalogSearchResponse
  - `items` CatalogItem[], required: List of channels
    - `internal_id` string, required: Chat internal id
    - `title` string, required: Chat name
    - `description` string, nullable: Chat description
    - `members_count` integer, required: Number of members
    - `privacy` 'Public' | 'Private', required: Channel privacy type
    - `photo_url` string, nullable: Chat image
    - `country` string, nullable: Channel country
    - `language` string, nullable: Channel language
    - `category` string, nullable: Channel category
    - `verified` boolean, required: Telegram verification
    - `members_change` MembersChange
      - `tomorrow` integer, nullable: Yesterday
      - `last_7_days` integer, nullable: Last 7 days
      - `last_30_days` integer, nullable: Last 30 days
    - `post_views` integer, nullable: Average post views
    - `post_views_24h` integer, nullable: Average post views 24h
    - `er` number, float, nullable: Engagement rate
    - `ads_index` 'D' | 'D+' | 'C' | 'C+' | 'B' | 'B+' | 'A' | 'A+': Ads index grade
    - `mentions` MentionsStats
      - `all_time` integer, nullable: Total mentions count (all time)
      - `last_7_days` integer, nullable: Mentions in last 7 days
      - `last_30_days` integer, nullable: Mentions in last 30 days
  - `count` integer, required: Total count of results
  - `audience_count` integer, required: Total audience count

## Other responses

- `400`: **Bad Request:** The request sent to the server is invalid. Request parameters are missing, incorrect, or in the wrong format.
- `401`: **Unauthorized:** The provided API key is invalid or absent. Provided in the request API key is not valid or is missing.
- `402`: **Payment Required:** Not enough credits to perform this request. The plan allows this call but the credit balance does not cover it. Top up credits and retry. Amounts are in milli-credits (1 credit = 1000).
- `403`: **Forbidden:** Access to this resource is not allowed. User does not have permission to access this feature.
- `404`: **Not Found:** Requested resource could not be found on the server. Specific resource with the provided ID cannot be found.
- `412`: **Inactive Subscription:** The user's subscription is not currently active. User subscription has expired or is otherwise inactive.
- `426`: **Quota Reached:** The user's subscription limit has been reached. User has exceeded their monthly limit for unique channels or total requests. For higher limits please contact us via Telegram [@telemetrio_contact](https://t.me/telemetrio_contact) or write to contact@telemetr.io.
- `429`: **Too Many Requests:** The request rate limit has been reached. Retry after the interval indicated by the response headers.
- `503`: **Service Unavailable:** Credit accounting is temporarily unreachable. The request was refused rather than served without being billed. This is transient — retry with backoff. Carries the standard message envelope, with a constant message: the underlying failure is ours and its text names internal machinery, so it is never forwarded.

## Changes

- **2026-10-09** `6c2bfd66c5f2`: 8 breaking, 2 info
  - the response's body type changed from `object` to no type for status `402`
  - the response's body type changed from `object` to no type for status `426`
  - removed the required property `available_mc` from the response with the `402` status
  - removed the required property `limit` from the response with the `426` status
  - …6 more
- **2026-09-10** `80951ad7b3fb`: 2 info
  - added the media type `application/json` for the response with the status `412`
  - added the non-success response with the status `429`

[Operation history](https://skmtc.dev/tlmtr/apis/telemetr-io-public-api/changes/v1/catalog/search/get.md)

---

[API](https://skmtc.dev/tlmtr/apis/telemetr-io-public-api.md) - [All operations](https://skmtc.dev/tlmtr/apis/telemetr-io-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/tlmtr/apis/telemetr-io-public-api/revisions/98f399867856?raw)
