Insights et reporting dans l'API Ads
Idée centrale
L'API Ads expose quatre points de terminaison de reporting (« insights »), tous de même mécanique de requête et de forme de réponse, qui renvoient des métriques de performance (impressions, clics, dépense, CTR, CPC, CPM) agrégées par entité publicitaire (compte, campagne, groupe d'annonces, annonce) et par fenêtre temporelle, avec prise en charge du filtrage, du tri, de la segmentation et de la pagination par curseur.
Définition
Les quatre points de terminaison GET .../insights de la référence API Ads, qui permettent de récupérer par programmation les mêmes métriques de performance que celles consultées dans l'interface via Mesure des résultats dans Ads Manager.
Contexte
Cette page fait partie des huit pages de la référence API Ads. Elle s'appuie sur l'authentification et les conventions générales documentées dans Authentification, compte publicitaire et fichiers dans l'API Ads, et sur les entités documentées dans Campagnes et annonces dans l'API Ads (dont elle expose des sous-ensembles de métadonnées via fields[]/filters[]/sort[], sans redéfinir leurs schémas complets). Traitée comme une page à part du fait de son volume et de sa nature distincte (lecture agrégée de métriques, plutôt que gestion CRUD d'objets). Capturée le 2026-08-08.
Fonctionnement
Les quatre points de terminaison
GET /ad_account/insightsGET /campaigns/{campaign_id}/insightsGET /ad_groups/{ad_group_id}/insightsGET /ads/{ad_id}/insights
L'endpoint choisi fixe la portée (« scope ») des résultats ; le paramètre aggregation_level choisit ensuite l'entité de ligne à l'intérieur de cette portée, selon la hiérarchie ad_account > campaign > ad_group > ad (un endpoint prend en charge son propre niveau et les niveaux inférieurs).
Terminologie de référence
| Terme | Valeurs | Signification |
|---|---|---|
{aggregation_level} | ad_account, campaign, ad_group, ad | Entités de ligne publiques. |
time_granularity | hourly, daily, monthly, none | Taille des tranches temporelles. none renvoie une seule tranche pour toute la fenêtre. |
segments[] | product, country, device | Dimension de ventilation optionnelle supplémentaire (une seule à la fois). |
{metric} | impressions, clicks, spend, ctr, cpc, cpm | Champs numériques agrégés. |
{aggregation_level}.id | ex. campaign.id | Champ d'identifiant canonique, valide quand ce niveau est présent dans la ligne. |
{aggregation_level}.{metric} | ex. campaign.impressions, ad.clicks | Métrique pour l'entité de ligne. |
{aggregation_level}.{metadata} | ex. campaign.name, campaign.status, ad.review_status, ad_account.budget.lifetime | Champs de métadonnées canoniques. |
{segment}.{metric} | ex. product.impressions, country.clicks | Valide seulement si le segment correspondant est demandé. |
{segment}.{metadata} | ex. product.feed_id, product.title, country.name, device.type | Valide seulement si le segment correspondant est demandé. |
metadata.{field} | metadata.readable_time, metadata.timezone | Métadonnées de rapport ; sérialisées en clés à plat (readable_time, timezone). |
filters[].operator | IN, GREATER_THAN, LESS_THAN | IN pour l'égalité, les deux autres pour des seuils numériques. |
sort[].direction | asc, desc | Ordre de tri. |
includes[] | zero_impression_items, zero_impression_products | Expansions optionnelles de lignes à zéro métrique. |
time_ranges[].type | unix_range, hour_range, date_range | unix_range : start/end en secondes Unix. hour_range : since/until locaux YYYY-MM-DDTHH. date_range : since/until locaux YYYY-MM-DD, until inclusif. |
Paramètres de requête (tous optionnels)
| Paramètre | Type | Règles |
|---|---|---|
time_granularity | string | Par défaut daily. |
aggregation_level | string | Fixe l'entité de ligne dans la portée de l'endpoint. |
time_ranges | string[] | Au moins une borne requise, dans les 5 dernières années, pas dans le futur. |
fields | string[] | Par défaut : impressions, plus readable_time en résultats tranchés, plus le nom par défaut de l'entité de ligne. |
filters | string[] | Objets de filtre encodés en JSON. |
sort | string[] | Objets de tri encodés en JSON. |
segments | string[] | Au plus un segment. |
override_segment_group_order | string[] | Réordonne les groupes de segmentation. |
includes | string[] | Au plus une valeur d'include. |
limit | integer | 1 à 2000. Par défaut 20. |
before / after | string | Curseurs de pagination (un seul à la fois). |
Note explicite de la source : fields[] utilise des noms canoniques, mais de nombreux champs de réponse sont sérialisés en clés « à plat » — ex. campaign.id → campaign_id, metadata.readable_time → readable_time, product.feed_id → product_feed_id.
Filtres
filters[] : objets JSON {field, operator, value}, répétables (combinés en AND). field doit être un champ canonique valide pour la forme de ligne courante. operator : IN (égalité, value en tableau de chaînes) ou GREATER_THAN/LESS_THAN (seuils numériques, value en nombre). Exemple : {"field":"campaign.id","operator":"IN","value":["cmpn_101"]}.
Tris
sort[] : objets JSON {field, direction}, répétables. field une clé de tri canonique valide pour la forme de ligne courante. direction : asc ou desc.
Segments
segments[]ajoute une dimension de ventilation optionnelle, pour les comptes publicitaires activés.- En requête segmentée,
time_granularityne prend en charge quenone,dailyetmonthly(pashourly). override_segment_group_order[]doit inclure l'aggregation_levelde la ligne et le segment demandé, chacun exactement une fois, dans l'ordre voulu — cet ordre détermine le sens des métriques groupées.- Exemple « product » :
segments[]=productsur n'importe quelaggregation_level, projeter les champsproduct.*,override_segment_group_order[]=productpuis=<aggregation_level>pour des lignes « produit d'abord »,includes[]=zero_impression_productspour les lignes à zéro impression.
Includes
| Include | Fonctionne quand | Ajoute |
|---|---|---|
zero_impression_items | Regroupement par entité par défaut uniquement (pas de segments[]). | Lignes d'entité à zéro impression sur la fenêtre. |
zero_impression_products | Reporting produit uniquement : compte activé, segments[]=product, override_segment_group_order[]=product en premier, filters[] limité aux champs produit/ID/métriques. | Lignes de produits configurés à zéro impression. |
Exemples
Regroupement par campagne, granularité quotidienne :
curl -sS -G "https://api.ads.openai.com/v1/ad_account/insights" \
-H "Authorization: Bearer $OPENAI_ADS_API_KEY" \
--data-urlencode 'time_granularity=daily' \
--data-urlencode 'aggregation_level=campaign' \
--data-urlencode 'fields[]=metadata.readable_time' \
--data-urlencode 'fields[]=campaign.id' \
--data-urlencode 'fields[]=campaign.name' \
--data-urlencode 'fields[]=campaign.clicks' \
--data-urlencode 'fields[]=campaign.impressions' \
--data-urlencode 'fields[]=campaign.spend' \
--data-urlencode 'time_ranges[]={"type":"unix_range","start":1777075200,"end":1777248000}'
Réponse (extrait) : enveloppe object: "list", data[] avec pour chaque ligne id (composite, ex. start=...:end=...:entity_id=cmpn_101), start_time, end_time, readable_time, campaign_id, campaign_name, impressions, clicks, spend ; puis count, first_id, last_id, has_more.
Filtrage, tri et pagination : filters[]={"field":"campaign.id","operator":"IN","value":["cmpn_101"]}, sort[]={"field":"ad.clicks","direction":"desc"}, limit=1 — la réponse contient une seule ligne avec has_more: true, signe explicite qu'il existe d'autres lignes au-delà de la page renvoyée.
Segmentation produit avec expansion « zéro impression » — regroupement produit d'abord (override_segment_group_order[]=product puis ad_account) avec includes[]=zero_impression_products : les lignes synthétiques à zéro impression omettent les champs de métriques indisponibles de la réponse.
Éléments essentiels
- Une seule mécanique de requête et une seule forme de réponse pour les quatre endpoints : c'est le couple portée-de-l'endpoint +
aggregation_levelqui détermine l'entité de ligne réellement renvoyée. - La segmentation (
segments[]) et le réordonnancement (override_segment_group_order[]) forment un couple indissociable : demander un segment sans préciser l'ordre des groupes laisse ambiguë la signification des métriques groupées. zero_impression_items(hors segmentation) etzero_impression_products(en segmentation produit) sont deux mécanismes distincts, non interchangeables, à conditions d'activation différentes.
Distinctions importantes
Ne pas confondre les noms de champs canoniques utilisés dans fields[]/filters[]/sort[] (ex. campaign.id) avec les clés « à plat » de la réponse JSON (ex. campaign_id) : la sérialisation change le nom du champ entre la requête et la réponse.
Ne pas confondre cette page (reporting programmatique via l'API REST) avec Mesure des résultats dans Ads Manager (mêmes métriques, mais consultées depuis l'interface Ads Manager : vue tableau, export CSV, graphiques) : deux angles complémentaires du même domaine fonctionnel.
Cas pratiques
Aucun cas pratique disponible : identifiants et valeurs de métriques (cmpn_101, ad_501, sku_1) manifestement fictifs et illustratifs.
Erreurs fréquentes
Ne pas demander segments[] sans définir override_segment_group_order[] en requête segmentée : l'ordre des groupes change la signification des métriques groupées.
Ne pas demander time_granularity=hourly en combinaison avec une segmentation : seules none, daily et monthly sont listées comme prises en charge en mode segmenté (voir « Limites et nuances »).
Ne pas interpréter une ligne synthétique à zéro impression comme une erreur de données : ces lignes omettent volontairement les champs de métriques indisponibles.
Limites et nuances
- Source unique, page de référence officielle récupérée par le web (dérogation ponctuelle autorisée), sans SHA-256 de fichier local.
- Disponibilité de
time_granularity=hourlyen combinaison avecsegments[]non explicitement exclue mais absente de la liste des granularités segmentées. - Ordre de tri par défaut des lignes et des curseurs de pagination non précisé lorsque
sort[]est omis. - Aucun code d'erreur HTTP documenté (paramètres incompatibles, filtre invalide pour la forme de ligne courante, segment non activé, etc.).
- Aucune limite de débit (rate limit) documentée pour ces endpoints.
- Les métriques dérivées
ctr,cpc,cpmsont nommées comme disponibles mais aucun exemple de la page ne les projette réellement — leur format numérique exact (taux, devise, précision) reste non illustré. - Conditions précises d'activation, côté compte publicitaire, de la segmentation produit et de l'option « produits à zéro impression » non détaillées.
Relations
- Authentification, compte publicitaire et fichiers dans l'API Ads — authentification commune.
- Campagnes et annonces dans l'API Ads — entités dont cette page expose les métadonnées et métriques.
- Création de campagnes à flux produits via l'API Ads — utilise le segment
productde cette page pour le reporting par article de flux. - Campagnes optimisées pour la conversion via l'API Ads (oCPC) — recommande l'usage de ces endpoints pour suivre les conversions et le coût par conversion.
- Mesure des résultats dans Ads Manager — équivalent côté interface Ads Manager.
Points à vérifier
- Disponibilité de
time_granularity=hourlycombinée àsegments[]. - Ordre de tri par défaut en l'absence de
sort[]. - Codes d'erreur HTTP et cas d'échec.
- Limites de débit applicables.
- Format exact de restitution de
ctr,cpc,cpm(unité, précision). - Conditions précises d'activation de la segmentation produit et des produits à zéro impression.
- Signification exacte de la structure d'ID d'entité encodée observée dans l'exemple de segmentation produit (format interne non documenté explicitement).
Sources
SRC-2026-043— « API Reference - Insights »,developers.openai.com/ads/api-reference/insights, capturée le 2026-08-08.