openapi: 3.2.0 info: title: External OpenAI Ads API version: 6551bd49db665ffb7f80780b3e150b8e8b780cc3 servers: - url: https://api.tryprofound.com description: Production Server tags: - name: OpenAI Ads paths: /v1/ads/openai-ads/ad-account/insights: get: tags: - OpenAI Ads summary: Get Account Insights description: 'Get ad account insights for the organization''s OpenAI Ads partner brand. `aggregation_level=campaign` returns one row per campaign (with `campaign_id` / `campaign_name` and all metrics), so every campaign''s insights come back in a single call; `time_granularity=daily` gives per-day rows (e.g. daily spend).' operationId: get_account_insights_v1_ads_openai_ads_ad_account_insights_get security: - APIKeyHeader: [] - BearerAuth: [] parameters: - name: organization_id in: query required: false schema: anyOf: - type: string format: uuid - type: 'null' description: Organization scope for API keys that can access multiple organizations. title: Organization Id description: Organization scope for API keys that can access multiple organizations. - name: aggregation_level in: query required: false schema: anyOf: - enum: - ad_account - campaign - ad_group - ad type: string - type: 'null' description: Row entity for the insights breakdown. `campaign` returns one row per campaign. title: Aggregation Level description: Row entity for the insights breakdown. `campaign` returns one row per campaign. - name: time_granularity in: query required: false schema: anyOf: - enum: - hourly - daily - monthly - none type: string - type: 'null' description: Time bucket for the rows; `none` or omitted returns totals over the whole range. title: Time Granularity description: Time bucket for the rows; `none` or omitted returns totals over the whole range. - name: time_ranges[] in: query required: false schema: anyOf: - type: array items: type: string - type: 'null' description: 'Time ranges as JSON objects, e.g. `{"type": "date_range", "since": "2026-07-01", "until": "2026-07-18"}`.' title: Time Ranges[] description: 'Time ranges as JSON objects, e.g. `{"type": "date_range", "since": "2026-07-01", "until": "2026-07-18"}`.' - name: limit in: query required: false schema: anyOf: - type: integer maximum: 2000 minimum: 1 - type: 'null' description: Maximum rows to return. title: Limit description: Maximum rows to return. - name: after in: query required: false schema: anyOf: - type: string - type: 'null' description: Return items after this ID (forward pagination). title: After description: Return items after this ID (forward pagination). - name: before in: query required: false schema: anyOf: - type: string - type: 'null' description: Return items before this ID (backward pagination). title: Before description: Return items before this ID (backward pagination). responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/InsightsResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' components: schemas: HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError ValidationError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type input: title: Input ctx: type: object title: Context type: object required: - loc - msg - type title: ValidationError InsightsResponse: properties: data: items: $ref: '#/components/schemas/InsightRow' type: array title: Data description: Insight rows. count: anyOf: - type: integer - type: 'null' title: Count description: Total row count, when reported upstream. first_id: anyOf: - type: string - type: 'null' title: First Id description: ID of the first item; pass as `before` to page back. last_id: anyOf: - type: string - type: 'null' title: Last Id description: ID of the last item; pass as `after` to page forward. has_more: type: boolean title: Has More description: Whether more items are available. default: false additionalProperties: false type: object required: - data title: InsightsResponse description: Cursor-paginated insights, mirroring the OpenAI Ads insights envelope. InsightRow: properties: id: type: string title: Id description: Row ID. start_time: anyOf: - type: integer - type: 'null' title: Start Time description: Bucket start (unix seconds). end_time: anyOf: - type: integer - type: 'null' title: End Time description: Bucket end (unix seconds). readable_time: anyOf: - type: string - type: 'null' title: Readable Time description: Human-readable time bucket. timezone: anyOf: - type: string - type: 'null' title: Timezone description: Timezone of the time bucket. campaign_id: anyOf: - type: string - type: 'null' title: Campaign Id description: Campaign ID for campaign-level rows. campaign_name: anyOf: - type: string - type: 'null' title: Campaign Name description: Campaign name for campaign-level rows. ad_group_id: anyOf: - type: string - type: 'null' title: Ad Group Id description: Ad group ID for ad_group-level rows. ad_group_name: anyOf: - type: string - type: 'null' title: Ad Group Name description: Ad group name for ad_group-level rows. ad_id: anyOf: - type: string - type: 'null' title: Ad Id description: Ad ID for ad-level rows. ad_name: anyOf: - type: string - type: 'null' title: Ad Name description: Ad name for ad-level rows. impressions: anyOf: - type: integer - type: 'null' title: Impressions description: Impressions. clicks: anyOf: - type: integer - type: 'null' title: Clicks description: Clicks. spend: anyOf: - type: number - type: 'null' title: Spend description: Spend in the ad account's currency units. ctr: anyOf: - type: number - type: 'null' title: Ctr description: Click-through rate. cpc: anyOf: - type: number - type: 'null' title: Cpc description: Cost per click. cpm: anyOf: - type: number - type: 'null' title: Cpm description: Cost per thousand impressions. type: object required: - id title: InsightRow description: 'One insights row; the entity it describes follows `aggregation_level`. Time bounds are present when a `time_granularity` is requested (one row per time bucket); the entity id/name fields (`campaign_*`, `ad_group_*`, `ad_*`) are present when rows are broken down by that entity.' securitySchemes: APIKeyHeader: type: apiKey in: header name: X-API-Key BearerAuth: type: http scheme: bearer