# Turkish Official Gazette (Resmî Gazete) Monitor (`msclabs/resmi-gazete-monitor`) Actor

Get every law, regulation, communiqué and presidential decision published in Turkey's Official Gazette (Resmî Gazete) as structured data, filtered by your keywords with Turkish-aware matching. Schedule it daily for new-regulation alerts by email, Slack or webhook.

- **URL**: https://apify.com/msclabs/resmi-gazete-monitor.md
- **Developed by:** [MSC Labs](https://apify.com/msclabs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.005 / gazette issue read

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

### What does the Turkey Official Gazette (Resmî Gazete) Monitor do?

It gives you every law, regulation, communiqué, presidential decision and
court ruling published in Türkiye's Official Gazette, the Resmî Gazete
([resmigazete.gov.tr](https://www.resmigazete.gov.tr)), as structured
data, filtered by your keywords. Run it once a day and you hear about a
new regulation that affects you the morning it is published, by email,
Slack or webhook.

Try it now: press **Start** with the default input to get every item of
the last two issues, then add your own keywords.

### What can you watch?

Copy a keyword list into **Keywords** and schedule it daily:

| Watch | Keywords |
|---|---|
| Data protection (KVKK) | `kişisel veri`, `KVKK` |
| Tax | `vergi` |
| Customs and trade | `gümrük`, `ithalat`, `ihracat` |
| Energy | `enerji`, `elektrik`, `doğal gaz` |
| Presidential decisions | `cumhurbaşkanı karar` |
| Labour and minimum wage | `asgari ücret`, `sosyal güvenlik` |
| E-commerce | `elektronik ticaret`, `mesafeli`, `tüketici` |

Or name your regulator, your product or a law number. Leave the list
empty to get the whole issue.

A keyword matches any part of a title, so a short stem catches every
form: `kişisel veri` finds both "Kişisel Verileri Koruma Kurulu" and
"kişisel verilerin". It can also catch unrelated words, so check the
first results and narrow the list if needed. Some topics appear only a
few times a month (minimum wage once a year, in December).

### How much does it cost to monitor the Resmî Gazete?

Pay per event: **$0.005 for each gazette issue read** that contains
items, plus a $0.00005 start fee per run. Matching items are free, so a
narrow keyword watch costs the same as reading everything.

- Daily watch (one issue a day): about **$0.15 a month**. Apify's free
  plan includes $5 of usage a month, which covers it many times over.
- One-month look-back (31 issues): about $0.16 per run.
- Extra (mükerrer) issues count as separate issues, and only when you
  turn them on.
- An issue that returns no items (a missing or unreadable page) is not
  charged.

Set a maximum cost per run in the run options for a hard cap; the Actor
stops reading once it is reached.

### How to set up a daily alert

1. Enter your **keywords**, set **Days back** to 1 and press **Start**
   once to check the results.
2. Open **Schedules**, create a schedule for this Actor (or for a saved
   task with your keywords) and run it every day, for example at 09:00
   Europe/Istanbul. The gazette is published at midnight Türkiye time.
3. Open the **Integrations** tab and add where new matches should go:
   - **Email**: "Send results email via Gmail" sends the results after
     each successful run.
   - **Slack**: post a message to a channel when a run finishes.
   - **Webhook**: call your URL on `ACTOR.RUN.SUCCEEDED` and fetch the
     dataset from it.
   - **Zapier, Make or n8n**: start a flow from a finished run.

A day without matches finishes with an empty dataset, so you can filter
those runs out in your flow.

#### Call it from the API

```bash
curl -X POST \
  "https://api.apify.com/v2/actors/msclabs~resmi-gazete-monitor/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["asgari ücret"], "days": 1}'
```

The response is the list of matching items.

### Turkish-aware matching

Keywords ignore case and Turkish accents, and every form of i/İ/ı/I
matches: `asgari ucret` finds `Asgari Ücret`, `kvkk` finds `KVKK`,
`istanbul` finds `İSTANBUL`. A keyword matches anywhere in the title or
the item type (for example `YÖNETMELİKLER`).

### Input

| Field | What it does | Default |
|---|---|---|
| `keywords` | Return only items whose title or type contains any of them. Empty: every item. | empty |
| `days` | How many daily issues to read, counting back from the end date (1–31). | 1 |
| `endDate` | Last day to read, `YYYY-MM-DD`. | today in Türkiye |
| `includeAnnouncements` | Also read the announcements section (court, tender and exchange-rate notices). | off |
| `includeDuplicateIssues` | Also read the extra (mükerrer) issues of the same day. | off |

Example:

```json
{
  "keywords": ["kişisel veri", "KVKK"],
  "days": 1,
  "includeDuplicateIssues": true
}
```

### Output

One row per gazette item:

```json
{
  "date": "2026-10-14",
  "duplicateIssue": false,
  "section": "YÜRÜTME VE İDARE BÖLÜMÜ",
  "type": "YÖNETMELİKLER",
  "title": "Coğrafi Veri İzinleri Yönetmeliği",
  "url": "https://www.resmigazete.gov.tr/eskiler/2026/10/20261014-1.htm",
  "isAnnouncement": false,
  "matchedKeywords": ["yönetmelik"]
}
```

| Field | Meaning |
|---|---|
| `date` | Issue date |
| `duplicateIssue` | True for an extra (mükerrer) issue |
| `section` | Gazette section, for example YÜRÜTME VE İDARE BÖLÜMÜ |
| `type` | Item type, for example YÖNETMELİKLER; empty when the section has none |
| `title` | Title as published, in Turkish |
| `url` | Full text on the official site |
| `isAnnouncement` | True for the announcements section |
| `matchedKeywords` | Your keywords found in the item |

Download the results as JSON, CSV or Excel from the run's dataset.

### Use it with AI agents (MCP)

AI assistants can find and run this Actor through the
[Apify MCP server](https://mcp.apify.com). To give an agent only this
tool, add `https://mcp.apify.com?tools=msclabs/resmi-gazete-monitor` to
your MCP client. The agent passes a keyword list and gets the matching
items back.

### FAQ

#### Is it legal to reuse the gazette?

Officially published laws, presidential decrees, regulations,
communiqués, circulars and court decisions may be freely reproduced and
distributed under Article 31 of Turkey's Law on Intellectual and Artistic
Works (FSEK, No. 5846). The Actor reads only the public daily index pages,
one request per issue with a pause between requests. The announcements
section is off by default because it is not legislation.

#### Does it return the full text?

No. It returns titles, types and the link to the full text on the official
site. It does not download or search full texts.

#### What if the official site is down?

The run fails with a message if no regular issue can be read, and
unreadable issues are not charged.

#### Is this an official service?

No. It is not affiliated with the Presidency of the Republic of Türkiye or
the Official Gazette. Always confirm a result on the linked official page.

#### What data do you see?

None. Your input and results stay in your Apify account; MSC Labs
receives no input, results or personal data.

### Limits

- Titles only: the Actor does not download or search full texts.
- If the official site changes its page layout, items may be missed until
  the Actor is updated; such issues are not charged.

### Türkçe özet

Resmî Gazete'nin her sayısını okuyup kanun, yönetmelik, tebliğ ve
kararları anahtar kelimelerinize göre süzer. Türkçe harf duyarlı arar:
"asgari ucret" yazmanız "Asgari Ücret"i bulur. Her gün çalışacak biçimde
zamanlayın; yeni bir düzenleme çıktığında sonuç e-posta, Slack ya da
webhook ile size gelsin. Okunan her sayı için 0,005 $; günlük takip ayda
yaklaşık 0,15 $.

Made by [MSC Labs](https://msclabs.tr).

# Actor input Schema

## `keywords` (type: `array`):

A list of words or phrases. An item is returned when its title or type contains any of them; case and Turkish accents are ignored, so 'asgari ucret' matches 'Asgari Ücret'. Examples: kişisel veri, gümrük, vergi. Leave empty to get every item.

## `days` (type: `integer`):

How many daily issues to read, counting back from the end date (1–31). Use 1 for a scheduled daily watch.

## `endDate` (type: `string`):

YYYY-MM-DD. Defaults to today in Turkey.

## `includeAnnouncements` (type: `boolean`):

Court, tender and miscellaneous announcements and the central bank exchange-rate table.

## `includeDuplicateIssues` (type: `boolean`):

Also read the extra issues published on the same day.

## Actor input object example

```json
{
  "days": 2,
  "includeAnnouncements": false,
  "includeDuplicateIssues": false
}
```

# Actor output Schema

## `overview` (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 = {
    "days": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("msclabs/resmi-gazete-monitor").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 = { "days": 2 }

# Run the Actor and wait for it to finish
run = client.actor("msclabs/resmi-gazete-monitor").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 '{
  "days": 2
}' |
apify call msclabs/resmi-gazete-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,msclabs/resmi-gazete-monitor"
        }
    }
}
```

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/qejL8skV4db6Vh38e/builds/Ln1e3cwLDdPb1CJ4S/openapi.json
