# STS Timing Results Scraper (`alex_demeniuk/sts-timing-results-scraper`) Actor

Extract structured runner results from generated STS Timing result pages on sts-timing.pl, including Polish road races, marathons, mass runs, and major Warsaw sport events.

- **URL**: https://apify.com/alex\_demeniuk/sts-timing-results-scraper.md
- **Developed by:** [Alex Demeniuk](https://apify.com/alex_demeniuk) (community)
- **Categories:** Other, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 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.

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 STS Timing Results Scraper do?

**STS Timing Results Scraper** extracts structured race results from generated result pages hosted on the STS Timing platform at `https://sts-timing.pl`. It is designed for Polish road races whose official results are published through the STS Timing infrastructure, and it returns normalized runner-level dataset items that can be used through the Apify platform, API, schedules, integrations, and exports.

STS Timing hosts results for both smaller local races and some of the most recognizable and prestigious running events in Poland, including major Warsaw races, constitutional and independence-day runs, and other high-attendance public events when their result pages are published through the same infrastructure. Some of these races can exceed 20,000 participants.

This Actor does **not** scrape the general event listing page itself. Instead, it expects the final generated results-page URL — the page that appears only after choosing the distance, selecting visible fields, and clicking **Generuj** on the STS Timing event page.

### Why use STS Timing Results Scraper?

This Actor is useful when there is a need to collect race-result data from STS Timing in a structured format instead of copying rows manually from the browser.

Typical use cases include:

- building structured datasets of race results,
- collecting runner-level finish data for analysis,
- exporting results to JSON, CSV, or Excel through Apify,
- supporting sports analytics, event research, or result archiving workflows,
- working with large public result tables that may contain thousands or even tens of thousands of participants,
- reusing the same extraction flow through API calls or scheduled runs.

The Actor normalizes common result columns such as place, bib number, full name, category, city, sex, and times, and it can optionally keep the original source columns as `raw_*` fields.

### How to use STS Timing Results Scraper

1. Open the STS Timing results directory: `https://sts-timing.pl/wyniki/`
2. Find a race whose results are hosted on STS Timing.
3. Open the race page.
4. In the left-side menu, click **Generuj wyniki**.
5. At the top of the page, choose the correct **Dystans** if the event has more than one distance.
6. In **Wyświetl / Show**, select the columns that should appear in the generated result table.
7. Click **Generuj**.
8. Confirm that the displayed result table is exactly the one you want.
9. Copy the URL of that final generated page.
10. Paste that URL into the Actor input and run the Actor.

This step matters because the Actor parses the generated results table page itself, not the event overview page.

### Input

Use the Input tab in Apify Console.

#### Input fields

- `url` — required; the full generated results-page URL from `live.sts-timing.pl`
- `include_raw` — optional; when enabled, the Actor also includes the original source columns prefixed with `raw_`

#### Important input rule

The input must be the URL of the final generated results page.

A valid example is:

```json
{
  "url": "https://live.sts-timing.pl/biegkonstytucji2026/wyniki.php?search=1&dystans=1&filter[country]=&filtr=false&show[]=1&show[]=2&show[]=3&show[]=4&show[]=5&show[]=6&show[]=7&show[]=8&show[]=9&show[]=10&show[]=11&show[]=12&show[]=13&show[]=14",
  "include_raw": false
}
````

Do not paste:

- the main `https://sts-timing.pl/wyniki/` listing page,
- the race overview page before clicking **Generuj wyniki**,
- external result pages hosted outside the STS Timing results infrastructure.

### Output

The Actor returns one dataset item per visible result row from the generated STS Timing result table.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Output example

```json
{
  "place": "1",
  "bib_number": "245",
  "full_name": "Sample Runner",
  "name": "Sample",
  "surname": "Runner",
  "city": "Warszawa",
  "country": "POL",
  "team": "Example Team",
  "sex": "M",
  "sex_place": "1",
  "category": "M30",
  "category_place": "1",
  "net_time": "01:12:45",
  "gross_time": "01:12:50"
}
```

If `include_raw` is enabled, the output also includes original raw source fields such as `raw_Imię`, `raw_Nazwisko`, or other visible columns from the generated table.

### Data table

| Field | Description |
|---|---|
| `place` | Overall placing in the visible results table |
| `bib_number` | Start or bib number |
| `full_name` | Combined runner name when available |
| `name` | First name |
| `surname` | Last name |
| `city` | Runner city |
| `country` | Runner country |
| `team` | Club or team name |
| `sex` | Runner sex/gender |
| `sex_place` | Place within sex/gender ranking |
| `category` | Category label |
| `category_place` | Place within category |
| `net_time` | Net time |
| `gross_time` | Gross time |

### How much does it cost to scrape STS Timing results?

The cost depends on your Apify plan, the pricing model configured for this Actor, and how often you run it.

For most normal result pages, this Actor should be lightweight because it fetches and parses a single HTML results page rather than crawling many pages. Even when the selected event is large, the extraction model remains simple because it works from the generated STS results table page rather than from a multi-page crawl. A good practice is to test with one representative race first, confirm the output, and only then scale usage.

### Tips and advanced notes

- Always click **Generuj** first and confirm the visible table before copying the URL.
- The Actor automatically removes the `sort` query parameter before fetching the page, which helps avoid unstable sorted-result URLs.
- The output depends on the visible columns selected on the STS results page.
- Some events on STS Timing are relatively small local races, while others are high-profile national events with very large participant counts.
- If a race has multiple distances or classifications, run the Actor separately for each final generated result view you want to collect.

# Actor input Schema

## `url` (type: `string`):

Full generated STS Timing results-page URL from live.sts-timing.pl. Open a race, choose distance and visible columns, click Generuj, and paste that final URL here. Example races may include major Warsaw events, constitutional runs, independence-day runs, and other large public races when their results are hosted through STS Timing.

## `include_raw` (type: `boolean`):

When enabled, also include the original visible source columns as raw\_\* fields in the output dataset. Useful for auditing mappings across different STS race pages and large event result tables.

## Actor input object example

```json
{
  "url": "https://live.sts-timing.pl/biegkonstytucji2026/wyniki.php?search=1&dystans=1&filter[country]=&filtr=false&show[]=1&show[]=2&show[]=3&show[]=4&show[]=5&show[]=6&show[]=7&show[]=8&show[]=9&show[]=10&show[]=11&show[]=12&show[]=13&show[]=14",
  "include_raw": false
}
```

# 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 = {
    "url": "https://live.sts-timing.pl/biegkonstytucji2026/wyniki.php?search=1&dystans=1&filter[country]=&filtr=false&show[]=1&show[]=2&show[]=3&show[]=4&show[]=5&show[]=6&show[]=7&show[]=8&show[]=9&show[]=10&show[]=11&show[]=12&show[]=13&show[]=14"
};

// Run the Actor and wait for it to finish
const run = await client.actor("alex_demeniuk/sts-timing-results-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 = { "url": "https://live.sts-timing.pl/biegkonstytucji2026/wyniki.php?search=1&dystans=1&filter[country]=&filtr=false&show[]=1&show[]=2&show[]=3&show[]=4&show[]=5&show[]=6&show[]=7&show[]=8&show[]=9&show[]=10&show[]=11&show[]=12&show[]=13&show[]=14" }

# Run the Actor and wait for it to finish
run = client.actor("alex_demeniuk/sts-timing-results-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 '{
  "url": "https://live.sts-timing.pl/biegkonstytucji2026/wyniki.php?search=1&dystans=1&filter[country]=&filtr=false&show[]=1&show[]=2&show[]=3&show[]=4&show[]=5&show[]=6&show[]=7&show[]=8&show[]=9&show[]=10&show[]=11&show[]=12&show[]=13&show[]=14"
}' |
apify call alex_demeniuk/sts-timing-results-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "STS Timing Results Scraper",
        "description": "Extract structured runner results from generated STS Timing result pages on sts-timing.pl, including Polish road races, marathons, mass runs, and major Warsaw sport events.",
        "version": "0.1",
        "x-build-id": "ulVgh1BTkVULVCR3U"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/alex_demeniuk~sts-timing-results-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-alex_demeniuk-sts-timing-results-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/alex_demeniuk~sts-timing-results-scraper/runs": {
            "post": {
                "operationId": "runs-sync-alex_demeniuk-sts-timing-results-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/alex_demeniuk~sts-timing-results-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-alex_demeniuk-sts-timing-results-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",
                "required": [
                    "url"
                ],
                "properties": {
                    "url": {
                        "title": "Generated STS results URL",
                        "type": "string",
                        "description": "Full generated STS Timing results-page URL from live.sts-timing.pl. Open a race, choose distance and visible columns, click Generuj, and paste that final URL here. Example races may include major Warsaw events, constitutional runs, independence-day runs, and other large public races when their results are hosted through STS Timing."
                    },
                    "include_raw": {
                        "title": "Include raw source columns",
                        "type": "boolean",
                        "description": "When enabled, also include the original visible source columns as raw_* fields in the output dataset. Useful for auditing mappings across different STS race pages and large event result tables.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
