@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,339 @@
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>Book a Call | APIClaw</title>
7
+ <style>
8
+ * { margin: 0; padding: 0; box-sizing: border-box; }
9
+
10
+ :root {
11
+ --bg: #fafafa;
12
+ --card-bg: #ffffff;
13
+ --border: #e5e5e5;
14
+ --text: #1a1a1a;
15
+ --text-muted: #666666;
16
+ --text-subtle: #888888;
17
+ --input-bg: #f5f5f5;
18
+ --accent: #dc2626;
19
+ --accent-hover: #b91c1c;
20
+ }
21
+
22
+ [data-theme="dark"] {
23
+ --bg: #0a0a0a;
24
+ --card-bg: #141414;
25
+ --border: #262626;
26
+ --text: #e5e5e5;
27
+ --text-muted: #888888;
28
+ --text-subtle: #555555;
29
+ --input-bg: #0d0d0d;
30
+ }
31
+
32
+ body {
33
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
34
+ background: var(--bg);
35
+ color: var(--text);
36
+ min-height: 100vh;
37
+ display: flex;
38
+ flex-direction: column;
39
+ align-items: center;
40
+ padding: 40px 20px;
41
+ transition: background 0.3s, color 0.3s;
42
+ }
43
+
44
+ .container {
45
+ max-width: 500px;
46
+ width: 100%;
47
+ }
48
+
49
+ .header {
50
+ text-align: center;
51
+ margin-bottom: 40px;
52
+ position: relative;
53
+ }
54
+
55
+ .theme-toggle {
56
+ position: absolute;
57
+ top: 0;
58
+ right: 0;
59
+ background: var(--card-bg);
60
+ border: 1px solid var(--border);
61
+ border-radius: 8px;
62
+ padding: 8px 12px;
63
+ cursor: pointer;
64
+ font-size: 18px;
65
+ transition: all 0.2s;
66
+ }
67
+
68
+ .theme-toggle:hover {
69
+ border-color: var(--accent);
70
+ }
71
+
72
+ .logo { font-size: 48px; margin-bottom: 12px; }
73
+ h1 { font-size: 28px; font-weight: 700; color: var(--text); letter-spacing: -0.5px; }
74
+ .tagline { font-size: 14px; color: var(--text-muted); margin-top: 8px; }
75
+
76
+ .card {
77
+ background: var(--card-bg);
78
+ border: 1px solid var(--border);
79
+ border-radius: 16px;
80
+ padding: 32px;
81
+ transition: background 0.3s, border-color 0.3s;
82
+ }
83
+
84
+ .card h2 {
85
+ font-size: 20px;
86
+ color: var(--text);
87
+ margin-bottom: 8px;
88
+ }
89
+
90
+ .card p {
91
+ font-size: 14px;
92
+ color: var(--text-muted);
93
+ margin-bottom: 24px;
94
+ line-height: 1.5;
95
+ }
96
+
97
+ .form-group {
98
+ margin-bottom: 20px;
99
+ }
100
+
101
+ label {
102
+ display: block;
103
+ font-size: 13px;
104
+ color: var(--text-muted);
105
+ margin-bottom: 8px;
106
+ }
107
+
108
+ input, select, textarea {
109
+ width: 100%;
110
+ padding: 14px 16px;
111
+ background: var(--input-bg);
112
+ border: 1px solid var(--border);
113
+ border-radius: 8px;
114
+ color: var(--text);
115
+ font-size: 15px;
116
+ transition: border-color 0.2s, background 0.3s;
117
+ }
118
+
119
+ input:focus, select:focus, textarea:focus {
120
+ outline: none;
121
+ border-color: var(--accent);
122
+ }
123
+
124
+ textarea { resize: vertical; min-height: 80px; }
125
+
126
+ select {
127
+ appearance: none;
128
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23888' viewBox='0 0 16 16'%3E%3Cpath d='M8 11L3 6h10l-5 5z'/%3E%3C/svg%3E");
129
+ background-repeat: no-repeat;
130
+ background-position: right 16px center;
131
+ }
132
+
133
+ .btn {
134
+ width: 100%;
135
+ padding: 16px;
136
+ background: linear-gradient(135deg, var(--accent), var(--accent-hover));
137
+ color: #fff;
138
+ border: none;
139
+ border-radius: 8px;
140
+ font-size: 16px;
141
+ font-weight: 600;
142
+ cursor: pointer;
143
+ transition: transform 0.2s, box-shadow 0.2s;
144
+ }
145
+
146
+ .btn:hover {
147
+ transform: translateY(-2px);
148
+ box-shadow: 0 4px 20px rgba(220, 38, 38, 0.3);
149
+ }
150
+
151
+ .btn:disabled {
152
+ opacity: 0.6;
153
+ cursor: not-allowed;
154
+ transform: none;
155
+ }
156
+
157
+ .footer {
158
+ margin-top: 32px;
159
+ text-align: center;
160
+ font-size: 12px;
161
+ color: var(--text-subtle);
162
+ }
163
+
164
+ .footer a { color: var(--accent); text-decoration: none; }
165
+
166
+ .success {
167
+ display: none;
168
+ text-align: center;
169
+ padding: 40px 20px;
170
+ }
171
+
172
+ .success .icon { font-size: 48px; margin-bottom: 16px; }
173
+ .success h3 { font-size: 20px; color: var(--text); margin-bottom: 8px; }
174
+ .success p { color: var(--text-muted); }
175
+
176
+ .times-grid {
177
+ display: grid;
178
+ grid-template-columns: repeat(2, 1fr);
179
+ gap: 8px;
180
+ margin-bottom: 20px;
181
+ }
182
+
183
+ .time-slot {
184
+ padding: 12px;
185
+ background: var(--input-bg);
186
+ border: 1px solid var(--border);
187
+ border-radius: 8px;
188
+ text-align: center;
189
+ cursor: pointer;
190
+ transition: all 0.2s;
191
+ font-size: 14px;
192
+ color: var(--text);
193
+ }
194
+
195
+ .time-slot:hover { border-color: var(--accent); }
196
+ .time-slot.selected {
197
+ border-color: var(--accent);
198
+ background: rgba(220, 38, 38, 0.1);
199
+ color: var(--text);
200
+ }
201
+ </style>
202
+ </head>
203
+ <body>
204
+ <div class="container">
205
+ <div class="header">
206
+ <button class="theme-toggle" id="theme-toggle" title="Toggle theme">๐ŸŒ™</button>
207
+ <div class="logo">๐Ÿฆž</div>
208
+ <h1>APIClaw</h1>
209
+ <p class="tagline">The API Layer for AI Agents</p>
210
+ </div>
211
+
212
+ <div class="card" id="form-card">
213
+ <h2>Book a Call</h2>
214
+ <p>15-20 min to discuss Direct Connect partnership and API integration.</p>
215
+
216
+ <form id="booking-form">
217
+ <div class="form-group">
218
+ <label>Your Name</label>
219
+ <input type="text" name="name" required placeholder="Anders Hamnes">
220
+ </div>
221
+
222
+ <div class="form-group">
223
+ <label>Email</label>
224
+ <input type="email" name="email" required placeholder="anders@company.com">
225
+ </div>
226
+
227
+ <div class="form-group">
228
+ <label>Company</label>
229
+ <input type="text" name="company" required placeholder="Oneflow">
230
+ </div>
231
+
232
+ <div class="form-group">
233
+ <label>Preferred Day</label>
234
+ <select name="day" required>
235
+ <option value="">Select a day</option>
236
+ <option value="tuesday">Tuesday (Feb 25)</option>
237
+ <option value="wednesday">Wednesday (Feb 26)</option>
238
+ <option value="thursday">Thursday (Feb 27)</option>
239
+ <option value="friday">Friday (Feb 28)</option>
240
+ </select>
241
+ </div>
242
+
243
+ <div class="form-group">
244
+ <label>Preferred Time (CET)</label>
245
+ <div class="times-grid">
246
+ <div class="time-slot" data-time="09:00">09:00</div>
247
+ <div class="time-slot" data-time="10:00">10:00</div>
248
+ <div class="time-slot" data-time="11:00">11:00</div>
249
+ <div class="time-slot" data-time="14:00">14:00</div>
250
+ <div class="time-slot" data-time="15:00">15:00</div>
251
+ <div class="time-slot" data-time="16:00">16:00</div>
252
+ </div>
253
+ <input type="hidden" name="time" id="selected-time" required>
254
+ </div>
255
+
256
+ <div class="form-group">
257
+ <label>Anything specific? (optional)</label>
258
+ <textarea name="notes" placeholder="Tell us about your API..."></textarea>
259
+ </div>
260
+
261
+ <button type="submit" class="btn" id="submit-btn">
262
+ ๐Ÿฆž Book Meeting
263
+ </button>
264
+ </form>
265
+ </div>
266
+
267
+ <div class="card success" id="success-card">
268
+ <div class="icon">โœ…</div>
269
+ <h3>Meeting Request Sent!</h3>
270
+ <p>We'll confirm the time via email shortly.</p>
271
+ </div>
272
+
273
+ <div class="footer">
274
+ <a href="https://apiclaw.nordsym.com">apiclaw.nordsym.com</a> ยท NordSym AB
275
+ </div>
276
+ </div>
277
+
278
+ <script>
279
+ // Theme toggle
280
+ const toggle = document.getElementById('theme-toggle');
281
+ const html = document.documentElement;
282
+
283
+ // Check saved preference or system preference
284
+ const savedTheme = localStorage.getItem('theme');
285
+ if (savedTheme === 'dark') {
286
+ html.setAttribute('data-theme', 'dark');
287
+ toggle.textContent = 'โ˜€๏ธ';
288
+ }
289
+
290
+ toggle.addEventListener('click', () => {
291
+ const isDark = html.getAttribute('data-theme') === 'dark';
292
+ if (isDark) {
293
+ html.removeAttribute('data-theme');
294
+ toggle.textContent = '๐ŸŒ™';
295
+ localStorage.setItem('theme', 'light');
296
+ } else {
297
+ html.setAttribute('data-theme', 'dark');
298
+ toggle.textContent = 'โ˜€๏ธ';
299
+ localStorage.setItem('theme', 'dark');
300
+ }
301
+ });
302
+
303
+ // Time slot selection
304
+ document.querySelectorAll('.time-slot').forEach(slot => {
305
+ slot.addEventListener('click', () => {
306
+ document.querySelectorAll('.time-slot').forEach(s => s.classList.remove('selected'));
307
+ slot.classList.add('selected');
308
+ document.getElementById('selected-time').value = slot.dataset.time;
309
+ });
310
+ });
311
+
312
+ // Form submission
313
+ document.getElementById('booking-form').addEventListener('submit', async (e) => {
314
+ e.preventDefault();
315
+ const btn = document.getElementById('submit-btn');
316
+ btn.disabled = true;
317
+ btn.textContent = 'Sending...';
318
+
319
+ const formData = new FormData(e.target);
320
+ const data = Object.fromEntries(formData);
321
+
322
+ try {
323
+ await fetch('https://nordsym.app.n8n.cloud/webhook/apiclaw-booking', {
324
+ method: 'POST',
325
+ headers: { 'Content-Type': 'application/json' },
326
+ body: JSON.stringify(data)
327
+ });
328
+
329
+ document.getElementById('form-card').style.display = 'none';
330
+ document.getElementById('success-card').style.display = 'block';
331
+ } catch (err) {
332
+ alert('Something went wrong. Please email symbot@nordsym.com directly.');
333
+ btn.disabled = false;
334
+ btn.textContent = '๐Ÿฆž Book Meeting';
335
+ }
336
+ });
337
+ </script>
338
+ </body>
339
+ </html>