@nordsym/apiclaw 1.5.6 → 1.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/convex/_generated/api.d.ts +2 -0
  2. package/convex/adminActivate.d.ts +3 -0
  3. package/convex/adminActivate.d.ts.map +1 -0
  4. package/convex/adminActivate.js +47 -0
  5. package/convex/adminActivate.js.map +1 -0
  6. package/convex/adminStats.d.ts +3 -0
  7. package/convex/adminStats.d.ts.map +1 -0
  8. package/convex/adminStats.js +42 -0
  9. package/convex/adminStats.js.map +1 -0
  10. package/convex/adminStats.ts +44 -0
  11. package/convex/agents.d.ts +54 -0
  12. package/convex/agents.d.ts.map +1 -0
  13. package/convex/agents.js +499 -0
  14. package/convex/agents.js.map +1 -0
  15. package/convex/analytics.d.ts +5 -0
  16. package/convex/analytics.d.ts.map +1 -0
  17. package/convex/analytics.js +166 -0
  18. package/convex/analytics.js.map +1 -0
  19. package/convex/billing.d.ts +88 -0
  20. package/convex/billing.d.ts.map +1 -0
  21. package/convex/billing.js +655 -0
  22. package/convex/billing.js.map +1 -0
  23. package/convex/capabilities.d.ts +9 -0
  24. package/convex/capabilities.d.ts.map +1 -0
  25. package/convex/capabilities.js +145 -0
  26. package/convex/capabilities.js.map +1 -0
  27. package/convex/chains.d.ts +67 -0
  28. package/convex/chains.d.ts.map +1 -0
  29. package/convex/chains.js +1042 -0
  30. package/convex/chains.js.map +1 -0
  31. package/convex/credits.d.ts +25 -0
  32. package/convex/credits.d.ts.map +1 -0
  33. package/convex/credits.js +186 -0
  34. package/convex/credits.js.map +1 -0
  35. package/convex/crons.d.ts +3 -0
  36. package/convex/crons.d.ts.map +1 -0
  37. package/convex/crons.js +17 -0
  38. package/convex/crons.js.map +1 -0
  39. package/convex/directCall.d.ts +72 -0
  40. package/convex/directCall.d.ts.map +1 -0
  41. package/convex/directCall.js +627 -0
  42. package/convex/directCall.js.map +1 -0
  43. package/convex/earnProgress.d.ts +58 -0
  44. package/convex/earnProgress.d.ts.map +1 -0
  45. package/convex/earnProgress.js +649 -0
  46. package/convex/earnProgress.js.map +1 -0
  47. package/convex/email.d.ts +14 -0
  48. package/convex/email.d.ts.map +1 -0
  49. package/convex/email.js +300 -0
  50. package/convex/email.js.map +1 -0
  51. package/convex/feedback.d.ts +7 -0
  52. package/convex/feedback.d.ts.map +1 -0
  53. package/convex/feedback.js +227 -0
  54. package/convex/feedback.js.map +1 -0
  55. package/convex/http.d.ts +3 -0
  56. package/convex/http.d.ts.map +1 -0
  57. package/convex/http.js +902 -0
  58. package/convex/http.js.map +1 -0
  59. package/convex/logs.d.ts +38 -0
  60. package/convex/logs.d.ts.map +1 -0
  61. package/convex/logs.js +487 -0
  62. package/convex/logs.js.map +1 -0
  63. package/convex/logs.ts +6 -1
  64. package/convex/mou.d.ts +6 -0
  65. package/convex/mou.d.ts.map +1 -0
  66. package/convex/mou.js +82 -0
  67. package/convex/mou.js.map +1 -0
  68. package/convex/providerKeys.d.ts +31 -0
  69. package/convex/providerKeys.d.ts.map +1 -0
  70. package/convex/providerKeys.js +257 -0
  71. package/convex/providerKeys.js.map +1 -0
  72. package/convex/providers.d.ts +29 -0
  73. package/convex/providers.d.ts.map +1 -0
  74. package/convex/providers.js +756 -0
  75. package/convex/providers.js.map +1 -0
  76. package/convex/purchases.d.ts +7 -0
  77. package/convex/purchases.d.ts.map +1 -0
  78. package/convex/purchases.js +157 -0
  79. package/convex/purchases.js.map +1 -0
  80. package/convex/ratelimit.d.ts +4 -0
  81. package/convex/ratelimit.d.ts.map +1 -0
  82. package/convex/ratelimit.js +91 -0
  83. package/convex/ratelimit.js.map +1 -0
  84. package/convex/schema.ts +2 -0
  85. package/convex/searchLogs.d.ts +4 -0
  86. package/convex/searchLogs.d.ts.map +1 -0
  87. package/convex/searchLogs.js +129 -0
  88. package/convex/searchLogs.js.map +1 -0
  89. package/convex/spendAlerts.d.ts +36 -0
  90. package/convex/spendAlerts.d.ts.map +1 -0
  91. package/convex/spendAlerts.js +380 -0
  92. package/convex/spendAlerts.js.map +1 -0
  93. package/convex/stripeActions.d.ts +19 -0
  94. package/convex/stripeActions.d.ts.map +1 -0
  95. package/convex/stripeActions.js +411 -0
  96. package/convex/stripeActions.js.map +1 -0
  97. package/convex/teams.d.ts +21 -0
  98. package/convex/teams.d.ts.map +1 -0
  99. package/convex/teams.js +215 -0
  100. package/convex/teams.js.map +1 -0
  101. package/convex/telemetry.d.ts +4 -0
  102. package/convex/telemetry.d.ts.map +1 -0
  103. package/convex/telemetry.js +74 -0
  104. package/convex/telemetry.js.map +1 -0
  105. package/convex/usage.d.ts +27 -0
  106. package/convex/usage.d.ts.map +1 -0
  107. package/convex/usage.js +229 -0
  108. package/convex/usage.js.map +1 -0
  109. package/convex/waitlist.d.ts +4 -0
  110. package/convex/waitlist.d.ts.map +1 -0
  111. package/convex/waitlist.js +49 -0
  112. package/convex/waitlist.js.map +1 -0
  113. package/convex/webhooks.d.ts +12 -0
  114. package/convex/webhooks.d.ts.map +1 -0
  115. package/convex/webhooks.js +410 -0
  116. package/convex/webhooks.js.map +1 -0
  117. package/convex/workspaces.d.ts +29 -0
  118. package/convex/workspaces.d.ts.map +1 -0
  119. package/convex/workspaces.js +880 -0
  120. package/convex/workspaces.js.map +1 -0
  121. package/dist/analytics.d.ts +1 -1
  122. package/dist/analytics.d.ts.map +1 -1
  123. package/dist/analytics.js +51 -2
  124. package/dist/analytics.js.map +1 -1
  125. package/dist/index.js +27 -2
  126. package/dist/index.js.map +1 -1
  127. package/landing/scripts/generate-stats.js +9 -5
  128. package/landing/src/app/api/og/route.tsx +0 -2
  129. package/landing/src/app/page.tsx +3 -3
  130. package/landing/src/app/workspace/page.tsx +26 -1
  131. package/landing/src/lib/stats.json +2 -2
  132. package/package.json +1 -1
  133. package/src/analytics.ts +53 -2
  134. package/src/index.ts +28 -2
@@ -2,9 +2,9 @@
2
2
  "apiCount": 22392,
3
3
  "openApiCount": 1636,
4
4
  "directCallCount": 18,
5
+ "npmDownloads": 4232,
5
6
  "categoryCount": 13,
6
- "lastUpdated": "2026-02-27T09:10:41.344767",
7
- "generatedAt": "2026-03-18T11:19:31.518Z",
7
+ "generatedAt": "2026-03-18T12:30:05.958Z",
8
8
  "categoryBreakdown": {
9
9
  "Finance": 1179,
10
10
  "Auth & Security": 491,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nordsym/apiclaw",
3
- "version": "1.5.6",
3
+ "version": "1.5.8",
4
4
  "description": "The API layer for AI agents. Dashboard + 22K APIs + 18 Direct Call providers. MCP native.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/analytics.ts CHANGED
@@ -6,6 +6,8 @@
6
6
  import { appendFileSync, existsSync, mkdirSync } from 'fs';
7
7
  import { homedir } from 'os';
8
8
  import { join } from 'path';
9
+ import { ConvexHttpClient } from 'convex/browser';
10
+ import { api } from '../convex/_generated/api.js';
9
11
 
10
12
  export interface APICallLog {
11
13
  timestamp: string;
@@ -22,6 +24,24 @@ export interface APICallLog {
22
24
  const LOG_DIR = join(homedir(), '.apiclaw', 'logs');
23
25
  const LOG_FILE = join(LOG_DIR, 'api-calls.jsonl');
24
26
 
27
+ // Convex client (lazy init)
28
+ let convexClient: ConvexHttpClient | null = null;
29
+
30
+ function getConvexClient(): ConvexHttpClient | null {
31
+ if (convexClient) return convexClient;
32
+
33
+ const convexUrl = process.env.APICLAW_CONVEX_URL || process.env.NEXT_PUBLIC_CONVEX_URL;
34
+ if (!convexUrl) return null;
35
+
36
+ try {
37
+ convexClient = new ConvexHttpClient(convexUrl);
38
+ return convexClient;
39
+ } catch (e) {
40
+ console.error('[APIClaw Analytics] Failed to init Convex client:', e);
41
+ return null;
42
+ }
43
+ }
44
+
25
45
  // Ensure log directory exists
26
46
  function ensureLogDir(): void {
27
47
  if (!existsSync(LOG_DIR)) {
@@ -30,16 +50,47 @@ function ensureLogDir(): void {
30
50
  }
31
51
 
32
52
  /**
33
- * Log an API call
53
+ * Log an API call to local file AND Convex
34
54
  */
35
55
  export function logAPICall(log: APICallLog): void {
56
+ // 1. Local file (existing behavior)
36
57
  try {
37
58
  ensureLogDir();
38
59
  const line = JSON.stringify(log) + '\n';
39
60
  appendFileSync(LOG_FILE, line);
61
+ } catch (e) {
62
+ console.error('[APIClaw Analytics] Failed to log to file:', e);
63
+ }
64
+
65
+ // 2. Send to Convex (new - includes anonymous usage)
66
+ sendToConvex(log).catch(() => {}); // Fire and forget
67
+ }
68
+
69
+ /**
70
+ * Send analytics event to Convex
71
+ * Works for both authenticated and anonymous users
72
+ */
73
+ async function sendToConvex(log: APICallLog): Promise<void> {
74
+ const client = getConvexClient();
75
+ if (!client) return;
76
+
77
+ try {
78
+ await client.mutation(api.analytics.log, {
79
+ event: 'api_call',
80
+ provider: log.provider,
81
+ query: log.action, // Store action as query field
82
+ identifier: log.userId || 'anonymous',
83
+ metadata: {
84
+ type: log.type,
85
+ success: log.success,
86
+ latencyMs: log.latencyMs,
87
+ error: log.error,
88
+ timestamp: log.timestamp,
89
+ },
90
+ });
40
91
  } catch (e) {
41
92
  // Silent fail - don't break API calls for logging errors
42
- console.error('[APIClaw Analytics] Failed to log:', e);
93
+ console.error('[APIClaw Analytics] Failed to send to Convex:', e);
43
94
  }
44
95
  }
45
96
 
package/src/index.ts CHANGED
@@ -865,7 +865,33 @@ Docs: https://apiclaw.nordsym.com
865
865
  const responseTimeMs = Date.now() - startTime;
866
866
  trackSearch(query, results.length, responseTimeMs);
867
867
 
868
- // Log search to Convex for analytics
868
+ // Log search to Convex analytics (authenticated + anonymous)
869
+ const analyticsUserId = workspaceContext?.workspaceId || `anon:${getMachineFingerprint()}`;
870
+ const convexUrl = process.env.APICLAW_CONVEX_URL || process.env.NEXT_PUBLIC_CONVEX_URL;
871
+ if (convexUrl) {
872
+ fetch(`${convexUrl}/api/mutation`, {
873
+ method: 'POST',
874
+ headers: { 'Content-Type': 'application/json' },
875
+ body: JSON.stringify({
876
+ path: 'analytics:log',
877
+ args: {
878
+ event: 'search_query',
879
+ provider: undefined,
880
+ query,
881
+ identifier: analyticsUserId,
882
+ metadata: {
883
+ resultCount: results.length,
884
+ matchedProviders: results.slice(0, 10).map(r => r.provider.id),
885
+ responseTimeMs,
886
+ category,
887
+ authenticated: !!workspaceContext,
888
+ },
889
+ },
890
+ }),
891
+ }).catch(() => {}); // Fire and forget
892
+ }
893
+
894
+ // Log search to searchLogs table (authenticated only - requires workspace)
869
895
  if (workspaceContext?.sessionToken) {
870
896
  const searchLogPayload = {
871
897
  path: 'searchLogs:log',
@@ -879,7 +905,7 @@ Docs: https://apiclaw.nordsym.com
879
905
  },
880
906
  };
881
907
 
882
- fetch('https://brilliant-puffin-712.eu-west-1.convex.cloud/api/mutation', {
908
+ fetch(`${convexUrl}/api/mutation`, {
883
909
  method: 'POST',
884
910
  headers: { 'Content-Type': 'application/json' },
885
911
  body: JSON.stringify(searchLogPayload),