diff --git a/.gitignore b/.gitignore
index 868814232..7a973e311 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,6 +22,10 @@ package-lock.json
/content/influxdb3/*/reference/api/**
/static/openapi
+# Exception: hand-crafted API conceptual pages (not generated)
+!/content/influxdb3/*/api/administration/
+!/content/influxdb3/*/api/administration/_index.md
+
/helper-scripts/output/*
/telegraf-build
!telegraf-build/templates
diff --git a/content/influxdb3/core/api/administration/_index.md b/content/influxdb3/core/api/administration/_index.md
new file mode 100644
index 000000000..ba791c152
--- /dev/null
+++ b/content/influxdb3/core/api/administration/_index.md
@@ -0,0 +1,26 @@
+---
+title: Administration
+description: Endpoints for managing databases, tables, and tokens.
+type: api
+layout: list
+weight: 105
+isConceptual: true
+---
+
+Use the Administration API to manage InfluxDB resources:
+
+
+
+### [Database](/influxdb3/core/api/database/)
+
+Create, list, and delete databases.
+
+### [Table](/influxdb3/core/api/table/)
+
+Create and delete tables within databases.
+
+### [Token](/influxdb3/core/api/token/)
+
+Manage authentication tokens for API access.
+
+
diff --git a/content/influxdb3/enterprise/api/administration/_index.md b/content/influxdb3/enterprise/api/administration/_index.md
new file mode 100644
index 000000000..833443bd4
--- /dev/null
+++ b/content/influxdb3/enterprise/api/administration/_index.md
@@ -0,0 +1,26 @@
+---
+title: Administration
+description: Endpoints for managing databases, tables, and tokens.
+type: api
+layout: list
+weight: 105
+isConceptual: true
+---
+
+Use the Administration API to manage InfluxDB resources:
+
+
+
+### [Database](/influxdb3/enterprise/api/database/)
+
+Create, list, and delete databases.
+
+### [Table](/influxdb3/enterprise/api/table/)
+
+Create and delete tables within databases.
+
+### [Token](/influxdb3/enterprise/api/token/)
+
+Manage authentication tokens for API access.
+
+
diff --git a/data/api_nav_groups.yml b/data/api_nav_groups.yml
index 9598e548c..637284c7e 100644
--- a/data/api_nav_groups.yml
+++ b/data/api_nav_groups.yml
@@ -1,6 +1,12 @@
# API Navigation Groups
# Defines sidebar navigation structure for API reference documentation
# Tags are grouped by function/task for better UX
+#
+# Group fields:
+# name: Display name in the navigation
+# weight: Sort order (lower = higher)
+# tags: List of tag names that belong to this group
+# url: (optional) URL path suffix for the group page (relative to api/)
groups:
- name: Concepts
@@ -27,6 +33,7 @@ groups:
- name: Administration
weight: 5
+ url: administration
tags:
- Database
- Table
diff --git a/layouts/partials/sidebar/api-menu-items.html b/layouts/partials/sidebar/api-menu-items.html
new file mode 100644
index 000000000..2850e2656
--- /dev/null
+++ b/layouts/partials/sidebar/api-menu-items.html
@@ -0,0 +1,216 @@
+{{/*
+ API Reference Menu Items for Hugo Navigation
+
+ Generates elements matching Hugo's menu structure.
+ Used by nested-menu.html when rendering "InfluxDB HTTP API" menu item.
+
+ Parameters:
+ - page: Current page context
+ - url: URL of the API parent page (e.g., /influxdb3/core/api/)
+
+ Uses data from:
+ - data/article_data/influxdb/{product}/articles.yml
+ - data/api_nav_groups.yml
+*/}}
+
+{{ $currentPage := .page }}
+{{ $apiUrl := .url }}
+
+{{/* Extract product and version from API URL */}}
+{{ $productPathData := findRE "[^/]+.*?" $apiUrl }}
+{{ $product := index $productPathData 0 }}
+{{ $version := index $productPathData 1 }}
+
+{{/* Build data key for article data lookup */}}
+{{ $dataKey := "" }}
+{{ if eq $product "influxdb3" }}
+ {{ $dataKey = print "influxdb3_" $version }}
+{{ else if eq $product "influxdb" }}
+ {{ $dataKey = print $version }}
+{{ else }}
+ {{ $dataKey = $product }}
+{{ end }}
+
+{{/* Get article data for this product */}}
+{{ $siteData := .siteData }}
+{{ $articles := slice }}
+{{/* Data path: data/article_data/influxdb/{dataKey}/articles.yml -> siteData.article_data.influxdb.{dataKey}.articles.articles */}}
+{{ with $siteData.article_data }}
+ {{ with index . "influxdb" }}
+ {{ with index . $dataKey }}
+ {{ with index . "articles" }}
+ {{ with .articles }}
+ {{ $articles = . }}
+ {{ end }}
+ {{ end }}
+ {{ end }}
+ {{ end }}
+{{ end }}
+
+{{/* Get navigation groups configuration */}}
+{{ $navGroups := $siteData.api_nav_groups.groups }}
+
+{{/* Check if articles use tag-based structure */}}
+{{ $isTagBased := false }}
+{{ if gt (len $articles) 0 }}
+ {{ $firstArticle := index $articles 0 }}
+ {{ if reflect.IsMap $firstArticle }}
+ {{ with index $firstArticle "fields" }}
+ {{ if reflect.IsMap . }}
+ {{ if isset . "tag" }}
+ {{ $isTagBased = true }}
+ {{ end }}
+ {{ end }}
+ {{ end }}
+ {{ end }}
+{{ end }}
+
+{{ if and (gt (len $articles) 0) $navGroups $isTagBased }}
+ {{/* Build a map of tag slug -> article for quick lookup */}}
+ {{ $articlesByTag := dict }}
+ {{ range $articles }}
+ {{ if and (reflect.IsMap .) (isset . "fields") }}
+ {{ $fields := index . "fields" }}
+ {{ if and (reflect.IsMap $fields) (isset $fields "tag") }}
+ {{ $tag := index $fields "tag" }}
+ {{ $articlesByTag = merge $articlesByTag (dict $tag .) }}
+ {{ end }}
+ {{ end }}
+ {{ end }}
+
+ {{/* Render navigation groups */}}
+ {{ range $groupIdx, $group := $navGroups }}
+ {{ $groupTags := $group.tags }}
+ {{ $groupHasArticles := false }}
+
+ {{/* Check if any tags in this group have articles */}}
+ {{ range $groupTags }}
+ {{ if index $articlesByTag . }}
+ {{ $groupHasArticles = true }}
+ {{ end }}
+ {{ end }}
+
+ {{ if $groupHasArticles }}
+ {{/* Count actual articles in this group */}}
+ {{ $articlesInGroup := slice }}
+ {{ range $groupTags }}
+ {{ $article := index $articlesByTag . }}
+ {{ if $article }}
+ {{ $articlesInGroup = $articlesInGroup | append $article }}
+ {{ end }}
+ {{ end }}
+ {{ $isSingleTag := eq (len $articlesInGroup) 1 }}
+
+ {{/* Check if this group should be open (contains active page) */}}
+ {{ $groupIsOpen := false }}
+ {{ range $articlesInGroup }}
+ {{ $path := index . "path" }}
+ {{ $pageUrl := print "/" $product "/" $version "/" $path "/" }}
+ {{ if eq $currentPage.RelPermalink $pageUrl }}
+ {{ $groupIsOpen = true }}
+ {{ end }}
+ {{ end }}
+
+ {{ if $isSingleTag }}
+ {{/* Single tag group: direct link to tag page with operations as children */}}
+ {{ $article := index $articlesInGroup 0 }}
+ {{ $path := index $article "path" }}
+ {{ $fields := index $article "fields" }}
+ {{ $tagPageUrl := print "/" $product "/" $version "/" $path "/" | relURL }}
+ {{ $isActive := eq $currentPage.RelPermalink (print "/" $product "/" $version "/" $path "/") }}
+ {{ $operations := slice }}
+ {{ if and (reflect.IsMap $fields) (isset $fields "operations") }}
+ {{ $operations = index $fields "operations" }}
+ {{ end }}
+ {{ $hasOperations := gt (len $operations) 0 }}
+
+
+ {{ if $hasOperations }}{{ end }}
+ {{ $group.name }}
+ {{ if $hasOperations }}
+
+ {{ range $operations }}
+ {{ $apiPath := .path }}
+ {{ $trimmedPath := strings.TrimPrefix "/" $apiPath }}
+ {{ $contentPath := $trimmedPath }}
+ {{ if not (hasPrefix $trimmedPath "api/") }}
+ {{ $contentPath = printf "api/%s" $trimmedPath }}
+ {{ end }}
+ {{ $fragment := printf "#operation/%s" .operationId }}
+ {{ $fullUrl := printf "%s%s" (print "/" $product "/" $version "/" $contentPath "/" | relURL) $fragment }}
+ -
+
+ {{ upper .method }}
+ {{ with .summary }}{{ . }}{{ else }}
{{ $apiPath }}{{ end }}
+
+
+ {{ end }}
+
+ {{ end }}
+
+
+ {{ else }}
+ {{/* Multi-tag group: group label (or link if url defined) with tag pages as children */}}
+ {{ $groupUrl := "" }}
+ {{ $groupIsActive := false }}
+ {{ with $group.url }}
+ {{ $groupUrl = print "/" $product "/" $version "/api/" . "/" | relURL }}
+ {{ $groupIsActive = eq $currentPage.RelPermalink (print "/" $product "/" $version "/api/" . "/") }}
+ {{ end }}
+
+
+ {{ if $groupUrl }}
+ {{ $group.name }}
+ {{ else }}
+ {{ $group.name }}
+ {{ end }}
+
+ {{ range $tagIdx, $tagName := $groupTags }}
+ {{ $article := index $articlesByTag $tagName }}
+ {{ if $article }}
+ {{ $path := index $article "path" }}
+ {{ $fields := index $article "fields" }}
+ {{ $tagPageUrl := print "/" $product "/" $version "/" $path "/" | relURL }}
+ {{ $isActive := eq $currentPage.RelPermalink (print "/" $product "/" $version "/" $path "/") }}
+ {{ $operations := slice }}
+ {{ if and (reflect.IsMap $fields) (isset $fields "operations") }}
+ {{ $operations = index $fields "operations" }}
+ {{ end }}
+ {{ $menuName := $tagName }}
+ {{ if and (reflect.IsMap $fields) (isset $fields "menuName") }}
+ {{ $menuName = index $fields "menuName" }}
+ {{ end }}
+ {{ $hasOperations := gt (len $operations) 0 }}
+
+ -
+ {{ if $hasOperations }}{{ end }}
+ {{ $menuName }}
+ {{ if $hasOperations }}
+
+ {{ range $operations }}
+ {{ $apiPath := .path }}
+ {{ $trimmedPath := strings.TrimPrefix "/" $apiPath }}
+ {{ $contentPath := $trimmedPath }}
+ {{ if not (hasPrefix $trimmedPath "api/") }}
+ {{ $contentPath = printf "api/%s" $trimmedPath }}
+ {{ end }}
+ {{ $fragment := printf "#operation/%s" .operationId }}
+ {{ $fullUrl := printf "%s%s" (print "/" $product "/" $version "/" $contentPath "/" | relURL) $fragment }}
+ -
+
+ {{ upper .method }}
+ {{ with .summary }}{{ . }}{{ else }}
{{ $apiPath }}{{ end }}
+
+
+ {{ end }}
+
+ {{ end }}
+
+ {{ end }}
+ {{ end }}
+
+
+ {{ end }}
+ {{ end }}
+ {{ end }}
+{{ end }}
diff --git a/layouts/partials/sidebar/nested-menu.html b/layouts/partials/sidebar/nested-menu.html
index 67cf9a1e0..12dd9eec1 100644
--- a/layouts/partials/sidebar/nested-menu.html
+++ b/layouts/partials/sidebar/nested-menu.html
@@ -1,22 +1,39 @@
{{ $page := .page }}
{{ $menu := .menu }}
+{{ $siteData := .siteData }}
{{ define "recursiveMenu" }}
{{ $menuContext := .menu }}
{{ $currentPage := .currentPage }}
+ {{ $site := .site }}
+ {{ $siteData := .siteData }}
{{ $depth := add .depth 1 }}
{{ $navClass := cond (gt $depth 1) "item" "category" }}
{{ range $menuContext }}
+ {{/* Check if this is the InfluxDB HTTP API menu item for InfluxDB 3 products */}}
+ {{ $isApiParent := and (eq .Name "InfluxDB HTTP API") (or (hasPrefix .URL "/influxdb3/") (hasPrefix .URL "/influxdb/")) }}
+
- {{ if .HasChildren }}{{ end }}
- {{ .Name }}
- {{ if .HasChildren }}
-
{{ end }}
{{ end }}
-{{ template "recursiveMenu" (dict "menu" .menu "currentPage" .page "depth" 0) }}
+{{ template "recursiveMenu" (dict "menu" .menu "currentPage" .page "site" $page.Site "siteData" $siteData "depth" 0) }}