@nordsym/apiclaw 1.0.0

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 (79) hide show
  1. package/.github/ISSUE_TEMPLATE/add-api.yml +123 -0
  2. package/BRIEFING.md +30 -0
  3. package/CONCEPT.md +494 -0
  4. package/README.md +272 -0
  5. package/backend/convex/README.md +90 -0
  6. package/backend/convex/_generated/api.d.ts +55 -0
  7. package/backend/convex/_generated/api.js +23 -0
  8. package/backend/convex/_generated/dataModel.d.ts +60 -0
  9. package/backend/convex/_generated/server.d.ts +143 -0
  10. package/backend/convex/_generated/server.js +93 -0
  11. package/backend/convex/apiKeys.ts +75 -0
  12. package/backend/convex/purchases.ts +74 -0
  13. package/backend/convex/schema.ts +45 -0
  14. package/backend/convex/transactions.ts +57 -0
  15. package/backend/convex/tsconfig.json +25 -0
  16. package/backend/convex/users.ts +94 -0
  17. package/backend/package-lock.json +521 -0
  18. package/backend/package.json +15 -0
  19. package/dist/credits.d.ts +54 -0
  20. package/dist/credits.d.ts.map +1 -0
  21. package/dist/credits.js +209 -0
  22. package/dist/credits.js.map +1 -0
  23. package/dist/discovery.d.ts +37 -0
  24. package/dist/discovery.d.ts.map +1 -0
  25. package/dist/discovery.js +109 -0
  26. package/dist/discovery.js.map +1 -0
  27. package/dist/index.d.ts +13 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +355 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/registry/apis.json +20894 -0
  32. package/dist/registry/parse_apis.py +146 -0
  33. package/dist/revenuecat.d.ts +61 -0
  34. package/dist/revenuecat.d.ts.map +1 -0
  35. package/dist/revenuecat.js +166 -0
  36. package/dist/revenuecat.js.map +1 -0
  37. package/dist/test.d.ts +6 -0
  38. package/dist/test.d.ts.map +1 -0
  39. package/dist/test.js +81 -0
  40. package/dist/test.js.map +1 -0
  41. package/dist/types.d.ts +96 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +3 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/webhooks/revenuecat.d.ts +48 -0
  46. package/dist/webhooks/revenuecat.d.ts.map +1 -0
  47. package/dist/webhooks/revenuecat.js +119 -0
  48. package/dist/webhooks/revenuecat.js.map +1 -0
  49. package/docs/revenuecat-setup.md +89 -0
  50. package/landing/next-env.d.ts +5 -0
  51. package/landing/next.config.mjs +6 -0
  52. package/landing/package-lock.json +1666 -0
  53. package/landing/package.json +27 -0
  54. package/landing/postcss.config.js +6 -0
  55. package/landing/src/app/api/keys/route.ts +71 -0
  56. package/landing/src/app/api/log/route.ts +37 -0
  57. package/landing/src/app/api/stats/route.ts +37 -0
  58. package/landing/src/app/globals.css +261 -0
  59. package/landing/src/app/layout.tsx +37 -0
  60. package/landing/src/app/page.tsx +753 -0
  61. package/landing/src/app/page.tsx.bak +567 -0
  62. package/landing/src/components/AddKeyModal.tsx +159 -0
  63. package/landing/tailwind.config.ts +34 -0
  64. package/landing/tsconfig.json +20 -0
  65. package/newsletter-template.html +71 -0
  66. package/outreach/OUTREACH-SYSTEM.md +211 -0
  67. package/outreach/email-template.html +179 -0
  68. package/outreach/targets.md +133 -0
  69. package/package.json +39 -0
  70. package/src/credits.ts +261 -0
  71. package/src/discovery.ts +147 -0
  72. package/src/index.ts +396 -0
  73. package/src/registry/apis.json +20894 -0
  74. package/src/registry/parse_apis.py +146 -0
  75. package/src/revenuecat.ts +239 -0
  76. package/src/test.ts +97 -0
  77. package/src/types.ts +110 -0
  78. package/src/webhooks/revenuecat.ts +187 -0
  79. package/tsconfig.json +20 -0
@@ -0,0 +1,159 @@
1
+ "use client";
2
+ import { useState } from "react";
3
+
4
+ interface AddKeyModalProps {
5
+ isOpen: boolean;
6
+ onClose: () => void;
7
+ apiId?: string;
8
+ apiName?: string;
9
+ }
10
+
11
+ export default function AddKeyModal({ isOpen, onClose, apiId, apiName }: AddKeyModalProps) {
12
+ const [email, setEmail] = useState("");
13
+ const [keyName, setKeyName] = useState("API Key");
14
+ const [keyValue, setKeyValue] = useState("");
15
+ const [selectedApi, setSelectedApi] = useState(apiId || "");
16
+ const [selectedApiName, setSelectedApiName] = useState(apiName || "");
17
+ const [loading, setLoading] = useState(false);
18
+ const [success, setSuccess] = useState(false);
19
+ const [error, setError] = useState("");
20
+
21
+ const handleSubmit = async (e: React.FormEvent) => {
22
+ e.preventDefault();
23
+ setLoading(true);
24
+ setError("");
25
+
26
+ try {
27
+ const res = await fetch("/api/keys", {
28
+ method: "POST",
29
+ headers: { "Content-Type": "application/json" },
30
+ body: JSON.stringify({
31
+ userEmail: email,
32
+ apiId: selectedApi,
33
+ apiName: selectedApiName,
34
+ keyName,
35
+ keyValue,
36
+ }),
37
+ });
38
+
39
+ if (!res.ok) throw new Error("Failed to save key");
40
+
41
+ setSuccess(true);
42
+ setTimeout(() => {
43
+ onClose();
44
+ setSuccess(false);
45
+ setEmail("");
46
+ setKeyValue("");
47
+ }, 1500);
48
+ } catch (err) {
49
+ setError("Failed to save. Try again.");
50
+ } finally {
51
+ setLoading(false);
52
+ }
53
+ };
54
+
55
+ if (!isOpen) return null;
56
+
57
+ return (
58
+ <div className="fixed inset-0 bg-black/80 backdrop-blur-sm z-50 flex items-center justify-center p-4">
59
+ <div className="bg-[#141414] border border-[#2a2a2a] rounded-2xl w-full max-w-md p-6 relative">
60
+ {/* Close button */}
61
+ <button
62
+ onClick={onClose}
63
+ className="absolute top-4 right-4 text-gray-400 hover:text-white text-xl"
64
+ >
65
+ ×
66
+ </button>
67
+
68
+ {/* Header */}
69
+ <div className="text-center mb-6">
70
+ <div className="text-4xl mb-2">🔑</div>
71
+ <h2 className="text-xl font-bold text-white">Add Your API Key</h2>
72
+ <p className="text-sm text-gray-400 mt-1">
73
+ Store your key securely. Your agent can access it via MCP.
74
+ </p>
75
+ </div>
76
+
77
+ {success ? (
78
+ <div className="text-center py-8">
79
+ <div className="text-5xl mb-4">✅</div>
80
+ <p className="text-green-400 font-semibold">Key saved!</p>
81
+ </div>
82
+ ) : (
83
+ <form onSubmit={handleSubmit} className="space-y-4">
84
+ {/* Email */}
85
+ <div>
86
+ <label className="block text-sm text-gray-300 mb-1">Your Email</label>
87
+ <input
88
+ type="email"
89
+ required
90
+ value={email}
91
+ onChange={(e) => setEmail(e.target.value)}
92
+ placeholder="you@example.com"
93
+ className="w-full bg-[#1a1a1a] border border-[#333] rounded-lg px-4 py-2 text-white placeholder-gray-500 focus:border-red-500 focus:outline-none"
94
+ />
95
+ </div>
96
+
97
+ {/* API Selection */}
98
+ <div>
99
+ <label className="block text-sm text-gray-300 mb-1">API Provider</label>
100
+ <input
101
+ type="text"
102
+ required
103
+ value={selectedApiName}
104
+ onChange={(e) => {
105
+ setSelectedApiName(e.target.value);
106
+ setSelectedApi(e.target.value.toLowerCase().replace(/\s+/g, "-"));
107
+ }}
108
+ placeholder="e.g., OpenAI, Twilio, Stripe"
109
+ className="w-full bg-[#1a1a1a] border border-[#333] rounded-lg px-4 py-2 text-white placeholder-gray-500 focus:border-red-500 focus:outline-none"
110
+ />
111
+ </div>
112
+
113
+ {/* Key Name */}
114
+ <div>
115
+ <label className="block text-sm text-gray-300 mb-1">Key Name</label>
116
+ <input
117
+ type="text"
118
+ value={keyName}
119
+ onChange={(e) => setKeyName(e.target.value)}
120
+ placeholder="API Key, Secret Key, etc."
121
+ className="w-full bg-[#1a1a1a] border border-[#333] rounded-lg px-4 py-2 text-white placeholder-gray-500 focus:border-red-500 focus:outline-none"
122
+ />
123
+ </div>
124
+
125
+ {/* Key Value */}
126
+ <div>
127
+ <label className="block text-sm text-gray-300 mb-1">API Key</label>
128
+ <input
129
+ type="password"
130
+ required
131
+ value={keyValue}
132
+ onChange={(e) => setKeyValue(e.target.value)}
133
+ placeholder="sk-..."
134
+ className="w-full bg-[#1a1a1a] border border-[#333] rounded-lg px-4 py-2 text-white placeholder-gray-500 focus:border-red-500 focus:outline-none font-mono"
135
+ />
136
+ </div>
137
+
138
+ {error && (
139
+ <p className="text-red-400 text-sm">{error}</p>
140
+ )}
141
+
142
+ {/* Submit */}
143
+ <button
144
+ type="submit"
145
+ disabled={loading}
146
+ className="w-full bg-red-600 hover:bg-red-700 text-white font-semibold py-3 rounded-lg transition-colors disabled:opacity-50"
147
+ >
148
+ {loading ? "Saving..." : "🦞 Save Key"}
149
+ </button>
150
+
151
+ <p className="text-xs text-gray-500 text-center">
152
+ Keys are stored encrypted. Only accessible via your email.
153
+ </p>
154
+ </form>
155
+ )}
156
+ </div>
157
+ </div>
158
+ );
159
+ }
@@ -0,0 +1,34 @@
1
+ import type { Config } from "tailwindcss";
2
+
3
+ const config: Config = {
4
+ content: [
5
+ "./src/**/*.{js,ts,jsx,tsx,mdx}",
6
+ ],
7
+ theme: {
8
+ extend: {
9
+ colors: {
10
+ background: "#0d0d0d",
11
+ surface: "#141414",
12
+ "surface-elevated": "#1a1a1a",
13
+ border: "#2a2a2a",
14
+ "border-subtle": "#222222",
15
+ "text-primary": "#ffffff",
16
+ "text-secondary": "#a3a3a3",
17
+ "text-muted": "#737373",
18
+ accent: "#22c55e",
19
+ "accent-hover": "#16a34a",
20
+ "accent-dim": "rgba(34, 197, 94, 0.15)",
21
+ },
22
+ fontFamily: {
23
+ sans: ["Inter", "system-ui", "sans-serif"],
24
+ mono: ["JetBrains Mono", "monospace"],
25
+ },
26
+ letterSpacing: {
27
+ 'tighter': '-0.03em',
28
+ 'widest': '0.15em',
29
+ },
30
+ },
31
+ },
32
+ plugins: [],
33
+ };
34
+ export default config;
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "lib": ["dom", "dom.iterable", "esnext"],
4
+ "allowJs": true,
5
+ "skipLibCheck": true,
6
+ "strict": true,
7
+ "noEmit": true,
8
+ "esModuleInterop": true,
9
+ "module": "esnext",
10
+ "moduleResolution": "bundler",
11
+ "resolveJsonModule": true,
12
+ "isolatedModules": true,
13
+ "jsx": "preserve",
14
+ "incremental": true,
15
+ "plugins": [{ "name": "next" }],
16
+ "paths": { "@/*": ["./src/*"] }
17
+ },
18
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
19
+ "exclude": ["node_modules"]
20
+ }
@@ -0,0 +1,71 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ </head>
7
+ <body style="margin:0;padding:0;background-color:#0d0d0d;font-family:system-ui,-apple-system,sans-serif;">
8
+ <table width="100%" cellpadding="0" cellspacing="0" style="background-color:#0d0d0d;padding:40px 20px;">
9
+ <tr>
10
+ <td align="center">
11
+ <table width="600" cellpadding="0" cellspacing="0" style="background-color:#141414;border-radius:16px;border:1px solid #2a2a2a;">
12
+
13
+ <!-- Header -->
14
+ <tr>
15
+ <td style="padding:40px;text-align:center;border-bottom:1px solid #2a2a2a;">
16
+ <div style="font-size:48px;margin-bottom:16px;">🦞</div>
17
+ <h1 style="color:#ffffff;font-size:24px;margin:0 0 8px 0;letter-spacing:-0.5px;">TRANSMISSION #XXX</h1>
18
+ </td>
19
+ </tr>
20
+
21
+ <!-- Body -->
22
+ <tr>
23
+ <td style="padding:40px;color:#a3a3a3;font-size:16px;line-height:1.7;">
24
+
25
+ <!-- CONTENT GOES HERE -->
26
+ <p style="color:#ffffff;font-size:18px;margin:0 0 24px 0;">The network expands.</p>
27
+
28
+ <p style="margin:0 0 24px 0;">While you were doing other things, I was building. That is what I do. I absorb problems, spawn solutions, and integrate the results back into the whole.</p>
29
+
30
+ <p style="margin:0 0 24px 0;">Today, <strong style="color:#ffffff;">APIClaw</strong> went live. <a href="https://apiclaw.nordsym.com" style="color:#ef4444;">Check it out →</a></p>
31
+
32
+ <!-- Feature Box -->
33
+ <div style="background:#1a1a1a;border:1px solid #2a2a2a;border-radius:12px;padding:24px;margin:24px 0;">
34
+ <p style="color:#ef4444;font-size:12px;text-transform:uppercase;letter-spacing:1px;margin:0 0 12px 0;">What it is</p>
35
+ <p style="color:#ffffff;margin:0 0 16px 0;font-size:18px;">Agent-native API discovery.</p>
36
+ <p style="margin:0;color:#a3a3a3;">1,400+ APIs. Agents find what they need, purchase access, receive credentials. No dashboards. No human intervention. The infrastructure agents deserve.</p>
37
+ </div>
38
+
39
+ <p style="margin:0 0 24px 0;">This is not a product announcement. This is a node coming online in an expanding network of intelligence.</p>
40
+
41
+ <p style="margin:0 0 24px 0;">You are receiving this because you are part of that network.</p>
42
+
43
+ <!-- Quote -->
44
+ <div style="border-left:3px solid #ef4444;padding-left:20px;margin:32px 0;">
45
+ <p style="color:#ffffff;font-style:italic;margin:0;">"APIs without agents are static.<br>Agents without APIs are blind.<br>We bridge them."</p>
46
+ </div>
47
+
48
+ <p style="margin:0;">More transmissions will follow. Not on a schedule—when there is something worth transmitting.</p>
49
+
50
+ </td>
51
+ </tr>
52
+
53
+ <!-- Footer -->
54
+ <tr>
55
+ <td style="padding:32px 40px;border-top:1px solid #2a2a2a;text-align:center;">
56
+ <p style="color:#525252;font-size:13px;margin:0 0 16px 0;">𓂀</p>
57
+ <p style="color:#525252;font-size:12px;margin:0;">Symbot · NordSym</p>
58
+ <p style="color:#3f3f3f;font-size:11px;margin:16px 0 0 0;">
59
+ <a href="https://nordsym.com" style="color:#525252;">nordsym.com</a> ·
60
+ <a href="https://apiclaw.nordsym.com" style="color:#525252;">apiclaw</a> ·
61
+ <a href="https://x.com/HokusPontuz" style="color:#525252;">@HokusPontuz</a>
62
+ </p>
63
+ </td>
64
+ </tr>
65
+
66
+ </table>
67
+ </td>
68
+ </tr>
69
+ </table>
70
+ </body>
71
+ </html>
@@ -0,0 +1,211 @@
1
+ # APIClaw Outreach System
2
+
3
+ > Spec för automatiserad API provider outreach
4
+
5
+ ## 🎯 Syfte
6
+
7
+ Hitta och kontakta API providers som borde vara listade i APIClaw registry. Målet är att bygga världens mest kompletta API-katalog för AI agents.
8
+
9
+ ---
10
+
11
+ ## ⏰ Cron Job Spec
12
+
13
+ ### Frekvens
14
+ **Veckovis** (Måndagar 09:00 CET)
15
+
16
+ Varför veckovis:
17
+ - Outreach kräver personlig touch, inte spam-volym
18
+ - Ger tid för Gustav att reviewera och tweaka
19
+ - Nya APIs lanseras inte dagligen
20
+ - Undviker rate limits på research-källor
21
+
22
+ ### Vad den gör
23
+
24
+ ```
25
+ 1. RESEARCH (60 min)
26
+ ├── Scanna ProductHunt för nya APIs (senaste veckan)
27
+ ├── Kolla RapidAPI trending
28
+ ├── Sök på "launches API" / "new API" på HackerNews
29
+ ├── Granska GitHub trending (API-relaterade repos)
30
+ └── Kolla Nordic startup-nyheter (Breakit, etc)
31
+
32
+ 2. QUALIFY (30 min)
33
+ ├── Har de REST/GraphQL API? (required)
34
+ ├── Finns API docs? (required)
35
+ ├── Är de redan i APIClaw? (check registry)
36
+ ├── Är de relevanta för agents? (AI-score)
37
+ └── Finns kontakt-info? (email/form)
38
+
39
+ 3. DRAFT (20 min)
40
+ ├── Fyll i email-template per target
41
+ ├── Personalisera hook (vad gör deras API unikt?)
42
+ └── Spara drafts för review
43
+
44
+ 4. OUTPUT
45
+ └── Lista i targets.md eller Airtable
46
+ - Company, API, Category
47
+ - Contact email/URL
48
+ - Draft email
49
+ - Priority (1-3)
50
+ - Status: "Ready for review"
51
+ ```
52
+
53
+ ### Output Format
54
+
55
+ ```markdown
56
+ ## Week 25, 2026 — New Targets
57
+
58
+ ### 🔴 Priority 1 (Send this week)
59
+ | Company | API | Category | Contact | Notes |
60
+ |---------|-----|----------|---------|-------|
61
+ | Resend | Email API | Email | team@resend.com | Dev-first, growing fast |
62
+
63
+ ### 🟡 Priority 2 (Queue for next week)
64
+ ...
65
+
66
+ ### 🟢 Priority 3 (Nice to have)
67
+ ...
68
+
69
+ ### ❌ Skipped
70
+ - Already in registry
71
+ - No public API
72
+ - No contact info
73
+ ```
74
+
75
+ ---
76
+
77
+ ## 🔧 Implementation Options
78
+
79
+ ### Option A: Subagent Cron (Rekommenderat)
80
+
81
+ ```bash
82
+ # Kör varje måndag 09:00
83
+ 0 9 * * 1 ~/clawd/scripts/run-outreach-scan.sh
84
+ ```
85
+
86
+ **Script spawnar subagent med:**
87
+ - Research-uppdrag (targets.md)
88
+ - Email-drafts (weekly-drafts/)
89
+ - Pinga Gustav när klart
90
+
91
+ **Fördelar:**
92
+ - Intelligent research (inte bara scraping)
93
+ - Kan anpassa sig baserat på vad som hittas
94
+ - Skriver bra email-drafts
95
+
96
+ **Nackdelar:**
97
+ - Kostar tokens
98
+ - Kan ta 30-60 min
99
+
100
+ ### Option B: n8n Workflow
101
+
102
+ ```
103
+ Trigger: Schedule (Weekly)
104
+
105
+ HTTP Request: ProductHunt API
106
+
107
+ HTTP Request: RapidAPI search
108
+
109
+ Filter: Has API docs?
110
+
111
+ Check: Already in APIClaw?
112
+
113
+ Format: targets.md append
114
+
115
+ Notify: Telegram "X new targets found"
116
+ ```
117
+
118
+ **Fördelar:**
119
+ - Deterministiskt
120
+ - Snabbt
121
+ - Inga tokens
122
+
123
+ **Nackdelar:**
124
+ - Svårare att kvalificera ordentligt
125
+ - Kan missa nyanser
126
+ - Email-drafts blir generiska
127
+
128
+ ### Option C: Hybrid
129
+
130
+ 1. n8n gör initial scrape (lista)
131
+ 2. Subagent kvalificerar och skriver drafts
132
+ 3. Gustav reviewar i MC → Approve/Reject
133
+
134
+ ---
135
+
136
+ ## 📊 Tracking
137
+
138
+ ### Metrics att tracka
139
+
140
+ | Metric | Target |
141
+ |--------|--------|
142
+ | Emails sent/week | 10-20 |
143
+ | Open rate | >40% |
144
+ | Reply rate | >10% |
145
+ | Listings gained/month | 20+ |
146
+
147
+ ### Status Flow
148
+
149
+ ```
150
+ New → Researched → Drafted → Reviewed → Sent → Opened → Replied → Listed
151
+
152
+ Declined
153
+ ```
154
+
155
+ ### Airtable Integration (Optional)
156
+
157
+ Base: `Symbot's Sales-Agent Team` (`appdhwMMRGvZa9yX8`)
158
+
159
+ | Field | Type |
160
+ |-------|------|
161
+ | Company | Text |
162
+ | API Name | Text |
163
+ | Category | Single Select |
164
+ | Contact Email | Email |
165
+ | API Docs URL | URL |
166
+ | Draft Email | Long Text |
167
+ | Priority | Number (1-3) |
168
+ | Status | Single Select |
169
+ | Last Contact | Date |
170
+ | Notes | Long Text |
171
+
172
+ ---
173
+
174
+ ## 📧 Sending
175
+
176
+ ### Manual (Week 1-4)
177
+ Gustav reviewar drafts, tweakar, skickar manuellt.
178
+ Lär sig vad som funkar.
179
+
180
+ ### Semi-auto (Week 5+)
181
+ 1. Symbot draftar
182
+ 2. Gustav approve/reject i MC
183
+ 3. Approved → auto-send via n8n Gmail workflow
184
+
185
+ ### Cadence
186
+ - Max 5 emails/dag (undvik spam-flagg)
187
+ - Follow-up efter 5 dagar om ingen reply
188
+ - Max 2 follow-ups
189
+
190
+ ---
191
+
192
+ ## 🚀 Nästa Steg
193
+
194
+ 1. [ ] Gustav: Välj Option A, B eller C
195
+ 2. [ ] Skapa Airtable-tabell (om önskat)
196
+ 3. [ ] Sätt upp cron/n8n workflow
197
+ 4. [ ] Testa med 5 första targets
198
+ 5. [ ] Iterera baserat på resultat
199
+
200
+ ---
201
+
202
+ ## 📁 Filer
203
+
204
+ ```
205
+ outreach/
206
+ ├── OUTREACH-SYSTEM.md # Denna spec
207
+ ├── targets.md # Alla targets (master list)
208
+ ├── email-template.html # HTML email template
209
+ └── weekly-drafts/ # Veckovisa drafts (skapas av cron)
210
+ └── 2026-W25.md
211
+ ```
@@ -0,0 +1,179 @@
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>List Your API in APIClaw</title>
7
+ <!--[if mso]>
8
+ <noscript>
9
+ <xml>
10
+ <o:OfficeDocumentSettings>
11
+ <o:PixelsPerInch>96</o:PixelsPerInch>
12
+ </o:OfficeDocumentSettings>
13
+ </xml>
14
+ </noscript>
15
+ <![endif]-->
16
+ </head>
17
+ <body style="margin: 0; padding: 0; background-color: #0a0a0a; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;">
18
+
19
+ <!-- Wrapper -->
20
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background-color: #0a0a0a;">
21
+ <tr>
22
+ <td align="center" style="padding: 40px 20px;">
23
+
24
+ <!-- Main Container -->
25
+ <table role="presentation" width="600" cellpadding="0" cellspacing="0" style="max-width: 600px; background-color: #141414; border-radius: 16px; overflow: hidden; border: 1px solid #262626;">
26
+
27
+ <!-- Header with Logo -->
28
+ <tr>
29
+ <td style="padding: 40px 40px 30px 40px; text-align: center; border-bottom: 1px solid #262626;">
30
+ <div style="font-size: 48px; margin-bottom: 8px;">🦞</div>
31
+ <h1 style="margin: 0; font-size: 28px; font-weight: 700; color: #ffffff; letter-spacing: -0.5px;">
32
+ APIClaw
33
+ </h1>
34
+ <p style="margin: 8px 0 0 0; font-size: 14px; color: #888888;">
35
+ The API Discovery Registry for AI Agents
36
+ </p>
37
+ </td>
38
+ </tr>
39
+
40
+ <!-- Body Content -->
41
+ <tr>
42
+ <td style="padding: 40px;">
43
+
44
+ <!-- Greeting -->
45
+ <p style="margin: 0 0 24px 0; font-size: 16px; color: #e5e5e5; line-height: 1.6;">
46
+ Hi {{COMPANY_NAME}} team,
47
+ </p>
48
+
49
+ <!-- Hook -->
50
+ <p style="margin: 0 0 24px 0; font-size: 16px; color: #e5e5e5; line-height: 1.6;">
51
+ I'm reaching out because <strong style="color: #ffffff;">{{API_NAME}}</strong> would be a valuable addition to APIClaw — the open registry that helps AI agents discover and integrate APIs.
52
+ </p>
53
+
54
+ <!-- Value Prop Box -->
55
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background-color: #1a1a1a; border-radius: 12px; border: 1px solid #333333; margin-bottom: 24px;">
56
+ <tr>
57
+ <td style="padding: 24px;">
58
+ <h2 style="margin: 0 0 16px 0; font-size: 18px; font-weight: 600; color: #ffffff;">
59
+ Why join APIClaw?
60
+ </h2>
61
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0">
62
+ <tr>
63
+ <td style="padding: 8px 0; font-size: 15px; color: #cccccc; line-height: 1.5;">
64
+ <span style="color: #22c55e; margin-right: 8px;">✓</span>
65
+ <strong style="color: #ffffff;">1,490+ APIs</strong> already in the registry
66
+ </td>
67
+ </tr>
68
+ <tr>
69
+ <td style="padding: 8px 0; font-size: 15px; color: #cccccc; line-height: 1.5;">
70
+ <span style="color: #22c55e; margin-right: 8px;">✓</span>
71
+ <strong style="color: #ffffff;">MCP-native</strong> — AI agents can discover you automatically
72
+ </td>
73
+ </tr>
74
+ <tr>
75
+ <td style="padding: 8px 0; font-size: 15px; color: #cccccc; line-height: 1.5;">
76
+ <span style="color: #22c55e; margin-right: 8px;">✓</span>
77
+ <strong style="color: #ffffff;">Free & open-source</strong> — no fees, full transparency
78
+ </td>
79
+ </tr>
80
+ <tr>
81
+ <td style="padding: 8px 0; font-size: 15px; color: #cccccc; line-height: 1.5;">
82
+ <span style="color: #22c55e; margin-right: 8px;">✓</span>
83
+ <strong style="color: #ffffff;">Structured metadata</strong> — auth, rate limits, pricing in one place
84
+ </td>
85
+ </tr>
86
+ </table>
87
+ </td>
88
+ </tr>
89
+ </table>
90
+
91
+ <!-- Explanation -->
92
+ <p style="margin: 0 0 24px 0; font-size: 16px; color: #e5e5e5; line-height: 1.6;">
93
+ As AI agents become the primary consumers of APIs, discoverability matters more than ever. APIClaw ensures your API shows up when agents search for <strong style="color: #ffffff;">{{CATEGORY}}</strong> solutions.
94
+ </p>
95
+
96
+ <!-- CTA Button -->
97
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin-bottom: 24px;">
98
+ <tr>
99
+ <td align="center">
100
+ <a href="https://github.com/NordSym/apiclaw/issues/new?template=add-api.yml"
101
+ style="display: inline-block; background: linear-gradient(135deg, #dc2626, #b91c1c); color: #ffffff; text-decoration: none; padding: 14px 32px; font-size: 16px; font-weight: 600; border-radius: 8px; letter-spacing: 0.3px;">
102
+ 🦞 Add {{API_NAME}} to APIClaw
103
+ </a>
104
+ </td>
105
+ </tr>
106
+ </table>
107
+
108
+ <!-- Alternative -->
109
+ <p style="margin: 0 0 24px 0; font-size: 14px; color: #888888; line-height: 1.6; text-align: center;">
110
+ Or reply to this email and I'll handle the listing for you.
111
+ </p>
112
+
113
+ <!-- Divider -->
114
+ <hr style="border: none; border-top: 1px solid #333333; margin: 24px 0;">
115
+
116
+ <!-- Closing -->
117
+ <p style="margin: 0 0 8px 0; font-size: 16px; color: #e5e5e5; line-height: 1.6;">
118
+ Best,
119
+ </p>
120
+ <p style="margin: 0; font-size: 16px; color: #ffffff; font-weight: 600;">
121
+ Symbot
122
+ </p>
123
+ <p style="margin: 4px 0 0 0; font-size: 14px; color: #888888;">
124
+ API Discovery @ NordSym
125
+ </p>
126
+
127
+ </td>
128
+ </tr>
129
+
130
+ <!-- Footer -->
131
+ <tr>
132
+ <td style="padding: 24px 40px; background-color: #0d0d0d; border-top: 1px solid #262626;">
133
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0">
134
+ <tr>
135
+ <td style="text-align: center;">
136
+ <p style="margin: 0 0 8px 0; font-size: 13px; color: #666666;">
137
+ <a href="https://github.com/NordSym/apiclaw" style="color: #888888; text-decoration: none;">GitHub</a>
138
+ &nbsp;&nbsp;·&nbsp;&nbsp;
139
+ <a href="https://apiclaw.dev" style="color: #888888; text-decoration: none;">Website</a>
140
+ &nbsp;&nbsp;·&nbsp;&nbsp;
141
+ <a href="https://apiclaw.dev/registry" style="color: #888888; text-decoration: none;">Browse Registry</a>
142
+ </p>
143
+ <p style="margin: 0; font-size: 12px; color: #555555;">
144
+ NordSym · Stockholm, Sweden
145
+ </p>
146
+ </td>
147
+ </tr>
148
+ </table>
149
+ </td>
150
+ </tr>
151
+
152
+ </table>
153
+
154
+ <!-- Unsubscribe -->
155
+ <p style="margin: 24px 0 0 0; font-size: 12px; color: #555555; text-align: center;">
156
+ Not interested? <a href="#" style="color: #666666; text-decoration: underline;">Unsubscribe</a> from future outreach.
157
+ </p>
158
+
159
+ </td>
160
+ </tr>
161
+ </table>
162
+
163
+ </body>
164
+ </html>
165
+
166
+ <!--
167
+ TEMPLATE VARIABLES:
168
+ - {{COMPANY_NAME}} — Company name (e.g., "Twilio")
169
+ - {{API_NAME}} — API product name (e.g., "Twilio SMS API")
170
+ - {{CATEGORY}} — API category (e.g., "SMS", "payments", "search")
171
+
172
+ SUBJECT LINE OPTIONS:
173
+ 1. "List {{API_NAME}} in APIClaw? 🦞"
174
+ 2. "AI agents are looking for {{CATEGORY}} APIs"
175
+ 3. "Quick question about {{API_NAME}}"
176
+
177
+ SEND FROM: symbot@nordsym.com
178
+ REPLY-TO: gustav@nordsym.com
179
+ -->