# Lemon8 Search, Profile & Post Monitor (`luminar/lemon8-search-profile-post-monitor`) Actor

Export public Lemon8 posts from keyword, topic, profile and exact URLs with stable IDs, factual fields, media URLs, coverage and safe exact-post monitoring.

- **URL**: https://apify.com/luminar/lemon8-search-profile-post-monitor.md
- **Developed by:** [Luka](https://apify.com/luminar) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.06 / 1,000 lemon8 posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Collect public Lemon8 posts from keyword searches, topic URLs, public profiles, exact posts, and public feed URLs. Get stable post identities, factual engagement and media fields, or safely monitor one exact post for `NEW`, `UPDATED`, and confirmed `ENDED` changes.

### 🚀 Start in 60 seconds

The default collects up to 100 US fashion posts:

```json
{
  "workflow": "collect",
  "searchTerms": ["fashion"],
  "region": "us",
  "detailLevel": "core",
  "maxResults": 100
}
```

Core mode reads the public result payload directly and is the lowest-cost option. Missing optional fields remain `null`; the Actor does not guess metrics or identities.

### 🎯 Choose the right workflow

| Goal | Input | Result |
|---|---|---|
| Search one or more topics | `searchTerms` + `workflow: collect` | Query-faithful public post rows |
| Collect a topic or profile | `startUrls` + `workflow: collect` | Posts tied to that public surface |
| Enrich exact post fields | `detailLevel: detailed` | One exact public detail request per delivered post |
| Track one post | one exact post URL + `workflow: monitor` | Baseline, factual updates, and safe removal semantics |

Monitoring accepts exactly one public post URL. Its first run creates a baseline by default; later complete comparable runs emit factual changes. One missing observation never ends a post.

### 📦 What you get

![Actual Lemon8 Product dataset with stable IDs, titles, authors, likes and canonical URLs](https://api.apify.com/v2/key-value-stores/DJgPR6wwS2tIaLDQW/records/lemon8_search_profile_post_monitor--829d350dd57b201d-dataset.png)

| Group | Fields |
|---|---|
| Identity | `stableId`, `postId`, `url`, `region`, `postType` |
| Content | `title`, `description`, `ocrText`, `hashtags`, `publishedAt` |
| Author | `authorId`, `authorUsername`, `authorName`, `authorBio`, `authorAvatarUrl`, `authorVerified` |
| Engagement | `likeCount`, `commentCount`, `saveCount`, `shareCount`, `viewCount` when source-published |
| Media | `primaryImageUrl`, `imageUrls`, `videoUrls` |
| Audit | `observedAt`, `sourceTargets`, `sourceClass`, `coverageStatus` |

```json
{
  "recordType": "post",
  "stableId": "lemon8:post:7460605475378283050",
  "postId": "7460605475378283050",
  "url": "https://www.lemon8-app.com/@janeddove/7460605475378283050?region=us",
  "title": "Fashion wardrobe essentials",
  "authorUsername": "janeddove",
  "likeCount": 16074,
  "sourceClass": "PUBLIC_FIRST_PARTY"
}
```

### 🎛️ Input guide

- `searchTerms` accepts up to 10 keywords; each result must be literally query-faithful.
- `startUrls` accepts public topic, profile, exact post, experience/search, or feed URLs.
- `region` selects a canary-proven public region: US, Singapore, Thailand, or Japan.
- `maxResults` and `maxResultsPerTarget` are hard output caps.
- `detailLevel: core` reuses the listing payload. `detailed` opens each exact post and requires `maxDetailRequests >= maxResults`.
- Runtime, request, transfer, platform-usage, and buyer-charge guards fail before surprise spending.

Duplicates merge by stable Lemon8 post ID. The Actor never imports account cookies, uses login-only surfaces, or solves CAPTCHA.

### 💰 Pricing

Core costs **$0.06 per 1,000 posts** plus **$0.0013 for a trustworthy collection**. At 1,000 rows the complete total is $0.0613, below the closest current basic-search offer at about $0.075 including its start event.

| Paid event | Planned price |
|---|---:|
| Core post | $0.06 / 1,000 |
| Detailed post | $1.40 / 1,000 |
| Comparable monitoring scan | $0.0013 / scan |
| Delivered change | $0.06 / 1,000 |

Detailed replaces Core row pricing; a row is not charged twice. Failed, blocked, or structurally invalid targets are free. Coverage rows are always free.

### ✅ Coverage you can trust

- `COMPLETE` — every requested target returned a trustworthy public result window.
- `EMPTY_CONFIRMED` — an exact public post was conclusively absent.
- `CAPPED` — a declared result or resource limit stopped the walk.
- `PARTIAL`, `BLOCKED`, or `FAILED` — the scope is unsafe for removal decisions.

Only complete comparable exact-post monitoring may advance state. `ENDED` requires two consecutive comparable absences. Failed, blocked, partial, filtered, or capped observations never create false removals or overwrite good state.

### 🔌 API and automation

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('luminar/lemon8-search-profile-post-monitor').call({
  workflow: 'collect',
  searchTerms: ['fashion', 'skincare'],
  region: 'us',
  detailLevel: 'core',
  maxResults: 200
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Use the Dataset for rows and KVS `OUTPUT` for counts, field coverage, resource limits, accepted billing events, and next action. Keep scheduled monitor runs sequential and reuse the same input and `stateNamespace`.

### ⚠️ Not yet supported

Login-only content, private profiles, CAPTCHA solving, imported cookies/tokens, direct file downloads, outbound alerts, AI sentiment, inferred trend/demand scores, and profit or recommendation claims are not supported. United Kingdom, Malaysia, Philippines, Indonesia, Brazil, Mexico, and other unlisted regions are not yet supported. Comment bodies are not yet supported, and optional fields remain nullable when Lemon8 does not publish them.

### ❓ FAQ and support

**Why is an optional field null?**\
The selected public Lemon8 surface did not publish it. Check `fieldCoverage` in `OUTPUT`.

**Why did monitoring return no paid rows?**\
The first run normally seeds a quiet baseline, and unchanged repeats emit no paid changes.

**Can a failed run mark a post as ended?**\
No. Only two consecutive complete comparable absences can emit `ENDED`.

For support, share the run ID, public input, coverage status, and `OUTPUT`. Never share Lemon8 cookies, passwords, or private tokens.

# Actor input Schema

## `workflow` (type: `string`):

Collect current posts or safely track one exact public post between runs.

## `searchTerms` (type: `array`):

Up to 10 Lemon8 search terms.

## `startUrls` (type: `array`):

Topic, profile, exact post, experience/search or feed URLs.

## `region` (type: `string`):

Canary-proven Lemon8 region used for keyword searches and URLs without an explicit region.

## `maxResults` (type: `integer`):

Hard cap across all targets.

## `maxResultsPerTarget` (type: `integer`):

Hard cap for each search term or URL.

## `detailLevel` (type: `string`):

Core reuses the listing payload; Detailed fetches each exact public post.

## `maxDetailRequests` (type: `integer`):

Maximum exact post pages fetched in Detailed mode.

## `firstRunBehavior` (type: `string`):

Seed silently or emit the first observed post as NEW.

## `stateNamespace` (type: `string`):

Separates independent monitoring baselines.

## `maxBuyerChargeUsd` (type: `number`):

Fail before source work if the declared PPE maximum would exceed this amount.

## `maxEstimatedPlatformUsd` (type: `number`):

Runtime compute guard independent of Actor event pricing.

## `maxRequests` (type: `integer`):

Maximum first-party HTTP requests.

## `maxRuntimeSecs` (type: `integer`):

Maximum source-work duration.

## `maxSourceBytes` (type: `integer`):

Maximum first-party response bytes.

## Actor input object example

```json
{
  "workflow": "collect",
  "searchTerms": [
    "fashion"
  ],
  "startUrls": [],
  "region": "us",
  "maxResults": 100,
  "maxResultsPerTarget": 100,
  "detailLevel": "core",
  "maxDetailRequests": 0,
  "firstRunBehavior": "seed_only",
  "stateNamespace": "default",
  "maxBuyerChargeUsd": 10,
  "maxEstimatedPlatformUsd": 0.25,
  "maxRequests": 100,
  "maxRuntimeSecs": 600,
  "maxSourceBytes": 50000000
}
```

# Actor output Schema

## `dataset` (type: `string`):

Posts, factual changes and free coverage receipts.

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

Buyer-focused Lemon8 post and change fields.

## `runSummary` (type: `string`):

Counts, field coverage, limits and billing events.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("luminar/lemon8-search-profile-post-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("luminar/lemon8-search-profile-post-monitor").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 '{}' |
apify call luminar/lemon8-search-profile-post-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,luminar/lemon8-search-profile-post-monitor"
        }
    }
}

```

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/gMZBPrkdBH2qeopn2/builds/jZobTkVyfIQ6tdNFl/openapi.json
