@nordsym/apiclaw 1.5.17 → 1.5.19

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 (228) hide show
  1. package/convex/http.js.map +1 -1
  2. package/convex/http.ts +516 -0
  3. package/dist/analytics.d.ts +0 -4
  4. package/dist/analytics.d.ts.map +1 -1
  5. package/dist/analytics.js +0 -1
  6. package/dist/analytics.js.map +1 -1
  7. package/dist/bin.js +1 -1
  8. package/dist/cli/commands/mcp-install.d.ts.map +1 -1
  9. package/dist/cli/commands/mcp-install.js +8 -87
  10. package/dist/cli/commands/mcp-install.js.map +1 -1
  11. package/dist/cli/index.js +0 -7
  12. package/dist/credentials.d.ts.map +1 -1
  13. package/dist/credentials.js +38 -43
  14. package/dist/credentials.js.map +1 -1
  15. package/dist/discovery.d.ts.map +1 -1
  16. package/dist/discovery.js +82 -191
  17. package/dist/discovery.js.map +1 -1
  18. package/dist/http-api.d.ts.map +1 -1
  19. package/dist/http-api.js +33 -17
  20. package/dist/http-api.js.map +1 -1
  21. package/dist/proxy.js +1 -1
  22. package/dist/proxy.js.map +1 -1
  23. package/landing/next-env.d.ts +0 -1
  24. package/landing/src/app/api/auth/magic-link/route.ts +1 -1
  25. package/landing/src/app/auth/verify/page.tsx +0 -6
  26. package/landing/src/app/dashboard/verify/page.tsx +0 -6
  27. package/landing/src/app/join/page.tsx +0 -6
  28. package/landing/src/app/layout.tsx +2 -2
  29. package/landing/src/app/login/page.tsx +1 -1
  30. package/landing/src/app/mou/[partnerId]/page.tsx +0 -6
  31. package/landing/src/app/page.tsx +18 -39
  32. package/landing/src/app/providers/dashboard/[apiId]/actions/[actionId]/edit/page.tsx +0 -6
  33. package/landing/src/app/providers/dashboard/[apiId]/actions/new/page.tsx +0 -5
  34. package/landing/src/app/providers/dashboard/[apiId]/actions/page.tsx +0 -5
  35. package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +1 -6
  36. package/landing/src/app/providers/dashboard/[apiId]/page.tsx +0 -5
  37. package/landing/src/app/providers/dashboard/[apiId]/test/page.tsx +0 -5
  38. package/landing/src/app/providers/dashboard/layout.tsx +6 -6
  39. package/landing/src/app/providers/dashboard/login/page.tsx +1 -1
  40. package/landing/src/app/providers/dashboard/page.tsx +1 -1
  41. package/landing/src/app/providers/dashboard/verify/page.tsx +0 -6
  42. package/landing/src/app/providers/layout.tsx +1 -1
  43. package/landing/src/app/upgrade/page.tsx +0 -6
  44. package/landing/src/app/workspace/page.tsx +0 -6
  45. package/landing/src/components/HeroTabs.tsx +2 -2
  46. package/landing/src/components/{Workspace.tsx → ProviderDashboard.tsx} +2 -2
  47. package/landing/src/components/VideoDemo.tsx +10 -21
  48. package/landing/src/lib/mock-data.ts +1 -1
  49. package/landing/src/lib/stats.json +1 -1
  50. package/package.json +3 -8
  51. package/src/analytics.ts +0 -5
  52. package/src/bin.ts +1 -1
  53. package/src/cli/commands/mcp-install.ts +8 -90
  54. package/src/cli/index.ts +0 -8
  55. package/src/credentials.ts +39 -44
  56. package/src/discovery.ts +82 -191
  57. package/src/http-api.ts +34 -18
  58. package/src/proxy.ts +1 -1
  59. package/APILAYER_STATUS_2026-03-24.md +0 -38
  60. package/CHANGELOG-WHITELIST-V2.md +0 -269
  61. package/HIVR-WHITELIST-STATUS.md +0 -205
  62. package/HIVR-WHITELIST.md +0 -148
  63. package/TERMINOLOGY-AUDIT.md +0 -99
  64. package/TERMINOLOGY-FIXED.md +0 -74
  65. package/VIDEO-DEMO-GUIDE.md +0 -82
  66. package/WHITELIST-ARCHITECTURE.md +0 -379
  67. package/api/discover.ts +0 -71
  68. package/api/health.ts +0 -20
  69. package/convex/adminActivate.d.ts +0 -3
  70. package/convex/adminActivate.js +0 -47
  71. package/convex/adminStats.d.ts +0 -3
  72. package/convex/adminStats.js +0 -42
  73. package/convex/agents.d.ts +0 -54
  74. package/convex/agents.js +0 -499
  75. package/convex/analytics.d.ts +0 -5
  76. package/convex/analytics.js +0 -166
  77. package/convex/billing.d.ts +0 -88
  78. package/convex/billing.js +0 -655
  79. package/convex/capabilities.d.ts +0 -9
  80. package/convex/capabilities.js +0 -145
  81. package/convex/chains.d.ts +0 -67
  82. package/convex/chains.js +0 -1042
  83. package/convex/credits.d.ts +0 -25
  84. package/convex/credits.js +0 -186
  85. package/convex/crons.d.ts +0 -3
  86. package/convex/crons.js +0 -17
  87. package/convex/directCall.d.ts +0 -72
  88. package/convex/directCall.js +0 -627
  89. package/convex/earnProgress.d.ts +0 -58
  90. package/convex/earnProgress.js +0 -649
  91. package/convex/email.d.ts +0 -14
  92. package/convex/email.js +0 -300
  93. package/convex/feedback.d.ts +0 -7
  94. package/convex/feedback.js +0 -227
  95. package/convex/http.d.ts +0 -3
  96. package/convex/http.js +0 -910
  97. package/convex/logs.d.ts +0 -38
  98. package/convex/logs.js +0 -487
  99. package/convex/mou.d.ts +0 -6
  100. package/convex/mou.js +0 -82
  101. package/convex/providerKeys.d.ts +0 -31
  102. package/convex/providerKeys.js +0 -257
  103. package/convex/providers.d.ts +0 -29
  104. package/convex/providers.js +0 -756
  105. package/convex/purchases.d.ts +0 -7
  106. package/convex/purchases.js +0 -157
  107. package/convex/ratelimit.d.ts +0 -4
  108. package/convex/ratelimit.js +0 -91
  109. package/convex/searchLogs.d.ts +0 -4
  110. package/convex/searchLogs.js +0 -129
  111. package/convex/spendAlerts.d.ts +0 -36
  112. package/convex/spendAlerts.js +0 -380
  113. package/convex/stripeActions.d.ts +0 -19
  114. package/convex/stripeActions.js +0 -411
  115. package/convex/teams.d.ts +0 -21
  116. package/convex/teams.js +0 -215
  117. package/convex/telemetry.d.ts +0 -4
  118. package/convex/telemetry.js +0 -74
  119. package/convex/usage.d.ts +0 -27
  120. package/convex/usage.js +0 -229
  121. package/convex/waitlist.d.ts +0 -4
  122. package/convex/waitlist.js +0 -49
  123. package/convex/webhooks.d.ts +0 -12
  124. package/convex/webhooks.js +0 -410
  125. package/convex/workspaces.d.ts +0 -29
  126. package/convex/workspaces.js +0 -880
  127. package/direct-test.mjs +0 -51
  128. package/dist/access-control.d.ts +0 -45
  129. package/dist/access-control.d.ts.map +0 -1
  130. package/dist/access-control.js +0 -142
  131. package/dist/access-control.js.map +0 -1
  132. package/dist/chain-types.d.ts +0 -187
  133. package/dist/chain-types.d.ts.map +0 -1
  134. package/dist/chain-types.js +0 -33
  135. package/dist/chain-types.js.map +0 -1
  136. package/dist/convex/adminActivate.js +0 -46
  137. package/dist/convex/adminStats.js +0 -41
  138. package/dist/convex/agents.js +0 -498
  139. package/dist/convex/analytics.js +0 -165
  140. package/dist/convex/billing.js +0 -654
  141. package/dist/convex/capabilities.js +0 -144
  142. package/dist/convex/chains.js +0 -1041
  143. package/dist/convex/credits.js +0 -185
  144. package/dist/convex/crons.js +0 -16
  145. package/dist/convex/directCall.js +0 -626
  146. package/dist/convex/earnProgress.js +0 -648
  147. package/dist/convex/email.js +0 -299
  148. package/dist/convex/feedback.js +0 -226
  149. package/dist/convex/http.js +0 -909
  150. package/dist/convex/logs.js +0 -486
  151. package/dist/convex/mou.js +0 -81
  152. package/dist/convex/providerKeys.js +0 -256
  153. package/dist/convex/providers.js +0 -755
  154. package/dist/convex/purchases.js +0 -156
  155. package/dist/convex/ratelimit.js +0 -90
  156. package/dist/convex/schema.js +0 -709
  157. package/dist/convex/searchLogs.js +0 -128
  158. package/dist/convex/spendAlerts.js +0 -379
  159. package/dist/convex/stripeActions.js +0 -410
  160. package/dist/convex/teams.js +0 -214
  161. package/dist/convex/telemetry.js +0 -73
  162. package/dist/convex/usage.js +0 -228
  163. package/dist/convex/waitlist.js +0 -48
  164. package/dist/convex/webhooks.js +0 -409
  165. package/dist/convex/workspaces.js +0 -879
  166. package/dist/hivr-whitelist.d.ts +0 -18
  167. package/dist/hivr-whitelist.d.ts.map +0 -1
  168. package/dist/hivr-whitelist.js +0 -95
  169. package/dist/hivr-whitelist.js.map +0 -1
  170. package/dist/http-server-minimal.d.ts +0 -7
  171. package/dist/http-server-minimal.d.ts.map +0 -1
  172. package/dist/http-server-minimal.js +0 -126
  173. package/dist/http-server-minimal.js.map +0 -1
  174. package/dist/product-whitelist.d.ts +0 -37
  175. package/dist/product-whitelist.d.ts.map +0 -1
  176. package/dist/product-whitelist.js +0 -203
  177. package/dist/product-whitelist.js.map +0 -1
  178. package/dist/src/analytics.js +0 -129
  179. package/dist/src/bin.js +0 -17
  180. package/dist/src/capability-router.js +0 -240
  181. package/dist/src/chainExecutor.js +0 -451
  182. package/dist/src/chainResolver.js +0 -518
  183. package/dist/src/cli/commands/doctor.js +0 -324
  184. package/dist/src/cli/commands/mcp-install.js +0 -255
  185. package/dist/src/cli/commands/restore.js +0 -259
  186. package/dist/src/cli/commands/setup.js +0 -205
  187. package/dist/src/cli/commands/uninstall.js +0 -188
  188. package/dist/src/cli/index.js +0 -111
  189. package/dist/src/cli.js +0 -302
  190. package/dist/src/confirmation.js +0 -240
  191. package/dist/src/credentials.js +0 -357
  192. package/dist/src/credits.js +0 -260
  193. package/dist/src/crypto.js +0 -66
  194. package/dist/src/discovery.js +0 -504
  195. package/dist/src/enterprise/env.js +0 -123
  196. package/dist/src/enterprise/script-generator.js +0 -460
  197. package/dist/src/execute-dynamic.js +0 -473
  198. package/dist/src/execute.js +0 -1727
  199. package/dist/src/index.js +0 -2062
  200. package/dist/src/metered.js +0 -80
  201. package/dist/src/open-apis.js +0 -276
  202. package/dist/src/proxy.js +0 -28
  203. package/dist/src/session.js +0 -86
  204. package/dist/src/stripe.js +0 -407
  205. package/dist/src/telemetry.js +0 -49
  206. package/dist/src/types.js +0 -2
  207. package/dist/src/utils/backup.js +0 -181
  208. package/dist/src/utils/config.js +0 -220
  209. package/dist/src/utils/os.js +0 -105
  210. package/dist/src/utils/paths.js +0 -159
  211. package/landing/pages/api/discover.ts +0 -43
  212. package/landing/pages/api/health.ts +0 -20
  213. package/scripts/test-whitelist-v2.sh +0 -128
  214. package/src/access-control.ts +0 -174
  215. package/src/hivr-whitelist.ts +0 -110
  216. package/src/http-server-minimal.ts +0 -154
  217. package/src/product-whitelist.ts +0 -246
  218. package/test-actual-handlers.ts +0 -92
  219. package/test-apilayer-all-14.ts +0 -249
  220. package/test-apilayer-fixed.ts +0 -248
  221. package/test-direct-endpoints.ts +0 -174
  222. package/test-exact-endpoints.ts +0 -144
  223. package/test-final.ts +0 -83
  224. package/test-full-routing.ts +0 -100
  225. package/test-handlers-correct.ts +0 -217
  226. package/test-numverify-key.ts +0 -41
  227. package/test-via-handlers.ts +0 -92
  228. 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.17",
3
+ "version": "1.5.19",
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,8 @@
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"
84
- },
85
- "overrides": {
86
- "glob": "^13.0.0"
81
+ "typescript": "^5.9.3"
87
82
  },
88
83
  "bin": {
89
84
  "apiclaw": "./dist/bin.js",
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