@nordsym/apiclaw 1.0.0 → 1.1.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 (154) hide show
  1. package/AGENTS.md +74 -0
  2. package/HEARTBEAT.md +4 -0
  3. package/IDENTITY.md +22 -0
  4. package/README.md +197 -202
  5. package/SOUL.md +36 -0
  6. package/STATUS.md +237 -0
  7. package/TOOLS.md +36 -0
  8. package/USER.md +17 -0
  9. package/{backend/convex → convex}/_generated/api.d.ts +6 -6
  10. package/convex/credits.ts +211 -0
  11. package/convex/http.ts +490 -0
  12. package/convex/providers.ts +516 -0
  13. package/convex/purchases.ts +183 -0
  14. package/convex/schema.ts +180 -0
  15. package/convex.json +3 -0
  16. package/dist/credentials.d.ts +19 -0
  17. package/dist/credentials.d.ts.map +1 -0
  18. package/dist/credentials.js +158 -0
  19. package/dist/credentials.js.map +1 -0
  20. package/dist/credits.d.ts +14 -11
  21. package/dist/credits.d.ts.map +1 -1
  22. package/dist/credits.js +151 -99
  23. package/dist/credits.js.map +1 -1
  24. package/dist/discovery.d.ts +7 -16
  25. package/dist/discovery.d.ts.map +1 -1
  26. package/dist/discovery.js +33 -40
  27. package/dist/discovery.js.map +1 -1
  28. package/dist/execute.d.ts +19 -0
  29. package/dist/execute.d.ts.map +1 -0
  30. package/dist/execute.js +285 -0
  31. package/dist/execute.js.map +1 -0
  32. package/dist/index.js +106 -30
  33. package/dist/index.js.map +1 -1
  34. package/dist/proxy.d.ts +6 -0
  35. package/dist/proxy.d.ts.map +1 -0
  36. package/dist/proxy.js +19 -0
  37. package/dist/proxy.js.map +1 -0
  38. package/dist/registry/apis.json +95362 -202
  39. package/dist/registry/apis_expanded.json +100853 -0
  40. package/dist/stripe.d.ts +68 -0
  41. package/dist/stripe.d.ts.map +1 -0
  42. package/dist/stripe.js +196 -0
  43. package/dist/stripe.js.map +1 -0
  44. package/dist/test.d.ts +3 -2
  45. package/dist/test.d.ts.map +1 -1
  46. package/dist/test.js +105 -75
  47. package/dist/test.js.map +1 -1
  48. package/dist/types.d.ts +0 -28
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/webhook.d.ts +2 -0
  51. package/dist/webhook.d.ts.map +1 -0
  52. package/dist/webhook.js +90 -0
  53. package/dist/webhook.js.map +1 -0
  54. package/landing/DESIGN.md +343 -0
  55. package/landing/package-lock.json +1190 -40
  56. package/landing/package.json +5 -2
  57. package/landing/public/android-chrome-192x192.png +0 -0
  58. package/landing/public/android-chrome-512x512.png +0 -0
  59. package/landing/public/apple-touch-icon.png +0 -0
  60. package/landing/public/demo.gif +0 -0
  61. package/landing/public/demo.mp4 +0 -0
  62. package/landing/public/favicon-16x16.png +0 -0
  63. package/landing/public/favicon-32x32.png +0 -0
  64. package/landing/public/favicon.ico +0 -0
  65. package/landing/public/favicon.svg +3 -0
  66. package/landing/public/icon.svg +47 -0
  67. package/landing/public/logo-mono.svg +37 -0
  68. package/landing/public/logo-simple.svg +45 -0
  69. package/landing/public/logo.svg +84 -0
  70. package/landing/public/og-image.png +0 -0
  71. package/landing/public/og-template.html +184 -0
  72. package/landing/public/site.webmanifest +31 -0
  73. package/landing/scripts/generate-assets.js +284 -0
  74. package/landing/scripts/generate-pngs.js +48 -0
  75. package/landing/scripts/generate-stats.js +42 -0
  76. package/landing/src/app/admin/page.tsx +348 -0
  77. package/landing/src/app/api/auth/magic-link/route.ts +73 -0
  78. package/landing/src/app/api/auth/session/route.ts +38 -0
  79. package/landing/src/app/api/auth/verify/route.ts +43 -0
  80. package/landing/src/app/api/og/route.tsx +74 -0
  81. package/landing/src/app/globals.css +439 -100
  82. package/landing/src/app/layout.tsx +37 -9
  83. package/landing/src/app/page.tsx +640 -552
  84. package/landing/src/app/providers/dashboard/login/page.tsx +176 -0
  85. package/landing/src/app/providers/dashboard/page.tsx +589 -0
  86. package/landing/src/app/providers/dashboard/verify/page.tsx +106 -0
  87. package/landing/src/app/providers/layout.tsx +14 -0
  88. package/landing/src/app/providers/page.tsx +402 -0
  89. package/landing/src/app/providers/register/page.tsx +670 -0
  90. package/landing/src/components/ProviderDashboard.tsx +794 -0
  91. package/landing/src/hooks/useDashboardData.ts +99 -0
  92. package/landing/src/lib/apis.json +116054 -0
  93. package/landing/src/lib/convex-client.ts +106 -0
  94. package/landing/src/lib/mock-data.ts +285 -0
  95. package/landing/src/lib/stats.json +6 -0
  96. package/landing/tailwind.config.ts +12 -11
  97. package/landing/tsconfig.tsbuildinfo +1 -0
  98. package/package.json +21 -20
  99. package/scripts/SYMBOT-FIX.md +238 -0
  100. package/scripts/demo-simulation.py +177 -0
  101. package/scripts/expand-more.py +502 -0
  102. package/scripts/expand-registry.py +434 -0
  103. package/scripts/history-sanitizer.ts +272 -0
  104. package/scripts/mass-scrape.py +1308 -0
  105. package/scripts/sync-and-deploy.sh +36 -0
  106. package/src/credentials.ts +177 -0
  107. package/src/credits.ts +190 -122
  108. package/src/discovery.ts +45 -58
  109. package/src/execute.ts +350 -0
  110. package/src/index.ts +113 -31
  111. package/src/proxy.ts +24 -0
  112. package/src/registry/apis.json +95362 -202
  113. package/src/registry/apis_expanded.json +100853 -0
  114. package/src/stripe.ts +243 -0
  115. package/src/test.ts +127 -89
  116. package/src/types.ts +0 -34
  117. package/src/webhook.ts +107 -0
  118. package/.github/ISSUE_TEMPLATE/add-api.yml +0 -123
  119. package/BRIEFING.md +0 -30
  120. package/backend/convex/apiKeys.ts +0 -75
  121. package/backend/convex/purchases.ts +0 -74
  122. package/backend/convex/schema.ts +0 -45
  123. package/backend/convex/transactions.ts +0 -57
  124. package/backend/convex/users.ts +0 -94
  125. package/backend/package-lock.json +0 -521
  126. package/backend/package.json +0 -15
  127. package/dist/registry/parse_apis.py +0 -146
  128. package/dist/revenuecat.d.ts +0 -61
  129. package/dist/revenuecat.d.ts.map +0 -1
  130. package/dist/revenuecat.js +0 -166
  131. package/dist/revenuecat.js.map +0 -1
  132. package/dist/webhooks/revenuecat.d.ts +0 -48
  133. package/dist/webhooks/revenuecat.d.ts.map +0 -1
  134. package/dist/webhooks/revenuecat.js +0 -119
  135. package/dist/webhooks/revenuecat.js.map +0 -1
  136. package/docs/revenuecat-setup.md +0 -89
  137. package/landing/src/app/api/keys/route.ts +0 -71
  138. package/landing/src/app/api/log/route.ts +0 -37
  139. package/landing/src/app/api/stats/route.ts +0 -37
  140. package/landing/src/app/page.tsx.bak +0 -567
  141. package/landing/src/components/AddKeyModal.tsx +0 -159
  142. package/newsletter-template.html +0 -71
  143. package/outreach/OUTREACH-SYSTEM.md +0 -211
  144. package/outreach/email-template.html +0 -179
  145. package/outreach/targets.md +0 -133
  146. package/src/registry/parse_apis.py +0 -146
  147. package/src/revenuecat.ts +0 -239
  148. package/src/webhooks/revenuecat.ts +0 -187
  149. /package/{backend/convex → convex}/README.md +0 -0
  150. /package/{backend/convex → convex}/_generated/api.js +0 -0
  151. /package/{backend/convex → convex}/_generated/dataModel.d.ts +0 -0
  152. /package/{backend/convex → convex}/_generated/server.d.ts +0 -0
  153. /package/{backend/convex → convex}/_generated/server.js +0 -0
  154. /package/{backend/convex → convex}/tsconfig.json +0 -0
@@ -0,0 +1,434 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ APIClaw Registry Expansion Script
4
+ Aggregates APIs from multiple sources and deduplicates them.
5
+ Target: 5,000+ APIs
6
+ """
7
+
8
+ import json
9
+ import re
10
+ import hashlib
11
+ from datetime import datetime
12
+ from pathlib import Path
13
+ import urllib.request
14
+ import ssl
15
+
16
+ # Category mapping for standardization
17
+ CATEGORY_MAP = {
18
+ 'cloud': 'Cloud',
19
+ 'payment': 'Finance',
20
+ 'financial': 'Finance',
21
+ 'finance': 'Finance',
22
+ 'social': 'Social',
23
+ 'weather': 'Weather',
24
+ 'geocoding': 'Geocoding',
25
+ 'location': 'Geocoding',
26
+ 'machine_learning': 'Machine Learning',
27
+ 'ai': 'Machine Learning',
28
+ 'iot': 'IoT',
29
+ 'security': 'Security',
30
+ 'analytics': 'Analytics',
31
+ 'ecommerce': 'Shopping',
32
+ 'email': 'Email',
33
+ 'entertainment': 'Entertainment',
34
+ 'music': 'Music',
35
+ 'video': 'Video',
36
+ 'games': 'Games',
37
+ 'news': 'News',
38
+ 'sports': 'Sports',
39
+ 'health': 'Health',
40
+ 'food': 'Food & Drink',
41
+ 'travel': 'Transportation',
42
+ 'transport': 'Transportation',
43
+ 'government': 'Government',
44
+ 'developer_tools': 'Development',
45
+ 'development': 'Development',
46
+ 'open_data': 'Open Data',
47
+ 'text': 'Text Analysis',
48
+ 'messaging': 'Communication',
49
+ 'media': 'Media',
50
+ 'documents': 'Documents',
51
+ 'storage': 'Storage',
52
+ 'database': 'Database',
53
+ 'search': 'Search',
54
+ 'marketing': 'Marketing',
55
+ 'crm': 'Business',
56
+ 'business': 'Business',
57
+ 'education': 'Education',
58
+ 'jobs': 'Jobs',
59
+ 'real_estate': 'Real Estate',
60
+ 'cryptocurrency': 'Cryptocurrency',
61
+ 'blockchain': 'Blockchain',
62
+ }
63
+
64
+ def generate_id(name: str) -> str:
65
+ """Generate a unique ID from API name."""
66
+ clean = re.sub(r'[^a-z0-9]+', '-', name.lower()).strip('-')
67
+ return clean[:50]
68
+
69
+ def normalize_category(cat: str) -> str:
70
+ """Normalize category name."""
71
+ if not cat:
72
+ return 'Uncategorized'
73
+ cat_lower = cat.lower().replace(' ', '_').replace('-', '_')
74
+ return CATEGORY_MAP.get(cat_lower, cat.title())
75
+
76
+ def fetch_json(url: str) -> dict:
77
+ """Fetch JSON from URL."""
78
+ ctx = ssl.create_default_context()
79
+ ctx.check_hostname = False
80
+ ctx.verify_mode = ssl.CERT_NONE
81
+ try:
82
+ req = urllib.request.Request(url, headers={'User-Agent': 'APIClaw/1.0'})
83
+ with urllib.request.urlopen(req, timeout=30, context=ctx) as response:
84
+ return json.loads(response.read().decode('utf-8'))
85
+ except Exception as e:
86
+ print(f" Error fetching {url}: {e}")
87
+ return {}
88
+
89
+ def load_existing_apis(path: str) -> dict:
90
+ """Load existing APIs from file."""
91
+ with open(path, 'r') as f:
92
+ data = json.load(f)
93
+ # Create lookup by normalized name/link
94
+ existing = {}
95
+ for api in data.get('apis', []):
96
+ key = api.get('link', '').lower().rstrip('/')
97
+ if key:
98
+ existing[key] = api
99
+ name_key = api.get('name', '').lower()
100
+ if name_key:
101
+ existing[f"name:{name_key}"] = api
102
+ return existing, data
103
+
104
+ def parse_apis_guru(data: dict) -> list:
105
+ """Parse APIs from apis.guru format."""
106
+ apis = []
107
+ for provider, info in data.items():
108
+ if not isinstance(info, dict):
109
+ continue
110
+ preferred = info.get('preferred', '')
111
+ versions = info.get('versions', {})
112
+ if not versions:
113
+ continue
114
+
115
+ # Get preferred version or latest
116
+ version_info = versions.get(preferred) or list(versions.values())[0]
117
+ api_info = version_info.get('info', {})
118
+
119
+ name = api_info.get('title', provider)
120
+ description = api_info.get('description', '')[:500]
121
+
122
+ # Clean description
123
+ description = re.sub(r'<[^>]+>', '', description)
124
+ description = re.sub(r'\s+', ' ', description).strip()
125
+
126
+ categories = api_info.get('x-apisguru-categories', [])
127
+ category = normalize_category(categories[0] if categories else 'Uncategorized')
128
+
129
+ # Get link
130
+ link = ''
131
+ origins = api_info.get('x-origin', [])
132
+ if origins and isinstance(origins, list):
133
+ link = origins[0].get('url', '')
134
+
135
+ ext_docs = version_info.get('externalDocs', {})
136
+ if not link and ext_docs:
137
+ link = ext_docs.get('url', '')
138
+
139
+ if not link:
140
+ link = f"https://api.apis.guru/v2/specs/{provider}"
141
+
142
+ apis.append({
143
+ 'name': name,
144
+ 'description': description[:300] if description else f"API for {name}",
145
+ 'category': category,
146
+ 'auth': 'apiKey', # Most APIs require auth
147
+ 'https': True,
148
+ 'cors': 'unknown',
149
+ 'link': link,
150
+ 'pricing': 'unknown',
151
+ 'keywords': [provider.split('.')[0], category.lower()]
152
+ })
153
+
154
+ return apis
155
+
156
+ def get_public_apis_github() -> list:
157
+ """Fetch from public-apis GitHub (different format)."""
158
+ print("Fetching from public-apis entries.json...")
159
+ url = "https://raw.githubusercontent.com/public-apis/public-apis/master/scripts/tests/entries.json"
160
+ data = fetch_json(url)
161
+
162
+ apis = []
163
+ if isinstance(data, list):
164
+ for entry in data:
165
+ apis.append({
166
+ 'name': entry.get('API', entry.get('name', '')),
167
+ 'description': entry.get('Description', entry.get('description', '')),
168
+ 'category': normalize_category(entry.get('Category', 'Uncategorized')),
169
+ 'auth': entry.get('Auth', 'None') or 'None',
170
+ 'https': entry.get('HTTPS', True),
171
+ 'cors': entry.get('Cors', 'unknown'),
172
+ 'link': entry.get('Link', ''),
173
+ 'pricing': 'free' if not entry.get('Auth') else 'unknown',
174
+ 'keywords': []
175
+ })
176
+ return apis
177
+
178
+ # Additional curated APIs to add (high-value, popular APIs)
179
+ CURATED_APIS = [
180
+ # AI/ML
181
+ {"name": "OpenAI API", "description": "GPT-4, DALL-E, Whisper and more AI models", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://platform.openai.com/docs/api-reference", "pricing": "paid", "keywords": ["ai", "gpt", "chatgpt", "dalle"]},
182
+ {"name": "Anthropic Claude API", "description": "Claude AI models for text generation and analysis", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.anthropic.com/claude/reference", "pricing": "paid", "keywords": ["ai", "claude", "llm"]},
183
+ {"name": "Hugging Face Inference API", "description": "Run ML models for NLP, vision, and more", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://huggingface.co/docs/api-inference", "pricing": "freemium", "keywords": ["ai", "ml", "nlp", "transformers"]},
184
+ {"name": "Replicate API", "description": "Run open-source ML models in the cloud", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://replicate.com/docs/reference/http", "pricing": "paid", "keywords": ["ai", "ml", "stable-diffusion"]},
185
+ {"name": "Stability AI", "description": "Stable Diffusion and image generation APIs", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://platform.stability.ai/docs/api-reference", "pricing": "paid", "keywords": ["ai", "image", "stable-diffusion"]},
186
+ {"name": "Cohere API", "description": "NLP models for text generation and embeddings", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.cohere.com/reference/about", "pricing": "freemium", "keywords": ["ai", "nlp", "embeddings"]},
187
+ {"name": "Google Gemini API", "description": "Google's multimodal AI model", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://ai.google.dev/docs", "pricing": "freemium", "keywords": ["ai", "google", "gemini"]},
188
+ {"name": "Mistral AI", "description": "Open-weight LLMs for enterprise", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://docs.mistral.ai/api/", "pricing": "paid", "keywords": ["ai", "llm", "mistral"]},
189
+ {"name": "Perplexity API", "description": "AI-powered search and answers", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://docs.perplexity.ai/", "pricing": "paid", "keywords": ["ai", "search", "perplexity"]},
190
+ {"name": "ElevenLabs API", "description": "AI voice synthesis and cloning", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://elevenlabs.io/docs/api-reference", "pricing": "freemium", "keywords": ["ai", "voice", "tts", "speech"]},
191
+ {"name": "AssemblyAI", "description": "Speech-to-text and audio intelligence", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.assemblyai.com/docs", "pricing": "freemium", "keywords": ["ai", "speech", "transcription"]},
192
+ {"name": "Deepgram API", "description": "Real-time speech recognition", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developers.deepgram.com/docs", "pricing": "freemium", "keywords": ["ai", "speech", "transcription"]},
193
+
194
+ # Payments
195
+ {"name": "Stripe API", "description": "Payment processing and financial infrastructure", "category": "Finance", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://stripe.com/docs/api", "pricing": "paid", "keywords": ["payments", "stripe", "finance"]},
196
+ {"name": "PayPal REST API", "description": "Payment processing and checkout", "category": "Finance", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developer.paypal.com/docs/api/overview/", "pricing": "paid", "keywords": ["payments", "paypal"]},
197
+ {"name": "Square API", "description": "Payment processing and commerce platform", "category": "Finance", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developer.squareup.com/reference/square", "pricing": "paid", "keywords": ["payments", "square", "pos"]},
198
+ {"name": "Plaid API", "description": "Connect bank accounts and financial data", "category": "Finance", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://plaid.com/docs/", "pricing": "paid", "keywords": ["banking", "plaid", "fintech"]},
199
+ {"name": "Wise API", "description": "International money transfers", "category": "Finance", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://api-docs.wise.com/", "pricing": "paid", "keywords": ["payments", "transfers", "wise"]},
200
+
201
+ # Communication
202
+ {"name": "Twilio API", "description": "SMS, voice, video, and messaging", "category": "Communication", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.twilio.com/docs/usage/api", "pricing": "paid", "keywords": ["sms", "voice", "twilio"]},
203
+ {"name": "SendGrid API", "description": "Email delivery and marketing", "category": "Email", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.sendgrid.com/api-reference", "pricing": "freemium", "keywords": ["email", "sendgrid"]},
204
+ {"name": "Mailgun API", "description": "Transactional email service", "category": "Email", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://documentation.mailgun.com/en/latest/api_reference.html", "pricing": "freemium", "keywords": ["email", "mailgun"]},
205
+ {"name": "Postmark API", "description": "Transactional email delivery", "category": "Email", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://postmarkapp.com/developer", "pricing": "paid", "keywords": ["email", "postmark"]},
206
+ {"name": "Slack API", "description": "Workspace messaging and apps", "category": "Communication", "auth": "OAuth", "https": True, "cors": "yes", "link": "https://api.slack.com/", "pricing": "freemium", "keywords": ["slack", "messaging", "workspace"]},
207
+ {"name": "Discord API", "description": "Chat, voice, and community platform", "category": "Communication", "auth": "OAuth", "https": True, "cors": "yes", "link": "https://discord.com/developers/docs/intro", "pricing": "free", "keywords": ["discord", "chat", "gaming"]},
208
+ {"name": "Telegram Bot API", "description": "Create bots for Telegram", "category": "Communication", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://core.telegram.org/bots/api", "pricing": "free", "keywords": ["telegram", "bot", "messaging"]},
209
+ {"name": "WhatsApp Business API", "description": "Business messaging on WhatsApp", "category": "Communication", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developers.facebook.com/docs/whatsapp/", "pricing": "paid", "keywords": ["whatsapp", "messaging"]},
210
+
211
+ # Social Media
212
+ {"name": "Twitter/X API v2", "description": "Access tweets, users, and trends", "category": "Social", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developer.twitter.com/en/docs/twitter-api", "pricing": "freemium", "keywords": ["twitter", "x", "social"]},
213
+ {"name": "Instagram Graph API", "description": "Instagram business and creator accounts", "category": "Social", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developers.facebook.com/docs/instagram-api/", "pricing": "free", "keywords": ["instagram", "social", "photos"]},
214
+ {"name": "Facebook Graph API", "description": "Access Facebook data and features", "category": "Social", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developers.facebook.com/docs/graph-api/", "pricing": "free", "keywords": ["facebook", "social"]},
215
+ {"name": "LinkedIn API", "description": "Professional networking data", "category": "Social", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://learn.microsoft.com/en-us/linkedin/", "pricing": "free", "keywords": ["linkedin", "professional", "jobs"]},
216
+ {"name": "TikTok API", "description": "TikTok creator and business tools", "category": "Social", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developers.tiktok.com/", "pricing": "free", "keywords": ["tiktok", "video", "social"]},
217
+ {"name": "Reddit API", "description": "Access Reddit posts and communities", "category": "Social", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://www.reddit.com/dev/api/", "pricing": "free", "keywords": ["reddit", "social", "community"]},
218
+ {"name": "YouTube Data API", "description": "YouTube videos, channels, and playlists", "category": "Video", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developers.google.com/youtube/v3", "pricing": "free", "keywords": ["youtube", "video", "google"]},
219
+ {"name": "Vimeo API", "description": "Video hosting and streaming", "category": "Video", "auth": "OAuth", "https": True, "cors": "yes", "link": "https://developer.vimeo.com/api", "pricing": "freemium", "keywords": ["vimeo", "video"]},
220
+
221
+ # Maps & Location
222
+ {"name": "Google Maps Platform", "description": "Maps, routes, and places", "category": "Geocoding", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developers.google.com/maps/documentation", "pricing": "freemium", "keywords": ["maps", "google", "geocoding"]},
223
+ {"name": "Mapbox API", "description": "Custom maps and location services", "category": "Geocoding", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.mapbox.com/api/", "pricing": "freemium", "keywords": ["maps", "mapbox", "location"]},
224
+ {"name": "OpenStreetMap Nominatim", "description": "Free geocoding and reverse geocoding", "category": "Geocoding", "auth": "None", "https": True, "cors": "yes", "link": "https://nominatim.org/release-docs/develop/api/", "pricing": "free", "keywords": ["maps", "osm", "geocoding"]},
225
+ {"name": "HERE API", "description": "Location services and mapping", "category": "Geocoding", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developer.here.com/documentation", "pricing": "freemium", "keywords": ["maps", "here", "location"]},
226
+ {"name": "What3Words API", "description": "3-word address system", "category": "Geocoding", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developer.what3words.com/public-api", "pricing": "freemium", "keywords": ["geocoding", "addresses"]},
227
+
228
+ # Weather
229
+ {"name": "OpenWeatherMap API", "description": "Weather data and forecasts", "category": "Weather", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://openweathermap.org/api", "pricing": "freemium", "keywords": ["weather", "forecast"]},
230
+ {"name": "Tomorrow.io Weather API", "description": "Weather intelligence platform", "category": "Weather", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.tomorrow.io/", "pricing": "freemium", "keywords": ["weather", "forecast"]},
231
+ {"name": "Visual Crossing Weather", "description": "Historical and forecast weather data", "category": "Weather", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.visualcrossing.com/weather-api", "pricing": "freemium", "keywords": ["weather", "historical"]},
232
+ {"name": "Weatherbit API", "description": "Weather forecasts and historical data", "category": "Weather", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.weatherbit.io/api", "pricing": "freemium", "keywords": ["weather", "forecast"]},
233
+
234
+ # Data & Analytics
235
+ {"name": "Algolia Search API", "description": "Search and discovery platform", "category": "Search", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.algolia.com/doc/api-reference/", "pricing": "freemium", "keywords": ["search", "algolia"]},
236
+ {"name": "Elasticsearch API", "description": "Distributed search and analytics", "category": "Search", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html", "pricing": "freemium", "keywords": ["search", "elasticsearch", "analytics"]},
237
+ {"name": "Mixpanel API", "description": "Product analytics platform", "category": "Analytics", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developer.mixpanel.com/reference", "pricing": "freemium", "keywords": ["analytics", "mixpanel"]},
238
+ {"name": "Amplitude API", "description": "Product analytics for growth", "category": "Analytics", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://www.docs.developers.amplitude.com/", "pricing": "freemium", "keywords": ["analytics", "amplitude"]},
239
+ {"name": "Segment API", "description": "Customer data platform", "category": "Analytics", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://segment.com/docs/connections/sources/catalog/libraries/server/http-api/", "pricing": "freemium", "keywords": ["analytics", "segment", "cdp"]},
240
+
241
+ # Storage & Database
242
+ {"name": "Supabase API", "description": "Open source Firebase alternative", "category": "Database", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://supabase.com/docs/reference", "pricing": "freemium", "keywords": ["database", "supabase", "postgres"]},
243
+ {"name": "Firebase API", "description": "Google's app development platform", "category": "Database", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://firebase.google.com/docs/reference", "pricing": "freemium", "keywords": ["database", "firebase", "google"]},
244
+ {"name": "MongoDB Atlas API", "description": "Cloud database service", "category": "Database", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://www.mongodb.com/docs/atlas/api/", "pricing": "freemium", "keywords": ["database", "mongodb"]},
245
+ {"name": "Airtable API", "description": "Spreadsheet-database hybrid", "category": "Database", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://airtable.com/developers/web/api/introduction", "pricing": "freemium", "keywords": ["database", "airtable", "spreadsheet"]},
246
+ {"name": "Notion API", "description": "Connected workspace platform", "category": "Productivity", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developers.notion.com/", "pricing": "freemium", "keywords": ["notion", "productivity", "workspace"]},
247
+ {"name": "Cloudinary API", "description": "Image and video management", "category": "Media", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://cloudinary.com/documentation/image_upload_api_reference", "pricing": "freemium", "keywords": ["images", "video", "cloudinary"]},
248
+ {"name": "imgix API", "description": "Real-time image processing", "category": "Media", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.imgix.com/apis/rendering", "pricing": "paid", "keywords": ["images", "imgix"]},
249
+
250
+ # E-commerce
251
+ {"name": "Shopify Admin API", "description": "E-commerce platform", "category": "Shopping", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://shopify.dev/docs/api/admin", "pricing": "paid", "keywords": ["shopify", "ecommerce"]},
252
+ {"name": "WooCommerce REST API", "description": "WordPress e-commerce", "category": "Shopping", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://woocommerce.github.io/woocommerce-rest-api-docs/", "pricing": "free", "keywords": ["woocommerce", "wordpress", "ecommerce"]},
253
+ {"name": "BigCommerce API", "description": "E-commerce platform", "category": "Shopping", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developer.bigcommerce.com/docs/rest", "pricing": "paid", "keywords": ["bigcommerce", "ecommerce"]},
254
+ {"name": "Amazon Product Advertising API", "description": "Amazon product data", "category": "Shopping", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://webservices.amazon.com/paapi5/documentation/", "pricing": "free", "keywords": ["amazon", "products", "affiliate"]},
255
+
256
+ # Development Tools
257
+ {"name": "GitHub API", "description": "Git repository and collaboration", "category": "Development", "auth": "OAuth", "https": True, "cors": "yes", "link": "https://docs.github.com/en/rest", "pricing": "freemium", "keywords": ["github", "git", "code"]},
258
+ {"name": "GitLab API", "description": "DevOps platform", "category": "Development", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.gitlab.com/ee/api/", "pricing": "freemium", "keywords": ["gitlab", "git", "devops"]},
259
+ {"name": "Bitbucket API", "description": "Git code management", "category": "Development", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developer.atlassian.com/cloud/bitbucket/rest/", "pricing": "freemium", "keywords": ["bitbucket", "git", "atlassian"]},
260
+ {"name": "npm Registry API", "description": "JavaScript package registry", "category": "Development", "auth": "None", "https": True, "cors": "yes", "link": "https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md", "pricing": "free", "keywords": ["npm", "javascript", "packages"]},
261
+ {"name": "PyPI API", "description": "Python package index", "category": "Development", "auth": "None", "https": True, "cors": "yes", "link": "https://warehouse.pypa.io/api-reference/", "pricing": "free", "keywords": ["pypi", "python", "packages"]},
262
+ {"name": "Vercel API", "description": "Frontend cloud platform", "category": "Development", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://vercel.com/docs/rest-api", "pricing": "freemium", "keywords": ["vercel", "deployment", "frontend"]},
263
+ {"name": "Netlify API", "description": "Web deployment platform", "category": "Development", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.netlify.com/api/get-started/", "pricing": "freemium", "keywords": ["netlify", "deployment"]},
264
+ {"name": "Railway API", "description": "Infrastructure platform", "category": "Development", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://docs.railway.app/reference/public-api", "pricing": "freemium", "keywords": ["railway", "deployment", "infrastructure"]},
265
+ {"name": "Render API", "description": "Cloud application hosting", "category": "Development", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://api-docs.render.com/reference/introduction", "pricing": "freemium", "keywords": ["render", "deployment", "cloud"]},
266
+ {"name": "Fly.io API", "description": "Global application platform", "category": "Development", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://fly.io/docs/machines/api/", "pricing": "freemium", "keywords": ["fly", "deployment", "edge"]},
267
+
268
+ # CRM & Business
269
+ {"name": "Salesforce REST API", "description": "CRM and business platform", "category": "Business", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/", "pricing": "paid", "keywords": ["salesforce", "crm"]},
270
+ {"name": "HubSpot API", "description": "Marketing and sales platform", "category": "Business", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developers.hubspot.com/docs/api/overview", "pricing": "freemium", "keywords": ["hubspot", "crm", "marketing"]},
271
+ {"name": "Pipedrive API", "description": "Sales CRM", "category": "Business", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developers.pipedrive.com/docs/api/v1", "pricing": "paid", "keywords": ["pipedrive", "crm", "sales"]},
272
+ {"name": "Zendesk API", "description": "Customer service platform", "category": "Business", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developer.zendesk.com/api-reference/", "pricing": "paid", "keywords": ["zendesk", "support", "customer-service"]},
273
+ {"name": "Intercom API", "description": "Customer messaging platform", "category": "Business", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developers.intercom.com/docs/references/rest-api/api.intercom.io/", "pricing": "paid", "keywords": ["intercom", "messaging", "support"]},
274
+ {"name": "Freshdesk API", "description": "Customer support software", "category": "Business", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developers.freshdesk.com/api/", "pricing": "freemium", "keywords": ["freshdesk", "support"]},
275
+
276
+ # Authentication
277
+ {"name": "Auth0 API", "description": "Identity platform", "category": "Security", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://auth0.com/docs/api", "pricing": "freemium", "keywords": ["auth0", "authentication", "identity"]},
278
+ {"name": "Okta API", "description": "Identity and access management", "category": "Security", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developer.okta.com/docs/reference/", "pricing": "paid", "keywords": ["okta", "authentication", "iam"]},
279
+ {"name": "Clerk API", "description": "User authentication and management", "category": "Security", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://clerk.com/docs/reference/backend-api", "pricing": "freemium", "keywords": ["clerk", "authentication"]},
280
+
281
+ # News & Content
282
+ {"name": "NewsAPI", "description": "News articles from around the world", "category": "News", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://newsapi.org/docs", "pricing": "freemium", "keywords": ["news", "articles"]},
283
+ {"name": "The Guardian API", "description": "Guardian news content", "category": "News", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://open-platform.theguardian.com/documentation/", "pricing": "free", "keywords": ["news", "guardian"]},
284
+ {"name": "New York Times API", "description": "NYT articles and data", "category": "News", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developer.nytimes.com/apis", "pricing": "free", "keywords": ["news", "nyt"]},
285
+ {"name": "Hacker News API", "description": "Tech news and discussions", "category": "News", "auth": "None", "https": True, "cors": "yes", "link": "https://github.com/HackerNews/API", "pricing": "free", "keywords": ["news", "tech", "hackernews"]},
286
+ {"name": "DEV.to API", "description": "Developer community content", "category": "Development", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developers.forem.com/api/", "pricing": "free", "keywords": ["dev", "community", "articles"]},
287
+ {"name": "Medium API", "description": "Publishing platform", "category": "Media", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://github.com/Medium/medium-api-docs", "pricing": "free", "keywords": ["medium", "blog", "publishing"]},
288
+
289
+ # Entertainment
290
+ {"name": "Spotify Web API", "description": "Music streaming platform", "category": "Music", "auth": "OAuth", "https": True, "cors": "yes", "link": "https://developer.spotify.com/documentation/web-api", "pricing": "free", "keywords": ["spotify", "music", "streaming"]},
291
+ {"name": "Last.fm API", "description": "Music discovery and scrobbling", "category": "Music", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.last.fm/api", "pricing": "free", "keywords": ["lastfm", "music"]},
292
+ {"name": "Deezer API", "description": "Music streaming service", "category": "Music", "auth": "OAuth", "https": True, "cors": "yes", "link": "https://developers.deezer.com/api", "pricing": "free", "keywords": ["deezer", "music"]},
293
+ {"name": "TMDB API", "description": "Movie and TV database", "category": "Entertainment", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developer.themoviedb.org/docs", "pricing": "free", "keywords": ["movies", "tv", "tmdb"]},
294
+ {"name": "OMDB API", "description": "Open movie database", "category": "Entertainment", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.omdbapi.com/", "pricing": "freemium", "keywords": ["movies", "omdb"]},
295
+ {"name": "IGDB API", "description": "Video game database", "category": "Games", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://api-docs.igdb.com/", "pricing": "free", "keywords": ["games", "igdb"]},
296
+ {"name": "RAWG API", "description": "Video games database", "category": "Games", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://rawg.io/apidocs", "pricing": "free", "keywords": ["games", "rawg"]},
297
+ {"name": "Twitch API", "description": "Live streaming platform", "category": "Entertainment", "auth": "OAuth", "https": True, "cors": "yes", "link": "https://dev.twitch.tv/docs/api/", "pricing": "free", "keywords": ["twitch", "streaming", "gaming"]},
298
+
299
+ # Crypto & Finance
300
+ {"name": "CoinGecko API", "description": "Cryptocurrency data", "category": "Cryptocurrency", "auth": "None", "https": True, "cors": "yes", "link": "https://www.coingecko.com/en/api/documentation", "pricing": "freemium", "keywords": ["crypto", "coingecko"]},
301
+ {"name": "CoinMarketCap API", "description": "Cryptocurrency market data", "category": "Cryptocurrency", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://coinmarketcap.com/api/documentation/v1/", "pricing": "freemium", "keywords": ["crypto", "coinmarketcap"]},
302
+ {"name": "Binance API", "description": "Cryptocurrency exchange", "category": "Cryptocurrency", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://binance-docs.github.io/apidocs/", "pricing": "free", "keywords": ["crypto", "binance", "trading"]},
303
+ {"name": "Coinbase API", "description": "Cryptocurrency platform", "category": "Cryptocurrency", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://docs.cloud.coinbase.com/", "pricing": "free", "keywords": ["crypto", "coinbase"]},
304
+ {"name": "Alpha Vantage API", "description": "Stock market data", "category": "Finance", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.alphavantage.co/documentation/", "pricing": "freemium", "keywords": ["stocks", "finance", "market"]},
305
+ {"name": "Polygon.io API", "description": "Stock and crypto market data", "category": "Finance", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://polygon.io/docs/", "pricing": "freemium", "keywords": ["stocks", "crypto", "market"]},
306
+ {"name": "Finnhub API", "description": "Financial market data", "category": "Finance", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://finnhub.io/docs/api", "pricing": "freemium", "keywords": ["stocks", "finance"]},
307
+
308
+ # Utility
309
+ {"name": "IPinfo API", "description": "IP address geolocation", "category": "Geocoding", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://ipinfo.io/developers", "pricing": "freemium", "keywords": ["ip", "geolocation"]},
310
+ {"name": "ip-api", "description": "IP geolocation API", "category": "Geocoding", "auth": "None", "https": True, "cors": "yes", "link": "https://ip-api.com/docs/", "pricing": "free", "keywords": ["ip", "geolocation"]},
311
+ {"name": "Abstract API", "description": "Various utility APIs", "category": "Development", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.abstractapi.com/", "pricing": "freemium", "keywords": ["utility", "validation"]},
312
+ {"name": "Hunter.io API", "description": "Email finder and verifier", "category": "Email", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://hunter.io/api-documentation/v2", "pricing": "freemium", "keywords": ["email", "hunter", "leads"]},
313
+ {"name": "Clearbit API", "description": "Business intelligence data", "category": "Business", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://clearbit.com/docs", "pricing": "paid", "keywords": ["clearbit", "enrichment", "data"]},
314
+ {"name": "FullContact API", "description": "Identity resolution", "category": "Business", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://platform.fullcontact.com/docs/apis/", "pricing": "paid", "keywords": ["identity", "enrichment"]},
315
+ {"name": "ZeroBounce API", "description": "Email validation", "category": "Email", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.zerobounce.net/docs/", "pricing": "freemium", "keywords": ["email", "validation"]},
316
+ {"name": "PDF.co API", "description": "PDF generation and parsing", "category": "Documents", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developer.pdf.co/", "pricing": "freemium", "keywords": ["pdf", "documents"]},
317
+ {"name": "DocuSign API", "description": "Electronic signatures", "category": "Documents", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developers.docusign.com/docs/", "pricing": "paid", "keywords": ["docusign", "esignature"]},
318
+ {"name": "Calendly API", "description": "Scheduling automation", "category": "Productivity", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://developer.calendly.com/api-docs", "pricing": "freemium", "keywords": ["calendly", "scheduling"]},
319
+ {"name": "Cal.com API", "description": "Open source scheduling", "category": "Productivity", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://cal.com/docs/enterprise-features/api", "pricing": "freemium", "keywords": ["scheduling", "calendar"]},
320
+ {"name": "Loom API", "description": "Video messaging platform", "category": "Video", "auth": "OAuth", "https": True, "cors": "unknown", "link": "https://dev.loom.com/docs/", "pricing": "freemium", "keywords": ["loom", "video", "recording"]},
321
+ {"name": "Mux API", "description": "Video infrastructure", "category": "Video", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.mux.com/api-reference", "pricing": "paid", "keywords": ["mux", "video", "streaming"]},
322
+ {"name": "Bannerbear API", "description": "Automated image generation", "category": "Media", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.bannerbear.com/api/", "pricing": "paid", "keywords": ["images", "automation"]},
323
+ {"name": "Remove.bg API", "description": "Background removal", "category": "Media", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.remove.bg/api", "pricing": "freemium", "keywords": ["images", "background"]},
324
+ {"name": "Unsplash API", "description": "Free high-resolution photos", "category": "Media", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://unsplash.com/documentation", "pricing": "free", "keywords": ["images", "photos", "unsplash"]},
325
+ {"name": "Pexels API", "description": "Free stock photos and videos", "category": "Media", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://www.pexels.com/api/documentation/", "pricing": "free", "keywords": ["images", "photos", "pexels"]},
326
+ {"name": "Giphy API", "description": "GIF search and discovery", "category": "Media", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developers.giphy.com/docs/api/", "pricing": "free", "keywords": ["gifs", "giphy"]},
327
+ {"name": "Tenor API", "description": "GIF search engine", "category": "Media", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://developers.google.com/tenor/guides/quickstart", "pricing": "free", "keywords": ["gifs", "tenor"]},
328
+
329
+ # More AI tools
330
+ {"name": "Pinecone API", "description": "Vector database for ML", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://docs.pinecone.io/reference", "pricing": "freemium", "keywords": ["vectors", "embeddings", "ai"]},
331
+ {"name": "Weaviate API", "description": "Open source vector database", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://weaviate.io/developers/weaviate/api", "pricing": "freemium", "keywords": ["vectors", "search", "ai"]},
332
+ {"name": "Qdrant API", "description": "Vector similarity search", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "yes", "link": "https://qdrant.tech/documentation/", "pricing": "freemium", "keywords": ["vectors", "search"]},
333
+ {"name": "LangChain API", "description": "LLM application framework", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://api.smith.langchain.com/redoc", "pricing": "freemium", "keywords": ["ai", "llm", "langchain"]},
334
+ {"name": "Groq API", "description": "Fast LLM inference", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://console.groq.com/docs/quickstart", "pricing": "freemium", "keywords": ["ai", "llm", "groq"]},
335
+ {"name": "Together AI", "description": "Open source model inference", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://docs.together.ai/reference", "pricing": "paid", "keywords": ["ai", "llm", "inference"]},
336
+ {"name": "Fireworks AI", "description": "Fast generative AI", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://readme.fireworks.ai/reference", "pricing": "paid", "keywords": ["ai", "llm", "inference"]},
337
+ {"name": "Anyscale Endpoints", "description": "LLM serving platform", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://docs.endpoints.anyscale.com/", "pricing": "paid", "keywords": ["ai", "llm", "ray"]},
338
+ {"name": "Writer API", "description": "Enterprise AI writing", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://dev.writer.com/api-guides/api-reference", "pricing": "paid", "keywords": ["ai", "writing"]},
339
+ {"name": "Jasper AI API", "description": "AI content creation", "category": "Machine Learning", "auth": "apiKey", "https": True, "cors": "unknown", "link": "https://developers.jasper.ai/docs", "pricing": "paid", "keywords": ["ai", "content", "writing"]},
340
+ ]
341
+
342
+ def main():
343
+ registry_path = Path.home() / "Projects" / "apiclaw" / "src" / "registry" / "apis.json"
344
+
345
+ print("Loading existing APIs...")
346
+ existing, original_data = load_existing_apis(registry_path)
347
+ print(f"Existing APIs: {len(original_data.get('apis', []))}")
348
+
349
+ all_apis = list(original_data.get('apis', []))
350
+ seen_links = {api.get('link', '').lower().rstrip('/') for api in all_apis if api.get('link')}
351
+ seen_names = {api.get('name', '').lower() for api in all_apis if api.get('name')}
352
+
353
+ def add_api(api):
354
+ link = api.get('link', '').lower().rstrip('/')
355
+ name = api.get('name', '').lower()
356
+
357
+ # Skip if duplicate
358
+ if link and link in seen_links:
359
+ return False
360
+ if name and name in seen_names:
361
+ return False
362
+
363
+ # Generate ID
364
+ api['id'] = generate_id(api.get('name', 'unknown'))
365
+
366
+ # Ensure all required fields
367
+ api.setdefault('description', '')
368
+ api.setdefault('category', 'Uncategorized')
369
+ api.setdefault('auth', 'None')
370
+ api.setdefault('https', True)
371
+ api.setdefault('cors', 'unknown')
372
+ api.setdefault('link', '')
373
+ api.setdefault('pricing', 'unknown')
374
+ api.setdefault('keywords', [])
375
+
376
+ # Clean description
377
+ api['description'] = api['description'][:300] if api['description'] else ''
378
+
379
+ all_apis.append(api)
380
+ if link:
381
+ seen_links.add(link)
382
+ if name:
383
+ seen_names.add(name)
384
+ return True
385
+
386
+ # Add curated APIs
387
+ print("\nAdding curated high-value APIs...")
388
+ added = 0
389
+ for api in CURATED_APIS:
390
+ if add_api(api.copy()):
391
+ added += 1
392
+ print(f"Added {added} curated APIs")
393
+
394
+ # Fetch from apis.guru
395
+ print("\nFetching from apis.guru...")
396
+ apis_guru_data = fetch_json("https://api.apis.guru/v2/list.json")
397
+ if apis_guru_data:
398
+ guru_apis = parse_apis_guru(apis_guru_data)
399
+ added = 0
400
+ for api in guru_apis:
401
+ if add_api(api):
402
+ added += 1
403
+ print(f"Added {added} APIs from apis.guru")
404
+
405
+ # Fetch public-apis entries
406
+ print("\nFetching from public-apis entries.json...")
407
+ public_apis = get_public_apis_github()
408
+ added = 0
409
+ for api in public_apis:
410
+ if add_api(api):
411
+ added += 1
412
+ print(f"Added {added} APIs from public-apis")
413
+
414
+ # Create final output
415
+ print(f"\nTotal APIs: {len(all_apis)}")
416
+
417
+ output = {
418
+ "version": "2.0.0",
419
+ "source": "APIClaw aggregated registry",
420
+ "lastUpdated": datetime.now().strftime("%Y-%m-%d"),
421
+ "count": len(all_apis),
422
+ "apis": all_apis
423
+ }
424
+
425
+ # Write output
426
+ print(f"Writing to {registry_path}...")
427
+ with open(registry_path, 'w') as f:
428
+ json.dump(output, f, indent=2)
429
+
430
+ print(f"\n✅ Done! Final count: {len(all_apis)} APIs")
431
+ return len(all_apis)
432
+
433
+ if __name__ == "__main__":
434
+ main()