{
  "openapi": "3.0.1",
  "info": {
    "title": "Lemon8 Profile Scraper: Posts, Engagement, Comments & Media",
    "description": "Scrape Lemon8 user profiles with automated multi-profile discovery. Extract profile data, detailed posts, engagement metrics, comments, and high-quality images and videos with download support. Built for influencer research, content analysis, and media archiving.",
    "version": "2.0",
    "x-build-id": "Wf4WhbhUcSAm5G5Fw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~lemon8-profile-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-lemon8-profile-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-profile-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-lemon8-profile-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-profile-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-lemon8-profile-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": [
          "username"
        ],
        "properties": {
          "username": {
            "title": "Username",
            "type": "string",
            "description": "Lemon8 username to scrape, without the '@'. Ignored if a Profile URL is provided below.",
            "default": "sydneydelreyy"
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Lemon8 URLs to scrape. Supported: a profile (/@user, with or without ?region=), a single post (/@user/<postId>) and a following list (/@user/follow). Left untouched, this scrapes one example of each shape. Unverified shapes (other regions, m. or bare host) are tried with a warning; /tag/ and feed links are skipped with a warning. Takes precedence over Username and Profile URL, unless it is still the untouched example list and you set a different Username or a Profile URL.",
            "items": {
              "type": "string"
            },
            "default": [
              "https://www.lemon8-app.com/@sydneydelreyy?region=us",
              "https://www.lemon8-app.com/@sydneydelreyy",
              "https://www.lemon8-app.com/@sydneydelreyy?region=ca",
              "https://www.lemon8-app.com/@sydneydelreyy/7499465815561994794?region=us",
              "https://www.lemon8-app.com/@sydneydelreyy/7499465815561994794",
              "https://www.lemon8-app.com/@sydneydelreyy/follow?region=us"
            ]
          },
          "profileUrl": {
            "title": "Profile URL",
            "type": "string",
            "description": "Full profile URL for a SINGLE profile, e.g. https://www.lemon8-app.com/@username?region=us. Takes precedence over Username. Ignored if Start URLs is provided."
          },
          "region": {
            "title": "Region",
            "enum": [
              "us",
              "au",
              "nz",
              "jp",
              "th",
              "id",
              "vn",
              "my",
              "sg",
              "ca",
              "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 per profile (max 500)",
            "default": 5
          },
          "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": 5
          },
          "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
          },
          "getFollowing": {
            "title": "Scrape Following Profiles",
            "type": "boolean",
            "description": "Automatically scrape profiles that the main user is following",
            "default": false
          },
          "followingLimit": {
            "title": "Following Profiles Limit",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Maximum number of following profiles to scrape",
            "default": 2
          },
          "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 pull for the same profile(s) in another run. For recurring daily monitoring of the same profile(s), 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). State is kept separately for each username/Profile URL/Start URLs set, region, and Get Detailed Post Data setting; use State key when you want to name or deliberately share a monitoring campaign. UPDATED means the post's own content changed. Compared: every returned post field (text, title, images, author, comment lists, saved/likes/comments counters, details). Excluded: signed-URL tokens and CDN host numbers on image/video links, comment order, files re-saved by Save Images/Videos, and the view counter (details.statistics.viewsCount); add your own with \"Ignore fields when detecting changes\". Details: the post's view counter (details.statistics.viewsCount) is a live engagement number that keeps ticking on its own, so a post whose view count alone moved stays UNCHANGED and is not returned or billed again. The current view count is still on every returned row. 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 username/Profile URL/Start URLs, region, and Get Detailed Post Data setting — different profile 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 profile — 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 that must NOT count as a change when deciding NEW vs UPDATED vs UNCHANGED, and are left out of changedFields. A bare name (e.g. savedCount) is ignored at any depth; a dotted path (e.g. details.statistics.likesCount) ignores just that field. The ignored fields still appear, with their current values, on every returned row. Applied to the stored baseline too, so changing this list never triggers a one-time wave of UPDATED rows. Leave empty to use the built-in rules (see Incremental changes above).",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}