# Startpage SERP Scraper – Organic Search API (`datascraperes/startpage-search-scraper`) Actor

Scrape Startpage organic search results for up to 1,000 queries. Collect rankings, titles, URLs, domains, snippets, localization, Safe Search, date filters, and pagination. Export clean SERP data as JSON, CSV, or Excel, use the Apify API, or schedule recurring SEO and competitor monitoring.

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

## Pricing

from $0.45 / 1,000 organic startpage 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?

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

Turn Startpage searches into **structured organic SERP data** without manually copying result pages. Enter one or more queries and receive ranked titles, URLs, domains, snippets, localization settings, and timestamps in an export-ready Dataset.

### What this Actor does

Startpage SERP Scraper collects organic web results for SEO research, rank tracking, competitor monitoring, and search visibility analysis. It supports pagination, regional markets, result languages, Safe Search, date filters, duplicate-query normalization, and resumable runs.

Each successful Dataset row represents one unique organic result. Operational summaries and per-query statuses remain separate from customer result rows, making the Dataset ready for analysis or downstream processing.

### Use cases

- Track organic keyword positions for brands, products, and topics.
- Compare localized result ordering across countries and languages.
- Discover relevant pages and competing domains.
- Build clean URL lists for enrichment or content research.
- Compare Startpage visibility with other search engines.

### How to use

1. Open the Actor in Apify Console.
2. Add at least one value to **Search queries** and adjust the result or localization options if needed.
3. Click **Start** and open the Dataset when the run finishes.

### Input

| Field | Type | Default | Description |
|---|---:|---:|---|
| `queries` | array of strings | required | One to 1,000 queries. Blank values are rejected, internal whitespace is normalized, and duplicates are removed case-insensitively. |
| `maxResultsPerQuery` | integer | `20` | Maximum unique organic results delivered per query, from 1 to 100. |
| `maxPagesPerQuery` | integer | `2` | Maximum result pages requested per query, from 1 to 10. |
| `region` | string | `en_US` | Regional market, such as `en_US`, `es_ES`, or `de_DE`. Select `all` for no country-specific region. |
| `language` | string | `english` | Result language, such as `english`, `espanol`, or `deutsch`. |
| `safeSearch` | string | `moderate` | Accepts `off`, `moderate`, or `strict`. |
| `timeRange` | string | `any` | Accepts `any`, `day`, `week`, `month`, or `year`. |

Each query can contain up to 500 characters. The complete region and language choices are available in the Actor input form.

```json
{
  "queries": [
    "Apify web scraping"
  ],
  "maxResultsPerQuery": 3,
  "maxPagesPerQuery": 1,
  "region": "en_US",
  "language": "english",
  "safeSearch": "moderate",
  "timeRange": "any"
}
```

### Output

Results are stored in the default Dataset and can be exported as JSON, JSONL, CSV, Excel, XML, or RSS. One item represents one unique organic result for one query.

This is the complete Dataset item from a real successful run:

```json
{
  "type": "organicResult",
  "query": "Apify web scraping",
  "queryId": "0577f6b27431c332d8eb7b4e",
  "region": "en_US",
  "language": "english",
  "safeSearch": "moderate",
  "timeRange": "any",
  "pagesFetched": 1,
  "organicResultsFound": 3,
  "paginationStoppedReason": "max_results",
  "fetchedAt": "2026-08-30T19:39:26.075450+00:00",
  "resultId": "5a832fbfaab16fdceb20392c6987c209",
  "page": 1,
  "pagePosition": 1,
  "position": 1,
  "title": "Apify: The largest marketplace of trusted tools for AI",
  "url": "https://apify.com/",
  "domain": "apify.com",
  "displayUrl": "apify.com",
  "description": "65,449 tools for your AI ... Apify is the largest marketplace of trusted tools for AI. Get real-time web data, track competitors, generate leads, monitor social ..."
}
```

The default Key-Value Store also contains:

- `SUMMARY`: aggregate query, page, retry, challenge, delivery, and charged-result counters.
- `QUERY_STATUSES`: one status record per processed query, including empty and failed queries.
- `RUN_STATE`: the checkpoint used to resume an interrupted run with the same input.

### Pricing

The Actor uses pay-per-event pricing. Each unique organic result delivered to the default Dataset triggers one `organic-result` charge; the actual billing unit remains one delivered result.

| Apify plan tier | Price per organic result | Equivalent per 1,000 organic results |
|---|---:|---:|
| Free | $0.0006 | $0.60 |
| Bronze | $0.00055 | $0.55 |
| Silver | $0.0005 | $0.50 |
| Gold | $0.00045 | $0.45 |
| Platinum | $0.00045 | $0.45 |
| Diamond | $0.00045 | $0.45 |

Empty or failed queries, duplicate results, `SUMMARY`, `QUERY_STATUSES`, and `RUN_STATE` do not trigger an `organic-result` charge. If a maximum total charge is configured, the Actor stops delivering new results when the remaining limit cannot cover another result. The Actor's **Pricing** tab is the source of truth for active prices.

### Related Actors

| Actor | Best for |
|---|---|
| [Google SERP Scraper API – Search Results Scraper](https://apify.com/datascraperes/google-serp-scraper) | Google organic search monitoring and result collection. |
| [Brave Search Scraper – Organic SERP Results](https://apify.com/datascraperes/brave-search-scraper) | Privacy-focused Brave Search organic results. |
| [Bing Search Scraper – SERP Results](https://apify.com/datascraperes/bing-search-scraper) | Bing search result collection and comparison. |
| [DuckDuckGo Search Scraper — Organic SERP API](https://apify.com/datascraperes/duckduckgo-search-results-scraper) | DuckDuckGo organic results for privacy-focused research. |
| [Yahoo Search Results Scraper](https://apify.com/datascraperes/yahoo-search-scraper) | Yahoo Search result collection. |

### Limits and data quality

- The Actor returns organic web results. It does not return ads, shopping panels, maps, news carousels, or AI-generated answers.
- Results can vary by time, region, language, Safe Search settings, filters, and Startpage availability.
- A query can legitimately return no results. Check `QUERY_STATUSES` to distinguish an empty result set from a failed request.
- The Actor stops at the requested result limit, page limit, end of pagination, or a page containing no new results.
- Destination URLs are deduplicated within each query. Stable result IDs prevent duplicate delivery after a resumed run.
- Retries can recover temporary request failures. A query that still fails keeps its status in `QUERY_STATUSES` without creating a result charge.

### Frequently asked questions

#### Can I search several queries in one run?

Yes. Add up to 1,000 values to `queries`. Each normalized query receives its own result positions and status record.

#### Can I request results for a specific country?

Yes. Select a supported regional market in `region`, such as `en_US`, `es_ES`, or `de_DE`, together with the desired result language.

#### Why did I receive fewer results than requested?

Startpage may expose fewer unique organic results, a filter may narrow the result set, or pagination may end before the configured maximum. `paginationStoppedReason` records why collection stopped.

#### How do I inspect failed or empty queries?

Open `QUERY_STATUSES` in the run's default Key-Value Store. It contains the status, result count, pages fetched, retry count, and a sanitized error when applicable.

### Responsible use

Use this Actor only for lawful purposes and in accordance with applicable terms, privacy requirements, and data-protection rules. Users are responsible for how they collect, store, and use the resulting data.

### Support

Open an issue in the Actor's **Issues** tab and include the run ID, sanitized input, affected query, and relevant `QUERY_STATUSES` entry. Do not include access tokens or other secrets.

# Actor input Schema

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

Queries are trimmed, internal whitespace is normalized, and case-insensitive duplicates are removed.

## `maxResultsPerQuery` (type: `integer`):

Maximum unique organic results delivered for each query.

## `maxPagesPerQuery` (type: `integer`):

Maximum Startpage result pages requested for each query.

## `region` (type: `string`):

Startpage region setting. The country suffix also selects the private proxy route.

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

Language setting sent to Startpage.

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

Startpage safe-search mode.

## `timeRange` (type: `string`):

Restrict results by recency when Startpage supports it for the query.

## Actor input object example

```json
{
  "queries": [
    "Apify web scraping",
    "Python HTTP client"
  ],
  "maxResultsPerQuery": 10,
  "maxPagesPerQuery": 1,
  "region": "en_US",
  "language": "english",
  "safeSearch": "moderate",
  "timeRange": "any"
}
```

# Actor output Schema

## `results` (type: `string`):

Default Dataset. Each item is one unique organic Startpage result and one billable organic-result event.

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

Aggregate query, page, retry, challenge, delivery, and charged-result counters.

## `queryStatuses` (type: `string`):

Status details for every processed query.

# 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 = {
    "queries": [
        "Apify web scraping",
        "Python HTTP client"
    ],
    "maxResultsPerQuery": 10,
    "maxPagesPerQuery": 1,
    "region": "en_US",
    "language": "english",
    "safeSearch": "moderate",
    "timeRange": "any"
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/startpage-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 = {
    "queries": [
        "Apify web scraping",
        "Python HTTP client",
    ],
    "maxResultsPerQuery": 10,
    "maxPagesPerQuery": 1,
    "region": "en_US",
    "language": "english",
    "safeSearch": "moderate",
    "timeRange": "any",
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/startpage-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 '{
  "queries": [
    "Apify web scraping",
    "Python HTTP client"
  ],
  "maxResultsPerQuery": 10,
  "maxPagesPerQuery": 1,
  "region": "en_US",
  "language": "english",
  "safeSearch": "moderate",
  "timeRange": "any"
}' |
apify call datascraperes/startpage-search-scraper --silent --output-dataset

```

## MCP server setup

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