import type { Metadata } from "next" import { getTranslations, getMessages, setRequestLocale } from "next-intl/server" import { Link } from "@/i18n/navigation" import { DocHeader } from "@/components/ui/doc-header" import { Callout } from "@/components/ui/callout" import CopyableCode from "@/components/CopyableCode" export async function generateMetadata({ params, }: { params: Promise<{ locale: string }> }): Promise { const { locale } = await params const t = await getTranslations({ locale, namespace: "docs.monitor.apiReference.meta" }) return { title: t("title"), description: t("description"), keywords: [ "proxmox api", "proxmox rest api", "proxmox monitor api", "proxmox integration", "proxmox home assistant", "proxmox homepage", "proxmox grafana", "proxmox prometheus endpoint", "proxmox n8n", "proxmox bearer token", "proxmox curl example", "proxmenux api", ], alternates: { canonical: "https://proxmenux.com/docs/monitor/api" }, openGraph: { title: t("ogTitle"), description: t("ogDescription"), type: "article", url: "https://proxmenux.com/docs/monitor/api", }, twitter: { card: "summary", title: t("twitterTitle"), description: t("twitterDescription"), }, } } type EndpointRow = { endpoint: string; method: string; use: string } type WhereNextItem = { label: string; href: string; tail?: string; tailRich?: string } type MetricRow = { metric: string; desc: string } type MetricGroup = { group: string; metrics: MetricRow[] } export default async function MonitorApiPage({ params, }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "docs.monitor.apiReference" }) const messages = (await getMessages({ locale })) as unknown as { docs: { monitor: { apiReference: { auth: { rows: EndpointRow[]; items: string[] } conventions: { items: string[] } system: { rows: EndpointRow[] } health: { rows: EndpointRow[] } storage: { rows: EndpointRow[] } network: { rows: EndpointRow[] } vms: { rows: EndpointRow[] } backups: { rows: EndpointRow[] } logs: { rows: EndpointRow[] } notifications: { rows: EndpointRow[] } security: { rows: EndpointRow[] } proxmenuxIntegration: { rows: EndpointRow[] } prometheus: { groups: MetricGroup[] } whereNext: { items: WhereNextItem[] } } } } } const api = messages.docs.monitor.apiReference const authRows = api.auth.rows const authItems = api.auth.items const conventionsItems = api.conventions.items const systemRows = api.system.rows const healthRows = api.health.rows const storageRows = api.storage.rows const networkRows = api.network.rows const vmsRows = api.vms.rows const backupsRows = api.backups.rows const logsRows = api.logs.rows const notifRows = api.notifications.rows const securityRows = api.security.rows const proxmenuxRows = api.proxmenuxIntegration.rows const metricGroups = api.prometheus.groups const whereNextItems = api.whereNext.items const code = (chunks: React.ReactNode) => {chunks} const strong = (chunks: React.ReactNode) => {chunks} const accessLink = (chunks: React.ReactNode) => ( {chunks} ) const healthLink = (chunks: React.ReactNode) => ( {chunks} ) const notifLink = (chunks: React.ReactNode) => ( {chunks} ) const aiLink = (chunks: React.ReactNode) => ( {chunks} ) const integrationsLink = (chunks: React.ReactNode) => ( {chunks} ) const endpointTable = (rows: EndpointRow[], pathPrefix: string) => (
{rows.map((row, idx) => ( ))}
{t("headerEndpoint")} {t("headerMethod")} {t("headerUse")}
{row.endpoint} {row.method} {t.rich(`${pathPrefix}.${idx}.use`, { code })}
) return (
{t.rich("intro.body", { strong, link: accessLink })}

{t("auth.heading")}

{t("auth.intro")}

" http://:8008/api/system | jq`} className="my-4" />

{t("auth.tokensIntro")}

    {authItems.map((_, idx) => (
  • {t.rich(`auth.items.${idx}`, { strong, code })}
  • ))}

{t.rich("auth.flowLink", { link: accessLink })}

{endpointTable(authRows, "auth.rows")}

{t("conventions.heading")}

    {conventionsItems.map((_, idx) => (
  • {t.rich(`conventions.items.${idx}`, { code })}
  • ))}

{t("system.heading")}

{endpointTable(systemRows, "system.rows")}

{t("health.heading")}

{endpointTable(healthRows, "health.rows")}

{t.rich("health.outro", { link: healthLink })}

{t("storage.heading")}

{endpointTable(storageRows, "storage.rows")}

{t("network.heading")}

{endpointTable(networkRows, "network.rows")}

{t("vms.heading")}

{endpointTable(vmsRows, "vms.rows")}

{t("backups.heading")}

{endpointTable(backupsRows, "backups.rows")}

{t("logs.heading")}

{endpointTable(logsRows, "logs.rows")}

{t("notifications.heading")}

{t.rich("notifications.intro", { notifLink, aiLink })}

{endpointTable(notifRows, "notifications.rows")}

{t("security.heading")}

{endpointTable(securityRows, "security.rows")}

{t("proxmenuxIntegration.heading")}

{endpointTable(proxmenuxRows, "proxmenuxIntegration.rows")}

{t("prometheus.heading")}

{t.rich("prometheus.intro", { code })}

{t("prometheus.exportedTitle")}

{metricGroups.flatMap((group, gIdx) => group.metrics.map((m, mIdx) => ( {mIdx === 0 && ( )} )) )}
{t("prometheus.headerGroup")} {t("prometheus.headerMetric")} {t("prometheus.headerDesc")}
{group.group} {m.metric} {t.rich(`prometheus.groups.${gIdx}.metrics.${mIdx}.desc`, { code })}

{t("prometheus.scrapeTitle")}

{t("prometheus.scrapeIntro")}

' static_configs: - targets: - 'pve01.lan:8008' - 'pve02.lan:8008' - 'pve03.lan:8008'`} className="my-4" /> {t.rich("prometheus.perHostBody", { code })}

{t("puttingItTogether.heading")}

{t.rich("puttingItTogether.body", { link: integrationsLink })}

{t("whereNext.heading")}

    {whereNextItems.map((item, idx) => (
  • {item.label} {item.tailRich ? t.rich(`whereNext.items.${idx}.tailRich`, { code }) : item.tail}
  • ))}
) }