# Page View (https://webmetic.de/docs/api/datenmodell/page-view)

Ein Seitenaufruf ist eine Seite Ihrer Website, die ein Besuch geladen hat. Ein Beispiel: Jemand von Bergquell Mineralbrunnen gelangt über LinkedIn auf Ihre Preisseite und öffnet danach zwei weitere Seiten. Die Session hat dann drei Seitenaufrufe.

Seitenaufrufe haben keine eigene ID und stehen in der Liste `user_data` ihrer [Session](https://webmetic.de/docs/api/datenmodell/session), in der Reihenfolge der Aufzeichnung.

## Zählregeln [#zählregeln]

Der Tracking-Code meldet einen Seitenaufruf bei jedem Laden einer Seite. Dabei gilt:

- **Neu laden**: Wenn jemand dieselbe URL noch einmal lädt, entsteht kein neuer Seitenaufruf.
- **Zurück zu einer Seite**: Webmetic fasst nur direkt aufeinanderfolgende gleiche URLs zusammen. Die Folge A, B, A ergibt drei Seitenaufrufe.
- **Single-Page-Apps**: Jeder URL-Wechsel über die History-API des Browsers zählt als Seitenaufruf. Wenn sich nur der Teil nach `#` ändert, zählt das nicht als Seitenaufruf.

## Messwerte [#messwerte]

- **`timestamp`**: Der Zeitpunkt, zu dem der Webmetic-Server den Seitenaufruf empfangen hat, nicht die Uhr des Browsers. Die API gibt ihn in UTC ohne Suffix aus, Webhooks mit `Z`. Mehr dazu unter [Zeiträume und Zeitzonen](https://webmetic.de/docs/api/zeitraeume-und-zeitzonen).
- **`scroll_depth`**: Die tiefste Marke, die der Besuch auf der Seite überschritten hat: 0, 25, 50, 75 oder 90. Webmetic kennt keine feineren Stufen und keinen Wert 100. Jeder Seitenaufruf beginnt bei 0.
- **`time_spent`**: Die Sekunden bis zum nächsten Seitenaufruf derselben Session. Auf der letzten Seite zählt Webmetic bis zur letzten Interaktion, zum Beispiel einem Download. Wenn es keine Interaktion gab, übernimmt Webmetic die aktive Zeit aus `engagement_time`. Wenn auch `engagement_time` fehlt, setzt Webmetic einen geschätzten Wert von wenigen Sekunden ein. Scrollen zählt nicht als Interaktion.
- **`engagement_time`**: Die aktive Zeit in Sekunden, gemessen im Browser. Aktiv heißt: Der Tab ist sichtbar, und in den letzten 60 Sekunden gab es Aktivität per Maus, Tastatur, Scrollen oder Touch. Der Browser sendet den Wert, wenn jemand die Seite verlässt, den Tab wechselt oder in einer Single-Page-App zur nächsten Ansicht wechselt.
- **`document_location`** und **`document_title`**: Webmetic speichert URL und Titel vollständig und kürzt nichts. Die URL enthält Query-String und `#`-Teil.

Empfohlen: Nutzen Sie `engagement_time` als Dauer einer Seite, weil der Wert die aktive Zeit misst. Das Dashboard nutzt ihn ebenfalls und greift nur dann auf `time_spent` zurück, wenn er fehlt.

## Felder [#felder]

| Feld | Typ | Beispiel | Beschreibung |
| --- | --- | --- | --- |
| `session_id` | `string` | `"01M4WQFX6YM2X5V8T4N6R1C0DZ"` | Die Session des Seitenaufrufs, 26 Zeichen. Nur in `/session_user_data`. |
| `timestamp` | `string` | `"2026-10-14T08:12:05.214000"` | Empfang des Seitenaufrufs auf dem Server, ISO 8601 in UTC. |
| `document_location` | `string` | `"https://ihre-website.de/preise?utm_source=linkedin&utm_medium=social&utm_campaign=messe-2026"` | Die vollständige URL der Seite. |
| `document_title` | `string` | `"Preise"` | Der Titel der Seite beim Laden, `""` ohne Titel. |
| `scroll_depth` | `integer` | `75` | Die tiefste erreichte Marke: 0, 25, 50, 75 oder 90. |
| `referrer` | `string` | `"https://www.linkedin.com/"` | Die Herkunft laut Browser, leer bei direkten Aufrufen. |
| `time_spent` | `number` | `95.0` | Sekunden auf der Seite. Geschätzt, wenn Webmetic die Zeit nicht messen konnte. |
| `engagement_time` | `integer` | `70` | Sekunden aktiver Zeit im Browser. |
| `user_events_count` | `integer` | `2` | Die Zahl aller Interaktionen auf der Seite. |
| `events` | `array` | siehe unten | Die erkannten Interaktionen. Fehlt, wenn es keine gab. |
| `blurred` | `boolean` | `true` | Nur im Free-Plan bei verborgenen Unternehmen. |

## Ereignisse [#ereignisse]

Die Liste `events` enthält die Interaktionen, die Webmetic auf der Seite erkannt hat. Jedes Ereignis hat `type` und `target`, dazu `detail` und `meta`, die auch `null` sein oder fehlen können.

| `type` | Auslöser | `target` | `detail` | `meta` |
| --- | --- | --- | --- | --- |
| `form_start` | Erster Fokus auf einem Formularfeld | ID des Formulars: `id`, sonst `name`, sonst eine erzeugte ID | `null` | `fieldCount`: sichtbare Felder |
| `form_submit` | Absenden eines Formulars | ID des Formulars | Ziel-URL des Formulars ohne Query-String | `fieldCount`, `fieldsInteracted`, `timeSpent` in Sekunden ab dem ersten Feld |
| `form_abandon` | Formular begonnen, aber beim Verlassen der Seite nicht abgesendet | ID des Formulars | `null` | `fieldsInteracted`, `timeSpent` |
| `download` | Klick auf einen Link zu einer Datei oder mit `download`-Attribut | Dateiname | Vollständige URL des Links | `fileType`: Dateiendung |
| `outbound_click` | Klick auf einen Link zu einem anderen Hostnamen | Hostname des Ziels | Vollständige URL des Links | `linkText` oder `null` |
| `contact_click` | Klick auf einen `mailto:`- oder `tel:`-Link | `email` oder `phone` | Pfad der Seite | `null` |
| `site_search` | Suchbegriff in der URL oder Absenden eines Suchformulars | Der eingegebene Suchbegriff | `url_param` oder `form_submit` | `param`: Name des URL-Parameters, sonst `null` |
| `video_start` | Erster Start eines Videos | `html5`, `youtube` oder `vimeo` | URL des Videos | `label` oder `null` |
| `video_progress` | Video erreicht 25, 50, 75 oder 90 % | wie bei `video_start` | URL des Videos | `percent`, `label` |
| `print` | Drucken der Seite | Titel der Seite beim Drucken | `null` | `count`: wie oft gedruckt, `scrollDepth`: Scrolltiefe in Prozent |

Als Suchbegriff in der URL gelten die Parameter `q`, `s`, `search`, `query`, `keyword`, `term` und `suche`.

Die API liefert keine Formulareingaben, mit einer Ausnahme: Bei `site_search` steht der Suchbegriff vollständig in `target`. Bei `contact_click` fehlen E-Mail-Adresse und Telefonnummer.

Der Tracking-Code erkennt YouTube-Videos nur, wenn die Einbettung `enablejsapi=1` enthält. Stumm automatisch startende HTML5-Videos zählen nicht.

Sie können keine eigenen Ereignisse senden. `user_events_count` zählt dagegen auch Interaktionen ohne eigenen Typ, zum Beispiel Audio. Der Wert kann deshalb größer sein als die Zahl der Einträge in `events`.

## Session und Unternehmen [#session-und-unternehmen]

Ein Seitenaufruf trägt keine `company_id`. Über die `session_id` finden Sie in `/session` seine Session und deren `company_id`.

Webmetic liest UTM-Werte und Klick-IDs aus der URL des ersten Seitenaufrufs und legt sie an der Session ab.

## Beispiel [#beispiel]

Das Beispiel zeigt den ersten Seitenaufruf der Session aus `/session_user_data`. In `/company-sessions` fehlt `session_id`, weil der Seitenaufruf dort in seiner Session steht.

```json title="GET /session_user_data"
{
  "session_id": "01M4WQFX6YM2X5V8T4N6R1C0DZ",
  "timestamp": "2026-10-14T08:12:05.214000",
  "document_location": "https://ihre-website.de/preise?utm_source=linkedin&utm_medium=social&utm_campaign=messe-2026",
  "document_title": "Preise",
  "scroll_depth": 75,
  "referrer": "https://www.linkedin.com/",
  "time_spent": 95.0,
  "engagement_time": 70,
  "user_events_count": 2,
  "events": [
    {
      "type": "download",
      "target": "preisliste.pdf",
      "detail": "https://ihre-website.de/media/preisliste.pdf",
      "meta": { "fileType": "pdf" }
    },
    {
      "type": "form_start",
      "target": "angebotsanfrage",
      "detail": null,
      "meta": { "fieldCount": 6 }
    }
  ]
}
```

## Sonderfälle [#sonderfälle]

- **Fehlend oder `null`**: In `/session_user_data` und `/company-sessions` fehlt ein Feld, zu dem Webmetic nichts gespeichert hat. In den Feeds und in Webhooks ist jedes Feld vorhanden, ohne Wert als `null`.
- **Leere Texte**: `document_title`, `referrer` sowie `detail` und `meta` eines Ereignisses können `""` oder `null` sein oder fehlen. Behandeln Sie alle drei Fälle gleich.
- **Kurze Seiten**: Wenn eine Seite weniger als 50 Pixel höher ist als das Fenster, bleibt `scroll_depth` bei 0. Der Besuch hat die Seite trotzdem ganz gesehen.
- **Ohne aktive Zeit**: `engagement_time` fehlt, wenn der Browser den Wert nicht mehr senden konnte, zum Beispiel nach dem Schließen.
- **Referrer in Single-Page-Apps**: Jeder Seitenaufruf trägt den Referrer des ersten Ladens, nicht die vorige Seite.
- **Zeitraum**: `from_date` und `to_date` filtern nach dem Beginn der Session. `/session_user_data` liefert deshalb alle Seitenaufrufe einer solchen Session, auch spätere.
- **Reihenfolge**: Die Reihenfolge der Einträge in `/session_user_data` ist nicht festgelegt. Sortieren Sie selbst nach `timestamp`. Mehr dazu unter [Paginierung](https://webmetic.de/docs/api/paginierung).
- **Free-Plan**: Bei einem verborgenen Unternehmen enthält ein Eintrag in `/session_user_data` nur `session_id`, `timestamp` und `blurred: true`. In `/company-sessions` fehlt dann `user_data`, und in den Feeds ist die Liste leer. Mehr dazu unter [Pläne](https://webmetic.de/docs/konto/plaene).
- **Opt-out**: Die API liefert keine Seitenaufrufe nach einem Opt-out.

## Verwendet von [#verwendet-von]

- **Endpunkte**: [`GET /session_user_data`](https://webmetic.de/docs/api/referenz/visitor-intelligence/session-user-data) liefert einen Eintrag pro Seitenaufruf, und `total` in `pagination` zählt dort Seitenaufrufe. [`GET /company-sessions`](https://webmetic.de/docs/api/referenz/visitor-intelligence/company-sessions) liefert die Seitenaufrufe in `result[].sessions[].user_data[]`.
- **Besuchsarten**: [`GET /intensive-visits`](https://webmetic.de/docs/api/referenz/visitor-intelligence/intensive-visits), [`GET /returning-visits`](https://webmetic.de/docs/api/referenz/visitor-intelligence/returning-visits) und [`GET /new-visits`](https://webmetic.de/docs/api/referenz/visitor-intelligence/new-visits) liefern die Seitenaufrufe ebenfalls in `result[].sessions[].user_data[]`. Mehr dazu unter [Besuchsarten](https://webmetic.de/docs/api/datenmodell/besuchsarten).
- **Webhooks**: Alle vier Ereignisse tragen die Seitenaufrufe in `data.visit.user_data`. Wenn der Body zu groß wird, lässt Webmetic zuerst die ältesten Seitenaufrufe weg und setzt `data.truncated` auf `true`. Mehr dazu unter [Webhooks](https://webmetic.de/docs/api/webhooks).
- **KI-Assistent**: Auch der [KI-Assistent](https://webmetic.de/docs/ki-assistent/tools-und-prompts) ruft Seitenaufrufe ab. Das Tool `get_company_activity` zeigt die Seitenaufrufe eines Besuchs als Text.
