{
  "openapi": "3.0.1",
  "info": {
    "title": "Telegram Channel Search Scraper — Fresh Posts by Keyword",
    "description": "Search Telegram public channels by keyword and get the NEWEST matching posts from Telegram's own preview: channel title, @username, subscribers, description, post text, exact date, views, media, links and forward source. No login, no browser, 256 MB. Date filters for monitoring.",
    "version": "0.1",
    "x-build-id": "mqKJSIEwIvojB3REO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~telegram-channel-search-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-telegram-channel-search-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapersdelight~telegram-channel-search-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-telegram-channel-search-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapersdelight~telegram-channel-search-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-telegram-channel-search-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "One keyword or phrase per line. For each one the Actor discovers public channels whose title/description/handle matches, then runs Telegram's own in-channel post search on every channel it found, newest posts first. A multi-word phrase is matched by Telegram as a phrase. Leave empty and fill \"Channels\" to pull the latest posts from channels you already know.",
            "items": {
              "type": "string"
            }
          },
          "channels": {
            "title": "Channels (optional)",
            "type": "array",
            "description": "Public channel handles or t.me links, one per line (e.g. \"telegram\", \"@durov\", \"https://t.me/s/bloomberg\"). With keywords: index discovery is skipped and the keywords are searched inside these channels — plus any channel added by \"Also search channels found via 'Forwarded from'\", so turn that off if you want ONLY the channels you listed. Without keywords: the newest posts from each channel are returned, up to \"Posts per channel (feed mode)\". Private channels and groups have no public preview and are skipped, never billed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "afterDate": {
            "title": "Only posts after",
            "type": "string",
            "description": "Drop posts older than this. Accepts YYYY-MM-DD, a full ISO timestamp, or a relative window like \"7 days\", \"24 hours\", \"2 weeks\". Pagination stops as soon as a channel's matches get older than this, so a tight window is also a faster, cheaper run — the monitor setting.",
            "default": ""
          },
          "beforeDate": {
            "title": "Only posts before",
            "type": "string",
            "description": "Drop posts newer than this. YYYY-MM-DD (inclusive of that day) or an ISO timestamp. Combine with \"Only posts after\" to cut a window.",
            "default": ""
          },
          "maxResultsPerKeyword": {
            "title": "Max posts per keyword",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on rows for each keyword. 50 = $0.10, 500 = $1.00. The run stops searching further channels for that keyword once it is reached.",
            "default": 50
          },
          "maxChannelsPerKeyword": {
            "title": "Max channels searched per keyword",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many discovered channels to open per keyword (in the order the search index ranks them, plus channels found via \"Forwarded from\" when that option is on). Channels with no public preview count toward this but cost nothing. 10 is a quick sample; 50–100 is a real sweep.",
            "default": 10
          },
          "maxPostsPerChannel": {
            "title": "Max matching posts per channel",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Newest-first cap per channel for keyword searches. Pagination stops at 50 preview pages, so about 1,000 posts per channel per run is the most this can deliver whatever you set. Telegram returns 20 matches per page; anything above 20 pages further back with \"before=\". Keep it small to spread a keyword across many channels, large to go deep into a few.",
            "default": 5
          },
          "channelMaxMessages": {
            "title": "Posts per channel (feed mode)",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Used only when \"Keywords\" is empty and \"Channels\" is set: the newest N posts from each listed channel, no keyword filter. 20 = one preview page per channel.",
            "default": 20
          },
          "maxItems": {
            "title": "Max posts in total (0 = no total cap)",
            "minimum": 0,
            "type": "integer",
            "description": "Overall cost cap across all keywords and channels. 0 leaves the per-keyword cap in charge.",
            "default": 0
          },
          "minSubscribers": {
            "title": "Minimum channel subscribers",
            "minimum": 0,
            "type": "integer",
            "description": "Skip posts from channels below this subscriber count (read live from the channel's preview header). 1000 removes the long tail of dead and spam channels the search index is full of.",
            "default": 0
          },
          "expandViaForwards": {
            "title": "Also search channels found via \"Forwarded from\"",
            "type": "boolean",
            "description": "When a matching post was forwarded from another public channel, that channel is queued and searched too (inside \"Max channels searched per keyword\"). This is how currently-active channels that no index has catalogued yet get into your results. Rows from them carry discoveredVia: \"forwarded-from\".",
            "default": true
          },
          "matchInChannelMeta": {
            "title": "Require the keyword in the channel title or description too",
            "type": "boolean",
            "description": "Off (default): any public channel the index associates with the keyword is searched, and the keyword only has to appear in the POST. On: the channel's own title or description must also contain the keyword — a stricter \"channels about X\" pull.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel channel fetches. 5 measured clean through Apify proxies; 10 is the ceiling.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy is on by default with no group pinned (Apify's automatic pool). Both t.me and the discovery index answered over Apify Proxy in our 2026-08-22 test run; switch to RESIDENTIAL if you see HTTP errors in the log.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}