@nordsym/apiclaw 1.2.2 → 1.2.3

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 (77) hide show
  1. package/AGENTS.md +50 -33
  2. package/README.md +22 -12
  3. package/SOUL.md +60 -19
  4. package/STATUS.md +91 -169
  5. package/convex/_generated/api.d.ts +6 -0
  6. package/convex/directCall.ts +598 -0
  7. package/convex/providers.ts +341 -26
  8. package/convex/schema.ts +87 -0
  9. package/convex/usage.ts +260 -0
  10. package/convex/waitlist.ts +55 -0
  11. package/data/combined-02-26.json +22102 -0
  12. package/data/night-expansion-02-26-06-batch2.json +1898 -0
  13. package/data/night-expansion-02-26-06-batch3.json +1410 -0
  14. package/data/night-expansion-02-26-06.json +3146 -0
  15. package/data/night-expansion-02-26-full.json +9726 -0
  16. package/data/night-expansion-02-26-v2.json +330 -0
  17. package/data/night-expansion-02-26.json +171 -0
  18. package/dist/crypto.d.ts +7 -0
  19. package/dist/crypto.d.ts.map +1 -0
  20. package/dist/crypto.js +67 -0
  21. package/dist/crypto.js.map +1 -0
  22. package/dist/execute-dynamic.d.ts +116 -0
  23. package/dist/execute-dynamic.d.ts.map +1 -0
  24. package/dist/execute-dynamic.js +456 -0
  25. package/dist/execute-dynamic.js.map +1 -0
  26. package/dist/execute.d.ts +2 -1
  27. package/dist/execute.d.ts.map +1 -1
  28. package/dist/execute.js +35 -5
  29. package/dist/execute.js.map +1 -1
  30. package/dist/index.js +33 -4
  31. package/dist/index.js.map +1 -1
  32. package/dist/registry/apis.json +2081 -3
  33. package/docs/PRD-customer-key-passthrough.md +184 -0
  34. package/landing/public/badges/available-on-apiclaw.svg +14 -0
  35. package/landing/scripts/generate-stats.js +75 -4
  36. package/landing/src/app/admin/page.tsx +1 -1
  37. package/landing/src/app/api/auth/magic-link/route.ts +1 -1
  38. package/landing/src/app/api/auth/session/route.ts +1 -1
  39. package/landing/src/app/api/auth/verify/route.ts +1 -1
  40. package/landing/src/app/api/og/route.tsx +5 -3
  41. package/landing/src/app/docs/page.tsx +5 -4
  42. package/landing/src/app/earn/page.tsx +14 -11
  43. package/landing/src/app/globals.css +16 -15
  44. package/landing/src/app/layout.tsx +2 -2
  45. package/landing/src/app/page.tsx +425 -254
  46. package/landing/src/app/providers/dashboard/[apiId]/actions/[actionId]/edit/page.tsx +600 -0
  47. package/landing/src/app/providers/dashboard/[apiId]/actions/new/page.tsx +583 -0
  48. package/landing/src/app/providers/dashboard/[apiId]/actions/page.tsx +301 -0
  49. package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +659 -0
  50. package/landing/src/app/providers/dashboard/[apiId]/page.tsx +381 -0
  51. package/landing/src/app/providers/dashboard/[apiId]/test/page.tsx +418 -0
  52. package/landing/src/app/providers/dashboard/layout.tsx +292 -0
  53. package/landing/src/app/providers/dashboard/page.tsx +353 -290
  54. package/landing/src/app/providers/register/page.tsx +87 -10
  55. package/landing/src/components/AiClientDropdown.tsx +85 -0
  56. package/landing/src/components/ConfigHelperModal.tsx +113 -0
  57. package/landing/src/components/HeroTabs.tsx +187 -0
  58. package/landing/src/components/ShareIntegrationModal.tsx +198 -0
  59. package/landing/src/hooks/useDashboardData.ts +53 -1
  60. package/landing/src/lib/apis.json +46554 -174
  61. package/landing/src/lib/convex-client.ts +22 -3
  62. package/landing/src/lib/stats.json +4 -4
  63. package/landing/tsconfig.tsbuildinfo +1 -1
  64. package/night-expansion-02-26-06-batch2.py +368 -0
  65. package/night-expansion-02-26-06-batch3.py +299 -0
  66. package/night-expansion-02-26-06.py +756 -0
  67. package/package.json +1 -1
  68. package/scripts/bulk-add-public-apis-v2.py +418 -0
  69. package/scripts/night-expansion-02-26-v2.py +296 -0
  70. package/scripts/night-expansion-02-26.py +890 -0
  71. package/scripts/seed-complete-api.js +181 -0
  72. package/scripts/seed-demo-api.sh +44 -0
  73. package/src/crypto.ts +75 -0
  74. package/src/execute-dynamic.ts +589 -0
  75. package/src/execute.ts +41 -5
  76. package/src/index.ts +38 -4
  77. package/src/registry/apis.json +2081 -3
@@ -0,0 +1,296 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ APIClaw Night Expansion 2026-02-26 v2
4
+ Parse n0shake/Public-APIs README and extract APIs
5
+ """
6
+
7
+ import json
8
+ import re
9
+ from pathlib import Path
10
+
11
+ OUTPUT_PATH = Path(__file__).parent.parent / "data" / "night-expansion-02-26-v2.json"
12
+ REGISTRY_PATH = Path(__file__).parent.parent / "src" / "registry" / "apis.json"
13
+
14
+ def generate_id(name: str) -> str:
15
+ clean = re.sub(r'[^a-z0-9]+', '-', name.lower()).strip('-')
16
+ return clean[:50]
17
+
18
+ def parse_markdown_table(content: str):
19
+ """Parse markdown tables from n0shake format"""
20
+ apis = []
21
+ current_category = "General"
22
+
23
+ lines = content.split('\n')
24
+ for i, line in enumerate(lines):
25
+ # Detect category headers (### Category)
26
+ if line.startswith('### '):
27
+ current_category = line.replace('### ', '').strip()
28
+ continue
29
+
30
+ # Detect table rows with links
31
+ if '|' in line and '[**' in line:
32
+ # Parse: | [**Name**](url) | Description | Open/Trial |
33
+ match = re.search(r'\[\*\*([^*]+)\*\*\]\(([^)]+)\)\s*\|\s*([^|]+)', line)
34
+ if match:
35
+ name = match.group(1).strip()
36
+ url = match.group(2).strip()
37
+ desc = match.group(3).strip()
38
+
39
+ # Determine auth type from the line
40
+ auth = "unknown"
41
+ if '💸' in line:
42
+ auth = "apiKey"
43
+ elif 'Open Source' in line or 'opensource' in line.lower():
44
+ auth = "None"
45
+ else:
46
+ auth = "None"
47
+
48
+ apis.append({
49
+ "name": name,
50
+ "description": desc[:200] if len(desc) > 200 else desc,
51
+ "category": current_category,
52
+ "link": url,
53
+ "auth": auth
54
+ })
55
+
56
+ return apis
57
+
58
+ # Additional APIs from various sources (curated)
59
+ EXTRA_APIS = [
60
+ # Government & Open Data
61
+ {"name": "USAspending.gov", "description": "US federal spending data", "category": "Government", "link": "https://api.usaspending.gov/", "auth": "None"},
62
+ {"name": "OpenFEC", "description": "FEC campaign finance data", "category": "Government", "link": "https://api.open.fec.gov/", "auth": "apiKey"},
63
+ {"name": "Congress.gov API", "description": "US Congress data", "category": "Government", "link": "https://api.congress.gov/", "auth": "apiKey"},
64
+ {"name": "UK Parliament API", "description": "UK Parliament data", "category": "Government", "link": "https://developer.parliament.uk/", "auth": "None"},
65
+ {"name": "EU Open Data Portal", "description": "European Union open data", "category": "Government", "link": "https://data.europa.eu/api/hub/repo/", "auth": "None"},
66
+ {"name": "Data.gov", "description": "US government open data", "category": "Government", "link": "https://catalog.data.gov/api/", "auth": "None"},
67
+ {"name": "World Bank Open Data", "description": "World Bank development data", "category": "Finance", "link": "https://data.worldbank.org/", "auth": "None"},
68
+ {"name": "UN Data API", "description": "United Nations statistics", "category": "Government", "link": "http://data.un.org/Host.aspx?Content=API", "auth": "None"},
69
+ {"name": "OECD Data", "description": "OECD economic data", "category": "Finance", "link": "https://data.oecd.org/", "auth": "None"},
70
+ {"name": "IMF Data", "description": "IMF economic indicators", "category": "Finance", "link": "https://datahelp.imf.org/knowledgebase/articles/630877-data-services", "auth": "None"},
71
+
72
+ # Healthcare & Medical
73
+ {"name": "OpenFDA", "description": "FDA drug, device, food data", "category": "Healthcare", "link": "https://open.fda.gov/apis/", "auth": "None"},
74
+ {"name": "ClinicalTrials.gov", "description": "Clinical trials database", "category": "Healthcare", "link": "https://clinicaltrials.gov/api/gui", "auth": "None"},
75
+ {"name": "Disease.sh", "description": "COVID-19 and disease data", "category": "Healthcare", "link": "https://disease.sh/docs/", "auth": "None"},
76
+ {"name": "openFDA Drug Labels", "description": "Drug labeling information", "category": "Healthcare", "link": "https://open.fda.gov/apis/drug/label/", "auth": "None"},
77
+ {"name": "Human Protein Atlas", "description": "Human proteome data", "category": "Science", "link": "https://www.proteinatlas.org/about/help/dataaccess", "auth": "None"},
78
+ {"name": "DrugBank", "description": "Drug and drug target database", "category": "Healthcare", "link": "https://go.drugbank.com/", "auth": "apiKey"},
79
+ {"name": "ChEMBL", "description": "Bioactive molecules database", "category": "Science", "link": "https://www.ebi.ac.uk/chembl/api/data/docs", "auth": "None"},
80
+ {"name": "PubChem", "description": "Chemical information", "category": "Science", "link": "https://pubchem.ncbi.nlm.nih.gov/docs/pug-rest", "auth": "None"},
81
+ {"name": "BioPortal", "description": "Biomedical ontologies", "category": "Science", "link": "http://data.bioontology.org/documentation", "auth": "apiKey"},
82
+ {"name": "Ensembl", "description": "Genome databases", "category": "Science", "link": "https://rest.ensembl.org/", "auth": "None"},
83
+
84
+ # Space & Astronomy
85
+ {"name": "NASA APOD", "description": "Astronomy Picture of the Day", "category": "Science", "link": "https://api.nasa.gov/", "auth": "apiKey"},
86
+ {"name": "NASA Mars Rover Photos", "description": "Mars rover imagery", "category": "Science", "link": "https://api.nasa.gov/", "auth": "apiKey"},
87
+ {"name": "NASA Exoplanet Archive", "description": "Exoplanet data", "category": "Science", "link": "https://exoplanetarchive.ipac.caltech.edu/docs/TAP/usingTAP.html", "auth": "None"},
88
+ {"name": "NASA EONET", "description": "Earth natural events", "category": "Science", "link": "https://eonet.gsfc.nasa.gov/docs/v3", "auth": "None"},
89
+ {"name": "N2YO", "description": "Satellite tracking", "category": "Science", "link": "https://www.n2yo.com/api/", "auth": "apiKey"},
90
+ {"name": "Sunrise Sunset", "description": "Sunrise and sunset times", "category": "Science", "link": "https://sunrise-sunset.org/api", "auth": "None"},
91
+ {"name": "Open Notify", "description": "ISS location and astronauts", "category": "Science", "link": "http://open-notify.org/", "auth": "None"},
92
+ {"name": "SpaceX API", "description": "SpaceX rockets and launches", "category": "Science", "link": "https://github.com/r-spacex/SpaceX-API", "auth": "None"},
93
+ {"name": "Launch Library 2", "description": "Space launch data", "category": "Science", "link": "https://thespacedevs.com/llapi", "auth": "None"},
94
+ {"name": "AstroBin", "description": "Astrophotography community", "category": "Science", "link": "https://www.astrobin.com/help/api/", "auth": "apiKey"},
95
+
96
+ # Education
97
+ {"name": "Open Library", "description": "Internet Archive book data", "category": "Books", "link": "https://openlibrary.org/developers/api", "auth": "None"},
98
+ {"name": "Open Trivia Database", "description": "Trivia questions", "category": "Entertainment", "link": "https://opentdb.com/api_config.php", "auth": "None"},
99
+ {"name": "Numbers API", "description": "Number facts", "category": "Education", "link": "http://numbersapi.com/", "auth": "None"},
100
+ {"name": "Agify", "description": "Age prediction from name", "category": "Data", "link": "https://agify.io/", "auth": "None"},
101
+ {"name": "Genderize", "description": "Gender prediction from name", "category": "Data", "link": "https://genderize.io/", "auth": "None"},
102
+ {"name": "Nationalize", "description": "Nationality prediction from name", "category": "Data", "link": "https://nationalize.io/", "auth": "None"},
103
+ {"name": "University Domains", "description": "University domains worldwide", "category": "Education", "link": "https://github.com/Hipo/university-domains-list", "auth": "None"},
104
+ {"name": "Nobel Prize API", "description": "Nobel Prize laureates data", "category": "Education", "link": "https://www.nobelprize.org/about/developer-zone-2/", "auth": "None"},
105
+ {"name": "Gutendex", "description": "Project Gutenberg books", "category": "Books", "link": "https://gutendex.com/", "auth": "None"},
106
+ {"name": "Bible API", "description": "Bible verses and search", "category": "Books", "link": "https://bible-api.com/", "auth": "None"},
107
+
108
+ # Food & Drink
109
+ {"name": "Open Food Facts", "description": "Food products database", "category": "Food", "link": "https://world.openfoodfacts.org/data", "auth": "None"},
110
+ {"name": "TheMealDB", "description": "Meal recipes database", "category": "Food", "link": "https://www.themealdb.com/api.php", "auth": "apiKey"},
111
+ {"name": "TheCocktailDB", "description": "Cocktail recipes database", "category": "Food", "link": "https://www.thecocktaildb.com/api.php", "auth": "apiKey"},
112
+ {"name": "Spoonacular", "description": "Food and recipe data", "category": "Food", "link": "https://spoonacular.com/food-api", "auth": "apiKey"},
113
+ {"name": "Edamam Food", "description": "Nutrition analysis", "category": "Food", "link": "https://developer.edamam.com/", "auth": "apiKey"},
114
+ {"name": "Nutritionix", "description": "Nutrition database", "category": "Food", "link": "https://developer.nutritionix.com/", "auth": "apiKey"},
115
+ {"name": "PunkAPI", "description": "BrewDog beer recipes", "category": "Food", "link": "https://punkapi.com/documentation/v2", "auth": "None"},
116
+ {"name": "Open Brewery DB", "description": "Breweries database", "category": "Food", "link": "https://www.openbrewerydb.org/", "auth": "None"},
117
+ {"name": "WhiskyHunter", "description": "Whisky auction data", "category": "Food", "link": "https://whiskyhunter.net/api/", "auth": "None"},
118
+ {"name": "Coffee API", "description": "Coffee brewing recipes", "category": "Food", "link": "https://coffee.alexflipnote.dev/", "auth": "None"},
119
+
120
+ # Environment & Climate
121
+ {"name": "AirVisual", "description": "Air quality data", "category": "Environment", "link": "https://www.iqair.com/air-pollution-data-api", "auth": "apiKey"},
122
+ {"name": "OpenAQ", "description": "Air quality aggregated data", "category": "Environment", "link": "https://docs.openaq.org/", "auth": "None"},
123
+ {"name": "Breezometer", "description": "Air quality, pollen, fires", "category": "Environment", "link": "https://docs.breezometer.com/", "auth": "apiKey"},
124
+ {"name": "AQICN", "description": "Air quality index", "category": "Environment", "link": "https://aqicn.org/api/", "auth": "apiKey"},
125
+ {"name": "Carbon Interface", "description": "Carbon footprint API", "category": "Environment", "link": "https://docs.carboninterface.com/", "auth": "apiKey"},
126
+ {"name": "USGS Earthquake Hazards", "description": "Real-time earthquakes", "category": "Environment", "link": "https://earthquake.usgs.gov/fdsnws/event/1/", "auth": "None"},
127
+ {"name": "Global Fishing Watch", "description": "Fishing activity data", "category": "Environment", "link": "https://globalfishingwatch.org/our-apis/", "auth": "apiKey"},
128
+ {"name": "OceanCurrent", "description": "Ocean temperature data", "category": "Environment", "link": "https://imos.org.au/facilities/oceandata", "auth": "None"},
129
+ {"name": "SunriseSunset.io", "description": "Sun position and times", "category": "Environment", "link": "https://sunrisesunset.io/api/", "auth": "None"},
130
+ {"name": "UV Index", "description": "UV radiation data", "category": "Environment", "link": "https://www.openuv.io/", "auth": "apiKey"},
131
+
132
+ # Business & Enterprise
133
+ {"name": "Clearbit", "description": "Company and person data enrichment", "category": "Business", "link": "https://clearbit.com/docs", "auth": "apiKey"},
134
+ {"name": "FullContact", "description": "Identity resolution API", "category": "Business", "link": "https://docs.fullcontact.com/", "auth": "apiKey"},
135
+ {"name": "Hunter.io", "description": "Email finder", "category": "Business", "link": "https://hunter.io/api-documentation/v2", "auth": "apiKey"},
136
+ {"name": "Lob", "description": "Direct mail printing", "category": "Business", "link": "https://docs.lob.com/", "auth": "apiKey"},
137
+ {"name": "Abstract Company Enrichment", "description": "Company data lookup", "category": "Business", "link": "https://www.abstractapi.com/api/company-enrichment", "auth": "apiKey"},
138
+ {"name": "People Data Labs", "description": "Person and company data", "category": "Business", "link": "https://docs.peopledatalabs.com/", "auth": "apiKey"},
139
+ {"name": "ZoomInfo", "description": "B2B data platform", "category": "Business", "link": "https://www.zoominfo.com/solutions/api", "auth": "apiKey"},
140
+ {"name": "RocketReach", "description": "Professional contact data", "category": "Business", "link": "https://rocketreach.co/api", "auth": "apiKey"},
141
+ {"name": "Crunchbase", "description": "Startup and funding data", "category": "Business", "link": "https://data.crunchbase.com/docs", "auth": "apiKey"},
142
+ {"name": "AngelList", "description": "Startup ecosystem data", "category": "Business", "link": "https://angel.co/api", "auth": "OAuth"},
143
+
144
+ # Jobs & Career
145
+ {"name": "Adzuna", "description": "Job search API", "category": "Jobs", "link": "https://developer.adzuna.com/", "auth": "apiKey"},
146
+ {"name": "Careerjet", "description": "Job listings search", "category": "Jobs", "link": "https://www.careerjet.com/partners/api/", "auth": "apiKey"},
147
+ {"name": "Jooble", "description": "Job search aggregator", "category": "Jobs", "link": "https://jooble.org/api/about", "auth": "apiKey"},
148
+ {"name": "Reed.co.uk", "description": "UK job listings", "category": "Jobs", "link": "https://www.reed.co.uk/developers", "auth": "apiKey"},
149
+ {"name": "The Muse", "description": "Job listings and company profiles", "category": "Jobs", "link": "https://www.themuse.com/developers/api/v2", "auth": "apiKey"},
150
+ {"name": "Remotive", "description": "Remote jobs", "category": "Jobs", "link": "https://remotive.io/api-documentation", "auth": "None"},
151
+ {"name": "Working Nomads", "description": "Remote job listings", "category": "Jobs", "link": "https://www.workingnomads.co/api/exposed_jobs/", "auth": "None"},
152
+ {"name": "Arbeitnow", "description": "Free job board API", "category": "Jobs", "link": "https://www.arbeitnow.com/api", "auth": "None"},
153
+ {"name": "FindWork", "description": "Software jobs", "category": "Jobs", "link": "https://findwork.dev/developers/", "auth": "apiKey"},
154
+ {"name": "JSearch", "description": "Job listings API", "category": "Jobs", "link": "https://rapidapi.com/letscrape-6bRBa3QguO5/api/jsearch", "auth": "apiKey"},
155
+
156
+ # Sports & Fitness
157
+ {"name": "API-Football", "description": "Football/Soccer data", "category": "Sports", "link": "https://www.api-football.com/documentation-v3", "auth": "apiKey"},
158
+ {"name": "API-NBA", "description": "NBA statistics", "category": "Sports", "link": "https://www.api-basketball.com/documentation", "auth": "apiKey"},
159
+ {"name": "Balldontlie", "description": "NBA data", "category": "Sports", "link": "https://www.balldontlie.io/", "auth": "None"},
160
+ {"name": "ESPN API", "description": "Sports scores and news", "category": "Sports", "link": "https://developer.espn.com/", "auth": "apiKey"},
161
+ {"name": "Football-Data.org", "description": "European football data", "category": "Sports", "link": "https://www.football-data.org/documentation/quickstart", "auth": "apiKey"},
162
+ {"name": "MLB Stats", "description": "Major League Baseball data", "category": "Sports", "link": "https://statsapi.mlb.com/docs/", "auth": "None"},
163
+ {"name": "NHL API", "description": "National Hockey League data", "category": "Sports", "link": "https://gitlab.com/dword4/nhlapi", "auth": "None"},
164
+ {"name": "SportsDB", "description": "Sports events and results", "category": "Sports", "link": "https://www.thesportsdb.com/free_sports_api", "auth": "apiKey"},
165
+ {"name": "Strava", "description": "Fitness tracking data", "category": "Sports", "link": "https://developers.strava.com/docs/reference/", "auth": "OAuth"},
166
+ {"name": "Wger Workout Manager", "description": "Workout and exercise data", "category": "Sports", "link": "https://wger.de/en/software/api", "auth": "None"},
167
+
168
+ # Communication
169
+ {"name": "Discord API", "description": "Discord bot and app integration", "category": "Communication", "link": "https://discord.com/developers/docs/intro", "auth": "OAuth"},
170
+ {"name": "Slack API", "description": "Slack workspace integration", "category": "Communication", "link": "https://api.slack.com/", "auth": "OAuth"},
171
+ {"name": "Telegram Bot API", "description": "Telegram bot creation", "category": "Communication", "link": "https://core.telegram.org/bots/api", "auth": "apiKey"},
172
+ {"name": "Matrix", "description": "Decentralized communication", "category": "Communication", "link": "https://matrix.org/docs/api/", "auth": "OAuth"},
173
+ {"name": "Zulip API", "description": "Zulip chat integration", "category": "Communication", "link": "https://zulip.com/api/", "auth": "apiKey"},
174
+ {"name": "Rocket.Chat API", "description": "Rocket.Chat integration", "category": "Communication", "link": "https://developer.rocket.chat/reference/api", "auth": "apiKey"},
175
+ {"name": "Gitter API", "description": "Developer chat rooms", "category": "Communication", "link": "https://developer.gitter.im/docs/", "auth": "OAuth"},
176
+ {"name": "LINE Messaging", "description": "LINE messenger API", "category": "Communication", "link": "https://developers.line.biz/en/docs/messaging-api/", "auth": "apiKey"},
177
+ {"name": "WhatsApp Business", "description": "WhatsApp business messaging", "category": "Communication", "link": "https://developers.facebook.com/docs/whatsapp/", "auth": "apiKey"},
178
+ {"name": "Zoom API", "description": "Zoom video conferencing", "category": "Communication", "link": "https://marketplace.zoom.us/docs/api-reference/zoom-api", "auth": "OAuth"},
179
+
180
+ # Development Tools
181
+ {"name": "GitHub API", "description": "GitHub repository and user data", "category": "Development", "link": "https://docs.github.com/en/rest", "auth": "OAuth"},
182
+ {"name": "GitLab API", "description": "GitLab integration", "category": "Development", "link": "https://docs.gitlab.com/ee/api/", "auth": "apiKey"},
183
+ {"name": "Bitbucket API", "description": "Bitbucket repository API", "category": "Development", "link": "https://developer.atlassian.com/bitbucket/api/2/reference/", "auth": "OAuth"},
184
+ {"name": "npm Registry", "description": "npm package data", "category": "Development", "link": "https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md", "auth": "None"},
185
+ {"name": "Packagist", "description": "PHP package data", "category": "Development", "link": "https://packagist.org/apidoc", "auth": "None"},
186
+ {"name": "PyPI", "description": "Python package index", "category": "Development", "link": "https://warehouse.pypa.io/api-reference/", "auth": "None"},
187
+ {"name": "RubyGems", "description": "Ruby gems data", "category": "Development", "link": "https://guides.rubygems.org/rubygems-org-api/", "auth": "None"},
188
+ {"name": "Crates.io", "description": "Rust packages", "category": "Development", "link": "https://crates.io/data-access", "auth": "None"},
189
+ {"name": "Libraries.io", "description": "Package monitoring", "category": "Development", "link": "https://libraries.io/api", "auth": "apiKey"},
190
+ {"name": "Snyk Vulnerability DB", "description": "Security vulnerabilities", "category": "Security", "link": "https://snyk.io/api/", "auth": "apiKey"},
191
+
192
+ # Gaming
193
+ {"name": "Steam Web API", "description": "Steam games and users", "category": "Games", "link": "https://developer.valvesoftware.com/wiki/Steam_Web_API", "auth": "apiKey"},
194
+ {"name": "RAWG", "description": "Video games database", "category": "Games", "link": "https://rawg.io/apidocs", "auth": "apiKey"},
195
+ {"name": "IGDB", "description": "Video game database", "category": "Games", "link": "https://api-docs.igdb.com/", "auth": "apiKey"},
196
+ {"name": "CheapShark", "description": "Game deal prices", "category": "Games", "link": "https://apidocs.cheapshark.com/", "auth": "None"},
197
+ {"name": "Fortnite API", "description": "Fortnite game data", "category": "Games", "link": "https://fortnite-api.com/", "auth": "None"},
198
+ {"name": "Hytale API", "description": "Hytale game news", "category": "Games", "link": "https://hytale-api.com/", "auth": "None"},
199
+ {"name": "OSRS API", "description": "Old School RuneScape", "category": "Games", "link": "https://oldschool.runescape.wiki/w/API", "auth": "None"},
200
+ {"name": "Pokémon TCG API", "description": "Pokémon Trading Card Game", "category": "Games", "link": "https://pokemontcg.io/", "auth": "None"},
201
+ {"name": "Magic: The Gathering", "description": "MTG card database", "category": "Games", "link": "https://docs.magicthegathering.io/", "auth": "None"},
202
+ {"name": "Yu-Gi-Oh! API", "description": "Yu-Gi-Oh! card database", "category": "Games", "link": "https://db.ygoprodeck.com/api-guide/", "auth": "None"},
203
+
204
+ # Real Estate
205
+ {"name": "Zillow", "description": "Real estate data", "category": "Real Estate", "link": "https://www.zillow.com/howto/api/APIOverview.htm", "auth": "apiKey"},
206
+ {"name": "Realtor.com", "description": "Property listings", "category": "Real Estate", "link": "https://www.realtor.com/api", "auth": "apiKey"},
207
+ {"name": "Redfin", "description": "Home price estimates", "category": "Real Estate", "link": "https://www.redfin.com/", "auth": "None"},
208
+ {"name": "Estated", "description": "Property data API", "category": "Real Estate", "link": "https://estated.com/developers/docs", "auth": "apiKey"},
209
+ {"name": "HouseCanary", "description": "Residential property data", "category": "Real Estate", "link": "https://api-docs.housecanary.com/", "auth": "apiKey"},
210
+ {"name": "Attom Data", "description": "Property and real estate data", "category": "Real Estate", "link": "https://api.developer.attomdata.com/", "auth": "apiKey"},
211
+ {"name": "Mashvisor", "description": "Real estate investment data", "category": "Real Estate", "link": "https://mashvisor.com/api", "auth": "apiKey"},
212
+ {"name": "Rentberry", "description": "Rental property data", "category": "Real Estate", "link": "https://rentberry.com/api", "auth": "apiKey"},
213
+ {"name": "Walk Score", "description": "Walkability and transit scores", "category": "Real Estate", "link": "https://www.walkscore.com/professional/api.php", "auth": "apiKey"},
214
+ {"name": "Precisely", "description": "Property boundaries", "category": "Real Estate", "link": "https://developer.precisely.com/", "auth": "apiKey"},
215
+
216
+ # E-commerce
217
+ {"name": "Shopify Admin API", "description": "Shopify store management", "category": "E-commerce", "link": "https://shopify.dev/api/admin-rest", "auth": "OAuth"},
218
+ {"name": "WooCommerce", "description": "WooCommerce store API", "category": "E-commerce", "link": "https://woocommerce.github.io/woocommerce-rest-api-docs/", "auth": "OAuth"},
219
+ {"name": "BigCommerce", "description": "BigCommerce store API", "category": "E-commerce", "link": "https://developer.bigcommerce.com/api-docs", "auth": "OAuth"},
220
+ {"name": "Magento", "description": "Magento e-commerce API", "category": "E-commerce", "link": "https://devdocs.magento.com/guides/v2.4/rest/bk-rest.html", "auth": "OAuth"},
221
+ {"name": "PrestaShop", "description": "PrestaShop webservice", "category": "E-commerce", "link": "https://devdocs.prestashop.com/1.7/webservice/", "auth": "apiKey"},
222
+ {"name": "Saleor", "description": "Headless commerce GraphQL", "category": "E-commerce", "link": "https://docs.saleor.io/docs/3.x/api-reference/", "auth": "apiKey"},
223
+ {"name": "Medusa", "description": "Open source headless commerce", "category": "E-commerce", "link": "https://docs.medusajs.com/api/", "auth": "apiKey"},
224
+ {"name": "Printful", "description": "Print-on-demand fulfillment", "category": "E-commerce", "link": "https://developers.printful.com/docs/", "auth": "apiKey"},
225
+ {"name": "Shippo", "description": "Shipping rates and labels", "category": "E-commerce", "link": "https://goshippo.com/docs/intro/", "auth": "apiKey"},
226
+ {"name": "EasyPost", "description": "Shipping API", "category": "E-commerce", "link": "https://www.easypost.com/docs/api", "auth": "apiKey"},
227
+
228
+ # Utilities
229
+ {"name": "IP-API", "description": "IP geolocation", "category": "Utilities", "link": "https://ip-api.com/docs/", "auth": "None"},
230
+ {"name": "IPinfo", "description": "IP address data", "category": "Utilities", "link": "https://ipinfo.io/developers", "auth": "apiKey"},
231
+ {"name": "IPify", "description": "Public IP address", "category": "Utilities", "link": "https://www.ipify.org/", "auth": "None"},
232
+ {"name": "ipstack", "description": "IP geolocation API", "category": "Utilities", "link": "https://ipstack.com/documentation", "auth": "apiKey"},
233
+ {"name": "Abstract IP Geolocation", "description": "IP to location", "category": "Utilities", "link": "https://www.abstractapi.com/ip-geolocation-api", "auth": "apiKey"},
234
+ {"name": "WhoisXML", "description": "Domain WHOIS data", "category": "Utilities", "link": "https://www.whoisxmlapi.com/", "auth": "apiKey"},
235
+ {"name": "URL Shortener API", "description": "Shorten URLs", "category": "Utilities", "link": "https://t.ly/docs", "auth": "apiKey"},
236
+ {"name": "QR Code Generator", "description": "Generate QR codes", "category": "Utilities", "link": "http://goqr.me/api/", "auth": "None"},
237
+ {"name": "CountAPI", "description": "Simple counting service", "category": "Utilities", "link": "https://countapi.xyz/", "auth": "None"},
238
+ {"name": "ZipCodeAPI", "description": "US zip code data", "category": "Utilities", "link": "https://www.zipcodeapi.com/", "auth": "apiKey"},
239
+
240
+ # AI/ML Additional
241
+ {"name": "OpenAI", "description": "GPT and DALL-E APIs", "category": "AI/ML", "link": "https://platform.openai.com/docs/api-reference", "auth": "apiKey"},
242
+ {"name": "Anthropic Claude", "description": "Claude AI API", "category": "AI/ML", "link": "https://docs.anthropic.com/claude/reference/getting-started-with-the-api", "auth": "apiKey"},
243
+ {"name": "Cohere", "description": "NLP and embeddings", "category": "AI/ML", "link": "https://docs.cohere.com/", "auth": "apiKey"},
244
+ {"name": "Hugging Face", "description": "ML models hub", "category": "AI/ML", "link": "https://huggingface.co/docs/api-inference/index", "auth": "apiKey"},
245
+ {"name": "Replicate", "description": "Run ML models", "category": "AI/ML", "link": "https://replicate.com/docs", "auth": "apiKey"},
246
+ {"name": "Stability AI", "description": "Stable Diffusion API", "category": "AI/ML", "link": "https://platform.stability.ai/docs/api-reference", "auth": "apiKey"},
247
+ {"name": "DeepL", "description": "Translation API", "category": "AI/ML", "link": "https://www.deepl.com/docs-api", "auth": "apiKey"},
248
+ {"name": "AssemblyAI", "description": "Speech-to-text", "category": "AI/ML", "link": "https://www.assemblyai.com/docs/", "auth": "apiKey"},
249
+ {"name": "Deepgram", "description": "Speech recognition", "category": "AI/ML", "link": "https://developers.deepgram.com/", "auth": "apiKey"},
250
+ {"name": "ElevenLabs", "description": "Text-to-speech AI", "category": "AI/ML", "link": "https://elevenlabs.io/docs/api-reference/", "auth": "apiKey"},
251
+ ]
252
+
253
+ def main():
254
+ # Load existing registry to check for duplicates
255
+ with open(REGISTRY_PATH, 'r') as f:
256
+ registry = json.load(f)
257
+
258
+ existing_names = {api['name'].lower() for api in registry['apis']}
259
+ existing_ids = {api['id'] for api in registry['apis']}
260
+
261
+ print(f"Existing APIs in registry: {len(registry['apis'])}")
262
+
263
+ # Collect new unique APIs
264
+ new_apis = []
265
+
266
+ for api in EXTRA_APIS:
267
+ name_lower = api['name'].lower()
268
+ api_id = generate_id(api['name'])
269
+
270
+ if name_lower in existing_names or api_id in existing_ids:
271
+ continue
272
+
273
+ new_apis.append({
274
+ "id": api_id,
275
+ "name": api['name'],
276
+ "description": api['description'],
277
+ "category": api['category'],
278
+ "link": api['link'],
279
+ "auth": api['auth']
280
+ })
281
+ existing_names.add(name_lower)
282
+ existing_ids.add(api_id)
283
+
284
+ print(f"New unique APIs to add: {len(new_apis)}")
285
+
286
+ # Save to output
287
+ with open(OUTPUT_PATH, 'w') as f:
288
+ json.dump(new_apis, f, indent=2)
289
+
290
+ print(f"Saved to {OUTPUT_PATH}")
291
+
292
+ return new_apis
293
+
294
+ if __name__ == "__main__":
295
+ apis = main()
296
+ print(f"\nReady to merge {len(apis)} APIs")