@nordsym/apiclaw 1.1.2 → 1.1.4

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 (65) hide show
  1. package/EARN-CREDITS-SPEC.md +197 -0
  2. package/README.md +11 -7
  3. package/STATUS.md +16 -15
  4. package/VISION.md +123 -0
  5. package/dist/credentials.d.ts.map +1 -1
  6. package/dist/credentials.js +11 -0
  7. package/dist/credentials.js.map +1 -1
  8. package/dist/execute.d.ts.map +1 -1
  9. package/dist/execute.js +75 -0
  10. package/dist/execute.js.map +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/proxy.d.ts.map +1 -1
  13. package/dist/proxy.js +1 -1
  14. package/dist/proxy.js.map +1 -1
  15. package/dist/registry/apis.json +93516 -7139
  16. package/dist/registry/apis_expanded.json +3123 -3
  17. package/landing/public/book/index.html +339 -0
  18. package/landing/src/app/docs/page.tsx +142 -115
  19. package/landing/src/app/earn/page.tsx +305 -0
  20. package/landing/src/app/page.tsx +16 -11
  21. package/landing/src/lib/apis.json +1 -116054
  22. package/landing/src/lib/stats.json +5 -5
  23. package/package.json +4 -1
  24. package/scripts/add-public-apis.py +625 -0
  25. package/scripts/apisguru-data.json +158837 -0
  26. package/scripts/bonus-batch.py +250 -0
  27. package/scripts/bulk-add-apisguru.js +122 -0
  28. package/scripts/expand-2026-batch.py +335 -0
  29. package/scripts/expand-from-github.py +460 -0
  30. package/scripts/expand-n4ze3m.py +198 -0
  31. package/scripts/expand-niche-batch.py +269 -0
  32. package/scripts/expand-nordic-niche.py +189 -0
  33. package/scripts/expand-tonnyL.py +343 -0
  34. package/scripts/final-batch.py +315 -0
  35. package/scripts/final-push-06.py +242 -0
  36. package/scripts/mega-expansion.py +495 -0
  37. package/scripts/mega-final-06.py +512 -0
  38. package/scripts/more-apis.py +353 -0
  39. package/scripts/night-batch-05.py +546 -0
  40. package/scripts/night-batch-05b.py +427 -0
  41. package/scripts/night-expansion-02-23-batch2.py +284 -0
  42. package/scripts/night-expansion-02-23.py +383 -0
  43. package/scripts/night-expansion-03-batch2.py +336 -0
  44. package/scripts/night-expansion-03-batch3.py +392 -0
  45. package/scripts/night-expansion-03.py +573 -0
  46. package/scripts/night-expansion-04-23.py +461 -0
  47. package/scripts/night-expansion-05-23-batch2.py +431 -0
  48. package/scripts/night-expansion-05-23-batch3.py +366 -0
  49. package/scripts/night-expansion-05-23-final.py +349 -0
  50. package/scripts/night-expansion-05-23.py +540 -0
  51. package/scripts/night-expansion-06-23-batch2.py +261 -0
  52. package/scripts/night-expansion-06-23-batch3.py +213 -0
  53. package/scripts/night-expansion-06-23-batch4.py +261 -0
  54. package/scripts/night-expansion-06-23.py +309 -0
  55. package/scripts/night-expansion-06.py +325 -0
  56. package/scripts/night-expansion.py +441 -0
  57. package/scripts/night-final-batch-04-23.py +547 -0
  58. package/scripts/night-mega-batch-04-23.py +874 -0
  59. package/scripts/super-final-06.py +341 -0
  60. package/src/credentials.ts +12 -0
  61. package/src/execute.ts +93 -0
  62. package/src/index.ts +1 -1
  63. package/src/proxy.ts +1 -1
  64. package/src/registry/apis.json +93516 -7139
  65. package/src/registry/apis_expanded.json +3123 -3
@@ -0,0 +1,305 @@
1
+ 'use client';
2
+
3
+ import Link from 'next/link';
4
+ import { useState, useEffect } from 'react';
5
+ import { Star, Twitter, Mail, Users, Sun, Moon, ArrowRight, Copy, Check, Sparkles } from 'lucide-react';
6
+
7
+ const EARN_CHANNELS = [
8
+ {
9
+ id: 'github',
10
+ iconName: 'star',
11
+ title: 'Star on GitHub',
12
+ description: 'Show some love on GitHub',
13
+ credits: 500,
14
+ cta: 'Star Repository',
15
+ href: 'https://github.com/nordsym/apiclaw',
16
+ color: 'from-amber-500/20 to-yellow-500/10',
17
+ borderColor: 'hover:border-amber-500/50',
18
+ iconColor: 'text-amber-500',
19
+ },
20
+ {
21
+ id: 'twitter',
22
+ iconName: 'twitter',
23
+ title: 'Follow @NordSym',
24
+ description: 'Stay updated on X/Twitter',
25
+ credits: 250,
26
+ cta: 'Follow Us',
27
+ href: 'https://x.com/NordSym',
28
+ color: 'from-sky-500/20 to-sky-600/10',
29
+ borderColor: 'hover:border-sky-500/50',
30
+ iconColor: 'text-sky-500',
31
+ },
32
+ {
33
+ id: 'newsletter',
34
+ iconName: 'mail',
35
+ title: 'Join Newsletter',
36
+ description: 'Get weekly updates & tips',
37
+ credits: 100,
38
+ cta: 'Subscribe',
39
+ href: '#newsletter',
40
+ color: 'from-emerald-500/20 to-emerald-600/10',
41
+ borderColor: 'hover:border-emerald-500/50',
42
+ iconColor: 'text-emerald-500',
43
+ },
44
+ {
45
+ id: 'referral',
46
+ iconName: 'users',
47
+ title: 'Invite Friends',
48
+ description: 'Earn for each friend who joins',
49
+ credits: 500,
50
+ perUnit: 'per friend',
51
+ cta: 'Copy Link',
52
+ color: 'from-orange-500/20 to-red-500/10',
53
+ borderColor: 'hover:border-orange-500/50',
54
+ iconColor: 'text-orange-500',
55
+ isReferral: true,
56
+ },
57
+ ];
58
+
59
+ const IconMap: Record<string, React.ComponentType<{ className?: string }>> = {
60
+ star: Star,
61
+ twitter: Twitter,
62
+ mail: Mail,
63
+ users: Users,
64
+ };
65
+
66
+ function generateReferralCode() {
67
+ return 'CLAW-' + Math.random().toString(36).substring(2, 8).toUpperCase();
68
+ }
69
+
70
+ export default function EarnPage() {
71
+ const [referralCode] = useState(() => generateReferralCode());
72
+ const [copied, setCopied] = useState(false);
73
+ const [email, setEmail] = useState('');
74
+ const [subscribed, setSubscribed] = useState(false);
75
+ const [totalCredits] = useState(1350); // Demo value
76
+ const [theme, setTheme] = useState<'light' | 'dark'>('dark');
77
+
78
+ useEffect(() => {
79
+ const savedTheme = localStorage.getItem('apiclaw-theme') as 'light' | 'dark' | null;
80
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
81
+ const initialTheme = savedTheme || systemTheme;
82
+ setTheme(initialTheme);
83
+ document.documentElement.classList.toggle('dark', initialTheme === 'dark');
84
+ }, []);
85
+
86
+ const toggleTheme = () => {
87
+ const newTheme = theme === 'dark' ? 'light' : 'dark';
88
+ setTheme(newTheme);
89
+ localStorage.setItem('apiclaw-theme', newTheme);
90
+ document.documentElement.classList.toggle('dark', newTheme === 'dark');
91
+ };
92
+
93
+ const copyReferralLink = () => {
94
+ const link = `https://apiclaw.com/join?ref=${referralCode}`;
95
+ navigator.clipboard.writeText(link);
96
+ setCopied(true);
97
+ setTimeout(() => setCopied(false), 2000);
98
+ };
99
+
100
+ const handleSubscribe = (e: React.FormEvent) => {
101
+ e.preventDefault();
102
+ if (email) {
103
+ setSubscribed(true);
104
+ // Would hit API here
105
+ }
106
+ };
107
+
108
+ return (
109
+ <div className="min-h-screen bg-[var(--background)] text-[var(--text-primary)]">
110
+ {/* Header */}
111
+ <header className="border-b border-[var(--border)] bg-[var(--background)]/80 backdrop-blur-xl sticky top-0 z-50">
112
+ <div className="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
113
+ <Link href="/" className="flex items-center gap-3 group">
114
+ <span className="text-2xl">🦞</span>
115
+ <span className="text-xl font-bold gradient-text-static">
116
+ APIClaw
117
+ </span>
118
+ </Link>
119
+ <nav className="flex items-center gap-6">
120
+ <Link href="/" className="text-[var(--text-secondary)] hover:text-[var(--accent)] transition-colors">
121
+ Home
122
+ </Link>
123
+ <Link href="/docs" className="text-[var(--text-secondary)] hover:text-[var(--accent)] transition-colors">
124
+ Docs
125
+ </Link>
126
+ <Link href="/providers" className="text-[var(--text-secondary)] hover:text-[var(--accent)] transition-colors">
127
+ Providers
128
+ </Link>
129
+ <button
130
+ onClick={toggleTheme}
131
+ className="p-2 rounded-lg bg-[var(--surface)] border border-[var(--border)] hover:border-[var(--accent)]/50 transition-colors"
132
+ aria-label="Toggle theme"
133
+ >
134
+ {theme === 'dark' ? <Sun className="w-5 h-5" /> : <Moon className="w-5 h-5" />}
135
+ </button>
136
+ </nav>
137
+ </div>
138
+ </header>
139
+
140
+ <main className="max-w-5xl mx-auto px-6 py-16">
141
+ {/* Hero */}
142
+ <div className="text-center mb-16">
143
+ <div className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-[var(--accent)]/10 border border-[var(--accent)]/20 text-[var(--accent)] text-sm font-medium mb-6">
144
+ <Sparkles className="w-4 h-4 animate-pulse" />
145
+ Free API Credits
146
+ </div>
147
+ <h1 className="text-4xl md:text-5xl lg:text-6xl font-bold mb-4">
148
+ <span className="gradient-text">Earn Free Credits</span>
149
+ </h1>
150
+ <p className="text-xl text-[var(--text-secondary)] max-w-2xl mx-auto">
151
+ Complete simple tasks to earn API credits. Use them for SMS, search, AI, and more.
152
+ </p>
153
+ </div>
154
+
155
+ {/* Credits Grid */}
156
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-12">
157
+ {EARN_CHANNELS.map((channel) => (
158
+ <div
159
+ key={channel.id}
160
+ className={`relative overflow-hidden rounded-2xl border border-[var(--border)] bg-gradient-to-br ${channel.color} p-8 transition-all duration-300 ${channel.borderColor} hover:translate-y-[-4px] hover:shadow-xl`}
161
+ >
162
+ {/* Icon */}
163
+ <div className="mb-4">
164
+ {(() => {
165
+ const IconComponent = IconMap[channel.iconName];
166
+ return IconComponent ? <IconComponent className={`w-12 h-12 ${channel.iconColor}`} /> : null;
167
+ })()}
168
+ </div>
169
+
170
+ {/* Content */}
171
+ <h3 className="text-xl font-bold mb-1">{channel.title}</h3>
172
+ <p className="text-[var(--text-secondary)] text-sm mb-4">
173
+ {channel.description}
174
+ </p>
175
+
176
+ {/* Credits Amount */}
177
+ <div className="flex items-baseline gap-1 mb-6">
178
+ <span className="text-3xl font-bold gradient-text-static">
179
+ +{channel.credits}
180
+ </span>
181
+ <span className="text-[var(--text-muted)] text-sm">
182
+ credits {channel.perUnit || ''}
183
+ </span>
184
+ </div>
185
+
186
+ {/* CTA Button */}
187
+ {channel.isReferral ? (
188
+ <button
189
+ onClick={copyReferralLink}
190
+ className="w-full py-3 px-6 rounded-xl bg-[var(--accent)] text-white font-semibold hover:bg-[#dc2626] transition-all flex items-center justify-center gap-2"
191
+ >
192
+ {copied ? (
193
+ <>
194
+ <Check className="w-5 h-5" /> Copied!
195
+ </>
196
+ ) : (
197
+ <>
198
+ <Copy className="w-5 h-5" /> {channel.cta}
199
+ </>
200
+ )}
201
+ </button>
202
+ ) : channel.id === 'newsletter' ? (
203
+ subscribed ? (
204
+ <div className="w-full py-3 px-6 rounded-xl bg-emerald-500/20 text-emerald-400 font-semibold text-center border border-emerald-500/30 flex items-center justify-center gap-2">
205
+ <Check className="w-5 h-5" /> Subscribed!
206
+ </div>
207
+ ) : (
208
+ <form onSubmit={handleSubscribe} className="flex gap-2">
209
+ <input
210
+ type="email"
211
+ placeholder="your@email.com"
212
+ value={email}
213
+ onChange={(e) => setEmail(e.target.value)}
214
+ className="flex-1 py-3 px-4 rounded-xl bg-[var(--surface)] border border-[var(--border)] text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:border-[var(--accent)] focus:outline-none transition-colors"
215
+ />
216
+ <button
217
+ type="submit"
218
+ className="py-3 px-6 rounded-xl bg-[var(--accent)] text-white font-semibold hover:bg-[#dc2626] transition-all"
219
+ >
220
+ <ArrowRight className="w-5 h-5" />
221
+ </button>
222
+ </form>
223
+ )
224
+ ) : (
225
+ <a
226
+ href={channel.href}
227
+ target="_blank"
228
+ rel="noopener noreferrer"
229
+ className="w-full py-3 px-6 rounded-xl bg-[var(--accent)] text-white font-semibold hover:bg-[#dc2626] transition-all flex items-center justify-center gap-2"
230
+ >
231
+ {channel.cta} <ArrowRight className="w-5 h-5" />
232
+ </a>
233
+ )}
234
+
235
+ {/* Referral Code Display */}
236
+ {channel.isReferral && (
237
+ <div className="mt-4 p-3 rounded-lg bg-[var(--surface)]/50 border border-[var(--border)]">
238
+ <p className="text-xs text-[var(--text-muted)] mb-1">Your referral code:</p>
239
+ <code className="text-sm font-mono text-[var(--accent)]">{referralCode}</code>
240
+ </div>
241
+ )}
242
+ </div>
243
+ ))}
244
+ </div>
245
+
246
+ {/* Total Credits Display */}
247
+ <div className="text-center py-12 border-t border-[var(--border)]">
248
+ <p className="text-[var(--text-muted)] text-sm uppercase tracking-widest mb-2">
249
+ Your Balance
250
+ </p>
251
+ <div className="flex items-center justify-center gap-3">
252
+ <span className="text-5xl md:text-6xl font-bold gradient-text">
253
+ {totalCredits.toLocaleString()}
254
+ </span>
255
+ <span className="text-2xl text-[var(--text-secondary)]">credits</span>
256
+ </div>
257
+ <p className="text-[var(--text-muted)] mt-4">
258
+ Credits refresh monthly • No expiration
259
+ </p>
260
+ </div>
261
+
262
+ {/* How it works */}
263
+ <div className="mt-16 p-8 rounded-2xl bg-[var(--surface)] border border-[var(--border)]">
264
+ <h2 className="text-2xl font-bold mb-6 text-center">How Credits Work</h2>
265
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-8">
266
+ <div className="text-center">
267
+ <div className="w-12 h-12 rounded-full bg-[var(--accent)]/10 text-[var(--accent)] flex items-center justify-center mx-auto mb-4 text-xl font-bold">
268
+ 1
269
+ </div>
270
+ <h3 className="font-semibold mb-2">Earn</h3>
271
+ <p className="text-[var(--text-secondary)] text-sm">
272
+ Complete tasks above to earn free API credits
273
+ </p>
274
+ </div>
275
+ <div className="text-center">
276
+ <div className="w-12 h-12 rounded-full bg-[var(--accent)]/10 text-[var(--accent)] flex items-center justify-center mx-auto mb-4 text-xl font-bold">
277
+ 2
278
+ </div>
279
+ <h3 className="font-semibold mb-2">Use</h3>
280
+ <p className="text-[var(--text-secondary)] text-sm">
281
+ Spend credits on API calls — SMS, search, AI, and more
282
+ </p>
283
+ </div>
284
+ <div className="text-center">
285
+ <div className="w-12 h-12 rounded-full bg-[var(--accent)]/10 text-[var(--accent)] flex items-center justify-center mx-auto mb-4 text-xl font-bold">
286
+ 3
287
+ </div>
288
+ <h3 className="font-semibold mb-2">Share</h3>
289
+ <p className="text-[var(--text-secondary)] text-sm">
290
+ Invite friends and earn 500 credits for each signup
291
+ </p>
292
+ </div>
293
+ </div>
294
+ </div>
295
+ </main>
296
+
297
+ {/* Footer */}
298
+ <footer className="border-t border-[var(--border)] py-8 mt-16">
299
+ <div className="max-w-6xl mx-auto px-6 text-center text-[var(--text-muted)]">
300
+ <p>🦞 APIClaw by <a href="https://nordsym.com" className="text-[var(--accent)] hover:underline">NordSym</a></p>
301
+ </div>
302
+ </footer>
303
+ </div>
304
+ );
305
+ }
@@ -33,11 +33,11 @@ const howItWorks = [
33
33
  icon: Search,
34
34
  codeJsx: (
35
35
  <>
36
- <span className="text-gray-500">{"// Agent needs to send transactional email"}</span>{"\n"}
36
+ <span className="text-gray-500">{"// Agent needs to send SMS in Sweden"}</span>{"\n"}
37
37
  <span className="text-blue-400">mcp</span>.<span className="text-yellow-400">call</span>(<span className="text-green-400">"apiclaw"</span>, {"{"}{"\n"}
38
- {" "}<span className="text-red-400">capability</span>: <span className="text-green-400">"email"</span>,{"\n"}
39
- {" "}<span className="text-red-400">type</span>: <span className="text-green-400">"transactional"</span>,{"\n"}
40
- {" "}<span className="text-red-400">maxPrice</span>: <span className="text-green-400">"$0.001/email"</span>{"\n"}
38
+ {" "}<span className="text-red-400">capability</span>: <span className="text-green-400">"sms"</span>,{"\n"}
39
+ {" "}<span className="text-red-400">region</span>: <span className="text-green-400">"sweden"</span>,{"\n"}
40
+ {" "}<span className="text-red-400">maxPrice</span>: <span className="text-green-400">"0.10/sms"</span>{"\n"}
41
41
  {"}"})
42
42
  </>
43
43
  ),
@@ -52,10 +52,10 @@ const howItWorks = [
52
52
  <span className="text-gray-500">{"// Structured response"}</span>{"\n"}
53
53
  {"{"}{"\n"}
54
54
  {" "}<span className="text-red-400">"matches"</span>: [{"\n"}
55
- {" "}{"{ "}<span className="text-red-400">"name"</span>: <span className="text-green-400">"Resend"</span>, <span className="text-red-400">"price"</span>: <span className="text-yellow-400">"$0.0005"</span>{" },"}{"\n"}
56
- {" "}{"{ "}<span className="text-red-400">"name"</span>: <span className="text-green-400">"SendGrid"</span>, <span className="text-red-400">"price"</span>: <span className="text-yellow-400">"$0.001"</span>{" }"}{"\n"}
55
+ {" "}{"{ "}<span className="text-red-400">"name"</span>: <span className="text-green-400">"46elks"</span>, <span className="text-red-400">"price"</span>: <span className="text-yellow-400">"0.05"</span>{" },"}{"\n"}
56
+ {" "}{"{ "}<span className="text-red-400">"name"</span>: <span className="text-green-400">"Twilio"</span>, <span className="text-red-400">"price"</span>: <span className="text-yellow-400">"0.08"</span>{" }"}{"\n"}
57
57
  {" "}],{"\n"}
58
- {" "}<span className="text-red-400">"bestMatch"</span>: <span className="text-green-400">"Resend"</span>{"\n"}
58
+ {" "}<span className="text-red-400">"bestMatch"</span>: <span className="text-green-400">"46elks"</span>{"\n"}
59
59
  {"}"}
60
60
  </>
61
61
  ),
@@ -70,7 +70,7 @@ const howItWorks = [
70
70
  <span className="text-gray-500">{"// Get full API spec"}</span>{"\n"}
71
71
  <span className="text-purple-400">const</span> <span className="text-blue-400">spec</span> = <span className="text-purple-400">await</span> <span className="text-blue-400">mcp</span>.<span className="text-yellow-400">call</span>(<span className="text-green-400">"apiclaw"</span>, {"{"}{"\n"}
72
72
  {" "}<span className="text-red-400">action</span>: <span className="text-green-400">"get_spec"</span>,{"\n"}
73
- {" "}<span className="text-red-400">api</span>: <span className="text-green-400">"Resend"</span>{"\n"}
73
+ {" "}<span className="text-red-400">api</span>: <span className="text-green-400">"46elks"</span>{"\n"}
74
74
  {"}"}){"\n"}
75
75
  <span className="text-gray-500">{"// → docs, auth, endpoints, examples"}</span>
76
76
  </>
@@ -686,9 +686,14 @@ export default function Home() {
686
686
  Unified billing
687
687
  </li>
688
688
  </ul>
689
- <button className="btn-secondary w-full justify-center opacity-50 cursor-not-allowed" disabled>
689
+ <a
690
+ href="https://t.me/Symbot_apiclaw_bot?start=waitlist"
691
+ target="_blank"
692
+ rel="noopener noreferrer"
693
+ className="btn-secondary w-full justify-center hover:bg-surface-elevated transition-colors"
694
+ >
690
695
  Join Waitlist
691
- </button>
696
+ </a>
692
697
  </div>
693
698
  </div>
694
699
  </div>
@@ -810,7 +815,7 @@ export default function Home() {
810
815
 
811
816
  {/* Telegram Chat Bubble */}
812
817
  <a
813
- href="https://t.me/SymbotAPI_bot"
818
+ href="https://t.me/Symbot_apiclaw_bot"
814
819
  target="_blank"
815
820
  rel="noopener noreferrer"
816
821
  className="fixed bottom-6 right-6 z-50 group"