# Eurovision Results & Scoreboards (`trovevault/eurovision-results-scoreboards`) Actor

Extract Eurovision Song Contest rankings, running order, total points, jury points, public points, and optional country-by-country vote details.

- **URL**: https://apify.com/trovevault/eurovision-results-scoreboards.md
- **Developed by:** [Trove Vault](https://apify.com/trovevault) (community)
- **Categories:** Automation, News, Other
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 1,000 country or votes

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

### What does Eurovision Results & Scoreboards do?

Eurovision Results & Scoreboards returns normalized **Eurovision Song Contest result rows** for selected years and stages.

The default output is intentionally compact: one row per country in the selected stage, with rank, country, artist, song, running order, total points, and jury/public splits when the source provides them. Country-by-country vote details are optional and are written to a separate `Vote Details` dataset.

The actor focuses on the senior Eurovision Song Contest. Junior Eurovision is not included in this version.

### Why use Eurovision Results & Scoreboards?

Use this actor when you need a repeatable Eurovision dataset for dashboards, spreadsheets, editorial research, contest-week reporting, fan analytics, or data pipelines.

Main capabilities:

- Export Eurovision final and semi-final result rows from 1956 onward.
- Default to final-only output to reduce duplication and cost.
- Include country, artist, song, running order, rank, qualification status, and points.
- Include public and jury point splits when the source data provides them.
- Optionally include country-by-country vote details for detailed analysis.
- Append rows into an existing Apify dataset with `datasetId`.
- Add your own workflow identifier with `runId`.

### What data can it extract?

| Field | Type | Description |
|---|---:|---|
| `rowType` | string | `result` or `entry` |
| `contestYear` | number | Eurovision Song Contest year |
| `stageName` | string | `final`, `semifinal1`, `semifinal2`, or `entry_list` |
| `countryCode`, `countryName` | string | Competing country |
| `artistName`, `songTitle` | string | Entry metadata |
| `runningOrder` | number | Running order in the selected stage |
| `place` | number | Stage ranking |
| `qualifiedForFinal` | boolean | Whether a semi-finalist reached the final |
| `totalPoints`, `publicPoints`, `juryPoints` | number | Aggregated result points |
| `pointsBreakdown` | string | `jury_public_split`, `total_only`, or `not_available` |
| `dataStatus`, `sourceName`, `sourceUrl` | string | Source and fallback audit fields |
| `warnings` | array | Notes about incomplete or ambiguous source data |
| `runId` | string | Optional workflow identifier copied from input |

### How to use it

1. Set Start Year and End Year.
2. Keep Stages as Final only for the cleanest default dataset.
3. Choose All stages or Semi-finals only when you need those stage rows.
4. Leave Include Country-by-country Votes disabled for compact exports.
5. Enable Include Country-by-country Votes only when you need voter-by-voter scoreboards.
6. Run the actor and download the dataset as JSON, CSV, Excel, XML, or HTML.

### Input

Example input:

```json
{
  "startYear": 2025,
  "endYear": 2025,
  "stages": ["final"],
  "includeVoteDetails": false
}
````

For full contest research, set `stages` to `["all"]`. A country that appears in a semi-final and the final will then have one result row for each stage. Enable `includeVoteDetails` only when you need the separate `Vote Details` dataset.

### Output

Default result row:

```json
{
  "rowType": "result",
  "dataStatus": "historical_api",
  "sourceName": "Eurovision API",
  "contestYear": 2025,
  "contestName": "Eurovision Song Contest 2025",
  "stageName": "final",
  "stageDate": "2025-05-17T00:00:00.000Z",
  "countryCode": "AT",
  "countryName": "Austria",
  "artistName": "JJ",
  "songTitle": "Wasted Love",
  "runningOrder": 9,
  "place": 1,
  "qualifiedForFinal": true,
  "totalPoints": 436,
  "publicPoints": 178,
  "juryPoints": 258,
  "pointsBreakdown": "jury_public_split",
  "sourceUrl": "https://eurovisionapi.runasp.net/api/senior/contests/2025"
}
```

When `includeVoteDetails` is enabled, votes are written to the separate `Vote Details` dataset:

```json
{
  "rowType": "vote",
  "contestYear": 2025,
  "stageName": "final",
  "countryName": "Austria",
  "artistName": "JJ",
  "songTitle": "Wasted Love",
  "place": 1,
  "voteType": "jury",
  "fromCountryName": "Sweden",
  "points": 12
}
```

### API usage example

```bash
curl "https://api.apify.com/v2/acts/trovevault~eurovision-results-scoreboards/runs?waitForFinish=120" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startYear": 2025,
    "endYear": 2025,
    "stages": ["final"],
    "includeVoteDetails": false
  }'
```

### Data semantics

Rows are stage-specific.

- `result` rows are the main output: one country in one selected stage.
- `entry` rows are emitted only when a source has an entry list but no stage result.
- Country-by-country votes are written only to the `Vote Details` dataset when Include Country-by-country Votes is enabled. The default `Eurovision Results` dataset stays one row per country and stage.

The actor does not emit separate contest edition rows. Host metadata is intentionally excluded from the default dataset because it created sparse rows and duplicated result context.

Older contests may only have `totalPoints`. Modern finals commonly include `publicPoints` and `juryPoints`. The `pointsBreakdown` field tells you whether a row has `jury_public_split`, `total_only`, or `not_available` scoring.

### Sources

The primary source is the public Eurovision API at `https://eurovisionapi.runasp.net/api/senior/contests/{year}`. The API describes itself as an unofficial source for Eurovision participants and votes.

For 2026, the historical API returned `404 Not Found` on May 31, 2026. The actor therefore tries EurovisionOdds.org's 2026 results page as a results fallback and merges song titles from Eurovision.com's official 2026 song list when available. Rows from that fallback use `dataStatus: "eurovisionodds_results_fallback"` and include total points; jury/public splits are left empty unless a reliable split table is parsed.

### Limitations

This actor covers the senior Eurovision Song Contest only. It does not include Junior Eurovision, national finals, rehearsals, odds, lyrics, Spotify metrics, YouTube metrics, or broadcaster news.

The primary source API is unofficial. TroveVault normalizes the returned data but does not certify legal finality, voting-rule interpretation, or completeness beyond the source response. Fallback rows are labeled with `dataStatus`, `sourceName`, `sourceUrl`, and `warnings` so downstream users can audit them.

Some historical years do not include jury/public splits because those fields were not present in the source data or did not apply to the contest format.

### FAQ

#### Does this actor include Junior Eurovision?

No. This version is scoped to the senior Eurovision Song Contest.

#### Can I export only finals?

Yes. Final only is the default.

#### Why are some public or jury fields empty?

Older contests and some fallback sources only expose total points. The actor does not invent splits when the source does not provide them reliably.

#### How do I avoid large runs?

Keep Include Country-by-country Votes disabled and keep Stages set to Final only.

#### Can I append results to another dataset?

Yes. Fill `datasetId` to append the same rows to another Apify dataset in addition to the default run dataset.

### Changelog

#### 0.1

Initial version with normalized Eurovision final and semi-final result rows, optional vote-detail scoreboards, and labeled 2026 fallback support.

# Actor input Schema

## `startYear` (type: `integer`):

First Eurovision Song Contest year to retrieve. Use a single recent year for compact scheduled runs, or a wider range for historical exports. Senior Eurovision coverage starts in 1956.

## `endYear` (type: `integer`):

Last Eurovision Song Contest year to retrieve. Leave equal to Start Year for a compact run. Wider ranges return more stage result rows.

## `stages` (type: `array`):

Contest stages to include in result rows. Final only is the default to keep runs compact and avoid semi-final plus final duplicates.

## `includeVoteDetails` (type: `boolean`):

Enable this only when you need individual country-by-country scoreboard rows for each score type such as total, public, and jury. Leave disabled for a compact, lower-cost export with one result row per country and stage.

## `datasetId` (type: `string`):

ID of an existing Apify dataset to append results to, in addition to the default run dataset. Leave blank to use only the default run dataset.

## `runId` (type: `string`):

ID of an existing Apify actor run or workflow step to associate with output rows. The actor copies this value into each row when provided.

## Actor input object example

```json
{
  "startYear": 2025,
  "endYear": 2025,
  "stages": [
    "final"
  ],
  "includeVoteDetails": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `voteDetailsDataset` (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 = {
    "stages": [
        "final"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("trovevault/eurovision-results-scoreboards").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 = { "stages": ["final"] }

# Run the Actor and wait for it to finish
run = client.actor("trovevault/eurovision-results-scoreboards").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 '{
  "stages": [
    "final"
  ]
}' |
apify call trovevault/eurovision-results-scoreboards --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=trovevault/eurovision-results-scoreboards",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Eurovision Results & Scoreboards",
        "description": "Extract Eurovision Song Contest rankings, running order, total points, jury points, public points, and optional country-by-country vote details.",
        "version": "0.1",
        "x-build-id": "ECDFdtbfauuhZzz0S"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/trovevault~eurovision-results-scoreboards/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-trovevault-eurovision-results-scoreboards",
                "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/trovevault~eurovision-results-scoreboards/runs": {
            "post": {
                "operationId": "runs-sync-trovevault-eurovision-results-scoreboards",
                "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/trovevault~eurovision-results-scoreboards/run-sync": {
            "post": {
                "operationId": "run-sync-trovevault-eurovision-results-scoreboards",
                "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",
                "required": [
                    "startYear",
                    "endYear"
                ],
                "properties": {
                    "startYear": {
                        "title": "Start Year",
                        "minimum": 1956,
                        "maximum": 2030,
                        "type": "integer",
                        "description": "First Eurovision Song Contest year to retrieve. Use a single recent year for compact scheduled runs, or a wider range for historical exports. Senior Eurovision coverage starts in 1956.",
                        "default": 2025
                    },
                    "endYear": {
                        "title": "End Year",
                        "minimum": 1956,
                        "maximum": 2030,
                        "type": "integer",
                        "description": "Last Eurovision Song Contest year to retrieve. Leave equal to Start Year for a compact run. Wider ranges return more stage result rows.",
                        "default": 2025
                    },
                    "stages": {
                        "title": "Stages",
                        "type": "array",
                        "description": "Contest stages to include in result rows. Final only is the default to keep runs compact and avoid semi-final plus final duplicates.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "all",
                                "final",
                                "semi-finals"
                            ],
                            "enumTitles": [
                                "All stages",
                                "Final only",
                                "Semi-finals only"
                            ]
                        }
                    },
                    "includeVoteDetails": {
                        "title": "Include Country-by-country Votes",
                        "type": "boolean",
                        "description": "Enable this only when you need individual country-by-country scoreboard rows for each score type such as total, public, and jury. Leave disabled for a compact, lower-cost export with one result row per country and stage.",
                        "default": false
                    },
                    "datasetId": {
                        "title": "Dataset ID (optional)",
                        "type": "string",
                        "description": "ID of an existing Apify dataset to append results to, in addition to the default run dataset. Leave blank to use only the default run dataset."
                    },
                    "runId": {
                        "title": "Run ID (optional)",
                        "type": "string",
                        "description": "ID of an existing Apify actor run or workflow step to associate with output rows. The actor copies this value into each row when provided."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
