@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.
- package/EARN-CREDITS-SPEC.md +197 -0
- package/README.md +11 -7
- package/STATUS.md +16 -15
- package/VISION.md +123 -0
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +11 -0
- package/dist/credentials.js.map +1 -1
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +75 -0
- package/dist/execute.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +1 -1
- package/dist/proxy.js.map +1 -1
- package/dist/registry/apis.json +93516 -7139
- package/dist/registry/apis_expanded.json +3123 -3
- package/landing/public/book/index.html +339 -0
- package/landing/src/app/docs/page.tsx +142 -115
- package/landing/src/app/earn/page.tsx +305 -0
- package/landing/src/app/page.tsx +16 -11
- package/landing/src/lib/apis.json +1 -116054
- package/landing/src/lib/stats.json +5 -5
- package/package.json +4 -1
- package/scripts/add-public-apis.py +625 -0
- package/scripts/apisguru-data.json +158837 -0
- package/scripts/bonus-batch.py +250 -0
- package/scripts/bulk-add-apisguru.js +122 -0
- package/scripts/expand-2026-batch.py +335 -0
- package/scripts/expand-from-github.py +460 -0
- package/scripts/expand-n4ze3m.py +198 -0
- package/scripts/expand-niche-batch.py +269 -0
- package/scripts/expand-nordic-niche.py +189 -0
- package/scripts/expand-tonnyL.py +343 -0
- package/scripts/final-batch.py +315 -0
- package/scripts/final-push-06.py +242 -0
- package/scripts/mega-expansion.py +495 -0
- package/scripts/mega-final-06.py +512 -0
- package/scripts/more-apis.py +353 -0
- package/scripts/night-batch-05.py +546 -0
- package/scripts/night-batch-05b.py +427 -0
- package/scripts/night-expansion-02-23-batch2.py +284 -0
- package/scripts/night-expansion-02-23.py +383 -0
- package/scripts/night-expansion-03-batch2.py +336 -0
- package/scripts/night-expansion-03-batch3.py +392 -0
- package/scripts/night-expansion-03.py +573 -0
- package/scripts/night-expansion-04-23.py +461 -0
- package/scripts/night-expansion-05-23-batch2.py +431 -0
- package/scripts/night-expansion-05-23-batch3.py +366 -0
- package/scripts/night-expansion-05-23-final.py +349 -0
- package/scripts/night-expansion-05-23.py +540 -0
- package/scripts/night-expansion-06-23-batch2.py +261 -0
- package/scripts/night-expansion-06-23-batch3.py +213 -0
- package/scripts/night-expansion-06-23-batch4.py +261 -0
- package/scripts/night-expansion-06-23.py +309 -0
- package/scripts/night-expansion-06.py +325 -0
- package/scripts/night-expansion.py +441 -0
- package/scripts/night-final-batch-04-23.py +547 -0
- package/scripts/night-mega-batch-04-23.py +874 -0
- package/scripts/super-final-06.py +341 -0
- package/src/credentials.ts +12 -0
- package/src/execute.ts +93 -0
- package/src/index.ts +1 -1
- package/src/proxy.ts +1 -1
- package/src/registry/apis.json +93516 -7139
- 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
|
+
}
|
package/landing/src/app/page.tsx
CHANGED
|
@@ -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
|
|
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">"
|
|
39
|
-
{" "}<span className="text-red-400">
|
|
40
|
-
{" "}<span className="text-red-400">maxPrice</span>: <span className="text-green-400">"
|
|
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">"
|
|
56
|
-
{" "}{"{ "}<span className="text-red-400">"name"</span>: <span className="text-green-400">"
|
|
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">"
|
|
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">"
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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/
|
|
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"
|