# Lemon8 Search Scraper (`parsebird/lemon8-search-scraper`) Actor

Scrape Lemon8 posts by keyword in 10 regions: titles, full text, hashtags, likes, saves, comments, views, images, video links, authors and comment threads with replies. Monitor searches with incremental mode. Export JSON, CSV or Excel via API.

- **URL**: https://apify.com/parsebird/lemon8-search-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.39 / 1,000 posts

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

### Lemon8 Search Scraper

Lemon8 Search Scraper extracts **Lemon8 posts by keyword** in 10 regions: title, text, hashtags, likes, saves, comments, views, images, video links, author profile and the full comment thread with replies, one clean row per post.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search any keyword in the US, Canada, Australia, New Zealand, Japan, Thailand, Indonesia, Vietnam, Malaysia or Singapore, go past the first page of results through Lemon8's related posts (up to 5,000 per keyword), and monitor a search over time with incremental mode that returns only new and changed posts.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/lemon8-search-scraper — scrapes Lemon8 (lemon8-app.com) posts by keyword. Input: {"searchTerm": "skincare" (string; used when startUrls is empty), "startUrls": ["https://www.lemon8-app.com/discover/coffee?region=jp"] (optional Lemon8 discover or experience links; keyword and region are read from each link; take precedence over searchTerm), "region": "us" (one of us, au, nz, jp, th, id, vn, my, sg, ca), "limit": 50 (posts per keyword or link, 1-5000; search results first, then related posts), "getDetails": true (open each post for full text, hashtags, related topics, location, all images, video URL, comments and replies), "detailsLimit": null (details for only the first N posts; empty = all), "commentExpansionTimeout": 30 (seconds per post for comments, 10-300), "incrementalMode": false, "stateKey": "skincare-us-daily", "emitUnchanged": false, "emitExpired": false (recurring monitoring), "resumeFromRunId": "RUN_OR_DATASET_ID" (skip posts already saved there), "proxy": {"useApifyProxy": true}, "dev_transform_fields": ["id", "author.name", "statistics.likesCount"] (return only these dot paths), "dev_dataset_name": "lemon8-{DATE}", "dev_dataset_clear": false}. Run via ApifyClient("YOUR_TOKEN").actor("parsebird/lemon8-search-scraper").call(run_input=input). Output, one row per post: id, postType (Gallery/Video), region, author {name, username, userId, followerCount, bio, profileUrl, profileImageUrl}, title, content (preview), postUrl, publishedAt, statistics {likesCount, savedCount, commentsCount, viewsCount}, coverImageUrl, images [{src, alt, width, height}], comments (preview), isVideo, videoData {posterUrl, videoUrl, durationSeconds}, source ("search" or "related"), searchQuery, position, details {fullContent, hashtags, editTime, statistics, galleryImages, imageText, relatedTopics, location, videoData}, allComments [{author, content, time, likes, replies[]}], commentStats {totalComments, totalReplies, previewCommentCount, complete}, scrapedAt; plus changeType, changedFields, firstSeenAt, lastSeenAt in incremental mode. Pricing: pay per post saved. Get your API token at https://console.apify.com/account#/integrations. Full API spec: https://apify.com/parsebird/lemon8-search-scraper/api
```

### What is Lemon8 Search Scraper?

Lemon8 Search Scraper is a **Lemon8 data extraction tool** that reads public posts from [Lemon8](https://www.lemon8-app.com/), ByteDance's lifestyle app for beauty, fashion, food, home, fitness and travel content. You give it a keyword such as `skincare` and a region, and it returns the posts Lemon8 shows for that search, with engagement counts, images, video links, author data and comments. Lemon8 has no public API for this, so the scraper works as a **Lemon8 API alternative** for marketers, brand and influencer teams, trend researchers and data teams.

The easiest way to try it: keep the prefilled keyword `skincare`, click **Start**, and open the dataset. You get 10 skincare posts from Lemon8 US with full text, hashtags and comments.

No Lemon8 account or login is needed.

### What can Lemon8 Search Scraper do?

- 🔎 **Keyword search** in 10 Lemon8 regions: United States, Canada, Australia, New Zealand, Japan, Thailand, Indonesia, Vietnam, Malaysia and Singapore. Keywords work in any language, for example `カフェ`, `คาเฟ่` or `cà phê`.
- 🔗 **Discover links**: paste one or more `lemon8-app.com/discover/...` or `/experience/...` links instead of typing keywords. The keyword and region are read from each link.
- 📈 **More than one page of results**: Lemon8 shows about 25–60 posts per keyword search. The scraper then follows Lemon8's related-post lists for those results to collect up to 5,000 posts per keyword. Every row says whether it came from the `search` results or from `related` posts.
- 📝 **Detailed post data** (on by default): full post text, hashtags, related topics, tagged location, text found in the images, all images in 1080px, the MP4 video link, and exact likes, saves, comments and views.
- 💬 **Comments and replies**: every comment Lemon8 shows on the web, with author, time and likes, plus the replies under each comment.
- 🔁 **Incremental monitoring**: on scheduled runs, mark each post as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED and return only what changed, so you don't pay for the same posts every day.
- ⏯️ **Resume**: continue an interrupted run without paying again for posts it already saved.
- 🧩 **Developer options**: return only the fields you need, or write into a named dataset that you reuse across runs.

Because Lemon8 Search Scraper runs on the Apify platform, you also get:

- ⏰ [Scheduling](https://docs.apify.com/platform/schedules) to track a hashtag, product or trend daily or weekly.
- 🔌 [API access](https://docs.apify.com/api/v2) and client libraries for Python and JavaScript.
- 🔗 [Integrations](https://apify.com/integrations) with Make, Zapier, Google Sheets, Slack, webhooks and more.
- 📦 Export to JSON, CSV, Excel, XML or HTML from the Storage tab or the API.

### What data can you extract from Lemon8?

| Field | Description |
|-------|-------------|
| `id` / `postUrl` | Lemon8 post ID and link |
| `title` / `content` | Post title and the text preview from the listing |
| `postType` / `isVideo` | `Gallery` (photo post) or `Video` |
| `author` | Display name, username, user ID, follower count, bio, profile link and avatar |
| `statistics` | `likesCount`, `savedCount`, `commentsCount` and `viewsCount` |
| `publishedAt` | Publication time (ISO 8601, UTC) |
| `images` / `coverImageUrl` | Image links with Lemon8's image descriptions, and the cover image |
| `videoData` | Poster image, MP4 link, duration and size for video posts |
| `comments` | Comments shown on the search result card |
| `details.fullContent` / `details.hashtags` | Full post text and its hashtags\* |
| `details.relatedTopics` / `details.location` | Lemon8's related search topics and the tagged place\* |
| `details.imageText` / `details.galleryImages` | Text found in the images and all images in 1080px\* |
| `details.editTime` | When the post was last edited\* |
| `allComments` / `commentStats` | Full comment thread with replies, and counts of what was collected\* |
| `source` / `searchQuery` / `position` | Search results or related posts, the keyword, and the post's position |

\* With **Get Detailed Post Data** on. In incremental mode every row also has `changeType`, `changedFields`, `firstSeenAt` and `lastSeenAt`.

### How to scrape Lemon8

1. Open [Lemon8 Search Scraper](https://apify.com/parsebird/lemon8-search-scraper) in Apify Console and sign in (or create a free Apify account).
2. Enter a **Search Term**, such as `matcha latte`, and pick a **Region**. Or paste Lemon8 discover links into **Start URLs**.
3. Set **Post Limit**. Leave **Get Detailed Post Data** on for full text, hashtags and comments, or turn it off for a faster pass over the listings.
4. For a recurring search, turn on **Incremental mode** and give it a **State key** such as `streetwear-sg-daily`.
5. Click **Start**. When the run finishes, download the data as JSON, CSV or Excel from the **Storage** tab, or read it through the API.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchTerm` | string | No\* | `fashion` | Keyword to search Lemon8 for. Used only when Start URLs is empty |
| `startUrls` | array | No\* | `[]` | Lemon8 discover or experience links. The keyword and region are read from each link. Take precedence over Search Term |
| `region` | string | No | `us` | `us`, `au`, `nz`, `jp`, `th`, `id`, `vn`, `my`, `sg` or `ca` |
| `limit` | integer | No | `50` | Maximum posts per keyword or link (1 to 5,000) |
| `getDetails` | boolean | No | `true` | Open each post for full text, hashtags, related topics, location, images, video link and comments |
| `detailsLimit` | integer | No | all | Get details for only the first N posts of each keyword or link |
| `commentExpansionTimeout` | integer | No | `30` | Seconds to spend on one post's comments and replies (10 to 300) |
| `incrementalMode` | boolean | No | `false` | Classify posts against earlier runs and return only new and changed ones |
| `stateKey` | string | No | derived | Name of the monitoring campaign. Runs with the same key share history |
| `emitUnchanged` | boolean | No | `false` | Also return (and pay for) UNCHANGED posts |
| `emitExpired` | boolean | No | `false` | Also return (and pay for) tracked posts that dropped out of the search results |
| `resumeFromRunId` | string | No | — | Run or dataset ID of an interrupted run. Posts already saved there are skipped and not charged again |
| `proxy` | object | No | Apify Proxy | Connection settings. Left empty, the Actor connects directly and moves to Apify Proxy if Lemon8 refuses requests |
| `dev_transform_fields` | array | No | `[]` | Return only these fields, as dot paths like `author.name` or `images.0.src` |
| `dev_dataset_name` | string | No | default | Save into a named dataset. Supports `{ACTOR}`, `{DATE}` and `{TIME}` |
| `dev_dataset_clear` | boolean | No | `false` | Empty the named dataset before this run adds posts |

\* Enter a Search Term or at least one Start URL.

**Search by keyword and region:**

```json
{
  "searchTerm": "skincare",
  "region": "us",
  "limit": 20,
  "getDetails": true
}
```

**Paste a discover link instead:**

```json
{
  "startUrls": ["https://www.lemon8-app.com/discover/coffee?region=jp"],
  "limit": 15
}
```

**Recurring monitoring of the same search:**

```json
{
  "searchTerm": "streetwear",
  "region": "sg",
  "limit": 50,
  "getDetails": false,
  "incrementalMode": true,
  "stateKey": "streetwear-sg-daily"
}
```

### Output example

One row per post. This is a real record from a `skincare` search in the US, shortened, with the creator's and commenter's names replaced. Image, video and avatar links are signed Lemon8 CDN links.

```json
{
  "id": "7509859619695755819",
  "postType": "Gallery",
  "region": "us",
  "author": {
    "name": "Sample Creator",
    "username": "sample.creator",
    "userId": "118134275572408320",
    "followerCount": 632,
    "bio": "make sure to go follow me on tiktok",
    "profileUrl": "https://www.lemon8-app.com/@sample.creator?region=us",
    "profileImageUrl": "https://p16-lemon8-cross-sign.tiktokcdn.com/...jpeg",
    "followingCount": 124,
    "postCount": 16
  },
  "title": "skincare routine ",
  "content": "✨ New to skincare? Here's your simple step-by-step routine to glow without the guesswork 💧💫  1️⃣ Cleanser – always start fresh  2️⃣ Toner – optional but helpful! ...",
  "postUrl": "https://www.lemon8-app.com/@sample.creator/7509859619695755819?region=us",
  "publishedAt": "2025-05-29T13:32:37Z",
  "statistics": { "likesCount": 11782, "savedCount": 12509, "commentsCount": 66, "viewsCount": 515421 },
  "coverImageUrl": "https://p16-lemon8-cross-sign.tiktokcdn.com/...webp",
  "images": [
    { "src": "https://p16-lemon8-cross-sign.tiktokcdn.com/...webp", "alt": "", "width": 640, "height": 853 }
  ],
  "comments": [
    {
      "id": "7523655998892933943",
      "author": "Sample Commenter",
      "authorProfileUrl": "https://www.lemon8-app.com/@sample.commenter?region=us",
      "content": "I have a moisturizer that has spf is that good to use?",
      "time": "2025-07-05T17:47:48Z",
      "likes": 5,
      "replyCount": 2
    }
  ],
  "isVideo": false,
  "videoData": null,
  "source": "search",
  "searchQuery": "skincare",
  "position": 1,
  "details": {
    "title": "skincare routine ",
    "fullContent": "✨ New to skincare? Here's your simple step-by-step routine to glow without the guesswork 💧💫
1️⃣ Cleanser – always start fresh
2️⃣ Toner – optional but helpful!
3️⃣ Serum – target your skin goals
4️⃣ Moisturizer – lock in hydration
5️⃣ Sunscreen – non-negotiable in the morning ☀️ ...",
    "hashtags": ["#SkincareForBeginners", "#GlowingSkin101", "#SkincareRoutine", "#SkincareTips", "#SkincareMadeEasy"],
    "publishedAt": "2025-05-29T13:32:37Z",
    "editTime": "2025-05-29T13:32:37Z",
    "statistics": { "likesCount": 11782, "savedCount": 12509, "commentsCount": 66, "viewsCount": 515421 },
    "galleryImages": [
      { "src": "https://p16-lemon8-sign-sg.tiktokcdn.com/...1080:0.webp", "alt": "", "width": 640, "height": 853 }
    ],
    "imageText": ["Natura VDRATION skincare for CREME beginners GRADUAL SELF-TAN FACIAL CRÈME ADVANCED HYDRATION"],
    "relatedTopics": [],
    "location": null,
    "isVideo": false,
    "videoData": null,
    "searchQuery": "skincare"
  },
  "allComments": [
    {
      "id": "7523655998892933943",
      "author": "Sample Commenter",
      "authorUsername": "sample.commenter",
      "authorProfileUrl": "https://www.lemon8-app.com/@sample.commenter?region=us",
      "authorTag": null,
      "content": "I have a moisturizer that has spf is that good to use?",
      "time": "2025-07-05T17:47:48Z",
      "likes": 5,
      "replyCount": 2,
      "replies": [
        {
          "id": "7525793250217558797",
          "author": "Sample Creator",
          "authorUsername": "sample.creator",
          "authorProfileUrl": "https://www.lemon8-app.com/@sample.creator?region=us",
          "tag": "Author",
          "content": "yes",
          "time": "2025-07-11T12:01:26Z",
          "likes": 0
        }
      ]
    }
  ],
  "commentStats": { "totalComments": 34, "totalReplies": 7, "previewCommentCount": 3, "complete": true },
  "scrapedAt": "2026-10-10T11:15:22Z"
}
```

`authorTag` and `tag` are `"Author"` when the post's creator wrote the comment or reply.

You can download the dataset in JSON, CSV, Excel, XML or HTML from the **Storage** tab, or set the input in the [Input tab](https://apify.com/parsebird/lemon8-search-scraper/input-schema).

### How does incremental mode work?

Incremental mode is for scheduled runs of the same search. The scraper keeps a history of the posts it has seen under your **State key**, in a key-value store in your Apify account named `lemon8-search-scraper-incremental`, and adds these fields to each row:

| `changeType` | Meaning | Returned by default |
|--------------|---------|---------------------|
| `NEW` | Not seen in earlier runs with this state key | Yes |
| `UPDATED` | Title, text, likes, saves or comments changed. `changedFields` lists which | Yes |
| `UNCHANGED` | Seen before with no changes | Only with **Return unchanged posts** |
| `REAPPEARED` | Marked EXPIRED earlier and found again | Yes |
| `EXPIRED` | Was in the keyword's search results before and is gone now | Only with **Return expired posts** |

You pay only for rows that are returned. A post is marked EXPIRED only when the run read the keyword's whole search result list. Posts that came from related lists never expire, because those lists are recommendations that change between visits.

### Use cases

- **Trend research**: see which products, outfits, recipes and places Lemon8 creators post about for a keyword, and how many likes and saves each post gets.
- **Influencer discovery**: find creators posting about your niche, with follower counts, bios and profile links.
- **Brand monitoring**: schedule a daily search for your brand or product and get only new and changed posts with incremental mode.
- **Content and SEO research**: collect hashtags, related topics and full post text to plan content for Lemon8, TikTok or Instagram.
- **Comment analysis**: export comment threads to study what readers ask about a product or topic.
- **Market research across countries**: compare the same keyword in the US, Japan, Thailand or Indonesia.

### How it works

1. The scraper loads the posts Lemon8's website shows for your keyword and region. Popular keywords open Lemon8's curated keyword page, which lists fewer posts.
2. If you asked for more posts than that, it follows Lemon8's related-post lists for those results until it reaches **Post Limit**.
3. With **Get Detailed Post Data** on, it opens each post for its full data and loads comments and replies until **Comment Timeout** runs out.
4. Each post is saved to the dataset and charged as one event.

### How much does it cost to scrape Lemon8?

Lemon8 Search Scraper uses pay-per-event pricing. You pay per post saved to the dataset, with or without detailed data and comments. Compute and proxy costs are included in the price, so there are no extra platform usage charges.

| Event | Free plan | Bronze | Silver | Gold |
|-------|-----------|--------|--------|------|
| `post`: per Lemon8 post saved | $0.00299 | $0.00279 | $0.00259 | $0.00239 |
| Per 1,000 posts | **$2.99** | **$2.79** | **$2.59** | **$2.39** |

For example, the prefilled run (10 posts) costs about $0.03 on the Free plan, and 1,000 posts cost $2.99. Use **Post Limit** or a [spending limit](https://docs.apify.com/platform/actors/running/usage-and-resources) to cap a run; the scraper stops as soon as the limit is reached. In incremental mode, unchanged posts are not returned or charged unless you ask for them. Apify's Free plan includes monthly platform credits you can use to try the scraper.

### Use Lemon8 Search Scraper with the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("parsebird/lemon8-search-scraper").call(run_input={
    "searchTerm": "matcha latte",
    "region": "sg",
    "limit": 100,
    "getDetails": True,
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(post["statistics"]["likesCount"], post["title"], post["postUrl"])
```

**JavaScript**

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('parsebird/lemon8-search-scraper').call({
    searchTerm: 'gym outfit',
    region: 'au',
    limit: 100,
    getDetails: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((post) => console.log(post.statistics.likesCount, post.title));
```

See the [API tab](https://apify.com/parsebird/lemon8-search-scraper/api) for endpoints, the OpenAPI spec and more client examples.

### Is it legal to scrape Lemon8?

Lemon8 Search Scraper collects only data that Lemon8 shows publicly on its website, without logging in. Web scraping of public data is generally legal, but the results can contain personal data, such as creator names and comments, which is protected by the GDPR in the EU and by similar laws elsewhere. Don't collect personal data unless you have a legitimate reason, and check Lemon8's terms and your local laws before you use the data. If you're unsure, consult a lawyer. Read more in Apify's blog post [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other social media scrapers

| Actor | What it does |
|-------|--------------|
| [TikTok Trends Scraper](https://apify.com/parsebird/tiktok-trends-scraper) | Trending hashtags, videos, sounds and creators from TikTok Creative Center and Explore |
| [TikTok Video Downloader](https://apify.com/parsebird/tiktok-video-downloader) | Download TikTok videos as MP4 from post URLs or short links |
| [TikTok Slideshow Downloader](https://apify.com/parsebird/tiktok-slideshow-downloader) | Download every photo of TikTok slideshow posts |
| [Instagram Reels Search & Trend Discovery](https://apify.com/parsebird/instagram-reels-search-scraper) | Search Instagram Reels by keyword with plays, likes and captions |
| [Pinterest Search Scraper](https://apify.com/parsebird/pinterest-search-scraper) | Scrape Pinterest search results by keyword |
| [Threads Search Scraper](https://apify.com/parsebird/threads-search-scraper) | Scrape public Threads posts by keyword or hashtag |
| [Reddit Search Scraper](https://apify.com/parsebird/reddit-search-scraper) | Search Reddit posts and comments by keyword |

### FAQ

**How many posts can I get for one keyword?**
Lemon8 shows about 25–60 posts in the search results for a keyword. Popular keywords such as `fashion` or `skincare` open Lemon8's curated keyword page instead, with fewer posts. To go further, the scraper follows Lemon8's related-post lists for those results, up to 5,000 posts per keyword. Rows from those lists have `source: "related"`.

**Are the related posts about my keyword?**
Mostly, but not always. Related posts are what Lemon8 recommends next to the search results, so the further a run goes, the more they can drift from the keyword (a long `fashion` run can include beauty posts, for example). Filter on `source` if you only want the search results.

**Why are some counts null?**
Related-post lists carry only the like count, so `savedCount`, `commentsCount` and `viewsCount` are `null` for those rows unless **Get Detailed Post Data** is on. With details on, all four counts are filled in from the post page. Posts from Lemon8's curated keyword pages also have no follower count without details.

**Why does the US region return posts from Canada?**
Lemon8's website doesn't return keyword search results for the US region directly, so for `us` the scraper reads the North American feed that Lemon8 serves to Canada, which lists posts from US creators. The `region` field on each row is the post's own region as Lemon8 reports it, so you will mostly see `us`. The Australia, New Zealand and Canada feeds also mostly contain US posts.

**Why did my keyword return nothing?**
Lemon8 hides web search results for some keywords, `travel` for example, and the log says so. Try a more specific keyword such as `japan travel tips`. A search with no matching posts still finishes successfully, with an empty dataset.

**Why are there fewer comments than `commentsCount`?**
The scraper returns the comments and replies Lemon8 shows on its website. `commentsCount` includes replies, and Lemon8 doesn't show every comment on the web, so `replies` can also be shorter than `replyCount`. Which comments Lemon8 shows also depends on the visitor's country: in our tests, a US connection saw 25 of the 77 top-level comments a Malaysian connection saw on one post, while on another post it saw more replies. The default Apify Proxy connects from the US, so you get the comments Lemon8 shows to US visitors. `commentStats.complete` is `false` when **Comment Timeout** ran out before the thread was fully loaded.

**Do the image and video links expire?**
Yes. Lemon8 serves images and videos through signed CDN links with an expiry time in the URL. Download the files soon after the run if you need to keep them.

**Can I scrape a Lemon8 profile or a single post?**
Not with this Actor. Start URLs accepts Lemon8 discover and experience links (`/discover/<keyword>` and `/experience/<keyword>`), and other links are skipped with a warning.

**Do I need a proxy?**
Lemon8 limits how many post pages one IP address can open. Keep the prefilled Apify Proxy setting for runs with detailed data. If you leave the proxy empty, the scraper connects directly and moves to Apify Proxy automatically when Lemon8 starts refusing requests.

**How do I resume an interrupted run?**
Start a new run with **Resume from run or dataset ID** set to the interrupted run's ID. Posts already saved in that run are skipped and not charged again, and they still count toward Post Limit, so the new run saves only the rest.

**Can I use it with Make, Zapier or Google Sheets?**
Yes. Use Apify's [integrations](https://apify.com/integrations) or a [webhook](https://docs.apify.com/platform/integrations/webhooks) to send results wherever you need them after each run.

**Something doesn't work. What should I do?**
Open an issue in the [Issues tab](https://apify.com/parsebird/lemon8-search-scraper/issues) with your input and run link. Feature requests are welcome there too.

# Changelog

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

# Actor input Schema

## `searchTerm` (type: `string`):

Enter a keyword to search Lemon8 for, such as <code>skincare</code>, <code>matcha latte</code> or <code>gym outfit</code>. Used only when Start URLs is empty.

## `startUrls` (type: `array`):

Paste Lemon8 discover links instead of a Search Term, e.g. <code>https://www.lemon8-app.com/discover/coffee?region=jp</code>. The keyword and region are read from each link. Takes precedence over Search Term when set.

## `region` (type: `string`):

Pick the Lemon8 region to search. Links in Start URLs use the region in the link and fall back to this one.

## `limit` (type: `integer`):

Maximum number of posts to extract for each Search Term or link (1 to 5,000). Search results come first, then posts Lemon8 lists as related to them.

## `getDetails` (type: `boolean`):

Open each post for its full text, hashtags, related topics, location, all images, the video file link and the comment thread with replies. Turn off for a faster pass over the listings only. The price per post is the same.

## `detailsLimit` (type: `integer`):

Fetch detailed data for only the first N posts of each Search Term or link. Leave empty to get details for every post.

## `commentExpansionTimeout` (type: `integer`):

Seconds to spend loading one post's comments and replies before moving on (10 to 300). <code>commentStats.complete</code> shows whether the whole thread was loaded.

## `incrementalMode` (type: `boolean`):

Turn on for recurring runs: each post is marked NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED compared with earlier runs of the same search. Only NEW, UPDATED and REAPPEARED posts are returned by default.

## `stateKey` (type: `string`):

Name for this monitoring campaign, e.g. <code>streetwear-sg-daily</code>. Runs with the same key share history. Leave empty to derive one from the search terms and regions.

## `emitUnchanged` (type: `boolean`):

Also return (and pay for) UNCHANGED posts on every run.

## `emitExpired` (type: `boolean`):

Also return (and pay for) tracked posts that no longer appear in a search's results. Only checked when the search finishes without being stopped by the spending limit.

## `resumeFromRunId` (type: `string`):

Enter the ID of an interrupted run (or its dataset) of this Actor. Posts already saved there are skipped and not charged again; they still count toward Post Limit.

## `proxy` (type: `object`):

Lemon8 limits how many post pages one IP can open, so Apify Proxy is recommended. Left completely empty (for example in a bare API call), the Actor connects directly and moves to Apify Proxy if Lemon8 starts refusing requests.

## `dev_transform_fields` (type: `array`):

Return only the listed fields per post, e.g. <code>id</code>, <code>author.name</code>, <code>statistics.likesCount</code>, <code>images.0.src</code>. Use a dot path for nested objects and a number for array items. Each path becomes a column named after it.

## `dev_dataset_name` (type: `string`):

Save results into a named dataset in your account instead of the run's default dataset. Supports <code>{ACTOR}</code>, <code>{DATE}</code> and <code>{TIME}</code> placeholders, e.g. <code>lemon8-{DATE}</code>. Leave empty or <code>default</code> for the default dataset.

## `dev_dataset_clear` (type: `boolean`):

Delete everything in the named dataset before this run adds new posts.

## Actor input object example

```json
{
  "searchTerm": "skincare",
  "region": "us",
  "limit": 10,
  "getDetails": true,
  "commentExpansionTimeout": 30,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true
  },
  "dev_dataset_clear": false
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchTerm": "skincare",
    "region": "us",
    "limit": 10,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/lemon8-search-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 = {
    "searchTerm": "skincare",
    "region": "us",
    "limit": 10,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/lemon8-search-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 '{
  "searchTerm": "skincare",
  "region": "us",
  "limit": 10,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/lemon8-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/lemon8-search-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/TVNrnVHAIcsBbz7mR/builds/NQLx748kt8N609bE7/openapi.json
