# Moj Scraper (`ribtools/moj-scraper`) Actor

Scrape Moj (mojapp.in) short videos from profiles, hashtags and video URLs: views, likes, shares, captions, hashtags, music, author and comments.

- **URL**: https://apify.com/ribtools/moj-scraper.md
- **Developed by:** [RibTools](https://apify.com/ribtools) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 video results

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?

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

## Moj Scraper

Extract short videos, engagement stats, and comments from Moj — India's short-video app — by profile, hashtag, or direct video URL, all through fast, direct-API scraping with no browser automation.

### What is Moj Scraper?

**Moj Scraper** is a powerful data extraction tool that automatically collects short videos from [Moj](https://mojapp.in/), India's short-video app, published by ShareChat. Simply provide profiles, hashtags, or video URLs and get structured data including captions, hashtags, view/like/share/save counts, music, author details, and video/thumbnail URLs.

This scraper talks to Moj's own APIs directly (no browser, no screenshots), delivering clean, structured datasets ready for analysis or integration into your systems.

### What can this Actor do?

- **Extract comprehensive video data** — caption, hashtags, language, duration, resolution, view/like/comment/share/save counts, direct video and thumbnail URLs
- **Extract music metadata** — audio track id, name, artist, and cover art
- **Extract author data** — handle, name, bio, avatar, video count, total likes, and follower count
- **Follow multiple entry points** — profile handles, hashtags, and direct video URLs, in the same run
- **Automatic pagination** — crawls a profile's or hashtag's feed until the requested number of results is reached
- **Date and likes filters** — narrow a profile's videos by publish date or a minimum/maximum like count
- **Optional comments add-on** — fetch the top comments for every scraped video
- **Premium proxies included** — high-quality residential proxies built in at no additional cost
- **Structured output** — JSON, CSV, Excel formats available
- **API integration** — real-time data access through Apify API
- **Scheduled runs** — automated daily/weekly data collection

### What data can Moj Scraper extract?

| Field | Description | Example |
| ----- | ----------- | ------- |
| **ID** | Moj video id | `3629256923` |
| **URL** | Public video URL | `https://mojapp.in/@moj/video/3629256923` |
| **Caption** | Video caption | "100% असली #टमाटर से बना" |
| **Hashtags** | Hashtags tagged on the video | `["टमाटर"]` |
| **Language** | Content language | `Hindi` |
| **Published** | Publish time, ISO 8601 UTC | `2024-10-18T12:15:42Z` |
| **Engagement** | Views, likes, comments, shares, saves | 174971 views |
| **Video / thumbnail** | Direct MP4 and thumbnail URLs | `https://cdn-moj-g.sharechat.com/...` |
| **Music** | Audio track id, name, artist, cover art | "Original Sound" |
| **Author** | Id, handle, name, bio, avatar, video count, total likes, follower count | `moj` |
| **Input** | Which profile/hashtag/URL this video came from, and its kind | `moj` (`profile`) |
| **Comments** | Top comments (with the comments add-on): text, author, likes, replies | "Great video!" |

### How to scrape Moj

#### Step-by-step tutorial:

1. **Add profiles, hashtags, or video URLs** — see compatible formats below
2. **Configure options** (optional) — set a per-profile/hashtag result limit, a date range or like-count range for profile videos, and/or the comments add-on
3. **Run the scraper** — Click "Start" and monitor progress in real-time
4. **Download results** — Export data in JSON, CSV, or Excel format

Proxies are included automatically — no setup required.

#### Compatible URL examples:

- **Profile**: `moj`, `@moj`, or `https://mojapp.in/@moj`
- **Hashtag**: `comedy`, `#comedy`, or `https://mojapp.in/tag/1467`
- **Video URL**: `https://mojapp.in/@moj/video/3629256923`, `https://mojapp.in/video/3629256923`, or a bare video id

**Important**: Only entries matching these patterns will work. Unrecognized entries are skipped with a warning rather than failing the run.

### How much does it cost to scrape Moj?

Moj Scraper uses **pay-per-event (PPE)** pricing — you only pay for the specific records the scraper actually returns, plus a flat per-run start fee.

#### Is scraping Moj free?

The scraper follows Apify's PPE model with the following events:

- **`apify-actor-start`** ($0.001): charged once per run
- **`result-video-data`** ($0.004, with a free monthly tier): charged for every video returned
- **`result-addon-comment-data`** ($0.00125): charged for every comment returned (the comments add-on)

Pricing is optimized for efficiency, using minimal compute units while maintaining high success rates. Contact support for volume discounts on large-scale projects.

### Input configuration

The scraper accepts the following inputs:

#### Profiles

Moj handles or profile URLs, one per row, e.g. `moj`, `@moj`, or `https://mojapp.in/@moj`. Each profile's videos are scraped newest first. Each row can set its own **Max videos**, **Videos published after/before** and **Comments per video**; fields left empty use the defaults below.

#### Hashtags

Hashtag names or tag URLs, one per row, e.g. `comedy`, `#comedy`, or `https://mojapp.in/tag/1467`. Each row can set its own **Max videos** and **Comments per video**.

#### Video URLs

Direct Moj video URLs, one per row, e.g. `https://mojapp.in/@moj/video/3629256923`. Each URL returns one video, and each row can set its own **Comments**.

#### Videos per profile or hashtag

Default maximum videos scraped from each profile and each hashtag whose row leaves **Max videos** empty. Video URLs are not limited.

#### Profile videos published after

Profiles only. Stops at the first video published before this date (YYYY-MM-DD). Default for profile rows that leave their own date empty.

#### Profile videos published before

Profiles only. Skips videos published after this date (YYYY-MM-DD). Default for profile rows that leave their own date empty.

#### Minimum likes

Only keep videos with at least this many likes, from every profile, hashtag and video URL. Filtered-out videos are never charged.

#### Maximum likes

Only keep videos with at most this many likes, from every profile, hashtag and video URL. Filtered-out videos are never charged.

#### Comments per video ($)

Also scrape up to this many top comments per video, charged per comment, for every row that leaves its own comments field empty. 0 turns the add-on off; a row set to 0 stays off even when this default is higher.

#### Example input

```json
{
  "profiles": [
    { "profile": "moj", "maxVideos": 50, "publishedAfter": "2026-09-01" },
    { "profile": "@another_creator", "commentsPerVideo": 20 }
  ],
  "hashtags": [{ "hashtag": "comedy", "maxVideos": 200 }],
  "postURLs": [{ "url": "https://mojapp.in/@moj/video/3629256923" }],
  "maxVideos": 100,
  "minLikes": 1000,
  "commentsPerVideo": 0
}
```

### Output example

```json
{
  "type": "video",
  "id": "3629256923",
  "shortcode": "7XZMern",
  "url": "https://mojapp.in/@moj/video/3629256923",
  "caption": "100% असली #टमाटर से बना",
  "hashtags": ["टमाटर"],
  "language": "Hindi",
  "created_at": "2024-10-18T12:15:42Z",
  "duration_seconds": 15.04,
  "width": 1080,
  "height": 1920,
  "view_count": 174971,
  "like_count": 7112,
  "comment_count": 658,
  "share_count": 2289,
  "save_count": 2198,
  "video_url": "https://cdn-moj-g.sharechat.com/bd5223f_xmk/contents/moj_3629256923/compressed/Drldx22ZrdUpXW2ENbPPF94nJWej91Iwr621.mp4?referrer=requestType50&tenant=moj",
  "thumbnail_url": "https://cdn-im.sharechat.com/bd5223f_xmk/thumbnail_3629256923_784117_3155d03c_1729252427414_sc_first.jpeg?referrer=requestType50&tenant=moj",
  "music": {
    "id": "1996627866",
    "name": "Original Sound",
    "author": "moj",
    "cover_url": "https://cdn-im.sharechat.com/33d5318_26f/audio/gm_compressed_17292537.84523_136d073b_1647438102664.jpeg?tenant=moj&referrer=audio-service&f=33d5318_26f/audio/gm_compressed_17292537.84523_136d073b_1647438102664.jpeg"
  },
  "author": {
    "id": "4624146388",
    "handle": "moj",
    "name": "moj",
    "bio": "Moj Bana Hit Hoja",
    "avatar_url": "https://cdn-im.sharechat.com/136d073b_1647438102664.jpeg?referrer=user-service-requestType50&tenant=moj",
    "video_count": 2436,
    "like_count": 62273772,
    "follower_count": 6859891
  },
  "input": "moj",
  "input_type": "profile",
  "comments": [
    {
      "id": "688",
      "text": "@moj kindly check my I'd when i will get recognition I'm tired of making videos",
      "created_at": "2025-12-15T17:25:03Z",
      "like_count": 3,
      "reply_count": null,
      "author": {
        "id": "10052901021",
        "handle": "advayushnirwan",
        "name": "Ayush Singh Nirwan"
      }
    }
  ]
}
```

You can download the dataset extracted by **Moj Scraper** in various formats such as **JSON, HTML, CSV, or Excel**. The data is automatically cleaned and normalized for immediate use in analysis tools, databases, or business applications.

### Use cases and applications

- **Influencer research** — Identify and evaluate Moj creators by engagement, video count, and total likes
- **Content trend analysis** — Track trending hashtags and formats across regional-language short video
- **Social media monitoring** — Follow a brand's or creator's profile for new uploads and engagement shifts
- **Audience sentiment research** — Analyze comment threads for feedback and sentiment on specific videos

### Integrations and API access

Moj Scraper seamlessly integrates with popular platforms:

- **Zapier** — Automate data workflows and notifications (via [Apify Zapier integration](https://docs.apify.com/platform/integrations/zapier))
- **Make (Integromat)** — Create complex automation scenarios (via [Apify Make integration](https://www.make.com/en/integrations/apify))
- **Google Sheets** — Direct data export for analysis
- **REST API** — Programmatic access to extracted data ([instructions here](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api))
- **Python/Node.js SDKs** — Easy integration into applications ([instructions here](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api#javascript-and-python-client))

### FAQ and Support

#### Do I need to configure a proxy?

No. Moj implements anti-scraping measures that block direct requests, so the Actor includes high-quality residential proxies automatically at no additional cost. There's nothing to configure.

#### Why is a video missing from a profile or hashtag run?

A video already returned from a `Video URLs` entry in the same run is not counted again in a profile's or hashtag's results (deduped by video id), and profile results respect the date and likes filters you set. Videos that fail to parse are skipped and logged rather than failing the whole run.

#### What's the comments add-on?

Setting `Comments per video` above 0 fetches up to that many top comments for every scraped video, billed as separate `result-addon-comment-data` events. It never fails a video if comments can't be fetched.

#### How often is the data updated?

Moj updates content in real-time. For fresh data, schedule regular scraper runs or use our API for on-demand extraction.

#### What if some entries don't work?

The scraper only supports specific formats for profiles, hashtags, and video URLs. Ensure your entries match the compatible formats listed above. Entries outside these patterns are skipped with a warning.

#### Do you offer custom solutions?

Absolutely! We can customize the scraper for specific requirements, additional data points, or integration with your existing systems. Contact us through the Issues tab for enterprise solutions.

#### Need help or have feedback?

- **Report issues**: Use the Issues tab for bug reports and feature requests
- **Custom development**: Contact us for tailored solutions and enterprise integrations

# Changelog

This Actor's version history is a separate document: https://apify.com/ribtools/moj-scraper/changelog.md

# Actor input Schema

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

Moj handles or profile URLs, one per row, e.g. moj, @moj or https://mojapp.in/@moj. Each profile's videos are scraped newest first. Fields left empty in a row use "Default limits and filters".

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

Hashtag names or tag URLs, one per row, e.g. comedy, #comedy or https://mojapp.in/tag/1467. Fields left empty in a row use "Default limits and filters".

## `postURLs` (type: `array`):

Direct Moj video URLs, one per row, e.g. https://mojapp.in/@moj/video/3629256923. Each URL returns one video.

## `maxVideos` (type: `integer`):

Maximum videos scraped from each profile and each hashtag. Video URLs are not limited.

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

Profiles only. Stops at the first video published before this date (YYYY-MM-DD).

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

Profiles only. Skips videos published after this date (YYYY-MM-DD).

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

Every profile, hashtag and video URL. Only keep videos with at least this many likes. Filtered-out videos are never charged.

## `maxLikes` (type: `integer`):

Every profile, hashtag and video URL. Only keep videos with at most this many likes. Filtered-out videos are never charged.

## `commentsPerVideo` (type: `integer`):

Also scrape up to this many top comments per video, charged per comment. 0 turns the add-on off.

## Actor input object example

```json
{
  "profiles": [
    {
      "profile": "moj",
      "maxVideos": 10
    }
  ],
  "maxVideos": 10,
  "commentsPerVideo": 0
}
```

# Actor output Schema

## `items` (type: `string`):

All scraped videos.

# 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": [
        {
            "profile": "moj",
            "maxVideos": 10
        }
    ],
    "maxVideos": 10,
    "commentsPerVideo": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("ribtools/moj-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": [{
            "profile": "moj",
            "maxVideos": 10,
        }],
    "maxVideos": 10,
    "commentsPerVideo": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("ribtools/moj-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": [
    {
      "profile": "moj",
      "maxVideos": 10
    }
  ],
  "maxVideos": 10,
  "commentsPerVideo": 0
}' |
apify call ribtools/moj-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ribtools/moj-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/qgQZ7HLYWPgV7FM4I/builds/6WZNrf6rgkVy0eFWg/openapi.json
