diff --git a/analytics.openapi.json b/analytics.openapi.json
index e7b80c1b6..e15eea167 100644
--- a/analytics.openapi.json
+++ b/analytics.openapi.json
@@ -355,6 +355,176 @@
"nextCursor",
"hasMore"
]
+ },
+ "TrafficTotals": {
+ "type": "object",
+ "description": "Site-wide traffic totals for the date range.",
+ "properties": {
+ "human": {
+ "type": "number",
+ "description": "Site-wide total from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Site-wide total from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Site-wide total across all traffic."
+ }
+ },
+ "required": [
+ "human",
+ "ai",
+ "total"
+ ]
+ },
+ "ViewsByPageResponse": {
+ "type": "object",
+ "properties": {
+ "totals": {
+ "$ref": "#/components/schemas/TrafficTotals",
+ "description": "Site-wide view totals for the date range."
+ },
+ "views": {
+ "type": "array",
+ "description": "Per-path view counts.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "human": {
+ "type": "number",
+ "description": "Views from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Views from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Views from all traffic."
+ }
+ },
+ "required": [
+ "path",
+ "human",
+ "ai",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "totals",
+ "views",
+ "hasMore"
+ ]
+ },
+ "VisitorsByPageResponse": {
+ "type": "object",
+ "properties": {
+ "totals": {
+ "$ref": "#/components/schemas/TrafficTotals",
+ "description": "Site-wide unique visitor totals for the date range."
+ },
+ "visitors": {
+ "type": "array",
+ "description": "Per-path unique visitor counts.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "human": {
+ "type": "number",
+ "description": "Unique visitors from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Unique visitors from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Approx. distinct visitors with any qualifying view on this path (deduplicated across human and AI)."
+ }
+ },
+ "required": [
+ "path",
+ "human",
+ "ai",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "totals",
+ "visitors",
+ "hasMore"
+ ]
+ },
+ "FeedbackGroupedByPageResponse": {
+ "type": "object",
+ "properties": {
+ "feedback": {
+ "type": "array",
+ "description": "Per-page feedback aggregates.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "thumbsUp": {
+ "type": "number",
+ "description": "Number of thumbs up ratings on this page."
+ },
+ "thumbsDown": {
+ "type": "number",
+ "description": "Number of thumbs down ratings on this page."
+ },
+ "code": {
+ "type": "number",
+ "description": "Number of code snippet feedback entries on this page."
+ },
+ "total": {
+ "type": "number",
+ "description": "Total feedback count on this page."
+ }
+ },
+ "required": [
+ "path",
+ "thumbsUp",
+ "thumbsDown",
+ "code",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "feedback",
+ "hasMore"
+ ]
}
},
"parameters": {
@@ -483,6 +653,111 @@
}
}
},
+ "/v1/analytics/{projectId}/feedback/by-page": {
+ "get": {
+ "summary": "Get feedback grouped by page",
+ "description": "Returns feedback counts (thumbs up/down, code snippets, total) aggregated by page path",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100,
+ "default": 10,
+ "description": "Max results per page (default 10)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "enum": [
+ "code_snippet",
+ "contextual"
+ ],
+ "description": "Filter by feedback source"
+ },
+ "required": false,
+ "name": "source",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Comma-separated list of statuses to filter by"
+ },
+ "required": false,
+ "name": "status",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Per-page feedback aggregates",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackGroupedByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/v1/analytics/{projectId}/assistant": {
"get": {
"summary": "Get assistant conversations",
@@ -575,6 +850,194 @@
}
}
}
+ },
+ "/v1/analytics/{projectId}/views": {
+ "get": {
+ "summary": "Get page views by path",
+ "description": "Returns per-path and site-wide content view event counts.",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-31"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 250,
+ "default": 50,
+ "description": "Max results per page (1–250, default 50)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 0,
+ "default": 0,
+ "description": "Number of rows to skip"
+ },
+ "required": false,
+ "name": "offset",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Site-wide totals and per-path view counts",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ViewsByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/visitors": {
+ "get": {
+ "summary": "Get unique visitors by page",
+ "description": "Returns per-path and site-wide approximate distinct visitors by traffic type. `total` is deduplicated across human and AI (union of distinct visitor ids with any qualifying content view).",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-31"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 250,
+ "default": 50,
+ "description": "Max results per page (1–250, default 50)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 0,
+ "default": 0,
+ "description": "Number of rows to skip"
+ },
+ "required": false,
+ "name": "offset",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Site-wide totals and per-path visitor counts",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/VisitorsByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
}
},
"webhooks": {}
diff --git a/api/analytics/feedback-by-page.mdx b/api/analytics/feedback-by-page.mdx
new file mode 100644
index 000000000..5fb4facff
--- /dev/null
+++ b/api/analytics/feedback-by-page.mdx
@@ -0,0 +1,23 @@
+---
+title: "Get feedback by page"
+description: "Retrieve feedback counts aggregated by page path, including thumbs up/down and code snippet counts."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/feedback/by-page
+keywords: ["analytics", "feedback", "by page", "export", "aggregated"]
+---
+
+## Usage
+
+Use this endpoint to export per-page feedback aggregates from your documentation. Each row includes counts for thumbs up, thumbs down, code snippet feedback, and a combined total.
+
+## Response fields
+
+Every item in the response includes:
+- **path**: The documentation page path
+- **thumbsUp**: Number of positive (thumbs up) ratings
+- **thumbsDown**: Number of negative (thumbs down) ratings
+- **code**: Number of code snippet feedback entries
+- **total**: Combined feedback count across all types
+
+## Filtering
+
+Filter results by date range using `dateFrom` and `dateTo`, by feedback source using `source`, and by status using `status`.
diff --git a/api/analytics/views.mdx b/api/analytics/views.mdx
new file mode 100644
index 000000000..94727c967
--- /dev/null
+++ b/api/analytics/views.mdx
@@ -0,0 +1,25 @@
+---
+title: "Get page views"
+description: "Retrieve per-path and site-wide content view event counts."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/views
+keywords: ["analytics", "views", "page views", "export", "traffic"]
+---
+
+## Usage
+
+Use this endpoint to export per-page view counts from your documentation. Each row includes a breakdown of human and AI bot views, plus a combined total.
+
+Paginate through results using offset-based pagination. Increment `offset` by `limit` while `hasMore` is `true`.
+
+## Traffic breakdown
+
+Every response includes:
+- **human**: Views from regular browser traffic
+- **ai**: Views from AI bot crawlers (e.g. GPTBot, ClaudeBot)
+- **total**: Combined view count across all traffic
+
+The `totals` object contains the same breakdown aggregated across your entire site for the selected date range.
+
+## Filtering
+
+Filter views by date range using `dateFrom` and `dateTo` parameters.
diff --git a/api/analytics/visitors.mdx b/api/analytics/visitors.mdx
new file mode 100644
index 000000000..fe7107a71
--- /dev/null
+++ b/api/analytics/visitors.mdx
@@ -0,0 +1,25 @@
+---
+title: "Get unique visitors"
+description: "Retrieve per-path and site-wide approximate distinct visitors by traffic type."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/visitors
+keywords: ["analytics", "visitors", "unique visitors", "export", "traffic"]
+---
+
+## Usage
+
+Use this endpoint to export per-page unique visitor counts from your documentation. Visitors are deduplicated by user ID or anonymous ID.
+
+Paginate through results using offset-based pagination. Increment `offset` by `limit` while `hasMore` is `true`.
+
+## Traffic breakdown
+
+Every response includes:
+- **human**: Unique visitors from regular browser traffic
+- **ai**: Unique visitors from AI bot crawlers (e.g. GPTBot, ClaudeBot)
+- **total**: Combined unique visitor count across all traffic
+
+The `totals` object contains the same breakdown aggregated across your entire site for the selected date range.
+
+## Filtering
+
+Filter visitors by date range using `dateFrom` and `dateTo` parameters.
diff --git a/api/introduction.mdx b/api/introduction.mdx
index d5b28d6d2..a6674071c 100644
--- a/api/introduction.mdx
+++ b/api/introduction.mdx
@@ -16,7 +16,10 @@ The Mintlify REST (Representational State Transfer) API enables you to programma
- [Create assistant message](/api/assistant/create-assistant-message-v2): Embed the assistant, trained on your docs, into any application of your choosing.
- [Search documentation](/api/assistant/search): Search through your documentation.
- [Get user feedback](/api/analytics/feedback): Export user feedback from your documentation.
+- [Get feedback by page](/api/analytics/feedback-by-page): Export feedback counts aggregated by page path.
- [Get assistant conversations](/api/analytics/assistant-conversations): Export AI assistant conversation history.
+- [Get page views](/api/analytics/views): Export per-path and site-wide content view event counts.
+- [Get unique visitors](/api/analytics/visitors): Export per-path and site-wide approximate distinct visitors by traffic type.
### Common use cases
@@ -24,7 +27,7 @@ The Mintlify REST (Representational State Transfer) API enables you to programma
- **CI/CD integration**: Update documentation as part of your deployment pipeline when code changes with [Trigger update](/api/update/trigger).
- **Custom integrations**: Embed the AI assistant into your product, support portal, or internal tools with [Create assistant message](/api/assistant/create-assistant-message-v2) and [Search documentation](/api/assistant/search).
- **Automated editing**: Use agent jobs to programmatically update documentation at scale with [Create agent job](/api/agent/v2/create-agent-job), [Get agent job](/api/agent/v2/get-agent-job), and [Send follow-up message](/api/agent/v2/send-message).
-- **Analytics export**: Export feedback and assistant conversations for external analysis with [Get user feedback](/api/analytics/feedback) and [Get assistant conversations](/api/analytics/assistant-conversations).
+- **Analytics export**: Export feedback, assistant conversations, page views, and visitor data for external analysis with [Get user feedback](/api/analytics/feedback), [Get feedback by page](/api/analytics/feedback-by-page), [Get assistant conversations](/api/analytics/assistant-conversations), [Get page views](/api/analytics/views), and [Get unique visitors](/api/analytics/visitors).
## Authentication
@@ -34,7 +37,7 @@ You can create up to 10 API keys per hour per organization.
### Admin API key
-Use the admin API key to authenticate requests to [Trigger update](/api/update/trigger), [Get update status](/api/update/status), [Create agent job](/api/agent/v2/create-agent-job), [Get agent job](/api/agent/v2/get-agent-job), [Send follow-up message](/api/agent/v2/send-message), [Get user feedback](/api/analytics/feedback), and [Get assistant conversations](/api/analytics/assistant-conversations).
+Use the admin API key to authenticate requests to [Trigger update](/api/update/trigger), [Get update status](/api/update/status), [Create agent job](/api/agent/v2/create-agent-job), [Get agent job](/api/agent/v2/get-agent-job), [Send follow-up message](/api/agent/v2/send-message), [Get user feedback](/api/analytics/feedback), [Get feedback by page](/api/analytics/feedback-by-page), [Get assistant conversations](/api/analytics/assistant-conversations), [Get page views](/api/analytics/views), and [Get unique visitors](/api/analytics/visitors).
Admin API keys begin with the `mint_` prefix.
diff --git a/docs.json b/docs.json
index 53867420a..0a10a8e31 100644
--- a/docs.json
+++ b/docs.json
@@ -371,7 +371,10 @@
"icon": "chart-line",
"pages": [
"api/analytics/feedback",
- "api/analytics/assistant-conversations"
+ "api/analytics/feedback-by-page",
+ "api/analytics/assistant-conversations",
+ "api/analytics/views",
+ "api/analytics/visitors"
]
}
]
@@ -741,7 +744,10 @@
"icon": "chart-line",
"pages": [
"fr/api/analytics/feedback",
- "fr/api/analytics/assistant-conversations"
+ "fr/api/analytics/feedback-by-page",
+ "fr/api/analytics/assistant-conversations",
+ "fr/api/analytics/views",
+ "fr/api/analytics/visitors"
]
}
]
@@ -1111,7 +1117,10 @@
"icon": "chart-line",
"pages": [
"es/api/analytics/feedback",
- "es/api/analytics/assistant-conversations"
+ "es/api/analytics/feedback-by-page",
+ "es/api/analytics/assistant-conversations",
+ "es/api/analytics/views",
+ "es/api/analytics/visitors"
]
}
]
@@ -1481,7 +1490,10 @@
"icon": "chart-line",
"pages": [
"zh/api/analytics/feedback",
- "zh/api/analytics/assistant-conversations"
+ "zh/api/analytics/feedback-by-page",
+ "zh/api/analytics/assistant-conversations",
+ "zh/api/analytics/views",
+ "zh/api/analytics/visitors"
]
}
]
diff --git a/es/analytics.openapi.json b/es/analytics.openapi.json
index 636f47515..e15eea167 100644
--- a/es/analytics.openapi.json
+++ b/es/analytics.openapi.json
@@ -3,12 +3,12 @@
"info": {
"title": "Mintlify Analytics Export API",
"version": "1.0.0",
- "description": "API para exportar datos de Analytics de la documentación"
+ "description": "API for exporting documentation analytics data"
},
"servers": [
{
"url": "https://api.mintlify.com",
- "description": "Producción"
+ "description": "Production"
}
],
"components": {
@@ -16,20 +16,20 @@
"bearerAuth": {
"type": "http",
"scheme": "bearer",
- "description": "El encabezado Authorization requiere un token Bearer. Usa una clave de API de administrador (con el prefijo `mint_`). Esta es una clave secreta del lado del servidor. Genérala en la [página de claves de API](https://dashboard.mintlify.com/settings/organization/api-keys) de tu dashboard."
+ "description": "The Authorization header expects a Bearer token. Use an admin API key (prefixed with `mint_`). This is a server-side secret key. Generate one on the [API keys page](https://dashboard.mintlify.com/settings/organization/api-keys) in your dashboard."
}
},
"schemas": {
"projectId": {
"type": "string",
- "description": "Tu ID de proyecto. Puedes copiarlo desde la página [API keys](https://dashboard.mintlify.com/settings/organization/api-keys) en tu dashboard."
+ "description": "Your project ID. Can be copied from the [API keys](https://dashboard.mintlify.com/settings/organization/api-keys) page in your dashboard."
},
"FeedbackResponse": {
"type": "object",
"properties": {
"feedback": {
"type": "array",
- "description": "Lista de entradas de comentarios.",
+ "description": "List of feedback entries.",
"items": {
"anyOf": [
{
@@ -37,25 +37,25 @@
"properties": {
"id": {
"type": "string",
- "description": "Identificador único del comentario."
+ "description": "Unique feedback identifier."
},
"path": {
"type": "string",
- "description": "La ruta o URL del documento de origen."
+ "description": "The path or URL to the source document."
},
"comment": {
"type": [
"string",
"null"
],
- "description": "Texto del comentario del usuario."
+ "description": "Text of the user's feedback comment."
},
"createdAt": {
"type": [
"string",
"null"
],
- "description": "Fecha y hora en la que se envió el comentario."
+ "description": "Timestamp when the feedback was submitted."
},
"source": {
"type": "string",
@@ -63,7 +63,7 @@
"code_snippet",
"contextual"
],
- "description": "Origen del comentario. `code_snippet` indica un comentario sobre un bloque de código, `contextual` indica un comentario a nivel de página."
+ "description": "Where the feedback originated. `code_snippet` is feedback on a code block, `contextual` is page-level feedback."
},
"status": {
"type": "string",
@@ -73,7 +73,7 @@
"resolved",
"dismissed"
],
- "description": "Estado de revisión actual del comentario."
+ "description": "Current review status of the feedback."
}
},
"required": [
@@ -90,25 +90,25 @@
"properties": {
"id": {
"type": "string",
- "description": "Identificador único del comentario."
+ "description": "Unique feedback identifier."
},
"path": {
"type": "string",
- "description": "La ruta o URL del documento de origen."
+ "description": "The path or URL to the source document."
},
"comment": {
"type": [
"string",
"null"
],
- "description": "Texto del comentario del usuario."
+ "description": "Text of the user's feedback comment."
},
"createdAt": {
"type": [
"string",
"null"
],
- "description": "Fecha y hora en la que se envió el comentario."
+ "description": "Timestamp when the feedback was submitted."
},
"source": {
"type": "string",
@@ -116,7 +116,7 @@
"code_snippet",
"contextual"
],
- "description": "Origen del comentario. `code_snippet` indica un comentario sobre un bloque de código, `contextual` indica un comentario a nivel de página."
+ "description": "Where the feedback originated. `code_snippet` is feedback on a code block, `contextual` is page-level feedback."
},
"status": {
"type": "string",
@@ -126,18 +126,18 @@
"resolved",
"dismissed"
],
- "description": "Estado actual de revisión del comentario."
+ "description": "Current review status of the feedback."
},
"helpful": {
"type": "boolean",
- "description": "Indica si el usuario considera útil el contenido."
+ "description": "Whether the user found the content helpful."
},
"contact": {
"type": [
"string",
"null"
],
- "description": "Dirección de correo electrónico proporcionada por el usuario para el seguimiento."
+ "description": "Email address the user provided for follow-up."
}
},
"required": [
@@ -156,25 +156,25 @@
"properties": {
"id": {
"type": "string",
- "description": "Identificador único del comentario."
+ "description": "Unique feedback identifier."
},
"path": {
"type": "string",
- "description": "La ruta o URL del documento de origen."
+ "description": "The path or URL to the source document."
},
"comment": {
"type": [
"string",
"null"
],
- "description": "Texto del comentario del usuario."
+ "description": "Text of the user's feedback comment."
},
"createdAt": {
"type": [
"string",
"null"
],
- "description": "Marca de tiempo del envío del comentario."
+ "description": "Timestamp when the feedback was submitted."
},
"source": {
"type": "string",
@@ -182,7 +182,7 @@
"code_snippet",
"contextual"
],
- "description": "Origen del comentario. `code_snippet` es un comentario sobre un bloque de código, `contextual` es un comentario a nivel de página."
+ "description": "Where the feedback originated. `code_snippet` is feedback on a code block, `contextual` is page-level feedback."
},
"status": {
"type": "string",
@@ -192,25 +192,25 @@
"resolved",
"dismissed"
],
- "description": "Estado actual de revisión del comentario."
+ "description": "Current review status of the feedback."
},
"code": {
"type": "string",
- "description": "Fragmento de código al que hace referencia el comentario."
+ "description": "The code snippet the feedback relates to."
},
"filename": {
"type": [
"string",
"null"
],
- "description": "Nombre de archivo asociado al fragmento de código."
+ "description": "Filename associated with the code snippet."
},
"lang": {
"type": [
"string",
"null"
],
- "description": "Lenguaje de programación del fragmento de código."
+ "description": "Programming language of the code snippet."
}
},
"required": [
@@ -233,11 +233,11 @@
"string",
"null"
],
- "description": "Cursor para recuperar la página siguiente de resultados. Nulo si no hay más resultados."
+ "description": "Cursor to retrieve the next page of results. Null if no more results."
},
"hasMore": {
"type": "boolean",
- "description": "Indica si hay más resultados después de esta página."
+ "description": "Whether additional results are available beyond this page."
}
},
"required": [
@@ -251,17 +251,17 @@
"properties": {
"error": {
"type": "string",
- "description": "Mensaje de error que describe lo que salió mal."
+ "description": "Error message describing what went wrong."
},
"details": {
"type": "array",
- "description": "Detalles adicionales del error.",
+ "description": "Additional details about the error.",
"items": {
"type": "object",
"properties": {
"message": {
"type": "string",
- "description": "Descripción de un error específico de validación o procesamiento."
+ "description": "Description of a specific validation or processing error."
}
},
"required": [
@@ -279,39 +279,39 @@
"properties": {
"conversations": {
"type": "array",
- "description": "Lista de conversaciones del assistant.",
+ "description": "List of assistant conversations.",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
- "description": "Identificador único de la conversación."
+ "description": "Unique conversation identifier."
},
"timestamp": {
"type": "string",
- "description": "Marca de tiempo en la que se produjo la conversación."
+ "description": "Timestamp when the conversation occurred."
},
"query": {
"type": "string",
- "description": "La pregunta del usuario para el assistant."
+ "description": "The user's question to the assistant."
},
"response": {
"type": "string",
- "description": "La respuesta del assistant."
+ "description": "The assistant's response."
},
"sources": {
"type": "array",
- "description": "Páginas de la documentación mencionadas en la respuesta.",
+ "description": "Documentation pages referenced in the response.",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
- "description": "Título de la página de documentación mencionada."
+ "description": "Title of the referenced documentation page."
},
"url": {
"type": "string",
- "description": "URL de la página de documentación mencionada."
+ "description": "URL of the referenced documentation page."
}
},
"required": [
@@ -325,7 +325,7 @@
"string",
"null"
],
- "description": "Categoría de agrupación asignada automáticamente a la conversación, si corresponde."
+ "description": "Auto-assigned category grouping for the conversation, if applicable."
}
},
"required": [
@@ -343,11 +343,11 @@
"string",
"null"
],
- "description": "Cursor para obtener la siguiente página de resultados. Es nulo si no hay más resultados."
+ "description": "Cursor to retrieve the next page of results. Null if no more results."
},
"hasMore": {
"type": "boolean",
- "description": "Indica si hay resultados adicionales más allá de esta página."
+ "description": "Whether additional results are available beyond this page."
}
},
"required": [
@@ -355,6 +355,176 @@
"nextCursor",
"hasMore"
]
+ },
+ "TrafficTotals": {
+ "type": "object",
+ "description": "Site-wide traffic totals for the date range.",
+ "properties": {
+ "human": {
+ "type": "number",
+ "description": "Site-wide total from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Site-wide total from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Site-wide total across all traffic."
+ }
+ },
+ "required": [
+ "human",
+ "ai",
+ "total"
+ ]
+ },
+ "ViewsByPageResponse": {
+ "type": "object",
+ "properties": {
+ "totals": {
+ "$ref": "#/components/schemas/TrafficTotals",
+ "description": "Site-wide view totals for the date range."
+ },
+ "views": {
+ "type": "array",
+ "description": "Per-path view counts.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "human": {
+ "type": "number",
+ "description": "Views from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Views from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Views from all traffic."
+ }
+ },
+ "required": [
+ "path",
+ "human",
+ "ai",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "totals",
+ "views",
+ "hasMore"
+ ]
+ },
+ "VisitorsByPageResponse": {
+ "type": "object",
+ "properties": {
+ "totals": {
+ "$ref": "#/components/schemas/TrafficTotals",
+ "description": "Site-wide unique visitor totals for the date range."
+ },
+ "visitors": {
+ "type": "array",
+ "description": "Per-path unique visitor counts.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "human": {
+ "type": "number",
+ "description": "Unique visitors from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Unique visitors from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Approx. distinct visitors with any qualifying view on this path (deduplicated across human and AI)."
+ }
+ },
+ "required": [
+ "path",
+ "human",
+ "ai",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "totals",
+ "visitors",
+ "hasMore"
+ ]
+ },
+ "FeedbackGroupedByPageResponse": {
+ "type": "object",
+ "properties": {
+ "feedback": {
+ "type": "array",
+ "description": "Per-page feedback aggregates.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "thumbsUp": {
+ "type": "number",
+ "description": "Number of thumbs up ratings on this page."
+ },
+ "thumbsDown": {
+ "type": "number",
+ "description": "Number of thumbs down ratings on this page."
+ },
+ "code": {
+ "type": "number",
+ "description": "Number of code snippet feedback entries on this page."
+ },
+ "total": {
+ "type": "number",
+ "description": "Total feedback count on this page."
+ }
+ },
+ "required": [
+ "path",
+ "thumbsUp",
+ "thumbsDown",
+ "code",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "feedback",
+ "hasMore"
+ ]
}
},
"parameters": {
@@ -371,8 +541,8 @@
"paths": {
"/v1/analytics/{projectId}/feedback": {
"get": {
- "summary": "Obtener comentarios de los usuarios",
- "description": "Devuelve comentarios de usuarios con paginación y filtrado opcional",
+ "summary": "Get user feedback",
+ "description": "Returns paginated user feedback with optional filtering",
"tags": [
"Analytics"
],
@@ -388,7 +558,7 @@
{
"schema": {
"type": "string",
- "description": "Fecha en formato ISO 8601 o AAAA-MM-DD",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
"example": "2024-01-01"
},
"required": false,
@@ -398,7 +568,7 @@
{
"schema": {
"type": "string",
- "description": "Fecha en formato ISO 8601 o AAAA-MM-DD. `dateTo` es un límite superior exclusivo. Los resultados incluyen fechas anteriores, pero no la fecha especificada.",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
"example": "2024-01-01"
},
"required": false,
@@ -412,7 +582,7 @@
"code_snippet",
"contextual"
],
- "description": "Filtrar por el origen de los comentarios"
+ "description": "Filter by feedback source"
},
"required": false,
"name": "source",
@@ -421,7 +591,7 @@
{
"schema": {
"type": "string",
- "description": "Lista de estados separados por comas por los que filtrar"
+ "description": "Comma-separated list of statuses to filter by"
},
"required": false,
"name": "status",
@@ -433,7 +603,7 @@
"minimum": 1,
"maximum": 100,
"default": 50,
- "description": "Número máximo de resultados por página"
+ "description": "Max results per page"
},
"required": false,
"name": "limit",
@@ -442,7 +612,7 @@
{
"schema": {
"type": "string",
- "description": "Cursor de paginación"
+ "description": "Pagination cursor"
},
"required": false,
"name": "cursor",
@@ -451,7 +621,7 @@
],
"responses": {
"200": {
- "description": "Datos de comentarios paginados",
+ "description": "Feedback data with pagination",
"content": {
"application/json": {
"schema": {
@@ -461,7 +631,112 @@
}
},
"400": {
- "description": "Parámetros de búsqueda no válidos",
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/feedback/by-page": {
+ "get": {
+ "summary": "Get feedback grouped by page",
+ "description": "Returns feedback counts (thumbs up/down, code snippets, total) aggregated by page path",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100,
+ "default": 10,
+ "description": "Max results per page (default 10)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "enum": [
+ "code_snippet",
+ "contextual"
+ ],
+ "description": "Filter by feedback source"
+ },
+ "required": false,
+ "name": "source",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Comma-separated list of statuses to filter by"
+ },
+ "required": false,
+ "name": "status",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Per-page feedback aggregates",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackGroupedByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
"content": {
"application/json": {
"schema": {
@@ -471,7 +746,7 @@
}
},
"500": {
- "description": "Error del servidor",
+ "description": "Server error",
"content": {
"application/json": {
"schema": {
@@ -485,8 +760,8 @@
},
"/v1/analytics/{projectId}/assistant": {
"get": {
- "summary": "Obtener conversaciones del assistant",
- "description": "Devuelve el historial paginado de conversaciones del Asistente de IA",
+ "summary": "Get assistant conversations",
+ "description": "Returns paginated AI assistant conversation history",
"tags": [
"Analytics"
],
@@ -502,7 +777,7 @@
{
"schema": {
"type": "string",
- "description": "Fecha en formato ISO 8601 o AAAA-MM-DD",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
"example": "2024-01-01"
},
"required": false,
@@ -512,7 +787,7 @@
{
"schema": {
"type": "string",
- "description": "Fecha en formato ISO 8601 o AAAA-MM-DD. `dateTo` es un límite superior exclusivo. Los resultados incluyen fechas anteriores, pero no la fecha especificada.",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
"example": "2024-01-01"
},
"required": false,
@@ -525,7 +800,7 @@
"minimum": 1,
"maximum": 1000,
"default": 100,
- "description": "Número máximo de resultados por página"
+ "description": "Max results per page"
},
"required": false,
"name": "limit",
@@ -535,7 +810,7 @@
"schema": {
"type": "string",
"format": "ulid",
- "description": "Cursor de paginación (formato ULID)"
+ "description": "Pagination cursor (ULID format)"
},
"required": false,
"name": "cursor",
@@ -544,7 +819,7 @@
],
"responses": {
"200": {
- "description": "Datos de conversación paginados",
+ "description": "Conversation data with pagination",
"content": {
"application/json": {
"schema": {
@@ -554,7 +829,195 @@
}
},
"400": {
- "description": "Parámetros de búsqueda no válidos",
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/views": {
+ "get": {
+ "summary": "Get page views by path",
+ "description": "Returns per-path and site-wide content view event counts.",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-31"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 250,
+ "default": 50,
+ "description": "Max results per page (1–250, default 50)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 0,
+ "default": 0,
+ "description": "Number of rows to skip"
+ },
+ "required": false,
+ "name": "offset",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Site-wide totals and per-path view counts",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ViewsByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/visitors": {
+ "get": {
+ "summary": "Get unique visitors by page",
+ "description": "Returns per-path and site-wide approximate distinct visitors by traffic type. `total` is deduplicated across human and AI (union of distinct visitor ids with any qualifying content view).",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-31"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 250,
+ "default": 50,
+ "description": "Max results per page (1–250, default 50)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 0,
+ "default": 0,
+ "description": "Number of rows to skip"
+ },
+ "required": false,
+ "name": "offset",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Site-wide totals and per-path visitor counts",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/VisitorsByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
"content": {
"application/json": {
"schema": {
@@ -564,7 +1027,7 @@
}
},
"500": {
- "description": "Error del servidor",
+ "description": "Server error",
"content": {
"application/json": {
"schema": {
diff --git a/es/api/analytics/feedback-by-page.mdx b/es/api/analytics/feedback-by-page.mdx
new file mode 100644
index 000000000..5fb4facff
--- /dev/null
+++ b/es/api/analytics/feedback-by-page.mdx
@@ -0,0 +1,23 @@
+---
+title: "Get feedback by page"
+description: "Retrieve feedback counts aggregated by page path, including thumbs up/down and code snippet counts."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/feedback/by-page
+keywords: ["analytics", "feedback", "by page", "export", "aggregated"]
+---
+
+## Usage
+
+Use this endpoint to export per-page feedback aggregates from your documentation. Each row includes counts for thumbs up, thumbs down, code snippet feedback, and a combined total.
+
+## Response fields
+
+Every item in the response includes:
+- **path**: The documentation page path
+- **thumbsUp**: Number of positive (thumbs up) ratings
+- **thumbsDown**: Number of negative (thumbs down) ratings
+- **code**: Number of code snippet feedback entries
+- **total**: Combined feedback count across all types
+
+## Filtering
+
+Filter results by date range using `dateFrom` and `dateTo`, by feedback source using `source`, and by status using `status`.
diff --git a/es/api/analytics/views.mdx b/es/api/analytics/views.mdx
new file mode 100644
index 000000000..94727c967
--- /dev/null
+++ b/es/api/analytics/views.mdx
@@ -0,0 +1,25 @@
+---
+title: "Get page views"
+description: "Retrieve per-path and site-wide content view event counts."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/views
+keywords: ["analytics", "views", "page views", "export", "traffic"]
+---
+
+## Usage
+
+Use this endpoint to export per-page view counts from your documentation. Each row includes a breakdown of human and AI bot views, plus a combined total.
+
+Paginate through results using offset-based pagination. Increment `offset` by `limit` while `hasMore` is `true`.
+
+## Traffic breakdown
+
+Every response includes:
+- **human**: Views from regular browser traffic
+- **ai**: Views from AI bot crawlers (e.g. GPTBot, ClaudeBot)
+- **total**: Combined view count across all traffic
+
+The `totals` object contains the same breakdown aggregated across your entire site for the selected date range.
+
+## Filtering
+
+Filter views by date range using `dateFrom` and `dateTo` parameters.
diff --git a/es/api/analytics/visitors.mdx b/es/api/analytics/visitors.mdx
new file mode 100644
index 000000000..fe7107a71
--- /dev/null
+++ b/es/api/analytics/visitors.mdx
@@ -0,0 +1,25 @@
+---
+title: "Get unique visitors"
+description: "Retrieve per-path and site-wide approximate distinct visitors by traffic type."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/visitors
+keywords: ["analytics", "visitors", "unique visitors", "export", "traffic"]
+---
+
+## Usage
+
+Use this endpoint to export per-page unique visitor counts from your documentation. Visitors are deduplicated by user ID or anonymous ID.
+
+Paginate through results using offset-based pagination. Increment `offset` by `limit` while `hasMore` is `true`.
+
+## Traffic breakdown
+
+Every response includes:
+- **human**: Unique visitors from regular browser traffic
+- **ai**: Unique visitors from AI bot crawlers (e.g. GPTBot, ClaudeBot)
+- **total**: Combined unique visitor count across all traffic
+
+The `totals` object contains the same breakdown aggregated across your entire site for the selected date range.
+
+## Filtering
+
+Filter visitors by date range using `dateFrom` and `dateTo` parameters.
diff --git a/es/api/introduction.mdx b/es/api/introduction.mdx
index 08c5d5acc..3ffd6d54c 100644
--- a/es/api/introduction.mdx
+++ b/es/api/introduction.mdx
@@ -18,7 +18,10 @@ La REST (Representational State Transfer) API de Mintlify te permite interactuar
* [Create assistant message](/es/api/assistant/create-assistant-message-v2): Integra el assistant, entrenado con tu documentación, en cualquier aplicación que elijas.
* [Search documentation](/es/api/assistant/search): Busca en tu documentación.
* [Get user feedback](/es/api/analytics/feedback): Exporta los comentarios de los usuarios de tu documentación.
+* [Get feedback by page](/es/api/analytics/feedback-by-page): Exporta las estadísticas de feedback agrupadas por página.
* [Get assistant conversations](/es/api/analytics/assistant-conversations): Exporta el historial de conversaciones del Asistente de IA.
+* [Get page views](/es/api/analytics/views): Exporta el recuento de vistas por página y a nivel de sitio.
+* [Get unique visitors](/es/api/analytics/visitors): Exporta el recuento de visitantes únicos por página y a nivel de sitio.
### Casos de uso comunes
@@ -28,7 +31,7 @@ La REST (Representational State Transfer) API de Mintlify te permite interactuar
* **Integración CI/CD**: Actualiza la documentación como parte de tu pipeline de implementación cuando el código cambie con [Trigger update](/es/api/update/trigger).
* **Integraciones personalizadas**: Inserta el Asistente de IA en tu producto, portal de soporte o herramientas internas con [Create assistant message](/es/api/assistant/create-assistant-message-v2) y [Search documentation](/es/api/assistant/search).
* **Edición automatizada**: Usa trabajos de agente para actualizar la documentación programáticamente y a escala con [Create agent job](/es/api/agent/v2/create-agent-job), [Get agent job](/es/api/agent/v2/get-agent-job) y [Send follow-up message](/es/api/agent/v2/send-message).
-* **Exportación de Analytics**: Exporta comentarios y conversaciones del Asistente de IA para análisis externo con [Get user feedback](/es/api/analytics/feedback) y [Get assistant conversations](/es/api/analytics/assistant-conversations).
+* **Exportación de Analytics**: Exporta comentarios, conversaciones del Asistente de IA, vistas de páginas y datos de visitantes para análisis externo con [Get user feedback](/es/api/analytics/feedback), [Get feedback by page](/es/api/analytics/feedback-by-page), [Get assistant conversations](/es/api/analytics/assistant-conversations), [Get page views](/es/api/analytics/views) y [Get unique visitors](/es/api/analytics/visitors).
## Autenticación
@@ -42,7 +45,7 @@ Puedes crear hasta 10 API keys por hora y por organización.
### Clave de la API de administrador
-Usa la clave de la API de administrador para autenticar solicitudes a [Trigger update](/es/api/update/trigger), [Get update status](/es/api/update/status), [Create agent job](/es/api/agent/v2/create-agent-job), [Get agent job](/es/api/agent/v2/get-agent-job), [Send follow-up message](/es/api/agent/v2/send-message), [Get user feedback](/es/api/analytics/feedback) y [Get assistant conversations](/es/api/analytics/assistant-conversations).
+Usa la clave de la API de administrador para autenticar solicitudes a [Trigger update](/es/api/update/trigger), [Get update status](/es/api/update/status), [Create agent job](/es/api/agent/v2/create-agent-job), [Get agent job](/es/api/agent/v2/get-agent-job), [Send follow-up message](/es/api/agent/v2/send-message), [Get user feedback](/es/api/analytics/feedback), [Get feedback by page](/es/api/analytics/feedback-by-page), [Get assistant conversations](/es/api/analytics/assistant-conversations), [Get page views](/es/api/analytics/views) y [Get unique visitors](/es/api/analytics/visitors).
Las claves de la API de administrador comienzan con el prefijo `mint_`.
diff --git a/fr/analytics.openapi.json b/fr/analytics.openapi.json
index b41ea2b03..e15eea167 100644
--- a/fr/analytics.openapi.json
+++ b/fr/analytics.openapi.json
@@ -3,7 +3,7 @@
"info": {
"title": "Mintlify Analytics Export API",
"version": "1.0.0",
- "description": "API d’exportation des données Analytics de la documentation"
+ "description": "API for exporting documentation analytics data"
},
"servers": [
{
@@ -16,20 +16,20 @@
"bearerAuth": {
"type": "http",
"scheme": "bearer",
- "description": "L’en-tête Authorization requiert un jeton Bearer. Utilisez une clé d’API administrateur (préfixée par `mint_`). Il s’agit d’une clé secrète côté serveur. Générez-en une depuis la [page API keys](https://dashboard.mintlify.com/settings/organization/api-keys) dans votre Dashboard."
+ "description": "The Authorization header expects a Bearer token. Use an admin API key (prefixed with `mint_`). This is a server-side secret key. Generate one on the [API keys page](https://dashboard.mintlify.com/settings/organization/api-keys) in your dashboard."
}
},
"schemas": {
"projectId": {
"type": "string",
- "description": "ID de votre projet. Vous pouvez le copier depuis la page [API keys](https://dashboard.mintlify.com/settings/organization/api-keys) de votre Dashboard."
+ "description": "Your project ID. Can be copied from the [API keys](https://dashboard.mintlify.com/settings/organization/api-keys) page in your dashboard."
},
"FeedbackResponse": {
"type": "object",
"properties": {
"feedback": {
"type": "array",
- "description": "Liste des retours.",
+ "description": "List of feedback entries.",
"items": {
"anyOf": [
{
@@ -37,25 +37,25 @@
"properties": {
"id": {
"type": "string",
- "description": "Identifiant unique du retour."
+ "description": "Unique feedback identifier."
},
"path": {
"type": "string",
- "description": "Le chemin ou l’URL du document source."
+ "description": "The path or URL to the source document."
},
"comment": {
"type": [
"string",
"null"
],
- "description": "Texte du commentaire de l’utilisateur."
+ "description": "Text of the user's feedback comment."
},
"createdAt": {
"type": [
"string",
"null"
],
- "description": "Horodatage de l’envoi du retour."
+ "description": "Timestamp when the feedback was submitted."
},
"source": {
"type": "string",
@@ -63,7 +63,7 @@
"code_snippet",
"contextual"
],
- "description": "Source du retour. `code_snippet` correspond à un retour sur un code block, `contextual` à un retour au niveau de la page."
+ "description": "Where the feedback originated. `code_snippet` is feedback on a code block, `contextual` is page-level feedback."
},
"status": {
"type": "string",
@@ -73,7 +73,7 @@
"resolved",
"dismissed"
],
- "description": "Statut actuel de révision du retour."
+ "description": "Current review status of the feedback."
}
},
"required": [
@@ -90,25 +90,25 @@
"properties": {
"id": {
"type": "string",
- "description": "Identifiant unique du retour."
+ "description": "Unique feedback identifier."
},
"path": {
"type": "string",
- "description": "Chemin ou URL du document source."
+ "description": "The path or URL to the source document."
},
"comment": {
"type": [
"string",
"null"
],
- "description": "Texte du commentaire de l’utilisateur."
+ "description": "Text of the user's feedback comment."
},
"createdAt": {
"type": [
"string",
"null"
],
- "description": "Horodatage de l’envoi du retour."
+ "description": "Timestamp when the feedback was submitted."
},
"source": {
"type": "string",
@@ -116,7 +116,7 @@
"code_snippet",
"contextual"
],
- "description": "Source du retour. `code_snippet` correspond à un retour sur un code block, `contextual` à un retour au niveau de la page."
+ "description": "Where the feedback originated. `code_snippet` is feedback on a code block, `contextual` is page-level feedback."
},
"status": {
"type": "string",
@@ -126,18 +126,18 @@
"resolved",
"dismissed"
],
- "description": "Statut actuel d’examen du retour."
+ "description": "Current review status of the feedback."
},
"helpful": {
"type": "boolean",
- "description": "Indique si l’utilisateur a jugé le contenu utile."
+ "description": "Whether the user found the content helpful."
},
"contact": {
"type": [
"string",
"null"
],
- "description": "Adresse e-mail fournie par l’utilisateur pour le suivi."
+ "description": "Email address the user provided for follow-up."
}
},
"required": [
@@ -156,25 +156,25 @@
"properties": {
"id": {
"type": "string",
- "description": "Identifiant unique du retour."
+ "description": "Unique feedback identifier."
},
"path": {
"type": "string",
- "description": "Chemin ou URL du document source."
+ "description": "The path or URL to the source document."
},
"comment": {
"type": [
"string",
"null"
],
- "description": "Texte du commentaire de l’utilisateur."
+ "description": "Text of the user's feedback comment."
},
"createdAt": {
"type": [
"string",
"null"
],
- "description": "Horodatage de l’envoi du retour."
+ "description": "Timestamp when the feedback was submitted."
},
"source": {
"type": "string",
@@ -182,7 +182,7 @@
"code_snippet",
"contextual"
],
- "description": "Origine du retour. `code_snippet` correspond à un retour sur un code block, `contextual` à un retour concernant la page entière."
+ "description": "Where the feedback originated. `code_snippet` is feedback on a code block, `contextual` is page-level feedback."
},
"status": {
"type": "string",
@@ -192,25 +192,25 @@
"resolved",
"dismissed"
],
- "description": "Statut actuel d’examen du retour."
+ "description": "Current review status of the feedback."
},
"code": {
"type": "string",
- "description": "Extrait de code auquel le retour se rapporte."
+ "description": "The code snippet the feedback relates to."
},
"filename": {
"type": [
"string",
"null"
],
- "description": "Nom de fichier associé à l’extrait de code."
+ "description": "Filename associated with the code snippet."
},
"lang": {
"type": [
"string",
"null"
],
- "description": "Langage de programmation de l’extrait de code."
+ "description": "Programming language of the code snippet."
}
},
"required": [
@@ -233,11 +233,11 @@
"string",
"null"
],
- "description": "Curseur permettant de récupérer la page de résultats suivante. null s’il n’y a plus de résultats."
+ "description": "Cursor to retrieve the next page of results. Null if no more results."
},
"hasMore": {
"type": "boolean",
- "description": "Indique si des résultats supplémentaires sont disponibles au-delà de cette page."
+ "description": "Whether additional results are available beyond this page."
}
},
"required": [
@@ -251,17 +251,17 @@
"properties": {
"error": {
"type": "string",
- "description": "Message d’erreur décrivant ce qui s’est mal passé."
+ "description": "Error message describing what went wrong."
},
"details": {
"type": "array",
- "description": "Détails supplémentaires sur l’erreur.",
+ "description": "Additional details about the error.",
"items": {
"type": "object",
"properties": {
"message": {
"type": "string",
- "description": "Description d’une erreur spécifique de validation ou de traitement."
+ "description": "Description of a specific validation or processing error."
}
},
"required": [
@@ -279,39 +279,39 @@
"properties": {
"conversations": {
"type": "array",
- "description": "Liste des conversations de l’Assistant.",
+ "description": "List of assistant conversations.",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
- "description": "Identifiant unique de la conversation."
+ "description": "Unique conversation identifier."
},
"timestamp": {
"type": "string",
- "description": "Horodatage de la conversation."
+ "description": "Timestamp when the conversation occurred."
},
"query": {
"type": "string",
- "description": "La question de l’utilisateur adressée à l’Assistant."
+ "description": "The user's question to the assistant."
},
"response": {
"type": "string",
- "description": "La réponse générée par l’Assistant."
+ "description": "The assistant's response."
},
"sources": {
"type": "array",
- "description": "Pages de documentation référencées dans la réponse.",
+ "description": "Documentation pages referenced in the response.",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
- "description": "Titre de la page de documentation référencée."
+ "description": "Title of the referenced documentation page."
},
"url": {
"type": "string",
- "description": "URL de la page de documentation référencée."
+ "description": "URL of the referenced documentation page."
}
},
"required": [
@@ -325,7 +325,7 @@
"string",
"null"
],
- "description": "Catégorie de regroupement automatiquement attribuée à la conversation, le cas échéant."
+ "description": "Auto-assigned category grouping for the conversation, if applicable."
}
},
"required": [
@@ -343,11 +343,11 @@
"string",
"null"
],
- "description": "Curseur de pagination permettant de récupérer la page de résultats suivante. Null s’il n’y a plus de résultats."
+ "description": "Cursor to retrieve the next page of results. Null if no more results."
},
"hasMore": {
"type": "boolean",
- "description": "Indique si des résultats supplémentaires sont disponibles au‑delà de cette page."
+ "description": "Whether additional results are available beyond this page."
}
},
"required": [
@@ -355,6 +355,176 @@
"nextCursor",
"hasMore"
]
+ },
+ "TrafficTotals": {
+ "type": "object",
+ "description": "Site-wide traffic totals for the date range.",
+ "properties": {
+ "human": {
+ "type": "number",
+ "description": "Site-wide total from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Site-wide total from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Site-wide total across all traffic."
+ }
+ },
+ "required": [
+ "human",
+ "ai",
+ "total"
+ ]
+ },
+ "ViewsByPageResponse": {
+ "type": "object",
+ "properties": {
+ "totals": {
+ "$ref": "#/components/schemas/TrafficTotals",
+ "description": "Site-wide view totals for the date range."
+ },
+ "views": {
+ "type": "array",
+ "description": "Per-path view counts.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "human": {
+ "type": "number",
+ "description": "Views from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Views from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Views from all traffic."
+ }
+ },
+ "required": [
+ "path",
+ "human",
+ "ai",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "totals",
+ "views",
+ "hasMore"
+ ]
+ },
+ "VisitorsByPageResponse": {
+ "type": "object",
+ "properties": {
+ "totals": {
+ "$ref": "#/components/schemas/TrafficTotals",
+ "description": "Site-wide unique visitor totals for the date range."
+ },
+ "visitors": {
+ "type": "array",
+ "description": "Per-path unique visitor counts.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "human": {
+ "type": "number",
+ "description": "Unique visitors from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Unique visitors from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Approx. distinct visitors with any qualifying view on this path (deduplicated across human and AI)."
+ }
+ },
+ "required": [
+ "path",
+ "human",
+ "ai",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "totals",
+ "visitors",
+ "hasMore"
+ ]
+ },
+ "FeedbackGroupedByPageResponse": {
+ "type": "object",
+ "properties": {
+ "feedback": {
+ "type": "array",
+ "description": "Per-page feedback aggregates.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "thumbsUp": {
+ "type": "number",
+ "description": "Number of thumbs up ratings on this page."
+ },
+ "thumbsDown": {
+ "type": "number",
+ "description": "Number of thumbs down ratings on this page."
+ },
+ "code": {
+ "type": "number",
+ "description": "Number of code snippet feedback entries on this page."
+ },
+ "total": {
+ "type": "number",
+ "description": "Total feedback count on this page."
+ }
+ },
+ "required": [
+ "path",
+ "thumbsUp",
+ "thumbsDown",
+ "code",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "feedback",
+ "hasMore"
+ ]
}
},
"parameters": {
@@ -371,8 +541,8 @@
"paths": {
"/v1/analytics/{projectId}/feedback": {
"get": {
- "summary": "Récupérer les retours des utilisateurs",
- "description": "Renvoie des retours d’utilisateurs paginés avec des filtres facultatifs",
+ "summary": "Get user feedback",
+ "description": "Returns paginated user feedback with optional filtering",
"tags": [
"Analytics"
],
@@ -388,7 +558,7 @@
{
"schema": {
"type": "string",
- "description": "Date au format ISO 8601 ou AAAA-MM-JJ",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
"example": "2024-01-01"
},
"required": false,
@@ -398,7 +568,7 @@
{
"schema": {
"type": "string",
- "description": "Date au format ISO 8601 ou AAAA-MM-JJ. `dateTo` est une borne supérieure exclusive. Les résultats incluent les dates antérieures, mais pas la date spécifiée elle-même.",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
"example": "2024-01-01"
},
"required": false,
@@ -412,7 +582,7 @@
"code_snippet",
"contextual"
],
- "description": "Filtrer par source des retours utilisateurs"
+ "description": "Filter by feedback source"
},
"required": false,
"name": "source",
@@ -421,7 +591,7 @@
{
"schema": {
"type": "string",
- "description": "Liste de statuts séparés par des virgules pour le filtrage"
+ "description": "Comma-separated list of statuses to filter by"
},
"required": false,
"name": "status",
@@ -433,7 +603,7 @@
"minimum": 1,
"maximum": 100,
"default": 50,
- "description": "Nombre maximal de résultats par page"
+ "description": "Max results per page"
},
"required": false,
"name": "limit",
@@ -442,7 +612,7 @@
{
"schema": {
"type": "string",
- "description": "Curseur de pagination"
+ "description": "Pagination cursor"
},
"required": false,
"name": "cursor",
@@ -451,7 +621,7 @@
],
"responses": {
"200": {
- "description": "Données de retours utilisateurs paginées",
+ "description": "Feedback data with pagination",
"content": {
"application/json": {
"schema": {
@@ -461,7 +631,112 @@
}
},
"400": {
- "description": "Paramètres de requête invalides",
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/feedback/by-page": {
+ "get": {
+ "summary": "Get feedback grouped by page",
+ "description": "Returns feedback counts (thumbs up/down, code snippets, total) aggregated by page path",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100,
+ "default": 10,
+ "description": "Max results per page (default 10)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "enum": [
+ "code_snippet",
+ "contextual"
+ ],
+ "description": "Filter by feedback source"
+ },
+ "required": false,
+ "name": "source",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Comma-separated list of statuses to filter by"
+ },
+ "required": false,
+ "name": "status",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Per-page feedback aggregates",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackGroupedByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
"content": {
"application/json": {
"schema": {
@@ -471,7 +746,7 @@
}
},
"500": {
- "description": "Erreur serveur",
+ "description": "Server error",
"content": {
"application/json": {
"schema": {
@@ -485,8 +760,8 @@
},
"/v1/analytics/{projectId}/assistant": {
"get": {
- "summary": "Récupérer les conversations de l’Assistant",
- "description": "Renvoie l’historique de conversation paginé de l’Assistant IA",
+ "summary": "Get assistant conversations",
+ "description": "Returns paginated AI assistant conversation history",
"tags": [
"Analytics"
],
@@ -502,7 +777,7 @@
{
"schema": {
"type": "string",
- "description": "Date au format ISO 8601 ou AAAA-MM-JJ",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
"example": "2024-01-01"
},
"required": false,
@@ -512,7 +787,7 @@
{
"schema": {
"type": "string",
- "description": "Date au format ISO 8601 ou AAAA-MM-JJ. `dateTo` est une borne supérieure exclusive. Les résultats incluent les dates antérieures, mais pas la date spécifiée.",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
"example": "2024-01-01"
},
"required": false,
@@ -525,7 +800,7 @@
"minimum": 1,
"maximum": 1000,
"default": 100,
- "description": "Nombre maximal de résultats par page"
+ "description": "Max results per page"
},
"required": false,
"name": "limit",
@@ -535,7 +810,7 @@
"schema": {
"type": "string",
"format": "ulid",
- "description": "Curseur de pagination (format ULID)"
+ "description": "Pagination cursor (ULID format)"
},
"required": false,
"name": "cursor",
@@ -544,7 +819,7 @@
],
"responses": {
"200": {
- "description": "Données de conversation paginées",
+ "description": "Conversation data with pagination",
"content": {
"application/json": {
"schema": {
@@ -554,7 +829,195 @@
}
},
"400": {
- "description": "Paramètres de requête invalides",
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/views": {
+ "get": {
+ "summary": "Get page views by path",
+ "description": "Returns per-path and site-wide content view event counts.",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-31"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 250,
+ "default": 50,
+ "description": "Max results per page (1–250, default 50)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 0,
+ "default": 0,
+ "description": "Number of rows to skip"
+ },
+ "required": false,
+ "name": "offset",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Site-wide totals and per-path view counts",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ViewsByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/visitors": {
+ "get": {
+ "summary": "Get unique visitors by page",
+ "description": "Returns per-path and site-wide approximate distinct visitors by traffic type. `total` is deduplicated across human and AI (union of distinct visitor ids with any qualifying content view).",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-31"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 250,
+ "default": 50,
+ "description": "Max results per page (1–250, default 50)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 0,
+ "default": 0,
+ "description": "Number of rows to skip"
+ },
+ "required": false,
+ "name": "offset",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Site-wide totals and per-path visitor counts",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/VisitorsByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
"content": {
"application/json": {
"schema": {
@@ -564,7 +1027,7 @@
}
},
"500": {
- "description": "Erreur serveur",
+ "description": "Server error",
"content": {
"application/json": {
"schema": {
diff --git a/fr/api/analytics/feedback-by-page.mdx b/fr/api/analytics/feedback-by-page.mdx
new file mode 100644
index 000000000..5fb4facff
--- /dev/null
+++ b/fr/api/analytics/feedback-by-page.mdx
@@ -0,0 +1,23 @@
+---
+title: "Get feedback by page"
+description: "Retrieve feedback counts aggregated by page path, including thumbs up/down and code snippet counts."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/feedback/by-page
+keywords: ["analytics", "feedback", "by page", "export", "aggregated"]
+---
+
+## Usage
+
+Use this endpoint to export per-page feedback aggregates from your documentation. Each row includes counts for thumbs up, thumbs down, code snippet feedback, and a combined total.
+
+## Response fields
+
+Every item in the response includes:
+- **path**: The documentation page path
+- **thumbsUp**: Number of positive (thumbs up) ratings
+- **thumbsDown**: Number of negative (thumbs down) ratings
+- **code**: Number of code snippet feedback entries
+- **total**: Combined feedback count across all types
+
+## Filtering
+
+Filter results by date range using `dateFrom` and `dateTo`, by feedback source using `source`, and by status using `status`.
diff --git a/fr/api/analytics/views.mdx b/fr/api/analytics/views.mdx
new file mode 100644
index 000000000..94727c967
--- /dev/null
+++ b/fr/api/analytics/views.mdx
@@ -0,0 +1,25 @@
+---
+title: "Get page views"
+description: "Retrieve per-path and site-wide content view event counts."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/views
+keywords: ["analytics", "views", "page views", "export", "traffic"]
+---
+
+## Usage
+
+Use this endpoint to export per-page view counts from your documentation. Each row includes a breakdown of human and AI bot views, plus a combined total.
+
+Paginate through results using offset-based pagination. Increment `offset` by `limit` while `hasMore` is `true`.
+
+## Traffic breakdown
+
+Every response includes:
+- **human**: Views from regular browser traffic
+- **ai**: Views from AI bot crawlers (e.g. GPTBot, ClaudeBot)
+- **total**: Combined view count across all traffic
+
+The `totals` object contains the same breakdown aggregated across your entire site for the selected date range.
+
+## Filtering
+
+Filter views by date range using `dateFrom` and `dateTo` parameters.
diff --git a/fr/api/analytics/visitors.mdx b/fr/api/analytics/visitors.mdx
new file mode 100644
index 000000000..fe7107a71
--- /dev/null
+++ b/fr/api/analytics/visitors.mdx
@@ -0,0 +1,25 @@
+---
+title: "Get unique visitors"
+description: "Retrieve per-path and site-wide approximate distinct visitors by traffic type."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/visitors
+keywords: ["analytics", "visitors", "unique visitors", "export", "traffic"]
+---
+
+## Usage
+
+Use this endpoint to export per-page unique visitor counts from your documentation. Visitors are deduplicated by user ID or anonymous ID.
+
+Paginate through results using offset-based pagination. Increment `offset` by `limit` while `hasMore` is `true`.
+
+## Traffic breakdown
+
+Every response includes:
+- **human**: Unique visitors from regular browser traffic
+- **ai**: Unique visitors from AI bot crawlers (e.g. GPTBot, ClaudeBot)
+- **total**: Combined unique visitor count across all traffic
+
+The `totals` object contains the same breakdown aggregated across your entire site for the selected date range.
+
+## Filtering
+
+Filter visitors by date range using `dateFrom` and `dateTo` parameters.
diff --git a/fr/api/introduction.mdx b/fr/api/introduction.mdx
index b872d5cff..68ee51444 100644
--- a/fr/api/introduction.mdx
+++ b/fr/api/introduction.mdx
@@ -18,7 +18,10 @@ L'API REST (Representational State Transfer) de Mintlify vous permet d'interagir
* [Create assistant message](/fr/api/assistant/create-assistant-message-v2): Intégrez l'Assistant, entraîné sur votre documentation, dans n'importe quelle application de votre choix.
* [Search documentation](/fr/api/assistant/search): Effectuez une recherche dans votre documentation.
* [Get user feedback](/fr/api/analytics/feedback): Exportez les retours utilisateurs issus de votre documentation.
+* [Get feedback by page](/fr/api/analytics/feedback-by-page): Exportez les statistiques de feedback agrégées par page.
* [Get assistant conversations](/fr/api/analytics/assistant-conversations): Exportez l'historique des conversations de l'Assistant IA.
+* [Get page views](/fr/api/analytics/views): Exportez le nombre de vues par page et au niveau du site.
+* [Get unique visitors](/fr/api/analytics/visitors): Exportez le nombre de visiteurs uniques par page et au niveau du site.
### Cas d'utilisation courants
@@ -28,7 +31,7 @@ L'API REST (Representational State Transfer) de Mintlify vous permet d'interagir
* **Intégration CI/CD** : Mettez à jour la documentation dans le cadre de votre pipeline de déploiement lorsque le code change avec [Trigger update](/fr/api/update/trigger).
* **Intégrations personnalisées** : Intégrez l'Assistant IA à votre produit, portail d'assistance ou outils internes avec [Create assistant message](/fr/api/assistant/create-assistant-message-v2) et [Search documentation](/fr/api/assistant/search).
* **Édition automatisée** : Utilisez des jobs d'agent pour mettre à jour la documentation de manière programmatique et à grande échelle avec [Create agent job](/fr/api/agent/v2/create-agent-job), [Get agent job](/fr/api/agent/v2/get-agent-job), et [Send follow-up message](/fr/api/agent/v2/send-message).
-* **Export Analytics** : Exportez les retours utilisateurs et les conversations avec l'Assistant pour une analyse externe avec [Get user feedback](/fr/api/analytics/feedback) et [Get assistant conversations](/fr/api/analytics/assistant-conversations).
+* **Export Analytics** : Exportez les retours utilisateurs, les conversations avec l'Assistant, les vues de pages et les données de visiteurs pour une analyse externe avec [Get user feedback](/fr/api/analytics/feedback), [Get feedback by page](/fr/api/analytics/feedback-by-page), [Get assistant conversations](/fr/api/analytics/assistant-conversations), [Get page views](/fr/api/analytics/views) et [Get unique visitors](/fr/api/analytics/visitors).
## Authentification
@@ -42,7 +45,7 @@ Vous pouvez créer jusqu'à 10 clés d'API par heure et par organisation.
### Clé d'API administrateur
-Utilisez la clé d'API administrateur pour authentifier les requêtes vers [Trigger update](/fr/api/update/trigger), [Get update status](/fr/api/update/status), [Create agent job](/fr/api/agent/v2/create-agent-job), [Get agent job](/fr/api/agent/v2/get-agent-job), [Send follow-up message](/fr/api/agent/v2/send-message), [Get user feedback](/fr/api/analytics/feedback) et [Get assistant conversations](/fr/api/analytics/assistant-conversations).
+Utilisez la clé d'API administrateur pour authentifier les requêtes vers [Trigger update](/fr/api/update/trigger), [Get update status](/fr/api/update/status), [Create agent job](/fr/api/agent/v2/create-agent-job), [Get agent job](/fr/api/agent/v2/get-agent-job), [Send follow-up message](/fr/api/agent/v2/send-message), [Get user feedback](/fr/api/analytics/feedback), [Get feedback by page](/fr/api/analytics/feedback-by-page), [Get assistant conversations](/fr/api/analytics/assistant-conversations), [Get page views](/fr/api/analytics/views) et [Get unique visitors](/fr/api/analytics/visitors).
Les clés d'API administrateur commencent par le préfixe `mint_`.
diff --git a/zh/analytics.openapi.json b/zh/analytics.openapi.json
index 0b7a608af..e15eea167 100644
--- a/zh/analytics.openapi.json
+++ b/zh/analytics.openapi.json
@@ -3,12 +3,12 @@
"info": {
"title": "Mintlify Analytics Export API",
"version": "1.0.0",
- "description": "用于导出文档 Analytics 数据的 API"
+ "description": "API for exporting documentation analytics data"
},
"servers": [
{
"url": "https://api.mintlify.com",
- "description": "生产环境"
+ "description": "Production"
}
],
"components": {
@@ -16,20 +16,20 @@
"bearerAuth": {
"type": "http",
"scheme": "bearer",
- "description": "Authorization 请求头需要使用 Bearer Token。请使用管理员 API key(以 `mint_` 开头)。这是仅供服务端使用的密钥。你可以在控制台的 [API keys 页面](https://dashboard.mintlify.com/settings/organization/api-keys) 中生成。"
+ "description": "The Authorization header expects a Bearer token. Use an admin API key (prefixed with `mint_`). This is a server-side secret key. Generate one on the [API keys page](https://dashboard.mintlify.com/settings/organization/api-keys) in your dashboard."
}
},
"schemas": {
"projectId": {
"type": "string",
- "description": "你的项目 ID,可在控制台的 [API keys](https://dashboard.mintlify.com/settings/organization/api-keys) 页面中复制。"
+ "description": "Your project ID. Can be copied from the [API keys](https://dashboard.mintlify.com/settings/organization/api-keys) page in your dashboard."
},
"FeedbackResponse": {
"type": "object",
"properties": {
"feedback": {
"type": "array",
- "description": "反馈条目的列表。",
+ "description": "List of feedback entries.",
"items": {
"anyOf": [
{
@@ -37,25 +37,25 @@
"properties": {
"id": {
"type": "string",
- "description": "反馈的唯一标识符。"
+ "description": "Unique feedback identifier."
},
"path": {
"type": "string",
- "description": "源文档的路径或 URL。"
+ "description": "The path or URL to the source document."
},
"comment": {
"type": [
"string",
"null"
],
- "description": "用户提交的反馈内容。"
+ "description": "Text of the user's feedback comment."
},
"createdAt": {
"type": [
"string",
"null"
],
- "description": "提交该反馈时的时间戳。"
+ "description": "Timestamp when the feedback was submitted."
},
"source": {
"type": "string",
@@ -63,7 +63,7 @@
"code_snippet",
"contextual"
],
- "description": "反馈的来源类型。`code_snippet` 表示针对代码块的反馈,`contextual` 表示页面级别的反馈。"
+ "description": "Where the feedback originated. `code_snippet` is feedback on a code block, `contextual` is page-level feedback."
},
"status": {
"type": "string",
@@ -73,7 +73,7 @@
"resolved",
"dismissed"
],
- "description": "该反馈当前的审核状态。"
+ "description": "Current review status of the feedback."
}
},
"required": [
@@ -90,25 +90,25 @@
"properties": {
"id": {
"type": "string",
- "description": "该反馈的唯一标识符。"
+ "description": "Unique feedback identifier."
},
"path": {
"type": "string",
- "description": "源文档的路径或 URL。"
+ "description": "The path or URL to the source document."
},
"comment": {
"type": [
"string",
"null"
],
- "description": "用户提交的反馈内容。"
+ "description": "Text of the user's feedback comment."
},
"createdAt": {
"type": [
"string",
"null"
],
- "description": "提交该反馈时的时间戳。"
+ "description": "Timestamp when the feedback was submitted."
},
"source": {
"type": "string",
@@ -116,7 +116,7 @@
"code_snippet",
"contextual"
],
- "description": "反馈的来源类型。`code_snippet` 表示针对代码块的反馈,`contextual` 表示页面级别的反馈。"
+ "description": "Where the feedback originated. `code_snippet` is feedback on a code block, `contextual` is page-level feedback."
},
"status": {
"type": "string",
@@ -126,18 +126,18 @@
"resolved",
"dismissed"
],
- "description": "反馈当前的审核状态。"
+ "description": "Current review status of the feedback."
},
"helpful": {
"type": "boolean",
- "description": "用户是否认为该内容有帮助。"
+ "description": "Whether the user found the content helpful."
},
"contact": {
"type": [
"string",
"null"
],
- "description": "用户提供的用于后续联系的电子邮件地址。"
+ "description": "Email address the user provided for follow-up."
}
},
"required": [
@@ -156,25 +156,25 @@
"properties": {
"id": {
"type": "string",
- "description": "反馈的唯一标识符。"
+ "description": "Unique feedback identifier."
},
"path": {
"type": "string",
- "description": "源文档的路径或 URL。"
+ "description": "The path or URL to the source document."
},
"comment": {
"type": [
"string",
"null"
],
- "description": "用户反馈评论的正文内容。"
+ "description": "Text of the user's feedback comment."
},
"createdAt": {
"type": [
"string",
"null"
],
- "description": "提交该反馈时的时间戳。"
+ "description": "Timestamp when the feedback was submitted."
},
"source": {
"type": "string",
@@ -182,7 +182,7 @@
"code_snippet",
"contextual"
],
- "description": "反馈的来源类型。`code_snippet` 表示针对代码块的反馈,`contextual` 表示针对整页的反馈。"
+ "description": "Where the feedback originated. `code_snippet` is feedback on a code block, `contextual` is page-level feedback."
},
"status": {
"type": "string",
@@ -192,25 +192,25 @@
"resolved",
"dismissed"
],
- "description": "反馈当前的审核状态。"
+ "description": "Current review status of the feedback."
},
"code": {
"type": "string",
- "description": "与该反馈相关的代码片段。"
+ "description": "The code snippet the feedback relates to."
},
"filename": {
"type": [
"string",
"null"
],
- "description": "与代码片段关联的文件名。"
+ "description": "Filename associated with the code snippet."
},
"lang": {
"type": [
"string",
"null"
],
- "description": "代码片段所使用的编程语言。"
+ "description": "Programming language of the code snippet."
}
},
"required": [
@@ -233,11 +233,11 @@
"string",
"null"
],
- "description": "用于获取下一页结果的游标。如果没有更多结果,则为 null。"
+ "description": "Cursor to retrieve the next page of results. Null if no more results."
},
"hasMore": {
"type": "boolean",
- "description": "当前页之后是否还有更多结果。"
+ "description": "Whether additional results are available beyond this page."
}
},
"required": [
@@ -251,17 +251,17 @@
"properties": {
"error": {
"type": "string",
- "description": "描述错误原因的错误信息。"
+ "description": "Error message describing what went wrong."
},
"details": {
"type": "array",
- "description": "关于该错误的其他详细信息。",
+ "description": "Additional details about the error.",
"items": {
"type": "object",
"properties": {
"message": {
"type": "string",
- "description": "对某个特定校验或处理错误的说明。"
+ "description": "Description of a specific validation or processing error."
}
},
"required": [
@@ -279,39 +279,39 @@
"properties": {
"conversations": {
"type": "array",
- "description": "AI 助手会话列表。",
+ "description": "List of assistant conversations.",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
- "description": "会话的唯一标识符。"
+ "description": "Unique conversation identifier."
},
"timestamp": {
"type": "string",
- "description": "会话发生时的时间戳。"
+ "description": "Timestamp when the conversation occurred."
},
"query": {
"type": "string",
- "description": "用户向 AI 助手提出的问题。"
+ "description": "The user's question to the assistant."
},
"response": {
"type": "string",
- "description": "AI 助手的回答。"
+ "description": "The assistant's response."
},
"sources": {
"type": "array",
- "description": "在回答中被引用的文档页面。",
+ "description": "Documentation pages referenced in the response.",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
- "description": "被引用文档页面的标题。"
+ "description": "Title of the referenced documentation page."
},
"url": {
"type": "string",
- "description": "被引用文档页面的 URL。"
+ "description": "URL of the referenced documentation page."
}
},
"required": [
@@ -325,7 +325,7 @@
"string",
"null"
],
- "description": "会话自动分配的分类分组(如适用)。"
+ "description": "Auto-assigned category grouping for the conversation, if applicable."
}
},
"required": [
@@ -343,11 +343,11 @@
"string",
"null"
],
- "description": "用于获取下一页结果的游标;如果没有更多结果则为 null。"
+ "description": "Cursor to retrieve the next page of results. Null if no more results."
},
"hasMore": {
"type": "boolean",
- "description": "指示在当前页之外是否还有更多可用结果。"
+ "description": "Whether additional results are available beyond this page."
}
},
"required": [
@@ -355,6 +355,176 @@
"nextCursor",
"hasMore"
]
+ },
+ "TrafficTotals": {
+ "type": "object",
+ "description": "Site-wide traffic totals for the date range.",
+ "properties": {
+ "human": {
+ "type": "number",
+ "description": "Site-wide total from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Site-wide total from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Site-wide total across all traffic."
+ }
+ },
+ "required": [
+ "human",
+ "ai",
+ "total"
+ ]
+ },
+ "ViewsByPageResponse": {
+ "type": "object",
+ "properties": {
+ "totals": {
+ "$ref": "#/components/schemas/TrafficTotals",
+ "description": "Site-wide view totals for the date range."
+ },
+ "views": {
+ "type": "array",
+ "description": "Per-path view counts.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "human": {
+ "type": "number",
+ "description": "Views from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Views from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Views from all traffic."
+ }
+ },
+ "required": [
+ "path",
+ "human",
+ "ai",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "totals",
+ "views",
+ "hasMore"
+ ]
+ },
+ "VisitorsByPageResponse": {
+ "type": "object",
+ "properties": {
+ "totals": {
+ "$ref": "#/components/schemas/TrafficTotals",
+ "description": "Site-wide unique visitor totals for the date range."
+ },
+ "visitors": {
+ "type": "array",
+ "description": "Per-path unique visitor counts.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "human": {
+ "type": "number",
+ "description": "Unique visitors from human traffic."
+ },
+ "ai": {
+ "type": "number",
+ "description": "Unique visitors from AI bot traffic."
+ },
+ "total": {
+ "type": "number",
+ "description": "Approx. distinct visitors with any qualifying view on this path (deduplicated across human and AI)."
+ }
+ },
+ "required": [
+ "path",
+ "human",
+ "ai",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "totals",
+ "visitors",
+ "hasMore"
+ ]
+ },
+ "FeedbackGroupedByPageResponse": {
+ "type": "object",
+ "properties": {
+ "feedback": {
+ "type": "array",
+ "description": "Per-page feedback aggregates.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "path": {
+ "type": "string",
+ "description": "The documentation page path."
+ },
+ "thumbsUp": {
+ "type": "number",
+ "description": "Number of thumbs up ratings on this page."
+ },
+ "thumbsDown": {
+ "type": "number",
+ "description": "Number of thumbs down ratings on this page."
+ },
+ "code": {
+ "type": "number",
+ "description": "Number of code snippet feedback entries on this page."
+ },
+ "total": {
+ "type": "number",
+ "description": "Total feedback count on this page."
+ }
+ },
+ "required": [
+ "path",
+ "thumbsUp",
+ "thumbsDown",
+ "code",
+ "total"
+ ]
+ }
+ },
+ "hasMore": {
+ "type": "boolean",
+ "description": "Whether more results exist beyond this page."
+ }
+ },
+ "required": [
+ "feedback",
+ "hasMore"
+ ]
}
},
"parameters": {
@@ -371,8 +541,8 @@
"paths": {
"/v1/analytics/{projectId}/feedback": {
"get": {
- "summary": "获取用户反馈列表",
- "description": "返回按页划分的用户反馈,并支持可选筛选条件",
+ "summary": "Get user feedback",
+ "description": "Returns paginated user feedback with optional filtering",
"tags": [
"Analytics"
],
@@ -388,7 +558,7 @@
{
"schema": {
"type": "string",
- "description": "ISO 8601 或 YYYY-MM-DD 格式的日期",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
"example": "2024-01-01"
},
"required": false,
@@ -398,7 +568,7 @@
{
"schema": {
"type": "string",
- "description": "ISO 8601 或 YYYY-MM-DD 格式的日期。`dateTo` 为不包含在内的上界。结果包括指定日期之前的所有日期,但不包括指定日期当天。",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
"example": "2024-01-01"
},
"required": false,
@@ -412,7 +582,7 @@
"code_snippet",
"contextual"
],
- "description": "按反馈来源进行筛选"
+ "description": "Filter by feedback source"
},
"required": false,
"name": "source",
@@ -421,7 +591,7 @@
{
"schema": {
"type": "string",
- "description": "用于筛选的以逗号分隔的状态列表"
+ "description": "Comma-separated list of statuses to filter by"
},
"required": false,
"name": "status",
@@ -433,7 +603,7 @@
"minimum": 1,
"maximum": 100,
"default": 50,
- "description": "每页返回的最大结果数"
+ "description": "Max results per page"
},
"required": false,
"name": "limit",
@@ -442,7 +612,7 @@
{
"schema": {
"type": "string",
- "description": "分页游标"
+ "description": "Pagination cursor"
},
"required": false,
"name": "cursor",
@@ -451,7 +621,7 @@
],
"responses": {
"200": {
- "description": "包含分页信息的反馈数据",
+ "description": "Feedback data with pagination",
"content": {
"application/json": {
"schema": {
@@ -461,7 +631,112 @@
}
},
"400": {
- "description": "无效的查询参数",
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/feedback/by-page": {
+ "get": {
+ "summary": "Get feedback grouped by page",
+ "description": "Returns feedback counts (thumbs up/down, code snippets, total) aggregated by page path",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 100,
+ "default": 10,
+ "description": "Max results per page (default 10)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "enum": [
+ "code_snippet",
+ "contextual"
+ ],
+ "description": "Filter by feedback source"
+ },
+ "required": false,
+ "name": "source",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Comma-separated list of statuses to filter by"
+ },
+ "required": false,
+ "name": "status",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Per-page feedback aggregates",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FeedbackGroupedByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
"content": {
"application/json": {
"schema": {
@@ -471,7 +746,7 @@
}
},
"500": {
- "description": "服务器错误",
+ "description": "Server error",
"content": {
"application/json": {
"schema": {
@@ -485,8 +760,8 @@
},
"/v1/analytics/{projectId}/assistant": {
"get": {
- "summary": "获取 AI 助手会话记录",
- "description": "返回分页后的 AI 助手会话历史",
+ "summary": "Get assistant conversations",
+ "description": "Returns paginated AI assistant conversation history",
"tags": [
"Analytics"
],
@@ -502,7 +777,7 @@
{
"schema": {
"type": "string",
- "description": "ISO 8601 或 YYYY-MM-DD 格式的日期",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
"example": "2024-01-01"
},
"required": false,
@@ -512,7 +787,7 @@
{
"schema": {
"type": "string",
- "description": "ISO 8601 或 YYYY-MM-DD 格式的日期。`dateTo` 为不包含在内的上限。结果将包含早于该日期的记录,但不包含该日期当天的记录。",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format. `dateTo` is an exclusive upper limit. Results include dates before, but not on, the specified date.",
"example": "2024-01-01"
},
"required": false,
@@ -525,7 +800,7 @@
"minimum": 1,
"maximum": 1000,
"default": 100,
- "description": "每页返回的最大结果数"
+ "description": "Max results per page"
},
"required": false,
"name": "limit",
@@ -535,7 +810,7 @@
"schema": {
"type": "string",
"format": "ulid",
- "description": "分页游标(ULID 格式)"
+ "description": "Pagination cursor (ULID format)"
},
"required": false,
"name": "cursor",
@@ -544,7 +819,7 @@
],
"responses": {
"200": {
- "description": "包含分页信息的会话数据",
+ "description": "Conversation data with pagination",
"content": {
"application/json": {
"schema": {
@@ -554,7 +829,195 @@
}
},
"400": {
- "description": "无效的查询参数",
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/views": {
+ "get": {
+ "summary": "Get page views by path",
+ "description": "Returns per-path and site-wide content view event counts.",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-31"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 250,
+ "default": 50,
+ "description": "Max results per page (1–250, default 50)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 0,
+ "default": 0,
+ "description": "Number of rows to skip"
+ },
+ "required": false,
+ "name": "offset",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Site-wide totals and per-path view counts",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ViewsByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ },
+ "500": {
+ "description": "Server error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AnalyticsErrorResponse"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/analytics/{projectId}/visitors": {
+ "get": {
+ "summary": "Get unique visitors by page",
+ "description": "Returns per-path and site-wide approximate distinct visitors by traffic type. `total` is deduplicated across human and AI (union of distinct visitor ids with any qualifying content view).",
+ "tags": [
+ "Analytics"
+ ],
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ],
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/projectId"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-01"
+ },
+ "required": false,
+ "name": "dateFrom",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "string",
+ "description": "Date in ISO 8601 or YYYY-MM-DD format",
+ "example": "2024-01-31"
+ },
+ "required": false,
+ "name": "dateTo",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 1,
+ "maximum": 250,
+ "default": 50,
+ "description": "Max results per page (1–250, default 50)"
+ },
+ "required": false,
+ "name": "limit",
+ "in": "query"
+ },
+ {
+ "schema": {
+ "type": "number",
+ "minimum": 0,
+ "default": 0,
+ "description": "Number of rows to skip"
+ },
+ "required": false,
+ "name": "offset",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Site-wide totals and per-path visitor counts",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/VisitorsByPageResponse"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid query parameters",
"content": {
"application/json": {
"schema": {
@@ -564,7 +1027,7 @@
}
},
"500": {
- "description": "服务器错误",
+ "description": "Server error",
"content": {
"application/json": {
"schema": {
diff --git a/zh/api/analytics/feedback-by-page.mdx b/zh/api/analytics/feedback-by-page.mdx
new file mode 100644
index 000000000..5fb4facff
--- /dev/null
+++ b/zh/api/analytics/feedback-by-page.mdx
@@ -0,0 +1,23 @@
+---
+title: "Get feedback by page"
+description: "Retrieve feedback counts aggregated by page path, including thumbs up/down and code snippet counts."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/feedback/by-page
+keywords: ["analytics", "feedback", "by page", "export", "aggregated"]
+---
+
+## Usage
+
+Use this endpoint to export per-page feedback aggregates from your documentation. Each row includes counts for thumbs up, thumbs down, code snippet feedback, and a combined total.
+
+## Response fields
+
+Every item in the response includes:
+- **path**: The documentation page path
+- **thumbsUp**: Number of positive (thumbs up) ratings
+- **thumbsDown**: Number of negative (thumbs down) ratings
+- **code**: Number of code snippet feedback entries
+- **total**: Combined feedback count across all types
+
+## Filtering
+
+Filter results by date range using `dateFrom` and `dateTo`, by feedback source using `source`, and by status using `status`.
diff --git a/zh/api/analytics/views.mdx b/zh/api/analytics/views.mdx
new file mode 100644
index 000000000..94727c967
--- /dev/null
+++ b/zh/api/analytics/views.mdx
@@ -0,0 +1,25 @@
+---
+title: "Get page views"
+description: "Retrieve per-path and site-wide content view event counts."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/views
+keywords: ["analytics", "views", "page views", "export", "traffic"]
+---
+
+## Usage
+
+Use this endpoint to export per-page view counts from your documentation. Each row includes a breakdown of human and AI bot views, plus a combined total.
+
+Paginate through results using offset-based pagination. Increment `offset` by `limit` while `hasMore` is `true`.
+
+## Traffic breakdown
+
+Every response includes:
+- **human**: Views from regular browser traffic
+- **ai**: Views from AI bot crawlers (e.g. GPTBot, ClaudeBot)
+- **total**: Combined view count across all traffic
+
+The `totals` object contains the same breakdown aggregated across your entire site for the selected date range.
+
+## Filtering
+
+Filter views by date range using `dateFrom` and `dateTo` parameters.
diff --git a/zh/api/analytics/visitors.mdx b/zh/api/analytics/visitors.mdx
new file mode 100644
index 000000000..fe7107a71
--- /dev/null
+++ b/zh/api/analytics/visitors.mdx
@@ -0,0 +1,25 @@
+---
+title: "Get unique visitors"
+description: "Retrieve per-path and site-wide approximate distinct visitors by traffic type."
+openapi: /analytics.openapi.json GET /v1/analytics/{projectId}/visitors
+keywords: ["analytics", "visitors", "unique visitors", "export", "traffic"]
+---
+
+## Usage
+
+Use this endpoint to export per-page unique visitor counts from your documentation. Visitors are deduplicated by user ID or anonymous ID.
+
+Paginate through results using offset-based pagination. Increment `offset` by `limit` while `hasMore` is `true`.
+
+## Traffic breakdown
+
+Every response includes:
+- **human**: Unique visitors from regular browser traffic
+- **ai**: Unique visitors from AI bot crawlers (e.g. GPTBot, ClaudeBot)
+- **total**: Combined unique visitor count across all traffic
+
+The `totals` object contains the same breakdown aggregated across your entire site for the selected date range.
+
+## Filtering
+
+Filter visitors by date range using `dateFrom` and `dateTo` parameters.
diff --git a/zh/api/introduction.mdx b/zh/api/introduction.mdx
index b1844beb4..f4fa36982 100644
--- a/zh/api/introduction.mdx
+++ b/zh/api/introduction.mdx
@@ -18,7 +18,10 @@ Mintlify 的 REST(Representational State Transfer)API 让你可以以编程
* [Create assistant message](/zh/api/assistant/create-assistant-message-v2):将基于您的文档训练的 AI 助手嵌入到任意您选择的应用中。
* [搜索文档](/zh/api/assistant/search):搜索您的文档。
* [获取用户反馈](/zh/api/analytics/feedback):从您的文档中导出用户反馈。
+* [获取按页面反馈](/zh/api/analytics/feedback-by-page):导出按页面汇总的反馈统计数据。
* [获取 AI 助手会话](/zh/api/analytics/assistant-conversations):导出 AI 助手的会话历史。
+* [获取页面浏览量](/zh/api/analytics/views):导出每页和全站内容浏览事件计数。
+* [获取独立访客](/zh/api/analytics/visitors):导出每页和全站的近似独立访客数。
### 常见用例
@@ -28,7 +31,7 @@ Mintlify 的 REST(Representational State Transfer)API 让你可以以编程
* **CI/CD 集成**:在代码变更时,将文档更新作为部署流水线的一部分来执行,使用 [Trigger update](/zh/api/update/trigger)。
* **自定义集成**:使用 [Create assistant message](/zh/api/assistant/create-assistant-message-v2) 和 [Search documentation](/zh/api/assistant/search),将 AI 助手嵌入到你的产品、支持门户或内部工具中。
* **自动化编辑**:使用 agent 任务,以编程方式大规模更新文档,配合 [Create agent job](/zh/api/agent/v2/create-agent-job)、[Get agent job](/zh/api/agent/v2/get-agent-job) 和 [Send follow-up message](/zh/api/agent/v2/send-message)。
-* **Analytics 导出**:使用 [Get user feedback](/zh/api/analytics/feedback) 和 [Get assistant conversations](/zh/api/analytics/assistant-conversations),导出反馈和 AI 助手会话以进行外部分析。
+* **Analytics 导出**:使用 [Get user feedback](/zh/api/analytics/feedback)、[获取按页面反馈](/zh/api/analytics/feedback-by-page)、[Get assistant conversations](/zh/api/analytics/assistant-conversations)、[获取页面浏览量](/zh/api/analytics/views) 和 [获取独立访客](/zh/api/analytics/visitors),导出反馈、AI 助手会话、页面浏览量和访客数据以进行外部分析。
## 认证
@@ -42,7 +45,7 @@ Mintlify 的 REST(Representational State Transfer)API 让你可以以编程
### 管理员 API key
-使用管理员 API key 对发送到 [Trigger update](/zh/api/update/trigger)、[Get update status](/zh/api/update/status)、[Create agent job](/zh/api/agent/v2/create-agent-job)、[Get agent job](/zh/api/agent/v2/get-agent-job)、[Send follow-up message](/zh/api/agent/v2/send-message)、[Get user feedback](/zh/api/analytics/feedback) 和 [Get assistant conversations](/zh/api/analytics/assistant-conversations) 的请求进行身份验证。
+使用管理员 API key 对发送到 [Trigger update](/zh/api/update/trigger)、[Get update status](/zh/api/update/status)、[Create agent job](/zh/api/agent/v2/create-agent-job)、[Get agent job](/zh/api/agent/v2/get-agent-job)、[Send follow-up message](/zh/api/agent/v2/send-message)、[Get user feedback](/zh/api/analytics/feedback)、[获取按页面反馈](/zh/api/analytics/feedback-by-page)、[Get assistant conversations](/zh/api/analytics/assistant-conversations)、[获取页面浏览量](/zh/api/analytics/views) 和 [获取独立访客](/zh/api/analytics/visitors) 的请求进行身份验证。
管理员 API key 以 `mint_` 前缀开头。