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

# Rapports hebdomadaires

> Comparez deux fenêtres d’API complètes de sept jours, sans chevauchement, avec une méthodologie explicite.

Construisez un rapport reproductible d’une semaine sur l’autre à partir de deux fenêtres de dates complètes, définies en UTC dans ce guide. Ce guide utilise le client réutilisable du [Démarrage rapide](/fr/developers/guides/index#api-client).

## Définir des fenêtres comparables

Pour ce rapport, construisez des fenêtres de jours calendaires UTC incluses. Terminez la fenêtre actuelle hier, puis remontez de six jours. Terminez la fenêtre précédente la veille du début de la fenêtre actuelle.

<CodeGroup>
  ```javascript JavaScript theme={null}
  const DAY_MS = 24 * 60 * 60 * 1000;

  function isoDate(timestamp) {
    return new Date(timestamp).toISOString().slice(0, 10);
  }

  function completeSevenDayWindows(now = new Date()) {
    const todayUtc = Date.UTC(
      now.getUTCFullYear(),
      now.getUTCMonth(),
      now.getUTCDate()
    );
    const currentEnd = todayUtc - DAY_MS;
    const currentStart = currentEnd - 6 * DAY_MS;
    const previousEnd = currentStart - DAY_MS;
    const previousStart = previousEnd - 6 * DAY_MS;

    return {
      current: { startDate: isoDate(currentStart), endDate: isoDate(currentEnd) },
      previous: { startDate: isoDate(previousStart), endDate: isoDate(previousEnd) },
    };
  }
  ```

  ```python Python theme={null}
  from datetime import datetime, timedelta, timezone


  def complete_seven_day_windows() -> dict:
      today_utc = datetime.now(timezone.utc).date()
      current_end = today_utc - timedelta(days=1)
      current_start = current_end - timedelta(days=6)
      previous_end = current_start - timedelta(days=1)
      previous_start = previous_end - timedelta(days=6)

      return {
          'current': {
              'start_date': current_start.isoformat(),
              'end_date': current_end.isoformat(),
          },
          'previous': {
              'start_date': previous_start.isoformat(),
              'end_date': previous_end.isoformat(),
          },
      }
  ```
</CodeGroup>

Cela évite un chevauchement d’un jour et exclut le jour UTC en cours, incomplet.

## Comparer les points de score

Le taux de mention, le taux de citation, la couverture et la part de voix sont des pourcentages. Le sentiment est un score de `0` à `100`. Indiquez pour les cinq un écart absolu en points plutôt qu’une variation relative en pourcentage, trompeuse près de zéro et dénuée de sens pour le sentiment.

<CodeGroup>
  ```javascript JavaScript theme={null}
  async function generateWeeklyReport(client, brandId, now = new Date()) {
    const windows = completeSevenDayWindows(now);
    const [current, previous] = await Promise.all([
      client.getPerformance(brandId, windows.current),
      client.getPerformance(brandId, windows.previous),
    ]);

    const metricKeys = [
      ['Mention Rate', 'mentionRate'],
      ['Source Rate', 'sourceRate'],
      ['Coverage', 'coverage'],
      ['Share of Voice', 'shareOfVoice'],
      ['Sentiment', 'sentiment'],
    ];

    const metrics = metricKeys.map(([name, key]) => {
      const currentValue = current.scores[key];
      const previousValue = previous.scores[key];
      const changePoints = Number((currentValue - previousValue).toFixed(2));
      return {
        name,
        current: currentValue,
        previous: previousValue,
        changePoints,
        direction: changePoints > 0
          ? 'increased'
          : changePoints < 0
            ? 'decreased'
            : 'unchanged',
      };
    });

    return {
      generatedAt: now.toISOString(),
      windows,
      metrics,
      methodology: {
        current: current.methodology,
        previous: previous.methodology,
      },
    };
  }
  ```

  ```python Python theme={null}
  def generate_weekly_report(client, brand_id: str) -> dict:
      windows = complete_seven_day_windows()
      current = client.get_performance(
          brand_id,
          start_date=windows['current']['start_date'],
          end_date=windows['current']['end_date'],
      )
      previous = client.get_performance(
          brand_id,
          start_date=windows['previous']['start_date'],
          end_date=windows['previous']['end_date'],
      )

      metric_keys = [
          ('Mention Rate', 'mentionRate'),
          ('Source Rate', 'sourceRate'),
          ('Coverage', 'coverage'),
          ('Share of Voice', 'shareOfVoice'),
          ('Sentiment', 'sentiment'),
      ]

      metrics = []
      for name, key in metric_keys:
          change_points = round(
              current['scores'][key] - previous['scores'][key], 2
          )
          direction = (
              'increased' if change_points > 0
              else 'decreased' if change_points < 0
              else 'unchanged'
          )
          metrics.append({
              'name': name,
              'current': current['scores'][key],
              'previous': previous['scores'][key],
              'change_points': change_points,
              'direction': direction,
          })

      return {
          'generated_at': datetime.now(timezone.utc).isoformat(),
          'windows': windows,
          'metrics': metrics,
          'methodology': {
              'current': current['methodology'],
              'previous': previous['methodology'],
          },
      }
  ```
</CodeGroup>

## Exemple de résultat

```json theme={null}
{
  "windows": {
    "current": { "startDate": "2026-07-14", "endDate": "2026-07-20" },
    "previous": { "startDate": "2026-07-07", "endDate": "2026-07-13" }
  },
  "metrics": [
    {
      "name": "Mention Rate",
      "current": 45.2,
      "previous": 42.1,
      "changePoints": 3.1,
      "direction": "increased"
    },
    {
      "name": "Sentiment",
      "current": 12.4,
      "previous": 10.1,
      "changePoints": 2.3,
      "direction": "increased"
    }
  ]
}
```

Ces libellés ne décrivent que les fenêtres d’API sélectionnées. Ils n’établissent ni impact métier ni cause.

## Ajouter des diagnostics avec prudence

* Utilisez [Lister les réponses](/fr/developers/endpoints/answers/list) pour examiner les évolutions au niveau des réponses. L’endpoint n’applique pas `hasSelfSource=false` : filtrez l’indicateur renvoyé dans votre client et paginez avant de calculer un total.
* Utilisez [Lister les enregistrements Query Fan-Out](/fr/developers/endpoints/search) pour le texte des requêtes agrégées. Chaque enregistrement expose `prompts[]` et `models[]`, pas de champs `prompt` ou `provider` au singulier.
* Gardez les évolutions des citations, des mentions, du Query Fan-Out et des concurrents comme des observations distinctes.

## Valider la comparaison

1. Vérifiez que chaque fenêtre compte sept jours et qu’elles ne se chevauchent pas.
2. Comparez `methodology.promptsCount`, `responsesTotal` et `providers` entre les périodes.
3. Expliquez les changements de prompts, de fournisseurs, de Topics ou de Tags avant d’interpréter un écart de score.
4. Libellez chaque valeur avec sa formule de performance REST.
5. N’envoyez le rapport qu’à des destinations approuvées pour les données qu’il contient.

## Pages associées

* [Obtenir l’instantané de performance](/fr/developers/endpoints/performance)
* [Tableau de bord sur mesure](/fr/developers/guides/custom-dashboard)
* [Analyse concurrentielle](/fr/developers/guides/competitive-analysis)
* [Export de données](/fr/developers/guides/data-export)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.