# Turkish SMS and Email Marketing Message Checker (Ticari Ileti) (`cexxz34/tr-ticari-ileti-kontrol`) Actor

Checks Turkish SMS and email marketing messages against the content rules in Articles 5, 7 and 8 of Law 6563: sender identity, opt-out, contact details, promotion conditions. Turkish report, no AI.

- **URL**: https://apify.com/cexxz34/tr-ticari-ileti-kontrol.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 $1.00 / 1,000 message checkeds

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

## Ticari İleti Kontrolü (SMS ve E-posta Pazarlama Metinleri)

SMS veya e-posta ile müşterilerinize gönderdiğiniz pazarlama metinlerini yapıştırın. Actor, ileti içeriğinde 6563 sayılı Elektronik Ticaretin Düzenlenmesi Hakkında Kanun'un 5., 7. ve 8. maddelerinin aradığı unsurların geçip geçmediğini Türkçe raporlar.

Yapay zekâ kullanmaz. Aynı metin her zaman aynı sonucu verir. Metinleriniz başka bir servise gönderilmez.

### Ne kontrol eder?

| Kontrol | Dayanak (6563 sayılı Kanun) |
|---|---|
| Gönderen kimliği iletide görünüyor mu | md. 5/1-a, md. 7/2 |
| Mesajı reddetme (ret) bilgisi ve ücretsiz ret yolu var mı | md. 8/2 |
| Erişilebilir iletişim bilgisi (telefon, kısa mesaj numarası, bağlantı, e-posta) var mı | md. 7/2 |
| Promosyon ve indirim içeriyorsa koşullara ulaşım belirtilmiş mi | md. 5/1-b |

### Ne kontrol etmez?

- **Alıcıdan önceden onay alınıp alınmadığını** (md. 6). Bu, ileti metninden anlaşılamaz. Esnaf ve tacirlere gönderimde onay istisnası vardır (md. 6/2); durumunuzu hukuk danışmanınızla doğrulayın.
- İYS gibi kayıt ve bildirim yükümlülüklerini. İlgili yönetmeliğe göre ayrıca kontrol edin.
- Metnin doğruluğunu veya yasal uygunluğunu.

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

1. "İletiler" listesine her öğe bir ileti olacak şekilde yazın veya "Yapıştırılmış iletiler" kutusuna, iletileri boş satırla ayırarak yapıştırın.
2. İsterseniz firma veya marka adınızı "Gönderen adı" alanına yazın. Bu durumda ad her iletide aranır.
3. Start'a basın. Sonuç Dataset sekmesinde, özet `SUMMARY` ve Türkçe rapor `REPORT` kaydındadır.

### Girdi

| Alan | Açıklama |
|---|---|
| `messages` | İleti listesi, her öğe bir ileti |
| `messagesText` | Boş satırla ayrılmış ileti blokları |
| `senderName` | Firma veya marka adı. Doluysa kimlik kontrolü bu adla yapılır |
| `channel` | `auto`, `sms` veya `email`. Bilgi amaçlıdır |

### Örnek rapor

Aşağıdaki rapor, actor'ün yerel testinden alınmıştır.

```
İleti 2: Puan 0/100 (promosyon içeriyor)
Eksik görünenler:
1. Gönderen adı ("Örnek") iletide bulunamadı. (6563 md. 5/1-a, 7/2)
2. Mesajı reddetme (ret) bilgisi iletide bulunamadı. (6563 md. 8/2)
3. Telefon, kısa mesaj numarası, bağlantı veya e-posta adresi bulunamadı. (6563 md. 7/2)
4. Promosyon/indirim içeriyor ancak koşullara ulaşım (şart, tarih, bağlantı) bulunamadı. (6563 md. 5/1-b)
```

### Fiyat

Kullandıkça öde (pay-per-event). Kontrol edilen her ileti bir `message-checked` olayıdır.

### Sınırlar

- Anahtar kelime eşleştirmesidir. Bir unsurun iletide geçmesi, içeriğin yeterli veya mevzuata uygun olduğu anlamına gelmez.
- İletişim bilgisi kontrolü, dört veya daha fazla haneli herhangi bir sayıyı numara olarak kabul edebilir.
- Yalnız Türkçe iletiler için tasarlandı.
- Puan hukuki uygunluk puanı değildir.
- Hukuki görüş değildir. Kesin uyum için hukuk danışmanından görüş alın.

### Kişisel veri

- İleti metinleri yalnız bu çalıştırmanın içinde işlenir ve başka bir servise gönderilmez.
- Çıktıda ileti metni saklanmaz; yalnız karakter sayısı, kontrol sonuçları ve rapor yer alır.
- İletilere alıcı adı veya telefon numarası koymayın; örnek metin kullanın.

***

## Turkish Commercial Message Checker (SMS and Email Marketing)

Paste your SMS or email marketing texts. The actor reports in Turkish whether each message contains the elements that Articles 5, 7 and 8 of Turkish Law No. 6563 on electronic commerce look for.

No AI is used. The same text always gives the same result. Texts are not sent to any other service.

### What it checks

- Sender identity appears in the message (Art. 5/1-a, 7/2).
- Opt-out wording and a free route to refuse (Art. 8/2).
- Reachable contact details: phone, short code, link or email (Art. 7/2).
- For promotions: conditions are reachable (Art. 5/1-b).

### What it does not check

- Whether the recipient gave **prior consent** (Art. 6). This cannot be seen from the message text. There is an exemption for messages to tradespeople and merchants (Art. 6/2); confirm your situation with a lawyer.
- Registration obligations such as the national message management system. Check the relevant regulation separately.
- Whether the text is accurate or lawful.

### Input

| Field | Description |
|---|---|
| `messages` | List of messages, one per entry |
| `messagesText` | Messages separated by a blank line |
| `senderName` | Your company or brand. If set, identity is checked against this name |
| `channel` | `auto`, `sms` or `email`. Informational |

### Output

- Dataset: one item per message with `score`, `checks` and `reportTr`. The message text itself is not stored.
- Key-value store: `SUMMARY` (JSON counts) and `REPORT` (Turkish text).

### Pricing

Pay per event. Each checked message is one `message-checked` event.

### Limitations

- Keyword matching only. An element being present does not mean the content is sufficient or lawful.
- The contact check can accept any number with four or more digits as a contact number.
- Turkish messages only.
- The score is not a legal compliance score. Not legal advice.

# Actor input Schema

## `messages` (type: `array`):

Her öğe bir SMS veya e-posta metni. / One SMS or email text per entry.

## `messagesText` (type: `string`):

İletileri boş satırla ayırarak yapıştırın. / Paste messages separated by a blank line.

## `senderName` (type: `string`):

Firma adınız veya markanız. Doluysa iletide aranır. / Your company or brand. If set, it is searched in each message.

## `channel` (type: `string`):

Bilgi amaçlıdır. / Informational.

## Actor input object example

```json
{
  "messages": [
    "Örnek Giyim A.Ş.: Hafta sonu %30 indirim! Koşullar için ornekgiyim.com/kampanya. İzin vermek istemiyorsanız RET yazıp 4567'ye gönderin.",
    "Kaçırmayın! Tüm ürünlerde büyük indirim bizi bekliyor."
  ],
  "channel": "auto"
}
```

# Actor output Schema

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

Dataset with one item per message.

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

Key-value store with SUMMARY (JSON) and REPORT (Turkish text).

# 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 = {
    "messages": [
        "Örnek Giyim A.Ş.: Hafta sonu %30 indirim! Koşullar için ornekgiyim.com/kampanya. İzin vermek istemiyorsanız RET yazıp 4567'ye gönderin.",
        "Kaçırmayın! Tüm ürünlerde büyük indirim bizi bekliyor."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cexxz34/tr-ticari-ileti-kontrol").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 = { "messages": [
        "Örnek Giyim A.Ş.: Hafta sonu %30 indirim! Koşullar için ornekgiyim.com/kampanya. İzin vermek istemiyorsanız RET yazıp 4567'ye gönderin.",
        "Kaçırmayın! Tüm ürünlerde büyük indirim bizi bekliyor.",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cexxz34/tr-ticari-ileti-kontrol").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 '{
  "messages": [
    "Örnek Giyim A.Ş.: Hafta sonu %30 indirim! Koşullar için ornekgiyim.com/kampanya. İzin vermek istemiyorsanız RET yazıp 4567'\''ye gönderin.",
    "Kaçırmayın! Tüm ürünlerde büyük indirim bizi bekliyor."
  ]
}' |
apify call cexxz34/tr-ticari-ileti-kontrol --silent --output-dataset

```

## MCP server setup

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

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/r2zRXYgKioTJbh9qn/builds/ybM9pFA0dKylitcgG/openapi.json
