# Likee Scraper — Videos, Profiles & Creator Analytics (`steadyscrape/likee-scraper`) Actor

Every video of any public Likee creator with views, likes, comments, shares, engagement rate, hashtags and music, plus the profile: followers, linked socials and posting analytics. Date and engagement filters, and a monitor mode that returns only new videos. No browser, no login.

- **URL**: https://apify.com/steadyscrape/likee-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Social media, Videos, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 videos

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

## Likee Scraper — videos, profiles and creator analytics

Give it Likee creators and get **every video they published, with its numbers** — views, likes, comments, shares,
engagement rate, caption, hashtags, mentions, music, cover, country and publish date — plus one **profile row** per
creator with followers, total likes, linked Instagram / YouTube / Facebook / VK and posting analytics.

It talks to the same JSON API the Likee website used, **100 videos per request**. No browser, no login, no cookies,
no proxy to pay for: a creator with 2,000 videos is about 20 requests and one minute.

**US$1 per 1,000 videos.** Rows that carry nothing (unknown ID, private account, account without videos, a refusal)
are free, and a video your filters leave out is never written, so it is never charged.

### What makes it different

- **The whole history, not the first screen.** The walk follows Likee's own paging to the first video of the account.
  Measured on 2026-09-20: 2,082 videos of one creator, back to 2018, plus two more creators — 2,711 videos in 43
  requests and 50 seconds. A page Likee serves short (98 videos instead of 100) is not mistaken for the end.
- **Filters that save you money, not only rows.** `publishedAfter: "7 days"` stops the walk as soon as a page ends on
  an older video: a weekly report on 50 creators is about 100 requests. Minimum views, likes, comments, shares and
  engagement rate are applied before anything is written.
- **Monitor mode that cannot lose a video.** `onlyNewVideos` remembers the newest post per creator and delivers only
  what came after. Nothing new costs two requests and no charge. A run cut short by your spending limit remembers
  nothing, so the next run delivers the rest.
- **A profile row worth reading.** Followers, following, total likes, the video count Likee shows, verification
  badge, bio, website, linked socials — and analytics over the videos of the run: posts per week, average and median
  views, average likes / comments / shares, average engagement rate and the most viewed video. Analytics cover every
  video walked in your date window, not only the ones that passed your engagement filters: an average over the hits
  alone would describe your filter, not the creator.
- **Every row says what happened.** `status` is `ok`, `not_found`, `private`, `no_videos` or `blocked`, with a
  `reason` in plain words. A run never ends with an empty dataset and no explanation.
- **Honest about failure.** Likee sometimes answers `system busy`; each request is retried from the Actor's own IP
  and then through Apify's datacenter proxy. If a walk is refused midway you keep (and pay for) only what was read,
  and the profile row says where it stopped.

### Use cases

- **Influencer vetting**: real median views and engagement rate of a creator over the last 90 days, next to the
  follower count they quote.
- **Competitor and brand monitoring**: a scheduled monitor run on a list of accounts, delivering only new videos to a
  webhook, Google Sheets, Make or n8n.
- **Trend and hashtag research**: captions, hashtags and music of the best-performing videos of a niche's creators.
- **Creator discovery pipelines**: mentions carry the `uid` and name of every account a creator tags.
- **Datasets** for social-media research on a platform with large audiences in Russia, South and Southeast Asia and
  the Middle East.

### Input

```json
{
    "profiles": ["itz.danila", "@Likee_USA", "https://likee.video/@inphasegooseflip"],
    "maxVideosPerProfile": 200,
    "includeProfile": true,
    "publishedAfter": "90 days",
    "minViews": 1000
}
```

| field | what it does |
|---|---|
| `profiles` | Likee IDs, with or without `@`, or likee.video links of a profile or of one of its videos. A repeat is scraped once. |
| `maxVideosPerProfile` | Newest first; default `100`, `0` for the whole profile. Counts the videos written, after filters. |
| `includeProfile` | Adds the profile row (default `true`). |
| `onlyNewVideos` | Monitor mode: only videos published since the previous run of this Actor on your account. |
| `publishedAfter`, `publishedBefore` | A day (`2026-08-01`, the upper bound includes the whole day) or an age (`7 days`, `2 weeks`, `3 months`). |
| `minViews`, `minLikes`, `minComments`, `minShares` | Floors; a video below any of them is not written. |
| `minEngagementRate` | Floor in percent of (likes + comments + shares) / views. |

A monitor for a weekly report:

```json
{ "profiles": ["itz.danila", "asya_siam"], "onlyNewVideos": true, "maxVideosPerProfile": 0, "includeProfile": false }
```

### Output

One dataset with two kinds of row, told apart by `type`. The **Videos** and **Profiles** views show each as a table.

A video:

```json
{
    "type": "video",
    "status": "ok",
    "reason": null,
    "username": "inphasegooseflip",
    "profileUrl": "https://likee.video/@inphasegooseflip",
    "uid": "2998929355",
    "nickname": "inphasegooseflip",
    "postId": "7635723317164378059",
    "url": "https://likee.video/@inphasegooseflip/video/7635723317164378059",
    "caption": "Can you repeat this🤔 #Trendingme #Satisfying #penspinning #Ttutorial",
    "hashtags": ["Trendingme", "Satisfying", "penspinning", "Ttutorial"],
    "mentions": [],
    "publishedAt": "2026-05-03T17:46:14.000Z",
    "views": 294297,
    "likes": 3205,
    "comments": 3,
    "shares": 931,
    "engagementRate": 1.41,
    "coverUrl": "https://videosnap.like.video/eu_live/…_4.jpg",
    "width": 720,
    "height": 1280,
    "musicName": null,
    "musicId": null,
    "country": "US",
    "scrapedAt": "2026-09-20T12:00:00.000Z"
}
```

A profile:

```json
{
    "type": "profile",
    "status": "ok",
    "reason": null,
    "username": "inphasegooseflip",
    "profileUrl": "https://likee.video/@inphasegooseflip",
    "uid": "2998929355",
    "nickname": "inphasegooseflip",
    "bio": "CEO of spinning stuff 😵‍💫",
    "verifiedAs": "Verified Creator",
    "level": 25,
    "followers": 22714,
    "following": 2,
    "totalLikes": 197060,
    "totalVideos": 114,
    "isPrivate": false,
    "avatarUrl": "https://img.like.video/…",
    "website": null,
    "socials": { "facebook": null, "instagram": "inphasegoose.flip", "twitter": null, "youtube": null, "vk": null, "ok": null, "weibo": null },
    "analytics": {
        "videosAnalysed": 111,
        "firstVideoAt": "2023-03-01T19:38:16.000Z",
        "lastVideoAt": "2026-05-30T16:55:04.000Z",
        "postsPerWeek": 0.66,
        "averageViews": 49526,
        "medianViews": 25010,
        "averageLikes": 1799,
        "averageComments": 37.4,
        "averageShares": 146,
        "averageEngagementRate": 5.49,
        "mostViewedPostId": "7573434849579501515"
    },
    "scrapedAt": "2026-09-20T12:00:00.000Z"
}
```

| field | notes |
|---|---|
| `status` | `ok`; `not_found` (no creator has this ID); `private` (Likee lists its videos to nobody; the row still carries followers and bio); `no_videos`; `blocked` (Likee refused every route). Only `ok` rows are charged. |
| `engagementRate` | (likes + comments + shares) / views, in percent, two decimals; `null` for a video without views. |
| `totalVideos` | The count Likee shows on the profile. It can exceed the videos Likee lists (114 shown, 111 listed in the example): hidden and removed videos are counted but not served. |
| `mentions` | `{ name, uid }` of each tagged account, as Likee sends them. |
| `musicName`, `musicId` | `null` for a video with its own sound. |
| `postId` | Likee's id; ids grow with time, so they sort chronologically. |
| `analytics` | Over the videos walked in this run inside your date window; `postsPerWeek` is `null` when they span under a week. |

The key-value store record `SUMMARY` holds the run's totals: creators per status, videos, requests made and whether
your spending limit stopped it.

### Pricing

Pay per event, no subscription:

| event | price |
|---|---|
| `video` — a video row | **US$0.001** (US$1 per 1,000) |
| `profile` — a profile row with status `ok` | **US$0.002** |
| `not_found`, `private`, `no_videos`, `blocked` rows | free |

Set a maximum charge per run in Apify and the Actor stops there, asking Likee for nothing more.

### Limits

- **No video files.** Likee's public API no longer serves a playable URL (`videoUrl` comes back empty for every
  video, checked on 700 videos of three accounts on 2026-09-20). The row carries the cover image and the link.
- **Creators, not search.** Likee's hashtag, trending and comment endpoints answer `system busy` to every public
  client (2026-09-20), so this Actor reads profiles and their videos, which answer every time.
- **likee.video links may not open in a desktop browser**: since 2026 the website redirects profile and video pages
  to its home page in several countries. The links are the canonical ones and open in the app.
- Counts are what Likee reports at the moment of the run.
- `onlyNewVideos` keeps its memory in a key-value store named `steadyscrape-likee-state` in your account; delete it
  to start from a new baseline.

### Is it legal?

The Actor reads only what Likee publishes to anybody without logging in: public profiles and the public videos'
counts and captions. It does not read private accounts, messages or anything behind a login. Creator names and
captions can be personal data: if you are in the EU or handle data of EU residents, make sure you have a lawful
basis under the GDPR for what you store, and do not use the data to contact people who did not ask for it.

# Actor input Schema

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

Likee IDs (<code>itz.danila</code> or <code>@itz.danila</code>) or likee.video links of a profile or of any of its videos. One creator per line; a repeat is scraped once.

## `maxVideosPerProfile` (type: `integer`):

Newest first. <code>0</code> reads the whole profile: Likee gives 100 videos per request, so a creator with 2,000 videos is about 20 requests and one minute.

## `includeProfile` (type: `boolean`):

One extra row per creator: followers, following, total likes, video count, verification badge, bio, linked Instagram / YouTube / Facebook / VK, and analytics over the videos of this run (posts per week, average and median views, average likes, comments and shares, average engagement rate, most viewed video). Charged as one <code>profile</code> event.

## `onlyNewVideos` (type: `boolean`):

Turns a scheduled run into a monitor. The first run delivers the newest videos as a baseline and remembers where each creator stood; every later run delivers only what was published since, in two requests per creator when there is nothing new. A run cut short by your spending limit remembers nothing, so the next one delivers the rest.

## `publishedAfter` (type: `string`):

A day (<code>2026-08-01</code>) or an age: <code>7 days</code>, <code>2 weeks</code>, <code>3 months</code>. An age is what a scheduled run wants. The walk stops as soon as a page ends on an older video, so a short window costs one request per creator.

## `publishedBefore` (type: `string`):

A day, included whole (<code>2026-08-01</code> keeps the videos of 1 August), or an age such as <code>30 days</code>.

## `minViews` (type: `integer`):

Skip videos below this view count.

## `minLikes` (type: `integer`):

Skip videos below this like count.

## `minComments` (type: `integer`):

Skip videos below this comment count.

## `minShares` (type: `integer`):

Skip videos below this share count.

## `minEngagementRate` (type: `integer`):

Skip videos whose (likes + comments + shares) / views is below this percentage.

## Actor input object example

```json
{
  "profiles": [
    "Likee_USA"
  ],
  "maxVideosPerProfile": 20,
  "includeProfile": true,
  "onlyNewVideos": false,
  "minViews": 0,
  "minLikes": 0,
  "minComments": 0,
  "minShares": 0,
  "minEngagementRate": 0
}
```

# Actor output Schema

## `rows` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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": [
        "Likee_USA"
    ],
    "maxVideosPerProfile": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/likee-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": ["Likee_USA"],
    "maxVideosPerProfile": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/likee-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": [
    "Likee_USA"
  ],
  "maxVideosPerProfile": 20
}' |
apify call steadyscrape/likee-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/likee-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/GKAUlmy7vWEcPMnY7/builds/NalCNaj4XqFTb0Rsj/openapi.json
