{
  "openapi": "3.0.1",
  "info": {
    "title": "Telegram Phone Number Scraper",
    "description": "Telegram Phone Number Scraper gathers public phone contacts for agencies and B2B teams. Filter groups or channels by topic to streamline prospecting and outbound communication at scale.",
    "version": "0.1",
    "x-build-id": "UwFccHKKl3eQ1qJAZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapier~telegram-phone-number-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapier-telegram-phone-number-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/scrapier~telegram-phone-number-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapier-telegram-phone-number-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/scrapier~telegram-phone-number-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapier-telegram-phone-number-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",
        "required": [
          "keywords",
          "country"
        ],
        "properties": {
          "keywords": {
            "title": "🔍 Keywords, @usernames or t.me URLs",
            "type": "array",
            "description": "🎯 What to scrape. Three kinds of value are accepted and behave differently:\n\n• **A keyword** (`real estate`) — searches Google for public Telegram channels matching it, then reads each channel's live post feed.\n• **A @username** (`@my_channel`) — skips search entirely and scrapes that channel directly.\n• **A t.me URL** (`https://t.me/s/my_channel`, `https://t.me/my_channel/123`) — same as above.\n\n💡 Every keyword gets its own budget of `maxPhoneNumbers` results.\n\n✅ The prefilled `kvartira` + `Uzbekistan` pair is a verified working example — press Start and it returns real numbers. Use keywords in the language your target country's channels actually post in; an English keyword finds few non-English channels.",
            "items": {
              "type": "string"
            },
            "default": [
              "kvartira"
            ]
          },
          "country": {
            "title": "🌍 Country",
            "enum": [
              "Belarus (+375)",
              "Uzbekistan (+998)",
              "Ukraine (+380)",
              "Iran (+98)",
              "Germany (+49)",
              "Israel (+972)",
              "Czech Republic (+420)",
              "Ethiopia (+251)",
              "Poland (+48)",
              "Turkey (+90)",
              "United Arab Emirates (+971)",
              "Italy (+39)",
              "Russia (+7)",
              "United States (+1)",
              "Singapore (+65)",
              "Azerbaijan (+994)",
              "Japan (+81)",
              "Portugal (+351)",
              "Moldova (+373)  ·  limited",
              "Australia (+61)  ·  limited",
              "Tajikistan (+992)  ·  limited",
              "Slovakia (+421)  ·  limited",
              "Malaysia (+60)  ·  limited",
              "Algeria (+213)  ·  limited",
              "Hong Kong (+852)  ·  limited",
              "India (+91)  ·  limited",
              "Sri Lanka (+94)  ·  limited",
              "Sudan (+249)  ·  limited",
              "Armenia (+374)  ·  limited",
              "Ghana (+233)  ·  limited",
              "Iraq (+964)  ·  limited",
              "Kenya (+254)  ·  limited",
              "Kuwait (+965)  ·  limited",
              "Morocco (+212)  ·  limited",
              "Yemen (+967)  ·  limited",
              "Qatar (+974)  ·  limited",
              "Mexico (+52)  ·  limited",
              "Netherlands (+31)  ·  limited",
              "Saudi Arabia (+966)  ·  limited",
              "United Kingdom (+44)  ·  limited",
              "Colombia (+57)  ·  limited",
              "Estonia (+372)  ·  limited",
              "Georgia (+995)  ·  limited",
              "Indonesia (+62)  ·  limited",
              "Ireland (+353)  ·  limited",
              "Jordan (+962)  ·  limited",
              "Serbia (+381)  ·  limited",
              "Thailand (+66)  ·  limited",
              "Vietnam (+84)  ·  limited",
              "Egypt (+20)  ·  limited",
              "France (+33)  ·  limited",
              "Kyrgyzstan (+996)  ·  limited",
              "Latvia (+371)  ·  limited",
              "Norway (+47)  ·  limited",
              "Tunisia (+216)  ·  limited",
              "Venezuela (+58)  ·  limited",
              "Bangladesh (+880)  ·  limited",
              "China (+86)  ·  limited",
              "Ivory Coast (+225)  ·  limited",
              "Nigeria (+234)  ·  limited",
              "Pakistan (+92)  ·  limited",
              "Spain (+34)  ·  limited",
              "Syria (+963)  ·  limited",
              "Afghanistan (+93)  ·  limited",
              "Austria (+43)  ·  limited",
              "Bulgaria (+359)  ·  limited",
              "Cameroon (+237)  ·  limited",
              "Denmark (+45)  ·  limited",
              "Korea, South (+82)  ·  limited",
              "Oman (+968)  ·  limited",
              "Peru (+51)  ·  limited",
              "Senegal (+221)  ·  limited",
              "Sweden (+46)  ·  limited",
              "Tanzania (+255)  ·  limited",
              "Argentina (+54)  ·  limited",
              "Brazil (+55)  ·  limited",
              "Canada (+1)  ·  limited",
              "Finland (+358)  ·  limited",
              "Greece (+30)  ·  limited",
              "Lebanon (+961)  ·  limited",
              "Libya (+218)  ·  limited",
              "Myanmar (+95)  ·  limited",
              "Nepal (+977)  ·  limited",
              "Philippines (+63)  ·  limited",
              "Romania (+40)  ·  limited",
              "South Africa (+27)  ·  limited",
              "Taiwan (+886)  ·  limited",
              "Turkmenistan (+993)  ·  limited",
              "Uganda (+256)  ·  limited"
            ],
            "type": "string",
            "description": "🌎 Which country's phone numbers to collect. This is a hard filter, not a hint: a number is only ever emitted if it is written in full international form in the post **and** its length and prefix are legal under that country's real national numbering plan. Nothing is inferred — a number whose country cannot be established is dropped rather than guessed at.\n\n⚠️ Entries marked `· limited` were measured live and do carry real Telegram phone numbers, just few of them — expect small result counts. Unlisted countries were measured and returned nothing, so they are rejected up front instead of wasting a run.",
            "default": "Uzbekistan (+998)"
          },
          "maxPhoneNumbers": {
            "title": "📊 Maximum phone numbers per keyword",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "🎚️ Hard cap on how many phone numbers are collected for EACH keyword. The run stops opening channels for that keyword the moment the cap is hit. Duplicates are removed across the whole run, so this counts distinct numbers.",
            "default": 10
          },
          "engine": {
            "title": "⚙️ Engine",
            "enum": [
              "deep",
              "fast"
            ],
            "type": "string",
            "description": "🔧 How deeply to scrape.\n\n• **deep** (recommended) — opens every matching channel's real public post feed on t.me and reads the full, untruncated post text plus any `tel:` / WhatsApp links. Far more results and no truncation.\n• **fast** — reads only the Google result snippets. Much quicker and uses no t.me requests, but a snippet is ~160 truncated characters, so it finds a small fraction of the numbers `deep` does.",
            "default": "deep"
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy configuration",
            "type": "object",
            "description": "🌐 Proxy used for the Google discovery step. Google blocks unproxied datacenter traffic outright, so Apify Proxy with the GOOGLE_SERP group is used by default and the connection is rotated automatically on any blocked response. Telegram itself is fetched directly and only falls back to a proxy if that is refused. Advanced users can select other groups or supply custom proxy URLs.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "GOOGLE_SERP"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}