Dokumentation
Analytik
Anwendungsmetriken, aktuelle Aktivitäten, Nutzungsabfragen und Tracking-Anfragen.
Automatisch aus dem Englischen übersetzt. Englisches Original ansehen
Senden Sie diese Anfragen an Ihren eigenen laufenden Sidecar. Werte bleiben in diesem Browser.
Wie das funktioniert
Der Sidecar lauscht an einem beim Start ausgewählten Loopback-Port und gibt ihn dort aus ready linie; Verwenden Sie diese URL und die CADCAMFUN_TOKEN es wurde damit begonnen. Anfragen gehen direkt von dieser Seite an diese Adresse.
Der Sidecar sendet CORS-Header nur an die Tauri-Ursprünge und an http://localhost oder http://127.0.0.1 auf jedem Port. Von den gehosteten Dokumenten aus blockiert der Browser die Antwort, also führen Sie die Dokumente lokal aus (bun run dev in packages/web), um den Spielplatz zu nutzen, oder kopieren Sie die Anfrage als Curl. Um zu experimentieren, ohne echte Daten zu berühren, starten Sie den Sidecar mit CADCAMFUN_DATA_DIR zeigte auf ein Wegwerfverzeichnis – siehe die API-Komplettlösung.
Operationen
10 Endpunkte in der analytics gruppe, generiert aus der eigenen Gruppe des Sidecars OpenAPI-Dokument. Geschützte Operationen dauern Authorization: Bearer $CADCAMFUN_TOKEN; sehen authentifizierung. Verhalten und Grenzen sind in das Subsystemhandbuch.
| erhalten | /api/analytics/system-metrics | analytics.systemMetrics |
| erhalten | /api/analytics | analytics.index |
| erhalten | /api/analytics/dashboard-data | analytics.dashboardData |
| post | /api/analytics/log-view | analytics.logView |
| erhalten | /api/analytics/recent-activity | analytics.recentActivity |
| erhalten | /api/analytics/user-history | analytics.userHistory |
| erhalten | /api/analytics/user-metrics | analytics.userMetrics |
| erhalten | /api/analytics/user-usage | analytics.userUsage |
| löschen | /api/analytics/user-usage | analytics.clearUserUsage |
| post | /api/analytics/track | analytics.track |
/api/analytics/system-metrics
analytics.systemMetrics Erfordert Authorization: Bearer <token>.
200 objekt application/json
{ cpuUsage: number | "Infinity" | "-Infinity" | "NaN" memoryUsage: number | "Infinity" | "-Infinity" | "NaN" storageUsed: number | "Infinity" | "-Infinity" | "NaN" networkLatency: number | "Infinity" | "-Infinity" | "NaN" activeConnections: number | "Infinity" | "-Infinity" | "NaN" cacheHitRatio: number | "Infinity" | "-Infinity" | "NaN" errorRate: number | "Infinity" | "-Infinity" | "NaN" responseTime: number | "Infinity" | "-Infinity" | "NaN" }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
{
"cpuUsage": 6,
"memoryUsage": 79,
"storageUsed": 72,
"networkLatency": 15,
"activeConnections": 145,
"cacheHitRatio": 98,
"errorRate": 0.04,
"responseTime": 52
} SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// no input
const result = await client.analytics.systemMetrics() curl
curl --request GET "${CADCAMFUN_URL}/api/analytics/system-metrics" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Probieren Sie es aus
/api/analytics
analytics.index Erfordert Authorization: Bearer <token>.
| Name | In | Typ | Erforderlich |
|---|---|---|---|
| startDate | abfrage | zeichenfolge | null | optional |
| endDate | abfrage | zeichenfolge | null | optional |
| itemType | abfrage | zeichenfolge | zeichenfolge[] | null | optional |
| aktion | abfrage | zeichenfolge | zeichenfolge[] | null | optional |
| groupBy | abfrage | zeichenfolge | null | optional |
| userFilter | abfrage | zeichenfolge | zeichenfolge[] | null | optional |
200 objekt application/json
{ success: true data: { countByType: Array<{ itemType: string _count: number | "Infinity" | "-Infinity" | "NaN" }> countByAction: Array<{ action: string _count: number | "Infinity" | "-Infinity" | "NaN" }> } isAdmin: boolean filters: unknown }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 AnalyticsFailureEncoded application/json
AnalyticsFailureEncoded
Beispielantwort erfasst · 200
{
"success": true,
"data": {
"countByType": [],
"countByAction": []
},
"isAdmin": true,
"filters": {
"groupBy": "day"
}
} SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// AnalyticsIndexInput
const result = await client.analytics.index({}) curl
curl --request GET "${CADCAMFUN_URL}/api/analytics" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Probieren Sie es aus
/api/analytics/dashboard-data
analytics.dashboardData Erfordert Authorization: Bearer <token>.
200 objekt application/json
{ components: { total: number | "Infinity" | "-Infinity" | "NaN" trend: number | "Infinity" | "-Infinity" | "NaN" recentActivity: number | "Infinity" | "-Infinity" | "NaN" } projects: { total: number | "Infinity" | "-Infinity" | "NaN" trend: number | "Infinity" | "-Infinity" | "NaN" activeProjects: number | "Infinity" | "-Infinity" | "NaN" } tools: { total: number | "Infinity" | "-Infinity" | "NaN" trend: number | "Infinity" | "-Infinity" | "NaN" mostUsed: string } materials: { total: number | "Infinity" | "-Infinity" | "NaN" trend: number | "Infinity" | "-Infinity" | "NaN" lowStock: number | "Infinity" | "-Infinity" | "NaN" } }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
{
"components": {
"total": 0,
"trend": 0,
"recentActivity": 0
},
"projects": {
"total": 0,
"trend": 0,
"activeProjects": 0
},
"tools": {
"total": 0,
"trend": 0,
"mostUsed": "No tools used yet"
},
"materials": {
"total": 0,
"trend": 0,
"lowStock": 0
}
} SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// no input
const result = await client.analytics.dashboardData() curl
curl --request GET "${CADCAMFUN_URL}/api/analytics/dashboard-data" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Probieren Sie es aus
/api/analytics/log-view
analytics.logView Erfordert Authorization: Bearer <token>.
{ path?: string | null query?: unknown | null }
200 objekt application/json
{ success: true }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// AnalyticsLogViewInput
const result = await client.analytics.logView({
path: "",
query: null
}) curl
curl --request POST "${CADCAMFUN_URL}/api/analytics/log-view" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Probieren Sie es aus
/api/analytics/recent-activity
analytics.recentActivity Erfordert Authorization: Bearer <token>.
| Name | In | Typ | Erforderlich |
|---|---|---|---|
| limit | abfrage | zeichenfolge | null | optional |
200 Array<Objekt> application/json
Array<{ id: string type: string action: string itemName: string timestamp: string userId: string userName: string }>
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
[] SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// AnalyticsRecentActivityInput
const result = await client.analytics.recentActivity({}) curl
curl --request GET "${CADCAMFUN_URL}/api/analytics/recent-activity" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Probieren Sie es aus
/api/analytics/user-history
analytics.userHistory Erfordert Authorization: Bearer <token>.
| Name | In | Typ | Erforderlich |
|---|---|---|---|
| limit | abfrage | zeichenfolge | null | optional |
| versetzt | abfrage | zeichenfolge | null | optional |
| itemType | abfrage | zeichenfolge | zeichenfolge[] | null | optional |
| aktion | abfrage | zeichenfolge | zeichenfolge[] | null | optional |
| startDate | abfrage | zeichenfolge | null | optional |
| endDate | abfrage | zeichenfolge | null | optional |
200 objekt application/json
{ logs: unknown[] total: number | "Infinity" | "-Infinity" | "NaN" }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Beispielantwort erfasst · 200
{
"logs": [],
"total": 0
} SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// AnalyticsUserHistoryInput
const result = await client.analytics.userHistory({}) curl
curl --request GET "${CADCAMFUN_URL}/api/analytics/user-history" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Probieren Sie es aus
/api/analytics/user-metrics
analytics.userMetrics Erfordert Authorization: Bearer <token>.
| Name | In | Typ | Erforderlich |
|---|---|---|---|
| startDate | abfrage | zeichenfolge | null | optional |
| endDate | abfrage | zeichenfolge | null | optional |
| groupBy | abfrage | zeichenfolge | null | optional |
| metrisch | abfrage | zeichenfolge | null | optional |
200 objekt application/json
{ summary: { totalAiRequests: number | "Infinity" | "-Infinity" | "NaN" totalCadDrawings: number | "Infinity" | "-Infinity" | "NaN" totalStorageUsage: number | "Infinity" | "-Infinity" | "NaN" totalProjects: number | "Infinity" | "-Infinity" | "NaN" totalComponents: number | "Infinity" | "-Infinity" | "NaN" totalToolpaths: number | "Infinity" | "-Infinity" | "NaN" totalActivityCount?: number | "Infinity" | "-Infinity" | "NaN" | null } chartData: Array<{ [key: string]: string | number | "Infinity" | "-Infinity" | "NaN" }> }
400 AnalyticsKeyedBadRequestEncoded application/json
AnalyticsKeyedBadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
{
"summary": {
"totalAiRequests": 0,
"totalCadDrawings": 0,
"totalStorageUsage": 0,
"totalProjects": 0,
"totalComponents": 0,
"totalToolpaths": 0,
"totalActivityCount": 0
},
"chartData": [
{
"date": "2026-09-15",
"activityCount": 0,
"toolpathsGenerated": 0,
"connections": 0,
"programRuns": 0,
"aiRequests": 0,
"cadDrawings": 0,
"storageUsage": 0,
"projects": 0,
"components": 0,
"toolpaths": 0
},
{
"date": "2026-09-16",
"activityCount": 0,
"toolpathsGenerated": 0,
"connections": 0,
"programRuns": 0,
"aiRequests": 0,
"cadDrawings": 0,
"storageUsage": 0,
"projects": 0,
"components": 0,
"toolpaths": 0
},
{
"date": "2026-09-17",
"activityCount": 0,
"toolpathsGenerated": 0,
"connections": 0,
"programRuns": 0,
"aiRequests": 0,
"cadDrawings": 0,
"storageUsage": 0,
"projects": 0,
"components": 0,
"toolpaths": 0
},
{
"date": "2026-09-18",
"activityCount": 0,
"toolpathsGenerated": 0,
"connections": 0,
"programRuns": 0,
"aiRequests": 0,
"cadDrawings": 0,
"storageUsage": 0,
"projects": 0,
"components": 0,
"toolpaths": 0
},
{
"date": "2026-09-19",
"activityCount": 0,
"toolpathsGenerated": 0,
"connections": 0,
"programRuns": 0,
"aiRequests": 0,
"cadDrawings": 0,
"storageUsage": 0,
"projects": 0,
"components": 0,
"toolpaths": 0
},
{
"date": "2026-09-20",
"activityCount": 0,
"toolpathsGenerated": 0,
"connections": 0,
"programRuns": 0,
"aiRequests": 0,
"cadDrawings": 0,
"storageUsage": 0,
"projects": 0,
"components": 0,
"toolpaths": 0
},
{
"date": "2026-09-21",
"activityCount": 0,
"toolpathsGenerated": 0,
"connections": 0,
"programRuns": 0,
"aiRequests": 0,
"cadDrawings": 0,
"storageUsage": 0,
"projects": 0,
"components": 0,
"toolpaths": 0
},
{
"date": "2026-09-22",
"activityCount": 0,
"toolpathsGenerated": 0,
"connections": 0,
"programRuns": 0,
"aiRequests": 0,
"cadDrawings": 0,
"storageUsage": 0,
"projects": 0,
"components": 0,
"toolpaths": 0
},
{
"
… SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// AnalyticsUserMetricsInput
const result = await client.analytics.userMetrics({}) curl
curl --request GET "${CADCAMFUN_URL}/api/analytics/user-metrics" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Probieren Sie es aus
/api/analytics/user-usage
analytics.userUsage Erfordert Authorization: Bearer <token>.
| Name | In | Typ | Erforderlich |
|---|---|---|---|
| userId | abfrage | zeichenfolge | null | optional |
| startDate | abfrage | zeichenfolge | null | optional |
| endDate | abfrage | zeichenfolge | null | optional |
| zeitraum | abfrage | zeichenfolge | null | optional |
200 objekt application/json
{ summary?: unknown | null breakdown?: unknown | null users?: unknown[] | null systemStats?: unknown | null }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
403 AnalyticsKeyedForbiddenEncoded application/json
AnalyticsKeyedForbiddenEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
Beispielantwort erfasst · 200
{
"users": [],
"systemStats": {
"totalUsers": 0,
"totalTokens": 0,
"totalCost": 0,
"totalRequests": 0,
"averageCostPerUser": 0,
"topSpendingUsers": [],
"modelDistribution": {}
}
} SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// AnalyticsUserUsageInput
const result = await client.analytics.userUsage({}) curl
curl --request GET "${CADCAMFUN_URL}/api/analytics/user-usage" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Probieren Sie es aus
analytics.clearUserUsage Erfordert Authorization: Bearer <token>.
200 objekt application/json
{ message: string }
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 KeyedInternalEncoded application/json
KeyedInternalEncoded
SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// no input
const result = await client.analytics.clearUserUsage() curl
curl --request DELETE "${CADCAMFUN_URL}/api/analytics/user-usage" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" Probieren Sie es aus
/api/analytics/track
analytics.track Erfordert Authorization: Bearer <token>.
{ itemId?: string | null itemType?: string | null action?: string | null details?: unknown | null }
200 objekt application/json
{ success: true }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
SDK-Beispiel
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// AnalyticsTrackInput
const result = await client.analytics.track({
itemId: "",
itemType: "",
action: "",
details: null
}) curl
curl --request POST "${CADCAMFUN_URL}/api/analytics/track" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Probieren Sie es aus
Schemata
Benannte Schemata, die über die Parameter, Körper und Antworten dieser Gruppe erreichbar sind. A ? markiert ein optionales Feld; | null markiert ein Feld, das möglicherweise mit einem Nullwert vorhanden ist.
AnalyticsFailureEncoded{ _tag: "AnalyticsFailure" success: false message: string }
AnalyticsKeyedBadRequestEncoded{ _tag: "AnalyticsKeyedBadRequest" error: string }
AnalyticsKeyedForbiddenEncoded{ _tag: "AnalyticsKeyedForbidden" error: string }
BadRequestEncoded{ _tag: "BadRequest" message: string }
InternalErrorEncoded{ _tag: "InternalError" message: string }
KeyedInternalEncoded{ _tag: "KeyedInternal" error: string }
Ich rufe diese Gruppe an
Vorgangs-IDs haben die Form analytics.<name>. Das generierte Promise SDK (@cadcamfun/api/sdk) entlarvt die meisten von ihnen als client.<namespace>.<method>(input), wo input ist ein flaches Objekt aus Pfadparametern und Körperfeldern; Das SDK-Beispiel jeder Karte zeigt den genauen Zugriffs- und Eingabetyp. Mehrteilige Uploads, Binär- oder JavaScript-Antworten und unformatierte Webhooks werden nicht generiert; Diese Karten zeigen fetch stattdessen.
import { CadCam, ClientError } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
try {
await client.projects.list()
} catch (error) {
if (error instanceof ClientError) {
// Transport | UnexpectedStatus | UnsupportedContentType | MalformedResponse | SseEventTooLarge
} else {
// a declared error body: switch on error._tag
}
} Fehlerbehebung
| Symptom | Wahrscheinliche Ursache | Fix |
|---|---|---|
| 401 bei jedem Aufruf | Token von einem früheren Start oder fehlt Bearer präfix | Schicken Authorization: Bearer <token> mit dem Token wurde der Sidecar gestartet. |
| 400 bevor etwas passiert | Text oder Parameter stimmen nicht mit dem Schema überein | Vergleichen Sie die Nutzlast mit dem Anforderungsschema auf der Karte. |
| 403 oder 404 bei einem Datensatz, den du woanders siehst | Das amtierende Konto ist unterschiedlich | Schicken Sie das Richtige x-session-token, oder verwenden Sie das lokale Profil, das Eigentümer des Datensatzes ist. |
| 409 | Widersprüchlicher Status, z. B. ein doppelter Name oder ein veralteter Zweigkopf | Lesen Sie die Ressource erneut und versuchen Sie es erneut mit den aktuellen Daten. |
| Versuchen Sie es mit der Meldung „Von CORS blockiert“. | Die Dokumente werden von einem Nicht-Loopback-Ursprung bereitgestellt | Führen Sie die Dokumente lokal aus oder kopieren Sie die Anfrage als Curl. |
| Verbindung abgelehnt | Der Sidecar wurde an einem neuen Port neu gestartet | Lesen Sie den Port neu ready Zeile. |