# Blockdit Scraper — Thai Posts, Creators, Categories & Search (`teodor_banea/blockdit-scraper`) Actor

Export public Blockdit posts from Thailand's creator platform: the newest posts, any creator's posts, category and popular feeds, keyword search, single posts, creator profiles and comments — full Thai text, media, reactions by type and impressions. No login.

- **URL**: https://apify.com/teodor_banea/blockdit-scraper.md
- **Developed by:** [Banea Teodor](https://apify.com/teodor_banea) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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

## Blockdit Scraper — Thai Posts, Creators, Categories & Search

### What does Blockdit Scraper do?

Blockdit Scraper exports public posts from [Blockdit](https://www.blockdit.com), Thailand's long-form creator platform (news publishers, investment, business, history, lifestyle and podcast creators). It collects **the newest posts on the whole platform**, **all posts of the creators you list**, **category and popular feeds**, **keyword search results**, **single posts**, **creator profiles** and **comments**, with the full post text, media links, categories, topics, reactions by type, comment, bookmark and impression counts and the creator behind every post.

No login, no proxy, no browser, no API key needed. Post texts stay in their original language (mostly Thai), exactly as written.

### Why use this Actor?

- **Full text, not snippets.** Every post comes with its whole body (paragraphs, quotes, lists, photo captions and link titles) as clean text, plus all photo URLs, outgoing links and the video / audio stream of video and podcast posts.
- **Engagement you can rank by.** Reactions split by type (like, love, haha, wow, sad, "got an idea"), comments, bookmarks, impressions and share clicks — all numbers, never strings.
- **Complete when you need it.** "Latest posts" with a date window returns *every* post published in that window (about 950 a day, re-shares included), newest first.
- **Ready for schedules.** A date window that matches your schedule (for example "the last 1 hour" every hour) turns the Actor into a feed of new posts. Nothing is stored in your account between runs.
- **Seven modes, one Actor.** Latest posts, creators' posts, category feeds, search, post URLs, creator profiles and comments.

### How much does it cost?

You pay **$0.005 per run** plus **$2.00 per 1,000 rows** (posts, creators or comments). Platform usage and proxy are included.

| Run | Rows | Cost |
|---|---|---|
| The 50 newest posts (the prefilled input) | 50 | $0.105 |
| Every post published on one day (re-shares excluded) | ~850 | ~$1.71 |
| The 100 newest posts of 10 creators | 1,000 | $2.005 |
| 40 posts of the History category feed | 40 | $0.085 |
| Profiles of 50 creators | 50 | $0.105 |
| All comments of 20 posts | ~100 | ~$0.21 |

### Input

| Field | Description | Example |
|---|---|---|
| `mode` | `latestPosts`, `creatorPosts`, `categoryPosts`, `searchPosts`, `postUrls`, `creatorProfiles` or `comments`. | `"latestPosts"` |
| `maxResults` | Rows to return in total; 0 = all (latest posts without a start date stop at 10,000). | `50` |
| `language` | Language of category labels and place names (`locationName`: "India" / "อินเดีย"): `en` or `th`. Post texts are never translated. | `"en"` |
| `publishedAfter` / `publishedBefore` | Date window (UTC) — a date or a period like `"3 days"`. "Before" is not included. | `"2026-10-21"` |
| `postTypes` | Keep only `read` (articles and posts), `video` and / or `audio`. Empty = all. | `["video"]` |
| `includeShares` | Also export re-shares of other posts (about one new post in ten). | `false` |
| `creatorUrls` | Creator pages: `https://www.blockdit.com/histofun`, `/pages/<id>`, `/users/<id>` or just `histofun`. | `["histofun"]` |
| `maxPostsPerCreator` | Newest posts per creator; 0 = all. | `100` |
| `category` | A category (`business`, `stocks-economy`, `history`, `news`… 36 in all) or `popular`, `popularVideo`, `popularAudio`, `exploreLatest`. | `"history"` |
| `keywords` | Words to search for, Thai or English, each on its own. A post found by several keywords is delivered once, under the first one (`searchKeyword`). | `["ทองคำ"]` |
| `sortBy` | Search order: `newest` (last 2-3 days) or `relevance` (all years). | `"relevance"` |
| `maxPostsPerKeyword` / `maxCreators` | Search results per keyword (posts / creators); 0 = all. | `100` |
| `postUrls` | Post URLs (`https://www.blockdit.com/posts/<id>`) or ids, for `postUrls` and `comments`. | `["https://www.blockdit.com/posts/6ad891a04a7369c5be7f3dcd"]` |
| `maxCommentsPerPost` | Comments (replies included) per post; 0 = all. | `200` |

#### Which modes give a complete listing?

- **Latest posts with a date window** — complete: every post published in the window, newest first.
- **Posts of creators** — complete: all of a creator's posts (up to your per-creator limit), newest first.
- **Post URLs, creator profiles from URLs, comments** — complete for what you list (comments: every comment and reply Blockdit still shows).
- **Category and popular feeds** — a **ranked discovery sample**: Blockdit shows at most about 500 posts per feed, reaching back a few weeks (History: 5 weeks, Popular: 3 weeks on 2026-10-22). Not an archive — use Latest posts with a date window, or Posts of creators, for complete lists.
- **Search** — newest-first search only reaches about 2-3 days back on Blockdit; relevance search goes back years but ranks by match quality. Use it to discover posts, not to count them. Very fresh posts may show zero reactions.

### Output

One row shape per run: posts (the first five modes), creator profiles or comments. Every row has every key; missing values are `null` (counters too — `null` means "not shown", `0` means zero). The dataset tabs *Posts*, *Creators* and *Comments* show them as tables.

**Post row:**

```json
{
    "postId": "6ad891a04a7369c5be7f3dcd",
    "url": "https://www.blockdit.com/posts/6ad891a04a7369c5be7f3dcd",
    "type": "read",
    "title": "ตัวอย่างบทความ: ประวัติศาสตร์ของทองคำ",
    "teaserTitle": "ตัวอย่างบทความ: ประวัติศาสตร์ของทองคำ\nย่อหน้าแรกของบทความ",
    "bodyText": "ย่อหน้าแรกของบทความ\n\n“คำพูดที่ยกมา” — EXAMPLE, Jane\n\n- ข้อแรก\n- ข้อสอง",
    "blockCount": 12,
    "coverImageUrl": "https://t1.blockdit.com/photos/2026/10/example_1200x0xcover.jpg",
    "imageUrls": ["https://t1.blockdit.com/photos/2026/10/example_1200x0xcover.jpg"],
    "externalLinks": ["https://www.example.com/article"],
    "mediaUrl": null,
    "mediaDurationSec": null,
    "mediaThumbnailUrl": null,
    "categories": ["History"],
    "topics": ["ประวัติศาสตร์"],
    "seriesTitles": [],
    "publishedAt": "2026-10-21T12:00:00.000Z",
    "updatedAt": "2026-10-21T10:59:07.000Z",
    "popularizedAt": "2026-10-22T03:18:45.000Z",
    "reactionCount": 18,
    "likeCount": 15,
    "loveCount": 2,
    "hahaCount": 0,
    "wowCount": 1,
    "sadCount": 0,
    "gotIdeaCount": 0,
    "commentCount": 3,
    "bookmarkCount": 18,
    "impressionCount": 1903,
    "shareClickCount": 16,
    "locationName": null,
    "questionTitle": null,
    "isShare": false,
    "originPostId": null,
    "originPostUrl": null,
    "creatorType": "page",
    "creatorId": "5f0000000000000000000001",
    "creatorAlias": "example.page",
    "creatorName": "Example History Page",
    "creatorUrl": "https://www.blockdit.com/example.page",
    "creatorVerified": true,
    "creatorFollowerCount": 70233,
    "searchKeyword": null,
    "scrapedAt": "2026-10-22T12:00:00.000Z"
}
```

Video and audio posts carry `mediaUrl` (an HLS `.m3u8` stream), `mediaDurationSec` and `mediaThumbnailUrl`. Re-shares have `isShare: true` and link the shared post in `originPostUrl`.

**Creator row** keys: `pageId`, `creatorType` (`page` / `user`), `alias`, `name`, `url`, `about`, `website`, `phone`, `avatarUrl`, `coverUrl`, `categories[]`, `followerCount`, `postCount`, `qualifiedPostCount`, `verifiedAt`, `officialAccountType` (bank, broker, insurance, listed_company), `createdAt`, `seriesCount`, `searchKeyword`, `scrapedAt`.

**Comment row** keys: `commentId`, `postId`, `postUrl`, `parentCommentId` (replies), `content`, `createdAt`, `reactionCount`, `imageUrl`, `authorType`, `authorId`, `authorName`, `scrapedAt`. `commentCount` on a post can be higher than the comments you get: Blockdit counts removed and hidden comments but does not show them. Each comment is followed by its replies.

Problems (a post or creator that does not exist, a page that could not be read) are listed in the run's key-value store under `ERRORS` and never mixed into the rows.

### Tips and tricks

- **A daily archive of Blockdit:** `latestPosts` with `publishedAfter` = yesterday and `publishedBefore` = today, `maxResults: 0`. About 950 posts a day (≈850 without re-shares), read in a minute or two.
- **Watch publishers or competitors:** `creatorPosts` with their pages and a recent `publishedAfter` (see Scheduling below). Up to 20 creators are read in one request, so watching hundreds of pages stays quick.
- **Videos or podcasts only:** set `postTypes` to `["video"]` or `["audio"]` — the filter is applied by Blockdit, so you do not pay for skipped posts.
- **Find creators in a niche:** `creatorProfiles` with keywords such as `"หุ้น"` (stocks) or `"ท่องเที่ยว"` (travel); then feed the URLs into `creatorPosts`.
- **Older posts by keyword:** use `sortBy: "relevance"` — newest-first search on Blockdit only covers the last 2-3 days.
- Re-shares (about one post in ten) are off by default: they repeat another post (linked in `originPostUrl`) with little or no own text.

### Scheduling

The Actor keeps nothing in your account between runs — each run returns its results and that is all. For a recurring feed, set `publishedAfter` (and, if you like, `publishedBefore`) to match your schedule interval: an hourly schedule with `publishedAfter: "1 hour"` gives each hour's new posts, a daily one with `publishedAfter: "1 day"` each day's. Within one run every post appears once. If your windows overlap (for example `"2 hours"` on an hourly schedule, to be safe), a few posts appear in two runs — drop the repeats downstream by `postId`.

### Integrations

Export the dataset as JSON, CSV or Excel, or fetch it by API (`/v2/datasets/{id}/items?view=creators`). Connect the Actor to Google Sheets, Zapier, Make, Slack or a webhook from the **Integrations** tab, or schedule it to keep a media-monitoring sheet, a content-research database or a creator list up to date.

### Personal data

Most Blockdit content comes from pages (publishers, companies, creators). More than a quarter of new posts are written by **users** — private individuals. For users the Actor outputs only their id, alias / profile URL, display name, verification and follower count — never gender, work, education, location, birthday or contact details, and it never requests those fields. Comment authors are given by type, id and display name only. If you process this data, you are the controller under GDPR / Thailand's PDPA: have a lawful basis, respect objections and keep only what you need.

### Disclaimer

This Actor reads publicly visible Blockdit content. It is not affiliated with or endorsed by Blockdit. Post texts and media remain the property of their authors.

# Changelog

This Actor's version history is a separate document: https://apify.com/teodor_banea/blockdit-scraper/changelog.md

# Actor input Schema

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

Choose what each run collects. One row type per run: posts (the first five modes), creator profiles or comments.

## `maxResults` (type: `integer`):

Enter how many rows to return in total (posts, creators or comments). 0 = all (Latest posts without a "Published after" date stop at 10,000).

## `language` (type: `string`):

Choose the language of category labels and place names (locationName). Post texts stay in their original language (mostly Thai).

## `publishedAfter` (type: `string`):

Keep posts published on or after this date (00:00 UTC), or within a recent period such as "3 days". Used by Latest posts, Posts of creators, Search and feeds.

## `publishedBefore` (type: `string`):

Keep posts published before this date (00:00 UTC, not included). Leave empty for posts up to now.

## `postTypes` (type: `array`):

Keep only these post types. Empty = all (articles, videos and audio / podcasts).

## `includeShares` (type: `boolean`):

Also export re-shares (a creator sharing someone else's post — the row links to the original). About one new post in ten is a re-share.

## `creatorUrls` (type: `array`):

Enter Blockdit creator pages, one per line: https://www.blockdit.com/histofun, https://www.blockdit.com/pages/<id>, https://www.blockdit.com/users/<id> or just the alias (histofun). Used by Posts of creators and Creator profiles.

## `maxPostsPerCreator` (type: `integer`):

Enter how many posts to take from each creator, newest first. 0 = all of them.

## `category` (type: `string`):

Choose a Blockdit category or a site-wide popular feed. Feeds are ranked selections of up to about 500 recent posts (a few weeks), not complete archives.

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

Enter words to search for, in Thai or English (e.g. ทองคำ, หุ้น, AI). Each keyword is searched on its own; a post found by several keywords is delivered once, under the first. Used by Search posts and Creator profiles.

## `sortBy` (type: `string`):

Newest first covers only about the last 2-3 days on Blockdit; Relevance reaches back years.

## `maxPostsPerKeyword` (type: `integer`):

Enter how many posts to take for each keyword. 0 = all results.

## `maxCreators` (type: `integer`):

Creator profiles: enter how many creator pages to take for each keyword. 0 = all results.

## `postUrls` (type: `array`):

Enter Blockdit post URLs (https://www.blockdit.com/posts/<id>) or post ids, one per line. Used by Posts from URLs and Comments.

## `maxCommentsPerPost` (type: `integer`):

Enter how many comments (replies included) to take from each post. 0 = all of them.

## Actor input object example

```json
{
  "mode": "latestPosts",
  "maxResults": 50,
  "language": "en",
  "includeShares": false,
  "creatorUrls": [
    "https://www.blockdit.com/histofun"
  ],
  "maxPostsPerCreator": 100,
  "category": "popular",
  "keywords": [
    "ทองคำ"
  ],
  "sortBy": "newest",
  "maxPostsPerKeyword": 100,
  "maxCreators": 50,
  "postUrls": [
    "https://www.blockdit.com/posts/6ad891a04a7369c5be7f3dcd"
  ],
  "maxCommentsPerPost": 200
}
```

# Actor output Schema

## `results` (type: `string`):

Every row of the run as JSON.

## `posts` (type: `string`):

Posts: title, text, type, media, categories, publish time, reactions by type, comments, bookmarks, impressions, creator.

## `creators` (type: `string`):

Creator profiles: name, alias, about, website, phone, categories, followers, posts, series, verification.

## `comments` (type: `string`):

Comments and replies: post, text, time, reactions, author.

## `resultsCsv` (type: `string`):

The same rows as a CSV download.

## `errors` (type: `string`):

Posts, creators or pages that could not be read. Only present when something went wrong.

# 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 = {
    "maxResults": 50,
    "creatorUrls": [
        "https://www.blockdit.com/histofun"
    ],
    "keywords": [
        "ทองคำ"
    ],
    "postUrls": [
        "https://www.blockdit.com/posts/6ad891a04a7369c5be7f3dcd"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("teodor_banea/blockdit-scraper").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 = {
    "maxResults": 50,
    "creatorUrls": ["https://www.blockdit.com/histofun"],
    "keywords": ["ทองคำ"],
    "postUrls": ["https://www.blockdit.com/posts/6ad891a04a7369c5be7f3dcd"],
}

# Run the Actor and wait for it to finish
run = client.actor("teodor_banea/blockdit-scraper").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 '{
  "maxResults": 50,
  "creatorUrls": [
    "https://www.blockdit.com/histofun"
  ],
  "keywords": [
    "ทองคำ"
  ],
  "postUrls": [
    "https://www.blockdit.com/posts/6ad891a04a7369c5be7f3dcd"
  ]
}' |
apify call teodor_banea/blockdit-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,teodor_banea/blockdit-scraper"
        }
    }
}
```

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/TGo08cJYjf79Os4IT/builds/ArGglwad8MVwpjgRF/openapi.json
