@nordsym/apiclaw 1.1.2 ā 1.1.4
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/EARN-CREDITS-SPEC.md +197 -0
- package/README.md +11 -7
- package/STATUS.md +16 -15
- package/VISION.md +123 -0
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +11 -0
- package/dist/credentials.js.map +1 -1
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +75 -0
- package/dist/execute.js.map +1 -1
- package/dist/index.js +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 +93516 -7139
- package/dist/registry/apis_expanded.json +3123 -3
- package/landing/public/book/index.html +339 -0
- package/landing/src/app/docs/page.tsx +142 -115
- package/landing/src/app/earn/page.tsx +305 -0
- package/landing/src/app/page.tsx +16 -11
- package/landing/src/lib/apis.json +1 -116054
- package/landing/src/lib/stats.json +5 -5
- package/package.json +4 -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-02-23-batch2.py +284 -0
- package/scripts/night-expansion-02-23.py +383 -0
- package/scripts/night-expansion-03-batch2.py +336 -0
- package/scripts/night-expansion-03-batch3.py +392 -0
- package/scripts/night-expansion-03.py +573 -0
- package/scripts/night-expansion-04-23.py +461 -0
- package/scripts/night-expansion-05-23-batch2.py +431 -0
- package/scripts/night-expansion-05-23-batch3.py +366 -0
- package/scripts/night-expansion-05-23-final.py +349 -0
- package/scripts/night-expansion-05-23.py +540 -0
- package/scripts/night-expansion-06-23-batch2.py +261 -0
- package/scripts/night-expansion-06-23-batch3.py +213 -0
- package/scripts/night-expansion-06-23-batch4.py +261 -0
- package/scripts/night-expansion-06-23.py +309 -0
- package/scripts/night-expansion-06.py +325 -0
- package/scripts/night-expansion.py +441 -0
- package/scripts/night-final-batch-04-23.py +547 -0
- package/scripts/night-mega-batch-04-23.py +874 -0
- package/scripts/super-final-06.py +341 -0
- package/src/credentials.ts +12 -0
- package/src/execute.ts +93 -0
- package/src/index.ts +1 -1
- package/src/proxy.ts +1 -1
- package/src/registry/apis.json +93516 -7139
- package/src/registry/apis_expanded.json +3123 -3
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""APIClaw Night Expansion 03:00 - Batch 2 - More APIs from public-apis list"""
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
|
|
8
|
+
REGISTRY_PATH = os.path.expanduser("~/Projects/apiclaw/src/registry/apis_expanded.json")
|
|
9
|
+
|
|
10
|
+
def load_registry():
|
|
11
|
+
with open(REGISTRY_PATH) as f:
|
|
12
|
+
return json.load(f)
|
|
13
|
+
|
|
14
|
+
def save_registry(data):
|
|
15
|
+
with open(REGISTRY_PATH, "w") as f:
|
|
16
|
+
json.dump(data, f, indent=2)
|
|
17
|
+
|
|
18
|
+
def generate_id(name, category):
|
|
19
|
+
clean = name.lower().replace(" ", "-").replace(".", "-")[:20]
|
|
20
|
+
return f"{category.lower()[:3]}-{clean}-{hash(name) % 10000}"
|
|
21
|
+
|
|
22
|
+
# Batch 2: More APIs from public-apis and n0shake repos
|
|
23
|
+
BATCH2_APIS = [
|
|
24
|
+
# Animals
|
|
25
|
+
{"name": "AdoptAPet", "description": "Resource to help get pets adopted", "category": "Animals", "baseUrl": "https://www.adoptapet.com/public/apis/", "authType": "apiKey"},
|
|
26
|
+
{"name": "Axolotl API", "description": "Collection of axolotl pictures and facts", "category": "Animals", "baseUrl": "https://theaxolotlapi.netlify.app/", "authType": "none"},
|
|
27
|
+
{"name": "Cat Facts", "description": "Daily cat facts", "category": "Animals", "baseUrl": "https://alexwohlbruck.github.io/cat-facts/", "authType": "none"},
|
|
28
|
+
{"name": "Cataas", "description": "Cat as a service", "category": "Animals", "baseUrl": "https://cataas.com/", "authType": "none"},
|
|
29
|
+
{"name": "The Cat API", "description": "Pictures of cats from Tumblr", "category": "Animals", "baseUrl": "https://thecatapi.com/", "authType": "apiKey"},
|
|
30
|
+
{"name": "Dog Facts", "description": "Random dog facts", "category": "Animals", "baseUrl": "https://dukengn.github.io/Dog-facts-API/", "authType": "none"},
|
|
31
|
+
{"name": "Dog CEO", "description": "Dogs based on Stanford Dogs Dataset", "category": "Animals", "baseUrl": "https://dog.ceo/dog-api/", "authType": "none"},
|
|
32
|
+
{"name": "eBird", "description": "Birding observations within a region", "category": "Animals", "baseUrl": "https://documenter.getpostman.com/view/664302/S1ENwy59", "authType": "apiKey"},
|
|
33
|
+
{"name": "FishWatch", "description": "Fish species information", "category": "Animals", "baseUrl": "https://www.fishwatch.gov/developers", "authType": "none"},
|
|
34
|
+
{"name": "HTTP Cat", "description": "Cat for every HTTP status", "category": "Animals", "baseUrl": "https://http.cat/", "authType": "none"},
|
|
35
|
+
{"name": "HTTP Dog", "description": "Dog for every HTTP status", "category": "Animals", "baseUrl": "https://http.dog/", "authType": "none"},
|
|
36
|
+
{"name": "IUCN Red List", "description": "Threatened species data", "category": "Animals", "baseUrl": "https://apiv3.iucnredlist.org/", "authType": "apiKey"},
|
|
37
|
+
{"name": "Petfinder", "description": "Pet adoption listings", "category": "Animals", "baseUrl": "https://www.petfinder.com/developers/", "authType": "apiKey"},
|
|
38
|
+
{"name": "PlaceBear", "description": "Placeholder bear pictures", "category": "Animals", "baseUrl": "https://placebear.com/", "authType": "none"},
|
|
39
|
+
{"name": "Random Dog", "description": "Random dog pictures", "category": "Animals", "baseUrl": "https://random.dog/", "authType": "none"},
|
|
40
|
+
{"name": "Random Duck", "description": "Random duck pictures", "category": "Animals", "baseUrl": "https://random-d.uk/", "authType": "none"},
|
|
41
|
+
{"name": "Random Fox", "description": "Random fox pictures", "category": "Animals", "baseUrl": "https://randomfox.ca/", "authType": "none"},
|
|
42
|
+
{"name": "Shibe.Online", "description": "Random Shiba Inu pictures", "category": "Animals", "baseUrl": "https://shibe.online/", "authType": "none"},
|
|
43
|
+
{"name": "The Dog API", "description": "All about dogs", "category": "Animals", "baseUrl": "https://thedogapi.com/", "authType": "apiKey"},
|
|
44
|
+
{"name": "xeno-canto", "description": "Bird recordings", "category": "Animals", "baseUrl": "https://xeno-canto.org/explore/api", "authType": "none"},
|
|
45
|
+
{"name": "Zoo Animals", "description": "Zoo animal facts", "category": "Animals", "baseUrl": "https://zoo-animal-api.herokuapp.com/", "authType": "none"},
|
|
46
|
+
|
|
47
|
+
# Anime
|
|
48
|
+
{"name": "AniAPI", "description": "Anime discovery and streaming", "category": "Anime", "baseUrl": "https://aniapi.com/docs/", "authType": "oauth"},
|
|
49
|
+
{"name": "AniDB", "description": "Anime database", "category": "Anime", "baseUrl": "https://wiki.anidb.net/HTTP_API_Definition", "authType": "apiKey"},
|
|
50
|
+
{"name": "AnimeChan", "description": "Anime quotes", "category": "Anime", "baseUrl": "https://animechan.xyz/", "authType": "none"},
|
|
51
|
+
{"name": "AnimeFacts", "description": "Anime facts", "category": "Anime", "baseUrl": "https://chandan-02.github.io/anime-facts-rest-api/", "authType": "none"},
|
|
52
|
+
{"name": "AnimeNewsNetwork", "description": "Anime industry news", "category": "Anime", "baseUrl": "https://www.animenewsnetwork.com/encyclopedia/api.php", "authType": "none"},
|
|
53
|
+
{"name": "Catboy", "description": "Neko images and GIFs", "category": "Anime", "baseUrl": "https://catboys.com/api", "authType": "none"},
|
|
54
|
+
{"name": "Danbooru", "description": "Anime images by tags", "category": "Anime", "baseUrl": "https://danbooru.donmai.us/wiki_pages/help:api", "authType": "apiKey"},
|
|
55
|
+
{"name": "Kitsu", "description": "Anime discovery platform", "category": "Anime", "baseUrl": "https://kitsu.docs.apiary.io/", "authType": "oauth"},
|
|
56
|
+
{"name": "MangaDex", "description": "Manga database", "category": "Anime", "baseUrl": "https://api.mangadex.org/docs.html", "authType": "apiKey"},
|
|
57
|
+
{"name": "MyAnimeList (Jikan)", "description": "Unofficial MAL API", "category": "Anime", "baseUrl": "https://jikan.moe/", "authType": "none"},
|
|
58
|
+
{"name": "NekosBest", "description": "Neko images and GIFs", "category": "Anime", "baseUrl": "https://docs.nekos.best/", "authType": "none"},
|
|
59
|
+
{"name": "Shikimori", "description": "Anime discovery and tracking", "category": "Anime", "baseUrl": "https://shikimori.one/api/doc", "authType": "oauth"},
|
|
60
|
+
{"name": "Studio Ghibli", "description": "Ghibli films data", "category": "Anime", "baseUrl": "https://ghibliapi.herokuapp.com/", "authType": "none"},
|
|
61
|
+
{"name": "Trace.moe", "description": "Scene finder from screenshot", "category": "Anime", "baseUrl": "https://soruly.github.io/trace.moe-api/", "authType": "none"},
|
|
62
|
+
{"name": "Waifu.im", "description": "Waifu pictures", "category": "Anime", "baseUrl": "https://waifu.im/docs", "authType": "none"},
|
|
63
|
+
{"name": "Waifu.pics", "description": "Anime images", "category": "Anime", "baseUrl": "https://waifu.pics/docs", "authType": "none"},
|
|
64
|
+
|
|
65
|
+
# Art & Design
|
|
66
|
+
{"name": "AmƩthyste", "description": "Generate images for Discord", "category": "Art", "baseUrl": "https://api.amethyste.moe/", "authType": "apiKey"},
|
|
67
|
+
{"name": "Art Institute of Chicago", "description": "Art collection API", "category": "Art", "baseUrl": "https://api.artic.edu/docs/", "authType": "none"},
|
|
68
|
+
{"name": "Colormind", "description": "Color scheme generator", "category": "Art", "baseUrl": "http://colormind.io/api-access/", "authType": "none"},
|
|
69
|
+
{"name": "ColourLovers", "description": "Patterns and palettes", "category": "Art", "baseUrl": "http://www.colourlovers.com/api", "authType": "none"},
|
|
70
|
+
{"name": "Cooper Hewitt", "description": "Smithsonian Design Museum", "category": "Art", "baseUrl": "https://collection.cooperhewitt.org/api", "authType": "apiKey"},
|
|
71
|
+
{"name": "EmojiHub", "description": "Emojis by categories", "category": "Art", "baseUrl": "https://github.com/cheatsnake/emojihub", "authType": "none"},
|
|
72
|
+
{"name": "Europeana", "description": "European museums content", "category": "Art", "baseUrl": "https://pro.europeana.eu/resources/apis/search", "authType": "apiKey"},
|
|
73
|
+
{"name": "Harvard Art Museums", "description": "Art collection API", "category": "Art", "baseUrl": "https://github.com/harvardartmuseums/api-docs", "authType": "apiKey"},
|
|
74
|
+
{"name": "Iconfinder", "description": "Icons marketplace", "category": "Art", "baseUrl": "https://developer.iconfinder.com/", "authType": "apiKey"},
|
|
75
|
+
{"name": "Lordicon", "description": "Animated icons", "category": "Art", "baseUrl": "https://lordicon.com/", "authType": "none"},
|
|
76
|
+
{"name": "Metropolitan Museum", "description": "Met Museum data", "category": "Art", "baseUrl": "https://metmuseum.github.io/", "authType": "none"},
|
|
77
|
+
{"name": "Noun Project", "description": "Icons and symbols", "category": "Art", "baseUrl": "https://api.thenounproject.com/", "authType": "oauth"},
|
|
78
|
+
{"name": "PHP-Noise", "description": "Noise background generator", "category": "Art", "baseUrl": "https://php-noise.com/", "authType": "none"},
|
|
79
|
+
{"name": "Pixel Encounter", "description": "SVG icon generator", "category": "Art", "baseUrl": "https://pixelencounter.com/api", "authType": "none"},
|
|
80
|
+
{"name": "Rijksmuseum", "description": "Dutch art collection", "category": "Art", "baseUrl": "https://data.rijksmuseum.nl/", "authType": "apiKey"},
|
|
81
|
+
{"name": "xColors", "description": "Generate and convert colors", "category": "Art", "baseUrl": "https://x-colors.herokuapp.com/", "authType": "none"},
|
|
82
|
+
|
|
83
|
+
# Books
|
|
84
|
+
{"name": "A BĆblia Digital", "description": "Bible versions API", "category": "Books", "baseUrl": "https://www.abibliadigital.com.br/", "authType": "apiKey"},
|
|
85
|
+
{"name": "Bhagavad Gita", "description": "Bhagavad Gita text", "category": "Books", "baseUrl": "https://docs.bhagavadgitaapi.in/", "authType": "apiKey"},
|
|
86
|
+
{"name": "Bible-api", "description": "Free Bible API", "category": "Books", "baseUrl": "https://bible-api.com/", "authType": "none"},
|
|
87
|
+
{"name": "British National Bibliography", "description": "Books metadata", "category": "Books", "baseUrl": "http://bnb.data.bl.uk/", "authType": "none"},
|
|
88
|
+
{"name": "Crossref", "description": "Books and articles metadata", "category": "Books", "baseUrl": "https://github.com/CrossRef/rest-api-doc", "authType": "none"},
|
|
89
|
+
{"name": "Google Books", "description": "Books and libraries", "category": "Books", "baseUrl": "https://developers.google.com/books/", "authType": "oauth"},
|
|
90
|
+
{"name": "Gutendex", "description": "Project Gutenberg books", "category": "Books", "baseUrl": "https://gutendex.com/", "authType": "none"},
|
|
91
|
+
{"name": "Open Library", "description": "Books and covers", "category": "Books", "baseUrl": "https://openlibrary.org/developers/api", "authType": "none"},
|
|
92
|
+
{"name": "PoetryDB", "description": "Poetry collection", "category": "Books", "baseUrl": "https://github.com/thundercomb/poetrydb", "authType": "none"},
|
|
93
|
+
{"name": "Quran", "description": "Quran API", "category": "Books", "baseUrl": "https://quran.api-docs.io/", "authType": "none"},
|
|
94
|
+
{"name": "Quran Cloud", "description": "Quran translations", "category": "Books", "baseUrl": "https://alquran.cloud/api", "authType": "none"},
|
|
95
|
+
{"name": "The Bible", "description": "Bible API", "category": "Books", "baseUrl": "https://docs.api.bible/", "authType": "apiKey"},
|
|
96
|
+
{"name": "Wizard World", "description": "Harry Potter universe", "category": "Books", "baseUrl": "https://wizard-world-api.herokuapp.com/", "authType": "none"},
|
|
97
|
+
|
|
98
|
+
# Business
|
|
99
|
+
{"name": "Apache Superset", "description": "BI dashboard API", "category": "Business", "baseUrl": "https://superset.apache.org/docs/api", "authType": "apiKey"},
|
|
100
|
+
{"name": "Charity Search", "description": "Non-profit charity data", "category": "Business", "baseUrl": "http://charityapi.orghunter.com/", "authType": "apiKey"},
|
|
101
|
+
{"name": "Clearbit Logo", "description": "Company logos", "category": "Business", "baseUrl": "https://clearbit.com/docs", "authType": "apiKey"},
|
|
102
|
+
{"name": "Domainsdb.info", "description": "Domain name search", "category": "Business", "baseUrl": "https://domainsdb.info/", "authType": "none"},
|
|
103
|
+
{"name": "Freelancer", "description": "Hire freelancers", "category": "Business", "baseUrl": "https://developers.freelancer.com/", "authType": "oauth"},
|
|
104
|
+
{"name": "Gmail API", "description": "Gmail access", "category": "Business", "baseUrl": "https://developers.google.com/gmail/api/", "authType": "oauth"},
|
|
105
|
+
{"name": "Google Analytics", "description": "Web analytics", "category": "Business", "baseUrl": "https://developers.google.com/analytics/", "authType": "oauth"},
|
|
106
|
+
{"name": "Instatus", "description": "Status page API", "category": "Business", "baseUrl": "https://instatus.com/help/api", "authType": "apiKey"},
|
|
107
|
+
{"name": "markerapi", "description": "Trademark search", "category": "Business", "baseUrl": "https://markerapi.com/", "authType": "none"},
|
|
108
|
+
{"name": "ORB Intelligence", "description": "Company lookup", "category": "Business", "baseUrl": "https://api.orb-intelligence.com/", "authType": "apiKey"},
|
|
109
|
+
{"name": "Redash", "description": "Query and dashboard API", "category": "Business", "baseUrl": "https://redash.io/help/user-guide/integrations-and-api/api", "authType": "apiKey"},
|
|
110
|
+
{"name": "Smartsheet", "description": "Smartsheet data API", "category": "Business", "baseUrl": "https://smartsheet.redoc.ly/", "authType": "oauth"},
|
|
111
|
+
{"name": "SwiftKanban", "description": "Kanban software API", "category": "Business", "baseUrl": "https://www.digite.com/knowledge-base/swiftkanban/", "authType": "apiKey"},
|
|
112
|
+
{"name": "Tomba", "description": "Email finder", "category": "Business", "baseUrl": "https://tomba.io/api", "authType": "apiKey"},
|
|
113
|
+
|
|
114
|
+
# Cloud Storage
|
|
115
|
+
{"name": "AnonFiles", "description": "Anonymous file upload", "category": "Storage", "baseUrl": "https://anonfiles.com/docs/api", "authType": "none"},
|
|
116
|
+
{"name": "Box", "description": "File sharing", "category": "Storage", "baseUrl": "https://developer.box.com/", "authType": "oauth"},
|
|
117
|
+
{"name": "Dropbox", "description": "File storage", "category": "Storage", "baseUrl": "https://www.dropbox.com/developers", "authType": "oauth"},
|
|
118
|
+
{"name": "File.io", "description": "Temporary file sharing", "category": "Storage", "baseUrl": "https://www.file.io/", "authType": "none"},
|
|
119
|
+
{"name": "Filestack", "description": "File upload and processing", "category": "Storage", "baseUrl": "https://www.filestack.com/docs/", "authType": "apiKey"},
|
|
120
|
+
{"name": "GoFile", "description": "Unlimited file upload", "category": "Storage", "baseUrl": "https://gofile.io/api", "authType": "apiKey"},
|
|
121
|
+
{"name": "Google Drive", "description": "File storage", "category": "Storage", "baseUrl": "https://developers.google.com/drive/", "authType": "oauth"},
|
|
122
|
+
{"name": "Gyazo", "description": "Screen capture sharing", "category": "Storage", "baseUrl": "https://gyazo.com/api/docs", "authType": "apiKey"},
|
|
123
|
+
{"name": "Imgbb", "description": "Image hosting", "category": "Storage", "baseUrl": "https://api.imgbb.com/", "authType": "apiKey"},
|
|
124
|
+
{"name": "OneDrive", "description": "Microsoft file storage", "category": "Storage", "baseUrl": "https://developer.microsoft.com/onedrive", "authType": "oauth"},
|
|
125
|
+
{"name": "Pantry", "description": "Free JSON storage", "category": "Storage", "baseUrl": "https://getpantry.cloud/", "authType": "none"},
|
|
126
|
+
{"name": "Pastebin", "description": "Text storage", "category": "Storage", "baseUrl": "https://pastebin.com/doc_api", "authType": "apiKey"},
|
|
127
|
+
{"name": "Pinata", "description": "IPFS pinning", "category": "Storage", "baseUrl": "https://docs.pinata.cloud/", "authType": "apiKey"},
|
|
128
|
+
{"name": "Storj", "description": "Decentralized storage", "category": "Storage", "baseUrl": "https://docs.storj.io/", "authType": "apiKey"},
|
|
129
|
+
{"name": "Web3.Storage", "description": "IPFS storage", "category": "Storage", "baseUrl": "https://web3.storage/", "authType": "apiKey"},
|
|
130
|
+
|
|
131
|
+
# CI/CD
|
|
132
|
+
{"name": "Azure DevOps Health", "description": "Azure resource health", "category": "CI/CD", "baseUrl": "https://docs.microsoft.com/en-us/rest/api/resourcehealth", "authType": "apiKey"},
|
|
133
|
+
{"name": "Bitrise", "description": "Mobile CI/CD", "category": "CI/CD", "baseUrl": "https://api-docs.bitrise.io/", "authType": "apiKey"},
|
|
134
|
+
{"name": "Buddy", "description": "CI/CD for web", "category": "CI/CD", "baseUrl": "https://buddy.works/docs/api/", "authType": "oauth"},
|
|
135
|
+
{"name": "Codeship", "description": "Cloud CI platform", "category": "CI/CD", "baseUrl": "https://docs.cloudbees.com/docs/cloudbees-codeship/", "authType": "apiKey"},
|
|
136
|
+
|
|
137
|
+
# Data Validation
|
|
138
|
+
{"name": "Lob", "description": "Address verification", "category": "Validation", "baseUrl": "https://www.lob.com/", "authType": "apiKey"},
|
|
139
|
+
{"name": "Postman Echo", "description": "Test API server", "category": "Validation", "baseUrl": "https://www.postman-echo.com/", "authType": "none"},
|
|
140
|
+
{"name": "PurgoMalum", "description": "Profanity filter", "category": "Validation", "baseUrl": "http://www.purgomalum.com/", "authType": "none"},
|
|
141
|
+
{"name": "Smarty", "description": "US address validation", "category": "Validation", "baseUrl": "https://www.smarty.com/docs/", "authType": "apiKey"},
|
|
142
|
+
{"name": "vatlayer", "description": "VAT number validation", "category": "Validation", "baseUrl": "https://vatlayer.com/documentation", "authType": "apiKey"},
|
|
143
|
+
|
|
144
|
+
# Email Validation
|
|
145
|
+
{"name": "Email Validation (Abstract)", "description": "Email verification", "category": "Email", "baseUrl": "https://www.abstractapi.com/email-verification-validation-api", "authType": "apiKey"},
|
|
146
|
+
{"name": "Cloudmersive Validate", "description": "Email and phone validation", "category": "Email", "baseUrl": "https://cloudmersive.com/validate-api", "authType": "apiKey"},
|
|
147
|
+
{"name": "Disify", "description": "Disposable email detection", "category": "Email", "baseUrl": "https://www.disify.com/", "authType": "none"},
|
|
148
|
+
{"name": "DropMail", "description": "Temporary email inbox", "category": "Email", "baseUrl": "https://dropmail.me/api/", "authType": "none"},
|
|
149
|
+
{"name": "EVA", "description": "Email validation", "category": "Email", "baseUrl": "https://eva.pingutil.com/", "authType": "none"},
|
|
150
|
+
{"name": "Guerrilla Mail", "description": "Disposable email", "category": "Email", "baseUrl": "https://www.guerrillamail.com/GuerrillaMailAPI.html", "authType": "none"},
|
|
151
|
+
{"name": "ImprovMX", "description": "Email forwarding", "category": "Email", "baseUrl": "https://improvmx.com/api", "authType": "apiKey"},
|
|
152
|
+
{"name": "Kickbox", "description": "Email verification", "category": "Email", "baseUrl": "https://open.kickbox.com/", "authType": "none"},
|
|
153
|
+
{"name": "mail.gw", "description": "10-minute mail", "category": "Email", "baseUrl": "https://docs.mail.gw/", "authType": "none"},
|
|
154
|
+
{"name": "mail.tm", "description": "Temporary email", "category": "Email", "baseUrl": "https://docs.mail.tm/", "authType": "none"},
|
|
155
|
+
{"name": "MailboxValidator", "description": "Email validation", "category": "Email", "baseUrl": "https://www.mailboxvalidator.com/api-email-free", "authType": "apiKey"},
|
|
156
|
+
{"name": "MailCheck.ai", "description": "Temp email detection", "category": "Email", "baseUrl": "https://www.mailcheck.ai/", "authType": "none"},
|
|
157
|
+
{"name": "Mailtrap", "description": "Email testing", "category": "Email", "baseUrl": "https://mailtrap.docs.apiary.io/", "authType": "apiKey"},
|
|
158
|
+
{"name": "Sendinblue", "description": "Marketing and transactional email", "category": "Email", "baseUrl": "https://developers.sendinblue.com/docs", "authType": "apiKey"},
|
|
159
|
+
{"name": "Verifier", "description": "Email verification", "category": "Email", "baseUrl": "https://verifier.meetchopra.com/docs", "authType": "apiKey"},
|
|
160
|
+
|
|
161
|
+
# Entertainment - Comedy & Memes
|
|
162
|
+
{"name": "Chuck Norris", "description": "Chuck Norris jokes", "category": "Entertainment", "baseUrl": "https://api.chucknorris.io/", "authType": "none"},
|
|
163
|
+
{"name": "Corporate Buzz Words", "description": "Corporate jargon generator", "category": "Entertainment", "baseUrl": "https://github.com/sameerkumar18/corporate-bs-generator-api", "authType": "none"},
|
|
164
|
+
{"name": "Excuser", "description": "Random excuses", "category": "Entertainment", "baseUrl": "https://excuser.herokuapp.com/", "authType": "none"},
|
|
165
|
+
{"name": "Fun Fact", "description": "Random fun facts", "category": "Entertainment", "baseUrl": "https://api.aakhilv.me/", "authType": "none"},
|
|
166
|
+
{"name": "Imgflip", "description": "Meme templates", "category": "Entertainment", "baseUrl": "https://imgflip.com/api", "authType": "none"},
|
|
167
|
+
{"name": "Meme Maker", "description": "Create memes", "category": "Entertainment", "baseUrl": "https://mememaker.github.io/API/", "authType": "none"},
|
|
168
|
+
{"name": "Random Useless Facts", "description": "Useless facts", "category": "Entertainment", "baseUrl": "https://uselessfacts.jsph.pl/", "authType": "none"},
|
|
169
|
+
{"name": "Techy", "description": "Tech-savvy phrases", "category": "Entertainment", "baseUrl": "https://techy-api.vercel.app/", "authType": "none"},
|
|
170
|
+
{"name": "Yo Momma Jokes", "description": "Yo Momma jokes", "category": "Entertainment", "baseUrl": "https://github.com/beanboi7/yomomma-apiv2", "authType": "none"},
|
|
171
|
+
|
|
172
|
+
# Entertainment - TV & Movies
|
|
173
|
+
{"name": "Bob's Burgers", "description": "Bob's Burgers data", "category": "Entertainment", "baseUrl": "https://www.bobsburgersapi.com/", "authType": "none"},
|
|
174
|
+
{"name": "Breaking Bad", "description": "Breaking Bad data", "category": "Entertainment", "baseUrl": "https://breakingbadapi.com/", "authType": "none"},
|
|
175
|
+
{"name": "Comic Vine", "description": "Comic information", "category": "Entertainment", "baseUrl": "https://comicvine.gamespot.com/api/", "authType": "apiKey"},
|
|
176
|
+
{"name": "Dune API", "description": "Dune book/movie data", "category": "Entertainment", "baseUrl": "https://github.com/ywalia01/dune-api", "authType": "none"},
|
|
177
|
+
{"name": "Final Space", "description": "Final Space show data", "category": "Entertainment", "baseUrl": "https://finalspaceapi.com/docs/", "authType": "none"},
|
|
178
|
+
{"name": "Fun Translations", "description": "Translate to movie languages", "category": "Entertainment", "baseUrl": "https://funtranslations.com/api/", "authType": "apiKey"},
|
|
179
|
+
{"name": "Lord of the Rings", "description": "LOTR data", "category": "Entertainment", "baseUrl": "https://the-one-api.dev/documentation", "authType": "apiKey"},
|
|
180
|
+
{"name": "Owen Wilson Wow", "description": "Owen Wilson wow clips", "category": "Entertainment", "baseUrl": "https://owen-wilson-wow-api.onrender.com/", "authType": "none"},
|
|
181
|
+
{"name": "Star Trek", "description": "Star Trek data", "category": "Entertainment", "baseUrl": "https://stapi.co/api-documentation", "authType": "none"},
|
|
182
|
+
{"name": "StockX", "description": "Sneaker and fashion data", "category": "Entertainment", "baseUrl": "https://stockx.vlour.me/", "authType": "none"},
|
|
183
|
+
{"name": "TCGdex", "description": "Pokemon TCG data", "category": "Entertainment", "baseUrl": "https://www.tcgdex.dev/", "authType": "none"},
|
|
184
|
+
|
|
185
|
+
# Face Recognition
|
|
186
|
+
{"name": "Kairos", "description": "Face recognition", "category": "AI/ML", "baseUrl": "https://www.kairos.com/", "authType": "apiKey"},
|
|
187
|
+
{"name": "Skybiometry", "description": "Face detection", "category": "AI/ML", "baseUrl": "https://skybiometry.com/", "authType": "apiKey"},
|
|
188
|
+
|
|
189
|
+
# File Manipulation
|
|
190
|
+
{"name": "Amazon S3", "description": "Object storage", "category": "Storage", "baseUrl": "https://docs.aws.amazon.com/s3/", "authType": "apiKey"},
|
|
191
|
+
{"name": "Cloudinary", "description": "Image and video CDN", "category": "Storage", "baseUrl": "https://cloudinary.com/documentation", "authType": "apiKey"},
|
|
192
|
+
{"name": "DigitalOcean Spaces", "description": "Object storage", "category": "Storage", "baseUrl": "https://docs.digitalocean.com/products/spaces/", "authType": "apiKey"},
|
|
193
|
+
{"name": "Microsoft Graph", "description": "OneDrive access", "category": "Storage", "baseUrl": "https://docs.microsoft.com/en-us/graph/", "authType": "oauth"},
|
|
194
|
+
{"name": "PDF Blocks", "description": "PDF operations", "category": "Storage", "baseUrl": "https://www.pdfblocks.com/docs/api/", "authType": "apiKey"},
|
|
195
|
+
{"name": "SignNow", "description": "eSignature API", "category": "Storage", "baseUrl": "https://docs.signnow.com/", "authType": "oauth"},
|
|
196
|
+
{"name": "Smash", "description": "Large file upload", "category": "Storage", "baseUrl": "https://api.fromsmash.com/", "authType": "apiKey"},
|
|
197
|
+
{"name": "Vector Express", "description": "Vector file conversion", "category": "Storage", "baseUrl": "https://github.com/smidyo/vectorexpress-api", "authType": "none"},
|
|
198
|
+
{"name": "Vertopal", "description": "File format conversion", "category": "Storage", "baseUrl": "https://www.vertopal.com/en/developer/api/", "authType": "apiKey"},
|
|
199
|
+
|
|
200
|
+
# Finance - Additional
|
|
201
|
+
{"name": "Atom Finance", "description": "Market and earnings data", "category": "Finance", "baseUrl": "https://docs.atom.finance/", "authType": "apiKey"},
|
|
202
|
+
{"name": "Binance", "description": "Crypto exchange", "category": "Finance", "baseUrl": "https://github.com/binance/binance-spot-api-docs", "authType": "apiKey"},
|
|
203
|
+
{"name": "Finage", "description": "Stock and forex data", "category": "Finance", "baseUrl": "https://finage.co.uk/", "authType": "apiKey"},
|
|
204
|
+
{"name": "IBANAPI", "description": "IBAN validation", "category": "Finance", "baseUrl": "https://ibanapi.com/", "authType": "apiKey"},
|
|
205
|
+
{"name": "Parqet Logo", "description": "Company logos", "category": "Finance", "baseUrl": "https://developers.parqet.com/", "authType": "none"},
|
|
206
|
+
{"name": "Portfolio Optimizer", "description": "Portfolio analysis", "category": "Finance", "baseUrl": "https://portfoliooptimizer.io/", "authType": "none"},
|
|
207
|
+
{"name": "SEC EDGAR", "description": "US company filings", "category": "Finance", "baseUrl": "https://www.sec.gov/edgar/sec-api-documentation", "authType": "none"},
|
|
208
|
+
{"name": "SmartAPI", "description": "Indian broker API", "category": "Finance", "baseUrl": "https://smartapi.angelbroking.com/", "authType": "apiKey"},
|
|
209
|
+
{"name": "StockData", "description": "Stock market data", "category": "Finance", "baseUrl": "https://www.stockdata.org/", "authType": "apiKey"},
|
|
210
|
+
{"name": "Styvio", "description": "Stock sentiment", "category": "Finance", "baseUrl": "https://www.styvio.com/", "authType": "apiKey"},
|
|
211
|
+
{"name": "YNAB", "description": "Budgeting API", "category": "Finance", "baseUrl": "https://api.youneedabudget.com/", "authType": "oauth"},
|
|
212
|
+
{"name": "Zoho Books", "description": "Accounting API", "category": "Finance", "baseUrl": "https://www.zoho.com/books/api/v3/", "authType": "oauth"},
|
|
213
|
+
|
|
214
|
+
# Fitness
|
|
215
|
+
{"name": "FitBit", "description": "Fitness tracking", "category": "Fitness", "baseUrl": "https://dev.fitbit.com/", "authType": "oauth"},
|
|
216
|
+
{"name": "HealthGraph (RunKeeper)", "description": "Health data", "category": "Fitness", "baseUrl": "https://runkeeper.com/developer/healthgraph/", "authType": "oauth"},
|
|
217
|
+
{"name": "Open Food Facts", "description": "Food database", "category": "Fitness", "baseUrl": "https://world.openfoodfacts.org/data", "authType": "none"},
|
|
218
|
+
{"name": "Strava", "description": "Athletic activity", "category": "Fitness", "baseUrl": "https://developers.strava.com/", "authType": "oauth"},
|
|
219
|
+
{"name": "VeganCheck", "description": "Product vegan check", "category": "Fitness", "baseUrl": "https://jokenetwork.de/vegancheck-api", "authType": "none"},
|
|
220
|
+
{"name": "Withings", "description": "Health devices", "category": "Fitness", "baseUrl": "https://developer.withings.com/", "authType": "oauth"},
|
|
221
|
+
|
|
222
|
+
# Google APIs
|
|
223
|
+
{"name": "Google BigQuery", "description": "Data warehouse", "category": "Google", "baseUrl": "https://cloud.google.com/bigquery/docs/reference/rest/", "authType": "oauth"},
|
|
224
|
+
{"name": "Google Calendar", "description": "Calendar management", "category": "Google", "baseUrl": "https://developers.google.com/calendar/", "authType": "oauth"},
|
|
225
|
+
{"name": "Google Classroom", "description": "Education platform", "category": "Google", "baseUrl": "https://developers.google.com/classroom/", "authType": "oauth"},
|
|
226
|
+
{"name": "Google CustomSearch", "description": "Custom search engine", "category": "Google", "baseUrl": "https://developers.google.com/custom-search/", "authType": "apiKey"},
|
|
227
|
+
{"name": "Google Fitness", "description": "Health tracking", "category": "Google", "baseUrl": "https://developers.google.com/fit/", "authType": "oauth"},
|
|
228
|
+
{"name": "Google Fonts", "description": "Web fonts", "category": "Google", "baseUrl": "https://developers.google.com/fonts/", "authType": "apiKey"},
|
|
229
|
+
{"name": "Google Genomics", "description": "Genomics data", "category": "Google", "baseUrl": "https://cloud.google.com/genomics/", "authType": "oauth"},
|
|
230
|
+
{"name": "Google Identity", "description": "Identity platform", "category": "Google", "baseUrl": "https://developers.google.com/identity/", "authType": "oauth"},
|
|
231
|
+
{"name": "Google Monitoring", "description": "Cloud monitoring", "category": "Google", "baseUrl": "https://cloud.google.com/monitoring/api/", "authType": "apiKey"},
|
|
232
|
+
|
|
233
|
+
# Identity Verification
|
|
234
|
+
{"name": "BlockScore", "description": "Identity verification", "category": "Security", "baseUrl": "https://docs.blockscore.com/", "authType": "apiKey"},
|
|
235
|
+
{"name": "Cognito", "description": "Identity verification", "category": "Security", "baseUrl": "https://cognitohq.com/docs", "authType": "apiKey"},
|
|
236
|
+
{"name": "Whitepages Pro", "description": "Identity verification", "category": "Security", "baseUrl": "https://pro.whitepages.com/", "authType": "apiKey"},
|
|
237
|
+
|
|
238
|
+
# Login & Auth
|
|
239
|
+
{"name": "Auth0", "description": "Authentication platform", "category": "Auth", "baseUrl": "https://auth0.com/docs/api/", "authType": "apiKey"},
|
|
240
|
+
{"name": "Facebook Login", "description": "Facebook authentication", "category": "Auth", "baseUrl": "https://developers.facebook.com/docs/facebook-login", "authType": "oauth"},
|
|
241
|
+
{"name": "GitHub Auth", "description": "GitHub authentication", "category": "Auth", "baseUrl": "https://docs.github.com/en/developers/apps/building-oauth-apps", "authType": "oauth"},
|
|
242
|
+
{"name": "Instagram Auth", "description": "Instagram login", "category": "Auth", "baseUrl": "https://developers.facebook.com/docs/instagram-basic-display-api/", "authType": "oauth"},
|
|
243
|
+
{"name": "LinkedIn Auth", "description": "LinkedIn sign-in", "category": "Auth", "baseUrl": "https://docs.microsoft.com/en-us/linkedin/shared/authentication/", "authType": "oauth"},
|
|
244
|
+
{"name": "PayPal Auth", "description": "PayPal login", "category": "Auth", "baseUrl": "https://developer.paypal.com/docs/log-in-with-paypal/", "authType": "oauth"},
|
|
245
|
+
{"name": "Salesforce Auth", "description": "Salesforce authentication", "category": "Auth", "baseUrl": "https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_understanding_authentication.htm", "authType": "oauth"},
|
|
246
|
+
{"name": "Twitter Auth", "description": "Twitter sign-in", "category": "Auth", "baseUrl": "https://developer.twitter.com/en/docs/authentication", "authType": "oauth"},
|
|
247
|
+
{"name": "WorkOS", "description": "Enterprise SSO", "category": "Auth", "baseUrl": "https://workos.com/docs/", "authType": "apiKey"},
|
|
248
|
+
|
|
249
|
+
# Test Data
|
|
250
|
+
{"name": "Faker API", "description": "Fake data generation", "category": "Test Data", "baseUrl": "https://fakerapi.it/en", "authType": "none"},
|
|
251
|
+
{"name": "RandomUser", "description": "Random user data", "category": "Test Data", "baseUrl": "https://randomuser.me/", "authType": "none"},
|
|
252
|
+
{"name": "UUID Generator", "description": "Generate UUIDs", "category": "Test Data", "baseUrl": "https://www.uuidgenerator.net/api", "authType": "none"},
|
|
253
|
+
{"name": "Lorem Ipsum", "description": "Placeholder text", "category": "Test Data", "baseUrl": "https://loripsum.net/", "authType": "none"},
|
|
254
|
+
{"name": "Mockaroo", "description": "Test data generation", "category": "Test Data", "baseUrl": "https://www.mockaroo.com/api/docs", "authType": "apiKey"},
|
|
255
|
+
{"name": "Random Data API", "description": "Random data types", "category": "Test Data", "baseUrl": "https://random-data-api.com/documentation", "authType": "none"},
|
|
256
|
+
|
|
257
|
+
# Text Analysis
|
|
258
|
+
{"name": "Aylien", "description": "NLP and text analysis", "category": "AI/ML", "baseUrl": "https://docs.aylien.com/textapi/", "authType": "apiKey"},
|
|
259
|
+
{"name": "Dandelion", "description": "Semantic text analytics", "category": "AI/ML", "baseUrl": "https://dandelion.eu/docs/", "authType": "apiKey"},
|
|
260
|
+
{"name": "Google Natural Language", "description": "NLP API", "category": "AI/ML", "baseUrl": "https://cloud.google.com/natural-language/docs/", "authType": "apiKey"},
|
|
261
|
+
{"name": "Language Tool", "description": "Grammar checking", "category": "AI/ML", "baseUrl": "https://languagetool.org/http-api/", "authType": "none"},
|
|
262
|
+
{"name": "Lilt", "description": "Translation API", "category": "AI/ML", "baseUrl": "https://lilt.com/docs/api/", "authType": "apiKey"},
|
|
263
|
+
{"name": "Meaning Cloud", "description": "Text analytics", "category": "AI/ML", "baseUrl": "https://www.meaningcloud.com/developer/", "authType": "apiKey"},
|
|
264
|
+
{"name": "TextRazor", "description": "Text analysis", "category": "AI/ML", "baseUrl": "https://www.textrazor.com/docs", "authType": "apiKey"},
|
|
265
|
+
{"name": "Tisane", "description": "NLP for abuse detection", "category": "AI/ML", "baseUrl": "https://tisane.ai/docs/", "authType": "apiKey"},
|
|
266
|
+
|
|
267
|
+
# Tracking
|
|
268
|
+
{"name": "AfterShip", "description": "Shipment tracking", "category": "Tracking", "baseUrl": "https://www.aftership.com/docs/aftership", "authType": "apiKey"},
|
|
269
|
+
{"name": "Easypost", "description": "Shipping API", "category": "Tracking", "baseUrl": "https://www.easypost.com/docs/api", "authType": "apiKey"},
|
|
270
|
+
{"name": "Postmates", "description": "Local delivery", "category": "Tracking", "baseUrl": "https://developer.postmates.com/docs", "authType": "apiKey"},
|
|
271
|
+
{"name": "Ship24", "description": "Universal tracking", "category": "Tracking", "baseUrl": "https://www.ship24.com/en/developer", "authType": "apiKey"},
|
|
272
|
+
{"name": "Shippo", "description": "Shipping rates and labels", "category": "Tracking", "baseUrl": "https://goshippo.com/docs/", "authType": "apiKey"},
|
|
273
|
+
{"name": "TrackingMore", "description": "Multi-carrier tracking", "category": "Tracking", "baseUrl": "https://www.trackingmore.com/api-index.html", "authType": "apiKey"},
|
|
274
|
+
{"name": "UPS", "description": "UPS shipping", "category": "Tracking", "baseUrl": "https://www.ups.com/upsdeveloperkit", "authType": "apiKey"},
|
|
275
|
+
{"name": "USPS", "description": "US Postal Service", "category": "Tracking", "baseUrl": "https://www.usps.com/business/web-tools-apis/", "authType": "apiKey"},
|
|
276
|
+
{"name": "FedEx", "description": "FedEx shipping", "category": "Tracking", "baseUrl": "https://developer.fedex.com/api/en-us/home.html", "authType": "apiKey"},
|
|
277
|
+
{"name": "DHL", "description": "DHL shipping", "category": "Tracking", "baseUrl": "https://developer.dhl.com/", "authType": "apiKey"},
|
|
278
|
+
|
|
279
|
+
# Web Scraping & Screenshots
|
|
280
|
+
{"name": "ApiFlash", "description": "Screenshot API", "category": "Development", "baseUrl": "https://apiflash.com/", "authType": "apiKey"},
|
|
281
|
+
{"name": "Browshot", "description": "Screenshot service", "category": "Development", "baseUrl": "https://browshot.com/api/documentation", "authType": "apiKey"},
|
|
282
|
+
{"name": "ProxyCrawl", "description": "Web scraping proxy", "category": "Development", "baseUrl": "https://proxycrawl.com/", "authType": "apiKey"},
|
|
283
|
+
{"name": "ScrapeNinja", "description": "Web scraping", "category": "Development", "baseUrl": "https://scrapeninja.net/", "authType": "apiKey"},
|
|
284
|
+
{"name": "ScraperAPI", "description": "Web scraping", "category": "Development", "baseUrl": "https://www.scraperapi.com/", "authType": "apiKey"},
|
|
285
|
+
{"name": "scrapestack", "description": "Web scraping", "category": "Development", "baseUrl": "https://scrapestack.com/", "authType": "apiKey"},
|
|
286
|
+
{"name": "ScrapingAnt", "description": "Headless scraping", "category": "Development", "baseUrl": "https://scrapingant.com/", "authType": "apiKey"},
|
|
287
|
+
{"name": "ScrapingDog", "description": "Proxy scraping", "category": "Development", "baseUrl": "https://www.scrapingdog.com/", "authType": "apiKey"},
|
|
288
|
+
{"name": "ScreenshotAPI", "description": "Website screenshots", "category": "Development", "baseUrl": "https://screenshotapi.net/", "authType": "apiKey"},
|
|
289
|
+
{"name": "serpstack", "description": "Search result scraping", "category": "Development", "baseUrl": "https://serpstack.com/", "authType": "apiKey"},
|
|
290
|
+
{"name": "WebScraping.AI", "description": "AI web scraping", "category": "Development", "baseUrl": "https://webscraping.ai/", "authType": "apiKey"},
|
|
291
|
+
{"name": "ZenRows", "description": "Anti-bot bypass", "category": "Development", "baseUrl": "https://www.zenrows.com/", "authType": "apiKey"},
|
|
292
|
+
]
|
|
293
|
+
|
|
294
|
+
def main():
|
|
295
|
+
print("š¦ APIClaw Night Expansion 03:00 - Batch 2")
|
|
296
|
+
print("=" * 50)
|
|
297
|
+
|
|
298
|
+
registry = load_registry()
|
|
299
|
+
current_count = registry.get("count", 0)
|
|
300
|
+
apis = registry.get("apis", [])
|
|
301
|
+
|
|
302
|
+
print(f"Current count: {current_count}")
|
|
303
|
+
|
|
304
|
+
existing_names = set(api.get("name", "").lower() for api in apis)
|
|
305
|
+
|
|
306
|
+
added = 0
|
|
307
|
+
for new_api in BATCH2_APIS:
|
|
308
|
+
if new_api["name"].lower() not in existing_names:
|
|
309
|
+
api_entry = {
|
|
310
|
+
"id": generate_id(new_api["name"], new_api["category"]),
|
|
311
|
+
"name": new_api["name"],
|
|
312
|
+
"description": new_api["description"],
|
|
313
|
+
"category": new_api["category"],
|
|
314
|
+
"baseUrl": new_api["baseUrl"],
|
|
315
|
+
"authType": new_api["authType"],
|
|
316
|
+
"pricingModel": "freemium",
|
|
317
|
+
"source": "night-expansion-03-batch2"
|
|
318
|
+
}
|
|
319
|
+
apis.append(api_entry)
|
|
320
|
+
existing_names.add(new_api["name"].lower())
|
|
321
|
+
added += 1
|
|
322
|
+
|
|
323
|
+
registry["apis"] = apis
|
|
324
|
+
registry["count"] = len(apis)
|
|
325
|
+
registry["lastUpdated"] = datetime.now().isoformat()
|
|
326
|
+
|
|
327
|
+
save_registry(registry)
|
|
328
|
+
|
|
329
|
+
print(f"ā
Added: {added} APIs")
|
|
330
|
+
print(f"š New total: {len(apis)}")
|
|
331
|
+
|
|
332
|
+
return {"before": current_count, "after": len(apis), "added": added}
|
|
333
|
+
|
|
334
|
+
if __name__ == "__main__":
|
|
335
|
+
stats = main()
|
|
336
|
+
print(f"\nš Progress: {stats['before']} ā {stats['after']} (+{stats['added']})")
|