@nordsym/apiclaw 1.5.10 → 1.5.12

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 (48) hide show
  1. package/APILAYER_STATUS_2026-03-24.md +38 -0
  2. package/TERMINOLOGY-AUDIT.md +99 -0
  3. package/TERMINOLOGY-FIXED.md +74 -0
  4. package/VIDEO-DEMO-GUIDE.md +82 -0
  5. package/direct-test.mjs +51 -0
  6. package/dist/cli/commands/mcp-install.d.ts.map +1 -1
  7. package/dist/cli/commands/mcp-install.js +55 -40
  8. package/dist/cli/commands/mcp-install.js.map +1 -1
  9. package/dist/credentials.d.ts.map +1 -1
  10. package/dist/credentials.js +128 -0
  11. package/dist/credentials.js.map +1 -1
  12. package/dist/discovery.d.ts.map +1 -1
  13. package/dist/discovery.js +191 -82
  14. package/dist/discovery.js.map +1 -1
  15. package/dist/execute.d.ts.map +1 -1
  16. package/dist/execute.js +53 -24
  17. package/dist/execute.js.map +1 -1
  18. package/email-templates/README.md +104 -0
  19. package/email-templates/partnership-template.html +116 -0
  20. package/landing/src/app/api/auth/magic-link/route.ts +1 -1
  21. package/landing/src/app/layout.tsx +2 -2
  22. package/landing/src/app/login/page.tsx +1 -1
  23. package/landing/src/app/page.tsx +39 -18
  24. package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +1 -1
  25. package/landing/src/app/providers/dashboard/login/page.tsx +1 -1
  26. package/landing/src/app/providers/dashboard/page.tsx +1 -1
  27. package/landing/src/app/providers/layout.tsx +1 -1
  28. package/landing/src/components/HeroTabs.tsx +2 -2
  29. package/landing/src/components/VideoDemo.tsx +94 -0
  30. package/landing/src/components/{ProviderDashboard.tsx → Workspace.tsx} +2 -2
  31. package/landing/src/lib/mock-data.ts +1 -1
  32. package/landing/src/lib/stats.json +1 -1
  33. package/package.json +1 -1
  34. package/src/cli/commands/mcp-install.ts +14 -4
  35. package/src/credentials.ts +136 -0
  36. package/src/discovery.ts +191 -82
  37. package/src/execute.ts +49 -22
  38. package/test-actual-handlers.ts +92 -0
  39. package/test-apilayer-all-14.ts +249 -0
  40. package/test-apilayer-fixed.ts +248 -0
  41. package/test-direct-endpoints.ts +174 -0
  42. package/test-exact-endpoints.ts +144 -0
  43. package/test-final.ts +83 -0
  44. package/test-full-routing.ts +100 -0
  45. package/test-handlers-correct.ts +217 -0
  46. package/test-numverify-key.ts +41 -0
  47. package/test-via-handlers.ts +92 -0
  48. package/test-worldnews.mjs +26 -0
@@ -0,0 +1,116 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>APIClaw Email Template</title>
7
+ </head>
8
+ <body style="margin: 0; padding: 0; background-color: #fafafa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;">
9
+ <table width="100%" cellpadding="0" cellspacing="0" style="background-color: #fafafa; padding: 40px 20px;">
10
+ <tr>
11
+ <td align="center">
12
+ <!-- Main container -->
13
+ <table width="600" cellpadding="0" cellspacing="0" style="background-color: #ffffff; border-radius: 16px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); overflow: hidden; border: 1px solid #e5e7eb;">
14
+
15
+ <!-- Header -->
16
+ <tr>
17
+ <td style="background-color: #ffffff; border-bottom: 1px solid #e5e7eb; padding: 32px; text-align: center;">
18
+ <div style="font-size: 28px; font-weight: bold; color: #ef4444; margin-bottom: 16px;">šŸ¦ž APIClaw</div>
19
+ <h1 style="margin: 0; font-size: 24px; font-weight: bold; color: #1a1a1a;">{{EMAIL_TITLE}}</h1>
20
+ <p style="margin: 4px 0 0 0; color: #6b7280; font-size: 14px;">{{EMAIL_SUBTITLE}}</p>
21
+ <div style="height: 4px; width: 80px; background-color: #ef4444; margin: 16px auto 0; border-radius: 2px;"></div>
22
+ </td>
23
+ </tr>
24
+
25
+ <!-- Content -->
26
+ <tr>
27
+ <td style="padding: 32px;">
28
+ <!-- Greeting -->
29
+ <p style="margin: 0 0 20px 0; color: #1a1a1a; font-size: 16px; line-height: 1.6;">
30
+ {{GREETING}}
31
+ </p>
32
+
33
+ <!-- Intro paragraph -->
34
+ <p style="margin: 0 0 20px 0; color: #4b5563; font-size: 16px; line-height: 1.6;">
35
+ {{INTRO_TEXT}}
36
+ </p>
37
+
38
+ <!-- Section 1 -->
39
+ <div style="margin: 24px 0;">
40
+ <h2 style="margin: 0 0 12px 0; font-size: 18px; font-weight: 600; color: #ef4444; border-bottom: 2px solid #f3f4f6; padding-bottom: 8px;">
41
+ {{SECTION_1_TITLE}}
42
+ </h2>
43
+ {{SECTION_1_CONTENT}}
44
+ </div>
45
+
46
+ <!-- Highlight Box (optional) -->
47
+ <div style="margin: 24px 0; background-color: #fef2f2; border-left: 4px solid #ef4444; padding: 16px; border-radius: 8px;">
48
+ <h3 style="margin: 0 0 8px 0; font-size: 16px; font-weight: 600; color: #ef4444;">
49
+ {{HIGHLIGHT_TITLE}}
50
+ </h3>
51
+ <p style="margin: 0; color: #4b5563; font-size: 14px; line-height: 1.6;">
52
+ {{HIGHLIGHT_TEXT}}
53
+ </p>
54
+ </div>
55
+
56
+ <!-- Section 2 -->
57
+ <div style="margin: 24px 0;">
58
+ <h2 style="margin: 0 0 12px 0; font-size: 18px; font-weight: 600; color: #ef4444; border-bottom: 2px solid #f3f4f6; padding-bottom: 8px;">
59
+ {{SECTION_2_TITLE}}
60
+ </h2>
61
+ {{SECTION_2_CONTENT}}
62
+ </div>
63
+
64
+ <!-- Code/Technical Block (optional) -->
65
+ <div style="background-color: #f9fafb; padding: 16px; border-radius: 8px; font-family: 'Courier New', monospace; font-size: 13px; color: #374151; line-height: 1.6;">
66
+ {{CODE_BLOCK}}
67
+ </div>
68
+
69
+ <!-- CTA Button -->
70
+ <div style="text-align: center; margin: 32px 0;">
71
+ <a href="{{CTA_LINK}}" style="display: inline-block; background-color: #ef4444; color: #ffffff; text-decoration: none; padding: 14px 32px; border-radius: 8px; font-weight: 600; font-size: 16px; box-shadow: 0 2px 4px rgba(239, 68, 68, 0.2);">
72
+ {{CTA_TEXT}}
73
+ </a>
74
+ </div>
75
+
76
+ <!-- Closing -->
77
+ <p style="margin: 24px 0 0 0; color: #4b5563; font-size: 16px; line-height: 1.6;">
78
+ {{CLOSING_TEXT}}
79
+ </p>
80
+
81
+ <!-- Signature -->
82
+ <p style="margin: 20px 0 0 0; color: #4b5563; font-size: 16px; line-height: 1.6;">
83
+ Best,<br>
84
+ <strong style="color: #1a1a1a;">Gustav Hemmingsson</strong><br>
85
+ <span style="color: #6b7280; font-size: 14px;">CEO, NordSym AB</span>
86
+ </p>
87
+ </td>
88
+ </tr>
89
+
90
+ <!-- Footer -->
91
+ <tr>
92
+ <td style="background-color: #f9fafb; border-top: 1px solid #e5e7eb; padding: 24px; text-align: center;">
93
+ <p style="margin: 0 0 8px 0; color: #6b7280; font-size: 13px;">
94
+ {{FOOTER_TEXT}}
95
+ </p>
96
+ <p style="margin: 0; color: #9ca3af; font-size: 12px;">
97
+ Questions? Contact <a href="mailto:gustav@nordsym.com" style="color: #ef4444; text-decoration: none;">gustav@nordsym.com</a>
98
+ </p>
99
+ </td>
100
+ </tr>
101
+
102
+ </table>
103
+
104
+ <!-- Signature -->
105
+ <div style="margin-top: 32px; text-align: center; color: #9ca3af; font-size: 12px;">
106
+ <p style="margin: 0;">NordSym AB (559535-5768) • Sweden</p>
107
+ <p style="margin: 4px 0 0 0;">
108
+ <a href="https://apiclaw.nordsym.com" style="color: #ef4444; text-decoration: none;">apiclaw.nordsym.com</a> •
109
+ <a href="https://github.com/nordsym/apiclaw" style="color: #ef4444; text-decoration: none;">GitHub</a>
110
+ </p>
111
+ </div>
112
+ </td>
113
+ </tr>
114
+ </table>
115
+ </body>
116
+ </html>
@@ -51,7 +51,7 @@ export async function POST(req: NextRequest) {
51
51
  </div>
52
52
 
53
53
  <p style="color: #525252; font-size: 16px; line-height: 1.6; text-align: center;">
54
- Click the button below to sign in to your provider dashboard.
54
+ Click the button below to sign in to your workspace.
55
55
  </p>
56
56
 
57
57
  <div style="text-align: center; margin: 32px 0;">
@@ -51,7 +51,7 @@ const schemaOrg = {
51
51
  "@type": "WebSite",
52
52
  "name": "APIClaw",
53
53
  "url": "https://apiclaw.nordsym.com",
54
- "description": "Your agent's API encyclopedia. Search by capability, call instantly. 22,392 APIs indexed • 1,636 Open APIs • 18 Direct Call • MCP native"
54
+ "description": "Your agent's API encyclopedia. Search by capability, call instantly. 22,392 APIs indexed • 1,636 Open APIs • 19 Direct Call • MCP native"
55
55
  },
56
56
  {
57
57
  "@type": "Organization",
@@ -63,7 +63,7 @@ const schemaOrg = {
63
63
  "name": "APIClaw",
64
64
  "applicationCategory": "DeveloperApplication",
65
65
  "operatingSystem": "Web",
66
- "description": "The API layer for AI agents. 22,392 APIs indexed, 1,636 Open APIs, 18 Direct Call providers. MCP native.",
66
+ "description": "The API layer for AI agents. 22,392 APIs indexed, 1,636 Open APIs, 19 Direct Call providers. MCP native.",
67
67
  "offers": {
68
68
  "@type": "Offer",
69
69
  "price": "0",
@@ -199,7 +199,7 @@ export default function LoginPage() {
199
199
  <p className="text-sm text-[var(--text-muted)]">
200
200
  Are you an API provider?{" "}
201
201
  <Link href="/providers/dashboard/login" className="text-accent hover:underline">
202
- Provider Dashboard
202
+ Workspace
203
203
  </Link>
204
204
  </p>
205
205
  </div>
@@ -12,11 +12,12 @@ 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";
15
16
 
16
17
  const stats = [
17
18
  { number: statsData.apiCount.toLocaleString(), label: "APIs Indexed", live: true },
18
19
  { number: statsData.openApiCount.toLocaleString(), label: "Open APIs", live: true },
19
- { number: statsData.directCallCount?.toString() || "19", label: "Direct Call", live: false },
20
+ { number: "19", label: "Direct Call", live: false },
20
21
  { number: (statsData.npmDownloads || 4232).toLocaleString(), label: "Installs", live: false },
21
22
  { number: statsData.categoryCount.toString(), label: "Categories", live: false },
22
23
  ];
@@ -146,6 +147,7 @@ const terminalLines = [
146
147
  const directCallProviders = [
147
148
  { name: "Replicate", desc: "1000+ ML models" },
148
149
  { name: "OpenRouter", desc: "100+ LLMs" },
150
+ { name: "APILayer", desc: "14 APIs" },
149
151
  { name: "Firecrawl", desc: "Web scraping" },
150
152
  { name: "E2B", desc: "Code sandbox" },
151
153
  { name: "GitHub", desc: "Repos & Issues" },
@@ -170,22 +172,23 @@ export default function Home() {
170
172
  const [waitlistEmail, setWaitlistEmail] = useState("");
171
173
  const [waitlistStatus, setWaitlistStatus] = useState<"idle" | "loading" | "success" | "error">("idle");
172
174
 
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" },
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
177
181
  { name: "ElevenLabs", desc: "Text-to-speech in 29 languages", category: "Voice & TTS" },
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" },
181
- { name: "Brave Search", desc: "Privacy-focused web search", category: "Search" },
182
- { name: "Firecrawl", desc: "Web scraping to LLM-ready markdown", category: "Search" },
183
- { name: "E2B", desc: "Secure cloud sandboxes for code execution", category: "Code Execution" },
184
- { name: "GitHub", desc: "Repos, issues, PRs, and more", category: "Developer Tools" },
185
- // New 8
186
182
  { name: "Groq", desc: "Ultra-fast LLM inference", category: "AI & LLM" },
187
183
  { name: "Deepgram", desc: "Speech-to-text transcription", category: "Voice & TTS" },
184
+ { name: "Firecrawl", desc: "Web scraping to LLM-ready markdown", category: "Search" },
185
+ { name: "Brave Search", desc: "Privacy-focused web search", category: "Search" },
188
186
  { name: "Serper", desc: "Google search API for AI", category: "Search" },
187
+ { name: "E2B", desc: "Secure cloud sandboxes for code execution", category: "Code Execution" },
188
+ { 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" },
189
192
  { name: "Mistral", desc: "Open-weight LLMs from Mistral AI", category: "AI & LLM" },
190
193
  { name: "Cohere", desc: "Enterprise NLP and embeddings", category: "AI & LLM" },
191
194
  { name: "Together AI", desc: "Open-source model inference", category: "AI & LLM" },
@@ -217,6 +220,7 @@ Voice: ElevenLabs, Deepgram, AssemblyAI
217
220
  Search: Brave Search, Serper, Firecrawl
218
221
  Code: E2B, GitHub
219
222
  Utility: Resend (email), 46elks & Twilio (SMS)
223
+ Multi-API: APILayer (exchange rates, stocks, aviation, PDF, screenshots, verification, VAT, news, scraping — 14 APIs)
220
224
 
221
225
  Your Tools:
222
226
  • call_api(provider, action, params) – Execute immediately (leave auth fields empty – APIClaw handles it)
@@ -587,12 +591,26 @@ Docs: https://apiclaw.nordsym.com/docs`;
587
591
  <p className="text-text-muted mb-4">These APIs work through APIClaw's proxy. Your agent calls them without needing API keys.</p>
588
592
  <div className="space-y-3">
589
593
  {directCallProviders.map((provider, i) => (
590
- <div key={i} className="flex items-center justify-between p-3 rounded-xl bg-surface border border-border">
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
+ }`}>
591
601
  <div>
592
- <div className="font-medium">{provider.name}</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>
593
611
  <div className="text-sm text-text-muted">{provider.desc}</div>
594
612
  </div>
595
- <span className="text-xs px-2 py-1 rounded-full bg-accent/20 text-accent">{provider.category}</span>
613
+ <span className="text-xs px-2 py-1 rounded-full bg-accent/20 text-accent flex-shrink-0 ml-3">{provider.category}</span>
596
614
  </div>
597
615
  ))}
598
616
  </div>
@@ -1029,7 +1047,7 @@ Docs: https://apiclaw.nordsym.com/docs`;
1029
1047
  </li>
1030
1048
  <li className="flex items-start gap-3 text-text-secondary text-sm">
1031
1049
  <Check className="w-5 h-5 text-accent flex-shrink-0 mt-0.5" />
1032
- 18 Direct Call providers
1050
+ 19 Direct Call providers
1033
1051
  </li>
1034
1052
  <li className="flex items-start gap-3 text-text-secondary text-sm">
1035
1053
  <Check className="w-5 h-5 text-accent flex-shrink-0 mt-0.5" />
@@ -1144,7 +1162,7 @@ Docs: https://apiclaw.nordsym.com/docs`;
1144
1162
  },
1145
1163
  {
1146
1164
  q: "How do I add my API?",
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."
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."
1148
1166
  },
1149
1167
  {
1150
1168
  q: "What's MCP?",
@@ -1327,6 +1345,9 @@ Docs: https://apiclaw.nordsym.com/docs`;
1327
1345
  </div>
1328
1346
  </div>
1329
1347
  )}
1348
+
1349
+ {/* Video Demo Bubble - Always visible */}
1350
+ <VideoDemo />
1330
1351
  </main>
1331
1352
  );
1332
1353
  }
@@ -445,7 +445,7 @@ export default function DirectCallSetupPage() {
445
445
  <label className="block text-sm font-medium mb-2">Service Account Key</label>
446
446
  <p className="text-xs text-text-muted mb-3">
447
447
  The API key APIClaw uses to make requests on behalf of your users.
448
- This is typically a privileged key from your provider dashboard.
448
+ This is typically a privileged key from your workspace.
449
449
  </p>
450
450
  <div className="relative">
451
451
  <Key className="absolute left-4 top-1/2 -translate-y-1/2 w-5 h-5 text-text-muted" />
@@ -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">Provider Dashboard</h1>
112
+ <h1 className="text-3xl font-bold mb-2">Workspace</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 ProviderDashboardRedirect() {
7
+ export default function WorkspaceRedirect() {
8
8
  const router = useRouter();
9
9
 
10
10
  useEffect(() => {
@@ -1,7 +1,7 @@
1
1
  import type { Metadata } from "next";
2
2
 
3
3
  export const metadata: Metadata = {
4
- title: "Provider Dashboard | APIClaw",
4
+ title: "Workspace | APIClaw",
5
5
  description: "Manage your APIs, view analytics, and track earnings on APIClaw.",
6
6
  };
7
7
 
@@ -179,10 +179,10 @@ export function HeroTabs() {
179
179
  </ul>
180
180
 
181
181
  <a
182
- href="/providers/dashboard"
182
+ href="/workspace"
183
183
  className="btn-primary w-full justify-center"
184
184
  >
185
- Open Provider Dashboard
185
+ Open Workspace
186
186
  <ArrowRight className="w-4 h-4" />
187
187
  </a>
188
188
  </div>
@@ -0,0 +1,94 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import { Play, X } from "lucide-react";
5
+
6
+ interface VideoDemoProps {
7
+ videoUrl?: string; // Tella embed URL
8
+ thumbnailUrl?: string; // Optional custom thumbnail
9
+ }
10
+
11
+ export function VideoDemo({
12
+ videoUrl = "PASTE_TELLA_URL_HERE",
13
+ thumbnailUrl
14
+ }: VideoDemoProps) {
15
+ const [isOpen, setIsOpen] = useState(false);
16
+ const isVideoReady = videoUrl !== "PASTE_TELLA_URL_HERE" && videoUrl.startsWith("http");
17
+
18
+ return (
19
+ <>
20
+ {/* Floating Video Button - Bottom Right */}
21
+ <button
22
+ onClick={() => setIsOpen(true)}
23
+ className="fixed bottom-8 right-8 z-40 group"
24
+ aria-label="Watch demo video"
25
+ >
26
+ <div className="relative">
27
+ {/* Pulse animation */}
28
+ <div className="absolute inset-0 bg-[#ef4444] rounded-full opacity-75 animate-ping" />
29
+
30
+ {/* Main button */}
31
+ <div className="relative bg-[#ef4444] hover:bg-[#dc2626] text-white rounded-full p-4 shadow-lg transition-all duration-200 flex items-center gap-3 pr-6">
32
+ <Play className="w-6 h-6 fill-white" />
33
+ <span className="font-medium text-sm whitespace-nowrap">
34
+ Watch Demo
35
+ </span>
36
+ </div>
37
+ </div>
38
+ </button>
39
+
40
+ {/* Video Modal */}
41
+ {isOpen && (
42
+ <div
43
+ className="fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm p-4"
44
+ onClick={() => setIsOpen(false)}
45
+ >
46
+ <div
47
+ className="relative w-full max-w-4xl bg-[var(--background)] rounded-2xl shadow-2xl overflow-hidden"
48
+ onClick={(e) => e.stopPropagation()}
49
+ >
50
+ {/* Close button */}
51
+ <button
52
+ onClick={() => setIsOpen(false)}
53
+ className="absolute top-4 right-4 z-10 bg-black/50 hover:bg-black/70 text-white rounded-full p-2 transition-colors"
54
+ aria-label="Close video"
55
+ >
56
+ <X className="w-5 h-5" />
57
+ </button>
58
+
59
+ {/* Video container - 16:9 aspect ratio */}
60
+ <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
+ )}
78
+ </div>
79
+
80
+ {/* Video info */}
81
+ <div className="p-6 border-t border-[var(--border)]">
82
+ <h3 className="text-lg font-semibold text-[var(--text)] mb-2">
83
+ šŸ¦ž APIClaw Quick Start
84
+ </h3>
85
+ <p className="text-sm text-[var(--text-muted)]">
86
+ Install and use APIClaw in under 2 minutes
87
+ </p>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ )}
92
+ </>
93
+ );
94
+ }
@@ -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 ProviderDashboard() {
53
+ export function Workspace() {
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 ProviderDashboard() {
76
76
  šŸ¦ž
77
77
  </div>
78
78
  <div>
79
- <h1 className="font-bold text-lg">Provider Dashboard</h1>
79
+ <h1 className="font-bold text-lg">Workspace</h1>
80
80
  <p className="text-sm text-text-muted">{provider.company || provider.email}</p>
81
81
  </div>
82
82
  </div>
@@ -1,4 +1,4 @@
1
- // Mock data for the provider dashboard demo
1
+ // Mock data for the workspace 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-19T12:16:00.022Z",
7
+ "generatedAt": "2026-03-24T15:40:24.031Z",
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.10",
3
+ "version": "1.5.12",
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",
@@ -275,13 +275,23 @@ export async function mcpInstallCommand(options: MCPInstallOptions): Promise<voi
275
275
  console.log(chalk.cyan('\nāœ… Dry run complete! Run without --dry-run to apply changes.\n'));
276
276
  } else if (successCount > 0) {
277
277
  console.log(chalk.green('\nāœ… APIClaw installed successfully!\n'));
278
- console.log('Next steps:');
279
- console.log(' 1. Restart your MCP client (Claude Desktop/Code)');
280
- console.log(' 2. Ask: "List available APIs"');
278
+ console.log(chalk.bold('What you get:\n'));
279
+ console.log(chalk.cyan(' šŸ” Search') + ' 22,000+ APIs indexed');
280
+ console.log(chalk.cyan(' 🌐 Open APIs') + ' 1,600 APIs - no keys needed');
281
+ console.log(chalk.cyan(' šŸ”‘ Direct Call') + ' 1,500+ endpoints - no keys needed');
281
282
  console.log('');
282
- console.log('Need help? https://apiclaw.com/docs\n');
283
+ console.log('Next:');
284
+ console.log(' 1. Restart your MCP client');
285
+ console.log(' 2. Try: "Find weather APIs"');
286
+ console.log('');
287
+ console.log('Docs: https://apiclaw.com/docs\n');
283
288
  } else {
284
289
  console.log(chalk.yellow('\nāœ… APIClaw already installed in all clients.\n'));
290
+ console.log(chalk.bold('What you have:\n'));
291
+ console.log(chalk.cyan(' šŸ” Search') + ' 22,000+ APIs indexed');
292
+ console.log(chalk.cyan(' 🌐 Open APIs') + ' 1,600 APIs - no keys needed');
293
+ console.log(chalk.cyan(' šŸ”‘ Direct Call') + ' 1,500+ endpoints - no keys needed');
294
+ console.log('');
285
295
  console.log('Run with --force to reinstall (coming soon).\n');
286
296
  }
287
297
  } else {