Lemon8 Search Scraper at a glance
Lemon8 Search Scraper is a ready-to-run Apify actor from abotapi for collecting social media data. Its documented output includes id, title, content, author and followers, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Social Media, Developer Tools, Automation
- Pricing
- $2.20 per 1,000 results (Free plan), from $1.80 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 26 options
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.
What Lemon8 Search Scraper can do
- Five ways to target content. Search by keyword and region, paste discovery or post links, crawl home-feed categories, or scrape an author's profile posts; each link's keyword and region are parsed automatically.
- Full post detail on demand. Turn on Get Detailed Post Data for untruncated post text, hashtags, related topics, edit history and real engagement counts.
- Complete comment threads. Expand every comment and its replies for a post, with a running total of comments and replies collected.
- 12 regional storefronts. United States, Australia, New Zealand, Japan, Thailand, Indonesia, Vietnam, Malaysia, Singapore, Canada, United Kingdom and Philippines (the site may serve little or nothing for some regions).
- Built for schedules. Incremental mode returns only new, updated and reappeared posts on recurring runs, and a run that could not read the discovery page fails loudly instead of quietly returning an empty dataset.
- Resume large pulls. Continue an interrupted run from its run or dataset ID to pick up where it left off.
Choose what to collect
These inputs let you configure Lemon8 Search Scraper - Posts, Comments & Media. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
searchTermstring · required | Keyword to search for on Lemon8. Used only when Start URLs is empty. |
startUrlsarray | Lemon8 URLs to scrape: discovery/experience search pages (/discover/, /experience/, with or without ?region=) and single post pages (/@/). When edited, these take precedence over Search Term. In Scrape mode "auto" the untouched example list below is ignored (treated as not supplied) so runs that omit this field keep searching by Search Term; Scrape mode "url" scrapes it as given. Author profile pages (/@) are scraped as profile targets. |
modestring | What to scrape. "auto" (default) keeps the classic behaviour: Start URLs when edited, otherwise Search Term / Keywords. "search" = keyword search, "url" = Start URLs only, "feed" = home-feed categories, "profile" = author profile posts, "post" = single post pages. |
keywordsarray | Search several keywords in one run (each one is searched in the selected Region; Post Limit applies per keyword). Empty = use Search Term. |
feedCategoriesarray | Home-feed categories to scrape when Scrape mode is "feed" (empty = foryou). Post Limit applies per category. |
profileUrlsarray | Lemon8 author profile pages (https://www.lemon8-app.com/@name) or @names. Used when Scrape mode is "profile" (or "auto"). Post Limit applies per profile. |
postUrlsarray | Single Lemon8 post pages (https://www.lemon8-app.com/@name/). Used when Scrape mode is "post" (or "auto"). |
Show 19 more inputs
| Input | What it controls |
|---|---|
regionstring | Target region for Lemon8 content |
limitinteger | Maximum number of posts to extract (max 500) |
getDetailsboolean | Navigate to individual post pages to extract full content and all comments |
detailsLimitinteger | Maximum number of posts to get detailed data for |
commentExpansionTimeoutinteger | Maximum time in seconds to spend expanding comments on each post. Posts with many comments may timeout. |
saveImagesboolean | Download post images locally |
saveVideosboolean | Download videos from video posts |
dev_transform_fieldsarray | 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_namestring | 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_clearboolean | Clear Dataset before inserting new data |
resumeFromRunIdstring | 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. |
incrementalModeboolean | 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). A post counts as UPDATED when any of its fields changes (title, text, hashtags, like/comment counts, comments, media); a re-signed or re-sharded image/video CDN address of the same file never does. Fields listed in Ignore fields are excluded from the comparison but stay in the output. 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. |
stateKeystring | 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. |
emitUnchangedboolean | 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. |
emitExpiredboolean | 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. |
ignoreFieldsForChangesarray | Incremental mode only. Field names (or dot paths such as details.videoData.videoUrl; arrays are searched element by element) that never make a post UPDATED and never appear in changedFields. The fields stay in the output. Use it for values you do not want to trigger an update, for example statistics.likesCount or commentStats. Changing this list does not re-flag your existing posts. |
mcpConnectorsarray | 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). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)titleTitle (text)contentContent (text)author.nameAuthor (text)author.followerCountFollowers (text)postUrlURL (link)statistics.savedCountSaves (text)statistics.likesCountLikes (number)statistics.commentsCountComments (number)isVideoIs Video (boolean)searchQuerySearch Query (text)imagesImages (json)Show 14 more fields
videoDataVideo Data (json)author.profileUrlProfile URL (link)author.profileImageUrlProfile Image (image)topCommentsPreview Comments (json)allCommentsAll Comments (json)details.fullContentFull Content (text)details.hashtagsHashtags (json)details.editTimeLast Edited (text)details.relatedTopicsRelated Topics (json)details.statisticsDetailed Stats (json)changeTypeChange (text)changedFieldsChanged Fields (json)firstSeenAtFirst Seen (text)lastSeenAtLast Seen (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "7412987407534162437",
"author": {
"name": "Sample Creator",
"followerCount": null,
"profileUrl": "https://www.lemon8-app.com/@sample_creator?region=us",
"profileImageUrl": "https://p16-sign-va.tiktokcdn.com/sample-avatar.jpg"
},
"title": "Weekend Outfit Ideas",
"content": "A quick roundup of what I wore this weekend, from brunch to a night out...",
"postUrl": "https://www.lemon8-app.com/@sample_creator/7412987407534162437?region=us",
"statistics": {
"savedCount": "0",
"likesCount": "482",
"commentsCount": "0"
},
"images": [
{
"src": "https://p16-sign-va.tiktokcdn.com/sample-image-1.jpg",
"alt": ""
},
{
"src": "https://p16-sign-va.tiktokcdn.com/sample-image-2.jpg",
"alt": ""
}
],
"comments": [],
"isVideo": false,
"videoData": null,
"searchQuery": "fashion",
"details": {
"title": "Weekend Outfit Ideas",
"fullContent": "A quick roundup of what I wore this weekend, from brunch to a night out. Full untruncated post text goes here.",
"hashtags": [
"#fashion",
"#ootd",
"#weekendstyle"
],
"editTime": "9/28",
"statistics": {
"savedCount": "312",
"likesCount": "482",
"commentsCount": "37"
},
"galleryImages": [
{
"src": "https://p16-sign-va.tiktokcdn.com/sample-image-1.jpg",
"alt": ""
},
{
"src": "https://p16-sign-va.tiktokcdn.com/sample-image-2.jpg",
"alt": ""
}
],
"searchQuery": null,
"relatedTopics": [
"outfit ideas",
"fall fashion"
],
"isVideo": false,
"videoData": null
},
"allComments": [
{
"author": "Sample Commenter",
"authorTag": null,
"content": "Love this look!",
"time": "9/27",
"likes": "12",
"replies": [
{
"author": "Sample Creator",
"content": "Thank you!",
"time": "9/27",
"tag": null
}
]
}
],
"commentStats": {
"totalComments": 37,
"totalReplies": 9,
"previewCommentCount": 0
}
}Ways to use this data
- Content and trend research: track which topics, hashtags and post formats are performing on Lemon8 right now.
- Creator and influencer analysis: monitor a creator's posting cadence, engagement and comment sentiment over time.
- Brand and competitor monitoring: watch how a product, campaign or hashtag is discussed across regions.
- Regional market research: compare topic popularity for lifestyle, beauty or fashion content across storefronts.
- Dataset building: collect posts, images and comment threads for archives, reports or model training data.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Lemon8 Search Scraper return?
The documented output for Lemon8 Search Scraper includes id, title, content, author, followers, url, saves and likes. Availability of each field depends on the source page and the selected mode.
How much does Lemon8 Search Scraper cost?
It costs $2.20 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Is there a cap on comments per post?
No fixed count. With Get Detailed Post Data on, the actor expands the comment thread and replies for up to Details Post Limit posts, spending at most Comment Expansion Timeout seconds per post; a very large thread can be cut short by that timeout.
Can I get only new or changed posts on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared posts, and unchanged ones are not returned or billed unless you turn on Emit unchanged.
Why do a post's saved and comment counts show 0?
The discovery feed itself only reports a like count, so statistics.savedCount and statistics.commentsCount are "0" at the top level of search, feed and profile rows (post-mode rows already carry the real counts there). Turn on Get Detailed Post Data and the real saved, like and comment counts appear in details.statistics for each detailed post (up to Details Post Limit).
Why did my run fail instead of returning an empty dataset?
If Start URLs is set but none of its entries is a recognizable Lemon8 discovery link, or if every request to the discovery page was refused or timed out, the run fails with a specific, actionable message and no dataset item is billed (the per-run start fee still applies). A search or region that genuinely has no matching posts is a different case: the run still succeeds, and simply returns nothing.
