# Lemon8 Scraper - Profiles, Posts & Hashtags (`seemuapps/lemon8-scraper`) Actor

Scrape Lemon8 profiles, posts and hashtag feeds - followers, likes, saves, bio links, captions, hashtags, images, video links, views and comment counts.

- **URL**: https://apify.com/seemuapps/lemon8-scraper.md
- **Developed by:** [Seemu Scraping](https://apify.com/seemuapps) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Lemon8 Scraper - Profiles, Posts & Hashtags

Scrape **Lemon8** creator profiles, posts and hashtag feeds: followers, following, total likes and saves, bio and bio links, verification badge, plus every post's title, full caption, hashtags, images, video link, likes, saves, comments, views and publish date. No login, no Lemon8 account and no app required.

Paste usernames, post links or hashtag pages and get clean, flat rows you can export straight to JSON, CSV, Excel or Google Sheets.

### What you get

Every row has a **type** column so profiles and posts sit in one spreadsheet you can filter.

**Profile rows** (`type = profile`), one per creator:

- **username**, **displayName**, **userId**, **profileUrl**, **bio**
- **followerCount**, **followingCount**, **postCount**
- **likesReceived** and **savesReceived** - total likes and saves across all of the creator's posts
- **isVerified** - Lemon8 verified / official badge
- **links** - Instagram, TikTok, YouTube, Amazon storefront and other bio links
- **avatarUrl**, **region** (market of the creator's latest post, e.g. `us`, `jp`, `th`)

**Post rows** (`type = post`), one per post:

- **id**, **url**, **postType** (`gallery` or `video`), **title**, **caption** (full text)
- **hashtags** and **hashtagUrls** (link to each hashtag's feed)
- **likeCount**, **saveCount**, **commentCount**, **viewCount**
- **createdAt**, **updatedAt**
- **coverImageUrl**, **imageUrls**, **imageCount**
- **videoUrl** (direct MP4 link) and **videoDurationSeconds** for video posts
- **imageText** - text Lemon8 reads from the post's images and video frames (great for product names and prices)
- Author: **username**, **displayName**, **followerCount**, **isVerified**, **avatarUrl**, **profileUrl**
- **source** - which profile or hashtag the post came from

### Use cases

- **Influencer discovery and vetting** - compare followers, likes, saves and engagement per post before reaching out
- **Influencer marketing reporting** - track likes, saves, comments and views on sponsored Lemon8 posts
- **Trend and hashtag research** - see what gets posted under a hashtag and which posts perform best
- **Product and brand monitoring** - find product mentions in captions and in text on images
- **Lead generation** - collect creators' bio links (Instagram, TikTok, Amazon storefront, websites) in bulk
- **Lifestyle content datasets** - fashion, beauty, food, travel and home content for analysis

### How to use

1. Add one or more **Lemon8 usernames or profile URLs**. `lemon8fashion`, `@lemon8fashion` and `https://www.lemon8-app.com/@lemon8fashion` all work.
2. Set **Max posts per profile** (default 20, newest first; `0` = every post on the profile).
3. Optionally add **Post URLs** - individual post links, share links or numeric post IDs.
4. Optionally add **Hashtag page URLs** such as `https://www.lemon8-app.com/topic/7197822124672335878`. Tap a hashtag on any Lemon8 post to open its page, or copy one from the **hashtagUrls** column of a previous run. Choose the **Recent** feed (paginated) or the **Popular** feed (top 10).
5. Leave **Include full post details** on for full captions, dates, saves, comments, views and video links, or turn it off for a faster run with feed data only (title, short caption, likes and images).
6. Run the actor. Rows appear in the **Dataset** tab; use the **Profiles** and **Posts** views to browse each kind.

Accounts, posts or hashtags that do not exist are skipped with a warning in the log, and the rest of the run carries on.

#### Continuing a long list

When the input has exactly one profile or one hashtag, the actor saves a resume cursor. After the run finishes, open the **Key-value store** tab → copy the `NEXT_PAGE_ID` value → paste it into **Page ID** on your next run. If `NEXT_PAGE_ID` is `null`, you've fetched everything. Profiles continue exactly where the last run stopped. Lemon8 refreshes hashtag feeds all the time, so a resumed hashtag run carries on further down the feed, but it may skip or add a few posts that were published in between.

### Output format

A profile row:

```json
{
  "type": "profile",
  "source": "profile:@lemon8fashion",
  "username": "lemon8fashion",
  "displayName": "Lemon8 Fashion",
  "userId": "7439414337499251758",
  "profileUrl": "https://www.lemon8-app.com/@lemon8fashion",
  "followerCount": 26306,
  "followingCount": 16,
  "likesReceived": 103323,
  "savesReceived": 32128,
  "postCount": 465,
  "isVerified": true,
  "links": ["https://docs.google.com/forms/..."],
  "region": "us",
  "scrapedAt": "2026-09-30T12:45:10.113Z"
}
```

A post row:

```json
{
  "type": "post",
  "source": "profile:@avacerniglia",
  "id": "7531437966250574350",
  "url": "https://www.lemon8-app.com/@avacerniglia/7531437966250574350?region=us",
  "username": "avacerniglia",
  "followerCount": 633,
  "postType": "video",
  "title": "morning in my life",
  "caption": "slow mornings, cozy vibes, and little routines 🌞🫶 a peek into how I start my day!\n#morningroutine #grwm #lifestylevlog",
  "hashtags": ["morningroutine", "grwm", "lifestylevlog", "realisticmorning", "cozyvibes"],
  "hashtagUrls": ["https://www.lemon8-app.com/topic/7205410708681392133", "..."],
  "likeCount": 3,
  "saveCount": 0,
  "commentCount": 0,
  "viewCount": 424,
  "videoUrl": "https://v16-lemon8.tiktokcdn.com/...",
  "videoDurationSeconds": 22,
  "imageText": "morning in my life\nmake bed\nget dressed/treadmill",
  "createdAt": "2025-07-26T17:07:00.000Z",
  "detailsFetched": true
}
```

Fields that do not apply to a row type are `null`, so every row has the same columns in CSV and Excel exports.

### Good to know

- Only public information is collected, the same data anyone can see on lemon8-app.com without logging in.
- Hashtags have to be given as a hashtag page URL or ID. Lemon8 reuses the same hashtag name in different countries, so a name alone doesn't identify one feed.
- Image and video links are signed Lemon8 CDN links that expire. Download any media you want to keep soon after the run.
- Share counts are not shown on Lemon8's web pages, so they aren't included.

### Pricing

You pay per result: one charge per profile row and one per post row saved to the dataset. Lower **Max posts per profile** / **Max posts per hashtag** to keep runs cheap.

# Actor input Schema

## `profiles` (type: `array`):

One per line. Accepts a username (with or without @) or a profile link such as https://www.lemon8-app.com/@lemon8fashion. Each profile returns one profile row plus its recent posts.

## `maxPostsPerProfile` (type: `integer`):

Maximum posts to return for each profile, newest first. 0 = every post on the profile.

## `postUrls` (type: `array`):

Individual Lemon8 posts to scrape, one per line - a post link such as https://www.lemon8-app.com/@user/7531437966250574350, a share link, or just the numeric post ID.

## `hashtags` (type: `array`):

Hashtag feeds to scrape, one per line - paste the hashtag page URL (https://www.lemon8-app.com/topic/7197822124672335878) or its numeric ID. Open any hashtag on a Lemon8 post to get its URL; the hashtagUrls column in this actor's post results also lists them.

## `hashtagFeed` (type: `string`):

Which hashtag tab to scrape. Recent paginates through the hashtag's posts; Popular returns the hashtag's current top posts (up to 10).

## `maxPostsPerHashtag` (type: `integer`):

Maximum posts to return for each hashtag. 0 = keep paginating until the feed runs out or the run times out.

## `includePostDetails` (type: `boolean`):

Open every post from profiles and hashtags to add the full caption, publish date, saves, comments, views, video link and text found in images. Turn off for a faster run with the feed fields only (title, short caption, likes, images).

## `pageId` (type: `string`):

Paste NEXT\_PAGE\_ID from the previous run's Key-value store to continue where it stopped. Only works when the input has exactly one profile or one hashtag.

## Actor input object example

```json
{
  "profiles": [
    "lemon8fashion",
    "ladestinyluna"
  ],
  "maxPostsPerProfile": 20,
  "hashtagFeed": "recent",
  "maxPostsPerHashtag": 20,
  "includePostDetails": true
}
```

# Actor output Schema

## `results` (type: `string`):

Flat rows with a 'type' column: 'profile' rows (username, displayName, bio, followerCount, followingCount, likesReceived, savesReceived, postCount, isVerified, avatarUrl, links, region) and 'post' rows (url, title, caption, hashtags, hashtagUrls, imageUrls, videoUrl, likeCount, saveCount, commentCount, viewCount, createdAt, author username and followers).

## `nextPageId` (type: `string`):

NEXT\_PAGE\_ID record in the default key-value store. Paste into Page ID on the next run to continue a single profile or hashtag; null when there is nothing more to fetch.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "profiles": [
        "lemon8fashion",
        "ladestinyluna"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/lemon8-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "profiles": [
        "lemon8fashion",
        "ladestinyluna",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/lemon8-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "profiles": [
    "lemon8fashion",
    "ladestinyluna"
  ]
}' |
apify call seemuapps/lemon8-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seemuapps/lemon8-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VJStxpKUDdxjkBdJ7/builds/5Ycff5uklH66W2Ohq/openapi.json
