Lemon8 Profile Scraper at a glance
Lemon8 Profile 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.40 per 1,000 results on the Apify Free plan and from $2.00 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, Automation, Developer Tools
- Pricing
- $2.40 per 1,000 results (Free plan), from $2.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 24 options
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.
What Lemon8 Profile Scraper: Posts, Engagement, Comments & Media can do
- 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.
Choose what to collect
These inputs let you configure Lemon8 Profile Scraper: Posts, Engagement, Comments & Media. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
usernamestring · required | Lemon8 username to scrape, without the '@'. Ignored if a Profile URL is provided below. |
startUrlsarray | Lemon8 URLs to scrape. Supported: a profile (/@user, with or without ?region=), a single post (/@user/) and a following list (/@user/follow). Left untouched, this scrapes one example of each shape. Unverified shapes (other regions, m. or bare host) are tried with a warning; /tag/ and feed links are skipped with a warning. Takes precedence over Username and Profile URL, unless it is still the untouched example list and you set a different Username or a Profile URL. |
profileUrlstring | Full profile URL for a SINGLE profile, e.g. https://www.lemon8-app.com/@username?region=us. Takes precedence over Username. Ignored if Start URLs is provided. |
regionstring | Target region for Lemon8 content |
limitinteger | Maximum number of posts to extract per profile (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 |
Show 17 more inputs
| Input | What it controls |
|---|---|
commentExpansionTimeoutinteger | Maximum time in seconds to spend expanding comments on each post. Posts with many comments may timeout. |
getFollowingboolean | Automatically scrape profiles that the main user is following |
followingLimitinteger | Maximum number of following profiles to scrape |
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 pull for the same profile(s) in another run. For recurring daily monitoring of the same profile(s), 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). State is kept separately for each username/Profile URL/Start URLs set, region, and Get Detailed Post Data setting; use State key when you want to name or deliberately share a monitoring campaign. UPDATED means the post's own content changed. Compared: every returned post field (text, title, images, author, comment lists, saved/likes/comments counters, details). Excluded: signed-URL tokens and CDN host numbers on image/video links, comment order, files re-saved by Save Images/Videos, and the view counter (details.statistics.viewsCount); add your own with "Ignore fields when detecting changes". Details: the post's view counter (details.statistics.viewsCount) is a live engagement number that keeps ticking on its own, so a post whose view count alone moved stays UNCHANGED and is not returned or billed again. The current view count is still on every returned row. 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 username/Profile URL/Start URLs, region, and Get Detailed Post Data setting, different profile 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 profile, 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 that must NOT count as a change when deciding NEW vs UPDATED vs UNCHANGED, and are left out of changedFields. A bare name (e.g. savedCount) is ignored at any depth; a dotted path (e.g. details.statistics.likesCount) ignores just that field. The ignored fields still appear, with their current values, on every returned row. Applied to the stored baseline too, so changing this list never triggers a one-time wave of UPDATED rows. Leave empty to use the built-in rules (see Incremental changes above). |
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)searchQuerySearch Query (text)imagesImages (json)details.videoDataVideo Data (json)Show 22 more fields
author.profileUrlProfile URL (link)author.profileImageUrlProfile Image (image)commentsPreview Comments (json)allCommentsAll Comments (json)details.fullContentFull Content (text)details.hashtagsHashtags (json)details.editTimeLast Edited (text)details.relatedTopicsRelated Topics (json)details.isVideoIs Video (boolean)details.statisticsDetailed Stats (json)userInfo.nameUsername (text)userInfo.bioBio (text)userInfo.followersFollowers (text)userInfo.followingFollowing (text)userInfo.likesAndSavesLikes & Saves (text)userInfo.profileImageUrlProfile Image (image)userInfo.profileUrlProfile URL (link)userInfo.scraped_fromScraped From (json)changeTypeChange (text)changedFieldsChanged Fields (json)firstSeenAtFirst Seen (date)lastSeenAtLast Seen (date)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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
}
}Ways to use this data
- 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.
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 Profile Scraper return?
The documented output for Lemon8 Profile 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 Profile Scraper cost?
It costs $2.40 per 1,000 results on the Apify Free plan and from $2.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
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.
