# Mojeek Focus Search Scraper (`searchapi/mojeek-focus-search-scraper`) Actor

Scrapes Mojeek Focus results within built-in or custom site sets. Extracts titles, URLs, domains, snippets, dates, tags, focus metadata, and pagination without login.

- **URL**: https://apify.com/searchapi/mojeek-focus-search-scraper.md
- **Developed by:** [Search API](https://apify.com/searchapi) (community)
- **Categories:** Developer tools, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 52.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 search results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Mojeek Focus Search Scraper do?

Mojeek Focus Search Scraper is a **Mojeek Focus API alternative** for collecting public search results from [Mojeek](https://www.mojeek.com/). It supports documented library templates, custom site-domain sets, one query or a bounded batch of queries, and does not access logged-in or private content.

### What can you use it for?

- Search within curated website collections (e.g., only news sites, only educational domains)
- Niche research across specific industry or topic sites
- Monitor how topics appear within selected authoritative sources
- Build focused datasets from trusted domains

### What data can Mojeek Focus Search Scraper extract?

Each result contains source-backed fields only. Optional values that Mojeek does not expose are omitted rather than replaced with placeholders.

**Identity and ranking:** Stable ID, result type, global position, query position, page, and rank on page

**URLs:** Canonical result URL, displayed URL, domain, host, search URL, and site-cluster continuation URL when present

**Text** (5 fields): Title, Title (HTML), Snippet, Snippet (HTML), Description

**Dates:** Normalized publication date, raw date label, and relative-time label when present

**Categorization** (2 fields): Tags, Category

**Search Context** (4 fields): Language, Search Metadata, Query, Query (alias)

**Focus Context** (3 fields): Focus Template, Focus Type, Focus Sites

**Provenance:** Search query, language, source domain, focus context, and scrape timestamp

### How to scrape Mojeek Focus

#### Step 1: Enter your search

Type in your search term, like "artificial intelligence".

#### Step 2: Choose your Focus

Pick a built-in template like "News" or "Recipes", or provide a custom JSON array of domains.

#### Step 3: Set your preferences

Adjust the options below to customize your search.

#### Step 4: Run the tool

Click the run button and wait for your results.

### Input options

| Option | What it means | Required | Default |
|--------|---------------|----------|---------|
| **Search Query** | The search query to look up on Mojeek Focus. | Yes | artificial intelligence |
| **Search Queries** | Optional batch of queries. Duplicate values are removed. | No | `[]` |
| **Focus Template** | Mojeek Focus library template name. Documented built-ins include Dictionary, Education, Recipes, TechNews, Time, and Weather. | No | Recipes |
| **Custom Focus Site Domains** | Domains searched with Mojeek's public `site:` operator, then merged and deduplicated. Overrides focusTemplate. | No | `[]` |
| **Max Items** | Max search results to scrape. | No | 50 |
| **Maximum Pages per Query** | Hard page limit for each query. | No | 3 |
| **Maximum Concurrency** | Browser pages processed at once (1–5). | No | 2 |
| **Maximum Request Retries** | Retries temporary proxy/network failures; direct CAPTCHA pages fail immediately. | No | 2 |
| **Language** | Language code for results (e.g. 'en', 'de', 'fr', 'es'). | No | en |
| **Safe Search** | Safe search level: off, moderate, or strict. | No | 0 |
| **Proxy Configuration** | Optional Apify Proxy configuration. Use an authorized proxy when direct Mojeek access returns a challenge. | No | Apify Proxy enabled in Console |

### Documented Focus templates

Mojeek currently documents Dictionary, Education, Recipes, TechNews, Time, and Weather as built-in examples. The library can change; a different current library name may also be entered manually. Custom domain sets are implemented as separate `site:` searches because Mojeek's `foc` URL parameter identifies a cookie-backed Focus by name and does not accept raw domains.

### Output

Your results come in a clean, organized table with **two views**:

#### Overview view

Shows the most important fields at a glance:

- Position, Title, Domain, Snippet, Focus Template, Query, Scraped At

#### Full details view

Shows the complete source-backed record, including stable identity, ranking, publication, focus, query, and provenance fields. You can download the dataset as JSON, HTML, CSV, Excel, XML, or RSS, or read it through the Apify API.

```json
{
  "id": "https://example.com/article",
  "queryPosition": 1,
  "page": 1,
  "title": "Example result",
  "url": "https://example.com/article",
  "domain": "example.com",
  "snippet": "Public result snippet returned by Mojeek.",
  "focusTemplate": "News",
  "searchQuery": "artificial intelligence",
  "sourceDomain": "mojeek.com",
  "scrapedAt": "2026-08-30T00:00:00.000Z"
}
```

### How much does it cost to scrape Mojeek Focus?

Cost depends on the Actor pricing shown in Apify Console plus browser compute and any proxy traffic. Keep `maxItems`, `maxPages`, and concurrency small while testing. A five-result, one-page validation is the recommended starting point.

### Tips for best results

✅ **Use a relevant Focus template** to narrow results to trusted sources

✅ **Define custom focus sites** for precise control over which domains are searched

✅ **Be specific** with your search terms for more relevant results

✅ **Use bounded inputs** so pagination stops as soon as the requested item or page limit is reached

✅ **Enable an authorized Apify Proxy** when Mojeek challenges the cloud or local IP; the Actor detects challenges and never stores them as results

### Frequently asked questions

**What is Mojeek Focus?**
Mojeek Focus is a feature that lets you search within selected sets of websites. It works with Mojeek's own search index and requires no login or signup.

**How do I use a custom focus?**
Provide a JSON array of domain strings in the "Custom Focus Sites" field, e.g. `["wikipedia.org", "britannica.com"]`. This overrides the focusTemplate setting.

**How do I get the results?**
Your results are saved in your Apify dashboard. You can download them in various formats (JSON, CSV, Excel) or access them via the API.

**Why did my run return a CAPTCHA error?**
Mojeek may challenge an IP address. Configure an authorized Apify Proxy, lower concurrency, and retry once. The Actor deliberately fails closed instead of saving a challenge page or fabricating data.

### Legal, privacy, and support

This Actor extracts only publicly displayed search-result data. Do not use it to access private content or to violate Mojeek's terms, robots directives, or applicable law. Results can link to personal data protected by GDPR and other regulations; use them only with a legitimate basis. For help, use the Actor's **Issues** tab, and use the **API** tab for programmatic execution.

# Actor input Schema

## `query` (type: `string`):

The search query to look up on Mojeek Focus.

## `queries` (type: `array`):

Optional batch of search queries. When supplied, query is included first and duplicates are removed.

## `focusTemplate` (type: `string`):

Name of a Mojeek Focus library template. Currently documented built-ins include Dictionary, Education, Recipes, TechNews, Time, and Weather. Leave empty when using custom site domains.

## `focusSiteDomains` (type: `array`):

Optional domains to search individually with Mojeek's site operator. Results are merged and deduplicated. Overrides focusTemplate.

## `focusSites` (type: `string`):

Backward-compatible JSON-array form of focusSiteDomains. New runs should use focusSiteDomains.

## `maxItems` (type: `integer`):

Maximum number of search results to scrape.

## `maxPages` (type: `integer`):

Maximum Mojeek result pages requested for each query.

## `maxConcurrency` (type: `integer`):

Maximum number of browser pages processed at once.

## `maxRequestRetries` (type: `integer`):

Retries temporary network or proxy failures. Explicit direct-IP CAPTCHA pages fail immediately.

## `language` (type: `string`):

Language code for results (e.g. 'en', 'de', 'fr', 'es'). Mojeek uses ISO 639-1 codes.

## `safeSearch` (type: `string`):

Safe search level: off, moderate, or strict.

## `proxyConfiguration` (type: `object`):

Proxy settings for the scraper. Residential proxies recommended for reliable results.

## Actor input object example

```json
{
  "query": "artificial intelligence",
  "queries": [],
  "focusTemplate": "Recipes",
  "focusSiteDomains": [],
  "focusSites": "[\"wikipedia.org\", \"britannica.com\"]",
  "maxItems": 50,
  "maxPages": 3,
  "maxConcurrency": 2,
  "maxRequestRetries": 2,
  "language": "en",
  "safeSearch": "0",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "query": "artificial intelligence",
    "focusTemplate": "Recipes",
    "focusSites": "",
    "maxItems": 50,
    "language": "en",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("searchapi/mojeek-focus-search-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 = {
    "query": "artificial intelligence",
    "focusTemplate": "Recipes",
    "focusSites": "",
    "maxItems": 50,
    "language": "en",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("searchapi/mojeek-focus-search-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 '{
  "query": "artificial intelligence",
  "focusTemplate": "Recipes",
  "focusSites": "",
  "maxItems": 50,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call searchapi/mojeek-focus-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,searchapi/mojeek-focus-search-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/Yz6rkxVKIaoIKsNNq/builds/CEgQIL4KurtuoGPXO/openapi.json
