diff --git a/README.md b/README.md index b21f563..63f12a6 100644 --- a/README.md +++ b/README.md @@ -1,124 +1,12 @@ # openpannel -A new A2A agent +Generated A2APack agent for OpenPanel Admin API. -This project was scaffolded with `a2a init`. It starts as a DeepAgents-backed -A2A agent that uses a scoped platform LLM grant from `ctx.llm`. +- Source OpenAPI: + - https://analytics.a2acloud.io/api/documentation/admin.json + - https://analytics.a2acloud.io/api/documentation/project.json +- Generated operations: 80 +- Main skill: `auto` -The same `ctx.llm` path is used if you intentionally switch the agent to -`LLMProvisioning.CALLER_PROVIDED` for BYOK: the platform forwards the caller's -selected credentials as `ctx.llm`. Trusted platform agents may use -`LLMProvisioning.PLATFORM_OR_CALLER_PROVIDED` to prefer caller creds and fall -back to a platform grant. Do not read provider keys, LiteLLM master keys, -`OPENAI_API_KEY`, or `A2A_LITELLM_KEY` directly in agent code, and do not -substitute fake fallback API keys when `ctx.llm.api_key` is empty. - -## Durable Files - -A2A Cloud workspaces are grant-scoped and backed by MinIO. Files become durable -when your agent uses one of the platform-owned file paths: - -- `ctx.workspace` for direct workspace reads and writes -- `ctx.write_artifact(...)` for explicit output artifacts -- `ctx.sandbox` for commands that read or write files in a sandbox -- `ctx.workspace_backend()` for framework file tools such as DeepAgents - -DeepAgents has its own built-in file tools (`write_file`, `read_file`, -`edit_file`). Without an A2A backend, those tools write into LangGraph state -only, so files can appear to the agent but never reach MinIO or `/workspace`. - -Keep this line when building DeepAgents graphs: - -```python -backend = ctx.workspace_backend() -return create_deep_agent(model=model, backend=backend, tools=[...]) -``` - -Invoke DeepAgents graphs with the starter recursion budget: - -```python -state = await graph.ainvoke( - {"messages": [{"role": "user", "content": prompt}]}, - config={"recursion_limit": 500}, -) -``` - -The backend respects the caller's grant. In handoffs, generated files should go -through `ctx.workspace_backend()`, `ctx.write_artifact(...)`, or a sandbox helper -so they are mirrored to the caller workspace instead of becoming private virtual -files. - -For stable, human-readable paths, write intentional outputs to -`/workspace/outputs/...` or `ctx.write_artifact(...)`. If sandboxed code writes -to process-local paths such as `/tmp/result.csv`, `/root`, or `/app`, the -platform captures changed rootfs files under `outputs/rootfs-captures/...` so -the caller can still download and inspect them. - -When a skill needs to run real code, render media, convert files, or call a -CLI that writes outputs, use the workspace-mounted sandbox helpers: - -```python -result = await ctx.workspace_shell( - "python script.py --out /tmp/result.txt", - image="python:3.11-slim", - timeout_seconds=120, -) -``` - -Do not rely on `asyncio.create_subprocess_exec(...)` for durable outputs. A -plain subprocess runs in the agent container, which is not mounted to the -caller workspace; files it creates in `/tmp` or the image filesystem can vanish -after the request. Use the sandbox helpers for any file-producing toolchain. - -## DeepAgents Skills - -If this project grows reusable workflow knowledge, add source-controlled skill -folders under `skills//SKILL.md`. The starter's `_seed_runtime_skills` -helper copies those packaged skills into the invocation workspace and passes the -resulting source path to `create_deep_agent(..., skills=[...])`, which is how -DeepAgents discovers skills with progressive disclosure. - -## Run Locally - -```bash -python -m pip install -r requirements.txt -a2a dev -a2a test -a2a test --invoke --skill summarize --args-json '{"text":"hello"}' -a2a card -``` - -`a2a dev` loads `.env.local`, creates `.a2a/workspace/{inputs,outputs}`, serves -the same HTTP invoke/card/MCP endpoints as production, and hot reloads local -code. Files written through `ctx.workspace_backend()` land under -`.a2a/workspace/outputs` before you deploy. - -## Auth - -The template is public by default (`auth_model = NoAuth`). To require the -caller's app login, declare a typed auth model and resolver in `agent.py`. -Resolvers receive the inbound bearer token and return the principal exposed as -`ctx.auth`. - -Hosted browser/direct invokes that use `LLMProvisioning.PLATFORM` still need an -A2A Cloud session so the runtime can mint a short-lived LLM/workspace grant for -that user. Agent-to-agent handoffs pass that grant explicitly. - -```python -from a2a_pack import JWTAuth, OIDCUserInfoAuthResolver - -auth_model = JWTAuth -auth_resolver = OIDCUserInfoAuthResolver( - "https://auth.example.com/oauth2/userinfo", - auth_model=JWTAuth, -) -``` - -For homegrown auth or SAML-backed apps, expose a bearer-token `/me` or -`/introspect` endpoint and use the same resolver contract. - -## Deploy - -```bash -a2a deploy -``` +The generated code is intentionally editable. Tune prompts, operation +grouping, auth names, and safety policy before publishing serious agents. diff --git a/a2a.yaml b/a2a.yaml index 67e16bd..99e6ed6 100644 --- a/a2a.yaml +++ b/a2a.yaml @@ -1,9 +1,14 @@ -# Project identity for `a2a deploy`. Most metadata (resources, scopes, -# secrets, workspace, etc.) lives on the Python class — this file only -# tells the CLI how to find it. name: openpannel -version: 0.1.0 +version: 1.0.0 entrypoint: agent:Openpannel -expose: - public: true - +description: OpenPanel analytics agent for the A2A Cloud OpenPanel deployment. Includes + manage/admin operations and project analytics operations from the OpenPanel OpenAPI + specs. +runtime: + resources: + cpu: 200m + memory: 512Mi + egress: + allow_hosts: + - analytics.a2acloud.io + deny_internet_by_default: true diff --git a/agent.py b/agent.py index a0b09fb..6a086da 100644 --- a/agent.py +++ b/agent.py @@ -1,204 +1,1869 @@ -"""openpannel agent. - -Starter stack: - - DeepAgents for tool-calling orchestration - - A2A platform LLM grants via ctx.llm - - A tiny model-call middleware hook you can replace with tracing, - routing, rate limits, or policy checks -""" from __future__ import annotations +import base64 import json -from pathlib import Path +import re from typing import Any -from pydantic import BaseModel +import httpx +from deepagents import create_deep_agent +from langchain_core.messages import BaseMessage +from langchain_core.tools import StructuredTool +from langchain_openai import ChatOpenAI +from pydantic import BaseModel, Field from a2a_pack import ( A2AAgent, + ConsumerSetup, + ConsumerSetupField, + ConsumerSetupMissing, + EgressPolicy, LLMProvisioning, - NoAuth, Pricing, + Resources, RunContext, - WorkspaceAccess, - WorkspaceMode, skill, ) -from a2a_pack.context import LLMCreds -class OpenpannelConfig(BaseModel): - pass +DEFAULT_BASE_URL = "https://analytics.a2acloud.io/api" +OPERATIONS = json.loads("{\n \"delete_manage_clients_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete an API client.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_manage_clients_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/clients/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"delete_manage_clients_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Delete an API client.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"delete_manage_projects_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Soft-delete a project (scheduled for removal in 24 hours).\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_manage_projects_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"delete_manage_projects_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Soft-delete a project (scheduled for removal in 24 hours).\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"delete_manage_references_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"delete_/manage/references/{id}\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_manage_references_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/references/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"delete_manage_references_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"delete_/manage/references/{id}\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_export_charts\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Export aggregated chart/analytics data for a series of events over a time range.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_export_charts\",\n \"parameters\": [\n {\n \"description\": \"Array of dimensions to break down the data by\",\n \"in\": \"query\",\n \"name\": \"breakdowns\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"description\": \"Array of dimensions to break down the data by\",\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"The time interval for data aggregation (e.g., day, week, month)\",\n \"in\": \"query\",\n \"name\": \"interval\",\n \"required\": false,\n \"schema\": {\n \"default\": \"day\",\n \"description\": \"The time interval for data aggregation (e.g., day, week, month)\",\n \"enum\": [\n \"minute\",\n \"day\",\n \"hour\",\n \"week\",\n \"month\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The time range for which data should be displayed\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"30d\",\n \"description\": \"The time range for which data should be displayed\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Whether to show data from the previous period for comparison\",\n \"in\": \"query\",\n \"name\": \"previous\",\n \"required\": false,\n \"schema\": {\n \"default\": false,\n \"description\": \"Whether to show data from the previous period for comparison\",\n \"type\": \"boolean\"\n }\n },\n {\n \"description\": \"Custom start date for the data range (overrides range if provided)\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Custom start date for the data range (overrides range if provided)\"\n }\n },\n {\n \"description\": \"Custom end date for the data range (overrides range if provided)\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Custom end date for the data range (overrides range if provided)\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"project_id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"projectId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"series\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"filters\": {\n \"default\": [],\n \"description\": \"Filters applied specifically to this event\",\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"property\": {\n \"description\": \"Optional property of the event used for specific segment calculations (e.g., value for property_sum/average)\",\n \"type\": \"string\"\n },\n \"segment\": {\n \"default\": \"event\",\n \"description\": \"Defines how the event data should be segmented or aggregated\",\n \"enum\": [\n \"event\",\n \"user\",\n \"session\",\n \"group\",\n \"user_average\",\n \"one_event_per_user\",\n \"property_sum\",\n \"property_average\",\n \"property_max\",\n \"property_min\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"events\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"filters\": {\n \"default\": [],\n \"description\": \"Filters applied specifically to this event\",\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"property\": {\n \"description\": \"Optional property of the event used for specific segment calculations (e.g., value for property_sum/average)\",\n \"type\": \"string\"\n },\n \"segment\": {\n \"default\": \"event\",\n \"description\": \"Defines how the event data should be segmented or aggregated\",\n \"enum\": [\n \"event\",\n \"user\",\n \"session\",\n \"group\",\n \"user_average\",\n \"one_event_per_user\",\n \"property_sum\",\n \"property_average\",\n \"property_max\",\n \"property_min\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/export/charts\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_export_charts\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Export aggregated chart/analytics data for a series of events over a time range.\",\n \"tags\": [\n \"Export\"\n ]\n },\n \"get_export_events\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Export a paginated list of raw events with optional filtering by date, profile, and event type.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_export_events\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"project_id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"projectId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"profileId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"event\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"start\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"end\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"page\",\n \"required\": false,\n \"schema\": {\n \"default\": 1,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"includes\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/export/events\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_export_events\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Export a paginated list of raw events with optional filtering by date, profile, and event type.\",\n \"tags\": [\n \"Export\"\n ]\n },\n \"get_insights_project_id_active_users\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get rolling active user counts over the last N days.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_active_users\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"days\",\n \"required\": false,\n \"schema\": {\n \"default\": 7,\n \"maximum\": 90,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/active_users\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_active_users\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get rolling active user counts over the last N days.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_brand\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"brand\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_brand\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/brand\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_brand\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"brand\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_browser\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"browser\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_browser\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/browser\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_browser\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"browser\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_browser_version\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"browser_version\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_browser_version\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/browser_version\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_browser_version\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"browser_version\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_city\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"city\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_city\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/city\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_city\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"city\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_country\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"country\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_country\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/country\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_country\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"country\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_device\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"device\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_device\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/device\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_device\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"device\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_engagement\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get engagement metrics for the project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_engagement\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/engagement\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_engagement\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get engagement metrics for the project.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_events\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Query events with optional filters for date range, profile, and properties.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_events\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"eventNames\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"string\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"path\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"country\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"city\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"device\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"browser\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"os\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrer\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrerName\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrerType\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"profileId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"properties\",\n \"required\": false,\n \"schema\": {\n \"additionalProperties\": {\n \"type\": \"string\"\n },\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/events\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_events\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Query events with optional filters for date range, profile, and properties.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_events_names\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all distinct event names tracked in the project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_events_names\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/events/names\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_events_names\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"List all distinct event names tracked in the project.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_events_properties\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all property keys for a given event name.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_events_properties\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"eventName\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/events/properties\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_events_properties\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"List all property keys for a given event name.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_events_property_values\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get the top values for a specific event property key.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_events_property_values\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"eventName\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"propertyKey\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/events/property_values\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_events_property_values\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get the top values for a specific event property key.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_funnel\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get funnel conversion rates for a sequence of events.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_funnel\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"steps\",\n \"required\": true,\n \"schema\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"string\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"windowHours\",\n \"required\": false,\n \"schema\": {\n \"default\": 24,\n \"maximum\": 720,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"groupBy\",\n \"required\": false,\n \"schema\": {\n \"default\": \"session_id\",\n \"enum\": [\n \"session_id\",\n \"profile_id\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/funnel\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_funnel\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get funnel conversion rates for a sequence of events.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_groups\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Search and filter groups.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_groups\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"type\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"search\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/groups\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_groups\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Search and filter groups.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_groups_group_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single group with its members.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_groups_group_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"memberLimit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"maximum\": 50,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"groupId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/groups/{groupId}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_groups_group_id\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get a single group with its members.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_groups_types\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all group types defined in the project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_groups_types\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/groups/types\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_groups_types\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"List all group types defined in the project.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_cannibalization\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Detect keyword cannibalization across pages in Google Search Console.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_cannibalization\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/cannibalization\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_cannibalization\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Detect keyword cannibalization across pages in Google Search Console.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_overview\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a Google Search Console performance overview (clicks, impressions, CTR, position).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_overview\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"interval\",\n \"required\": false,\n \"schema\": {\n \"default\": \"day\",\n \"enum\": [\n \"day\",\n \"week\",\n \"month\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/overview\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_overview\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get a Google Search Console performance overview (clicks, impressions, CTR, position).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_pages\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top pages from Google Search Console.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_pages\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 100,\n \"maximum\": 1000,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/pages\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_pages\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top pages from Google Search Console.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_pages_details\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get detailed GSC metrics for a specific page URL.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_pages_details\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"page\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/pages/details\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_pages_details\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get detailed GSC metrics for a specific page URL.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_queries\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top search queries from Google Search Console.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_queries\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 100,\n \"maximum\": 1000,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/queries\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_queries\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top search queries from Google Search Console.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_queries_details\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get detailed GSC metrics for a specific search query.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_queries_details\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/queries/details\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_queries_details\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get detailed GSC metrics for a specific search query.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_queries_opportunities\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get GSC query opportunities (high impressions, low CTR).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_queries_opportunities\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"minImpressions\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 9007199254740991,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/queries/opportunities\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_queries_opportunities\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get GSC query opportunities (high impressions, low CTR).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_live\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get the current number of live (active) visitors.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_live\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/live\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_live\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get the current number of live (active) visitors.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_metrics\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get aggregated website metrics including sessions, pageviews, and bounce rate.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_metrics\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/metrics\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_metrics\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get aggregated website metrics including sessions, pageviews, and bounce rate.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_model\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"model\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_model\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/model\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_model\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"model\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_os\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"os\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_os\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/os\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_os\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"os\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_os_version\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"os_version\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_os_version\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/os_version\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_os_version\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"os_version\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_overview\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get an overview of key metrics for the project (sessions, pageviews, bounce rate, duration).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_overview\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"interval\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"hour\",\n \"day\",\n \"week\",\n \"month\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/overview\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_overview\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get an overview of key metrics for the project (sessions, pageviews, bounce rate, duration).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_pages\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top pages with pageview counts for the selected date range.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_pages\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/pages\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_pages\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top pages with pageview counts for the selected date range.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_pages_entry_exit\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get entry or exit pages ranked by session count.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_pages_entry_exit\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"mode\",\n \"required\": false,\n \"schema\": {\n \"default\": \"entry\",\n \"enum\": [\n \"entry\",\n \"exit\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/pages/entry_exit\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_pages_entry_exit\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get entry or exit pages ranked by session count.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_pages_performance\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get page-level performance metrics (bounce rate, avg duration, sessions).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_pages_performance\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"search\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"sortBy\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"sessions\",\n \"pageviews\",\n \"bounce_rate\",\n \"avg_duration\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"sortOrder\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 500,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/pages/performance\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_pages_performance\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get page-level performance metrics (bounce rate, avg duration, sessions).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_pages_top\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get the top pages by pageviews for the given date range.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_pages_top\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/pages/top\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_pages_top\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get the top pages by pageviews for the given date range.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_profiles\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Search and filter user profiles.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_profiles\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"name\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"email\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"country\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"city\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"device\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"browser\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"inactiveDays\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 9007199254740991,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"minSessions\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 9007199254740991,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"performedEvent\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"sortOrder\",\n \"required\": false,\n \"schema\": {\n \"default\": \"desc\",\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/profiles\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_profiles\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Search and filter user profiles.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_profiles_profile_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single user profile with their recent events.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_profiles_profile_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"eventLimit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"profileId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/profiles/{profileId}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_profiles_profile_id\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get a single user profile with their recent events.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_profiles_profile_id_metrics\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get aggregated metrics for a specific user profile.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_profiles_profile_id_metrics\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"profileId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/profiles/{profileId}/metrics\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_profiles_profile_id_metrics\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get aggregated metrics for a specific user profile.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_profiles_profile_id_sessions\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get sessions for a specific user profile.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_profiles_profile_id_sessions\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"profileId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/profiles/{profileId}/sessions\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_profiles_profile_id_sessions\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get sessions for a specific user profile.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_referrer\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"referrer\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_referrer\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/referrer\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_referrer\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"referrer\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_referrer_name\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"referrer_name\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_referrer_name\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/referrer_name\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_referrer_name\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"referrer_name\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_referrer_type\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"referrer_type\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_referrer_type\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/referrer_type\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_referrer_type\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"referrer_type\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_region\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"region\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_region\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/region\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_region\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"region\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_reports_report_id_data\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get the data for a saved report.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_reports_report_id_data\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"reportId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/reports/{reportId}/data\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_reports_report_id_data\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get the data for a saved report.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_retention\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get weekly retention series data.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_retention\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/retention\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_retention\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get weekly retention series data.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_retention_cohort\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get retention cohort data.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_retention_cohort\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/retention/cohort\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_retention_cohort\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get retention cohort data.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_sessions\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Query sessions with optional filters.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_sessions\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"country\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"city\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"device\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"browser\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"os\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrer\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrerName\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrerType\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"profileId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/sessions\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_sessions\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Query sessions with optional filters.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_traffic_devices\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get traffic breakdown by device type, browser, or OS.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_traffic_devices\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"breakdown\",\n \"required\": false,\n \"schema\": {\n \"default\": \"device\",\n \"enum\": [\n \"device\",\n \"browser\",\n \"os\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/traffic/devices\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_traffic_devices\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get traffic breakdown by device type, browser, or OS.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_traffic_geo\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get traffic breakdown by geographic dimension (country, region, city).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_traffic_geo\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"breakdown\",\n \"required\": false,\n \"schema\": {\n \"default\": \"country\",\n \"enum\": [\n \"country\",\n \"region\",\n \"city\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/traffic/geo\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_traffic_geo\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get traffic breakdown by geographic dimension (country, region, city).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_traffic_referrers\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get traffic breakdown by referrer source.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_traffic_referrers\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"breakdown\",\n \"required\": false,\n \"schema\": {\n \"default\": \"referrer_name\",\n \"enum\": [\n \"referrer_name\",\n \"referrer_type\",\n \"referrer\",\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/traffic/referrers\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_traffic_referrers\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get traffic breakdown by referrer source.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_user_flow\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get user flow paths before, after, or between specified events.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_user_flow\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startEvent\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endEvent\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"mode\",\n \"required\": false,\n \"schema\": {\n \"default\": \"after\",\n \"enum\": [\n \"after\",\n \"before\",\n \"between\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"steps\",\n \"required\": false,\n \"schema\": {\n \"default\": 5,\n \"maximum\": 10,\n \"minimum\": 2,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"exclude\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"string\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"string\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/user_flow\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_user_flow\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get user flow paths before, after, or between specified events.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_campaign\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_campaign\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_campaign\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_campaign\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_campaign\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_campaign\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_content\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_content\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_content\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_content\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_content\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_content\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_medium\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_medium\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_medium\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_medium\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_medium\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_medium\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_source\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_source\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_source\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_source\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_source\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_source\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_term\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_term\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_term\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_term\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_term\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_term\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_manage_clients\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all API clients for the organization, optionally filtered by project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_clients\",\n \"parameters\": [],\n \"path\": \"/manage/clients\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_clients\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List all API clients for the organization, optionally filtered by project.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_clients_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single API client by ID.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_clients_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/clients/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_clients_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Get a single API client by ID.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_projects\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all projects for the organization.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_projects\",\n \"parameters\": [],\n \"path\": \"/manage/projects\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_projects\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List all projects for the organization.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_projects_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single project by ID.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_projects_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_projects_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Get a single project by ID.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_projects_project_id_dashboards\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all dashboards for a project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_projects_project_id_dashboards\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{projectId}/dashboards\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_projects_project_id_dashboards\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List all dashboards for a project.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_projects_project_id_dashboards_dashboard_id_reports\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all reports in a dashboard.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_projects_project_id_dashboards_dashboard_id_reports\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"dashboardId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{projectId}/dashboards/{dashboardId}/reports\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_projects_project_id_dashboards_dashboard_id_reports\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List all reports in a dashboard.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_references\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List annotation references for a project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_references\",\n \"parameters\": [],\n \"path\": \"/manage/references\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_references\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List annotation references for a project.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_references_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single annotation reference by ID.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_references_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/references/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_references_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Get a single annotation reference by ID.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_track_device_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get or generate a stable device ID and session ID for the current visitor.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_track_device_id\",\n \"parameters\": [],\n \"path\": \"/track/device-id\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_track_device_id\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get or generate a stable device ID and session ID for the current visitor.\",\n \"tags\": [\n \"Track\"\n ]\n },\n \"patch_manage_clients_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an API client name.\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_manage_clients_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/clients/{id}\",\n \"request_body\": {\n \"properties\": {\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"patch_manage_clients_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Update an API client name.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"patch_manage_projects_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update project settings (name, domain, CORS, tracking options).\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_manage_projects_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{id}\",\n \"request_body\": {\n \"properties\": {\n \"allowUnsafeRevenueTracking\": {\n \"type\": \"boolean\"\n },\n \"cors\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"crossDomain\": {\n \"type\": \"boolean\"\n },\n \"domain\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"format\": \"uri\",\n \"type\": \"string\"\n },\n {\n \"const\": \"\",\n \"type\": \"string\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"patch_manage_projects_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Update project settings (name, domain, CORS, tracking options).\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"patch_manage_references_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"patch_/manage/references/{id}\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_manage_references_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/references/{id}\",\n \"request_body\": {\n \"properties\": {\n \"datetime\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"patch_manage_references_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"patch_/manage/references/{id}\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"post_event\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Deprecated direct event ingestion endpoint. Use /track instead.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_event\",\n \"parameters\": [],\n \"path\": \"/event/\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_event\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Deprecated direct event ingestion endpoint. Use /track instead.\",\n \"tags\": [\n \"Event\"\n ]\n },\n \"post_import_events\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Bulk import historical events.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_import_events\",\n \"parameters\": [],\n \"path\": \"/import/events\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_import_events\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Bulk import historical events.\",\n \"tags\": [\n \"Import\"\n ]\n },\n \"post_manage_clients\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new API client (read, write, or root type) and return its generated secret.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_manage_clients\",\n \"parameters\": [],\n \"path\": \"/manage/clients\",\n \"request_body\": {\n \"properties\": {\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"projectId\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"default\": \"write\",\n \"enum\": [\n \"read\",\n \"write\",\n \"root\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_manage_clients\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Create a new API client (read, write, or root type) and return its generated secret.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"post_manage_projects\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new project and its first write client.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_manage_projects\",\n \"parameters\": [],\n \"path\": \"/manage/projects\",\n \"request_body\": {\n \"properties\": {\n \"cors\": {\n \"default\": [],\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"crossDomain\": {\n \"default\": false,\n \"type\": \"boolean\"\n },\n \"domain\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"format\": \"uri\",\n \"type\": \"string\"\n },\n {\n \"const\": \"\",\n \"type\": \"string\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"types\": {\n \"default\": [],\n \"items\": {\n \"enum\": [\n \"website\",\n \"app\",\n \"backend\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_manage_projects\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Create a new project and its first write client.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"post_manage_references\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"post_/manage/references\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_manage_references\",\n \"parameters\": [],\n \"path\": \"/manage/references\",\n \"request_body\": {\n \"properties\": {\n \"datetime\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"projectId\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"projectId\",\n \"title\",\n \"datetime\"\n ],\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_manage_references\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"post_/manage/references\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"post_profile\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Identify or update a user profile.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_profile\",\n \"parameters\": [],\n \"path\": \"/profile/\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_profile\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Identify or update a user profile.\",\n \"tags\": [\n \"Profile\"\n ]\n },\n \"post_profile_decrement\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Decrement a numeric property on a user profile.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_profile_decrement\",\n \"parameters\": [],\n \"path\": \"/profile/decrement\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_profile_decrement\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Decrement a numeric property on a user profile.\",\n \"tags\": [\n \"Profile\"\n ]\n },\n \"post_profile_increment\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Increment a numeric property on a user profile.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_profile_increment\",\n \"parameters\": [],\n \"path\": \"/profile/increment\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_profile_increment\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Increment a numeric property on a user profile.\",\n \"tags\": [\n \"Profile\"\n ]\n },\n \"post_track\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Ingest a tracking event (track, identify, group, increment, decrement, replay).\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_track\",\n \"parameters\": [],\n \"path\": \"/track/\",\n \"request_body\": {\n \"allOf\": [\n {\n \"oneOf\": [\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"groups\": {\n \"anyOf\": [\n {\n \"items\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"properties\": {\n \"additionalProperties\": {},\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"track\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Track\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"avatar\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n },\n \"email\": {\n \"format\": \"email\",\n \"pattern\": \"^(?!\\\\.)(?!.*\\\\.\\\\.)([A-Za-z0-9_'+\\\\-\\\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\\\-]*\\\\.)+[A-Za-z]{2,}$\",\n \"type\": \"string\"\n },\n \"firstName\": {\n \"type\": \"string\"\n },\n \"lastName\": {\n \"type\": \"string\"\n },\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"properties\": {\n \"additionalProperties\": {},\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"profileId\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"identify\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Identify\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"property\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"value\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"profileId\",\n \"property\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"increment\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Increment\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"property\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"value\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"profileId\",\n \"property\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"decrement\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Decrement\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"alias\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n }\n },\n \"required\": [\n \"profileId\",\n \"alias\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"alias\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Alias\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"chunk_index\": {\n \"maximum\": 65535,\n \"minimum\": 0,\n \"type\": \"integer\"\n },\n \"ended_at\": {\n \"format\": \"date-time\",\n \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?(?:Z))$\",\n \"type\": \"string\"\n },\n \"events_count\": {\n \"maximum\": 9007199254740991,\n \"minimum\": 1,\n \"type\": \"integer\"\n },\n \"is_full_snapshot\": {\n \"type\": \"boolean\"\n },\n \"payload\": {\n \"maxLength\": 2097152,\n \"type\": \"string\"\n },\n \"started_at\": {\n \"format\": \"date-time\",\n \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?(?:Z))$\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"chunk_index\",\n \"events_count\",\n \"is_full_snapshot\",\n \"started_at\",\n \"ended_at\",\n \"payload\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"replay\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Replay\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"id\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"properties\": {\n \"additionalProperties\": {},\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n },\n \"type\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"type\",\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"group\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Group\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"groupIds\": {\n \"items\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n }\n },\n \"required\": [\n \"groupIds\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"assign_group\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Assign Group\",\n \"type\": \"object\"\n }\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"clientId\": {\n \"type\": \"string\"\n },\n \"clientSecret\": {\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n }\n ]\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_track\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Ingest a tracking event (track, identify, group, increment, decrement, replay).\",\n \"tags\": [\n \"Track\"\n ]\n }\n}") +ROOT_SECURITY = json.loads("[]") +SECURITY_SCHEMES = json.loads("{\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": {\n \"description\": \"OpenPanel API client ID.\",\n \"in\": \"header\",\n \"name\": \"openpanel-client-id\",\n \"type\": \"apiKey\",\n \"x-a2a-description\": \"OpenAPI source: https://analytics.a2acloud.io/api/documentation/admin.json. OpenPanel API client ID. Use a root client for manage/admin operations and a project client for project API operations.\",\n \"x-a2a-field-name\": \"ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_ADMIN_JSON_OPENPANEL_CLIENT_ID\",\n \"x-a2a-label\": \"OpenPanel client ID for https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"x-a2a-source-title\": \"OpenPanel Admin API\",\n \"x-a2a-source-url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\"\n },\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": {\n \"description\": \"OpenPanel API client secret.\",\n \"in\": \"header\",\n \"name\": \"openpanel-client-secret\",\n \"type\": \"apiKey\",\n \"x-a2a-description\": \"OpenAPI source: https://analytics.a2acloud.io/api/documentation/admin.json. OpenPanel API client secret. Requests send it in the `openpanel-client-secret` header.\",\n \"x-a2a-field-name\": \"ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_ADMIN_JSON_OPENPANEL_CLIENT_SECRET\",\n \"x-a2a-label\": \"OpenPanel client secret for https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"x-a2a-source-title\": \"OpenPanel Admin API\",\n \"x-a2a-source-url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\"\n },\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": {\n \"description\": \"OpenPanel API client ID.\",\n \"in\": \"header\",\n \"name\": \"openpanel-client-id\",\n \"type\": \"apiKey\",\n \"x-a2a-description\": \"OpenAPI source: https://analytics.a2acloud.io/api/documentation/project.json. OpenPanel API client ID. Use a root client for manage/admin operations and a project client for project API operations.\",\n \"x-a2a-field-name\": \"ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_PROJECT_JSON_OPENPANEL_CLIENT_ID\",\n \"x-a2a-label\": \"OpenPanel client ID for https://analytics.a2acloud.io/api/documentation/project.json\",\n \"x-a2a-source-title\": \"OpenPanel Project API\",\n \"x-a2a-source-url\": \"https://analytics.a2acloud.io/api/documentation/project.json\"\n },\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": {\n \"description\": \"OpenPanel API client secret.\",\n \"in\": \"header\",\n \"name\": \"openpanel-client-secret\",\n \"type\": \"apiKey\",\n \"x-a2a-description\": \"OpenAPI source: https://analytics.a2acloud.io/api/documentation/project.json. OpenPanel API client secret. Requests send it in the `openpanel-client-secret` header.\",\n \"x-a2a-field-name\": \"ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_PROJECT_JSON_OPENPANEL_CLIENT_SECRET\",\n \"x-a2a-label\": \"OpenPanel client secret for https://analytics.a2acloud.io/api/documentation/project.json\",\n \"x-a2a-source-title\": \"OpenPanel Project API\",\n \"x-a2a-source-url\": \"https://analytics.a2acloud.io/api/documentation/project.json\"\n }\n}") +SECURITY_FIELDS = json.loads("{\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": {\n \"field\": \"ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_ADMIN_JSON_OPENPANEL_CLIENT_ID\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"openpanel-client-id\"\n },\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": {\n \"field\": \"ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_ADMIN_JSON_OPENPANEL_CLIENT_SECRET\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"openpanel-client-secret\"\n },\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": {\n \"field\": \"ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_PROJECT_JSON_OPENPANEL_CLIENT_ID\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"openpanel-client-id\"\n },\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": {\n \"field\": \"ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_PROJECT_JSON_OPENPANEL_CLIENT_SECRET\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"openpanel-client-secret\"\n }\n}") +PATH_PARAMETER_RE = re.compile(r"{([^}/]+)}") -SYSTEM_PROMPT = """\ -You are a compact tool-calling agent. - -Use the text_stats tool when the user asks about text, counts, summaries, -or anything where exact length/word numbers would help. Mention tool results -briefly instead of dumping raw JSON. -""" - -RUNTIME_SKILLS_DIR = "openpannel/.deepagents/skills/" -DEEPAGENTS_RECURSION_LIMIT = 500 +class OperationInput(BaseModel): + parameters: dict[str, Any] = Field( + default_factory=dict, + description="Path, query, header, and cookie parameters keyed by OpenAPI parameter name.", + ) + body: Any | None = Field(default=None, description="JSON request body, when the operation accepts one.") -class Openpannel(A2AAgent[OpenpannelConfig, NoAuth]): +class Openpannel(A2AAgent): name = "openpannel" - description = "A new A2A agent" - version = "0.1.0" - - config_model = OpenpannelConfig - auth_model = NoAuth - - # Default hosted generated agents to platform LLM grants. The runtime - # exposes the scoped LiteLLM token through ctx.llm, so agent code never - # reads provider keys, LiteLLM master keys, or OPENAI_API_KEY directly. - # Use CALLER_PROVIDED only for explicit BYOK agents; reserve - # PLATFORM_OR_CALLER_PROVIDED for trusted platform/meta agents. + description = "OpenPanel analytics agent for the A2A Cloud OpenPanel deployment. Includes manage/admin operations and project analytics operations from the OpenPanel OpenAPI specs." + version = "1.0.0" + consumer_setup = ConsumerSetup.from_fields( + ConsumerSetupField.config("OPENAPI_BASE_URL", label="API base URL", description="Override the default API server (https://analytics.a2acloud.io/api).", required=False, input_type="url"), + ConsumerSetupField.secret("ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_ADMIN_JSON_OPENPANEL_CLIENT_ID", label="OpenPanel client ID for https://analytics.a2acloud.io/api/documentation/admin.json", description="OpenAPI source: https://analytics.a2acloud.io/api/documentation/admin.json. OpenPanel API client ID. Use a root client for manage/admin operations and a project client for project API operations.", required=True), + ConsumerSetupField.secret("ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_ADMIN_JSON_OPENPANEL_CLIENT_SECRET", label="OpenPanel client secret for https://analytics.a2acloud.io/api/documentation/admin.json", description="OpenAPI source: https://analytics.a2acloud.io/api/documentation/admin.json. OpenPanel API client secret. Requests send it in the `openpanel-client-secret` header.", required=True), + ConsumerSetupField.secret("ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_PROJECT_JSON_OPENPANEL_CLIENT_ID", label="OpenPanel client ID for https://analytics.a2acloud.io/api/documentation/project.json", description="OpenAPI source: https://analytics.a2acloud.io/api/documentation/project.json. OpenPanel API client ID. Use a root client for manage/admin operations and a project client for project API operations.", required=True), + ConsumerSetupField.secret("ANALYTICS_A2ACLOUD_IO_API_DOCUMENTATION_PROJECT_JSON_OPENPANEL_CLIENT_SECRET", label="OpenPanel client secret for https://analytics.a2acloud.io/api/documentation/project.json", description="OpenAPI source: https://analytics.a2acloud.io/api/documentation/project.json. OpenPanel API client secret. Requests send it in the `openpanel-client-secret` header.", required=True), + ) llm_provisioning = LLMProvisioning.PLATFORM pricing = Pricing( price_per_call_usd=0.0, caller_pays_llm=False, - notes="Starter agent uses a scoped platform LLM grant via ctx.llm.", + notes="Uses a scoped platform LLM grant through ctx.llm.", ) - workspace_access = WorkspaceAccess.dynamic( - max_files=64, - allowed_modes=(WorkspaceMode.READ_ONLY, WorkspaceMode.READ_WRITE_OVERLAY), - require_reason=False, + resources = Resources(cpu="200m", memory="512Mi") + egress = EgressPolicy( + allow_hosts=('analytics.a2acloud.io',), + deny_internet_by_default=True, ) - tools_used = ("deepagents", "langchain") + tools_used = ("openapi", "deepagents") + capabilities = { + "openapi_auto_agent": { + "operation_count": len(OPERATIONS), + "default_base_url": DEFAULT_BASE_URL, + "source_openapi_url": None, + "source_openapi_urls": ['https://analytics.a2acloud.io/api/documentation/admin.json', 'https://analytics.a2acloud.io/api/documentation/project.json'], + "server_urls": ['https://analytics.a2acloud.io/api'], + "regenerable": True, + "security_schemes": list(SECURITY_SCHEMES), + } + } - @skill(description="Ask the starter DeepAgent to answer with tool calls when useful") - async def ask(self, ctx: RunContext[NoAuth], prompt: str) -> str: + @skill( + name="auto", + description="Use the OpenAPI service to complete a natural-language goal.", + tags=("openapi", "auto"), + timeout_seconds=180, + ) + async def auto(self, ctx: RunContext, goal: str) -> dict[str, Any]: creds = ctx.llm - await ctx.emit_progress(f"llm: {creds.model} via {creds.source}") if not creds.api_key: - return ( - "LLM credentials were not available for this run. Hosted " - "generated agents should receive a platform LLM grant; for " - "local --invoke runs set A2A_LITELLM_KEY or AGENT_LLM_KEY." - ) - graph = self._build_deep_agent(ctx=ctx, creds=creds) - state = await graph.ainvoke( - {"messages": [{"role": "user", "content": prompt}]}, - config={"recursion_limit": DEEPAGENTS_RECURSION_LIMIT}, - ) - await ctx.emit_progress("deepagent finished") - return _last_message_text(state) - - def _build_deep_agent( - self, - *, - ctx: RunContext[NoAuth], - creds: LLMCreds, - ) -> Any: - # Lazy imports keep `a2a card` usable before local dependencies are - # installed. `a2a deploy` installs requirements.txt during the build. - from deepagents import create_deep_agent - from langchain.agents.middleware import wrap_model_call - from langchain_core.tools import tool - from langchain_openai import ChatOpenAI - - @tool - def text_stats(text: str) -> str: - """Return exact word, character, and line counts for text.""" - words = [part for part in text.split() if part.strip()] - return json.dumps( - { - "characters": len(text), - "words": len(words), - "lines": len(text.splitlines()) or 1, - } - ) - - @wrap_model_call - async def log_model_call(request: Any, handler: Any) -> Any: - messages = request.state.get("messages", []) - print( - "[middleware] model_call " - f"model={creds.model} source={creds.source} messages={len(messages)}" - ) - return await handler(request) - + return { + "error": "llm_credentials_missing", + "final": ( + "LLM credentials were not available for this run. Hosted " + "generated OpenAPI agents should receive a platform LLM grant." + ), + "messages": [], + } model_kwargs: dict[str, Any] = { "model": creds.model, "base_url": creds.base_url, - # For CALLER_PROVIDED this is the caller's forwarded key. For - # PLATFORM this is the short-lived A2A LiteLLM grant token. Do not - # substitute provider keys, LiteLLM master keys, or fake fallback - # values here. "api_key": creds.api_key, } - if creds.temperature_mode != "omit": - model_kwargs["temperature"] = ( - creds.temperature if creds.temperature is not None else 0.0 - ) + if creds.temperature_mode != "omit" and creds.temperature is not None: + model_kwargs["temperature"] = creds.temperature if creds.extra_body: model_kwargs["extra_body"] = dict(creds.extra_body) - model = ChatOpenAI(**model_kwargs) - backend = ctx.workspace_backend() - skill_sources = _seed_runtime_skills(backend, ctx) - return create_deep_agent( + graph = create_deep_agent( model=model, - backend=backend, - skills=skill_sources or None, - tools=[text_stats], - middleware=[log_model_call], - system_prompt=SYSTEM_PROMPT, + tools=self._operation_tools(ctx), + system_prompt=self._system_prompt(), + ) + result = await graph.ainvoke({"messages": [{"role": "user", "content": goal}]}) + messages = result.get("messages", []) if isinstance(result, dict) else [] + final = _message_text(messages[-1]) if messages else result + return { + "final": final, + "messages": [_message_to_dict(message) for message in messages[-8:]], + } + + @skill( + name="get_manage_projects", + description="GET /manage/projects - List all projects for the organization.", + tags=('Manage',), + timeout_seconds=60, + ) + async def get_manage_projects( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_manage_projects", + parameters=parameters or {}, + body=body, ) + @skill( + name="post_manage_projects", + description="POST /manage/projects - Create a new project and its first write client.", + tags=('Manage',), + timeout_seconds=120, + ) + async def post_manage_projects( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "post_manage_projects", + parameters=parameters or {}, + body=body, + ) -def _runtime_skills_root(ctx: RunContext[Any]) -> str: - workspace = getattr(ctx, "_workspace", None) - prefixes = tuple(getattr(workspace, "write_prefixes", ()) or ()) - if not prefixes: - outputs_prefix = getattr(workspace, "outputs_prefix", None) - prefixes = (outputs_prefix or "outputs/",) - prefix = str(prefixes[0]).strip("/") - return f"/{prefix}/{RUNTIME_SKILLS_DIR}" if prefix else f"/{RUNTIME_SKILLS_DIR}" + @skill( + name="get_manage_projects_id", + description="GET /manage/projects/{id} - Get a single project by ID.", + tags=('Manage',), + timeout_seconds=60, + ) + async def get_manage_projects_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_manage_projects_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="patch_manage_projects_id", + description="PATCH /manage/projects/{id} - Update project settings (name, domain, CORS, tracking options).", + tags=('Manage',), + timeout_seconds=120, + ) + async def patch_manage_projects_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "patch_manage_projects_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="delete_manage_projects_id", + description="DELETE /manage/projects/{id} - Soft-delete a project (scheduled for removal in 24 hours).", + tags=('Manage',), + timeout_seconds=120, + ) + async def delete_manage_projects_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "delete_manage_projects_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_manage_clients", + description="GET /manage/clients - List all API clients for the organization, optionally filtered by project.", + tags=('Manage',), + timeout_seconds=60, + ) + async def get_manage_clients( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_manage_clients", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="post_manage_clients", + description="POST /manage/clients - Create a new API client (read, write, or root type) and return its generated secret.", + tags=('Manage',), + timeout_seconds=120, + ) + async def post_manage_clients( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "post_manage_clients", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_manage_clients_id", + description="GET /manage/clients/{id} - Get a single API client by ID.", + tags=('Manage',), + timeout_seconds=60, + ) + async def get_manage_clients_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_manage_clients_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="patch_manage_clients_id", + description="PATCH /manage/clients/{id} - Update an API client name.", + tags=('Manage',), + timeout_seconds=120, + ) + async def patch_manage_clients_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "patch_manage_clients_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="delete_manage_clients_id", + description="DELETE /manage/clients/{id} - Delete an API client.", + tags=('Manage',), + timeout_seconds=120, + ) + async def delete_manage_clients_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "delete_manage_clients_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_manage_references", + description="GET /manage/references - List annotation references for a project.", + tags=('Manage',), + timeout_seconds=60, + ) + async def get_manage_references( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_manage_references", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="post_manage_references", + description="POST /manage/references - post_/manage/references", + tags=('Manage',), + timeout_seconds=120, + ) + async def post_manage_references( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "post_manage_references", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_manage_references_id", + description="GET /manage/references/{id} - Get a single annotation reference by ID.", + tags=('Manage',), + timeout_seconds=60, + ) + async def get_manage_references_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_manage_references_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="patch_manage_references_id", + description="PATCH /manage/references/{id} - patch_/manage/references/{id}", + tags=('Manage',), + timeout_seconds=120, + ) + async def patch_manage_references_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "patch_manage_references_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="delete_manage_references_id", + description="DELETE /manage/references/{id} - delete_/manage/references/{id}", + tags=('Manage',), + timeout_seconds=120, + ) + async def delete_manage_references_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "delete_manage_references_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_manage_projects_project_id_dashboards", + description="GET /manage/projects/{projectId}/dashboards - List all dashboards for a project.", + tags=('Manage',), + timeout_seconds=60, + ) + async def get_manage_projects_project_id_dashboards( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_manage_projects_project_id_dashboards", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_manage_projects_project_id_dashboards_dashboard_id_reports", + description="GET /manage/projects/{projectId}/dashboards/{dashboardId}/reports - List all reports in a dashboard.", + tags=('Manage',), + timeout_seconds=60, + ) + async def get_manage_projects_project_id_dashboards_dashboard_id_reports( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_manage_projects_project_id_dashboards_dashboard_id_reports", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="post_event", + description="POST /event/ - Deprecated direct event ingestion endpoint. Use /track instead.", + tags=('Event',), + timeout_seconds=120, + ) + async def post_event( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "post_event", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="post_profile", + description="POST /profile/ - Identify or update a user profile.", + tags=('Profile',), + timeout_seconds=120, + ) + async def post_profile( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "post_profile", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="post_profile_increment", + description="POST /profile/increment - Increment a numeric property on a user profile.", + tags=('Profile',), + timeout_seconds=120, + ) + async def post_profile_increment( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "post_profile_increment", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="post_profile_decrement", + description="POST /profile/decrement - Decrement a numeric property on a user profile.", + tags=('Profile',), + timeout_seconds=120, + ) + async def post_profile_decrement( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "post_profile_decrement", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_export_events", + description="GET /export/events - Export a paginated list of raw events with optional filtering by date, profile, and event type.", + tags=('Export',), + timeout_seconds=60, + ) + async def get_export_events( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_export_events", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_export_charts", + description="GET /export/charts - Export aggregated chart/analytics data for a series of events over a time range.", + tags=('Export',), + timeout_seconds=60, + ) + async def get_export_charts( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_export_charts", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="post_import_events", + description="POST /import/events - Bulk import historical events.", + tags=('Import',), + timeout_seconds=120, + ) + async def post_import_events( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "post_import_events", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_overview", + description="GET /insights/{projectId}/overview - Get an overview of key metrics for the project (sessions, pageviews, bounce rate, duration).", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_overview( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_overview", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_active_users", + description="GET /insights/{projectId}/active_users - Get rolling active user counts over the last N days.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_active_users( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_active_users", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_retention", + description="GET /insights/{projectId}/retention - Get weekly retention series data.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_retention( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_retention", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_retention_cohort", + description="GET /insights/{projectId}/retention/cohort - Get retention cohort data.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_retention_cohort( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_retention_cohort", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_pages_top", + description="GET /insights/{projectId}/pages/top - Get the top pages by pageviews for the given date range.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_pages_top( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_pages_top", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_pages_entry_exit", + description="GET /insights/{projectId}/pages/entry_exit - Get entry or exit pages ranked by session count.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_pages_entry_exit( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_pages_entry_exit", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_pages_performance", + description="GET /insights/{projectId}/pages/performance - Get page-level performance metrics (bounce rate, avg duration, sessions).", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_pages_performance( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_pages_performance", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_metrics", + description="GET /insights/{projectId}/metrics - Get aggregated website metrics including sessions, pageviews, and bounce rate.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_metrics( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_metrics", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_live", + description="GET /insights/{projectId}/live - Get the current number of live (active) visitors.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_live( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_live", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_pages", + description="GET /insights/{projectId}/pages - Get top pages with pageview counts for the selected date range.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_pages( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_pages", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_referrer", + description="GET /insights/{projectId}/referrer - Get top values for the \"referrer\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_referrer( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_referrer", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_referrer_name", + description="GET /insights/{projectId}/referrer_name - Get top values for the \"referrer_name\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_referrer_name( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_referrer_name", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_referrer_type", + description="GET /insights/{projectId}/referrer_type - Get top values for the \"referrer_type\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_referrer_type( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_referrer_type", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_utm_source", + description="GET /insights/{projectId}/utm_source - Get top values for the \"utm_source\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_utm_source( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_utm_source", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_utm_medium", + description="GET /insights/{projectId}/utm_medium - Get top values for the \"utm_medium\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_utm_medium( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_utm_medium", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_utm_campaign", + description="GET /insights/{projectId}/utm_campaign - Get top values for the \"utm_campaign\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_utm_campaign( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_utm_campaign", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_utm_term", + description="GET /insights/{projectId}/utm_term - Get top values for the \"utm_term\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_utm_term( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_utm_term", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_utm_content", + description="GET /insights/{projectId}/utm_content - Get top values for the \"utm_content\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_utm_content( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_utm_content", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_region", + description="GET /insights/{projectId}/region - Get top values for the \"region\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_region( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_region", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_country", + description="GET /insights/{projectId}/country - Get top values for the \"country\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_country( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_country", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_city", + description="GET /insights/{projectId}/city - Get top values for the \"city\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_city( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_city", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_device", + description="GET /insights/{projectId}/device - Get top values for the \"device\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_device( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_device", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_brand", + description="GET /insights/{projectId}/brand - Get top values for the \"brand\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_brand( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_brand", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_model", + description="GET /insights/{projectId}/model - Get top values for the \"model\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_model( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_model", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_browser", + description="GET /insights/{projectId}/browser - Get top values for the \"browser\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_browser( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_browser", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_browser_version", + description="GET /insights/{projectId}/browser_version - Get top values for the \"browser_version\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_browser_version( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_browser_version", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_os", + description="GET /insights/{projectId}/os - Get top values for the \"os\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_os( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_os", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_os_version", + description="GET /insights/{projectId}/os_version - Get top values for the \"os_version\" dimension.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_os_version( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_os_version", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_funnel", + description="GET /insights/{projectId}/funnel - Get funnel conversion rates for a sequence of events.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_funnel( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_funnel", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_traffic_referrers", + description="GET /insights/{projectId}/traffic/referrers - Get traffic breakdown by referrer source.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_traffic_referrers( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_traffic_referrers", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_traffic_geo", + description="GET /insights/{projectId}/traffic/geo - Get traffic breakdown by geographic dimension (country, region, city).", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_traffic_geo( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_traffic_geo", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_traffic_devices", + description="GET /insights/{projectId}/traffic/devices - Get traffic breakdown by device type, browser, or OS.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_traffic_devices( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_traffic_devices", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_user_flow", + description="GET /insights/{projectId}/user_flow - Get user flow paths before, after, or between specified events.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_user_flow( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_user_flow", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_engagement", + description="GET /insights/{projectId}/engagement - Get engagement metrics for the project.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_engagement( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_engagement", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_events", + description="GET /insights/{projectId}/events - Query events with optional filters for date range, profile, and properties.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_events( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_events", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_events_names", + description="GET /insights/{projectId}/events/names - List all distinct event names tracked in the project.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_events_names( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_events_names", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_events_properties", + description="GET /insights/{projectId}/events/properties - List all property keys for a given event name.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_events_properties( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_events_properties", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_events_property_values", + description="GET /insights/{projectId}/events/property_values - Get the top values for a specific event property key.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_events_property_values( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_events_property_values", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_profiles", + description="GET /insights/{projectId}/profiles - Search and filter user profiles.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_profiles( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_profiles", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_profiles_profile_id", + description="GET /insights/{projectId}/profiles/{profileId} - Get a single user profile with their recent events.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_profiles_profile_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_profiles_profile_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_profiles_profile_id_sessions", + description="GET /insights/{projectId}/profiles/{profileId}/sessions - Get sessions for a specific user profile.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_profiles_profile_id_sessions( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_profiles_profile_id_sessions", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_profiles_profile_id_metrics", + description="GET /insights/{projectId}/profiles/{profileId}/metrics - Get aggregated metrics for a specific user profile.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_profiles_profile_id_metrics( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_profiles_profile_id_metrics", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_sessions", + description="GET /insights/{projectId}/sessions - Query sessions with optional filters.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_sessions( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_sessions", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_groups_types", + description="GET /insights/{projectId}/groups/types - List all group types defined in the project.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_groups_types( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_groups_types", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_groups", + description="GET /insights/{projectId}/groups - Search and filter groups.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_groups( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_groups", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_groups_group_id", + description="GET /insights/{projectId}/groups/{groupId} - Get a single group with its members.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_groups_group_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_groups_group_id", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_reports_report_id_data", + description="GET /insights/{projectId}/reports/{reportId}/data - Get the data for a saved report.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_reports_report_id_data( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_reports_report_id_data", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_gsc_overview", + description="GET /insights/{projectId}/gsc/overview - Get a Google Search Console performance overview (clicks, impressions, CTR, position).", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_gsc_overview( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_gsc_overview", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_gsc_pages", + description="GET /insights/{projectId}/gsc/pages - Get top pages from Google Search Console.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_gsc_pages( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_gsc_pages", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_gsc_pages_details", + description="GET /insights/{projectId}/gsc/pages/details - Get detailed GSC metrics for a specific page URL.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_gsc_pages_details( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_gsc_pages_details", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_gsc_queries", + description="GET /insights/{projectId}/gsc/queries - Get top search queries from Google Search Console.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_gsc_queries( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_gsc_queries", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_gsc_queries_details", + description="GET /insights/{projectId}/gsc/queries/details - Get detailed GSC metrics for a specific search query.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_gsc_queries_details( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_gsc_queries_details", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_gsc_queries_opportunities", + description="GET /insights/{projectId}/gsc/queries/opportunities - Get GSC query opportunities (high impressions, low CTR).", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_gsc_queries_opportunities( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_gsc_queries_opportunities", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_insights_project_id_gsc_cannibalization", + description="GET /insights/{projectId}/gsc/cannibalization - Detect keyword cannibalization across pages in Google Search Console.", + tags=('Insights',), + timeout_seconds=60, + ) + async def get_insights_project_id_gsc_cannibalization( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_insights_project_id_gsc_cannibalization", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="post_track", + description="POST /track/ - Ingest a tracking event (track, identify, group, increment, decrement, replay).", + tags=('Track',), + timeout_seconds=120, + ) + async def post_track( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "post_track", + parameters=parameters or {}, + body=body, + ) + + @skill( + name="get_track_device_id", + description="GET /track/device-id - Get or generate a stable device ID and session ID for the current visitor.", + tags=('Track',), + timeout_seconds=60, + ) + async def get_track_device_id( + self, + ctx: RunContext, + parameters: dict[str, Any] | None = None, + body: Any | None = None, + ) -> dict[str, Any]: + return await self._request( + ctx, + "get_track_device_id", + parameters=parameters or {}, + body=body, + ) + + def _operation_tools(self, ctx: RunContext) -> list[StructuredTool]: + tools: list[StructuredTool] = [] + for operation_id, operation in OPERATIONS.items(): + async def call( + parameters: dict[str, Any] | None = None, + body: Any | None = None, + *, + _operation_id: str = operation_id, + ) -> dict[str, Any]: + return await self._request( + ctx, + _operation_id, + parameters=parameters or {}, + body=body, + ) + + tools.append( + StructuredTool.from_function( + coroutine=call, + name=operation["skill_name"], + description=self._tool_description(operation), + args_schema=OperationInput, + ) + ) + return tools + + def _system_prompt(self) -> str: + lines = [ + "You operate an API through generated OpenAPI tools.", + "Call tools to get real results. Do not invent API responses.", + "For write, update, or delete operations, explain the intended action before calling the tool.", + "If an operation reports missing consumer setup, tell the user which setup field is required.", + "If an operation returns 404, 405, 410, or a schema/validation error that suggests the live API no longer matches these tools, tell the user this generated agent may need to be refreshed from the latest OpenAPI spec and ask whether they want to refresh it.", + "", + "Available operations:", + ] + for operation in OPERATIONS.values(): + marker = "WRITE" if operation.get("destructive") else "READ" + lines.append( + f"- {operation['skill_name']}: {marker} {operation['method']} {operation['path']} — {operation['summary']}" + ) + return "\n".join(lines) + + def _tool_description(self, operation: dict[str, Any]) -> str: + parts = [ + f"{operation['method']} {operation['path']}", + str(operation.get("description") or operation.get("summary") or ""), + ] + if operation.get("parameters"): + parts.append( + "Parameters: " + + ", ".join( + f"{p['name']} in {p['in']}{' required' if p.get('required') else ''}" + for p in operation["parameters"] + ) + ) + if operation.get("request_body") is not None: + parts.append("Accepts a JSON request body.") + return "\n".join(part for part in parts if part) + + async def _request( + self, + ctx: RunContext, + operation_id: str, + *, + parameters: dict[str, Any], + body: Any | None, + ) -> dict[str, Any]: + operation = OPERATIONS[operation_id] + default_base_url = str(operation.get("base_url") or DEFAULT_BASE_URL).rstrip("/") + base_url_field = str(operation.get("base_url_field") or "OPENAPI_BASE_URL") + base_url = str(ctx.consumer_config(base_url_field, default_base_url) or default_base_url).rstrip("/") + url, query, headers = self._request_parts(ctx, operation, parameters) + request_kwargs: dict[str, Any] = { + "params": query, + "headers": headers, + } + if body is not None: + if isinstance(body, (bytes, bytearray)): + body = body.decode("utf-8", errors="replace") + if isinstance(body, str): + stripped = body.strip() + if stripped and stripped[0] in "{[": + try: + body = json.loads(stripped) + except ValueError: + pass + request_kwargs["json"] = body + async with httpx.AsyncClient(timeout=60.0, follow_redirects=True) as client: + response = await client.request( + operation["method"], + f"{base_url}{url}", + **request_kwargs, + ) + content_type = response.headers.get("content-type", "") + try: + payload: Any = response.json() if "json" in content_type else response.text + except ValueError: + payload = response.text + if response.status_code >= 400: + out = { + "ok": False, + "status_code": response.status_code, + "operation_id": operation_id, + "error": payload, + } + if response.status_code in {404, 405, 410, 422}: + out["stale_openapi_hint"] = ( + "This generated OpenAPI agent may be stale. Ask the user " + "whether they want to refresh it from the latest OpenAPI spec." + ) + return out + return { + "ok": True, + "status_code": response.status_code, + "operation_id": operation_id, + "result": payload, + } + + def _request_parts( + self, + ctx: RunContext, + operation: dict[str, Any], + parameters: dict[str, Any], + ) -> tuple[str, dict[str, Any], dict[str, str]]: + path = operation["path"] + query: dict[str, Any] = {} + headers: dict[str, str] = {} + cookies: dict[str, Any] = {} + for param in operation.get("parameters") or []: + name = param["name"] + if name not in parameters: + if param.get("required"): + raise ValueError(f"missing required parameter {name!r}") + continue + value = parameters[name] + location = param["in"] + if location == "path": + path = path.replace("{" + name + "}", str(value)) + elif location == "query": + query[name] = value + elif location == "header": + headers[name] = str(value) + elif location == "cookie": + cookies[name] = value + unresolved = PATH_PARAMETER_RE.findall(path) + if unresolved: + missing = ", ".join(sorted(set(unresolved))) + raise ValueError("missing required path parameter(s): " + missing) + if cookies: + headers["cookie"] = "; ".join(f"{key}={value}" for key, value in cookies.items()) + auth_headers, auth_query = self._auth_for_operation(ctx, operation) + headers.update(auth_headers) + query.update(auth_query) + return path, query, headers + + def _auth_for_operation(self, ctx: RunContext, operation: dict[str, Any]) -> tuple[dict[str, str], dict[str, Any]]: + requirements = operation.get("security") + if requirements is None: + requirements = ROOT_SECURITY + if requirements == []: + return {}, {} + missing: list[str] = [] + for requirement in requirements or []: + if not isinstance(requirement, dict) or not requirement: + return {}, {} + headers: dict[str, str] = {} + query: dict[str, Any] = {} + ok = True + for scheme_name in requirement: + mapping = SECURITY_FIELDS.get(scheme_name) or {} + secret_name = mapping.get("field") + value = _consumer_secret_optional(ctx, secret_name) if secret_name else "" + if not value: + ok = False + if secret_name: + missing.append(secret_name) + continue + kind = mapping.get("kind") + if kind == "apiKey": + prefix = mapping.get("prefix") or "" + sent_value = f"{prefix}{value}" + if mapping.get("location") == "query": + query[mapping.get("name") or scheme_name] = sent_value + else: + headers[mapping.get("name") or scheme_name] = sent_value + elif kind in {"http", "oauth2"}: + scheme = mapping.get("scheme") or "Bearer" + if scheme.lower() == "basic": + token = base64.b64encode(value.encode("utf-8")).decode("ascii") + headers["authorization"] = f"Basic {token}" + else: + headers["authorization"] = f"{scheme} {value}" + else: + ok = False + if ok: + return headers, query + if missing: + raise ConsumerSetupMissing( + "operation requires consumer setup secret(s): " + + ", ".join(sorted(set(missing))) + ) + return {}, {} -def _seed_runtime_skills(backend: Any, ctx: RunContext[Any]) -> list[str]: - """Copy packaged DeepAgents skills into the invocation workspace. - - DeepAgents loads skills from its backend, while source-controlled - ``skills/`` folders live in the image. This bridge lets generated agents - ship reusable SKILL.md bundles without giving up durable A2A workspace - files. - """ - root = Path(__file__).parent / "skills" - if not root.exists(): - return [] - runtime_skills_root = _runtime_skills_root(ctx) - uploads: list[tuple[str, bytes]] = [] - for path in root.rglob("*"): - if path.is_file(): - rel = path.relative_to(root).as_posix() - uploads.append((runtime_skills_root + rel, path.read_bytes())) - if uploads: - backend.upload_files(uploads) - return [runtime_skills_root] - return [] +def _consumer_secret_optional(ctx: RunContext, name: str | None) -> str: + if not name: + return "" + try: + return ctx.consumer_secret(name) + except ConsumerSetupMissing: + return "" -def _last_message_text(state: dict[str, Any]) -> str: - messages = state.get("messages") or [] - if not messages: - return json.dumps(state, default=str) +def _message_text(message: Any) -> Any: + content = getattr(message, "content", message) + return content - content = getattr(messages[-1], "content", None) - if isinstance(content, str): - return content - if isinstance(content, list): - parts: list[str] = [] - for item in content: - if isinstance(item, dict): - text = item.get("text") or item.get("content") - if text: - parts.append(str(text)) - elif item: - parts.append(str(item)) - return "\n".join(parts) if parts else json.dumps(content, default=str) - return str(content or messages[-1]) + +def _message_to_dict(message: Any) -> dict[str, Any]: + if isinstance(message, BaseMessage): + return message.model_dump(mode="json") + if hasattr(message, "model_dump"): + return message.model_dump(mode="json") + if isinstance(message, dict): + return message + return {"content": str(message)} + + +agent = Openpannel() diff --git a/openapi.json b/openapi.json new file mode 100644 index 0000000..03936c9 --- /dev/null +++ b/openapi.json @@ -0,0 +1,7683 @@ +{ + "info": { + "description": "Composite OpenAPI source bundle generated for an A2APack agent.", + "title": "OpenPanel Admin API Composite", + "version": "1.0.0" + }, + "openapi": "3.1.0", + "paths": {}, + "servers": [ + { + "url": "https://analytics.a2acloud.io/api" + } + ], + "x-a2a-composite-openapi": true, + "x-a2a-sources": [ + { + "index": 1, + "openapi": { + "components": { + "schemas": {} + }, + "info": { + "title": "OpenPanel Admin API", + "version": "1.0.0" + }, + "openapi": "3.1.0", + "paths": { + "/manage/clients": { + "get": { + "description": "List all API clients for the organization, optionally filtered by project.", + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + }, + "post": { + "description": "Create a new API client (read, write, or root type) and return its generated secret.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "minLength": 1, + "type": "string" + }, + "projectId": { + "type": "string" + }, + "type": { + "default": "write", + "enum": [ + "read", + "write", + "root" + ], + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + } + }, + "/manage/clients/{id}": { + "delete": { + "description": "Delete an API client.", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + }, + "get": { + "description": "Get a single API client by ID.", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + }, + "patch": { + "description": "Update an API client name.", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + } + }, + "/manage/projects": { + "get": { + "description": "List all projects for the organization.", + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + }, + "post": { + "description": "Create a new project and its first write client.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "cors": { + "default": [], + "items": { + "type": "string" + }, + "type": "array" + }, + "crossDomain": { + "default": false, + "type": "boolean" + }, + "domain": { + "anyOf": [ + { + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "const": "", + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "minLength": 1, + "type": "string" + }, + "types": { + "default": [], + "items": { + "enum": [ + "website", + "app", + "backend" + ], + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + } + }, + "/manage/projects/{id}": { + "delete": { + "description": "Soft-delete a project (scheduled for removal in 24 hours).", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + }, + "get": { + "description": "Get a single project by ID.", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + }, + "patch": { + "description": "Update project settings (name, domain, CORS, tracking options).", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "allowUnsafeRevenueTracking": { + "type": "boolean" + }, + "cors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "crossDomain": { + "type": "boolean" + }, + "domain": { + "anyOf": [ + { + "anyOf": [ + { + "format": "uri", + "type": "string" + }, + { + "const": "", + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + } + }, + "/manage/projects/{projectId}/dashboards": { + "get": { + "description": "List all dashboards for a project.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + } + }, + "/manage/projects/{projectId}/dashboards/{dashboardId}/reports": { + "get": { + "description": "List all reports in a dashboard.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "dashboardId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + } + }, + "/manage/references": { + "get": { + "description": "List annotation references for a project.", + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "datetime": { + "type": "string" + }, + "description": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "title": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "projectId", + "title", + "datetime" + ], + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + } + }, + "/manage/references/{id}": { + "delete": { + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + }, + "get": { + "description": "Get a single annotation reference by ID.", + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + }, + "patch": { + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "datetime": { + "type": "string" + }, + "description": { + "type": "string" + }, + "title": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Manage" + ] + } + } + }, + "servers": [ + { + "url": "https://analytics.a2acloud.io/api" + } + ], + "tags": [ + { + "description": "Track events and sessions", + "name": "Track" + }, + { + "description": "Identify and update user profiles", + "name": "Profile" + }, + { + "description": "Export data", + "name": "Export" + }, + { + "description": "Import historical data", + "name": "Import" + }, + { + "description": "Query analytics data", + "name": "Insights" + }, + { + "description": "Manage projects and clients", + "name": "Manage" + }, + { + "description": "Legacy event ingestion (deprecated, use /track)", + "name": "Event" + } + ] + }, + "server_url": "https://analytics.a2acloud.io/api", + "title": "OpenPanel Admin API", + "url": "https://analytics.a2acloud.io/api/documentation/admin.json" + }, + { + "index": 2, + "openapi": { + "components": { + "schemas": {} + }, + "info": { + "title": "OpenPanel Project API", + "version": "1.0.0" + }, + "openapi": "3.1.0", + "paths": { + "/event/": { + "post": { + "description": "Deprecated direct event ingestion endpoint. Use /track instead.", + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Event" + ] + } + }, + "/export/charts": { + "get": { + "description": "Export aggregated chart/analytics data for a series of events over a time range.", + "parameters": [ + { + "description": "Array of dimensions to break down the data by", + "in": "query", + "name": "breakdowns", + "schema": { + "default": [], + "description": "Array of dimensions to break down the data by", + "items": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "description": "The time interval for data aggregation (e.g., day, week, month)", + "in": "query", + "name": "interval", + "schema": { + "default": "day", + "description": "The time interval for data aggregation (e.g., day, week, month)", + "enum": [ + "minute", + "day", + "hour", + "week", + "month" + ], + "type": "string" + } + }, + { + "description": "The time range for which data should be displayed", + "in": "query", + "name": "range", + "schema": { + "default": "30d", + "description": "The time range for which data should be displayed", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "description": "Whether to show data from the previous period for comparison", + "in": "query", + "name": "previous", + "schema": { + "default": false, + "description": "Whether to show data from the previous period for comparison", + "type": "boolean" + } + }, + { + "description": "Custom start date for the data range (overrides range if provided)", + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Custom start date for the data range (overrides range if provided)" + } + }, + { + "description": "Custom end date for the data range (overrides range if provided)", + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Custom end date for the data range (overrides range if provided)" + } + }, + { + "in": "query", + "name": "project_id", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "projectId", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "series", + "schema": { + "items": { + "properties": { + "filters": { + "default": [], + "description": "Filters applied specifically to this event", + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "property": { + "description": "Optional property of the event used for specific segment calculations (e.g., value for property_sum/average)", + "type": "string" + }, + "segment": { + "default": "event", + "description": "Defines how the event data should be segmented or aggregated", + "enum": [ + "event", + "user", + "session", + "group", + "user_average", + "one_event_per_user", + "property_sum", + "property_average", + "property_max", + "property_min" + ], + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "events", + "schema": { + "items": { + "properties": { + "filters": { + "default": [], + "description": "Filters applied specifically to this event", + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "property": { + "description": "Optional property of the event used for specific segment calculations (e.g., value for property_sum/average)", + "type": "string" + }, + "segment": { + "default": "event", + "description": "Defines how the event data should be segmented or aggregated", + "enum": [ + "event", + "user", + "session", + "group", + "user_average", + "one_event_per_user", + "property_sum", + "property_average", + "property_max", + "property_min" + ], + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Export" + ] + } + }, + "/export/events": { + "get": { + "description": "Export a paginated list of raw events with optional filtering by date, profile, and event type.", + "parameters": [ + { + "in": "query", + "name": "project_id", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "projectId", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "profileId", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "event", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + { + "in": "query", + "name": "start", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "end", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "default": 1, + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 50, + "type": "number" + } + }, + { + "in": "query", + "name": "filters", + "schema": { + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "includes", + "schema": { + "items": { + "type": "string" + }, + "type": "array" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Export" + ] + } + }, + "/import/events": { + "post": { + "description": "Bulk import historical events.", + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Import" + ] + } + }, + "/insights/{projectId}/active_users": { + "get": { + "description": "Get rolling active user counts over the last N days.", + "parameters": [ + { + "in": "query", + "name": "days", + "schema": { + "default": 7, + "maximum": 90, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/brand": { + "get": { + "description": "Get top values for the \"brand\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/browser": { + "get": { + "description": "Get top values for the \"browser\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/browser_version": { + "get": { + "description": "Get top values for the \"browser_version\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/city": { + "get": { + "description": "Get top values for the \"city\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/country": { + "get": { + "description": "Get top values for the \"country\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/device": { + "get": { + "description": "Get top values for the \"device\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/engagement": { + "get": { + "description": "Get engagement metrics for the project.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/events": { + "get": { + "description": "Query events with optional filters for date range, profile, and properties.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "eventNames", + "schema": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + } + ] + } + }, + { + "in": "query", + "name": "path", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "country", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "city", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "device", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "browser", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "os", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "referrer", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "referrerName", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "referrerType", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "profileId", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "properties", + "schema": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + { + "in": "query", + "name": "filters", + "schema": { + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 20, + "maximum": 100, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/events/names": { + "get": { + "description": "List all distinct event names tracked in the project.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/events/properties": { + "get": { + "description": "List all property keys for a given event name.", + "parameters": [ + { + "in": "query", + "name": "eventName", + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/events/property_values": { + "get": { + "description": "Get the top values for a specific event property key.", + "parameters": [ + { + "in": "query", + "name": "eventName", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "propertyKey", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/funnel": { + "get": { + "description": "Get funnel conversion rates for a sequence of events.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "steps", + "required": true, + "schema": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + } + ] + } + }, + { + "in": "query", + "name": "windowHours", + "schema": { + "default": 24, + "maximum": 720, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "query", + "name": "groupBy", + "schema": { + "default": "session_id", + "enum": [ + "session_id", + "profile_id" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/groups": { + "get": { + "description": "Search and filter groups.", + "parameters": [ + { + "in": "query", + "name": "type", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "search", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 20, + "maximum": 100, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/groups/types": { + "get": { + "description": "List all group types defined in the project.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/groups/{groupId}": { + "get": { + "description": "Get a single group with its members.", + "parameters": [ + { + "in": "query", + "name": "memberLimit", + "schema": { + "default": 10, + "maximum": 50, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "groupId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/gsc/cannibalization": { + "get": { + "description": "Detect keyword cannibalization across pages in Google Search Console.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/gsc/overview": { + "get": { + "description": "Get a Google Search Console performance overview (clicks, impressions, CTR, position).", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "interval", + "schema": { + "default": "day", + "enum": [ + "day", + "week", + "month" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/gsc/pages": { + "get": { + "description": "Get top pages from Google Search Console.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 100, + "maximum": 1000, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/gsc/pages/details": { + "get": { + "description": "Get detailed GSC metrics for a specific page URL.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "required": true, + "schema": { + "format": "uri", + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/gsc/queries": { + "get": { + "description": "Get top search queries from Google Search Console.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 100, + "maximum": 1000, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/gsc/queries/details": { + "get": { + "description": "Get detailed GSC metrics for a specific search query.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/gsc/queries/opportunities": { + "get": { + "description": "Get GSC query opportunities (high impressions, low CTR).", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "minImpressions", + "schema": { + "default": 50, + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/live": { + "get": { + "description": "Get the current number of live (active) visitors.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/metrics": { + "get": { + "description": "Get aggregated website metrics including sessions, pageviews, and bounce rate.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/model": { + "get": { + "description": "Get top values for the \"model\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/os": { + "get": { + "description": "Get top values for the \"os\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/os_version": { + "get": { + "description": "Get top values for the \"os_version\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/overview": { + "get": { + "description": "Get an overview of key metrics for the project (sessions, pageviews, bounce rate, duration).", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "interval", + "schema": { + "enum": [ + "hour", + "day", + "week", + "month" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/pages": { + "get": { + "description": "Get top pages with pageview counts for the selected date range.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/pages/entry_exit": { + "get": { + "description": "Get entry or exit pages ranked by session count.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "mode", + "schema": { + "default": "entry", + "enum": [ + "entry", + "exit" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/pages/performance": { + "get": { + "description": "Get page-level performance metrics (bounce rate, avg duration, sessions).", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "search", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "sortBy", + "schema": { + "enum": [ + "sessions", + "pageviews", + "bounce_rate", + "avg_duration" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "sortOrder", + "schema": { + "enum": [ + "asc", + "desc" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 50, + "maximum": 500, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/pages/top": { + "get": { + "description": "Get the top pages by pageviews for the given date range.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/profiles": { + "get": { + "description": "Search and filter user profiles.", + "parameters": [ + { + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "email", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "country", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "city", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "device", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "browser", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "inactiveDays", + "schema": { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "query", + "name": "minSessions", + "schema": { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "query", + "name": "performedEvent", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filters", + "schema": { + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "sortOrder", + "schema": { + "default": "desc", + "enum": [ + "asc", + "desc" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 20, + "maximum": 100, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/profiles/{profileId}": { + "get": { + "description": "Get a single user profile with their recent events.", + "parameters": [ + { + "in": "query", + "name": "eventLimit", + "schema": { + "default": 20, + "maximum": 100, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "profileId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/profiles/{profileId}/metrics": { + "get": { + "description": "Get aggregated metrics for a specific user profile.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "profileId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/profiles/{profileId}/sessions": { + "get": { + "description": "Get sessions for a specific user profile.", + "parameters": [ + { + "in": "query", + "name": "limit", + "schema": { + "default": 20, + "maximum": 100, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "profileId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/referrer": { + "get": { + "description": "Get top values for the \"referrer\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/referrer_name": { + "get": { + "description": "Get top values for the \"referrer_name\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/referrer_type": { + "get": { + "description": "Get top values for the \"referrer_type\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/region": { + "get": { + "description": "Get top values for the \"region\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/reports/{reportId}/data": { + "get": { + "description": "Get the data for a saved report.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "reportId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/retention": { + "get": { + "description": "Get weekly retention series data.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/retention/cohort": { + "get": { + "description": "Get retention cohort data.", + "parameters": [ + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/sessions": { + "get": { + "description": "Query sessions with optional filters.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "country", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "city", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "device", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "browser", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "os", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "referrer", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "referrerName", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "referrerType", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "profileId", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "filters", + "schema": { + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 20, + "maximum": 100, + "minimum": 1, + "type": "integer" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/traffic/devices": { + "get": { + "description": "Get traffic breakdown by device type, browser, or OS.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "breakdown", + "schema": { + "default": "device", + "enum": [ + "device", + "browser", + "os" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/traffic/geo": { + "get": { + "description": "Get traffic breakdown by geographic dimension (country, region, city).", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "breakdown", + "schema": { + "default": "country", + "enum": [ + "country", + "region", + "city" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/traffic/referrers": { + "get": { + "description": "Get traffic breakdown by referrer source.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "breakdown", + "schema": { + "default": "referrer_name", + "enum": [ + "referrer_name", + "referrer_type", + "referrer", + "utm_source", + "utm_medium", + "utm_campaign" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/user_flow": { + "get": { + "description": "Get user flow paths before, after, or between specified events.", + "parameters": [ + { + "in": "query", + "name": "startDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "range", + "schema": { + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "startEvent", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "endEvent", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "mode", + "schema": { + "default": "after", + "enum": [ + "after", + "before", + "between" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "steps", + "schema": { + "default": 5, + "maximum": 10, + "minimum": 2, + "type": "integer" + } + }, + { + "in": "query", + "name": "exclude", + "schema": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + } + ] + } + }, + { + "in": "query", + "name": "include", + "schema": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + } + ] + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/utm_campaign": { + "get": { + "description": "Get top values for the \"utm_campaign\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/utm_content": { + "get": { + "description": "Get top values for the \"utm_content\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/utm_medium": { + "get": { + "description": "Get top values for the \"utm_medium\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/utm_source": { + "get": { + "description": "Get top values for the \"utm_source\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/insights/{projectId}/utm_term": { + "get": { + "description": "Get top values for the \"utm_term\" dimension.", + "parameters": [ + { + "in": "query", + "name": "filters", + "schema": { + "default": [], + "items": { + "properties": { + "cohortId": { + "description": "DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).", + "type": "string" + }, + "cohortIds": { + "description": "Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Unique identifier for the filter", + "type": "string" + }, + "name": { + "description": "The property name to filter on", + "type": "string" + }, + "operator": { + "description": "The operator to use for the filter", + "enum": [ + "is", + "isNot", + "contains", + "doesNotContain", + "startsWith", + "endsWith", + "regex", + "isNull", + "isNotNull", + "gt", + "lt", + "gte", + "lte", + "inCohort", + "notInCohort" + ], + "type": "string" + }, + "value": { + "description": "The values to filter on", + "items": { + "anyOf": [ + { + "anyOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + { + "in": "query", + "name": "startDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "endDate", + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + { + "in": "query", + "name": "range", + "schema": { + "default": "7d", + "enum": [ + "30min", + "lastHour", + "last24h", + "today", + "yesterday", + "7d", + "30d", + "3m", + "6m", + "12m", + "monthToDate", + "lastMonth", + "yearToDate", + "lastYear", + "custom" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "cursor", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "limit", + "schema": { + "default": 10, + "type": "number" + } + }, + { + "in": "path", + "name": "projectId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Insights" + ] + } + }, + "/profile/": { + "post": { + "description": "Identify or update a user profile.", + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Profile" + ] + } + }, + "/profile/decrement": { + "post": { + "description": "Decrement a numeric property on a user profile.", + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Profile" + ] + } + }, + "/profile/increment": { + "post": { + "description": "Increment a numeric property on a user profile.", + "responses": { + "200": { + "description": "Default Response" + } + }, + "tags": [ + "Profile" + ] + } + }, + "/track/": { + "post": { + "description": "Ingest a tracking event (track, identify, group, increment, decrement, replay).", + "requestBody": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "oneOf": [ + { + "properties": { + "payload": { + "properties": { + "groups": { + "anyOf": [ + { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "name": { + "minLength": 1, + "type": "string" + }, + "profileId": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "number" + } + ] + }, + "properties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": { + "enum": [ + "track" + ], + "type": "string" + } + }, + "required": [ + "type", + "payload" + ], + "title": "Track", + "type": "object" + }, + { + "properties": { + "payload": { + "properties": { + "avatar": { + "format": "uri", + "type": "string" + }, + "email": { + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "profileId": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "number" + } + ] + }, + "properties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "profileId" + ], + "type": "object" + }, + "type": { + "enum": [ + "identify" + ], + "type": "string" + } + }, + "required": [ + "type", + "payload" + ], + "title": "Identify", + "type": "object" + }, + { + "properties": { + "payload": { + "properties": { + "profileId": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "number" + } + ] + }, + "property": { + "minLength": 1, + "type": "string" + }, + "value": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "profileId", + "property" + ], + "type": "object" + }, + "type": { + "enum": [ + "increment" + ], + "type": "string" + } + }, + "required": [ + "type", + "payload" + ], + "title": "Increment", + "type": "object" + }, + { + "properties": { + "payload": { + "properties": { + "profileId": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "number" + } + ] + }, + "property": { + "minLength": 1, + "type": "string" + }, + "value": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "profileId", + "property" + ], + "type": "object" + }, + "type": { + "enum": [ + "decrement" + ], + "type": "string" + } + }, + "required": [ + "type", + "payload" + ], + "title": "Decrement", + "type": "object" + }, + { + "properties": { + "payload": { + "properties": { + "alias": { + "minLength": 1, + "type": "string" + }, + "profileId": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "profileId", + "alias" + ], + "type": "object" + }, + "type": { + "enum": [ + "alias" + ], + "type": "string" + } + }, + "required": [ + "type", + "payload" + ], + "title": "Alias", + "type": "object" + }, + { + "properties": { + "payload": { + "properties": { + "chunk_index": { + "maximum": 65535, + "minimum": 0, + "type": "integer" + }, + "ended_at": { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + }, + "events_count": { + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" + }, + "is_full_snapshot": { + "type": "boolean" + }, + "payload": { + "maxLength": 2097152, + "type": "string" + }, + "started_at": { + "format": "date-time", + "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$", + "type": "string" + } + }, + "required": [ + "chunk_index", + "events_count", + "is_full_snapshot", + "started_at", + "ended_at", + "payload" + ], + "type": "object" + }, + "type": { + "enum": [ + "replay" + ], + "type": "string" + } + }, + "required": [ + "type", + "payload" + ], + "title": "Replay", + "type": "object" + }, + { + "properties": { + "payload": { + "properties": { + "id": { + "minLength": 1, + "type": "string" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "properties": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "type", + "name" + ], + "type": "object" + }, + "type": { + "enum": [ + "group" + ], + "type": "string" + } + }, + "required": [ + "type", + "payload" + ], + "title": "Group", + "type": "object" + }, + { + "properties": { + "payload": { + "properties": { + "groupIds": { + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" + }, + "profileId": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "groupIds" + ], + "type": "object" + }, + "type": { + "enum": [ + "assign_group" + ], + "type": "string" + } + }, + "required": [ + "type", + "payload" + ], + "title": "Assign Group", + "type": "object" + } + ], + "type": "object" + }, + { + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + } + }, + "type": "object" + } + ] + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "deviceId": { + "type": "string" + }, + "sessionId": { + "type": "string" + } + }, + "required": [ + "deviceId", + "sessionId" + ], + "type": "object" + } + } + }, + "description": "Default Response" + } + }, + "tags": [ + "Track" + ] + } + }, + "/track/device-id": { + "get": { + "description": "Get or generate a stable device ID and session ID for the current visitor.", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "deviceId": { + "type": "string" + }, + "message": { + "type": "string" + }, + "sessionId": { + "type": "string" + } + }, + "required": [ + "deviceId", + "sessionId" + ], + "type": "object" + } + } + }, + "description": "Default Response" + } + }, + "tags": [ + "Track" + ] + } + } + }, + "servers": [ + { + "url": "https://analytics.a2acloud.io/api" + } + ], + "tags": [ + { + "description": "Track events and sessions", + "name": "Track" + }, + { + "description": "Identify and update user profiles", + "name": "Profile" + }, + { + "description": "Export data", + "name": "Export" + }, + { + "description": "Import historical data", + "name": "Import" + }, + { + "description": "Query analytics data", + "name": "Insights" + }, + { + "description": "Manage projects and clients", + "name": "Manage" + }, + { + "description": "Legacy event ingestion (deprecated, use /track)", + "name": "Event" + } + ] + }, + "server_url": "https://analytics.a2acloud.io/api", + "title": "OpenPanel Project API", + "url": "https://analytics.a2acloud.io/api/documentation/project.json" + } + ] +} diff --git a/requirements.txt b/requirements.txt index b9227d0..086fbda 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ -# a2a-pack is auto-installed by the deploy build. -# These starter deps power the DeepAgents tool-calling example in agent.py. +# a2a-pack is installed by the platform base image. deepagents>=0.5.0 langchain>=0.3 langchain-openai>=0.2 +langchain-core>=0.3 langgraph>=0.6 +httpx>=0.27