@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.
- package/.github/ISSUE_TEMPLATE/add-api.yml +123 -0
- package/BRIEFING.md +30 -0
- package/CONCEPT.md +494 -0
- package/README.md +272 -0
- package/backend/convex/README.md +90 -0
- package/backend/convex/_generated/api.d.ts +55 -0
- package/backend/convex/_generated/api.js +23 -0
- package/backend/convex/_generated/dataModel.d.ts +60 -0
- package/backend/convex/_generated/server.d.ts +143 -0
- package/backend/convex/_generated/server.js +93 -0
- package/backend/convex/apiKeys.ts +75 -0
- package/backend/convex/purchases.ts +74 -0
- package/backend/convex/schema.ts +45 -0
- package/backend/convex/transactions.ts +57 -0
- package/backend/convex/tsconfig.json +25 -0
- package/backend/convex/users.ts +94 -0
- package/backend/package-lock.json +521 -0
- package/backend/package.json +15 -0
- package/dist/credits.d.ts +54 -0
- package/dist/credits.d.ts.map +1 -0
- package/dist/credits.js +209 -0
- package/dist/credits.js.map +1 -0
- package/dist/discovery.d.ts +37 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +109 -0
- package/dist/discovery.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +355 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/apis.json +20894 -0
- package/dist/registry/parse_apis.py +146 -0
- package/dist/revenuecat.d.ts +61 -0
- package/dist/revenuecat.d.ts.map +1 -0
- package/dist/revenuecat.js +166 -0
- package/dist/revenuecat.js.map +1 -0
- package/dist/test.d.ts +6 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +81 -0
- package/dist/test.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/webhooks/revenuecat.d.ts +48 -0
- package/dist/webhooks/revenuecat.d.ts.map +1 -0
- package/dist/webhooks/revenuecat.js +119 -0
- package/dist/webhooks/revenuecat.js.map +1 -0
- package/docs/revenuecat-setup.md +89 -0
- package/landing/next-env.d.ts +5 -0
- package/landing/next.config.mjs +6 -0
- package/landing/package-lock.json +1666 -0
- package/landing/package.json +27 -0
- package/landing/postcss.config.js +6 -0
- package/landing/src/app/api/keys/route.ts +71 -0
- package/landing/src/app/api/log/route.ts +37 -0
- package/landing/src/app/api/stats/route.ts +37 -0
- package/landing/src/app/globals.css +261 -0
- package/landing/src/app/layout.tsx +37 -0
- package/landing/src/app/page.tsx +753 -0
- package/landing/src/app/page.tsx.bak +567 -0
- package/landing/src/components/AddKeyModal.tsx +159 -0
- package/landing/tailwind.config.ts +34 -0
- package/landing/tsconfig.json +20 -0
- package/newsletter-template.html +71 -0
- package/outreach/OUTREACH-SYSTEM.md +211 -0
- package/outreach/email-template.html +179 -0
- package/outreach/targets.md +133 -0
- package/package.json +39 -0
- package/src/credits.ts +261 -0
- package/src/discovery.ts +147 -0
- package/src/index.ts +396 -0
- package/src/registry/apis.json +20894 -0
- package/src/registry/parse_apis.py +146 -0
- package/src/revenuecat.ts +239 -0
- package/src/test.ts +97 -0
- package/src/types.ts +110 -0
- package/src/webhooks/revenuecat.ts +187 -0
- 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
|
+
·
|
|
139
|
+
<a href="https://apiclaw.dev" style="color: #888888; text-decoration: none;">Website</a>
|
|
140
|
+
·
|
|
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
|
+
-->
|