{
  "openapi": "3.0.1",
  "info": {
    "title": "Lemon8 Search Scraper - Posts, Comments & Media",
    "description": "Scrape Lemon8 posts by keyword across multiple regions. Extract posts, images, videos, comments, engagement metrics, and detailed post analytics, with support for high-quality media downloads. Ideal for market research, content analysis, and trend monitoring.",
    "version": "3.0",
    "x-build-id": "6MpVw2lIaOPkBAjHu"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~lemon8-discover-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-lemon8-discover-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~lemon8-discover-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-lemon8-discover-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~lemon8-discover-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-lemon8-discover-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "searchTerm"
        ],
        "properties": {
          "searchTerm": {
            "title": "Search Term",
            "type": "string",
            "description": "Keyword to search for on Lemon8. Used only when Start URLs is empty.",
            "default": "fashion"
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Lemon8 URLs to scrape: discovery/experience search pages (/discover/<keyword>, /experience/<keyword>, with or without ?region=) and single post pages (/@<author>/<postId>). When edited, these take precedence over Search Term. In Scrape mode \"auto\" the untouched example list below is ignored (treated as not supplied) so runs that omit this field keep searching by Search Term; Scrape mode \"url\" scrapes it as given. Author profile pages (/@<author>) are scraped as profile targets.",
            "items": {
              "type": "string"
            },
            "default": [
              "https://www.lemon8-app.com/discover/fashion?region=us",
              "https://www.lemon8-app.com/experience/coffee?region=us",
              "https://www.lemon8-app.com/discover/nails",
              "https://www.lemon8-app.com/discover/skin%20care?region=jp",
              "https://www.lemon8-app.com/@janeddove/7460605475378283050?region=us"
            ]
          },
          "mode": {
            "title": "Scrape mode",
            "enum": [
              "auto",
              "search",
              "url",
              "feed",
              "profile",
              "post"
            ],
            "type": "string",
            "description": "What to scrape. \"auto\" (default) keeps the classic behaviour: Start URLs when edited, otherwise Search Term / Keywords. \"search\" = keyword search, \"url\" = Start URLs only, \"feed\" = home-feed categories, \"profile\" = author profile posts, \"post\" = single post pages.",
            "default": "auto"
          },
          "keywords": {
            "title": "Keywords (multi-keyword search)",
            "type": "array",
            "description": "Search several keywords in one run (each one is searched in the selected Region; Post Limit applies per keyword). Empty = use Search Term.",
            "items": {
              "type": "string"
            }
          },
          "feedCategories": {
            "title": "Feed categories",
            "type": "array",
            "description": "Home-feed categories to scrape when Scrape mode is \"feed\" (empty = foryou). Post Limit applies per category.",
            "items": {
              "type": "string",
              "enum": [
                "foryou",
                "food",
                "beauty",
                "fashion",
                "home",
                "fitness",
                "health",
                "relationship",
                "travel",
                "photography",
                "pet",
                "reading",
                "cars",
                "outdoors"
              ],
              "enumTitles": [
                "For You",
                "Food",
                "Beauty",
                "Fashion",
                "Home",
                "Fitness",
                "Health",
                "Relationship",
                "Travel",
                "Photography",
                "Pet",
                "Reading",
                "Cars",
                "Outdoors"
              ]
            }
          },
          "profileUrls": {
            "title": "Profile URLs",
            "type": "array",
            "description": "Lemon8 author profile pages (https://www.lemon8-app.com/@name) or @names. Used when Scrape mode is \"profile\" (or \"auto\"). Post Limit applies per profile.",
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "Post URLs",
            "type": "array",
            "description": "Single Lemon8 post pages (https://www.lemon8-app.com/@name/<postId>). Used when Scrape mode is \"post\" (or \"auto\").",
            "items": {
              "type": "string"
            }
          },
          "region": {
            "title": "Region",
            "enum": [
              "us",
              "au",
              "nz",
              "jp",
              "th",
              "id",
              "vn",
              "my",
              "sg",
              "ca",
              "uk",
              "ph"
            ],
            "type": "string",
            "description": "Target region for Lemon8 content",
            "default": "us"
          },
          "limit": {
            "title": "Post Limit",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum number of posts to extract (max 500)",
            "default": 2
          },
          "getDetails": {
            "title": "Get Detailed Post Data",
            "type": "boolean",
            "description": "Navigate to individual post pages to extract full content and all comments",
            "default": true
          },
          "detailsLimit": {
            "title": "Details Post Limit",
            "minimum": 1,
            "maximum": 3000,
            "type": "integer",
            "description": "Maximum number of posts to get detailed data for",
            "default": 2
          },
          "commentExpansionTimeout": {
            "title": "Comment Expansion Timeout (seconds)",
            "minimum": 10,
            "maximum": 300,
            "type": "integer",
            "description": "Maximum time in seconds to spend expanding comments on each post. Posts with many comments may timeout.",
            "default": 30
          },
          "saveImages": {
            "title": "Save Images",
            "type": "boolean",
            "description": "Download post images locally",
            "default": false
          },
          "saveVideos": {
            "title": "Save Videos",
            "type": "boolean",
            "description": "Download videos from video posts",
            "default": false
          },
          "proxy": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Proxy for requests. Defaults to Apify datacenter (US); if the datacenter tunnel is unavailable or gets blocked, the actor automatically falls back to a backup proxy pool."
          },
          "dev_transform_fields": {
            "title": "Transform Fields",
            "type": "array",
            "description": "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').",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "dev_dataset_name": {
            "title": "Custom Dataset Name",
            "type": "string",
            "description": "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'.",
            "default": "default"
          },
          "dev_dataset_clear": {
            "title": "Clear Dataset Before Insert",
            "type": "boolean",
            "description": "Clear Dataset before inserting new data",
            "default": false
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "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 search pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "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). A post counts as UPDATED when any of its fields changes (title, text, hashtags, like/comment counts, comments, media); a re-signed or re-sharded image/video CDN address of the same file never does. Fields listed in Ignore fields are excluded from the comparison but stay in the output. State is kept separately for each search term/Start URL, region, and Get Detailed Post Data setting; 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.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "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 search term/Start URLs, region, and Get Detailed Post Data setting — different search setups then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged posts (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired posts (incremental mode only)",
            "type": "boolean",
            "description": "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 search term/Start URL — 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.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Incremental mode only. Field names (or dot paths such as details.videoData.videoUrl; arrays are searched element by element) that never make a post UPDATED and never appear in changedFields. The fields stay in the output. Use it for values you do not want to trigger an update, for example statistics.likesCount or commentStats. Changing this list does not re-flag your existing posts.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "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)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}