# Türkiye Klinik & Estetik Leads | Turkey Clinic & Aesthetic (`berkify/turkey-clinic-leads`) Actor

Türkiye'deki estetik merkezi, diş kliniği ve saç ekimi merkezleri: telefon, WhatsApp, e-posta, Google puanı, sorumlu hekim, kuruluş yılı, hizmetler. | Turkey clinic & aesthetic center leads: phone, WhatsApp, email, Google rating, lead doctor, founding year, services.

- **URL**: https://apify.com/berkify/turkey-clinic-leads.md
- **Developed by:** [Berkay Çınar](https://apify.com/berkify) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 klinik kaydı / clinic results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Türkiye Klinik & Estetik Merkezi Veri Seti | Turkey Clinic & Aesthetic Center Leads

🇹🇷 [Türkçe](#türkçe) · 🇬🇧 [English](#english)

***

### Türkçe

#### Ne yapar?

Türkiye'deki **estetik / medikal estetik merkezleri, diş klinikleri, saç ekimi merkezleri ve poliklinikleri** bulur; her biri için Google Haritalar verisini (ad, adres, telefon, puan, yorum sayısı, kategori, konum) alır ve **web sitesini tarayarak** şu alanları ekler:

- Kurumsal e-posta, diğer e-postalar, WhatsApp numarası, Instagram, şirket LinkedIn
- **Sorumlu hekim** (ad + unvan + uzmanlık) ve hekim listesi
- **Kuruluş yılı** (kanıt cümlesiyle) ve domain kayıt tarihi
- Hizmetler (botoks, implant, saç ekimi, burun estetiği …), **sağlık turizmi** bayrağı ve site dilleri
- Site durumu: `ok`, `parked` (satılık/park edilmiş alan adı), `unreachable`, `no_website`, `robots_blocked`
- İl / ilçe, E.164 telefon ve `phoneIsMobile` (mobil hat mı)

#### Kimin için?

- Klinik pazarına satış yapan ajanslar, yazılım ve medikal ürün firmaları (B2B lead listesi)
- Sağlık turizmi aracıları ve partner arayan klinikler
- Pazar araştırması: hangi ilçede kaç klinik, puanları, hangi hizmetleri veriyor

#### İki mod

| Mod | Girdi | Ne olur |
|---|---|---|
| `search` | `queries` × `locations` (ör. "diş kliniği" × "Kadıköy, İstanbul") | Google Haritalar'da arar, sonra siteleri tarar |
| `enrich` | `datasetId` (Google Maps Scraper çıktısı) ve/veya `websites` listesi | Mevcut listenizi web sitesi verisiyle zenginleştirir |

#### Girdi örneği

```json
{
  "mode": "search",
  "queries": ["estetik merkezi", "diş kliniği", "saç ekimi"],
  "locations": ["Şişli, İstanbul", "Çankaya, Ankara", "Karşıyaka, İzmir"],
  "maxItems": 200,
  "maxPlacesPerSearch": 60,
  "scrapeWebsites": true,
  "includePersonalData": true
}
```

#### Çıktı örneği (gerçek çalıştırmadan, 2026-10-18)

```json
{
  "clinicName": "Dentakay Dental Clinic",
  "facilityType": "diş kliniği",
  "categories": "Diş Kliniği, Diş Hekimi",
  "address": "Esentepe, 23 Temmuz Sk. No:9, 34394 Şişli/İstanbul, Türkiye",
  "district": "Şişli",
  "city": "İstanbul",
  "phone": "+905415008008",
  "phoneIsMobile": true,
  "whatsapp": "+905415008008",
  "email": "dentakay@dentakay.com",
  "emailsOther": "etik@dentakay.com, info@dentakay.com",
  "website": "https://dentakay.com/",
  "siteStatus": "ok",
  "googleRating": 4.9,
  "googleReviewCount": 5781,
  "leadDoctorName": "Gülay Akay",
  "leadDoctorTitle": "Dr.",
  "leadDoctorSpecialty": "Diş Hekimliği",
  "doctors": [{ "name": "Gülay Akay", "title": "Dr.", "specialty": "Diş Hekimliği" }, { "name": "Ahmet Özdemir", "title": "Dr.", "specialty": "Diş Hekimliği" }],
  "foundingYear": 2009,
  "foundingEvidence": "schema.org foundingDate",
  "domainCreatedAt": "2019-01-16",
  "services": "İmplant, Zirkonyum / Porselen, Laminate Veneer, Diş Beyazlatma, Gülüş Tasarımı, Kanal Tedavisi",
  "isHealthTourism": true,
  "languages": "en, tr, de, es, ar, fr",
  "instagram": "https://www.instagram.com/dentakay",
  "leadDoctorLinkedin": null,
  "linkedinCompany": "https://www.linkedin.com/company/dentakay",
  "googleMapsUrl": "https://www.google.com/maps?cid=15059591040121922829",
  "lat": 41.0703442,
  "lng": 29.0063008,
  "searchQuery": "diş kliniği Şişli, İstanbul",
  "scrapedAt": "2026-10-18T16:38:15.810Z"
}
```

Liste alanları (`categories`, `services`, `languages`, `emailsOther`, `whatsapp`, `instagram`) tabloda okunur olsun diye virgülle birleştirilmiş metindir. `doctors` JSON'da yapısal dizi olarak kalır. Bulunamayan alan `null` döner; kayıt asla düşürülmez.

#### Ne kadar dolu? (yerel yük testi: 3 sorgu × 3 il, 158 kayıt)

| Alan | Tüm kayıtlar | Sitesi açılanlar |
|---|---|---|
| Ad, adres, il/ilçe, Google linki | %100 | %100 |
| Telefon | %97 | %100 |
| Google puanı / yorum | %98 | %100 |
| E-posta (herhangi) | %57 | %90 |
| WhatsApp | %44 | %69 |
| Instagram | %58 | %86 |
| Sorumlu hekim | %35 | %56 |
| Hizmetler | %60 | %95 |
| Kuruluş yılı | %14 | %22 |

#### Fiyat

Kullandıkça öde (pay per event): **klinik başına $0,003 → 1.000 klinik = $3**. Çalıştırma başlangıcı Apify'ın standart başlangıç ücretidir (≈ $0,00005). Platform (compute + Google proxy) maliyeti fiyata dahildir; ayrıca ödemezsiniz. Ücretsiz planda çalıştırma başına ilk 10 kayıt. **Apify Bronze / Silver / Gold** aboneleri klinik başına ücrette **%10 / %20 / %30 indirimli** öder.
Hiçbir bilgisi olmayan kayıt (Google verisi yok ve site açılmadı, ör. geçersiz URL) yazılır ama **ücretlendirilmez**.

#### SSS

**Google Maps Scraper'ım zaten var, neden bu?** `enrich` modu tam bunun için: Maps veri setinizin ID'sini verin; e-posta, hekim, kuruluş yılı ve hizmetleri biz ekleriz.
**Bazı aramalar neden 0 dönüyor?** Google bazı "sorgu + ilçe" kombinasyonlarında liste döndürmüyor (ör. "estetik merkezi Ataşehir"). Actor bu durumda aramayı otomatik olarak ", Türkiye" ekleyerek tekrarlar. Konumu "İlçe, İl" biçiminde yazmanız önerilir.
**E-postası olmayan klinikler?** Sitesi olmayan ya da yalnız iletişim formu kullanan klinikler için telefon/WhatsApp/Instagram döner.
**`parked` ne demek?** Alan adı satılık, süresi dolmuş ya da başka bir içerikle (ör. spam) değiştirilmiş; klinik sitesi değil.
**Hangi proxy?** Proxy yalnız Google Maps istekleri içindir (varsayılan Apify datacenter; Google engellerse Residential seçin). Klinik siteleri varsayılan olarak doğrudan çekilir: testlerimizde daha çok site açıldı ve proxy kaynaklı 502 hataları kalktı. Gerekirse `proxyForWebsites` ile sitelerde de proxy kullanabilirsiniz.

#### Sınırlar

- Sorumlu hekim ve kuruluş yılı sitede **yazılıysa** bulunur; tahmin yapılmaz. Kuruluş yılında yeniden adlandırma/taşınma yılları nadiren karışabilir; her zaman `foundingEvidence` ile kontrol edin.
- `domainCreatedAt` alan adının **son** kayıt tarihidir; yeniden kaydedilmiş alan adlarında klinikten genç görünebilir. `.com.tr` için TRABIS whois (TCP 43) kullanılır; Apify platformunda erişilebilir (2026-10-18 probe), erişilemezse `null`.
- JavaScript ile çizilen (SPA) sitelerde içerik bulunamayabilir (tarayıcı kullanılmaz).
- Google arama başına 20'lik sayfalar halinde en fazla `maxPlacesPerSearch` yer verir. Birden çok sorgu × konumda `maxItems` önce eşit paylaştırılır (her kombinasyona ⌈maxItems / kombinasyon⌉), artan kontenjan sonra sırayla dağıtılır.
- **Arama varyantları:** Google'ın sonuç sayısı yazıma çok bağlıdır ("estetik merkezi Bornova, İzmir" 8 sonuç, "estetik merkezi Bornova İzmir" 69). Her sorgu × konum için sırayla "İlçe, İl" → "İlçe İl" → "ilçe" → "İl İlçe" denenir ve sonuçlar birleştirilir. Google'ın başka ilçeden getirdiği yerler `strictLocation: true` (varsayılan) ile atılır ve ücretlendirilmez; kapatırsanız tutulur ve `locationMatch: false` olarak işaretlenir. Adresi olmayan yerlerde `locationMatch` null kalır ve kayıt tutulur.
- Her site için en fazla 25 sn harcanır (robots.txt + ana sayfa + iç sayfalar); yavaş siteler elde olan veriyle ya da `unreachable` olarak yazılır.
- Klinik sitelerinin `robots.txt` kurallarına uyulur: engelleyen siteler `robots_blocked` olarak döner.

#### ⚖️ Yasal uyarı (KVKK / GDPR)

Klinik iletişim bilgileri kurumsaldır. **Hekim adı, unvanı, uzmanlığı ve LinkedIn bağlantısı kişisel veridir.** Bu verileri yalnız meşru bir amaç ve hukuki dayanakla (ör. meşru menfaat, B2B iletişim) işleyin; ilgili kişilerin itiraz/silme haklarına uyun ve istenmeyen ticari ileti mevzuatına (İYS, 6563 sayılı Kanun) dikkat edin. Bu alanları istemiyorsanız `includePersonalData: false` ile kapatın; hepsi `null` döner. Kullanımdan doğan sorumluluk kullanıcıya aittir. Bu actor Google veya listelenen kliniklerle bağlantılı değildir; yalnız herkese açık bilgileri toplar.

***

### English

#### What does it do?

Finds **aesthetic / medical aesthetic centers, dental clinics, hair transplant centers and polyclinics in Turkey**, collects Google Maps data (name, address, phone, rating, review count, categories, location) and **crawls each clinic's website** to add:

- Company email, other emails, WhatsApp number, Instagram, company LinkedIn
- **Lead doctor** (name + title + specialty) and the list of doctors
- **Founding year** (with the evidence sentence) and domain registration date
- Services (botox, implants, hair transplant, rhinoplasty …), **health tourism** flag and site languages
- Site status: `ok`, `parked` (for-sale / expired domain), `unreachable`, `no_website`, `robots_blocked`
- Province / district, E.164 phone and `phoneIsMobile`

#### Who is it for?

- Agencies, software and medical-supply companies selling to clinics (B2B leads)
- Health-tourism facilitators looking for partner clinics
- Market research: clinic density, ratings and services per district

#### Two modes

| Mode | Input | What happens |
|---|---|---|
| `search` | `queries` × `locations` (e.g. "diş kliniği" × "Kadıköy, İstanbul") | Searches Google Maps, then crawls the websites |
| `enrich` | `datasetId` (Google Maps Scraper output) and/or a `websites` list | Enriches your existing list with website data |

Search terms work best in Turkish ("estetik merkezi", "diş kliniği", "saç ekimi"). See the Turkish section above for a full input and a real output example. Field names are English camelCase, and column labels are bilingual.

#### Pricing

Pay per event: **$0.003 per clinic → 1,000 clinics = $3**. Each run also has Apify's standard start fee (≈ $0.00005). Platform usage (compute + Google proxy) is included; you pay nothing extra. Free plan: first 10 results per run. Empty records (no Google data and the site did not load, e.g. an invalid URL) are written but **not charged**. **Apify Bronze / Silver / Gold** subscribers get **10% / 20% / 30% off** the per-clinic fee.

#### FAQ

**I already use Google Maps Scraper.** Use `enrich` mode with your dataset ID; we add emails, doctors, founding year and services.
**Why do some searches return 0?** For some "term + district" combinations Google returns no list. The Actor retries automatically with ", Türkiye" appended. Write locations as "District, Province".
**What does `parked` mean?** The domain is for sale, expired or now hosts unrelated content.

**Which proxy?** The proxy is used for Google Maps requests only (default Apify datacenter; choose Residential if Google blocks). Clinic websites are fetched directly by default: in our tests more sites loaded and proxy-related 502 errors disappeared. Turn on `proxyForWebsites` to route websites through the proxy too.

#### Limits

- Lead doctor and founding year are only returned when **stated on the website**; nothing is guessed. Always check `foundingEvidence`.
- `domainCreatedAt` is the **latest** registration date. Re-registered domains look younger than the clinic. `.com.tr` uses TRABIS whois (TCP 43), which is reachable on the Apify platform (probe 2026-10-18); `null` if unreachable.
- JavaScript-only (SPA) sites may yield little data, because no browser is used.
- **Search variants:** Google coverage depends heavily on spelling, so each query × location tries "District, Province" → "District Province" → "district" → "Province District" and merges the results. Places from other districts are dropped and not charged with `strictLocation: true` (default), or kept and flagged `locationMatch: false` when it is off.
- Clinic websites' `robots.txt` is respected.

#### ⚖️ Legal notice (GDPR / KVKK)

Clinic contact details are business data. **Doctor names, titles, specialties and LinkedIn links are personal data.** Process them only with a legitimate purpose and legal basis. Respect data-subject rights and anti-spam rules (Turkish law no. 6563 / İYS, ePrivacy). Set `includePersonalData: false` to return all of these fields as `null`. You are responsible for how you use the data.
This Actor is not affiliated with Google or the listed clinics; it only collects publicly available information.

# Actor input Schema

## `mode` (type: `string`):

search: Google Haritalar'da sorgu × konum araması yapar. enrich: verdiğiniz Google Maps veri setini (compass/crawler-google-places) ya da web sitesi listesini zenginleştirir. / search: runs query × location searches on Google Maps. enrich: enriches a Google Maps dataset (compass/crawler-google-places) or a list of websites.

## `queries` (type: `array`):

search modu: aranacak işletme türleri, ör. "estetik merkezi", "diş kliniği", "saç ekimi". Her sorgu her konumla birleştirilir. / search mode: business types to search, e.g. "aesthetic center" in Turkish. Each term is combined with each location.

## `locations` (type: `array`):

search modu: "İlçe, İl" biçiminde konumlar, ör. "Kadıköy, İstanbul". Boş bırakılırsa sorgu tek başına aranır. / search mode: locations as "District, Province", e.g. "Kadıköy, İstanbul". If empty, terms are searched as-is.

## `datasetId` (type: `string`):

enrich modu: compass/crawler-google-places (Google Maps Scraper) çalıştırmasının dataset ID'si. Ad, adres, telefon, puan, web sitesi oradan alınır. / enrich mode: dataset ID of a compass/crawler-google-places run. Name, address, phone, rating and website are taken from it.

## `websites` (type: `array`):

enrich modu: doğrudan taranacak klinik web siteleri (Google verisi olmadan). / enrich mode: clinic websites to crawl directly (without Google data).

## `maxItems` (type: `integer`):

Toplam yazılacak en fazla kayıt (ücretlendirilen sonuç sayısı). / Maximum number of results written (and charged) in total.

## `maxPlacesPerSearch` (type: `integer`):

Her sorgu × konum için birkaç yazım varyantı denenir ("İlçe, İl", "İlçe İl", "ilçe", "İl İlçe"); bu sınır HER VARYANT için Google'dan alınacak en fazla yerdir (20'lik sayfalar). Toplam alınan kayıt yine maxItems ve kombinasyon kotasıyla sınırlıdır. / Several spelling variants are tried for each query × location; this caps places fetched from Google PER VARIANT (pages of 20). Total results are still limited by maxItems and the per-combination quota.

## `strictLocation` (type: `boolean`):

Açık (önerilen): Google'ın genişleyen aramalarda getirdiği başka ilçe/il kayıtları atılır ve ücretlendirilmez. Kapalı: hepsi alınır, locationMatch alanı true/false ile işaretlenir. / On (recommended): places from other districts/cities that Google returns for broadened searches are dropped and not charged. Off: all are kept and flagged with locationMatch true/false.

## `scrapeWebsites` (type: `boolean`):

Açıksa her yerin web sitesi (ana sayfa + en fazla 4 iletişim/hakkımızda/hekim sayfası) taranır: e-posta, WhatsApp, hekim, kuruluş yılı, hizmetler. Kapalıysa yalnız Google verisi. / If on, each website is crawled (home + up to 4 contact/about/doctor pages) for email, WhatsApp, doctor, founding year, services. If off, Google data only.

## `includePersonalData` (type: `boolean`):

Kapalıysa hekim adı, unvanı, uzmanlığı, hekim listesi ve hekim LinkedIn alanları boş (null) döner. KVKK/GDPR için meşru menfaatiniz yoksa kapatın. / If off, doctor name, title, specialty, doctor list and doctor LinkedIn are returned as null. Turn off unless you have a legitimate interest under KVKK/GDPR.

## `proxyConfiguration` (type: `object`):

Yalnız Google Maps istekleri için. Varsayılan Apify datacenter; Google engellerse Residential seçin. / Used for Google Maps requests only. Defaults to Apify datacenter; choose Residential if Google blocks requests.

## `proxyForWebsites` (type: `boolean`):

Kapalı (önerilen): klinik siteleri doğrudan çekilir, daha hızlı ve proxy 502 hatası olmaz. Açık: yukarıdaki proxy klinik siteleri, robots.txt ve domain sorguları için de kullanılır. / Off (recommended): clinic websites are fetched directly, faster and without proxy 502 errors. On: the proxy above is also used for clinic websites, robots.txt and domain lookups.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "estetik merkezi",
    "diş kliniği",
    "saç ekimi"
  ],
  "locations": [
    "Kadıköy, İstanbul",
    "Çankaya, Ankara",
    "Karşıyaka, İzmir"
  ],
  "websites": [
    "https://www.example-klinik.com.tr"
  ],
  "maxItems": 20,
  "maxPlacesPerSearch": 120,
  "strictLocation": true,
  "scrapeWebsites": true,
  "includePersonalData": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "proxyForWebsites": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `contacts` (type: `string`):

No description

## `runStats` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "queries": [
        "estetik merkezi"
    ],
    "locations": [
        "Kadıköy, İstanbul"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("berkify/turkey-clinic-leads").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "queries": ["estetik merkezi"],
    "locations": ["Kadıköy, İstanbul"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("berkify/turkey-clinic-leads").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "queries": [
    "estetik merkezi"
  ],
  "locations": [
    "Kadıköy, İstanbul"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call berkify/turkey-clinic-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,berkify/turkey-clinic-leads"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/DUyO50TyLu6RL6qsx/builds/k3bew2TniAk58JFN7/openapi.json
