{
  "openapi": "3.0.1",
  "info": {
    "title": "Moj Short Video Scraper: Hashtag Videos, Views & Growth Monitor",
    "description": "Scrape Moj short videos from public hashtag pages and video links, no login. Get views, likes, shares, sound and creator followers per video. Filter by views, language, date and length, follow related hashtags, and monitor growth between runs. Export to Sheets, Slack, Zapier or Make.",
    "version": "0.1",
    "x-build-id": "zRmdRFBWugH8eSORE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~moj-short-video-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-moj-short-video-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/getascraper~moj-short-video-scraper/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-moj-short-video-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/getascraper~moj-short-video-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-moj-short-video-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",
        "properties": {
          "hashtags": {
            "title": "Hashtag pages",
            "type": "array",
            "description": "Moj hashtag pages to read, one per row: a link like https://mojapp.in/tag/5783707 or the number from it. Each page returns the posts Moj lists for that hashtag, with full video and creator details. Hashtag names cannot be looked up, so copy the link from the Moj app or web page.",
            "default": [
              "5783707",
              "3136"
            ],
            "items": {
              "type": "string"
            }
          },
          "videoUrls": {
            "title": "Video links",
            "type": "array",
            "description": "Moj video links to read, one per row, such as https://mojapp.in/video/3955156255 or https://mojapp.in/@handle/video/3955156255. A bare video number also works. Use this to track specific videos over time.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "expandHashtags": {
            "title": "Follow related hashtags",
            "type": "boolean",
            "description": "Also read the hashtag pages that appear in the captions of the videos found so far, most used first. This finds more videos around your topic. Off by default.",
            "default": false
          },
          "expansionDepth": {
            "title": "Hashtag levels",
            "minimum": 1,
            "maximum": 3,
            "type": "integer",
            "description": "How many rounds of related hashtags to follow. 1 reads hashtags used by your starting videos, 2 also reads hashtags used by those results.",
            "default": 1
          },
          "maxHashtagsToExpand": {
            "title": "Hashtags per level",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of related hashtag pages to read in each round. Each page lists up to about 15 videos.",
            "default": 5
          },
          "expansionKeywords": {
            "title": "Related hashtag keywords",
            "type": "array",
            "description": "Only follow related hashtags whose name contains one of these words, for example cricket or recipe. Leave empty to follow the most used hashtags.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minViews": {
            "title": "Minimum views",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos with at least this many views."
          },
          "maxViews": {
            "title": "Maximum views",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos with at most this many views. Useful for finding rising videos from smaller creators."
          },
          "minLikes": {
            "title": "Minimum likes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos with at least this many likes."
          },
          "minComments": {
            "title": "Minimum comments",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos with at least this many comments. Moj shows a comment count only on some videos, and videos without one are skipped when this is set."
          },
          "minShares": {
            "title": "Minimum shares",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos with at least this many shares. Videos where Moj shows no share count are skipped when this is set."
          },
          "minEngagementRatePercent": {
            "title": "Minimum engagement rate",
            "minimum": 0,
            "type": "number",
            "description": "Keep videos whose (likes + comments + shares) divided by views is at least this percentage. The rate is calculated from the numbers Moj shows."
          },
          "postedWithinDays": {
            "title": "Posted within days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos posted in the last N days. 1 means the last 24 hours."
          },
          "postedAfter": {
            "title": "Posted after",
            "type": "string",
            "description": "Keep videos posted on or after this date."
          },
          "postedBefore": {
            "title": "Posted before",
            "type": "string",
            "description": "Keep videos posted on or before this date."
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Keep videos in these languages, for example Hindi, Tamil, Telugu, Kannada, Bengali, Marathi, Gujarati, Punjabi, Malayalam, Bhojpuri or English. The language is the one Moj assigns to the video.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minDurationSeconds": {
            "title": "Minimum length",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos at least this long."
          },
          "maxDurationSeconds": {
            "title": "Maximum length",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos at most this long."
          },
          "includeHashtags": {
            "title": "Must use any of these hashtags",
            "type": "array",
            "description": "Keep videos whose caption uses at least one of these hashtags, written with or without the # sign.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeHashtags": {
            "title": "Skip these hashtags",
            "type": "array",
            "description": "Drop videos whose caption uses any of these hashtags.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "captionKeywords": {
            "title": "Caption must contain any word",
            "type": "array",
            "description": "Keep videos whose caption contains at least one of these words or phrases. Not case sensitive.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeCaptionKeywords": {
            "title": "Caption must not contain",
            "type": "array",
            "description": "Drop videos whose caption contains any of these words or phrases. Not case sensitive.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeAdult": {
            "title": "Skip adult-flagged videos",
            "type": "boolean",
            "description": "Drop videos that Moj itself flags as adult content.",
            "default": true
          },
          "creatorHandles": {
            "title": "Only these creators",
            "type": "array",
            "description": "Keep only videos by these creators, written as handles or profile links such as @starsportsindia____. Handy for finding one creator or brand inside hashtag pages.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minCreatorFollowers": {
            "title": "Minimum creator followers",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos from creators with at least this many followers."
          },
          "maxCreatorFollowers": {
            "title": "Maximum creator followers",
            "minimum": 0,
            "type": "integer",
            "description": "Keep videos from creators with at most this many followers. Good for spotting small creators whose videos are taking off."
          },
          "maxResults": {
            "title": "Maximum videos",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of videos to save after filtering. Hashtag pages list up to about 15 videos each, so large runs need more hashtags or Follow related hashtags.",
            "default": 20
          },
          "sortBy": {
            "title": "Sort results by",
            "enum": [
              "discovery",
              "mostViews",
              "mostLikes",
              "mostShares",
              "highestEngagement",
              "newest",
              "oldest"
            ],
            "type": "string",
            "description": "Order of the saved videos. The cap above is applied after sorting.",
            "default": "discovery"
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Give this search a name to track it over time. Each run is compared with the previous run under the same name: videos are marked new, updated or unchanged with views, likes and shares growth, and a linked video that Moj removed is reported once. Use a fixed name and schedule the Actor. Leave empty for a one-off run."
          },
          "onlyChanges": {
            "title": "Only output changes",
            "type": "boolean",
            "description": "When a monitor name is set, save only new, updated and removed videos and skip unchanged ones.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. By default the Actor connects directly and moves to Apify proxies by itself if a request is refused. Set a proxy only to force a specific route."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}