Lemon8 Profile Scraper: Posts, Engagement, Comments & Media avatar

Lemon8 Profile Scraper: Posts, Engagement, Comments & Media

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Lemon8 Profile Scraper: Posts, Engagement, Comments & Media

Lemon8 Profile Scraper: Posts, Engagement, Comments & Media

Scrape Lemon8 user profiles with automated multi-profile discovery. Extract profile data, detailed posts, engagement metrics, comments, and high-quality images and videos with download support. Built for influencer research, content analysis, and media archiving.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

2

Bookmarked

58

Total users

8

Monthly active users

4 hours ago

Last modified

Share

Lemon8 Profile Scraper: Posts, Media, Engagement and Following Data

Lemon8 Profile Scraper turns any Lemon8 creator profile into structured data. Give it a username, a profile link, or a list of profile links, and get back every post's title, content, hashtags, images and comments, plus engagement counts, the creator's bio, follower and following numbers, and optionally the accounts they follow. Export the results to JSON, CSV or Excel, or pull them straight into your app through the API.

Why This Scraper?

  • Three ways to target a profile. Scrape one profile by username, paste a full profile link, or list many profile links at once. A clear precedence order means you always know which input wins.
  • Full post extraction. Title, content, hashtags, publish date and, when Get Detailed Post Data is on, the complete comment thread with replies.
  • Profile context included. Bio, follower and following counts, verification status and total post count come back with every profile, not just the posts.
  • Network mapping. Turn on Scrape Following Profiles to also collect the accounts a creator follows.
  • Media on demand. Optionally save every post's images and videos into the run's storage instead of only linking to them.
  • 11 regions. Scrape the US, Australia, Japan, the Philippines and seven other Lemon8 storefronts by changing one field.
  • Built for schedules. Incremental mode returns only new and changed posts on recurring runs, Resume continues an interrupted pull without re-billing, and a refused run fails loudly instead of returning an empty dataset.

Use Cases

  • Creator and influencer research: track a profile's bio, follower growth and post cadence over time.
  • Content and trend analysis: pull full post text, hashtags and images across a set of profiles to spot recurring topics.
  • Network mapping: use Scrape Following Profiles to see who a creator follows and build an account graph.
  • Media archiving: save every image and video attached to a profile's posts.
  • Recurring monitoring: schedule incremental runs to catch new posts and edits without re-collecting everything each time.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
id"7123456789012345678"
author.name"Sample Creator"
author.profileUrl"/@sample_creator123?region=us"
author.profileImageUrl"https://p16-lemon8.byteimg.com/sample-avatar.jpeg"
author.userId"6800000000000000001"
title"Sample post title"
content"Short preview text pulled from the post card..."
postUrl"https://www.lemon8-app.com/@sample_creator123/7123456789012345678?region=us"
imageUrl"https://p16-lemon8.byteimg.com/sample-cover.jpeg"
images[{ "src": "https://...", "alt": "" }]
isVideofalse (also true for video posts)
statistics.likesCount"450"
statistics.savedCount / statistics.commentsCount"0" on the post summary; the real counts are under details.statistics below
details.fullContent"The full post body text appears here..."
details.hashtags["#sampletag", "#lemon8"]
details.publishedAt"2025-01-15T09:30:00Z"
details.editTime"1/16" (last edit, no year)
details.statistics.savedCount / .likesCount / .commentsCount / .viewsCount"8" / "31" / "2" / "1500"
details.relatedTopics["Sample Topic"]
comments / allCommentsfirst 5, and the full list, each with author, content, commentId
commentStats.totalComments / .totalReplies12 / 4
changeType"NEW" (also "UPDATED", "UNCHANGED", "REAPPEARED", "EXPIRED"; incremental mode only)

Profile-level fields, the account name, bio, follower and following counts, verification badge, social links and the optional following list, are written once per run to the run's key-value store (OUTPUT and METADATA records) rather than as separate dataset rows.

Flat alias fields. Each post row also carries flat copies of common fields, so spreadsheets and other Lemon8 scrapers' schemas line up: groupId, url, articleClass, likes, saves, commentCount, authorUserId, authorUsername, authorNickname, authorAvatar, authorFollowers, videoUrl, thumbnailUrl, hashtags, topComments, keyword (the profile handle), category (always null for profile posts), region, sourceMode (profile or post) and scrapedAt. saves, commentCount, videoUrl, hashtags and topComments need Get details. They never change the Incremental-mode verdict, so turning them on does not re-bill tracked posts. The United Kingdom storefront is not offered because Lemon8 serves the US storefront for it.

How to Use

  1. Pick how to target a profile: Username for one profile, Profile URL for one profile by link, or Start URLs for several profiles at once. Start URLs wins over Profile URL, which wins over Username.
  2. Set Post Limit and Region, then turn on Get Detailed Post Data for full content, hashtags and comments (its own Details Post Limit caps how many posts get this treatment).
  3. Optionally turn on Scrape Following Profiles, and Save Images / Save Videos to store post media in the run's storage.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read the profile bio and following list from the run's key-value store.

Single profile by username:

{
"username": "sample_creator123",
"region": "us"
}

Single profile by link, with full detail and media:

{
"profileUrl": "https://www.lemon8-app.com/@sample_creator123?region=us",
"limit": 50,
"getDetails": true,
"detailsLimit": 20,
"saveImages": true
}

Several profiles at once, plus following:

{
"startUrls": [
"https://www.lemon8-app.com/@sample_creator123?region=us",
"https://www.lemon8-app.com/@sample_traveler88?region=au"
],
"getFollowing": true,
"followingLimit": 10
}

Scheduled incremental monitoring:

{
"username": "sample_creator123",
"region": "us",
"incrementalMode": true,
"emitUnchanged": false
}

Start URLs accepts these shapes. If you leave Start URLs untouched it is pre-filled with one example of each shape below, so a run with no changes scrapes all of them (before this change an untouched Start URLs scraped nothing and used Username instead). If you set a different Username or a Profile URL while Start URLs is still the untouched example list, your Username or Profile URL is used instead. Duplicate targets (for example a profile with and without ?region=us) are scraped once. Posts are also de-duplicated across targets for the whole run: a post that several targets reach (the same profile in two regions, a profile and its following-list link, a profile and one of its posts) is saved and billed once, from the first target in your list that returns it, and is not fetched for details again. In incremental mode this keeps the post's saved fields stable between runs, so the example list reports no changes on a repeat run with unchanged data.

ShapeExampleWhat you get
Profile, region queryhttps://www.lemon8-app.com/@sydneydelreyy?region=usProfile info and posts
Profile, no regionhttps://www.lemon8-app.com/@sydneydelreyySame, region from the Region input
Profile, other regionhttps://www.lemon8-app.com/@sydneydelreyy?region=caSame, in that region
Posthttps://www.lemon8-app.com/@sydneydelreyy/7499465815561994794?region=usThat one post with full details and comments
Post, no regionhttps://www.lemon8-app.com/@sydneydelreyy/7499465815561994794Same
Following listhttps://www.lemon8-app.com/@sydneydelreyy/follow?region=usThe profile's posts plus the accounts it follows (Following Profiles Limit applies)

Other regions, the m.lemon8-app.com host and the bare lemon8-app.com host are tried but logged as unverified shapes and may return nothing. Links without an /@user part (such as /tag/...) are skipped with a warning in the run log.

Output views

The dataset has these views: Overview, Images, Videos, Authors, Comments, Detailed content, Engagement, Following profiles and, for Incremental mode runs, Changes (changeType, changedFields, firstSeenAt, lastSeenAt).

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/lemon8-profile-scraper").call(run_input={"username": "sample_creator123", "region": "us"})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
print(post["title"], post["statistics"]["likesCount"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/lemon8-profile-scraper').call({ username: 'sample_creator123', region: 'us' });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Get Detailed Post Data and cost

Post cards alone only carry a title, content preview, image and like count. Turning on Get Detailed Post Data fetches each post's own page for full content, hashtags, publish date, save and comment counts, and the comment thread, up to Details Post Limit posts. The actor spends up to 30 seconds expanding each post's comment thread, so posts with very large comment sections may come back with a partial thread. At most 1000 comments are collected per post.

Resume and recurring updates

Two different things, both off by default:

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset id and this run skips posts already collected there, so you are not charged twice.
  • Incremental mode (incrementalMode) is for scheduling this actor on the same profile(s) again and again. Each post is classified NEW, UPDATED, UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED (only after a run that fully scanned every tracked profile, and only with emitExpired). What is compared: every returned post field (text, title, images, author, comments, saved/likes/comments counters, details). What is excluded: signed-URL tokens and CDN host numbers on image and video links, comment ordering, files re-saved by Save Images/Videos, and the view counter (details.statistics.viewsCount); ignoreFieldsForChanges adds your own exclusions without a one-time wave of UPDATED rows, because the stored baseline is re-compared with the current list. A Post Limit cap or a blocked profile never produces EXPIRED rows. stateKey names or shares the stored state; leaving it empty derives one from the profile set, region and Get Detailed Post Data setting. The two features cannot be combined on a profile set that already has incremental state; use a different State key to start a separate campaign instead.

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 post, 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 mcpConnectors input field. If the picker is empty, you have not authorized a connector yet.
  3. For Notion, also set notionParentPageUrl to the page where items should be created. maxNotifyListings caps how many posts are sent per run.

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 Parameters

ParameterTypeDefaultDescription
usernamestring(required)Lemon8 username to scrape, without the @. Ignored if profileUrl is set.
startUrlsarrayone example per supported shapeLemon8 profile, post or following-list links (see the table above), up to Post Limit posts per profile. Takes precedence over profileUrl and username.
profileUrlstring(none)Full profile link for a single profile. Takes precedence over username, ignored if startUrls is set.
regionstringusTarget Lemon8 region: us, au, nz, jp, th, id, vn, my, sg, or ca.
limitinteger5Maximum posts to extract per profile, up to 5000.
getDetailsbooleantrueFetch each post's own page for full content, hashtags, publish date and comments.
detailsLimitinteger5Maximum posts per profile to fetch full details for, up to 3000.
commentExpansionTimeoutinteger30Currently not applied: the actor always uses a 30 second budget per post, whatever value is set here.
resumeFromRunIdstring(none)Continue one interrupted run without re-returning or re-billing posts already collected there.
incrementalModebooleanfalseReturn only new, updated and reappeared posts on recurring scheduled runs.
stateKeystring(none)Name or share an incremental-mode state; derived automatically when left empty.
emitUnchangedbooleanfalseIncremental mode only: also return (and bill) posts unchanged since the last run.
emitExpiredbooleanfalseIncremental mode only: also return (and bill) posts no longer found, once a run fully scans every tracked profile.
ignoreFieldsForChangesarray[]Incremental mode only: field names (bare name = any depth, or dotted path such as details.statistics.likesCount) that never count as a change and are left out of changedFields. They stay on every returned row.
getFollowingbooleanfalseAlso scrape the profiles this account follows.
followingLimitinteger2Maximum following profiles to scrape.
saveImagesbooleanfalseDownload post images into the run's storage.
saveVideosbooleanfalseDownload post videos into the run's storage.
proxyobjectprefilled Apify Proxy, USConnection settings; falls back automatically if the first connection is refused.
dev_transform_fieldsarray[]Keep only these dot-notation fields (e.g. statistics.likesCount) in the pushed output.
dev_dataset_namestringdefaultSave results into a custom named dataset; supports {ACTOR}, {DATE}, {TIME} placeholders.
dev_dataset_clearbooleanfalseClear the target dataset before this run's results are inserted.
mcpConnectorsarray(none)Optional: send a summary of each post to apps authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on posts written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"id": "7123456789012345678",
"author": {
"name": "Sample Creator",
"profileUrl": "/@sample_creator123?region=us",
"profileImageUrl": "https://p16-lemon8.byteimg.com/sample-avatar.jpeg",
"userId": "6800000000000000001"
},
"title": "Sample post title",
"content": "Short preview text pulled from the post card...",
"postUrl": "https://www.lemon8-app.com/@sample_creator123/7123456789012345678?region=us",
"imageUrl": "https://p16-lemon8.byteimg.com/sample-cover.jpeg",
"statistics": {
"savedCount": "0",
"likesCount": "450",
"commentsCount": "0"
},
"images": [
{ "src": "https://p16-lemon8.byteimg.com/sample-cover.jpeg", "alt": "" }
],
"isVideo": false,
"details": {
"title": "Sample post title",
"fullContent": "The full post body text appears here, hashtags stripped of markup...",
"hashtags": ["#sampletag", "#lemon8"],
"editTime": "1/16",
"publishedAt": "2025-01-15T09:30:00Z",
"statistics": {
"savedCount": "8",
"likesCount": "31",
"commentsCount": "2",
"viewsCount": "1500"
},
"galleryImages": [
{ "src": "https://p16-lemon8.byteimg.com/sample-gallery-1.jpeg", "alt": "" }
],
"relatedTopics": ["Sample Topic"],
"isVideo": false,
"videoData": null
},
"comments": [
{ "author": "Sample Commenter", "authorTag": null, "content": "Sample comment text", "time": "1/16", "likes": "3", "replies": null, "commentId": "7123456789012345679" }
],
"allComments": [
{ "author": "Sample Commenter", "authorTag": null, "content": "Sample comment text", "time": "1/16", "likes": "3", "replies": null, "commentId": "7123456789012345679" }
],
"commentStats": {
"totalComments": 12,
"totalReplies": 4
}
}

In incremental mode only, every row also carries changeType, changedFields, firstSeenAt and lastSeenAt. These fields never appear on a normal, non-incremental run.

Plan Requirement

Lemon8 limits how many pages a single connection can read before it answers with an empty block page, so the actor is built to move between connections on its own. Datacenter and residential Apify Proxy access have not been measured against this site, so this page does not promise that any one proxy group works without action. The default proxy setting is the starting point, and the actor automatically moves to a backup connection when one is refused or the site answers with an empty block page.

What you will see in the run log:

  • If the selected connection is unavailable (for example Apify free plans, which do not include residential proxies), the log says "The selected connection is unavailable to this run" and "Continuing on a backup connection; some pages may still be unavailable", and points to https://apify.com/pricing or your own proxy URLs.
  • When the backup serves the pages, the log says "Served over the backup connection (the default connection was unavailable)."
  • If the proxy connection is refused for the account, the run stops with "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required", and nothing is charged.
  • If no connection can load the pages, the run stops with "No results: residential proxies are unavailable on this run ... and the backup connection could not load the requested Lemon8 pages", or "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search."

For large or frequent pulls across many profiles, use a paid plan or your own proxy URLs, and check the actor's Pricing tab for current rates before running at scale.

FAQ

How much does it cost?

You pay per post returned. The Pricing tab on the actor page shows the current rates. Use Post Limit to cap the cost of any run.

This actor collects only publicly available profile and post data. You are responsible for how you use it: follow Lemon8's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution of the results.

What is the difference between Resume and Incremental mode?

Resume continues one specific interrupted run from a pasted run or dataset id. Incremental mode is for scheduling this actor on the same profile(s) again and again and getting only what changed. They solve different problems and cannot be combined on a profile set that already has saved incremental state; use a separate State key to start a new campaign if you need both.

Why did my run fail instead of returning an empty dataset?

If every request to a profile page is refused, the run stops with a clear message and nothing is charged, so a blocked run is never confused with a profile that genuinely has no posts. Try again later, pick a different proxy country, or supply your own proxy URLs. On Apify free plans, which do not include residential proxies, a backup connection is used automatically. A profile that truly has zero posts, or that does not exist, succeeds quietly with an empty dataset instead.

Can I get only new 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 billed unless you turn that on too.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the mcpConnectors field to push a summary of each post into Notion, Linear or Airtable.

πŸ”— Want more Lemon8 data?

Pair this actor with these related scrapers from the same team:

πŸ“± Lemon8 Search Scraper
Scrape Lemon8 posts by keyword across multiple regions. Extract posts, images, videos...
πŸ“± Lemon8 Feed Scraper
Scrape Lemon8 feeds across 22 categories and 10+ regions. Extract posts, images, videos...
πŸ“± Lemon8 Media Scraper
Lightweight Lemon8 scraper for extracting image and video URLs from posts, with optional...
πŸ“± Truth Social Scraper
Scrape public Truth Social profiles, posts, media, metrics, author data, and complete...
πŸ“± Reddit⚑ Lightning
From $1/1K. Scrape Reddit posts, comments, and media from any subreddit or user profile -...
🧩 Pikabu Scraper
Scrape Pikabu (ΠŸΠΈΠΊΠ°Π±Ρƒ): keyword search, hot/new/best feeds, communities, tags, full story...

πŸ‘‰ Browse all abotapi scrapers

πŸ’¬ Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • πŸ› οΈ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.