# Turkish Small Business Website Audit (SEO + KVKK + Contact) (`cexxz34/tr-site-audit`) Actor

Audits a Turkish small-business website: basic SEO, KVKK notice and cookie banner signals, WhatsApp/phone/Google Maps contact signals and page weight. Returns JSON plus a short Turkish report.

- **URL**: https://apify.com/cexxz34/tr-site-audit.md
- **Developed by:** [Arda Cem](https://apify.com/cexxz34) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 site audits

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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ürk KOBİ Web Sitesi Denetimi (SEO + KVKK + İletişim)

Türkçe | [English](#english)

Küçük işletme sitenizi tek tıkla kontrol eder. Sonuç hem JSON hem de kısa bir Türkçe rapordur.

### Ne kontrol eder?

**SEO**

- Sayfa başlığı (title) ve uzunluğu
- Meta açıklama (description) ve uzunluğu
- H1 başlığı sayısı
- Canonical etiketi, hreflang etiketleri, `html lang`
- Görsellerde alt metin eksikleri
- Mobil uyum etiketi (viewport)
- HTTPS kullanımı
- noindex durumu, yapılandırılmış veri (JSON-LD), robots.txt, sitemap

**KVKK sinyalleri**

- KVKK / aydınlatma metni linki
- Gizlilik politikası sayfası linki
- Çerez onay bandı (bilinen çerez araçları ve çerez bandı işaretleri)

**İletişim**

- WhatsApp linki (wa.me, api.whatsapp.com)
- Telefon numarası ve tıkla-ara (`tel:`) linki
- Google Haritalar gömme veya linki

**Performans**

- HTML yanıt süresi ve boyutu
- İstek sayısı (script, stil, görsel, iframe vb.)
- Bilinen toplam sayfa ağırlığı (HEAD istekleri ile)
- Kırık kaynaklar

### Nasıl kullanılır?

1. `urls` alanına bir veya birden çok adres yazın. `https://` yazmazsanız eklenir.
2. Çalıştırın.
3. Sonuçları **Dataset** sekmesinde görün. Türkçe rapor **Key-value store > REPORT** kaydındadır.

### Girdi

| Alan | Açıklama | Varsayılan |
|---|---|---|
| `urls` | Denetlenecek adresler | zorunlu |
| `measureResources` | Kaynak boyutlarını ölç | `true` |
| `maxResourceChecks` | En fazla kaç kaynak ölçülsün (0-150) | `40` |
| `timeoutSecs` | İstek zaman aşımı, saniye (5-60) | `20` |

### Örnek rapor

Aşağıdaki örnek, eksikleri bilerek bırakılmış bir test sayfasının kısaltılmış raporudur:

```
Site denetimi: https://ornek.com.tr/
Puan: 25/100

Düzeltilmesi gerekenler (önem sırasına göre):
1. Mobil viewport etiketi yok. Telefonda bozuk görünebilir.
2. Başlık 9 karakter. İdeal: 10-65.
3. Meta açıklama yok. Google kendi metnini seçer.
4. KVKK aydınlatma metni linki bulunamadı.
5. 2 adet H1 var. Bir tane olmalı.
...
8. WhatsApp linki yok. Esnaf için en hızlı iletişim kanalı.
...

İyi olanlar:
- Site HTTPS ile açılıyor.
- Sayfa indekslenebilir.
...

Not: Bu otomatik bir ön kontroldür, hukuki görüş değildir. KVKK uyumu için uzman görüşü alın.
```

### Örnek JSON (kısaltılmış)

```json
{
  "finalUrl": "https://www.ornek.com.tr/",
  "https": true,
  "score": 63,
  "seo": { "title": "...", "h1Count": 1, "hasMobileViewport": true, "imagesMissingAltCount": 7 },
  "kvkk": { "hasKvkkLink": false, "kvkkTextOnPage": true, "hasPrivacyPage": true, "hasCookieBanner": true },
  "contact": { "hasWhatsapp": false, "hasPhone": true, "hasClickToCall": true, "hasMapsEmbed": false },
  "performance": { "requestCount": 22, "totalBytesKnown": 165888, "htmlResponseMs": 552 },
  "checks": [ { "id": "https", "category": "seo", "ok": true, "messageTr": "...", "messageEn": "..." } ],
  "reportTr": "..."
}
```

### Fiyat

Kullandıkça öde (pay-per-event). Her başarılı site denetimi bir `site-audit` olayıdır. Açılmayan veya HTML olmayan sayfalar ücretlendirilmez.

### Sınırlar

- Tarayıcı açmaz. Sadece sunucunun gönderdiği HTML okunur.
- JavaScript ile sonradan yüklenen çerez bandı, WhatsApp butonu veya istekler görünmeyebilir.
- Sayfa ağırlığı, sunucunun bildirdiği boyutlara göredir. Boyut bildirmeyen kaynaklar toplamda yoktur.
- Yalnızca girilen sayfa denetlenir. Site tamamen taranmaz.
- Bu bir ön kontroldür, hukuki görüş değildir. KVKK uyumu için uzmana danışın.

### Kişisel veri

Actor sadece herkese açık sayfayı okur. Sayfadaki e-posta ve telefonlar sonuçta görünebilir. Bu veriyi KVKK'ya uygun saklayın ve gereksiz yere paylaşmayın.

***

<a id="english"></a>

## Turkish Small Business Website Audit (SEO + KVKK + Contact)

Checks a Turkish small-business website in one run. It returns JSON and a short Turkish report.

### What it checks

- **SEO:** title, meta description, H1 count, canonical, hreflang, `html lang`, image alt text, mobile viewport, HTTPS, noindex, JSON-LD, robots.txt, sitemap.
- **KVKK signals:** KVKK / privacy notice (aydınlatma metni) link, privacy policy link, cookie consent banner (known consent tools and banner markers).
- **Contact:** WhatsApp link, phone number and `tel:` link, Google Maps embed or link.
- **Performance:** HTML response time and size, request count, known total page weight (via HEAD requests), broken resources.

### How to use

1. Put one or more addresses in `urls`. `https://` is added if missing.
2. Run the actor.
3. Results are in the **Dataset** tab. The Turkish report is in **Key-value store > REPORT**.

### Input

| Field | Description | Default |
|---|---|---|
| `urls` | Addresses to audit | required |
| `measureResources` | Measure resource sizes | `true` |
| `maxResourceChecks` | Max resources to measure (0-150) | `40` |
| `timeoutSecs` | Request timeout in seconds (5-60) | `20` |

### Output

One dataset item per URL with `seo`, `kvkk`, `contact`, `performance`, `score` (0-100), `checks` (each with Turkish and English messages) and `reportTr`. See the Turkish section above for an example.

### Pricing

Pay-per-event. Each successful site audit is one `site-audit` event. Pages that fail to load or are not HTML are not charged.

### Limitations

- No headless browser. Only the HTML sent by the server is read.
- Cookie banners, WhatsApp buttons or requests added later by JavaScript may be missed.
- Page weight uses sizes reported by the server. Resources without a reported size are not counted.
- Only the given page is audited. The site is not crawled.
- This is an automated pre-check, not legal advice. Consult an expert for KVKK compliance.

### Personal data

The actor reads public pages only. Emails and phone numbers on the page may appear in the output. Store this data in line with KVKK/GDPR.

# Actor input Schema

## `urls` (type: `array`):

Denetlenecek sitelerin adresleri. Her satıra bir adres. / One URL per line. Only the given page is audited (usually the home page).

## `measureResources` (type: `boolean`):

Görsel, CSS ve JS dosyalarının boyutunu HEAD isteğiyle ölçer. / Sends HEAD requests to sub-resources to estimate page weight.

## `maxResourceChecks` (type: `integer`):

Site başına en fazla kaç dosya ölçülsün. / Upper limit of sub-resources measured per site.

## `timeoutSecs` (type: `integer`):

Her istek için bekleme süresi. / Per-request timeout.

## Actor input object example

```json
{
  "urls": [
    "https://example.com"
  ],
  "measureResources": true,
  "maxResourceChecks": 40,
  "timeoutSecs": 20
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset with one audit item per site.

## `files` (type: `string`):

Key-value store with the Turkish text report (REPORT).

# 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 = {
    "urls": [
        "https://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cexxz34/tr-site-audit").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 = { "urls": ["https://example.com"] }

# Run the Actor and wait for it to finish
run = client.actor("cexxz34/tr-site-audit").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 '{
  "urls": [
    "https://example.com"
  ]
}' |
apify call cexxz34/tr-site-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cexxz34/tr-site-audit"
        }
    }
}
```

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/eb1sWVv6osoLanMaj/builds/5UvcLKR24DdOx04Qn/openapi.json
