Lemon8 Media Scraper: Images, Videos & Downloads avatar

Lemon8 Media Scraper: Images, Videos & Downloads

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Lemon8 Media Scraper: Images, Videos & Downloads

Lemon8 Media Scraper: Images, Videos & Downloads

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.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

7

Total users

0

Monthly active users

11 days ago

Last modified

Share

Lemon8 Media Scraper: Image and Video URLs from Any Post

Lemon8 Media Scraper turns any Lemon8 post, or a batch of posts found by keyword, into a clean feed of image and video URLs. Paste post links or set a search term and region, and get every media URL a post carries, already upgraded to its higher-quality variant, with an option to download the actual files into the run's storage. Schedule it and turn on incremental mode to get only new and changed posts on every run, then export the results as JSON, CSV or Excel, or read them through the API.

Why This Scraper?

  • 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.
  • Pipe results into your apps. Send a summary of every record to Notion, Linear or Airtable through Apify's connectors, no extra script needed.

Use Cases

  • 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.

Data You Get

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

FieldExample
postId"7543408422994264589"
postUrl"https://www.lemon8-app.com/@username/7543408422994264589?region=us"
imageCount2
videoCount0
imagesarray of image objects, one per extracted image
images[].url"https://example-cdn.lemon8-app.com/sample-image-1.webp"
images[].alt""
images[].type"image"
images[].keystoreKey"7543408422994264589_img_0.webp" (only when downloadMedia is on)
videosarray of video objects, one per extracted video
videos[].url"https://example-cdn.lemon8-app.com/sample-video-1.mp4"
videos[].poster"https://example-cdn.lemon8-app.com/sample-poster-1.webp"
videos[].type"video"
videos[].keystoreKey"7543408422994264589_vid_0.mp4" (only when downloadMedia is on)
changeType"NEW" (incremental mode only)
changedFields["videos"] (incremental mode only)
firstSeenAt"2026-07-31T03:00:00Z" (incremental mode only)
lastSeenAt"2026-07-31T03:00:00Z" (incremental mode only)

The last four fields (changeType, changedFields, firstSeenAt, lastSeenAt) are added only when incrementalMode is on. A normal run's rows are exactly postId, postUrl, images, videos, imageCount and videoCount, nothing more.

How to Use

  1. Choose your input: paste specific post URLs, or set a search term and region to find posts by keyword.
  2. Pick which media to keep (images, videos, or both), and whether to only collect links or also download the files.
  3. Set Limit to control how many posts are processed and how much the run costs, then click Start.
  4. Read the results from the dataset, or download them as JSON, CSV or Excel.

Search discovery in one region:

{
"searchTerm": "skincare",
"region": "us",
"limit": 20,
"saveImages": true,
"saveVideos": true
}

Direct post URLs with file download:

{
"postUrls": [
"https://www.lemon8-app.com/@username/7543408422994264589",
"https://www.lemon8-app.com/@another/7550145067198005791"
],
"downloadMedia": true
}

Recurring monitoring with incremental mode:

{
"searchTerm": "streetwear",
"region": "sg",
"limit": 50,
"incrementalMode": true,
"stateKey": "streetwear-sg-watch"
}

Resume an interrupted pull:

{
"searchTerm": "travel",
"region": "au",
"limit": 100,
"resumeFromRunId": "<previous run or dataset id>"
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/lemon8-media-scraper").call(run_input={"searchTerm": "fashion", "region": "us", "limit": 20})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
print(post["postId"], post["imageCount"], post["videoCount"])

JavaScript:

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

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

Resume and recurring updates

  • Resume (resumeFromRunId) points this run at a previous run or dataset id so the actor knows which posts it already saw there.
  • Incremental mode (incrementalMode) is for scheduled runs over the same posts or search. Each row is classified NEW, UPDATED (with changedFields), or UNCHANGED (suppressed and not billed unless emitUnchanged is on). EXPIRED is never detected unless emitExpired is on, and even then only once a run has scanned every tracked post to its natural end; a capped run or a resumed run skips EXPIRED detection that time rather than risk a wrong result. REAPPEARED shows up only when a post previously marked EXPIRED by such a run is found again on a later run, it does not appear on a first run or under normal NEW/UPDATED conditions.
  • stateKey names or shares the stored state. Leaving it empty derives a key from postUrls/searchTerm, region and the media options, so two differently configured runs never mix state. Raising limit alone never starts a new baseline.
  • Cosmetic link changes (a different delivery host, or a refreshed access token on an otherwise identical image or video) are normalized before comparing posts, so a post whose media has not actually changed is never marked UPDATED just because its link was reissued.
  • With incremental mode off, output is exactly as in a normal run.

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 Parameters

ParameterTypeDefaultDescription
postUrlsarraynoneDirect Lemon8 post URLs to scrape. When this is non-empty, searchTerm is ignored.
searchTermstring"fashion"Search keyword used to find posts on Lemon8's discovery page, only when postUrls is empty.
regionstring"us"Region code passed to Lemon8 (for example us, au, nz, jp, th, id, vn, my, sg, ca). This is a free-text field, not a fixed list.
limitinteger2Maximum number of posts to process, from 1 to 100.
saveImagesbooleantrueExtract image URLs from each post.
saveVideosbooleantrueExtract video URLs from each post.
downloadMediabooleanfalseAlso download each image and video file into the run's key-value store, increasing run time and storage.
highQualitybooleantrueConvert thumbnail image URLs to their higher-quality variant.
proxyobjectnone (prefill shown in the console: a managed connection for country US)Connection settings for requests. When the managed connection is turned on, the actor also keeps an alternate connection in reserve and switches to it automatically if a request is refused twice in a row. Leaving it off sends requests directly, with no automatic switch.
resumeFromRunIdstringnonePaste a previous run or dataset id to seed this run with the posts it already found there.
incrementalModebooleanfalseTurn on for daily or recurring monitoring, so a run returns only new and changed posts against the previous run.
stateKeystringnoneName a monitoring campaign explicitly, or leave empty to derive one automatically from postUrls/searchTerm, region and the media options.
emitUnchangedbooleanfalseAlso return (and bill) posts that have not changed since the last run, marked UNCHANGED.
emitExpiredbooleanfalseAlso return (and bill) posts that were present before but are no longer found, marked EXPIRED, once a run fully scans every tracked post.
mcpConnectorsarraynoneOptional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run, from 1 to 1000. Does not affect the dataset.

Output Example

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

{
"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
}

Plan Requirement

This actor runs with no connection configured at all; requests then go out directly. Turning on the managed connection option shown by default in the input routes requests through a connection for the selected region, and the actor automatically switches to an alternate connection if a request is refused twice in a row. For larger or scheduled runs, turning this option on is recommended for more consistent access.

FAQ

How much does it cost?

You pay based on your Apify plan and the number of posts returned. The Pricing tab on the actor page shows the current rates. Use Limit to control the size, and therefore the cost, of any run.

This actor collects only media URLs from publicly viewable Lemon8 posts. You are responsible for how you use the results: follow Lemon8's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. The images and videos themselves may carry their own copyright or other rights held by the original poster.

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.

๐Ÿ”— 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 Profile Scraper
Scrape Lemon8 user profiles with automated multi-profile discovery. Extract profile data...
๐Ÿ‘— Lemon8 Feed Scraper
Scrape Lemon8 feeds across 22 categories and 10+ regions. Extract posts, images, videos...
๐Ÿ“ฑ TikTok Profile, Hashtag, Search, Video & Trending Scraper
Scrape TikTok without login. Extract profiles, bios, follower stats and videos; search by...
๐Ÿ“ฑ Truth Social Scraper
Scrape public Truth Social profiles, posts, media, metrics, author data, and complete...
๐Ÿ“ฑ Reddit [
From $1/1K. Scrape Reddit posts, comments, and media from any subreddit or user profile -...

๐Ÿ‘‰ Browse all abotapi scrapers

๐Ÿ’ฌ Support & custom scrapers

  • ๐Ÿž 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 or message Telegram @abotapi.
  • โญ Enjoying it? A quick review on the actor page helps other users find it.