> ## Documentation Index
> Fetch the complete documentation index at: https://docs.scanova.io/llms.txt
> Use this file to discover all available pages before exploring further.

# API des événements navigateur — POST /ct

> Référence du point de terminaison de collecte des événements navigateur, celui que le SDK Scanova utilise pour envoyer pages vues, clics et événements.

Le point de terminaison `/ct` reçoit les événements navigateur envoyés par le SDK navigateur de Scanova. Dans la plupart des cas, vous ne l'appelez pas vous-même : le SDK s'en charge. Cette page décrit le format de la requête, pour les intégrations sur mesure et le débogage.

**URL de base :** `https://t.scanova.io`

## Point de terminaison

```
POST https://t.scanova.io/ct
```

Aucun en-tête d'authentification n'est requis. Les requêtes sont validées en comparant l'en-tête `Origin` ou `Referer` à la liste **Allowed Domains** du site.

## Requête

**En-têtes :**

```http theme={null}
Content-Type: application/json
Origin: https://yoursite.com
```

**Corps :**

```json theme={null}
{
  "event_id": "f9ac7db6-f900-4d8e-8918-c846834195a8",
  "site_id": "YOUR_SITE_ID",
  "event_type": "cta_click",
  "scan_session_id": "7ad26d4f-3181-4ef8-b6ca-b8f59499dd43",
  "web_session_id": "2d0c328a-01d0-4010-85f4-f327130d1bd4",
  "visitor_id": "363fe851-7d8f-4090-902f-0f5a462829f5",
  "page_url": "https://yoursite.com/pricing",
  "referrer": "https://yoursite.com/",
  "timestamp": "2026-05-13T10:00:00.000Z",
  "device": {
    "user_agent": "Mozilla/5.0 ...",
    "screen_width": 1440,
    "screen_height": 900,
    "language": "en-US"
  },
  "metadata": {
    "button_text": "Start Free Trial",
    "section": "pricing"
  }
}
```

## Champs

| Champ             | Type        | Obligatoire | Description                                             |
| ----------------- | ----------- | ----------- | ------------------------------------------------------- |
| `site_id`         | chaîne      | Oui         | Identifiant du site de suivi                            |
| `event_type`      | chaîne      | Oui         | Nom de l'événement en snake\_case                       |
| `event_id`        | chaîne UUID | Non         | Identifiant de déduplication. Généré si vous l'omettez. |
| `scan_session_id` | chaîne UUID | Non         | Identifiant d'attribution du scan                       |
| `web_session_id`  | chaîne UUID | Non         | Identifiant de session navigateur (30 minutes)          |
| `visitor_id`      | chaîne UUID | Non         | Identifiant de visiteur durable (cookie d'un an)        |
| `page_url`        | chaîne      | Non         | URL de la page en cours                                 |
| `referrer`        | chaîne      | Non         | URL de provenance                                       |
| `timestamp`       | ISO 8601    | Non         | Heure de l'événement. Par défaut, celle de réception.   |
| `device`          | objet       | Non         | User-agent, dimensions de l'écran, langue               |
| `metadata`        | objet       | Non         | Données libres. 10 Ko et 5 niveaux au maximum.          |
| `consent`         | chaîne      | Non         | `granted`, `denied` ou `pending`                        |

## Réponse

**Succès (`200`) :**

```json theme={null}
{
  "event_id": "f9ac7db6-f900-4d8e-8918-c846834195a8"
}
```

**Réponses d'erreur :**

| Statut | Cause                                                                                   |
| ------ | --------------------------------------------------------------------------------------- |
| `400`  | Champ obligatoire manquant ou `site_id` invalide                                        |
| `403`  | L'`Origin` ou le `Referer` de la requête ne figure pas dans les Allowed Domains du site |
| `413`  | Le contenu dépasse la taille autorisée                                                  |
| `422`  | Erreur de validation d'un champ                                                         |
| `429`  | Limite de débit dépassée (100 requêtes par minute et par IP)                            |

## CORS

Le point de terminaison `/ct` prend en charge le CORS. Les requêtes navigateur venant des domaines autorisés sont acceptées avec :

```
Access-Control-Allow-Origin: <origin>
Access-Control-Allow-Methods: POST, OPTIONS
```

Les requêtes préalables (`OPTIONS`) renvoient `204` accompagné des en-têtes CORS adéquats.

## Point de terminaison de lot

Pour envoyer plusieurs événements navigateur en une seule requête :

```
POST https://t.scanova.io/collect/batch
```

Le corps de la requête enveloppe un tableau :

```json theme={null}
{
  "events": [
    { "site_id": "...", "event_type": "pageview", ... },
    { "site_id": "...", "event_type": "scroll", "metadata": { "scroll_depth": 25 } }
  ]
}
```

Jusqu'à 100 événements par requête de lot.
