# Website Facts Audit — Impressum, GDPR, cookies, HTTPS (EU/DACH) (`praestat/website-facts-audit`) Actor

Sammelt beobachtbare Fakten zu einer Website — Statuscodes, HTTPS, Tracker, Cookies, Impressum- und Datenschutz-Links — und ordnet sie Prüfpunkten nach § 5 ECG, § 25 MedienG, Art. 13 DSGVO und § 165 Abs. 3 TKG 2021 zu. Keine Bewertung, keine Rechtsberatung.

- **URL**: https://apify.com/praestat/website-facts-audit.md
- **Developed by:** [praestat media](https://apify.com/praestat) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 checked websites

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Website Facts Audit (EU/DACH)

> A technical first pass over a website: the Actor collects **observable facts** (HTTP headers,
> links, tracking code, cookies) and names the relevant legal provision as a **checkpoint**.
> It does not score, rank or interpret, and it is not legal advice. German-language output.

Technische Erstabfrage einer Website: Der Actor sammelt **beobachtbare Fakten**
(HTTP-Header, Links, Tracking-Code, Cookies) und nennt die Rechtsgrundlage als
**Prüfpunkt**. Er bewertet nicht und gibt keine rechtliche Einschätzung ab.

### Was der Audit liefert

`observations` — reine Beobachtungen, z. B.:

- HTTP-Status, HTTPS erreichbar, Bytes
- Sprachkennung, Seitentitel
- Tracking-Code im HTML (mit Fundstelle)
- gesetzte und nicht gesetzte Sicherheits-Header
- Cookies in der Antwort, unverschlüsselte Ressourcen
- Bilder ohne `alt`, H1-Anzahl, robots.txt, defekte interne Links

`checkpoints` — Prüfpunkte mit Norm und Zustand `gefunden` / `nicht gefunden` /
`nicht prüfbar`:

- Anbieterkennzeichnung — § 5 ECG (AT) / § 5 DDG (DE)
- Offenlegung — § 25 MedienG (AT)
- Datenschutzinformation — Art. 13 DSGVO, § 1 DSG 2018
- Cookies/Tracker — § 165 Abs. 3 TKG 2021 (AT), Art. 5 Abs. 3 ePrivacy-RL
- Verschlüsselte Übertragung — Art. 32 DSGVO
- Technische Barrierefreiheits-Hinweise — WCAG 2.2 (keine Barrierefreiheitsprüfung)

### Was der Audit ausdrücklich nicht tut

- Kein Score, keine Ampel, keine Aussage „konform" oder „nicht konform"
- Keine Rechtsberatung; ob eine Norm anwendbar ist, ist eine Rechtsfrage
- Keine Ausführung von JavaScript: Consent-Banner und per JS gerenderte Footer
  werden nicht gesehen — solche Prüfpunkte stehen dann auf `nicht prüfbar`

### Ausgabe (Auszug)

```json
{
  "url": "https://example.at",
  "status": 200,
  "disclaimer": "Technische Erstabfrage … keine Rechtsberatung …",
  "observations": [
    {"id": "http-status", "label": "HTTP-Status der Startseite", "value": 200},
    {"id": "tracker", "label": "Tracking-Code im HTML",
     "value": ["google-analytics: googletagmanager.com/gtag/js"]}
  ],
  "checkpoints": [
    {"id": "impressum", "label": "Anbieterkennzeichnung (Impressum)",
     "legalBasis": "§ 5 ECG (AT) / § 5 DDG (DE)", "state": "gefunden",
     "evidence": "Quelle: https://example.at/impressum (Link im HTML). …"}
  ]
}
```

### Grenzen der Prüfbarkeit

Statisch prüfbar sind nur Fakten über den ausgelieferten Zustand. Nicht prüfbar
sind unter anderem: Wirksamkeit einer Einwilligung, Vollständigkeit der
Datenschutzinformation, Anwendbarkeit von Ausnahmen, Richtigkeit der Angaben im
Impressum. Diese Punkte bleiben bewusst bei `nicht prüfbar`.

### Preise

Pay per event, kein Abo:

| Ereignis | Preis | Wofür |
|---|---|---|
| `apify-actor-start` | 0,005 $ | Start des Laufs, einmal je GB Arbeitsspeicher (1 GB Standard) |
| `site-checked` | 0,03 $ | jede geprüfte Website |
| `page-checked` | 0,005 $ | jede zusätzlich abgerufene interne Seite bei der Linkprüfung |

Eine einzelne Website ohne Linkprüfung kostet damit rund 0,035 $ (1 GB Arbeitsspeicher), mit Linkprüfung 0,005 $ je zusätzlicher Seite. Die Plattformkosten des Laufs
sind in diesen Preisen enthalten.

### Fehler melden

Bitte den **Issues**-Tab auf der Actor-Seite verwenden statt E-Mail. Die Meldung hängt dann am
richtigen Actor, zusammen mit Input und Lauf — das ist in der Regel genau das, was zum Nachstellen
fehlt. Issues werden dort gelesen und beantwortet.

### Tests

```bash
../.venv/bin/python -m pytest tests -q
```

# Actor input Schema

## `urls` (type: `array`):

Zu prüfende URLs (http/https). Pro URL entsteht ein Datensatz mit Beobachtungen und Prüfpunkten.

## `checkLinks` (type: `boolean`):

Interne Links auf HTTP-Fehler testen (Fakt: nicht erreichbare Ziele).

## `maxLinks` (type: `integer`):

How many internal links to test for broken targets (404/5xx). Set 0 to skip link checking and keep runs fast.

## Actor input object example

```json
{
  "urls": [
    "https://www.wko.at"
  ],
  "checkLinks": true,
  "maxLinks": 10
}
```

# Actor output Schema

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

One item per website: observations, checkpoints with legal reference and state, disclaimer.

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

Counts per checkpoint state plus timestamps and disclaimer for the whole run.

# 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 = {
    "urls": [
        "https://www.wko.at"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("praestat/website-facts-audit").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 = { "urls": ["https://www.wko.at"] }

# Run the Actor and wait for it to finish
run = client.actor("praestat/website-facts-audit").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.wko.at"
  ]
}' |
apify call praestat/website-facts-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,praestat/website-facts-audit"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/a8blHpYpmVWsblpLl/builds/gIr1qqrK8duvPFT40/openapi.json
