@nordsym/apiclaw 1.5.16 → 1.5.18

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 (172) hide show
  1. package/convex/http.js +196 -0
  2. package/convex/http.js.map +1 -1
  3. package/convex/http.ts +201 -0
  4. package/convex/http.ts.bak +934 -0
  5. package/dist/analytics.d.ts +0 -4
  6. package/dist/analytics.d.ts.map +1 -1
  7. package/dist/analytics.js +0 -1
  8. package/dist/analytics.js.map +1 -1
  9. package/dist/bin.js +1 -1
  10. package/dist/cli/commands/mcp-install.d.ts.map +1 -1
  11. package/dist/cli/commands/mcp-install.js +8 -87
  12. package/dist/cli/commands/mcp-install.js.map +1 -1
  13. package/dist/cli/index.js +0 -7
  14. package/dist/credentials.d.ts.map +1 -1
  15. package/dist/credentials.js +0 -128
  16. package/dist/credentials.js.map +1 -1
  17. package/dist/discovery.d.ts.map +1 -1
  18. package/dist/discovery.js +82 -191
  19. package/dist/discovery.js.map +1 -1
  20. package/dist/http-api.d.ts.map +1 -1
  21. package/dist/http-api.js +33 -17
  22. package/dist/http-api.js.map +1 -1
  23. package/dist/proxy.js +1 -1
  24. package/dist/proxy.js.map +1 -1
  25. package/landing/next-env.d.ts +0 -1
  26. package/landing/src/app/api/auth/magic-link/route.ts +1 -1
  27. package/landing/src/app/auth/verify/page.tsx +0 -6
  28. package/landing/src/app/dashboard/verify/page.tsx +0 -6
  29. package/landing/src/app/join/page.tsx +0 -6
  30. package/landing/src/app/layout.tsx +2 -2
  31. package/landing/src/app/login/page.tsx +1 -1
  32. package/landing/src/app/mou/[partnerId]/page.tsx +0 -6
  33. package/landing/src/app/page.tsx +18 -39
  34. package/landing/src/app/providers/dashboard/[apiId]/actions/[actionId]/edit/page.tsx +0 -6
  35. package/landing/src/app/providers/dashboard/[apiId]/actions/new/page.tsx +0 -5
  36. package/landing/src/app/providers/dashboard/[apiId]/actions/page.tsx +0 -5
  37. package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +1 -6
  38. package/landing/src/app/providers/dashboard/[apiId]/page.tsx +0 -5
  39. package/landing/src/app/providers/dashboard/[apiId]/test/page.tsx +0 -5
  40. package/landing/src/app/providers/dashboard/layout.tsx +6 -6
  41. package/landing/src/app/providers/dashboard/login/page.tsx +1 -1
  42. package/landing/src/app/providers/dashboard/page.tsx +1 -1
  43. package/landing/src/app/providers/dashboard/verify/page.tsx +0 -6
  44. package/landing/src/app/providers/layout.tsx +1 -1
  45. package/landing/src/app/upgrade/page.tsx +0 -6
  46. package/landing/src/app/workspace/page.tsx +0 -6
  47. package/landing/src/components/HeroTabs.tsx +2 -2
  48. package/landing/src/components/{Workspace.tsx → ProviderDashboard.tsx} +2 -2
  49. package/landing/src/components/VideoDemo.tsx +10 -21
  50. package/landing/src/lib/mock-data.ts +1 -1
  51. package/landing/src/lib/stats.json +1 -1
  52. package/package.json +4 -6
  53. package/src/analytics.ts +0 -5
  54. package/src/bin.ts +1 -1
  55. package/src/cli/commands/mcp-install.ts +8 -90
  56. package/src/cli/index.ts +0 -8
  57. package/src/credentials.ts +0 -136
  58. package/src/discovery.ts +82 -191
  59. package/src/http-api.ts +34 -18
  60. package/src/proxy.ts +1 -1
  61. package/APILAYER_STATUS_2026-03-24.md +0 -38
  62. package/CHANGELOG-WHITELIST-V2.md +0 -269
  63. package/HIVR-WHITELIST-STATUS.md +0 -205
  64. package/HIVR-WHITELIST.md +0 -148
  65. package/TERMINOLOGY-AUDIT.md +0 -99
  66. package/TERMINOLOGY-FIXED.md +0 -74
  67. package/VIDEO-DEMO-GUIDE.md +0 -82
  68. package/WHITELIST-ARCHITECTURE.md +0 -379
  69. package/api/discover.ts +0 -71
  70. package/api/health.ts +0 -20
  71. package/direct-test.mjs +0 -51
  72. package/dist/access-control.d.ts +0 -45
  73. package/dist/access-control.d.ts.map +0 -1
  74. package/dist/access-control.js +0 -142
  75. package/dist/access-control.js.map +0 -1
  76. package/dist/chain-types.d.ts +0 -187
  77. package/dist/chain-types.d.ts.map +0 -1
  78. package/dist/chain-types.js +0 -33
  79. package/dist/chain-types.js.map +0 -1
  80. package/dist/convex/adminActivate.js +0 -46
  81. package/dist/convex/adminStats.js +0 -41
  82. package/dist/convex/agents.js +0 -498
  83. package/dist/convex/analytics.js +0 -165
  84. package/dist/convex/billing.js +0 -654
  85. package/dist/convex/capabilities.js +0 -144
  86. package/dist/convex/chains.js +0 -1041
  87. package/dist/convex/credits.js +0 -185
  88. package/dist/convex/crons.js +0 -16
  89. package/dist/convex/directCall.js +0 -626
  90. package/dist/convex/earnProgress.js +0 -648
  91. package/dist/convex/email.js +0 -299
  92. package/dist/convex/feedback.js +0 -226
  93. package/dist/convex/http.js +0 -909
  94. package/dist/convex/logs.js +0 -486
  95. package/dist/convex/mou.js +0 -81
  96. package/dist/convex/providerKeys.js +0 -256
  97. package/dist/convex/providers.js +0 -755
  98. package/dist/convex/purchases.js +0 -156
  99. package/dist/convex/ratelimit.js +0 -90
  100. package/dist/convex/schema.js +0 -709
  101. package/dist/convex/searchLogs.js +0 -128
  102. package/dist/convex/spendAlerts.js +0 -379
  103. package/dist/convex/stripeActions.js +0 -410
  104. package/dist/convex/teams.js +0 -214
  105. package/dist/convex/telemetry.js +0 -73
  106. package/dist/convex/usage.js +0 -228
  107. package/dist/convex/waitlist.js +0 -48
  108. package/dist/convex/webhooks.js +0 -409
  109. package/dist/convex/workspaces.js +0 -879
  110. package/dist/hivr-whitelist.d.ts +0 -18
  111. package/dist/hivr-whitelist.d.ts.map +0 -1
  112. package/dist/hivr-whitelist.js +0 -95
  113. package/dist/hivr-whitelist.js.map +0 -1
  114. package/dist/http-server-minimal.d.ts +0 -7
  115. package/dist/http-server-minimal.d.ts.map +0 -1
  116. package/dist/http-server-minimal.js +0 -126
  117. package/dist/http-server-minimal.js.map +0 -1
  118. package/dist/product-whitelist.d.ts +0 -37
  119. package/dist/product-whitelist.d.ts.map +0 -1
  120. package/dist/product-whitelist.js +0 -203
  121. package/dist/product-whitelist.js.map +0 -1
  122. package/dist/src/analytics.js +0 -129
  123. package/dist/src/bin.js +0 -17
  124. package/dist/src/capability-router.js +0 -240
  125. package/dist/src/chainExecutor.js +0 -451
  126. package/dist/src/chainResolver.js +0 -518
  127. package/dist/src/cli/commands/doctor.js +0 -324
  128. package/dist/src/cli/commands/mcp-install.js +0 -255
  129. package/dist/src/cli/commands/restore.js +0 -259
  130. package/dist/src/cli/commands/setup.js +0 -205
  131. package/dist/src/cli/commands/uninstall.js +0 -188
  132. package/dist/src/cli/index.js +0 -111
  133. package/dist/src/cli.js +0 -302
  134. package/dist/src/confirmation.js +0 -240
  135. package/dist/src/credentials.js +0 -357
  136. package/dist/src/credits.js +0 -260
  137. package/dist/src/crypto.js +0 -66
  138. package/dist/src/discovery.js +0 -504
  139. package/dist/src/enterprise/env.js +0 -123
  140. package/dist/src/enterprise/script-generator.js +0 -460
  141. package/dist/src/execute-dynamic.js +0 -473
  142. package/dist/src/execute.js +0 -1727
  143. package/dist/src/index.js +0 -2062
  144. package/dist/src/metered.js +0 -80
  145. package/dist/src/open-apis.js +0 -276
  146. package/dist/src/proxy.js +0 -28
  147. package/dist/src/session.js +0 -86
  148. package/dist/src/stripe.js +0 -407
  149. package/dist/src/telemetry.js +0 -49
  150. package/dist/src/types.js +0 -2
  151. package/dist/src/utils/backup.js +0 -181
  152. package/dist/src/utils/config.js +0 -220
  153. package/dist/src/utils/os.js +0 -105
  154. package/dist/src/utils/paths.js +0 -159
  155. package/landing/pages/api/discover.ts +0 -43
  156. package/landing/pages/api/health.ts +0 -20
  157. package/scripts/test-whitelist-v2.sh +0 -128
  158. package/src/access-control.ts +0 -174
  159. package/src/hivr-whitelist.ts +0 -110
  160. package/src/http-server-minimal.ts +0 -154
  161. package/src/product-whitelist.ts +0 -246
  162. package/test-actual-handlers.ts +0 -92
  163. package/test-apilayer-all-14.ts +0 -249
  164. package/test-apilayer-fixed.ts +0 -248
  165. package/test-direct-endpoints.ts +0 -174
  166. package/test-exact-endpoints.ts +0 -144
  167. package/test-final.ts +0 -83
  168. package/test-full-routing.ts +0 -100
  169. package/test-handlers-correct.ts +0 -217
  170. package/test-numverify-key.ts +0 -41
  171. package/test-via-handlers.ts +0 -92
  172. package/test-worldnews.mjs +0 -26
@@ -12,12 +12,11 @@ import { useState, useEffect, useRef } from "react";
12
12
  import { HeroTabs } from "@/components/HeroTabs";
13
13
  import { PhoneDemo } from "@/components/demo";
14
14
  import { AITestimonials } from "@/components/AITestimonials";
15
- import { VideoDemo } from "@/components/VideoDemo";
16
15
 
17
16
  const stats = [
18
17
  { number: statsData.apiCount.toLocaleString(), label: "APIs Indexed", live: true },
19
18
  { number: statsData.openApiCount.toLocaleString(), label: "Open APIs", live: true },
20
- { number: "19", label: "Direct Call", live: false },
19
+ { number: statsData.directCallCount?.toString() || "19", label: "Direct Call", live: false },
21
20
  { number: (statsData.npmDownloads || 4232).toLocaleString(), label: "Installs", live: false },
22
21
  { number: statsData.categoryCount.toString(), label: "Categories", live: false },
23
22
  ];
@@ -147,7 +146,6 @@ const terminalLines = [
147
146
  const directCallProviders = [
148
147
  { name: "Replicate", desc: "1000+ ML models" },
149
148
  { name: "OpenRouter", desc: "100+ LLMs" },
150
- { name: "APILayer", desc: "14 APIs" },
151
149
  { name: "Firecrawl", desc: "Web scraping" },
152
150
  { name: "E2B", desc: "Code sandbox" },
153
151
  { name: "GitHub", desc: "Repos & Issues" },
@@ -172,23 +170,22 @@ export default function Home() {
172
170
  const [waitlistEmail, setWaitlistEmail] = useState("");
173
171
  const [waitlistStatus, setWaitlistStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
174
172
 
175
- const directCallProviders: Array<{ name: string; desc: string; category: string; featured?: boolean; apis?: number }> = [
176
- // Multi-API providers (top)
177
- { name: "APILayer", desc: "Exchange rates, stocks, aviation, PDF, screenshots, email/phone verification, VAT, news, scraping", category: "Multi-API", apis: 14 },
178
- { name: "Replicate", desc: "Whisper, Stable Diffusion, Flux, Luma, 1000+ ML models", category: "Multi-API", apis: 1000 },
179
- { name: "OpenRouter", desc: "GPT-4, Claude, Llama, Gemini, 100+ LLMs", category: "Multi-API", apis: 100 },
180
- // Single-purpose
173
+ const directCallProviders = [
174
+ // Original 10
175
+ { name: "Replicate", desc: "Whisper, Stable Diffusion, 1000+ ML models", category: "AI & LLM" },
176
+ { name: "OpenRouter", desc: "GPT-4, Claude, Llama, 100+ LLMs", category: "AI & LLM" },
181
177
  { name: "ElevenLabs", desc: "Text-to-speech in 29 languages", category: "Voice & TTS" },
182
- { name: "Groq", desc: "Ultra-fast LLM inference", category: "AI & LLM" },
183
- { name: "Deepgram", desc: "Speech-to-text transcription", category: "Voice & TTS" },
184
- { name: "Firecrawl", desc: "Web scraping to LLM-ready markdown", category: "Search" },
178
+ { name: "46elks", desc: "SMS in Sweden and globally", category: "SMS & Messaging" },
179
+ { name: "Twilio", desc: "Enterprise SMS and voice", category: "SMS & Messaging" },
180
+ { name: "Resend", desc: "Modern email API for developers", category: "Email" },
185
181
  { name: "Brave Search", desc: "Privacy-focused web search", category: "Search" },
186
- { name: "Serper", desc: "Google search API for AI", category: "Search" },
182
+ { name: "Firecrawl", desc: "Web scraping to LLM-ready markdown", category: "Search" },
187
183
  { name: "E2B", desc: "Secure cloud sandboxes for code execution", category: "Code Execution" },
188
184
  { name: "GitHub", desc: "Repos, issues, PRs, and more", category: "Developer Tools" },
189
- { name: "Resend", desc: "Modern email API for developers", category: "Email" },
190
- { name: "46elks", desc: "SMS in Sweden and globally", category: "SMS & Messaging" },
191
- { name: "Twilio", desc: "Enterprise SMS and voice", category: "SMS & Messaging" },
185
+ // New 8
186
+ { name: "Groq", desc: "Ultra-fast LLM inference", category: "AI & LLM" },
187
+ { name: "Deepgram", desc: "Speech-to-text transcription", category: "Voice & TTS" },
188
+ { name: "Serper", desc: "Google search API for AI", category: "Search" },
192
189
  { name: "Mistral", desc: "Open-weight LLMs from Mistral AI", category: "AI & LLM" },
193
190
  { name: "Cohere", desc: "Enterprise NLP and embeddings", category: "AI & LLM" },
194
191
  { name: "Together AI", desc: "Open-source model inference", category: "AI & LLM" },
@@ -220,7 +217,6 @@ Voice: ElevenLabs, Deepgram, AssemblyAI
220
217
  Search: Brave Search, Serper, Firecrawl
221
218
  Code: E2B, GitHub
222
219
  Utility: Resend (email), 46elks & Twilio (SMS)
223
- Multi-API: APILayer (exchange rates, stocks, aviation, PDF, screenshots, verification, VAT, news, scraping — 14 APIs)
224
220
 
225
221
  Your Tools:
226
222
  • call_api(provider, action, params) – Execute immediately (leave auth fields empty – APIClaw handles it)
@@ -591,26 +587,12 @@ Docs: https://apiclaw.nordsym.com/docs`;
591
587
  <p className="text-text-muted mb-4">These APIs work through APIClaw's proxy. Your agent calls them without needing API keys.</p>
592
588
  <div className="space-y-3">
593
589
  {directCallProviders.map((provider, i) => (
594
- <div key={i} className={`flex items-center justify-between p-3 rounded-xl border transition-all ${
595
- provider.featured
596
- ? 'bg-gradient-to-r from-accent/5 to-purple-500/5 border-accent/30 hover:border-accent/50 hover:shadow-[0_0_20px_rgba(0,212,255,0.08)]'
597
- : provider.apis
598
- ? 'bg-surface border-border/80'
599
- : 'bg-surface border-border'
600
- }`}>
590
+ <div key={i} className="flex items-center justify-between p-3 rounded-xl bg-surface border border-border">
601
591
  <div>
602
- <div className="flex items-center gap-2">
603
- <span className="font-medium">{provider.name}</span>
604
- {provider.featured && (
605
- <span className="text-[10px] font-bold uppercase tracking-wider px-1.5 py-0.5 rounded bg-accent/20 text-accent">Partner</span>
606
- )}
607
- {provider.apis && (
608
- <span className="text-[10px] font-medium px-1.5 py-0.5 rounded bg-purple-500/20 text-purple-400">{provider.apis >= 1000 ? `${Math.floor(provider.apis/1000)}k+` : `${provider.apis}`} APIs</span>
609
- )}
610
- </div>
592
+ <div className="font-medium">{provider.name}</div>
611
593
  <div className="text-sm text-text-muted">{provider.desc}</div>
612
594
  </div>
613
- <span className="text-xs px-2 py-1 rounded-full bg-accent/20 text-accent flex-shrink-0 ml-3">{provider.category}</span>
595
+ <span className="text-xs px-2 py-1 rounded-full bg-accent/20 text-accent">{provider.category}</span>
614
596
  </div>
615
597
  ))}
616
598
  </div>
@@ -1047,7 +1029,7 @@ Docs: https://apiclaw.nordsym.com/docs`;
1047
1029
  </li>
1048
1030
  <li className="flex items-start gap-3 text-text-secondary text-sm">
1049
1031
  <Check className="w-5 h-5 text-accent flex-shrink-0 mt-0.5" />
1050
- 19 Direct Call providers
1032
+ 18 Direct Call providers
1051
1033
  </li>
1052
1034
  <li className="flex items-start gap-3 text-text-secondary text-sm">
1053
1035
  <Check className="w-5 h-5 text-accent flex-shrink-0 mt-0.5" />
@@ -1162,7 +1144,7 @@ Docs: https://apiclaw.nordsym.com/docs`;
1162
1144
  },
1163
1145
  {
1164
1146
  q: "How do I add my API?",
1165
- a: "Go to your Workspace, sign up with your email, and follow the self-service onboarding. Your API will be discoverable by AI agents immediately. Want to become a Direct Call partner? Set that up in your Workspace too."
1147
+ a: "Go to the Provider Dashboard, sign up with your email, and follow the self-service onboarding. Your API will be discoverable by AI agents immediately. Want to become a Direct Call partner? Set that up in the dashboard too."
1166
1148
  },
1167
1149
  {
1168
1150
  q: "What's MCP?",
@@ -1345,9 +1327,6 @@ Docs: https://apiclaw.nordsym.com/docs`;
1345
1327
  </div>
1346
1328
  </div>
1347
1329
  )}
1348
-
1349
- {/* Video Demo Bubble - Always visible */}
1350
- <VideoDemo />
1351
1330
  </main>
1352
1331
  );
1353
1332
  }
@@ -47,12 +47,6 @@ const PARAM_LOCATIONS = ["body", "query", "path"] as const;
47
47
  export default function EditActionPage() {
48
48
  const params = useParams();
49
49
  const router = useRouter();
50
-
51
- // Handle null params
52
- if (!params || !params.apiId || !params.actionId) {
53
- return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
54
- }
55
-
56
50
  const apiId = params.apiId as string;
57
51
  const actionId = params.actionId as string;
58
52
 
@@ -45,11 +45,6 @@ const PARAM_LOCATIONS = ["body", "query", "path"] as const;
45
45
 
46
46
  export default function NewActionPage() {
47
47
  const params = useParams();
48
-
49
- // Handle null params
50
- if (!params || !params.apiId) {
51
- return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
52
- }
53
48
  const router = useRouter();
54
49
  const apiId = params.apiId as string;
55
50
 
@@ -41,11 +41,6 @@ const CONVEX_URL = process.env.NEXT_PUBLIC_CONVEX_URL || 'https://brilliant-puff
41
41
 
42
42
  export default function ActionsPage() {
43
43
  const params = useParams();
44
-
45
- // Handle null params
46
- if (!params || !params.apiId) {
47
- return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
48
- }
49
44
  const router = useRouter();
50
45
  const apiId = params.apiId as string;
51
46
 
@@ -50,11 +50,6 @@ const authTypes = [
50
50
 
51
51
  export default function DirectCallSetupPage() {
52
52
  const params = useParams();
53
-
54
- // Handle null params
55
- if (!params || !params.apiId) {
56
- return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
57
- }
58
53
  const router = useRouter();
59
54
  const apiId = params.apiId as string;
60
55
 
@@ -445,7 +440,7 @@ export default function DirectCallSetupPage() {
445
440
  <label className="block text-sm font-medium mb-2">Service Account Key</label>
446
441
  <p className="text-xs text-text-muted mb-3">
447
442
  The API key APIClaw uses to make requests on behalf of your users.
448
- This is typically a privileged key from your workspace.
443
+ This is typically a privileged key from your provider dashboard.
449
444
  </p>
450
445
  <div className="relative">
451
446
  <Key className="absolute left-4 top-1/2 -translate-y-1/2 w-5 h-5 text-text-muted" />
@@ -32,11 +32,6 @@ interface DirectCallConfig {
32
32
 
33
33
  export default function ApiOverviewPage() {
34
34
  const params = useParams();
35
-
36
- // Handle null params
37
- if (!params || !params.apiId) {
38
- return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
39
- }
40
35
  const router = useRouter();
41
36
  const apiId = params.apiId as string;
42
37
 
@@ -61,11 +61,6 @@ const methodColors: Record<string, string> = {
61
61
 
62
62
  export default function TestConsolePage() {
63
63
  const params = useParams();
64
-
65
- // Handle null params
66
- if (!params || !params.apiId) {
67
- return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
68
- }
69
64
  const router = useRouter();
70
65
  const apiId = params.apiId as string;
71
66
 
@@ -80,12 +80,12 @@ export default function DashboardLayout({
80
80
  };
81
81
 
82
82
  // Check if current route is API detail page
83
- const apiIdMatch = pathname?.match(/\/providers\/dashboard\/([^/]+)/);
83
+ const apiIdMatch = pathname.match(/\/providers\/dashboard\/([^/]+)/);
84
84
  const currentApiId = apiIdMatch ? apiIdMatch[1] : null;
85
85
  const isApiDetailPage = currentApiId && currentApiId !== "login" && currentApiId !== "verify";
86
86
 
87
87
  // Don't show layout for login/verify pages
88
- if (pathname?.includes("/login") || pathname?.includes("/verify")) {
88
+ if (pathname.includes("/login") || pathname.includes("/verify")) {
89
89
  return <>{children}</>;
90
90
  }
91
91
 
@@ -167,7 +167,7 @@ export default function DashboardLayout({
167
167
  key={item.label}
168
168
  href={item.href}
169
169
  className={`flex items-center gap-3 px-3 py-2 rounded-lg transition ${
170
- (item.exact ? pathname === item.href : pathname?.startsWith(item.href.split('?')[0])) && !isApiDetailPage
170
+ (item.exact ? pathname === item.href : pathname.startsWith(item.href.split('?')[0])) && !isApiDetailPage
171
171
  ? "bg-accent text-white"
172
172
  : "text-text-secondary hover:bg-surface hover:text-text-primary"
173
173
  }`}
@@ -200,7 +200,7 @@ export default function DashboardLayout({
200
200
  <Link
201
201
  href={`/providers/dashboard/${currentApiId}/direct-call`}
202
202
  className={`flex items-center gap-3 px-3 py-2 rounded-lg transition ${
203
- pathname?.includes("/direct-call")
203
+ pathname.includes("/direct-call")
204
204
  ? "bg-accent text-white"
205
205
  : "text-text-secondary hover:bg-surface hover:text-text-primary"
206
206
  }`}
@@ -212,7 +212,7 @@ export default function DashboardLayout({
212
212
  <Link
213
213
  href={`/providers/dashboard/${currentApiId}/actions`}
214
214
  className={`flex items-center gap-3 px-3 py-2 rounded-lg transition ${
215
- pathname?.includes("/actions")
215
+ pathname.includes("/actions")
216
216
  ? "bg-accent text-white"
217
217
  : "text-text-secondary hover:bg-surface hover:text-text-primary"
218
218
  }`}
@@ -224,7 +224,7 @@ export default function DashboardLayout({
224
224
  <Link
225
225
  href={`/providers/dashboard/${currentApiId}/test`}
226
226
  className={`flex items-center gap-3 px-3 py-2 rounded-lg transition ${
227
- pathname?.includes("/test")
227
+ pathname.includes("/test")
228
228
  ? "bg-accent text-white"
229
229
  : "text-text-secondary hover:bg-surface hover:text-text-primary"
230
230
  }`}
@@ -109,7 +109,7 @@ export default function LoginPage() {
109
109
  <div className="pt-32 pb-24 px-6">
110
110
  <div className="max-w-md mx-auto">
111
111
  <div className="text-center mb-8">
112
- <h1 className="text-3xl font-bold mb-2">Workspace</h1>
112
+ <h1 className="text-3xl font-bold mb-2">Provider Dashboard</h1>
113
113
  <p className="text-text-secondary">
114
114
  Sign in to manage your APIs and view analytics
115
115
  </p>
@@ -4,7 +4,7 @@ import { useEffect } from "react";
4
4
  import { useRouter } from "next/navigation";
5
5
  import { Loader2 } from "lucide-react";
6
6
 
7
- export default function WorkspaceRedirect() {
7
+ export default function ProviderDashboardRedirect() {
8
8
  const router = useRouter();
9
9
 
10
10
  useEffect(() => {
@@ -8,12 +8,6 @@ import Link from "next/link";
8
8
  function VerifyContent() {
9
9
  const router = useRouter();
10
10
  const searchParams = useSearchParams();
11
-
12
- // Handle null searchParams
13
- if (!searchParams) {
14
- return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
15
- }
16
-
17
11
  const token = searchParams.get("token");
18
12
 
19
13
  const [status, setStatus] = useState<"verifying" | "success" | "error">("verifying");
@@ -1,7 +1,7 @@
1
1
  import type { Metadata } from "next";
2
2
 
3
3
  export const metadata: Metadata = {
4
- title: "Workspace | APIClaw",
4
+ title: "Provider Dashboard | APIClaw",
5
5
  description: "Manage your APIs, view analytics, and track earnings on APIClaw.",
6
6
  };
7
7
 
@@ -40,12 +40,6 @@ async function actionConvex<T>(path: string, args: Record<string, unknown>): Pro
40
40
  function UpgradeContent() {
41
41
  const searchParams = useSearchParams();
42
42
  const router = useRouter();
43
-
44
- // Handle null searchParams
45
- if (!searchParams) {
46
- return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
47
- }
48
-
49
43
  const workspaceId = searchParams.get("ws");
50
44
  const success = searchParams.get("success");
51
45
 
@@ -184,12 +184,6 @@ function generatePreviewAnalytics(): ProviderAnalytics {
184
184
  export default function WorkspacePage() {
185
185
  const router = useRouter();
186
186
  const searchParams = useSearchParams();
187
-
188
- // Handle null searchParams
189
- if (!searchParams) {
190
- return <div className="min-h-screen flex items-center justify-center">Loading...</div>;
191
- }
192
-
193
187
  const tabFromUrl = searchParams.get("tab") as TabType | null;
194
188
  const subFromUrl = searchParams.get("sub") as AnalyticsSubtab | null;
195
189
 
@@ -179,10 +179,10 @@ export function HeroTabs() {
179
179
  </ul>
180
180
 
181
181
  <a
182
- href="/workspace"
182
+ href="/providers/dashboard"
183
183
  className="btn-primary w-full justify-center"
184
184
  >
185
- Open Workspace
185
+ Open Provider Dashboard
186
186
  <ArrowRight className="w-4 h-4" />
187
187
  </a>
188
188
  </div>
@@ -50,7 +50,7 @@ type TabType = "overview" | "apis" | "earnings";
50
50
 
51
51
  const COLORS = ["#ef4444", "#f97316", "#eab308", "#22c55e", "#3b82f6"];
52
52
 
53
- export function Workspace() {
53
+ export function ProviderDashboard() {
54
54
  const [activeTab, setActiveTab] = useState<TabType>("overview");
55
55
  const [period, setPeriod] = useState<"week" | "month" | "all">("month");
56
56
  const [selectedApi, setSelectedApi] = useState<string | null>(null);
@@ -76,7 +76,7 @@ export function Workspace() {
76
76
  🦞
77
77
  </div>
78
78
  <div>
79
- <h1 className="font-bold text-lg">Workspace</h1>
79
+ <h1 className="font-bold text-lg">Provider Dashboard</h1>
80
80
  <p className="text-sm text-text-muted">{provider.company || provider.email}</p>
81
81
  </div>
82
82
  </div>
@@ -4,16 +4,15 @@ import { useState } from "react";
4
4
  import { Play, X } from "lucide-react";
5
5
 
6
6
  interface VideoDemoProps {
7
- videoUrl?: string; // Tella embed URL
8
- thumbnailUrl?: string; // Optional custom thumbnail
7
+ videoUrl?: string;
8
+ thumbnailUrl?: string;
9
9
  }
10
10
 
11
11
  export function VideoDemo({
12
- videoUrl = "PASTE_TELLA_URL_HERE",
12
+ videoUrl = "https://firebasestorage.googleapis.com/v0/b/nordsym-funnel.firebasestorage.app/o/Getting%20Started%20with%20API%20Claw.mp4?alt=media&token=5982c20f-d97c-4b36-9ef1-4795f9347068",
13
13
  thumbnailUrl
14
14
  }: VideoDemoProps) {
15
15
  const [isOpen, setIsOpen] = useState(false);
16
- const isVideoReady = videoUrl !== "PASTE_TELLA_URL_HERE" && videoUrl.startsWith("http");
17
16
 
18
17
  return (
19
18
  <>
@@ -58,23 +57,13 @@ export function VideoDemo({
58
57
 
59
58
  {/* Video container - 16:9 aspect ratio */}
60
59
  <div className="relative w-full" style={{ paddingBottom: '56.25%' }}>
61
- {isVideoReady ? (
62
- <iframe
63
- src={videoUrl}
64
- className="absolute inset-0 w-full h-full"
65
- frameBorder="0"
66
- allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
67
- allowFullScreen
68
- />
69
- ) : (
70
- <div className="absolute inset-0 flex items-center justify-center bg-gradient-to-br from-[#0f172a] to-[#1e293b]">
71
- <div className="text-center">
72
- <Play className="w-16 h-16 mx-auto mb-4 text-[#ef4444]" />
73
- <h3 className="text-2xl font-bold text-white mb-2">Coming Soon</h3>
74
- <p className="text-[#94a3b8]">Demo video will be available shortly</p>
75
- </div>
76
- </div>
77
- )}
60
+ <video
61
+ src={videoUrl}
62
+ className="absolute inset-0 w-full h-full"
63
+ controls
64
+ autoPlay
65
+ preload="auto"
66
+ />
78
67
  </div>
79
68
 
80
69
  {/* Video info */}
@@ -1,4 +1,4 @@
1
- // Mock data for the workspace demo
1
+ // Mock data for the provider dashboard demo
2
2
  // This simulates what would come from Convex in production
3
3
 
4
4
  export interface Provider {
@@ -4,7 +4,7 @@
4
4
  "directCallCount": 18,
5
5
  "npmDownloads": 4232,
6
6
  "categoryCount": 13,
7
- "generatedAt": "2026-03-24T15:40:24.031Z",
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.16",
3
+ "version": "1.5.18",
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",
@@ -16,7 +16,6 @@
16
16
  "build": "tsc && cp -r src/registry dist/",
17
17
  "dev": "tsx watch src/index.ts",
18
18
  "start": "node dist/index.js",
19
- "start:http": "tsx src/http-server-minimal.ts",
20
19
  "test": "tsx src/test.ts",
21
20
  "test:e2e": "tsx src/test.ts",
22
21
  "webhook": "tsx src/webhook.ts",
@@ -67,7 +66,7 @@
67
66
  "@types/inquirer": "^9.0.9",
68
67
  "chalk": "^5.6.2",
69
68
  "commander": "^14.0.3",
70
- "convex": "^1.33.1",
69
+ "convex": "^1.32.0",
71
70
  "dotenv": "^17.3.1",
72
71
  "fs-extra": "^11.3.3",
73
72
  "hono": "^4.0.0",
@@ -78,12 +77,11 @@
78
77
  "devDependencies": {
79
78
  "@types/fs-extra": "^11.0.4",
80
79
  "@types/node": "^20.10.0",
81
- "@vercel/node": "^5.6.16",
82
80
  "tsx": "^4.7.0",
83
- "typescript": "^5.3.0"
81
+ "typescript": "^5.9.3"
84
82
  },
85
83
  "bin": {
86
84
  "apiclaw": "./dist/bin.js",
87
85
  "apiclaw-http": "./dist/bin-http.js"
88
86
  }
89
- }
87
+ }
package/src/analytics.ts CHANGED
@@ -18,10 +18,6 @@ export interface APICallLog {
18
18
  success: boolean;
19
19
  latencyMs?: number;
20
20
  error?: string;
21
- metadata?: {
22
- product?: string;
23
- [key: string]: any;
24
- };
25
21
  }
26
22
 
27
23
  // Log directory
@@ -90,7 +86,6 @@ async function sendToConvex(log: APICallLog): Promise<void> {
90
86
  latencyMs: log.latencyMs,
91
87
  error: log.error,
92
88
  timestamp: log.timestamp,
93
- ...log.metadata, // Include product and any other metadata
94
89
  },
95
90
  });
96
91
  } catch (e) {
package/src/bin.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  * - setup/doctor/restore/uninstall → Run CLI
7
7
  */
8
8
 
9
- const cliCommands = ['setup', 'mcp-install', 'mcp-uninstall', 'doctor', 'restore', 'uninstall', 'help', '--help', '-h', '--version', '-V'];
9
+ const cliCommands = ['setup', 'mcp-install', 'doctor', 'restore', 'uninstall', 'help', '--help', '-h', '--version', '-V'];
10
10
 
11
11
  const firstArg = process.argv[2];
12
12