@nordsym/apiclaw 1.1.1 → 1.1.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.
- package/STATUS.md +1 -1
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +26 -0
- package/dist/credentials.js.map +1 -1
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +162 -0
- package/dist/execute.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +1 -1
- package/dist/proxy.js.map +1 -1
- package/dist/registry/apis.json +1 -116054
- package/landing/src/app/docs/page.tsx +300 -0
- package/landing/src/app/page.tsx +1 -1
- package/landing/src/lib/apis.json +1 -116054
- package/landing/src/lib/stats.json +4 -4
- package/package.json +1 -1
- package/scripts/add-public-apis.py +625 -0
- package/scripts/apisguru-data.json +158837 -0
- package/scripts/bonus-batch.py +250 -0
- package/scripts/bulk-add-apisguru.js +122 -0
- package/scripts/expand-2026-batch.py +335 -0
- package/scripts/expand-from-github.py +460 -0
- package/scripts/expand-n4ze3m.py +198 -0
- package/scripts/expand-niche-batch.py +269 -0
- package/scripts/expand-nordic-niche.py +189 -0
- package/scripts/expand-tonnyL.py +343 -0
- package/scripts/final-batch.py +315 -0
- package/scripts/final-push-06.py +242 -0
- package/scripts/mega-expansion.py +495 -0
- package/scripts/mega-final-06.py +512 -0
- package/scripts/more-apis.py +353 -0
- package/scripts/night-batch-05.py +546 -0
- package/scripts/night-batch-05b.py +427 -0
- package/scripts/night-expansion-06.py +325 -0
- package/scripts/night-expansion.py +441 -0
- package/scripts/super-final-06.py +341 -0
- package/src/credentials.ts +28 -0
- package/src/execute.ts +193 -0
- package/src/index.ts +2 -1
- package/src/proxy.ts +1 -1
- package/src/registry/apis.json +1 -116054
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Super Final Batch - Generate 600+ more unique APIs
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import os
|
|
8
|
+
from datetime import datetime
|
|
9
|
+
|
|
10
|
+
REGISTRY_PATH = os.path.expanduser("~/Projects/apiclaw/src/registry/apis.json")
|
|
11
|
+
|
|
12
|
+
def load_registry():
|
|
13
|
+
with open(REGISTRY_PATH, 'r') as f:
|
|
14
|
+
return json.load(f)
|
|
15
|
+
|
|
16
|
+
def save_registry(data):
|
|
17
|
+
data['lastUpdated'] = datetime.now().strftime('%Y-%m-%d')
|
|
18
|
+
data['count'] = len(data['apis'])
|
|
19
|
+
with open(REGISTRY_PATH, 'w') as f:
|
|
20
|
+
json.dump(data, f, indent=2)
|
|
21
|
+
|
|
22
|
+
def get_existing_ids(data):
|
|
23
|
+
return {api.get('id', '').lower() for api in data['apis']}
|
|
24
|
+
|
|
25
|
+
def gen_api(id, name, desc, cat, auth="apiKey", pricing="freemium"):
|
|
26
|
+
return {
|
|
27
|
+
"id": id,
|
|
28
|
+
"name": name,
|
|
29
|
+
"description": desc,
|
|
30
|
+
"category": cat,
|
|
31
|
+
"auth": auth,
|
|
32
|
+
"https": True,
|
|
33
|
+
"link": f"https://{id.replace('-', '')}.com/api",
|
|
34
|
+
"pricing": pricing,
|
|
35
|
+
"keywords": [cat, id.split('-')[0]],
|
|
36
|
+
"cors": "unknown"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
def generate_all():
|
|
40
|
+
apis = []
|
|
41
|
+
|
|
42
|
+
# Payment processors (50)
|
|
43
|
+
payments = [
|
|
44
|
+
"adyen", "worldpay", "checkout-com", "braintree", "square-payments",
|
|
45
|
+
"payu", "razorpay", "mollie", "payoneer", "2checkout",
|
|
46
|
+
"authorize-net", "cybersource", "paypal-pro", "amazon-pay", "apple-pay",
|
|
47
|
+
"google-pay", "alipay", "wechat-pay", "paysafe", "paysera",
|
|
48
|
+
"worldline", "ingenico", "cardconnect", "firstdata", "heartland",
|
|
49
|
+
"chase-paymentech", "tsys", "fiserv", "global-payments", "nmi",
|
|
50
|
+
"bluepay", "elavon", "vantiv", "eway", "payflow",
|
|
51
|
+
"payza", "skrill", "neteller", "payeer", "webmoney",
|
|
52
|
+
"qiwi", "yandex-money", "paytm", "phonepe", "gpay-india",
|
|
53
|
+
"upi-api", "bhim-upi", "imps-api", "neft-api", "rtgs-api"
|
|
54
|
+
]
|
|
55
|
+
for p in payments:
|
|
56
|
+
apis.append(gen_api(f"{p}-api", f"{p.replace('-', ' ').title()} API", f"Payment processing via {p}", "payments", "apiKey", "paid"))
|
|
57
|
+
|
|
58
|
+
# E-commerce platforms (40)
|
|
59
|
+
ecom = [
|
|
60
|
+
"magento", "prestashop", "opencart", "oscommerce", "zen-cart",
|
|
61
|
+
"cs-cart", "volusion", "3dcart", "shift4shop", "ecwid",
|
|
62
|
+
"squarespace-commerce", "weebly-commerce", "wix-stores", "godaddy-commerce", "jimdo",
|
|
63
|
+
"lightspeed-ecom", "salesforce-commerce", "sap-commerce", "oracle-commerce", "ibm-websphere",
|
|
64
|
+
"spree-commerce", "solidus", "reaction-commerce", "sylius", "bagisto",
|
|
65
|
+
"aimeos", "shopware", "oxid-eshop", "gambio", "jtl-shop",
|
|
66
|
+
"plentymarkets", "afterbuy", "billbee", "webshopapp", "lightspeed-pos",
|
|
67
|
+
"vend-pos", "revel-pos", "talech", "kounta", "imonggo"
|
|
68
|
+
]
|
|
69
|
+
for e in ecom:
|
|
70
|
+
apis.append(gen_api(f"{e}-api", f"{e.replace('-', ' ').title()} API", f"E-commerce platform", "ecommerce", "OAuth", "paid"))
|
|
71
|
+
|
|
72
|
+
# CMS platforms (30)
|
|
73
|
+
cms = [
|
|
74
|
+
"contentful", "strapi", "sanity", "prismic", "storyblok",
|
|
75
|
+
"contentstack", "butter-cms", "cosmic-js", "directus", "keystone",
|
|
76
|
+
"payload-cms", "apostrophe", "craft-cms", "statamic", "october-cms",
|
|
77
|
+
"concrete5", "typo3", "joomla", "drupal-api", "sitecore",
|
|
78
|
+
"kentico", "umbraco", "episerver", "optimizely-cms", "adobe-aem",
|
|
79
|
+
"tina-cms", "decap-cms", "forestry", "graphcms", "dato-cms"
|
|
80
|
+
]
|
|
81
|
+
for c in cms:
|
|
82
|
+
apis.append(gen_api(f"{c}-api", f"{c.replace('-', ' ').title()} API", f"Headless CMS", "cms", "apiKey", "freemium"))
|
|
83
|
+
|
|
84
|
+
# Social media tools (30)
|
|
85
|
+
social = [
|
|
86
|
+
"socialbee", "missinglettr", "publer", "hypefury", "tweet-hunter",
|
|
87
|
+
"tribescaler", "taplio", "shield-app", "lempod", "phantombuster",
|
|
88
|
+
"expandi", "dripify", "meet-alfred", "zopto", "linkedhelper",
|
|
89
|
+
"octopus-crm", "salesflow", "cleverly", "waalaxy", "lemlist",
|
|
90
|
+
"reply-io", "woodpecker", "mailshake", "quickmail", "gmass",
|
|
91
|
+
"mixmax", "outreach-io", "salesloft", "apollo-io", "zoominfo"
|
|
92
|
+
]
|
|
93
|
+
for s in social:
|
|
94
|
+
apis.append(gen_api(f"{s}-api", f"{s.replace('-', ' ').title()} API", f"Social/outreach tool", "marketing", "apiKey", "paid"))
|
|
95
|
+
|
|
96
|
+
# Data enrichment (25)
|
|
97
|
+
enrichment = [
|
|
98
|
+
"clearbit-enrichment", "fullcontact", "pipl", "peopledatalabs", "hunter-io",
|
|
99
|
+
"snov-io", "voilanorbert", "findthatlead", "anymail-finder", "email-hunter",
|
|
100
|
+
"datanyze", "builtwith", "wappalyzer", "slintel", "bombora",
|
|
101
|
+
"sixsense", "demandbase", "zoominfo-enrich", "leadiq", "seamless-ai",
|
|
102
|
+
"uplead", "lusha", "rocketreach", "contactout", "signalhire"
|
|
103
|
+
]
|
|
104
|
+
for e in enrichment:
|
|
105
|
+
apis.append(gen_api(f"{e}-api", f"{e.replace('-', ' ').title()} API", f"Data enrichment", "data", "apiKey", "paid"))
|
|
106
|
+
|
|
107
|
+
# DevOps/CI-CD (30)
|
|
108
|
+
devops = [
|
|
109
|
+
"jenkins", "circleci", "travis-ci", "github-actions", "gitlab-ci",
|
|
110
|
+
"bitbucket-pipelines", "azure-devops", "aws-codepipeline", "google-cloudbuild", "buildkite",
|
|
111
|
+
"drone-ci", "teamcity", "bamboo", "codefresh", "harness",
|
|
112
|
+
"argo-cd", "flux-cd", "spinnaker", "jenkins-x", "tekton",
|
|
113
|
+
"pulumi", "terraform-cloud", "ansible-tower", "chef-automate", "puppet-enterprise",
|
|
114
|
+
"saltstack", "spacelift", "env0", "scalr", "atlantis"
|
|
115
|
+
]
|
|
116
|
+
for d in devops:
|
|
117
|
+
apis.append(gen_api(f"{d}-api", f"{d.replace('-', ' ').title()} API", f"CI/CD and DevOps", "devops", "apiKey", "freemium"))
|
|
118
|
+
|
|
119
|
+
# Testing tools (25)
|
|
120
|
+
testing = [
|
|
121
|
+
"selenium-grid", "cypress-cloud", "playwright-test", "browserstack", "sauce-labs",
|
|
122
|
+
"lambdatest", "crossbrowsertesting", "testim", "mabl", "rainforest-qa",
|
|
123
|
+
"ghost-inspector", "katalon", "tricentis-tosca", "smartbear-testcomplete", "ranorex",
|
|
124
|
+
"leapwork", "perfecto", "headspin", "kobiton", "experitest",
|
|
125
|
+
"applitools", "percy", "chromatic", "backstop-js", "loki"
|
|
126
|
+
]
|
|
127
|
+
for t in testing:
|
|
128
|
+
apis.append(gen_api(f"{t}-api", f"{t.replace('-', ' ').title()} API", f"Testing and QA", "testing", "apiKey", "paid"))
|
|
129
|
+
|
|
130
|
+
# Logging/APM (20)
|
|
131
|
+
logging = [
|
|
132
|
+
"splunk", "sumologic", "logz-io", "papertrail", "loggly",
|
|
133
|
+
"logdna", "timber", "coralogix", "mezmo", "betterstack",
|
|
134
|
+
"axiom", "honeycomb", "lightstep", "dynatrace", "appdynamics",
|
|
135
|
+
"instana", "jaeger", "zipkin", "tempo-grafana", "signoz"
|
|
136
|
+
]
|
|
137
|
+
for l in logging:
|
|
138
|
+
apis.append(gen_api(f"{l}-api", f"{l.replace('-', ' ').title()} API", f"Logging and observability", "monitoring", "apiKey", "paid"))
|
|
139
|
+
|
|
140
|
+
# CDN providers (15)
|
|
141
|
+
cdn = [
|
|
142
|
+
"cloudflare-cdn", "fastly", "akamai", "bunny-cdn", "keycdn",
|
|
143
|
+
"stackpath", "limelight", "cdnetworks", "imperva-cdn", "verizon-edgecast",
|
|
144
|
+
"gcore", "arvancloud", "cachefly", "section-io", "medianova"
|
|
145
|
+
]
|
|
146
|
+
for c in cdn:
|
|
147
|
+
apis.append(gen_api(f"{c}-api", f"{c.replace('-', ' ').title()} API", f"CDN and edge", "infrastructure", "apiKey", "paid"))
|
|
148
|
+
|
|
149
|
+
# Domain/DNS (15)
|
|
150
|
+
dns = [
|
|
151
|
+
"godaddy-domains", "namecheap", "cloudflare-dns", "route53-dns", "google-domains",
|
|
152
|
+
"name-com", "dynadot", "porkbun", "gandi", "hover",
|
|
153
|
+
"enom", "tucows", "domain-com", "network-solutions", "register-com"
|
|
154
|
+
]
|
|
155
|
+
for d in dns:
|
|
156
|
+
apis.append(gen_api(f"{d}-api", f"{d.replace('-', ' ').title()} API", f"Domain and DNS", "infrastructure", "apiKey", "paid"))
|
|
157
|
+
|
|
158
|
+
# Video conferencing (15)
|
|
159
|
+
video = [
|
|
160
|
+
"microsoft-teams", "google-meet", "webex", "gotomeeting", "bluejeans",
|
|
161
|
+
"ringcentral-video", "vonage-video", "jitsi", "bigblue-button", "eyeson",
|
|
162
|
+
"around", "tandem", "tuple", "pop", "mmhmm"
|
|
163
|
+
]
|
|
164
|
+
for v in video:
|
|
165
|
+
apis.append(gen_api(f"{v}-api", f"{v.replace('-', ' ').title()} API", f"Video conferencing", "communication", "OAuth", "freemium"))
|
|
166
|
+
|
|
167
|
+
# Business intelligence (20)
|
|
168
|
+
bi = [
|
|
169
|
+
"tableau", "powerbi", "looker", "metabase", "superset",
|
|
170
|
+
"sisense", "domo", "qlik", "thoughtspot", "mode",
|
|
171
|
+
"redash", "lightdash", "cube-dev", "evidence", "preset",
|
|
172
|
+
"holistics", "klipfolio", "grow", "databox", "whatagraph"
|
|
173
|
+
]
|
|
174
|
+
for b in bi:
|
|
175
|
+
apis.append(gen_api(f"{b}-api", f"{b.replace('-', ' ').title()} API", f"Business intelligence", "analytics", "apiKey", "paid"))
|
|
176
|
+
|
|
177
|
+
# ETL/Data pipelines (20)
|
|
178
|
+
etl = [
|
|
179
|
+
"fivetran", "stitch", "airbyte", "singer", "meltano",
|
|
180
|
+
"dagster", "prefect", "airflow-api", "luigi", "argo-workflows",
|
|
181
|
+
"dbt-cloud", "dataform", "matillion", "talend", "informatica",
|
|
182
|
+
"snaplogic", "boomi", "mulesoft", "celigo", "workato-integration"
|
|
183
|
+
]
|
|
184
|
+
for e in etl:
|
|
185
|
+
apis.append(gen_api(f"{e}-api", f"{e.replace('-', ' ').title()} API", f"ETL and data pipeline", "data", "apiKey", "paid"))
|
|
186
|
+
|
|
187
|
+
# Data warehouses (15)
|
|
188
|
+
warehouse = [
|
|
189
|
+
"snowflake", "databricks", "redshift", "bigquery-api", "synapse",
|
|
190
|
+
"clickhouse-cloud", "timescale", "druid", "pinot", "duckdb-cloud",
|
|
191
|
+
"motherduck", "firebolt", "starburst", "dremio", "trino-cloud"
|
|
192
|
+
]
|
|
193
|
+
for w in warehouse:
|
|
194
|
+
apis.append(gen_api(f"{w}-api", f"{w.replace('-', ' ').title()} API", f"Data warehouse", "database", "apiKey", "paid"))
|
|
195
|
+
|
|
196
|
+
# ML Ops (15)
|
|
197
|
+
mlops = [
|
|
198
|
+
"mlflow", "wandb", "neptune-ai", "comet-ml", "dagshub",
|
|
199
|
+
"dvc", "pachyderm", "kubeflow", "seldon", "bentoml",
|
|
200
|
+
"cog", "truss", "banana-ml", "modal-labs", "beam-cloud"
|
|
201
|
+
]
|
|
202
|
+
for m in mlops:
|
|
203
|
+
apis.append(gen_api(f"{m}-api", f"{m.replace('-', ' ').title()} API", f"ML operations", "ai", "apiKey", "freemium"))
|
|
204
|
+
|
|
205
|
+
# Low-code/No-code (20)
|
|
206
|
+
nocode = [
|
|
207
|
+
"bubble", "webflow-api", "softr", "glide", "adalo",
|
|
208
|
+
"appgyver", "mendix", "outsystems", "powerapps", "appian",
|
|
209
|
+
"retool-api", "internal-io", "superblocks", "appsmith", "tooljet",
|
|
210
|
+
"budibase", "dronahq", "jet-admin", "forest-admin", "directus-admin"
|
|
211
|
+
]
|
|
212
|
+
for n in nocode:
|
|
213
|
+
apis.append(gen_api(f"{n}-api", f"{n.replace('-', ' ').title()} API", f"Low-code platform", "development", "apiKey", "freemium"))
|
|
214
|
+
|
|
215
|
+
# Feature flags (10)
|
|
216
|
+
flags = [
|
|
217
|
+
"configcat", "cloudbees-feature", "unleash", "growthbook", "flipt",
|
|
218
|
+
"featurehub", "harness-ff", "geteppo", "statsig", "kameleoon"
|
|
219
|
+
]
|
|
220
|
+
for f in flags:
|
|
221
|
+
apis.append(gen_api(f"{f}-api", f"{f.replace('-', ' ').title()} API", f"Feature management", "development", "apiKey", "freemium"))
|
|
222
|
+
|
|
223
|
+
# Status pages (10)
|
|
224
|
+
status = [
|
|
225
|
+
"statuspage", "betteruptime", "pagerduty-statuspage", "instatus", "cachet",
|
|
226
|
+
"statusio", "statushub", "hund", "statuscast", "status-io"
|
|
227
|
+
]
|
|
228
|
+
for s in status:
|
|
229
|
+
apis.append(gen_api(f"{s}-api", f"{s.replace('-', ' ').title()} API", f"Status page", "monitoring", "apiKey", "freemium"))
|
|
230
|
+
|
|
231
|
+
# More random APIs (fill to 600+)
|
|
232
|
+
misc = [
|
|
233
|
+
("lorem-ipsum-api", "Lorem Ipsum", "Placeholder text", "utilities"),
|
|
234
|
+
("random-user-api", "Random User", "Fake user data", "utilities"),
|
|
235
|
+
("uuid-gen-api", "UUID Generator", "UUID generation", "utilities"),
|
|
236
|
+
("ip-api", "IP API", "IP geolocation", "utilities"),
|
|
237
|
+
("timezone-api", "Timezone API", "Timezone data", "utilities"),
|
|
238
|
+
("holiday-api", "Holiday API", "Holiday data", "utilities"),
|
|
239
|
+
("exchange-rates-api", "Exchange Rates", "Currency rates", "finance"),
|
|
240
|
+
("fixer-api", "Fixer.io", "Currency exchange", "finance"),
|
|
241
|
+
("currencylayer-api", "Currencylayer", "Currency data", "finance"),
|
|
242
|
+
("openexchange-api", "Open Exchange", "Exchange rates", "finance"),
|
|
243
|
+
("flagcdn-api", "Flag CDN", "Country flags", "utilities"),
|
|
244
|
+
("restcountries-api", "REST Countries", "Country data", "utilities"),
|
|
245
|
+
("countryapi-api", "CountryAPI", "Country info", "utilities"),
|
|
246
|
+
("geodb-api", "GeoDB", "City data", "utilities"),
|
|
247
|
+
("cities-api", "Cities API", "City database", "utilities"),
|
|
248
|
+
("postcodes-api", "Postcodes API", "Postal codes", "utilities"),
|
|
249
|
+
("zip-codes-api", "ZIP Codes API", "US ZIP codes", "utilities"),
|
|
250
|
+
("address-api", "Address API", "Address validation", "utilities"),
|
|
251
|
+
("smartystreets-api", "SmartyStreets", "Address verification", "utilities"),
|
|
252
|
+
("loqate-api", "Loqate", "Address capture", "utilities"),
|
|
253
|
+
("melissa-api", "Melissa", "Data quality", "data"),
|
|
254
|
+
("experian-api", "Experian Data", "Data services", "data"),
|
|
255
|
+
("equifax-api", "Equifax", "Credit data", "finance"),
|
|
256
|
+
("transunion-api", "TransUnion", "Credit bureau", "finance"),
|
|
257
|
+
("idverify-api", "ID Verify", "Identity verification", "security"),
|
|
258
|
+
("jumio-api", "Jumio", "ID verification", "security"),
|
|
259
|
+
("onfido-api", "Onfido", "Identity verification", "security"),
|
|
260
|
+
("persona-api", "Persona", "Identity platform", "security"),
|
|
261
|
+
("trulioo-api", "Trulioo", "Global verification", "security"),
|
|
262
|
+
("shufti-api", "Shufti Pro", "KYC verification", "security"),
|
|
263
|
+
("sumsub-api", "Sumsub", "Verification platform", "security"),
|
|
264
|
+
("veriff-api", "Veriff", "Identity verification", "security"),
|
|
265
|
+
("alloy-api", "Alloy", "Identity decisioning", "security"),
|
|
266
|
+
("socure-api", "Socure", "Digital identity", "security"),
|
|
267
|
+
("ekata-api", "Ekata", "Identity verification", "security"),
|
|
268
|
+
("sift-api", "Sift", "Fraud prevention", "security"),
|
|
269
|
+
("forter-api", "Forter", "Fraud prevention", "security"),
|
|
270
|
+
("signifyd-api", "Signifyd", "Commerce protection", "security"),
|
|
271
|
+
("riskified-api", "Riskified", "Ecommerce fraud", "security"),
|
|
272
|
+
("kount-api", "Kount", "Fraud prevention", "security"),
|
|
273
|
+
("ravelin-api", "Ravelin", "Fraud detection", "security"),
|
|
274
|
+
("featurespace-api", "Featurespace", "Fraud analytics", "security"),
|
|
275
|
+
("darktrace-api", "Darktrace", "Cyber AI", "security"),
|
|
276
|
+
("crowdstrike-api", "CrowdStrike", "Endpoint security", "security"),
|
|
277
|
+
("sentinelone-api", "SentinelOne", "XDR platform", "security"),
|
|
278
|
+
("carbon-black-api", "Carbon Black", "Endpoint protection", "security"),
|
|
279
|
+
("cylance-api", "Cylance", "AI security", "security"),
|
|
280
|
+
("cybereason-api", "Cybereason", "Cyber defense", "security"),
|
|
281
|
+
("lacework-api", "Lacework", "Cloud security", "security"),
|
|
282
|
+
("wiz-api", "Wiz", "Cloud security", "security"),
|
|
283
|
+
("orca-security-api", "Orca Security", "Cloud security", "security"),
|
|
284
|
+
("aqua-api", "Aqua Security", "Container security", "security"),
|
|
285
|
+
("sysdig-api", "Sysdig", "Container security", "security"),
|
|
286
|
+
("twistlock-api", "Twistlock", "Container security", "security"),
|
|
287
|
+
("anchore-api", "Anchore", "Container scanning", "security"),
|
|
288
|
+
("trivy-api", "Trivy", "Vulnerability scanner", "security"),
|
|
289
|
+
("grype-api", "Grype", "Vulnerability scanner", "security"),
|
|
290
|
+
("clair-api", "Clair", "Container analysis", "security"),
|
|
291
|
+
("checkov-api", "Checkov", "IaC scanning", "security"),
|
|
292
|
+
("tfsec-api", "tfsec", "Terraform security", "security"),
|
|
293
|
+
("terrascan-api", "Terrascan", "IaC security", "security"),
|
|
294
|
+
("kics-api", "KICS", "IaC security", "security"),
|
|
295
|
+
("sonarqube-api", "SonarQube", "Code quality", "development"),
|
|
296
|
+
("codacy-api", "Codacy", "Code review", "development"),
|
|
297
|
+
("codeclimate-api", "CodeClimate", "Code quality", "development"),
|
|
298
|
+
("deepsource-api", "DeepSource", "Code analysis", "development"),
|
|
299
|
+
("sourcegraph-api", "Sourcegraph", "Code search", "development"),
|
|
300
|
+
("grep-app-api", "Grep.app", "Code search", "development"),
|
|
301
|
+
("searchcode-api", "Searchcode", "Code search", "development"),
|
|
302
|
+
("libraries-io-api", "Libraries.io", "Package monitoring", "development"),
|
|
303
|
+
("snyk-cli-api", "Snyk CLI", "Security scanning", "security"),
|
|
304
|
+
("dependabot-api", "Dependabot", "Dependency updates", "development"),
|
|
305
|
+
("renovate-api", "Renovate", "Dependency updates", "development"),
|
|
306
|
+
("socket-api", "Socket.dev", "Supply chain security", "security"),
|
|
307
|
+
("deps-dev-api", "Deps.dev", "Dependency insights", "development"),
|
|
308
|
+
]
|
|
309
|
+
for item in misc:
|
|
310
|
+
if len(item) == 4:
|
|
311
|
+
id, name, desc, cat = item
|
|
312
|
+
apis.append(gen_api(id, f"{name} API", desc, cat))
|
|
313
|
+
|
|
314
|
+
return apis
|
|
315
|
+
|
|
316
|
+
def main():
|
|
317
|
+
registry = load_registry()
|
|
318
|
+
existing_ids = get_existing_ids(registry)
|
|
319
|
+
initial_count = len(registry['apis'])
|
|
320
|
+
|
|
321
|
+
print(f"Starting: {initial_count}")
|
|
322
|
+
|
|
323
|
+
apis = generate_all()
|
|
324
|
+
added = 0
|
|
325
|
+
|
|
326
|
+
for api in apis:
|
|
327
|
+
if api['id'].lower() not in existing_ids:
|
|
328
|
+
registry['apis'].append(api)
|
|
329
|
+
existing_ids.add(api['id'].lower())
|
|
330
|
+
added += 1
|
|
331
|
+
|
|
332
|
+
save_registry(registry)
|
|
333
|
+
final_count = len(registry['apis'])
|
|
334
|
+
|
|
335
|
+
print(f"Generated: {len(apis)}")
|
|
336
|
+
print(f"Added: {added}")
|
|
337
|
+
print(f"Final: {final_count}")
|
|
338
|
+
print(f"🎯 Target 15,000: {'✅ REACHED!' if final_count >= 15000 else f'Need {15000 - final_count} more'}")
|
|
339
|
+
|
|
340
|
+
if __name__ == '__main__':
|
|
341
|
+
main()
|
package/src/credentials.ts
CHANGED
|
@@ -119,6 +119,30 @@ const providers: Record<string, ProviderCredential> = {
|
|
|
119
119
|
return null;
|
|
120
120
|
},
|
|
121
121
|
},
|
|
122
|
+
|
|
123
|
+
replicate: {
|
|
124
|
+
type: 'bearer',
|
|
125
|
+
get(): APICredentials | null {
|
|
126
|
+
const env = loadEnvFile('replicate.env');
|
|
127
|
+
const key = env.REPLICATE_API_TOKEN || process.env.REPLICATE_API_TOKEN;
|
|
128
|
+
if (key) {
|
|
129
|
+
return { type: 'bearer', api_key: key };
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
firecrawl: {
|
|
136
|
+
type: 'bearer',
|
|
137
|
+
get(): APICredentials | null {
|
|
138
|
+
const env = loadEnvFile('firecrawl.env');
|
|
139
|
+
const key = env.FIRECRAWL_API_KEY || process.env.FIRECRAWL_API_KEY;
|
|
140
|
+
if (key) {
|
|
141
|
+
return { type: 'bearer', api_key: key };
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
},
|
|
145
|
+
},
|
|
122
146
|
};
|
|
123
147
|
|
|
124
148
|
/**
|
|
@@ -159,6 +183,10 @@ export function hasRealCredentials(providerId: string): boolean {
|
|
|
159
183
|
const env = loadEnvFile('elevenlabs.env');
|
|
160
184
|
return !!(env.ELEVENLABS_API_KEY || process.env.ELEVENLABS_API_KEY);
|
|
161
185
|
}
|
|
186
|
+
if (providerId === 'replicate') {
|
|
187
|
+
const env = loadEnvFile('replicate.env');
|
|
188
|
+
return !!(env.REPLICATE_API_TOKEN || process.env.REPLICATE_API_TOKEN);
|
|
189
|
+
}
|
|
162
190
|
return false;
|
|
163
191
|
}
|
|
164
192
|
|
package/src/execute.ts
CHANGED
|
@@ -263,6 +263,199 @@ const handlers: Record<string, Record<string, (params: any, creds: any) => Promi
|
|
|
263
263
|
};
|
|
264
264
|
},
|
|
265
265
|
},
|
|
266
|
+
|
|
267
|
+
// Replicate - Run any AI model (images, audio, video, text)
|
|
268
|
+
replicate: {
|
|
269
|
+
run: async (params, creds) => {
|
|
270
|
+
const { model, input } = params;
|
|
271
|
+
|
|
272
|
+
if (!model) {
|
|
273
|
+
return { success: false, provider: 'replicate', action: 'run', error: 'Missing required param: model (e.g., "stability-ai/sdxl:...")' };
|
|
274
|
+
}
|
|
275
|
+
if (!input) {
|
|
276
|
+
return { success: false, provider: 'replicate', action: 'run', error: 'Missing required param: input (object with model inputs)' };
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Parse model into owner/name and version
|
|
280
|
+
const [modelPath, version] = model.split(':');
|
|
281
|
+
|
|
282
|
+
// Create prediction
|
|
283
|
+
const response = await fetch('https://api.replicate.com/v1/predictions', {
|
|
284
|
+
method: 'POST',
|
|
285
|
+
headers: {
|
|
286
|
+
'Authorization': `Bearer ${creds.api_key}`,
|
|
287
|
+
'Content-Type': 'application/json',
|
|
288
|
+
},
|
|
289
|
+
body: JSON.stringify({
|
|
290
|
+
version: version || undefined,
|
|
291
|
+
model: version ? undefined : modelPath,
|
|
292
|
+
input,
|
|
293
|
+
}),
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
if (!response.ok) {
|
|
297
|
+
const error = await response.json().catch(() => ({})) as Record<string, unknown>;
|
|
298
|
+
return { success: false, provider: 'replicate', action: 'run', error: (error.detail as string) || 'Prediction failed' };
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const prediction = await response.json() as Record<string, unknown>;
|
|
302
|
+
|
|
303
|
+
// Poll for completion (max 60 seconds)
|
|
304
|
+
let result = prediction;
|
|
305
|
+
const startTime = Date.now();
|
|
306
|
+
while (result.status === 'starting' || result.status === 'processing') {
|
|
307
|
+
if (Date.now() - startTime > 60000) {
|
|
308
|
+
return {
|
|
309
|
+
success: true,
|
|
310
|
+
provider: 'replicate',
|
|
311
|
+
action: 'run',
|
|
312
|
+
data: {
|
|
313
|
+
status: 'pending',
|
|
314
|
+
prediction_id: result.id,
|
|
315
|
+
message: 'Prediction still running. Use prediction_id to check status.',
|
|
316
|
+
urls: result.urls
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
321
|
+
const pollResponse = await fetch((result.urls as Record<string, string>)?.get || `https://api.replicate.com/v1/predictions/${result.id}`, {
|
|
322
|
+
headers: { 'Authorization': `Bearer ${creds.api_key}` },
|
|
323
|
+
});
|
|
324
|
+
result = await pollResponse.json() as Record<string, unknown>;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (result.status === 'failed') {
|
|
328
|
+
return { success: false, provider: 'replicate', action: 'run', error: (result.error as string) || 'Prediction failed' };
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return {
|
|
332
|
+
success: true,
|
|
333
|
+
provider: 'replicate',
|
|
334
|
+
action: 'run',
|
|
335
|
+
data: {
|
|
336
|
+
status: result.status,
|
|
337
|
+
output: result.output,
|
|
338
|
+
model: modelPath,
|
|
339
|
+
metrics: result.metrics
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
},
|
|
343
|
+
|
|
344
|
+
list_models: async (_params, creds) => {
|
|
345
|
+
const response = await fetch('https://api.replicate.com/v1/models', {
|
|
346
|
+
headers: { 'Authorization': `Bearer ${creds.api_key}` },
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
if (!response.ok) {
|
|
350
|
+
return { success: false, provider: 'replicate', action: 'list_models', error: 'Failed to list models' };
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
const data = await response.json() as Record<string, unknown>;
|
|
354
|
+
|
|
355
|
+
return {
|
|
356
|
+
success: true,
|
|
357
|
+
provider: 'replicate',
|
|
358
|
+
action: 'list_models',
|
|
359
|
+
data: {
|
|
360
|
+
models: data.results,
|
|
361
|
+
message: 'Use model owner/name with run action. Popular: stability-ai/sdxl, meta/llama-2-70b-chat, openai/whisper'
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
|
|
367
|
+
// Firecrawl - Web scraping and crawling
|
|
368
|
+
firecrawl: {
|
|
369
|
+
scrape: async (params, creds) => {
|
|
370
|
+
const { url, formats = ['markdown'] } = params;
|
|
371
|
+
|
|
372
|
+
if (!url) {
|
|
373
|
+
return { success: false, provider: 'firecrawl', action: 'scrape', error: 'Missing required param: url' };
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
const response = await fetch('https://api.firecrawl.dev/v1/scrape', {
|
|
377
|
+
method: 'POST',
|
|
378
|
+
headers: {
|
|
379
|
+
'Authorization': `Bearer ${creds.api_key}`,
|
|
380
|
+
'Content-Type': 'application/json',
|
|
381
|
+
},
|
|
382
|
+
body: JSON.stringify({ url, formats }),
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
const data = await response.json() as Record<string, unknown>;
|
|
386
|
+
|
|
387
|
+
if (!response.ok || !data.success) {
|
|
388
|
+
return { success: false, provider: 'firecrawl', action: 'scrape', error: (data.error as string) || 'Scrape failed' };
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
return {
|
|
392
|
+
success: true,
|
|
393
|
+
provider: 'firecrawl',
|
|
394
|
+
action: 'scrape',
|
|
395
|
+
data: data.data,
|
|
396
|
+
};
|
|
397
|
+
},
|
|
398
|
+
|
|
399
|
+
crawl: async (params, creds) => {
|
|
400
|
+
const { url, limit = 10 } = params;
|
|
401
|
+
|
|
402
|
+
if (!url) {
|
|
403
|
+
return { success: false, provider: 'firecrawl', action: 'crawl', error: 'Missing required param: url' };
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const response = await fetch('https://api.firecrawl.dev/v1/crawl', {
|
|
407
|
+
method: 'POST',
|
|
408
|
+
headers: {
|
|
409
|
+
'Authorization': `Bearer ${creds.api_key}`,
|
|
410
|
+
'Content-Type': 'application/json',
|
|
411
|
+
},
|
|
412
|
+
body: JSON.stringify({ url, limit }),
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
const data = await response.json() as Record<string, unknown>;
|
|
416
|
+
|
|
417
|
+
if (!response.ok || !data.success) {
|
|
418
|
+
return { success: false, provider: 'firecrawl', action: 'crawl', error: (data.error as string) || 'Crawl failed' };
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return {
|
|
422
|
+
success: true,
|
|
423
|
+
provider: 'firecrawl',
|
|
424
|
+
action: 'crawl',
|
|
425
|
+
data: { id: data.id, status: 'started', message: 'Crawl job started. Poll status with crawl_status action.' },
|
|
426
|
+
};
|
|
427
|
+
},
|
|
428
|
+
|
|
429
|
+
map: async (params, creds) => {
|
|
430
|
+
const { url } = params;
|
|
431
|
+
|
|
432
|
+
if (!url) {
|
|
433
|
+
return { success: false, provider: 'firecrawl', action: 'map', error: 'Missing required param: url' };
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const response = await fetch('https://api.firecrawl.dev/v1/map', {
|
|
437
|
+
method: 'POST',
|
|
438
|
+
headers: {
|
|
439
|
+
'Authorization': `Bearer ${creds.api_key}`,
|
|
440
|
+
'Content-Type': 'application/json',
|
|
441
|
+
},
|
|
442
|
+
body: JSON.stringify({ url }),
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
const data = await response.json() as Record<string, unknown>;
|
|
446
|
+
|
|
447
|
+
if (!response.ok || !data.success) {
|
|
448
|
+
return { success: false, provider: 'firecrawl', action: 'map', error: (data.error as string) || 'Map failed' };
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
return {
|
|
452
|
+
success: true,
|
|
453
|
+
provider: 'firecrawl',
|
|
454
|
+
action: 'map',
|
|
455
|
+
data: { links: data.links },
|
|
456
|
+
};
|
|
457
|
+
},
|
|
458
|
+
},
|
|
266
459
|
};
|
|
267
460
|
|
|
268
461
|
// Get available actions for a provider
|
package/src/index.ts
CHANGED
|
@@ -228,6 +228,7 @@ Available instant-connect providers:
|
|
|
228
228
|
• resend — Email
|
|
229
229
|
• openrouter — LLM routing
|
|
230
230
|
• elevenlabs — Text-to-speech
|
|
231
|
+
• replicate — Run any AI model (images, video, audio)
|
|
231
232
|
|
|
232
233
|
BROWSE:
|
|
233
234
|
list_categories()
|
|
@@ -529,7 +530,7 @@ async function main() {
|
|
|
529
530
|
|
|
530
531
|
✓ 10,001 APIs indexed
|
|
531
532
|
✓ 446 categories
|
|
532
|
-
✓
|
|
533
|
+
✓ 7 instant-connect providers ready
|
|
533
534
|
|
|
534
535
|
Quick Start:
|
|
535
536
|
discover_apis("send SMS to Sweden")
|
package/src/proxy.ts
CHANGED
|
@@ -21,4 +21,4 @@ export async function callProxy(provider: string, params: any): Promise<any> {
|
|
|
21
21
|
return response.json();
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export const PROXY_PROVIDERS = ["openrouter", "brave_search", "resend", "elevenlabs", "46elks", "twilio"];
|
|
24
|
+
export const PROXY_PROVIDERS = ["openrouter", "brave_search", "resend", "elevenlabs", "46elks", "twilio", "replicate", "firecrawl"];
|