# ONPE Peru Elections Results Scraper (`parseforge/onpe-peru-elections-scraper`) Actor

Pull official ONPE results from the 2021 Peruvian general election by district, province, department, or national level. Returns candidate, party, votes, percentage, valid\_votes, blank\_votes, and null\_votes. Great for political analysis and academic research on Peru.

- **URL**: https://apify.com/parseforge/onpe-peru-elections-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Automation, Integrations, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.50 / 1,000 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 🗳️ ONPE Peru Elections Results Scraper

> 🚀 **Export ONPE Peru 2021 general election results in seconds. District-level vote counts, candidate breakdowns, valid, blank, and null tallies.**

> 🕒 **Last updated:** 2026-05-29 · **📊 10 fields** per record · National, Departmental, Provincial, District levels · First and second round

The ONPE Peru Elections Results Scraper turns the official [resultados.eleccionesgenerales2021.pe](https://resultados.eleccionesgenerales2021.pe/EG2021/) JSON reports into a clean, structured dataset. It hits the public ONPE Proceso Electoral endpoints and flattens each candidate's tally into one row per district and party.

Coverage spans every Peruvian department, province, and district reported by ONPE, both presidential rounds, and every registered political organization that appeared on the ballot.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| 📊 Political analysts | Build national and regional vote share dashboards |
| 🏛️ Researchers | Study turnout, blank vote rates, and null vote patterns |
| 📰 Journalists | Verify district-level outcomes for stories |
| 🤖 Data scientists | Train models on Peruvian electoral data |
| 🗺️ GIS teams | Join with shapefiles for choropleth maps |
| 🎓 Students | Pull primary source data for coursework |

### 📋 What the ONPE Peru Elections Scraper does

- Calls ONPE's public Reportes JSON endpoints for the selected geographic level and round.
- Flattens each department, province, or district into rows per candidate and party.
- Surfaces valid, blank, and null vote totals alongside each tally.
- Casts vote counts and percentages to numbers for clean BI ingestion.
- Pushes a clean diagnostic record if ONPE returns no results for the requested combo.

> 💡 **Why it matters:** ONPE's public viewer is a single-page app that hides the underlying JSON behind XHR calls. This actor exposes the raw numbers directly so analysts and journalists can stop scraping screenshots.

### 🎬 Full Demo

_🚧 Coming soon._

### ⚙️ Input

<table>
<tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr>
<tr><td><code>level</code></td><td>enum</td><td>No</td><td>NACIONAL, DEPARTAMENTO, PROVINCIA, or DISTRITO. Default DEPARTAMENTO.</td></tr>
<tr><td><code>round</code></td><td>enum</td><td>No</td><td>P (first round) or S (second round). Default P.</td></tr>
<tr><td><code>maxItems</code></td><td>integer</td><td>No</td><td>Free users 10, paid up to 1,000,000.</td></tr>
</table>

**Example 1 - Department results, first round:**
```json
{ "level": "DEPARTAMENTO", "round": "P", "maxItems": 100 }
````

**Example 2 - District-level second round:**

```json
{ "level": "DISTRITO", "round": "S", "maxItems": 500 }
```

> ⚠️ **Good to Know:** ONPE publishes the 2021 general election results as the definitive archived dataset. Numbers reflect the final ONPE tally and do not change between runs.

### 📊 Output

| Field | Type | Description |
|---|---|---|
| 🗺️ `district` | string | Department, province, or district name. |
| 🧑 `candidate` | string | Candidate full name. |
| 🏛️ `party` | string | Political organization. |
| 🗳️ `votes` | number | Votes obtained. |
| 📊 `percentage` | number | Percent of valid votes. |
| ✅ `valid_votes` | number | Total valid votes in the geography. |
| ⬜ `blank_votes` | number | Blank votes total. |
| 🚫 `null_votes` | number | Null votes total. |
| 🕒 `scrapedAt` | string | When this row was fetched. |
| ❌ `error` | string | Set if the upstream response was an error. |

**Sample record:**

```json
{
  "district": "LIMA",
  "candidate": "PEDRO CASTILLO TERRONES",
  "party": "PERU LIBRE",
  "votes": 1234567,
  "percentage": 18.92,
  "valid_votes": 6512334,
  "blank_votes": 102345,
  "null_votes": 87654,
  "scrapedAt": "2026-05-29T13:00:00.000Z",
  "error": null
}
```

### ✨ Why choose this Actor

| 🆓 | Works with no API key and no login. |
| 🧹 | Flattens ONPE's nested JSON into one row per candidate. |
| 🔢 | Vote counts and percentages cast to real numbers. |
| 🌎 | Covers national, departmental, provincial, and district levels. |
| 💾 | Push to dataset and export CSV, Excel, JSON, or XML. |

### 📈 How it compares to alternatives

| Approach | Setup time | Clean rows | Numeric casting | Maintained |
|---|---|---|---|---|
| Manual download from ONPE site | 15 min per geography | ❌ | ❌ | manual |
| Browser screenshots | hours | ❌ | ❌ | manual |
| **This Actor** | 5 sec, no install | ✅ | ✅ | ✅ |

### 🚀 How to use

1. Click **Try for free**.
2. Pick `level` and `round`.
3. Click **Start**. Your dataset is ready within seconds.

### 💼 Business use cases

**📊 Electoral analysis.** Build regional vote share dashboards for clients or editorial teams.

**🏛️ Civic research.** Quantify blank and null vote rates across departments and provinces.

**📰 Newsroom verification.** Reporters can cross-check district outcomes in seconds.

**🤖 Predictive modeling.** Use 2021 results as training data for future Peruvian electoral forecasting.

### 🔌 Automating ONPE Peru Elections Scraper

- **Make / Zapier**: trigger this actor and push results to Airtable or Google Sheets.
- **Cron schedule**: native Apify scheduler for periodic refreshes.
- **Webhooks**: POST to your endpoint the moment a run finishes.
- **Pipe to BigQuery / Snowflake / Postgres**: native Apify integrations.

### 🌟 Beyond business use cases

**🎓 Education.** Teach political science classes with real primary source data.

**🧪 Personal research.** Map your home district's results for fun or curiosity.

**🤝 Civic non-profits.** Build voter education materials from authoritative numbers.

**🧰 Tinkering.** Prototype a choropleth visualization using a real-world dataset.

### 🤖 Ask an AI assistant about this scraper

Paste this README into ChatGPT, Claude, or any AI assistant and ask it to map your workflow to the actor's inputs. The schema and field list above contain everything an LLM needs.

### ❓ Frequently Asked Questions

**❓ Do I need an API key?** No, ONPE's reports are public.

**❓ Which election is covered?** The 2021 Peruvian general election, both presidential rounds.

**❓ Can I get district-level data?** Yes, set `level` to DISTRITO.

**❓ Are vote counts cast to numbers?** Yes.

**❓ Does the data change?** No, ONPE has published final tallies for 2021.

**❓ Can I schedule runs?** Yes via the Apify scheduler.

**❓ Is this scraping or API?** Public JSON endpoints from the ONPE viewer.

**❓ What format can I download?** CSV, Excel, JSON, JSONL, XML, RSS, or HTML.

**❓ What if ONPE returns nothing?** A single diagnostic record with the `error` field populated is pushed.

**❓ Will the schema change?** Stable.

### 🔌 Integrate with any app

Apify ships native integrations with Make, Zapier, Slack, Discord, Google Drive, Google Sheets, Gmail, Airbyte, Keboola, Telegram, GitHub, and any REST API or webhook. Trigger runs from a calendar event, a form submission, a cron job, or pipe results straight into BigQuery, Snowflake, or Postgres.

### 🔗 Recommended Actors

| Actor | What it does |
|---|---|
| [ParseForge Alpha Vantage Scraper](https://apify.com/parseforge/alpha-vantage-public-scraper) | Public market data. |
| [ParseForge OurAirports Scraper](https://apify.com/parseforge/ourairports-scraper) | Global airport database. |
| [ParseForge collection](https://apify.com/parseforge) | 900+ production scrapers. |

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for 900+ production-grade scrapers across business intelligence, real estate, e-commerce, sports, finance, and public records.

***

**Disclaimer:** This actor scrapes only publicly available data. ParseForge is not affiliated with, endorsed by, or sponsored by any of the third-party services referenced. Users are responsible for complying with the target site's terms of service and applicable law. [Create a free account w/ $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp).

# Actor input Schema

## `level` (type: `string`):

Aggregation level for results.

## `round` (type: `string`):

First or second round of the 2021 Peruvian general election.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## Actor input object example

```json
{
  "level": "DEPARTAMENTO",
  "round": "P",
  "maxItems": 10
}
```

# Actor output Schema

## `results` (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 = {
    "level": "DEPARTAMENTO",
    "round": "P",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/onpe-peru-elections-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 = {
    "level": "DEPARTAMENTO",
    "round": "P",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/onpe-peru-elections-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "level": "DEPARTAMENTO",
  "round": "P",
  "maxItems": 10
}' |
apify call parseforge/onpe-peru-elections-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/onpe-peru-elections-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ONPE Peru Elections Results Scraper",
        "description": "Pull official ONPE results from the 2021 Peruvian general election by district, province, department, or national level. Returns candidate, party, votes, percentage, valid_votes, blank_votes, and null_votes. Great for political analysis and academic research on Peru.",
        "version": "0.1",
        "x-build-id": "gjMP7aMm6XeMkhKvn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~onpe-peru-elections-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-onpe-peru-elections-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/parseforge~onpe-peru-elections-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-onpe-peru-elections-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/parseforge~onpe-peru-elections-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-onpe-peru-elections-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": {
                    "level": {
                        "title": "Geographic level",
                        "enum": [
                            "NACIONAL",
                            "DEPARTAMENTO",
                            "PROVINCIA",
                            "DISTRITO"
                        ],
                        "type": "string",
                        "description": "Aggregation level for results.",
                        "default": "DEPARTAMENTO"
                    },
                    "round": {
                        "title": "Election round",
                        "enum": [
                            "P",
                            "S"
                        ],
                        "type": "string",
                        "description": "First or second round of the 2021 Peruvian general election.",
                        "default": "P"
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    }
                }
            },
            "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
                                    }
                                }
                            },
                            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
