# Lemon8 Search Scraper: Posts, Comments & Media (`abotapi/lemon8-discover-scraper`) Actor

Scrape Lemon8 posts by keyword across multiple regions. Extract posts, images, videos, comments, engagement metrics, and detailed post analytics, with support for high-quality media downloads. Ideal for market research, content analysis, and trend monitoring.

- **URL**: https://apify.com/abotapi/lemon8-discover-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Social media, Developer tools, Automation
- **Stats:** 78 total users, 12 monthly users, 97.4% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🍋 Lemon8 Scraper

![Lemon8 Scraper](https://i.postimg.cc/CLMPG9ZY/banner.png)

### Extract Content, Images, Videos, and Comments from Lemon8

This powerful actor scrapes content from the popular Lemon8 social media platform. Get posts, comments, images, videos, and detailed analytics with just a few clicks.

### ✨ Features

- 🔍 **Search by Keywords** - Find content using any search term
- 🌎 **Multiple Regions** - Support for 10+ countries including US, Australia, Japan, and more
- 📱 **Complete Post Data** - Titles, content, statistics, hashtags, and more
- 💬 **Full Comments** - Extracts all comments including replies and timestamps
- 🖼️ **Image Downloading** - Save all post images locally with original quality
- 🎥 **Video Downloading** - Download videos from video posts
- 🔎 **Detailed Post Analysis** - Navigate to individual posts for complete data
- ♾️ **Infinite Scroll Support** - Collect as many posts as you need
- 🔄 **Proxy Support** - Use Apify proxies for reliable data collection
- 📊 **Detailed Statistics** - View engagement metrics for each post

### 📊 Output Data

The actor outputs comprehensive data in structured JSON format:

```json
{
  "posts": [
    {
      "id": "7412987407534162437",
      "author": {
        "name": "Author Name",
        "followerCount": "35.7K followers",
        "profileUrl": "https://www.lemon8-app.com/@username",
        "profileImageUrl": "https://example.com/profile.jpg"
      },
      "title": "Post Title",
      "content": "Post content preview text...",
      "postUrl": "https://www.lemon8-app.com/@username/post_id",
      "statistics": {
        "savedCount": "2023",
        "likesCount": "6437",
        "commentsCount": "1468"
      },
      "images": [
        {
          "src": "https://example.com/image1.jpg",
          "alt": "Image description"
        },
        {
          "src": "https://example.com/image2.jpg",
          "alt": "Second image description"
        }
      ],
      "comments": [
        {
          "authorName": "Commenter Name",
          "text": "Comment preview text..."
        }
      ],
      "isVideo": false,
      "videoData": null,
      "searchQuery": "Related search query",
      "storedImages": [
        {
          "originalSrc": "https://example.com/image1.jpg",
          "storedUrl": "https://api.apify.com/v2/key-value-stores/default/records/image_7412987407534162437_1.jpg"
        },
        {
          "originalSrc": "https://example.com/image2.jpg",
          "storedUrl": "https://api.apify.com/v2/key-value-stores/default/records/image_7412987407534162437_2.jpg"
        }
      ],
      "details": {
        "title": "Post Title",
        "fullContent": "Post content with full text that's not truncated like in the preview. This includes all paragraphs and formatting from the original post.",
        "hashtags": ["#fashion", "#style", "#trending"],
        "editTime": "2023/10/12 Edited to",
        "statistics": {
          "savedCount": "2023",
          "likesCount": "6437",
          "commentsCount": "1468"
        },
        "galleryImages": [
          {
            "src": "https://example.com/image1.jpg",
            "alt": "Image description"
          },
          {
            "src": "https://example.com/image2.jpg",
            "alt": "Second image description"
          }
        ],
        "searchQuery": "Related search query",
        "relatedTopics": ["fashion trends", "style tips", "outfit ideas"]
      },
      "allComments": [
        {
          "author": "Commenter Name",
          "content": "Comment preview text with the full content not truncated...",
          "time": "2 days ago",
          "likes": "57",
          "replies": [
            {
              "author": "Reply Author",
              "content": "This is a reply to the comment above",
              "time": "1 day ago"
            }
          ]
        },
        {
          "author": "Another Commenter",
          "content": "Another comment on this post",
          "time": "3 days ago",
          "likes": "23",
          "replies": null
        }
      ]
    },
    {
      "id": "7412345678901234567",
      "author": {
        "name": "Video Creator",
        "followerCount": "128K followers",
        "profileUrl": "https://www.lemon8-app.com/@videocreator",
        "profileImageUrl": "https://example.com/creator_profile.jpg"
      },
      "title": "Video Post Example",
      "content": "Check out my new video tutorial...",
      "postUrl": "https://www.lemon8-app.com/@videocreator/video_post_id",
      "statistics": {
        "savedCount": "3489",
        "likesCount": "12763",
        "commentsCount": "873"
      },
      "images": [],
      "comments": [
        {
          "authorName": "Video Fan",
          "text": "Love this tutorial!"
        }
      ],
      "isVideo": true,
      "videoData": {
        "posterUrl": "https://example.com/video_thumbnail.jpg",
        "videoUrl": "https://example.com/video_content.mp4",
        "videoType": "video/mp4",
        "storedPosterUrl": "https://api.apify.com/v2/key-value-stores/default/records/poster_7412345678901234567.jpg",
        "storedVideoUrl": "https://api.apify.com/v2/key-value-stores/default/records/video_7412345678901234567.mp4"
      },
      "searchQuery": "makeup tutorial",
      "details": {
        "title": "Video Post Example - Full Tutorial",
        "fullContent": "Check out my new video tutorial where I show you how to create this amazing look step by step. Follow along and leave your comments below!",
        "hashtags": ["#makeuptutorial", "#beauty", "#lemon8creator"],
        "editTime": null,
        "statistics": {
          "savedCount": "3489",
          "likesCount": "12763",
          "commentsCount": "873"
        },
        "galleryImages": [],
        "searchQuery": "makeup tutorial",
        "relatedTopics": ["beauty tips", "makeup trends", "product reviews"]
      },
      "allComments": [
        {
          "author": "Video Fan",
          "content": "Love this tutorial! Can you do a follow-up with daytime looks?",
          "time": "1 day ago",
          "likes": "85",
          "replies": [
            {
              "author": "Video Creator",
              "content": "Yes! I'll be posting a day look next week!",
              "time": "1 day ago"
            }
          ]
        },
        {
          "author": "Makeup Enthusiast",
          "content": "What brand of foundation are you using?",
          "time": "2 days ago",
          "likes": "42",
          "replies": [
            {
              "author": "Video Creator",
              "content": "I'm using Brand X in shade Y!",
              "time": "1 day ago"
            }
          ]
        }
      ]
    },
    {
      "id": "7413456789012345678",
      "author": {
        "name": "Detailed Post Author",
        "followerCount": "95.2K followers",
        "profileUrl": "https://www.lemon8-app.com/@detailedauthor",
        "profileImageUrl": "https://example.com/detailed_author.jpg"
      },
      "title": "Post With Details",
      "content": "This post has detailed information...",
      "postUrl": "https://www.lemon8-app.com/@detailedauthor/detailed_post_id",
      "statistics": {
        "savedCount": "1593",
        "likesCount": "8275",
        "commentsCount": "427"
      },
      "images": [
        {
          "src": "https://example.com/detailed_image.jpg",
          "alt": "Detailed image"
        }
      ],
      "comments": [
        {
          "authorName": "Initial Commenter",
          "text": "Great post!"
        }
      ],
      "isVideo": false,
      "videoData": null,
      "searchQuery": "lifestyle tips",
      "storedImages": [
        {
          "originalSrc": "https://example.com/detailed_image.jpg",
          "storedUrl": "https://api.apify.com/v2/key-value-stores/default/records/image_7413456789012345678_1.jpg"
        }
      ],
      "details": {
        "title": "Full Detailed Post Title",
        "fullContent": "Complete untruncated post content with all text...",
        "hashtags": ["#lemon8partner", "#lifestyletips", "#organization"],
        "editTime": "2023/10/15 Edited to",
        "statistics": {
          "savedCount": "1593",
          "likesCount": "8275",
          "commentsCount": "427"
        },
        "galleryImages": [
          {
            "src": "https://example.com/detailed_image.jpg",
            "alt": "Detailed image full resolution"
          }
        ],
        "searchQuery": "how to organize your home",
        "relatedTopics": ["home organization", "decluttering", "minimalism"]
      },
      "allComments": [
        {
          "author": "Comment Author 1",
          "content": "Full comment text without truncation...",
          "time": "2 days ago",
          "likes": "42",
          "replies": [
            {
              "author": "Reply Author",
              "content": "Reply text content...",
              "time": "1 day ago"
            }
          ]
        },
        {
          "author": "Comment Author 2",
          "content": "Another complete comment...",
          "time": "3 days ago",
          "likes": "17",
          "replies": null
        }
      ]
    }
  ],
  "metadata": {
    "discoverUrl": "https://www.lemon8-app.com/discover/australia?region=au",
    "totalScraped": 100,
    "scrollsPerformed": 25,
    "limit": 100,
    "region": "au",
    "videoPostsFound": 12,
    "detailedPostsScraped": 10
  }
}
```

#### Available Fields

##### Post Object

- `id` - Unique post identifier
- `author` - Information about the post creator
  - `name` - Author's display name
  - `followerCount` - Number of followers
  - `profileUrl` - URL to author's profile
  - `profileImageUrl` - URL to author's profile image
- `title` - Post title
- `content` - Preview of post content (truncated)
- `postUrl` - Direct URL to the post
- `statistics` - Engagement metrics
  - `savedCount` - Number of saves
  - `likesCount` - Number of likes
  - `commentsCount` - Number of comments
- `images` - Array of post images
  - `src` - Image URL
  - `alt` - Image alt text/description
- `comments` - Preview of post comments (limited number)
  - `authorName` - Commenter's name
  - `text` - Comment content
- `isVideo` - Boolean indicating if post contains video
- `videoData` - Video information (for video posts)
  - `posterUrl` - Thumbnail image URL
  - `videoUrl` - Video file URL
  - `videoType` - Video MIME type
  - `localPosterPath` - Local path to downloaded thumbnail (if saveVideos=true)
  - `localVideoPath` - Local path to downloaded video (if saveVideos=true)
- `searchQuery` - Associated search term
- `localImages` - References to locally saved images (if saveImages=true)
  - `originalSrc` - Original image URL
  - `localPath` - Local file path

##### Details Object (when getDetails=true)

- `title` - Complete post title
- `fullContent` - Complete untruncated post content
- `hashtags` - Array of hashtags used in the post
- `editTime` - When the post was last edited
- `statistics` - Detailed engagement metrics
- `galleryImages` - Full resolution images
- `searchQuery` - Associated search query
- `relatedTopics` - Related topics and hashtags

##### All Comments (when getDetails=true)

- `author` - Commenter's name
- `content` - Full comment text
- `time` - When comment was posted (e.g., "16 hours ago")
- `likes` - Number of likes on comment
- `replies` - Array of replies to the comment
  - `author` - Reply author's name
  - `content` - Reply text
  - `time` - When reply was posted

##### Metadata

- `discoverUrl` - URL used for scraping
- `totalScraped` - Total number of posts scraped
- `scrollsPerformed` - Number of page scrolls executed
- `limit` - Maximum posts requested
- `region` - Region code used
- `videoPostsFound` - Number of video posts found
- `detailedPostsScraped` - Number of posts with detailed data

### 📁 Where to Find Your Data

#### Apify Platform

- **Dataset** - The complete JSON data is stored in the default dataset
- **Key-Value Store** - Find `RESULTS.json` and `METADATA.json` in the default key-value store
- **Media Files** - When `saveImages` or `saveVideos` is enabled:
  - Files are stored in the default key-value store with keys like:
    - `image_[POST_ID]_[INDEX].jpg`
    - `video_[POST_ID].mp4`
    - `poster_[POST_ID].jpg`
  - Media URLs are included in the dataset results:
    ```json
    {
      "storedImages": [
        {
          "originalSrc": "https://example.com/original.jpg",
          "storedUrl": "https://api.apify.com/v2/key-value-stores/..."
        }
      ],
      "videoData": {
        "storedVideoUrl": "https://api.apify.com/v2/key-value-stores/...",
        "storedPosterUrl": "https://api.apify.com/v2/key-value-stores/..."
      }
    }
    ```
- **Custom Datasets** - If you specified a custom dataset name, the data will be there

#### Storage Limits

- Be mindful of Apify's storage limits when saving media files
- For large-scale scraping with many images/videos, consider:
  - Using Apify's Persistent Storage
  - Setting up webhook integration to process files
  - Implementing AWS S3 or other external storage solutions

### 🚀 How to Use

#### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape — the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record — not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Options

| Option | Type | Description |
|--------|------|-------------|
| `searchTerm` | String | Search term to use (default: "fashion") |
| `region` | String | Region code (default: "us") |
| `limit` | Number | Maximum posts to extract (default: 2) |
| `saveImages` | Boolean | Download images locally (default: false) |
| `saveVideos` | Boolean | Download videos locally (default: false) |
| `getDetails` | Boolean | Get detailed post data (default: false) |
| `detailsLimit` | Number | Limit for detailed post scraping (default: 2) |
| `resumeFromRunId` | String | Continue one interrupted run/dataset without re-collecting or re-charging its posts |
| `incrementalMode` | Boolean | Turn on for recurring monitoring — classifies each post as NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED against the previous run (default: false) |
| `stateKey` | String | Name a monitoring campaign explicitly; otherwise the state key is derived from searchTerm/startUrls + region + getDetails |
| `emitUnchanged` | Boolean | Also return (and bill) UNCHANGED posts every run (default: false) |
| `emitExpired` | Boolean | Also return (and bill) posts no longer found, once a run fully scans every target (default: false) |

#### 🔁 Resume & recurring updates

Two different features, both opt-in:

- **Resume** (`resumeFromRunId`) continues ONE specific interrupted run: paste a previous run ID or dataset ID and this run skips posts it already collected.
- **Incremental mode** (`incrementalMode`) is for scheduling this actor on a recurring basis against the same search. The actor remembers what it saw last time (keyed by `stateKey`, or an automatic key derived from searchTerm/startUrls + region + getDetails) and adds four fields to every dataset row:

```json
{
  "changeType": "NEW",
  "changedFields": [],
  "firstSeenAt": "2026-07-30T03:00:00Z",
  "lastSeenAt": "2026-07-30T03:00:00Z"
}
```

`changeType` is one of `NEW`, `UPDATED`, `UNCHANGED`, `REAPPEARED`, `EXPIRED`. `UNCHANGED` and `EXPIRED` posts are suppressed (not returned or billed) unless you turn on `emitUnchanged` / `emitExpired`. `EXPIRED` posts are only produced once a run has scanned every tracked search term/Start URL to its natural end — a Post Limit cap, a block, or `resumeFromRunId` all skip EXPIRED detection for that run rather than risk a false tombstone. These fields never appear when `incrementalMode` is off.

#### Available Regions

| Code | Region Name |
|------|-------------|
| us   | United States |
| au   | Australia |
| nz   | New Zealand |
| jp   | Japan (日本) |
| th   | Thailand (ไทย) |
| id   | Indonesia |
| vn   | Vietnam (Việt Nam) |
| my   | Malaysia |
| sg   | Singapore |
| ca   | Canada |

### 💡 Use Cases

- **Content Research** - Analyze trending topics and styles on Lemon8
- **Influencer Analysis** - Monitor engagement and content strategies
- **Market Research** - Track product mentions and consumer sentiment
- **Competitor Monitoring** - Keep an eye on competing brands
- **Content Inspiration** - Discover popular formats and approaches
- **Data Visualization** - Create reports and dashboards from structured data

### 🔍 Advanced Features

#### Detailed Post Extraction

Enable `getDetails: true` to navigate to each post's page and extract:

- Complete post content (not just previews)
- All comments including replies
- Full resolution images
- Related hashtags and topics
- Edit history information

#### Media Downloading

When you enable `saveImages` or `saveVideos`, the actor will download all media files to your storage. This is perfect for:

- Creating content archives
- Building training datasets
- Conducting visual analysis
- Preserving content for offline use

### Crash Recovery & Rerun

This actor uses Apify's Request Queue for state persistence during detail fetching:

- **Resume after crash**: Simply **Resurrect** the failed run - it will continue from unprocessed posts
- **Start fresh**: Set `clearStorage: true` in input, or start a new run (not resurrect)

#### How it works:

1. All post URLs are added to a persistent Request Queue before processing details
2. Each post is marked as "handled" only after successful extraction
3. Each post is saved to the dataset immediately (incremental saves)
4. On restart, only unhandled requests are processed

#### Input Options for Recovery

| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `clearStorage` | Boolean | `false` | Clear request queue and start fresh (ignore previous progress) |

# Actor input Schema

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

Keyword to search for on Lemon8. Used only when Start URLs is empty.

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

Lemon8 discovery/experience URLs to scrape, e.g. https://www.lemon8-app.com/discover/fashion?region=us . When provided, these take precedence over Search Term: each URL's keyword and region are parsed and scraped (up to Post Limit posts per URL). Leave empty to search by Search Term instead.

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

Target region for Lemon8 content

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

Maximum number of posts to extract (max 500)

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

Navigate to individual post pages to extract full content and all comments

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

Maximum number of posts to get detailed data for

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

Maximum time in seconds to spend expanding comments on each post. Posts with many comments may timeout.

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

Paste a previous run ID or dataset ID to continue a large pull of posts without returning or charging for posts already collected there. Use this after an interrupted run, or when continuing a search pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead.

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

Turn this on for daily or recurring monitoring. The first run returns all matching posts as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED posts. Turn on "Emit unchanged" or "Emit expired" only when you also want those posts returned (and billed). State is kept separately for each search term/Start URL, region, and Get Detailed Post Data setting; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.

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

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search term/Start URLs, region, and Get Detailed Post Data setting — different search setups then never mix state with each other.

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

Off by default. Turn on to also return posts that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.

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

Off by default. Turn on to also return posts that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned every tracked search term/Start URL — not when Post Limit capped it, or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.

## `saveImages` (type: `boolean`):

Download post images locally

## `saveVideos` (type: `boolean`):

Download videos from video posts

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

Proxy for requests. Defaults to Apify datacenter (US); if the datacenter tunnel is unavailable or gets blocked, the actor automatically falls back to a backup proxy pool.

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

Transform the resulting output. Select only needed fields. For nested object use DOT (e.g., 'statistics.rating'). For nested array use NUMBER as array index (e.g., 'comments.0.text').

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

Save results into custom named Dataset. Use masks to customize: {ACTOR} = actor name, {DATE} = date (YYYYMMDD), {TIME} = time (HHMMSS). Example: 'lemon8-{DATE}' will create 'lemon8-20250519'.

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

Clear Dataset before inserting new data

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "searchTerm": "fashion",
  "startUrls": [],
  "region": "us",
  "limit": 2,
  "getDetails": true,
  "detailsLimit": 2,
  "commentExpansionTimeout": 30,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "saveImages": false,
  "saveVideos": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  },
  "dev_transform_fields": [],
  "dev_dataset_name": "default",
  "dev_dataset_clear": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

Main discovery post records with author, URL, search query, media type, and engagement counts.

## `images` (type: `string`):

Image-focused view for scraped Lemon8 discovery posts.

## `videos` (type: `string`):

Video discovery posts and video metadata where available.

## `authors` (type: `string`):

Author profile fields collected from discovery post records.

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

Comments and expanded comment data when detail scraping is enabled.

## `detailedContent` (type: `string`):

Full post content, hashtags, related topics, and detail fields.

## `engagement` (type: `string`):

Saved, likes, comments, and detailed engagement fields.

## `completeOutput` (type: `string`):

Post-level output stored in the default key-value store.

## `metadata` (type: `string`):

Run metadata with search count, post count, and scraping summary fields.

# 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": "fashion",
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/lemon8-discover-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": "fashion",
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/lemon8-discover-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": "fashion",
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}' |
apify call abotapi/lemon8-discover-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/lemon8-discover-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/A3ugHq174iKd7kG4F/builds/1YEgMHFelTS4hbfCD/openapi.json
