Lemon8 Media Scraper at a glance
Lemon8 Media Scraper is a ready-to-run Apify actor from abotapi for collecting social media data. Its documented output includes post id, post url, title, author and followers, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.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, Videos, Automation
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 21 options
Lightweight Lemon8 scraper for extracting image and video URLs from posts, with optional media downloads. Built for fast, clean media collection without comments, captions, or other post details.
What Lemon8 Media Scraper: Images, Videos & Downloads can do
- Two ways to find posts. Paste exact Lemon8 post links, or search by keyword and region through Lemon8's discovery page.
- Clean media, nothing else. Every image and video URL from a post, with thumbnails converted to their higher-quality variant by default.
- Optional file download. Pull the actual image and video files into the run's storage, not just links, when you need copies rather than references.
- Any Lemon8 region. Point it at the region code for the market you care about, the same way the Lemon8 app itself is localized.
- Built for schedules. Turn on incremental mode and recurring runs return only new and changed posts, not the same posts every time.
- Resume without re-paying. Continue an interrupted pull by pasting its run or dataset id, and posts already collected there are skipped.
Choose what to collect
These inputs let you configure Lemon8 Media Scraper: Images, Videos & Downloads. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring | What to scrape. auto (default): your own Post URLs if set, otherwise the Search Term. The example Post URLs run only when you set none of: a Search Term other than fashion, Keywords, Profile URLs, Incremental mode, State key, Resume, or a region other than us. post: the Post URLs list. discover: Keywords (or Search Term). profile: Profile URLs. feed: Feed categories. In a chosen mode only that mode's input is used. |
postUrlsarray | Lemon8 URLs to scrape: post pages (/@user/), discovery pages (/discover/ or /experience/, region taken from ?region=), profile pages (/@user, lists the profile's posts) and topic pages (/topic/). Tracking parameters are ignored. Unsupported URLs are skipped with a warning. When postUrls holds your own URLs, searchTerm is ignored. The example list is dropped when you set a different Search Term, Keywords, Profile URLs, Incremental mode, State key, Resume or a region other than us (clear the list to search by keyword). |
searchTermstring | Search keyword to find posts on Lemon8 discovery page. Used only if postUrls is empty (or still holds the example list while you set a different keyword). |
feedCategoriesarray | Category feeds to read in feed mode (the first page of each, about 10 posts). Defaults to For you when empty. |
keywordsarray | Keywords to search on Lemon8 in discover mode (about 50 posts per keyword). Also used in auto mode when Post URLs is cleared. The Limit / Max results cap applies in order across keywords. |
profileUrlsarray | Lemon8 profile pages or @usernames to list in profile mode (the posts shown on the profile page). |
regionstring | Region code for Lemon8. Common codes: us, uk, jp, th, id, ph, vn, my, sg (any other code, e.g. au, is passed through as typed). |
Show 14 more inputs
| Input | What it controls |
|---|---|
limitinteger | Maximum number of posts to return (1 to 1000 per run) |
saveImagesboolean | Extract image URLs from posts |
saveVideosboolean | Extract video URLs from posts |
downloadMediaboolean | Download media files to key-value store (increases run time and storage) |
highQualityboolean | Convert thumbnail URLs to high quality versions |
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 in another run. For recurring monitoring of the same posts/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). State is kept separately for each postUrls/searchTerm, region, and media-option combination; 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 mode and its inputs (postUrls/searchTerm, keywords, profileUrls or feedCategories), region, and the media options, different 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 post, not when 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 | Optional. Field names that must not make a post UPDATED or appear in Changed fields, for example imageCount when you do not care about that movement. Use a dotted path such as images.alt to ignore one key inside every item of a list. The fields still appear in the output; they are only left out of the comparison. Changing this list never marks the whole baseline as updated. |
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.
postIdPost ID (text)postUrlPost URL (link)titleTitle (text)authorUsernameAuthor (text)authorFollowersFollowers (number)likesLikes (number)savesSaves (number)commentCountComments (number)imageCountImages (number)videoCountVideos (number)imagesImages (json)videosVideos (json)Show 10 more fields
groupIdPost ID (text)urlPost URL (link)articleClassType (text)hashtagsHashtags (array)sourceModeSource (text)scrapedAtScraped at (date)changeTypeChange (text)changedFieldsChanged fields (array)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.
{
"postId": "7543408422994264589",
"postUrl": "https://www.lemon8-app.com/@username/7543408422994264589?region=us",
"images": [
{
"url": "https://example-cdn.lemon8-app.com/sample-image-1.webp",
"alt": "",
"type": "image"
}
],
"videos": [
{
"url": "https://example-cdn.lemon8-app.com/sample-video-1.mp4",
"poster": "https://example-cdn.lemon8-app.com/sample-poster-1.webp",
"type": "video"
}
],
"imageCount": 1,
"videoCount": 1
}Ways to use this data
- Content archiving: save images and videos from posts before they are edited or taken down.
- Dataset building: collect batches of images and videos for a training or research dataset.
- Visual trend research: track the styles, colors and formats trending in a niche or region.
- Competitor and creator monitoring: watch an account's or a keyword's posts on a schedule and catch new content as soon as it is up.
- Personal backup: pull your own account's post media out of Lemon8 into your own storage.
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 Media Scraper return?
The documented output for Lemon8 Media Scraper includes post id, post url, title, author, followers, likes, saves and comments. Availability of each field depends on the source page and the selected mode.
How much does Lemon8 Media Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.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.
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 and changed posts, and unchanged ones are not billed unless you turn that on too.
Why did a run return no items instead of some media?
If the given post URLs could not be read (deleted, private, or an unrecognized page), or a search and region combination matched nothing, the run stops with a clear status message and returns nothing rather than a placeholder row. This is a normal, successful outcome, not a failure.
Why might a run fail instead of returning an empty result?
A run fails outright only when resumeFromRunId points to a run or dataset that cannot be read (a bad or inaccessible id), or when incrementalMode is combined with resumeFromRunId while saved incremental state already exists for that state key (remove one or set a different stateKey). Individual posts that fail to load are skipped and logged, they don't fail the whole run.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
