diff --git a/.github/assets/sponsors_logo/m3o_logo_black.png b/.github/assets/sponsors_logo/m3o_logo_black.png new file mode 100644 index 00000000..c1332152 Binary files /dev/null and b/.github/assets/sponsors_logo/m3o_logo_black.png differ diff --git a/.github/assets/sponsors_logo/m3o_logo_white.png b/.github/assets/sponsors_logo/m3o_logo_white.png new file mode 100644 index 00000000..7c1da481 Binary files /dev/null and b/.github/assets/sponsors_logo/m3o_logo_white.png differ diff --git a/.github/cs1586-APILayerLogoUpdate2022-LJ_v2-HighRes.png b/.github/cs1586-APILayerLogoUpdate2022-LJ_v2-HighRes.png new file mode 100644 index 00000000..43a9b327 Binary files /dev/null and b/.github/cs1586-APILayerLogoUpdate2022-LJ_v2-HighRes.png differ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 65e5f699..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: "Run tests" - -on: - schedule: - - cron: '0 0 * * *' - push: - branches: - - master - pull_request: - branches: - - master - -env: - FORMAT_FILE: README.md - -jobs: - test: - name: 'Validate README.md' - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Validate Markdown format - run: build/validate_format.py ${FORMAT_FILE} - - - name: Validate pull request changes - run: build/github-pull.sh ${{ github.repository }} ${{ github.event.pull_request.number }} ${FORMAT_FILE} - if: github.event_name == 'pull_request' diff --git a/.github/workflows/test_of_push_and_pull.yml b/.github/workflows/test_of_push_and_pull.yml new file mode 100644 index 00000000..4ee1316f --- /dev/null +++ b/.github/workflows/test_of_push_and_pull.yml @@ -0,0 +1,37 @@ +name: "Tests of push & pull" + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +env: + FILENAME: README.md + +jobs: + tests: + name: 'Validate README.md changes' + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + + - name: Install dependencies + run: python -m pip install -r scripts/requirements.txt + + - name: Validate Markdown format + run: python scripts/validate/format.py ${FILENAME} + + - name: Validate pull request changes + run: scripts/github_pull_request.sh ${{ github.repository }} ${{ github.event.pull_request.number }} ${FILENAME} + if: github.event_name == 'pull_request' + + - name: Checking if push changes are duplicated + run: python scripts/validate/links.py ${FILENAME} --only_duplicate_links_checker + if: github.event_name == 'push' diff --git a/.github/workflows/test_of_validate_package.yml b/.github/workflows/test_of_validate_package.yml new file mode 100644 index 00000000..f739df81 --- /dev/null +++ b/.github/workflows/test_of_validate_package.yml @@ -0,0 +1,29 @@ +name: "Tests of validate package" + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + unittest: + name: 'Run tests of validate package' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + + - name: Install dependencies + run: python -m pip install -r scripts/requirements.txt + + - name: Run Unittest + run: | + cd scripts + python -m unittest discover tests/ --verbose diff --git a/.github/workflows/validate_links.yml b/.github/workflows/validate_links.yml index 92afb843..33fef088 100644 --- a/.github/workflows/validate_links.yml +++ b/.github/workflows/validate_links.yml @@ -1,22 +1,28 @@ name: "Validate links" on: + workflow_dispatch: schedule: - cron: '0 0 * * *' - push: - branches: - - master env: - FORMAT_FILE: README.md + FILENAME: README.md jobs: - test: - name: 'Validate links' + validate_links: + name: 'Check all links are working' runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + + - name: Install dependencies + run: python -m pip install -r scripts/requirements.txt + - name: Validate all links from README.md - run: build/validate_links.py ${FORMAT_FILE} + run: python scripts/validate/links.py ${FILENAME} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..bdca81ea --- /dev/null +++ b/.gitignore @@ -0,0 +1,130 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +.pypirc + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ \ No newline at end of file diff --git a/LICENSE b/LICENSE index 5d67c9ed..196b23b1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 public-apis +Copyright (c) 2022 public-apis Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 44e87ebc..f7348891 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,22 @@
Status
- - Run tests - - - Validate links + + Number of Categories Number of APIs +
+ + Tests of push and pull + + + Validate links + + + Tests of validate package +

@@ -29,14 +36,7 @@ IssuesPull RequestsLicense -

- Currently Active Maintainers -
- matheusfelipeog • - pawelborkar • - marekdano • - yannbertrand - +
@@ -47,18 +47,59 @@ Dev ResourcesPublic APIs SiteApihouse • - Collective APIs + Collective APIs +
+ --- +
+ +
+

+ [ Become a sponsor and support Public APIs and their maintainers ] +

+

Special thanks to:

+

+ +

+ APILayer Logo +
+
+

The fastest way to integrate APIs into any product

+
+
+ Explore, discover and consume public APIs as simpler programmable building blocks all on one platform for a 10x developer experience. +
+
+ +
+ APILayer Logo +
+
+

The fastest way to integrate APIs into any product

+
+
+ Explore, discover and consume public APIs as simpler programmable building blocks all on one platform for a 10x developer experience. +
+
+

+
+ +
+ +--- + +
+ ## Index * [Animals](#animals) * [Anime](#anime) * [Anti-Malware](#anti-malware) * [Art & Design](#art--design) -* [Authentication](#authentication) +* [Authentication & Authorization](#authentication--authorization) * [Blockchain](#blockchain) * [Books](#books) * [Business](#business) @@ -113,28 +154,29 @@ API | Description | Auth | HTTPS | CORS | | [Axolotl](https://theaxolotlapi.netlify.app/) | Collection of axolotl pictures and facts | No | Yes | No | | [Cat Facts](https://alexwohlbruck.github.io/cat-facts/) | Daily cat facts | No | Yes | No | | [Cataas](https://cataas.com/) | Cat as a service (cats pictures and gifs) | No | Yes | No | -| [catAPI](https://thatcopy.pw/catapi) | Random pictures of cats | No | Yes | Yes | | [Cats](https://docs.thecatapi.com/) | Pictures of cats from Tumblr | `apiKey` | Yes | No | | [Dog Facts](https://dukengn.github.io/Dog-facts-API/) | Random dog facts | No | Yes | Yes | | [Dog Facts](https://kinduff.github.io/dog-api/) | Random facts of Dogs | No | Yes | Yes | | [Dogs](https://dog.ceo/dog-api/) | Based on the Stanford Dogs Dataset | No | Yes | Yes | | [eBird](https://documenter.getpostman.com/view/664302/S1ENwy59) | Retrieve recent or notable birding observations within a region | `apiKey` | Yes | No | | [FishWatch](https://www.fishwatch.gov/developers) | Information and pictures about individual fish species | No | Yes | Yes | -| [HTTPCat](https://http.cat/) | Cat for every HTTP Status | No | Yes | Yes | +| [HTTP Cat](https://http.cat/) | Cat for every HTTP Status | No | Yes | Yes | +| [HTTP Dog](https://http.dog/) | Dogs for every HTTP response status code | No | Yes | Yes | | [IUCN](http://apiv3.iucnredlist.org/api/v3/docs) | IUCN Red List of Threatened Species | `apiKey` | No | No | -| [MeowFacts](https://github.com/wh-iterabb-it/meowfacts) | Get random cat facts | No | Yes | Unknown | +| [MeowFacts](https://github.com/wh-iterabb-it/meowfacts) | Get random cat facts | No | Yes | No | | [Movebank](https://github.com/movebank/movebank-api-doc) | Movement and Migration data of animals | No | Yes | Yes | | [Petfinder](https://www.petfinder.com/developers/) | Petfinder is dedicated to helping pets find homes, another resource to get pets adopted | `apiKey` | Yes | Yes | | [PlaceBear](https://placebear.com/) | Placeholder bear pictures | No | Yes | Yes | | [PlaceDog](https://place.dog) | Placeholder Dog pictures | No | Yes | Yes | | [PlaceKitten](https://placekitten.com/) | Placeholder Kitten pictures | No | Yes | Yes | -| [RandomCat](https://aws.random.cat) | Random pictures of cats | No | Yes | Yes | | [RandomDog](https://random.dog/woof.json) | Random pictures of dogs | No | Yes | Yes | | [RandomDuck](https://random-d.uk/api) | Random pictures of ducks | No | Yes | No | | [RandomFox](https://randomfox.ca/floof/) | Random pictures of foxes | No | Yes | No | | [RescueGroups](https://userguide.rescuegroups.org/display/APIDG/API+Developers+Guide+Home) | Adoption | No | Yes | Unknown | | [Shibe.Online](http://shibe.online/) | Random pictures of Shiba Inu, cats or birds | No | Yes | Yes | | [The Dog](https://thedogapi.com/) | A public service all about Dogs, free to use when making your fancy new App, Website or Service | `apiKey` | Yes | No | +| [xeno-canto](https://xeno-canto.org/explore/api) | Bird recordings | No | Yes | Unknown | +| [Zoo Animals](https://zoo-animal-api.herokuapp.com/) | Facts and pictures of zoo animals | No | Yes | Yes | **[⬆ Back to Index](#index)** ### Anime @@ -146,6 +188,7 @@ API | Description | Auth | HTTPS | CORS | | [AnimeChan](https://github.com/RocktimSaikia/anime-chan) | Anime quotes (over 10k+) | No | Yes | No | | [AnimeFacts](https://chandan-02.github.io/anime-facts-rest-api/) | Anime Facts (over 100+) | No | Yes | Yes | | [AnimeNewsNetwork](https://www.animenewsnetwork.com/encyclopedia/api.php) | Anime industry news | No | Yes | Yes | +| [Catboy](https://catboys.com/api) | Neko images, funny GIFs & more | No | Yes | Yes | | [Danbooru Anime](https://danbooru.donmai.us/wiki_pages/help:api) | Thousands of anime artist database to find good anime art | `apiKey` | Yes | Yes | | [Jikan](https://jikan.moe) | Unofficial MyAnimeList API | No | Yes | Yes | | [Kitsu](https://kitsu.docs.apiary.io/) | Anime discovery platform | `OAuth` | Yes | Yes | @@ -155,7 +198,8 @@ API | Description | Auth | HTTPS | CORS | | [NekosBest](https://docs.nekos.best) | Neko Images & Anime roleplaying GIFs | No | Yes | Yes | | [Shikimori](https://shikimori.one/api/doc) | Anime discovery, tracking, forum, rates | `OAuth` | Yes | Unknown | | [Studio Ghibli](https://ghibliapi.herokuapp.com) | Resources from Studio Ghibli films | No | Yes | Yes | -| [Trace Moe](https://soruly.github.io/trace.moe-api/#/) | A useful tool to get the exact scene of an anime from a screenshot | No | Yes | Unknown | +| [Trace Moe](https://soruly.github.io/trace.moe-api/#/) | A useful tool to get the exact scene of an anime from a screenshot | No | Yes | No | +| [Waifu.im](https://waifu.im/docs) | Get waifu pictures from an archive of over 4000 images and multiple tags | No | Yes | Yes | | [Waifu.pics](https://waifu.pics/docs) | Image sharing platform for anime images | No | Yes | No | **[⬆ Back to Index](#index)** @@ -170,9 +214,10 @@ API | Description | Auth | HTTPS | CORS | | [MalShare](https://malshare.com/doc.php) | Malware Archive / file sourcing | `apiKey` | Yes | No | | [MalwareBazaar](https://bazaar.abuse.ch/api/) | Collect and share malware samples | `apiKey` | Yes | Unknown | | [Metacert](https://metacert.com/) | Metacert Link Flagging | `apiKey` | Yes | Unknown | +| [NoPhishy](https://rapidapi.com/Amiichu/api/exerra-phishing-check/) | Check links to see if they're known phishing attempts | `apiKey` | Yes | Yes | | [Phisherman](https://phisherman.gg/) | IP/domain/URL reputation | `apiKey` | Yes | Unknown | | [Scanii](https://docs.scanii.com/) | Simple REST API that can scan submitted documents/files for the presence of threats | `apiKey` | Yes | Yes | -| [URLhaus](https://urlhaus-api.abuse.ch/) | Bulk queries and Download Malware Samples | No | Yes | Unknown | +| [URLhaus](https://urlhaus-api.abuse.ch/) | Bulk queries and Download Malware Samples | No | Yes | Yes | | [URLScan.io](https://urlscan.io/about-api/) | Scan and Analyse URLs | `apiKey` | Yes | Unknown | | [VirusTotal](https://www.virustotal.com/en/documentation/public-api/) | VirusTotal File/URL Analysis | `apiKey` | Yes | Unknown | | [Web of Trust](https://support.mywot.com/hc/en-us/sections/360004477734-API-) | IP/domain/URL reputation | `apiKey` | Yes | Unknown | @@ -187,6 +232,7 @@ API | Description | Auth | HTTPS | CORS | | [ColourLovers](http://www.colourlovers.com/api) | Get various patterns, palettes and images | No | No | Unknown | | [Cooper Hewitt](https://collection.cooperhewitt.org/api) | Smithsonian Design Museum | `apiKey` | Yes | Unknown | | [Dribbble](https://developer.dribbble.com) | Discover the world’s top designers & creatives | `OAuth` | Yes | Unknown | +| [EmojiHub](https://github.com/cheatsnake/emojihub) | Get emojis by categories and groups | No | Yes | Yes | | [Europeana](https://pro.europeana.eu/resources/apis/search) | European Museum and Galleries content | `apiKey` | Yes | Unknown | | [Harvard Art Museums](https://github.com/harvardartmuseums/api-docs) | Art | `apiKey` | No | Unknown | | [Icon Horse](https://icon.horse) | Favicons for any website, with fallbacks | No | Yes | Yes | @@ -202,7 +248,7 @@ API | Description | Auth | HTTPS | CORS | | [xColors](https://x-colors.herokuapp.com/) | Generate & convert colors | No | Yes | Yes | **[⬆ Back to Index](#index)** -### Authentication +### Authentication & Authorization API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [Auth0](https://auth0.com) | Easy to implement, adaptable authentication and authorization platform | `apiKey` | Yes | Yes | @@ -211,6 +257,7 @@ API | Description | Auth | HTTPS | CORS | | [MojoAuth](https://mojoauth.com) | Secure and modern passwordless authentication platform | `apiKey` | Yes | Yes | | [SAWO Labs](https://sawolabs.com) | Simplify login and improve user experience by integrating passwordless authentication in your app | `apiKey` | Yes | Yes | | [Stytch](https://stytch.com/) | User infrastructure for modern applications | `apiKey` | Yes | No | +| [Warrant](https://warrant.dev/) | APIs for authorization and access control | `apiKey` | Yes | Yes | **[⬆ Back to Index](#index)** ### Blockchain @@ -224,8 +271,9 @@ API | Description | Auth | HTTPS | CORS | | [Helium](https://docs.helium.com/api/blockchain/introduction/) | Helium is a global, distributed network of Hotspots that create public, long-range wireless coverage | No | Yes | Unknown | | [Nownodes](https://nownodes.io/) | Blockchain-as-a-service solution that provides high-quality connection via API | `apiKey` | Yes | Unknown | | [Steem](https://developers.steem.io/) | Blockchain-based blogging and social media website | No | No | No | -| [The Graph](https://thegraph.com) | Indexing protocol for querying networks like Ethereum with GraphQL | No | Yes | Unknown | +| [The Graph](https://thegraph.com) | Indexing protocol for querying networks like Ethereum with GraphQL | `apiKey` | Yes | Unknown | | [Walltime](https://walltime.info/api.html) | To retrieve Walltime's market info | No | Yes | Unknown | +| [Watchdata](https://docs.watchdata.io) | Provide simple and reliable API access to Ethereum blockchain | `apiKey` | Yes | Unknown | **[⬆ Back to Index](#index)** ### Books @@ -238,12 +286,10 @@ API | Description | Auth | HTTPS | CORS | | [Bible-api](https://bible-api.com/) | Free Bible API with multiple languages | No | Yes | Yes | | [British National Bibliography](http://bnb.data.bl.uk/) | Books | No | No | Unknown | | [Crossref Metadata Search](https://github.com/CrossRef/rest-api-doc) | Books & Articles Metadata | No | Yes | Unknown | -| [Ganjoor](https://ganjgah.ir) | Classic Persian poetry works including access to related manuscripts, recitations and music tracks | `OAuth` | Yes | Yes | -| [Goodreads](https://www.goodreads.com/api) | Developers Access to Goodreads data | `apiKey` | Yes | Unknown | +| [Ganjoor](https://api.ganjoor.net) | Classic Persian poetry works including access to related manuscripts, recitations and music tracks | `OAuth` | Yes | Yes | | [Google Books](https://developers.google.com/books/) | Books | `OAuth` | Yes | Unknown | | [GurbaniNow](https://github.com/GurbaniNow/api) | Fast and Accurate Gurbani RESTful API | No | Yes | Unknown | | [Gutendex](https://gutendex.com/) | Web-API for fetching data from Project Gutenberg Books Library | No | Yes | Unknown | -| [LibGen](https://garbage.world/posts/libgen/) | Library Genesis search engine | No | No | Unknown | | [Open Library](https://openlibrary.org/developers/api) | Books, book covers and related data | No | Yes | No | | [Penguin Publishing](http://www.penguinrandomhouse.biz/webservices/rest/) | Books, book covers and related data | No | Yes | Yes | | [PoetryDB](https://github.com/thundercomb/poetrydb#readme) | Enables you to get instant data from our vast poetry collection | No | Yes | Yes | @@ -254,27 +300,24 @@ API | Description | Auth | HTTPS | CORS | | [The Bible](https://docs.api.bible) | Everything you need from the Bible in one discoverable place | `apiKey` | Yes | Unknown | | [Thirukkural](https://api-thirukkural.web.app/) | 1330 Thirukkural poems and explanation in Tamil and English | No | Yes | Yes | | [Vedic Society](https://aninditabasu.github.io/indica/html/vs.html) | Descriptions of all nouns (names, places, animals, things) from vedic literature | No | Yes | Unknown | +| [Wizard World](https://wizard-world-api.herokuapp.com/swagger/index.html) | Get information from the Harry Potter universe | No | Yes | Yes | | [Wolne Lektury](https://wolnelektury.pl/api/) | API for obtaining information about e-books available on the WolneLektury.pl website | No | Yes | Unknown | **[⬆ Back to Index](#index)** ### Business API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| -| [Apache Superset](https://superset.apache.org/docs/rest-api) | API to manage your BI dashboards and data sources on Superset | `apiKey` | Yes | Yes | +| [Apache Superset](https://superset.apache.org/docs/api) | API to manage your BI dashboards and data sources on Superset | `apiKey` | Yes | Yes | | [Charity Search](http://charityapi.orghunter.com/) | Non-profit charity data | `apiKey` | No | Unknown | | [Clearbit Logo](https://clearbit.com/docs#logo-api) | Search for company logos and embed them in your projects | `apiKey` | Yes | Unknown | | [Domainsdb.info](https://domainsdb.info/) | Registered Domain Names Search | No | Yes | No | -| [Freelancer](https://developers.freelancer.com/docs) | Hire freelancers to get work done | `OAuth` | Yes | Unknown | +| [Freelancer](https://developers.freelancer.com) | Hire freelancers to get work done | `OAuth` | Yes | Unknown | | [Gmail](https://developers.google.com/gmail/api/) | Flexible, RESTful access to the user's inbox | `OAuth` | Yes | Unknown | | [Google Analytics](https://developers.google.com/analytics/) | Collect, configure and analyze your data to reach the right audience | `OAuth` | Yes | Unknown | -| [ImprovMX](https://improvmx.com/api) | API for free email forwarding service | `apiKey` | Yes | Unknown | | [Instatus](https://instatus.com/help/api) | Post to and update maintenance and incidents on your status page through an HTTP REST API | `apiKey` | Yes | Unknown | -| [mail.tm](https://docs.mail.tm) | Temporary Email Service | No | Yes | Yes | -| [MailboxValidator](https://www.mailboxvalidator.com/api-email-free) | Validate email address to improve deliverability | `apiKey` | Yes | Unknown | | [Mailchimp](https://mailchimp.com/developer/) | Send marketing campaigns and transactional mails | `apiKey` | Yes | Unknown | -| [mailgun](https://www.mailgun.com/) | Email Service | `apiKey` | Yes | Unknown | | [mailjet](https://www.mailjet.com/) | Marketing email can be sent and mail templates made in MJML or HTML can be sent using API | `apiKey` | Yes | Unknown | -| [markerapi](http://www.markerapi.com/) | Trademark Search | No | No | Unknown | +| [markerapi](https://markerapi.com) | Trademark Search | No | No | Unknown | | [ORB Intelligence](https://api.orb-intelligence.com/docs/) | Company lookup | `apiKey` | Yes | Unknown | | [Redash](https://redash.io/help/user-guide/integrations-and-api/api) | Access your queries and dashboards on Redash | `apiKey` | Yes | Yes | | [Smartsheet](https://smartsheet.redoc.ly/) | Allows you to programmatically access and Smartsheet data and account information | `OAuth` | Yes | No | @@ -293,8 +336,8 @@ API | Description | Auth | HTTPS | CORS | API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [Abstract Public Holidays](https://www.abstractapi.com/holidays-api) | Data on national, regional, and religious holidays via API | `apiKey` | Yes | Yes | -| [Calendar Index](https://www.calendarindex.com/) | Worldwide Holidays and Working Days | `apiKey` | Yes | Yes | | [Calendarific](https://calendarific.com/) | Worldwide Holidays | `apiKey` | Yes | Unknown | +| [Checkiday - National Holiday API](https://apilayer.com/marketplace/checkiday-api) | Industry-leading Holiday API. Over 5,000 holidays and thousands of descriptions. Trusted by the World’s leading companies | `apiKey` | Yes | Unknown | | [Church Calendar](http://calapi.inadiutorium.cz/) | Catholic liturgical calendar | No | No | Unknown | | [Czech Namedays Calendar](https://svatky.adresa.info) | Lookup for a name and returns nameday date | No | No | Unknown | | [Festivo Public Holidays](https://docs.getfestivo.com/docs/products/public-holidays-api/intro) | Fastest and most advanced public holiday and observance service on the market | `apiKey` | Yes | Yes | @@ -302,14 +345,12 @@ API | Description | Auth | HTTPS | CORS | | [Hebrew Calendar](https://www.hebcal.com/home/developer-apis) | Convert between Gregorian and Hebrew, fetch Shabbat and Holiday times, etc | No | No | Unknown | | [Holidays](https://holidayapi.com/) | Historical data regarding holidays | `apiKey` | Yes | Unknown | | [LectServe](http://www.lectserve.com) | Protestant liturgical calendar | No | No | Unknown | -| [Megavangelical](https://megavangelicals.com/sundays.json) | A (satirical) Evangelical liturgical calendar | No | Yes | Yes | | [Nager.Date](https://date.nager.at) | Public holidays for more than 90 countries | No | Yes | No | | [Namedays Calendar](https://nameday.abalin.net) | Provides namedays for multiple countries | No | Yes | Yes | | [Non-Working Days](https://github.com/gadael/icsdb) | Database of ICS files for non working days | No | Yes | Unknown | | [Non-Working Days](https://isdayoff.ru) | Simple REST API for checking working, non-working or short days for Russia, CIS, USA and other | No | Yes | Yes | | [Russian Calendar](https://github.com/egno/work-calendar) | Check if a date is a Russian holiday or not | No | Yes | No | | [UK Bank Holidays](https://www.gov.uk/bank-holidays.json) | Bank holidays in England and Wales, Scotland and Northern Ireland | No | Yes | Unknown | -| [UnixTime Converter](https://unixtime.co.za) | A REST API to convert UnixTime to DateTime and DateTime to UnixTime | No | Yes | Unknown | **[⬆ Back to Index](#index)** ### Cloud Storage & File Sharing @@ -321,13 +362,17 @@ API | Description | Auth | HTTPS | CORS | | [ddownload](https://ddownload.com/api) | File Sharing and Storage | `apiKey` | Yes | Unknown | | [Dropbox](https://www.dropbox.com/developers) | File Sharing and Storage | `OAuth` | Yes | Unknown | | [File.io](https://www.file.io) | Super simple file sharing, convenient, anonymous and secure | No | Yes | Unknown | +| [Filestack](https://www.filestack.com) | Filestack File Uploader & File Upload API | `apiKey` | Yes | Unknown | | [GoFile](https://gofile.io/api) | Unlimited size file uploads for free | `apiKey` | Yes | Unknown | | [Google Drive](https://developers.google.com/drive/) | File Sharing and Storage | `OAuth` | Yes | Unknown | -| [OneDrive](https://dev.onedrive.com/) | File Sharing and Storage | `OAuth` | Yes | Unknown | +| [Gyazo](https://gyazo.com/api/docs) | Save & Share screen captures instantly | `apiKey` | Yes | Unknown | +| [Imgbb](https://api.imgbb.com/) | Simple and quick private image sharing | `apiKey` | Yes | Unknown | +| [OneDrive](https://developer.microsoft.com/onedrive) | File Sharing and Storage | `OAuth` | Yes | Unknown | | [Pantry](https://getpantry.cloud/) | Free JSON storage for small projects | No | Yes | Yes | | [Pastebin](https://pastebin.com/doc_api) | Plain Text Storage | `apiKey` | Yes | Unknown | | [Pinata](https://docs.pinata.cloud/) | IPFS Pinning Services API | `apiKey` | Yes | Unknown | | [Quip](https://quip.com/dev/automation/documentation) | File Sharing and Storage for groups | `apiKey` | Yes | Yes | +| [Storj](https://docs.storj.io/dcs/) | Decentralized Open-Source Cloud Storage | `apiKey` | Yes | Unknown | | [The Null Pointer](https://0x0.st) | No-bullshit file hosting and URL shortening service | No | Yes | Unknown | | [Web3 Storage](https://web3.storage/) | File Sharing and Storage for Free with 1TB Space | `apiKey` | Yes | Yes | @@ -339,7 +384,7 @@ API | Description | Auth | HTTPS | CORS | | [Bitrise](https://api-docs.bitrise.io/) | Build tool and processes integrations to create efficient development pipelines | `apiKey` | Yes | Unknown | | [Buddy](https://buddy.works/docs/api/getting-started/overview) | The fastest continuous integration and continuous delivery platform | `OAuth` | Yes | Unknown | | [CircleCI](https://circleci.com/docs/api/v1-reference/) | Automate the software development process using continuous integration and continuous delivery | `apiKey` | Yes | Unknown | -| [Codeship](https://apidocs.codeship.com/) | Codeship is a Continuous Integration Platform in the cloud | `apiKey` | Yes | Unknown | +| [Codeship](https://docs.cloudbees.com/docs/cloudbees-codeship/latest/api-overview/) | Codeship is a Continuous Integration Platform in the cloud | `apiKey` | Yes | Unknown | | [Travis CI](https://docs.travis-ci.com/api/) | Sync your GitHub projects with Travis CI to test your code in minutes | `apiKey` | Yes | Unknown | **[⬆ Back to Index](#index)** @@ -347,7 +392,7 @@ API | Description | Auth | HTTPS | CORS | API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [0x](https://0x.org/api) | API for querying token and pool stats across various liquidity pools | No | Yes | Yes | -| [1inch](https://docs.1inch.io/api/) | API for querying decentralize exchange | No | Yes | Unknown | +| [1inch](https://1inch.io/api/) | API for querying decentralize exchange | No | Yes | Unknown | | [Alchemy Ethereum](https://docs.alchemy.com/alchemy/) | Ethereum Node-as-a-Service Provider | `apiKey` | Yes | Yes | | [apilayer coinlayer](https://coinlayer.com) | Real-time Crypto Currency Exchange Rates | `apiKey` | Yes | Unknown | | [Binance](https://github.com/binance/binance-spot-api-docs) | Exchange for Trading Cryptocurrencies based in China | `apiKey` | Yes | Unknown | @@ -356,10 +401,9 @@ API | Description | Auth | HTTPS | CORS | | [BitcoinCharts](https://bitcoincharts.com/about/exchanges/) | Financial and Technical Data related to the Bitcoin Network | No | Yes | Unknown | | [Bitfinex](https://docs.bitfinex.com/docs) | Cryptocurrency Trading Platform | `apiKey` | Yes | Unknown | | [Bitmex](https://www.bitmex.com/app/apiOverview) | Real-Time Cryptocurrency derivatives trading platform based in Hong Kong | `apiKey` | Yes | Unknown | -| [Bittrex](https://bittrex.com/Home/Api) | Next Generation Crypto Trading Platform | `apiKey` | Yes | Unknown | -| [Block](https://www.block.io/docs/basic) | Bitcoin Payment, Wallet & Transaction Data | `apiKey` | Yes | Unknown | +| [Bittrex](https://bittrex.github.io/api/v3) | Next Generation Crypto Trading Platform | `apiKey` | Yes | Unknown | +| [Block](https://block.io/docs/basic) | Bitcoin Payment, Wallet & Transaction Data | `apiKey` | Yes | Unknown | | [Blockchain](https://www.blockchain.com/api) | Bitcoin Payment, Wallet & Transaction Data | `apiKey` | Yes | Unknown | -| [BlockFacts](https://blockfacts.io/) | Real-time crypto data from multiple exchanges via a single unified API, and much more | `apiKey` | Yes | Unknown | | [blockfrost Cardano](https://blockfrost.io/) | Interaction with the Cardano mainnet and several testnets | `apiKey` | Yes | Unknown | | [Brave NewCoin](https://bravenewcoin.com/developers) | Real-time and historic crypto data from more than 200+ exchanges | `apiKey` | Yes | Unknown | | [BtcTurk](https://docs.btcturk.com/) | Real-time cryptocurrency data, graphs and API that allows buy&sell | `apiKey` | Yes | Yes | @@ -379,36 +423,36 @@ API | Description | Auth | HTTPS | CORS | | [CoinRanking](https://developers.coinranking.com/api/documentation) | Live Cryptocurrency data | `apiKey` | Yes | Unknown | | [Coinremitter](https://coinremitter.com/docs) | Cryptocurrencies Payment & Prices | `apiKey` | Yes | Unknown | | [CoinStats](https://documenter.getpostman.com/view/5734027/RzZ6Hzr3?version=latest) | Crypto Tracker | No | Yes | Unknown | -| [CryptAPI](https://cryptapi.io/docs/) | Cryptocurrency Payment Processor | No | Yes | Unknown | +| [CryptAPI](https://docs.cryptapi.io/) | Cryptocurrency Payment Processor | No | Yes | Unknown | | [CryptingUp](https://www.cryptingup.com/apidoc/#introduction) | Cryptocurrency data | No | Yes | Unknown | | [CryptoCompare](https://www.cryptocompare.com/api#) | Cryptocurrencies Comparison | No | Yes | Unknown | -| [CryptoMarket](https://developers.cryptomkt.com) | Cryptocurrencies Trading platform | `apiKey` | Yes | Yes | +| [CryptoMarket](https://api.exchange.cryptomkt.com/) | Cryptocurrencies Trading platform | `apiKey` | Yes | Yes | | [Cryptonator](https://www.cryptonator.com/api/) | Cryptocurrencies Exchange Rates | No | Yes | Unknown | -| [CryptoTradingAPI](https://www.cryptotradingapi.io/) | Crypto Prices & Technical Indicators | `apiKey` | Yes | Unknown | | [dYdX](https://docs.dydx.exchange/) | Decentralized cryptocurrency exchange | `apiKey` | Yes | Unknown | | [Ethplorer](https://github.com/EverexIO/Ethplorer/wiki/Ethplorer-API) | Ethereum tokens, balances, addresses, history of transactions, contracts, and custom structures | `apiKey` | Yes | Unknown | | [EXMO](https://documenter.getpostman.com/view/10287440/SzYXWKPi) | Cryptocurrencies exchange based in UK | `apiKey` | Yes | Unknown | | [FTX](https://docs.ftx.com/) | Complete REST, websocket, and FTX APIs to suit your algorithmic trading needs | `apiKey` | Yes | Yes | | [Gateio](https://www.gate.io/api2) | API provides spot, margin and futures trading operations | `apiKey` | Yes | Unknown | | [Gemini](https://docs.gemini.com/rest-api/) | Cryptocurrencies Exchange | No | Yes | Unknown | +| [Hirak Exchange Rates](https://rates.hirak.site/) | Exchange rates between 162 currency & 300 crypto currency update each 5 min, accurate, no limits | `apiKey` | Yes | Unknown | | [Huobi](https://huobiapi.github.io/docs/spot/v1/en/) | Seychelles based cryptocurrency exchange | `apiKey` | Yes | Unknown | +| [icy.tools](https://developers.icy.tools/) | GraphQL based NFT API | `apiKey` | Yes | Unknown | | [Indodax](https://github.com/btcid/indodax-official-api-docs) | Trade your Bitcoin and other assets with rupiah | `apiKey` | Yes | Unknown | | [INFURA Ethereum](https://infura.io/product/ethereum) | Interaction with the Ethereum mainnet and several testnets | `apiKey` | Yes | Yes | | [Kraken](https://docs.kraken.com/rest/) | Cryptocurrencies Exchange | `apiKey` | Yes | Unknown | | [KuCoin](https://docs.kucoin.com/) | Cryptocurrency Trading Platform | `apiKey` | Yes | Unknown | | [Localbitcoins](https://localbitcoins.com/api-docs/) | P2P platform to buy and sell Bitcoins | No | Yes | Unknown | | [Mempool](https://mempool.space/api) | Bitcoin API Service focusing on the transaction fee | No | Yes | No | -| [MercadoBitcoin](https://www.mercadobitcoin.net/api-doc/) | Brazilian Cryptocurrency Information | No | Yes | Unknown | +| [MercadoBitcoin](https://www.mercadobitcoin.com.br/api-doc/) | Brazilian Cryptocurrency Information | No | Yes | Unknown | | [Messari](https://messari.io/api) | Provides API endpoints for thousands of crypto assets | No | Yes | Unknown | | [Nexchange](https://nexchange2.docs.apiary.io/) | Automated cryptocurrency exchange service | No | No | Yes | | [Nomics](https://nomics.com/docs/) | Historical and realtime cryptocurrency prices and market data | `apiKey` | Yes | Yes | | [NovaDax](https://doc.novadax.com/en-US/#introduction) | NovaDAX API to access all market data, trading management endpoints | `apiKey` | Yes | Unknown | | [OKEx](https://www.okex.com/docs/) | Cryptocurrency exchange based in Seychelles | `apiKey` | Yes | Unknown | -| [Poloniex](https://poloniex.com/support/api/) | US based digital asset exchange | `apiKey` | Yes | Unknown | +| [Poloniex](https://docs.poloniex.com) | US based digital asset exchange | `apiKey` | Yes | Unknown | | [Solana JSON RPC](https://docs.solana.com/developing/clients/jsonrpc-api) | Provides various endpoints to interact with the Solana Blockchain | No | Yes | Unknown | | [Technical Analysis](https://technical-analysis-api.com) | Cryptocurrency prices and technical analysis | `apiKey` | Yes | No | | [VALR](https://docs.valr.com/) | Cryptocurrency Exchange based in South Africa | `apiKey` | Yes | Unknown | -| [Wazirx](https://wazirx.github.io/) | Cryptocurrencies Exchange | `apiKey` | Yes | Unknown | | [WorldCoinIndex](https://www.worldcoinindex.com/apiservice) | Cryptocurrencies Prices | `apiKey` | Yes | Unknown | | [ZMOK](https://zmok.io) | Ethereum JSON RPC API and Web3 provider | No | Yes | Unknown | @@ -438,22 +482,13 @@ API | Description | Auth | HTTPS | CORS | ### Data Validation API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| -| [Abstract Email Validation](https://www.abstractapi.com/email-verification-validation-api) | Validate email addresses for deliverability and spam | `apiKey` | Yes | Yes | -| [apilayer mailboxlayer](https://mailboxlayer.com) | Email address validation | `apiKey` | Yes | Unknown | -| [Cloudmersive Validate](https://cloudmersive.com/validate-api) | Validate email addresses, phone numbers, VAT numbers and domain names | `apiKey` | Yes | Yes | -| [Disify](https://www.disify.com/) | Validate and detect disposable and temporary email addresses | No | Yes | Yes | -| [EVA](https://eva.pingutil.com/) | Validate email addresses | No | Yes | Yes | -| [Kickbox](https://open.kickbox.com/) | Email verification API | No | Yes | Yes | | [Lob.com](https://lob.com/) | US Address Verification | `apiKey` | Yes | Unknown | | [Postman Echo](https://www.postman-echo.com) | Test api server to receive and return value from HTTP method | No | Yes | Unknown | | [PurgoMalum](http://www.purgomalum.com) | Content validator against profanity & obscenity | No | No | Unknown | -| [US Autocomplete](https://smartystreets.com/docs/cloud/us-autocomplete-api) | Enter address data quickly with real-time address suggestions | `apiKey` | Yes | Yes | -| [US Extract](https://smartystreets.com/products/apis/us-extract-api) | Extract postal addresses from any text including emails | `apiKey` | Yes | Yes | -| [US Street Address](https://smartystreets.com/docs/cloud/us-street-api) | Validate and append data for any US postal address | `apiKey` | Yes | Yes | -| [Validator.pizza](https://www.validator.pizza/) | Prevent users to register to websites with a disposable email address | No | Yes | Unknown | +| [US Autocomplete](https://www.smarty.com/docs/cloud/us-autocomplete-pro-api) | Enter address data quickly with real-time address suggestions | `apiKey` | Yes | Yes | +| [US Extract](https://www.smarty.com/products/apis/us-extract-api) | Extract postal addresses from any text including emails | `apiKey` | Yes | Yes | +| [US Street Address](https://www.smarty.com/docs/cloud/us-street-api) | Validate and append data for any US postal address | `apiKey` | Yes | Yes | | [vatlayer](https://vatlayer.com/documentation) | VAT number validation | `apiKey` | Yes | Unknown | -| [Verifier](https://verifier.meetchopra.com/docs#/) | Verifies that a given email is real | `apiKey` | Yes | Yes | -| [Veriphone](https://veriphone.io) | Phone number validation & carrier lookup | `apiKey` | Yes | Yes | **[⬆ Back to Index](#index)** ### Development @@ -489,9 +524,7 @@ API | Description | Auth | HTTPS | CORS | | [DigitalOcean Status](https://status.digitalocean.com/api) | Status of all DigitalOcean services | No | Yes | Unknown | | [Docker Hub](https://docs.docker.com/docker-hub/api/latest/) | Interact with Docker Hub | `apiKey` | Yes | Yes | | [DomainDb Info](https://api.domainsdb.info/) | Domain name search to find all domains containing particular words/phrases/etc | No | Yes | Unknown | -| [Duply](https://duply.co/docs#getting-started-api) | Dynamic Image creation API | `apiKey` | Yes | Yes | | [ExtendsClass JSON Storage](https://extendsclass.com/json-storage.html) | A simple JSON store API | No | Yes | Yes | -| [Form2Channel](https://form2channel.com/) | Send static html form submissions to Google Sheets, Email, Slack or Telegram | No | Yes | Yes | | [GeekFlare](https://apidocs.geekflare.com/docs/geekflare-api) | Provide numerous capabilities for important testing and monitoring methods for websites | `apiKey` | Yes | Unknown | | [Genderize.io](https://genderize.io) | Estimates a gender from a first name | No | Yes | Yes | | [GETPing](https://www.getping.info) | Trigger an email notification with a simple GET request | `apiKey` | Yes | Unknown | @@ -543,17 +576,16 @@ API | Description | Auth | HTTPS | CORS | | [NetworkCalc](https://networkcalc.com/api/docs) | Network calculators, including subnets, DNS, binary, and security tools | No | Yes | Yes | | [npm Registry](https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md) | Query information about your favorite Node.js libraries programatically | No | Yes | Unknown | | [OneSignal](https://documentation.onesignal.com/docs/onesignal-api) | Self-serve customer engagement solution for Push Notifications, Email, SMS & In-App | `apiKey` | Yes | Unknown | -| [OOPSpam](https://oopspam.com/) | Multiple spam filtering service | No | Yes | Yes | | [Open Page Rank](https://www.domcop.com/openpagerank/) | API for calculating and comparing metrics of different websites using Page Rank algorithm | `apiKey` | Yes | Unknown | +| [OpenAPIHub](https://hub.openapihub.com/) | The All-in-one API Platform | `X-Mashape-Key` | Yes | Unknown | | [OpenGraphr](https://opengraphr.com/docs/1.0/overview) | Really simple API to retrieve Open Graph data from an URL | `apiKey` | Yes | Unknown | +| [oyyi](https://oyyi.xyz/docs/1.0) | API for Fake Data, image/video conversion, optimization, pdf optimization and thumbnail generation | No | Yes | Yes | | [PageCDN](https://pagecdn.com/docs/public-api) | Public API for javascript, css and font libraries on PageCDN | `apiKey` | Yes | Yes | -| [Plino](https://plino.herokuapp.com/) | An intelligent spam filtering system | No | Yes | No | -| [Postman](https://docs.api.getpostman.com/) | Tool for testing APIs | `apiKey` | Yes | Unknown | +| [Postman](https://www.postman.com/postman/workspace/postman-public-workspace/documentation/12959542-c8142d51-e97c-46b6-bd77-52bb66712c9a) | Tool for testing APIs | `apiKey` | Yes | Unknown | | [ProxyCrawl](https://proxycrawl.com) | Scraping and crawling anticaptcha service | `apiKey` | Yes | Unknown | -| [Public APIs](https://github.com/davemachado/public-api) | A collective list of free JSON APIs for use in web development | No | Yes | Unknown | +| [ProxyKingdom](https://proxykingdom.com) | Rotating Proxy API that produces a working proxy on every request | `apiKey` | Yes | Yes | | [Pusher Beams](https://pusher.com/beams) | Push notifications for Android & iOS | `apiKey` | Yes | Unknown | -| [QR Code](https://fungenerators.com/api/qrcode/) | Create new QR Code or decode existing one | `apiKey` | Yes | Yes | -| [QR code](http://qrtag.net/api/) | Create an easy to read QR code and URL shortener | No | Yes | Yes | +| [QR code](https://www.qrtag.net/api/) | Create an easy to read QR code and URL shortener | No | Yes | Yes | | [QR code](http://goqr.me/api/) | Generate and decode / read QR code graphics | No | Yes | Unknown | | [Qrcode Monkey](https://www.qrcode-monkey.com/qr-code-api-with-logo/) | Integrate custom and unique looking QR codes into your system or workflow | No | Yes | Unknown | | [QuickChart](https://quickchart.io/) | Generate chart and graph images | No | Yes | Yes | @@ -562,6 +594,7 @@ API | Description | Auth | HTTPS | CORS | | [ReqRes](https://reqres.in/ ) | A hosted REST-API ready to respond to your AJAX requests | No | Yes | Unknown | | [RSS feed to JSON](https://rss-to-json-serverless-api.vercel.app) | Returns RSS feed in JSON format using feed URL | No | Yes | Yes | | [SavePage.io](https://www.savepage.io) | A free, RESTful API used to screenshot any desktop, or mobile website | `apiKey` | Yes | Yes | +| [ScrapeNinja](https://scrapeninja.net) | Scraping API with Chrome fingerprint and residential proxies | `apiKey` | Yes | Unknown | | [ScraperApi](https://www.scraperapi.com) | Easily build scalable web scrapers | `apiKey` | Yes | Unknown | | [scraperBox](https://scraperbox.com/) | Undetectable web scraping API | `apiKey` | Yes | Yes | | [scrapestack](https://scrapestack.com/) | Real-time, Scalable Proxy & Web Scraping REST API | `apiKey` | Yes | Unknown | @@ -570,14 +603,13 @@ API | Description | Auth | HTTPS | CORS | | [ScreenshotAPI.net](https://screenshotapi.net/) | Create pixel-perfect website screenshots | `apiKey` | Yes | Yes | | [Serialif Color](https://color.serialif.com/) | Color conversion, complementary, grayscale and contrasted text | No | Yes | No | | [serpstack](https://serpstack.com/) | Real-Time & Accurate Google Search Results API | `apiKey` | Yes | Yes | -| [Sheetsu](https://docs.sheetsu.com/#welcome) | Easy google sheets integration | `apiKey` | Yes | Unknown | +| [Sheetsu](https://sheetsu.com/) | Easy google sheets integration | `apiKey` | Yes | Unknown | | [SHOUTCLOUD](http://shoutcloud.io/) | ALL-CAPS AS A SERVICE | No | No | Unknown | | [Sonar](https://github.com/Cgboal/SonarSearch) | Project Sonar DNS Enumeration API | No | Yes | Yes | | [SonarQube](https://sonarcloud.io/web_api) | SonarQube REST APIs to detect bugs, code smells & security vulnerabilities | `OAuth` | Yes | Unknown | | [StackExchange](https://api.stackexchange.com/) | Q&A forum for developers | `OAuth` | Yes | Unknown | | [Statically](https://statically.io/) | A free CDN for developers | No | Yes | Yes | | [Supportivekoala](https://developers.supportivekoala.com/) | Autogenerate images with template | `apiKey` | Yes | Yes | -| [Trending-Github](https://docs.trending-github.com) | Discover what is currently trending on github | No | Yes | Yes | | [Tyk](https://tyk.io/open-source/) | Api and service management platform | `apiKey` | Yes | Yes | | [Wandbox](https://github.com/melpon/wandbox/blob/master/kennel2/API.rst) | Code compiler supporting 35+ languages mentioned at wandbox.org | No | Yes | Unknown | | [WebScraping.AI](https://webscraping.ai/) | Web Scraping API with built-in proxies and JS rendering | `apiKey` | Yes | Yes | @@ -598,7 +630,7 @@ API | Description | Auth | HTTPS | CORS | | [OwlBot](https://owlbot.info/) | Definitions with example sentence and photo if available | `apiKey` | Yes | Yes | | [Oxford](https://developer.oxforddictionaries.com/) | Dictionary Data | `apiKey` | Yes | No | | [Synonyms](https://www.synonyms.com/synonyms_api.php) | Synonyms, thesaurus and antonyms information for any given word | `apiKey` | Yes | Unknown | -| [Wiktionary](https://wiktionary.org/w/api.php) | Collaborative dictionary data | No | Yes | Yes | +| [Wiktionary](https://en.wiktionary.org/w/api.php) | Collaborative dictionary data | No | Yes | Yes | | [Wordnik](https://developer.wordnik.com) | Dictionary Data | `apiKey` | Yes | Unknown | | [Words](https://www.wordsapi.com/docs/) | Definitions and synonyms for more than 150,000 words | `apiKey` | Yes | Unknown | @@ -630,6 +662,7 @@ API | Description | Auth | HTTPS | CORS | | [PrexView](https://prexview.com) | Data from XML or JSON to PDF, HTML or Image | `apiKey` | Yes | Unknown | | [Restpack](https://restpack.io/) | Provides screenshot, HTML to PDF and content extraction APIs | `apiKey` | Yes | Unknown | | [Todoist](https://developer.todoist.com) | Todo Lists | `OAuth` | Yes | Unknown | +| [Smart Image Enhancement API](https://apilayer.com/marketplace/image_enhancement-api) | Performs image upscaling by adding detail to images through multiple super-resolution algorithms | `apiKey` | Yes | Unknown | | [Vector Express v2.0](https://vector.express) | Free vector file converting API | No | Yes | No | | [WakaTime](https://wakatime.com/developers) | Automated time tracking leaderboards for programmers | No | Yes | Unknown | | [Zube](https://zube.io/docs/api) | Full stack project management | `OAuth` | Yes | Unknown | @@ -638,34 +671,51 @@ API | Description | Auth | HTTPS | CORS | ### Email API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| +| [Abstract Email Validation](https://www.abstractapi.com/email-verification-validation-api) | Validate email addresses for deliverability and spam | `apiKey` | Yes | Yes | +| [apilayer mailboxlayer](https://mailboxlayer.com) | Email address validation | `apiKey` | Yes | Unknown | +| [Cloudmersive Validate](https://cloudmersive.com/validate-api) | Validate email addresses, phone numbers, VAT numbers and domain names | `apiKey` | Yes | Yes | +| [Disify](https://www.disify.com/) | Validate and detect disposable and temporary email addresses | No | Yes | Yes | +| [DropMail](https://dropmail.me/api/#live-demo) | GraphQL API for creating and managing ephemeral e-mail inboxes | No | Yes | Unknown | +| [EVA](https://eva.pingutil.com/) | Validate email addresses | No | Yes | Yes | | [Guerrilla Mail](https://www.guerrillamail.com/GuerrillaMailAPI.html) | Disposable temporary Email addresses | No | Yes | Unknown | +| [ImprovMX](https://improvmx.com/api) | API for free email forwarding service | `apiKey` | Yes | Unknown | +| [Kickbox](https://open.kickbox.com/) | Email verification API | No | Yes | Yes | +| [mail.gw](https://docs.mail.gw) | 10 Minute Mail | No | Yes | Yes | +| [mail.tm](https://docs.mail.tm) | Temporary Email Service | No | Yes | Yes | +| [MailboxValidator](https://www.mailboxvalidator.com/api-email-free) | Validate email address to improve deliverability | `apiKey` | Yes | Unknown | +| [MailCheck.ai](https://www.mailcheck.ai/#documentation) | Prevent users to sign up with temporary email addresses | No | Yes | Unknown | | [Mailtrap](https://mailtrap.docs.apiary.io/#) | A service for the safe testing of emails sent from the development and staging environments | `apiKey` | Yes | Unknown | -| [Sendgrid](https://sendgrid.com/docs/api-reference/) | A cloud-based SMTP provider that allows you to send emails without having to maintain email servers | `apiKey` | Yes | Unknown | +| [Sendgrid](https://docs.sendgrid.com/api-reference/) | A cloud-based SMTP provider that allows you to send emails without having to maintain email servers | `apiKey` | Yes | Unknown | | [Sendinblue](https://developers.sendinblue.com/docs) | A service that provides solutions relating to marketing and/or transactional email and/or SMS | `apiKey` | Yes | Unknown | +| [Verifier](https://verifier.meetchopra.com/docs#/) | Verifies that a given email is real | `apiKey` | Yes | Yes | **[⬆ Back to Index](#index)** ### Entertainment API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [chucknorris.io](https://api.chucknorris.io) | JSON API for hand curated Chuck Norris jokes | No | Yes | Unknown | +| [Corporate Buzz Words](https://github.com/sameerkumar18/corporate-bs-generator-api) | REST API for Corporate Buzz Words | No | Yes | Yes | +| [Excuser](https://excuser.herokuapp.com/) | Get random excuses for various situations | No | Yes | Unknown | +| [Fun Fact](https://api.aakhilv.me) | A simple HTTPS api that can randomly select and return a fact from the FFA database | No | Yes | Yes | | [Imgflip](https://imgflip.com/api) | Gets an array of popular memes | No | Yes | Unknown | | [Meme Maker](https://mememaker.github.io/API/) | REST API for create your own meme | No | Yes | Unknown | | [NaMoMemes](https://github.com/theIYD/NaMoMemes) | Memes on Narendra Modi | No | Yes | Unknown | | [Random Useless Facts](https://uselessfacts.jsph.pl/) | Get useless, but true facts | No | Yes | Unknown | +| [Techy](https://techy-api.vercel.app/) | JSON and Plaintext API for tech-savvy sounding phrases | No | Yes | Unknown | | [Yo Momma Jokes](https://github.com/beanboi7/yomomma-apiv2) | REST API for Yo Momma Jokes | No | Yes | Unknown | **[⬆ Back to Index](#index)** ### Environment API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| -| [AirVisual](https://airvisual.com/api) | Air quality and weather data | `apiKey` | Yes | Unknown | | [BreezoMeter Pollen](https://docs.breezometer.com/api-documentation/pollen-api/v2/) | Daily Forecast pollen conditions data for a specific location | `apiKey` | Yes | Unknown | | [Carbon Interface](https://docs.carboninterface.com/) | API to calculate carbon (C02) emissions estimates for common C02 emitting activities | `apiKey` | Yes | Yes | +| [Climatiq](https://docs.climatiq.io) | Calculate the environmental footprint created by a broad range of emission-generating activities | `apiKey` | Yes | Yes | | [Cloverly](https://www.cloverly.com/carbon-offset-documentation) | API calculates the impact of common carbon-intensive activities in real time | `apiKey` | Yes | Unknown | | [CO2 Offset](https://co2offset.io/api.html) | API calculates and validates the carbon footprint | No | Yes | Unknown | | [Danish data service Energi](https://www.energidataservice.dk/) | Open energy data from Energinet to society | No | Yes | Unknown | -| [GrünstromIndex](https://www.corrently.de/hintergrund/gruenstromindex/index.html) | Green Power Index for Germany (Grünstromindex/GSI) | No | No | Yes | -| [La Data Verte](https://ladataverte.fr) | Aggregation of multiple environmental indicators (CO2 emissions, Average temperature, etc) | No | Yes | Unknown | +| [GrünstromIndex](https://gruenstromindex.de/) | Green Power Index for Germany (Grünstromindex/GSI) | No | No | Yes | +| [IQAir](https://www.iqair.com/air-pollution-data-api) | Air quality and weather data | `apiKey` | Yes | Unknown | | [Luchtmeetnet](https://api-docs.luchtmeetnet.nl/) | Predicted and actual air quality components for The Netherlands (RIVM) | No | Yes | Unknown | | [National Grid ESO](https://data.nationalgrideso.com/) | Open data from Great Britain’s Electricity System Operator | No | Yes | Unknown | | [OpenAQ](https://docs.openaq.org/) | Open air quality data | `apiKey` | Yes | Unknown | @@ -674,13 +724,13 @@ API | Description | Auth | HTTPS | CORS | | [PVWatts](https://developer.nrel.gov/docs/solar/pvwatts/v6/) | Energy production photovoltaic (PV) energy systems | `apiKey` | Yes | Unknown | | [Srp Energy](https://srpenergy-api-client-python.readthedocs.io/en/latest/api.html) | Hourly usage energy report for Srp customers | `apiKey` | Yes | No | | [UK Carbon Intensity](https://carbon-intensity.github.io/api-definitions/#carbon-intensity-api-v1-0-0) | The Official Carbon Intensity API for Great Britain developed by National Grid | No | Yes | Unknown | +| [Website Carbon](https://api.websitecarbon.com/) | API to estimate the carbon footprint of loading web pages | No | Yes | Unknown | **[⬆ Back to Index](#index)** ### Events API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| -| [Eventbrite](https://www.eventbrite.com/developer/v3/) | Find events | `OAuth` | Yes | Unknown | -| [Picatic](http://developer.picatic.com/?utm_medium=web&utm_source=github&utm_campaign=public-apis%20repo&utm_content=toddmotto) | Sell tickets anywhere | `apiKey` | Yes | Unknown | +| [Eventbrite](https://www.eventbrite.com/platform/api/) | Find events | `OAuth` | Yes | Unknown | | [SeatGeek](https://platform.seatgeek.com/) | Search events, venues and performers | `apiKey` | Yes | Unknown | | [Ticketmaster](http://developer.ticketmaster.com/products-and-docs/apis/getting-started/) | Search events, attractions, or venues | `apiKey` | Yes | Unknown | @@ -694,6 +744,7 @@ API | Description | Auth | HTTPS | CORS | | [Alpha Vantage](https://www.alphavantage.co/) | Realtime and historical stock data | `apiKey` | Yes | Unknown | | [apilayer marketstack](https://marketstack.com/) | Real-Time, Intraday & Historical Market Data API | `apiKey` | Yes | Unknown | | [Banco do Brasil](https://developers.bb.com.br/home) | All Banco do Brasil financial transaction APIs | `OAuth` | Yes | Yes | +| [Bank Data API](https://apilayer.com/marketplace/bank_data-api) | Instant IBAN and SWIFT number validation across the globe | `apiKey` | Yes | Unknown | | [Billplz](https://www.billplz.com/api) | Payment platform | `apiKey` | Yes | Unknown | | [Binlist](https://binlist.net/) | Public access to a database of IIN/BIN information | No | Yes | Unknown | | [Boleto.Cloud](https://boleto.cloud/) | A api to generate boletos in Brazil | `apiKey` | Yes | Unknown | @@ -701,7 +752,7 @@ API | Description | Auth | HTTPS | CORS | | [Econdb](https://www.econdb.com/api/) | Global macroeconomic data | No | Yes | Yes | | [Fed Treasury](https://fiscaldata.treasury.gov/api-documentation/) | U.S. Department of the Treasury Data | No | Yes | Unknown | | [Finage](https://finage.co.uk) | Finage is a stock, currency, cryptocurrency, indices, and ETFs real-time & historical data provider | `apiKey` | Yes | Unknown | -| [Financial Modeling Prep](https://financialmodelingprep.com/developer/docs/) | Realtime and historical stock data | `apiKey` | Yes | Unknown | +| [Financial Modeling Prep](https://site.financialmodelingprep.com/developer/docs) | Realtime and historical stock data | `apiKey` | Yes | Unknown | | [Finnhub](https://finnhub.io/docs/api) | Real-Time RESTful APIs and Websocket for Stocks, Currencies, and Crypto | `apiKey` | Yes | Unknown | | [FRED](https://fred.stlouisfed.org/docs/api/fred/) | Economic data from the Federal Reserve Bank of St. Louis | `apiKey` | Yes | Yes | | [Front Accounting APIs](https://frontaccounting.com/fawiki/index.php?n=Devel.SimpleAPIModule) | Front accounting is multilingual and multicurrency software for small businesses | `OAuth` | Yes | Yes | @@ -711,7 +762,6 @@ API | Description | Auth | HTTPS | CORS | | [Indian Mutual Fund](https://www.mfapi.in/) | Get complete history of India Mutual Funds Data | No | Yes | Unknown | | [Intrinio](https://intrinio.com/) | A wide selection of financial data feeds | `apiKey` | Yes | Unknown | | [Klarna](https://docs.klarna.com/klarna-payments/api/payments-api/) | Klarna payment and shopping service | `apiKey` | Yes | Unknown | -| [Live precious metal prices](https://notnullsolutions.com/live-metal-prices-api/live-precious-metal-prices-api-documentation) | Live prices for all precious metals like Gold | `apiKey` | Yes | Unknown | | [MercadoPago](https://www.mercadopago.com.br/developers/es/reference) | Mercado Pago API reference - all the information you need to develop your integrations | `apiKey` | Yes | Unknown | | [Mono](https://mono.co/) | Connect with users’ bank accounts and access transaction data in Africa | `apiKey` | Yes | Unknown | | [Moov](https://docs.moov.io/api/) | The Moov API makes it simple for platforms to send, receive, and store money | `apiKey` | Yes | Unknown | @@ -719,12 +769,14 @@ API | Description | Auth | HTTPS | CORS | | [OpenFIGI](https://www.openfigi.com/api) | Equity, index, futures, options symbology from Bloomberg LP | `apiKey` | Yes | Yes | | [Plaid](https://plaid.com/) | Connect with user's bank accounts and access transaction data | `apiKey` | Yes | Unknown | | [Polygon](https://polygon.io/) | Historical stock market data | `apiKey` | Yes | Unknown | +| [Portfolio Optimizer](https://portfoliooptimizer.io/) | Portfolio analysis and optimization | No | Yes | Yes | | [Razorpay IFSC](https://razorpay.com/docs/) | Indian Financial Systems Code (Bank Branch Codes) | No | Yes | Unknown | | [Real Time Finance](https://github.com/Real-time-finance/finance-websocket-API/) | Websocket API to access realtime stock data | `apiKey` | No | Unknown | | [SEC EDGAR Data](https://www.sec.gov/edgar/sec-api-documentation) | API to access annual reports of public US companies | No | Yes | Yes | | [SmartAPI](https://smartapi.angelbroking.com/) | Gain access to set of and create end-to-end broking services | `apiKey` | Yes | Unknown | | [StockData](https://www.StockData.org) | Real-Time, Intraday & Historical Market Data, News and Sentiment API | `apiKey` | Yes | Yes | | [Styvio](https://www.Styvio.com) | Realtime and historical stock data and current stock sentiment | `apiKey` | Yes | Unknown | +| [Tax Data API](https://apilayer.com/marketplace/tax_data-api) | Instant VAT number and tax validation across the globe | `apiKey` | Yes | Unkown | | [Tradier](https://developer.tradier.com) | US equity/option market data (delayed, intraday, historical) | `OAuth` | Yes | Yes | | [Twelve Data](https://twelvedata.com/) | Stock market data (real-time & historical) | `apiKey` | Yes | Unknown | | [WallstreetBets](https://dashboard.nbshare.io/apps/reddit/api/) | WallstreetBets Stock Comments Sentiment Analysis | No | Yes | Unknown | @@ -800,9 +852,11 @@ API | Description | Auth | HTTPS | CORS | | [Fun Facts](https://asli-fun-fact-api.herokuapp.com/) | Random Fun Facts | No | Yes | Yes | | [FunTranslations](https://api.funtranslations.com/) | Translate Text into funny languages | No | Yes | Yes | | [GamerPower](https://www.gamerpower.com/api-read) | Game Giveaways Tracker | No | Yes | Yes | +| [GDBrowser](https://gdbrowser.com/api) | Easy way to use the Geometry Dash Servers | No | Yes | Unknown | | [Geek-Jokes](https://github.com/sameerkumar18/geek-joke-api) | Fetch a random geeky/programming related joke for use in all sorts of applications | No | Yes | Yes | | [Genshin Impact](https://genshin.dev) | Genshin Impact game data | No | Yes | Yes | | [Giant Bomb](https://www.giantbomb.com/api/documentation) | Video Games | `apiKey` | Yes | Unknown | +| [GraphQL Pokemon](https://github.com/favware/graphql-pokemon) | GraphQL powered Pokemon API. Supports generations 1 through 8 | No | Yes | Yes | | [Guild Wars 2](https://wiki.guildwars2.com/wiki/API:Main) | Guild Wars 2 Game Information | `apiKey` | Yes | Unknown | | [GW2Spidy](https://github.com/rubensayshi/gw2spidy/wiki) | GW2Spidy API, Items data on the Guild Wars 2 Trade Market | No | Yes | Unknown | | [Halo](https://developer.haloapi.com/) | Halo 5 and Halo Wars 2 Information | `apiKey` | Yes | Unknown | @@ -812,7 +866,7 @@ API | Description | Auth | HTTPS | CORS | | [Hypixel](https://api.hypixel.net/) | Hypixel player stats | `apiKey` | Yes | Unknown | | [Hyrule Compendium](https://github.com/gadhagod/Hyrule-Compendium-API) | Data on all interactive items from The Legend of Zelda: BOTW | No | Yes | Unknown | | [Hytale](https://hytale-api.com/) | Hytale blog posts and jobs | No | Yes | Unknown | -| [IGDB.com](https://api.igdb.com/) | Video Game Database | `apiKey` | Yes | Unknown | +| [IGDB.com](https://api-docs.igdb.com) | Video Game Database | `apiKey` | Yes | Unknown | | [JokeAPI](https://sv443.net/jokeapi/v2/) | Programming, Miscellaneous and Dark Jokes | No | Yes | Yes | | [Jokes One](https://jokes.one/api/joke/) | Joke of the day and large category of jokes accessible via REST API | `apiKey` | Yes | Yes | | [Jservice](http://jservice.io) | Jeopardy Question Database | No | No | Unknown | @@ -820,6 +874,7 @@ API | Description | Auth | HTTPS | CORS | | [Magic The Gathering](http://magicthegathering.io/) | Magic The Gathering Game Information | No | No | Unknown | | [Mario Kart Tour](https://mario-kart-tour-api.herokuapp.com/) | API for Drivers, Karts, Gliders and Courses | `OAuth` | Yes | Unknown | | [Marvel](https://developer.marvel.com) | Marvel Comics | `apiKey` | Yes | Unknown | +| [Minecraft Server Status](https://api.mcsrvstat.us) | API to get Information about a Minecraft Server | No | Yes | No | | [MMO Games](https://www.mmobomb.com/api) | MMO Games Database, News and Giveaways | No | Yes | No | | [mod.io](https://docs.mod.io) | Cross Platform Mod API | `apiKey` | Yes | Unknown | | [Mojang](https://wiki.vg/Mojang_API) | Mojang / Minecraft API | `apiKey` | Yes | Unknown | @@ -836,14 +891,13 @@ API | Description | Auth | HTTPS | CORS | | [Puyo Nexus](https://github.com/deltadex7/puyodb-api-deno) | Puyo Puyo information from Puyo Nexus Wiki | No | Yes | Yes | | [quizapi.io](https://quizapi.io/) | Access to various kind of quiz questions | `apiKey` | Yes | Yes | | [Raider](https://raider.io/api) | Provides detailed character and guild rankings for Raiding and Mythic+ content in World of Warcraft | No | Yes | Unknown | -| [Random Facts](https://fungenerators.com/api/facts/) | Random Facts from hundreds of categories | `apiKey` | Yes | Yes | | [RAWG.io](https://rawg.io/apidocs) | 500,000+ games for 50 platforms including mobiles | `apiKey` | Yes | Unknown | | [Rick and Morty](https://rickandmortyapi.com) | All the Rick and Morty information, including images | No | Yes | Yes | | [Riot Games](https://developer.riotgames.com/) | League of Legends Game Information | `apiKey` | Yes | Unknown | +| [RPS 101](https://rps101.pythonanywhere.com/api) | Rock, Paper, Scissors with 101 objects | No | Yes | Yes | | [RuneScape](https://runescape.wiki/w/Application_programming_interface) | RuneScape and OSRS RPGs information | No | Yes | No | | [Sakura CardCaptor](https://github.com/JessVel/sakura-card-captor-api) | Sakura CardCaptor Cards Information | No | Yes | Unknown | | [Scryfall](https://scryfall.com/docs/api) | Magic: The Gathering database | No | Yes | Yes | -| [SLF](https://github.com/slftool/slftool.github.io/blob/master/API.md) | German city, country, river, database | No | Yes | Yes | | [SpaceTradersAPI](https://spacetraders.io?rel=pub-apis) | A playable inter-galactic space trading MMOAPI | `OAuth` | Yes | Yes | | [Steam](https://steamapi.xpaw.me/) | Steam Web API documentation | `apiKey` | Yes | No | | [Steam](https://github.com/Revadike/InternalSteamWebAPI/wiki) | Internal Steam Web API documentation | No | Yes | No | @@ -854,8 +908,9 @@ API | Description | Auth | HTTPS | CORS | | [Tronald Dump](https://www.tronalddump.io/) | The dumbest things Donald Trump has ever said | No | Yes | Unknown | | [Universalis](https://universalis.app/docs/index.html) | Final Fantasy XIV market board data | No | Yes | Yes | | [Valorant (non-official)](https://valorant-api.com) | An extensive API containing data of most Valorant in-game items, assets and more | No | Yes | Unknown | +| [Warface (non-official)](https://api.wfstats.cf) | Official API proxy with better data structure and more features | No | Yes | No | | [Wargaming.net](https://developers.wargaming.net/) | Wargaming.net info and stats | `apiKey` | Yes | No | -| [When is next MCU film](https://github.com/DiljotSG/MCU-Countdown/blob/develop/docs/API.md) | Upcomimg MCU film information | No | Yes | Unknown | +| [When is next MCU film](https://github.com/DiljotSG/MCU-Countdown/blob/develop/docs/API.md) | Upcoming MCU film information | No | Yes | Unknown | | [xkcd](https://xkcd.com/json.html) | Retrieve xkcd comics as JSON | No | Yes | No | | [Yu-Gi-Oh!](https://db.ygoprodeck.com/api-guide/) | Yu-Gi-Oh! TCG Information | No | Yes | Unknown | @@ -868,6 +923,7 @@ API | Description | Auth | HTTPS | CORS | | [administrative-divisons-db](https://github.com/kamikazechaser/administrative-divisions-db) | Get all administrative divisions of a country | No | Yes | Yes | | [adresse.data.gouv.fr](https://adresse.data.gouv.fr) | Address database of France, geocoding and reverse | No | Yes | Unknown | | [Airtel IP](https://sys.airtel.lv/ip2country/1.1.1.1/?full=true) | IP Geolocation API. Collecting data from multiple sources | No | Yes | Unknown | +| [Apiip](https://apiip.net/) | Get location information by IP address | `apiKey` | Yes | Yes | | [apilayer ipstack](https://ipstack.com/) | Locate and identify website visitors by IP address | `apiKey` | Yes | Unknown | | [Battuta](http://battuta.medunes.net) | A (country/region/city) in-cascade location API | `apiKey` | No | Unknown | | [BigDataCloud](https://www.bigdatacloud.com/ip-geolocation-apis) | Provides fast and accurate IP geolocation APIs along with security checks and confidence area | `apiKey` | Yes | Unknown | @@ -888,20 +944,21 @@ API | Description | Auth | HTTPS | CORS | | [Geodata.gov.gr](https://geodata.gov.gr/en/) | Open geospatial data and API service for Greece | No | Yes | Unknown | | [GeoDataSource](https://www.geodatasource.com/web-service) | Geocoding of city name by using latitude and longitude coordinates | `apiKey` | Yes | Unknown | | [GeoDB Cities](http://geodb-cities-api.wirefreethought.com/) | Get global city, region, and country data | `apiKey` | Yes | Unknown | -| [GeoJS](https://geojs.io/) | IP geolocation with ChatOps integration | No | Yes | Yes | +| [GeographQL](https://geographql.netlify.app) | A Country, State, and City GraphQL API | No | Yes | Yes | +| [GeoJS](https://www.geojs.io/) | IP geolocation with ChatOps integration | No | Yes | Yes | | [Geokeo](https://geokeo.com) | Geokeo geocoding service- with 2500 free api requests daily | No | Yes | Yes | | [GeoNames](http://www.geonames.org/export/web-services.html) | Place names and other geographical data | No | No | Unknown | | [geoPlugin](https://www.geoplugin.com) | IP geolocation and currency conversion | No | Yes | Yes | | [Google Earth Engine](https://developers.google.com/earth-engine/) | A cloud-based platform for planetary-scale environmental data analysis | `apiKey` | Yes | Unknown | | [Google Maps](https://developers.google.com/maps/) | Create/customize digital maps based on Google Maps data | `apiKey` | Yes | Unknown | | [Graph Countries](https://github.com/lennertVanSever/graphcountries) | Country-related data like currencies, languages, flags, regions+subregions and bordering countries | No | Yes | Unknown | -| [HelloSalut](https://www.fourtonfish.com/hellosalut/hello/) | Get hello translation following user language | No | Yes | Unknown | +| [HelloSalut](https://fourtonfish.com/project/hellosalut-api/) | Get hello translation following user language | No | Yes | Unknown | | [HERE Maps](https://developer.here.com) | Create/customize digital maps based on HERE Maps data | `apiKey` | Yes | Unknown | +| [Hirak IP to Country](https://iplocation.hirak.site/) | Ip to location with country code, currency code & currency name, fast response, unlimited requests | `apiKey` | Yes | Unknown | | [Hong Kong GeoData Store](https://geodata.gov.hk/gs/) | API for accessing geo-data of Hong Kong | No | Yes | Unknown | | [IBGE](https://servicodados.ibge.gov.br/api/docs/) | Aggregate services of IBGE (Brazilian Institute of Geography and Statistics) | No | Yes | Unknown | | [IP 2 Country](https://ip2country.info) | Map an IP to a country | No | Yes | Unknown | | [IP Address Details](https://ipinfo.io/) | Find geolocation with ip address | No | Yes | Unknown | -| [IP Sidekick](https://ipsidekick.com) | Geolocation API that returns extra information about an IP address | `apiKey` | Yes | Unknown | | [IP Vigilante](https://www.ipvigilante.com/) | Free IP Geolocation API | No | Yes | Unknown | | [ip-api](https://ip-api.com/docs) | Find location with IP address or domain | No | No | Unknown | | [IP2Location](https://www.ip2location.com/web-service/ip2location) | IP geolocation web service to get more than 55 parameters | `apiKey` | Yes | Unknown | @@ -910,16 +967,16 @@ API | Description | Auth | HTTPS | CORS | | [ipapi.com](https://ipapi.com/) | Real-time Geolocation & Reverse IP Lookup REST API | `apiKey` | Yes | Unknown | | [IPGEO](https://api.techniknews.net/ipgeo/) | Unlimited free IP Address API with useful information | No | Yes | Unknown | | [ipgeolocation](https://ipgeolocation.io/) | IP Geolocation AP with free plan 30k requests per month | `apiKey` | Yes | Yes | -| [IPInfoDB](https://ipinfodb.com/api) | Free Geolocation tools and APIs for country, region, city and time zone lookup by IP address | `apiKey` | Yes | Unknown | +| [IPInfoDB](https://www.ipinfodb.com/api) | Free Geolocation tools and APIs for country, region, city and time zone lookup by IP address | `apiKey` | Yes | Unknown | | [Kakao Maps](https://apis.map.kakao.com) | Kakao Maps provide multiple APIs for Korean maps | `apiKey` | Yes | Unknown | | [keycdn IP Location Finder](https://tools.keycdn.com/geo) | Get the IP geolocation data through the simple REST API. All the responses are JSON encoded | `apiKey` | Yes | Unknown | | [LocationIQ](https://locationiq.org/docs/) | Provides forward/reverse geocoding and batch geocoding | `apiKey` | Yes | Yes | | [Longdo Map](https://map.longdo.com/docs/) | Interactive map with detailed places and information portal in Thailand | `apiKey` | Yes | Yes | -| [Mapbox](https://www.mapbox.com/developers/) | Create/customize beautiful digital maps | `apiKey` | Yes | Unknown | +| [Mapbox](https://docs.mapbox.com/) | Create/customize beautiful digital maps | `apiKey` | Yes | Unknown | | [MapQuest](https://developer.mapquest.com/) | To access tools and resources to map the world | `apiKey` | Yes | No | Yes | [Mexico](https://github.com/IcaliaLabs/sepomex) | Mexico RESTful zip codes API | No | Yes | Unknown | | [Nominatim](https://nominatim.org/release-docs/latest/api/Overview/) | Provides worldwide forward / reverse geocoding | No | Yes | Yes | -| [One Map, Singapore](https://docs.onemap.sg/) | Singapore Land Authority REST API services for Singapore addresses | `apiKey` | Yes | Unknown | +| [One Map, Singapore](https://www.onemap.gov.sg/docs/) | Singapore Land Authority REST API services for Singapore addresses | `apiKey` | Yes | Unknown | | [OnWater](https://onwater.io/) | Determine if a lat/lon is on water or land | No | Yes | Unknown | | [Open Topo Data](https://www.opentopodata.org) | Elevation and ocean depth for a latitude and longitude | No | Yes | No | | [OpenCage](https://opencagedata.com) | Forward and reverse geocoding using open data | `apiKey` | Yes | Yes | @@ -927,20 +984,22 @@ API | Description | Auth | HTTPS | CORS | | [OpenStreetMap](http://wiki.openstreetmap.org/wiki/API) | Navigation, geolocation and geographical data | `OAuth` | No | Unknown | | [Pinball Map](https://pinballmap.com/api/v1/docs) | A crowdsourced map of public pinball machines | No | Yes | Yes | | [positionstack](https://positionstack.com/) | Forward & Reverse Batch Geocoding REST API | `apiKey` | Yes | Unknown | +| [Postali](https://postali.app/api) | Mexico Zip Codes API | No | Yes | Yes | | [PostcodeData.nl](http://api.postcodedata.nl/v1/postcode/?postcode=1211EP&streetnumber=60&ref=domeinnaam.nl&type=json) | Provide geolocation data based on postcode for Dutch addresses | No | No | Unknown | | [Postcodes.io](https://postcodes.io) | Postcode lookup & Geolocation for the UK | No | Yes | Yes | -| [Queimadas INPE](https://queimadas.dgi.inpe.br/queimadas/dados-abertos) | Access to heat focus data (probable wildfire) | No | Yes | Unknown | +| [Queimadas INPE](https://queimadas.dgi.inpe.br/queimadas/dados-abertos/) | Access to heat focus data (probable wildfire) | No | Yes | Unknown | | [REST Countries](https://restcountries.com) | Get information about countries via a RESTful API | No | Yes | Yes | | [RoadGoat Cities](https://www.roadgoat.com/business/cities-api) | Cities content & photos API | `apiKey` | Yes | No | | [Rwanda Locations](https://rapidapi.com/victorkarangwa4/api/rwanda) | Rwanda Provences, Districts, Cities, Capital City, Sector, cells, villages and streets | No | Yes | Unknown | -| [SpotSense](https://www.spotsense.io) | Add location based interactions to your mobile app | `apiKey` | Yes | Unknown | +| [SLF](https://github.com/slftool/slftool.github.io/blob/master/API.md) | German city, country, river, database | No | Yes | Yes | +| [SpotSense](https://spotsense.io/) | Add location based interactions to your mobile app | `apiKey` | Yes | Unknown | | [Telize](https://rapidapi.com/fcambus/api/telize/) | Telize offers location information from any IP address | `apiKey` | Yes | Yes | | [TomTom](https://developer.tomtom.com/) | Maps, Directions, Places and Traffic APIs | `apiKey` | Yes | Yes | | [Uebermaps](https://uebermaps.com/api/v2) | Discover and share maps with friends | `apiKey` | Yes | Unknown | -| [US ZipCode](https://smartystreets.com/docs/cloud/us-zipcode-api) | Validate and append data for any US ZipCode | `apiKey` | Yes | Yes | +| [US ZipCode](https://www.smarty.com/docs/cloud/us-zipcode-api) | Validate and append data for any US ZipCode | `apiKey` | Yes | Yes | | [Utah AGRC](https://api.mapserv.utah.gov) | Utah Web API for geocoding Utah addresses | `apiKey` | Yes | Unknown | | [ViaCep](https://viacep.com.br) | Brazil RESTful zip codes API | No | Yes | Unknown | -| [What3Words](https://w3w.co) | Three words as rememberable and unique coordinates worldwide | `apiKey` | Yes | Unknown | +| [What3Words](https://what3words.com) | Three words as rememberable and unique coordinates worldwide | `apiKey` | Yes | Unknown | | [Yandex.Maps Geocoder](https://yandex.com/dev/maps/geocoder) | Use geocoding to get an object's coordinates from its address | `apiKey` | Yes | Unknown | | [ZipCodeAPI](https://www.zipcodeapi.com) | US zip code distance, radius and location API | `apiKey` | Yes | Unknown | | [Zippopotam.us](http://www.zippopotam.us) | Get information about place such as country, city, state, etc | No | No | Unknown | @@ -950,25 +1009,22 @@ API | Description | Auth | HTTPS | CORS | ### Government API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| -| [Bank Negara Malaysia Open Data](https://api.bnm.gov.my/) | Malaysia Central Bank Open Data | No | Yes | Unknown | -| [BCLaws](http://www.bclaws.ca/civix/template/complete/api/index.html) | Access to the laws of British Columbia | No | No | Unknown | +| [Bank Negara Malaysia Open Data](https://apikijangportal.bnm.gov.my/) | Malaysia Central Bank Open Data | No | Yes | Unknown | +| [BCLaws](https://www.bclaws.gov.bc.ca/civix/template/complete/api/index.html) | Access to the laws of British Columbia | No | No | Unknown | | [Brazil](https://brasilapi.com.br/) | Community driven API for Brazil Public Data | No | Yes | Yes | | [Brazil Central Bank Open Data](https://dadosabertos.bcb.gov.br/) | Brazil Central Bank Open Data | No | Yes | Unknown | | [Brazil Receita WS](https://www.receitaws.com.br/) | Consult companies by CNPJ for Brazilian companies | No | Yes | Unknown | | [Brazilian Chamber of Deputies Open Data](https://dadosabertos.camara.leg.br/swagger/api.html) | Provides legislative information in Apis XML and JSON, as well as files in various formats | No | Yes | No | -| [BusinessUSA](https://business.usa.gov/developer) | Authoritative information on U.S. programs, events, services and more | `apiKey` | Yes | Unknown | | [Census.gov](https://www.census.gov/data/developers/data-sets.html) | The US Census Bureau provides various APIs and data sets on demographics and businesses | No | Yes | Unknown | | [City, Berlin](https://daten.berlin.de/) | Berlin(DE) City Open Data | No | Yes | Unknown | | [City, Gdańsk](https://ckan.multimediagdansk.pl/en) | Gdańsk (PL) City Open Data | No | Yes | Unknown | | [City, Gdynia](http://otwartedane.gdynia.pl/en/api_doc.html) | Gdynia (PL) City Open Data | No | No | Unknown | | [City, Helsinki](https://hri.fi/en_gb/) | Helsinki(FI) City Open Data | No | Yes | Unknown | -| [City, Kyiv](https://data.kyivcity.gov.ua/) | Kyiv(UA) City Open Data | No | Yes | Unknown | | [City, Lviv](https://opendata.city-adm.lviv.ua/) | Lviv(UA) City Open Data | No | Yes | Unknown | | [City, Nantes Open Data](https://data.nantesmetropole.fr/pages/home/) | Nantes(FR) City Open Data | `apiKey` | Yes | Unknown | | [City, New York Open Data](https://opendata.cityofnewyork.us/) | New York (US) City Open Data | No | Yes | Unknown | | [City, Prague Open Data](http://opendata.praha.eu/en) | Prague(CZ) City Open Data | No | No | Unknown | | [City, Toronto Open Data](https://open.toronto.ca/) | Toronto (CA) City Open Data | No | Yes | Yes | -| [City, Warsaw Open Data](https://api.um.warszawa.pl/) | Warsaw (PL) City Open Data | `apiKey` | Yes | Unknown | | [Code.gov](https://code.gov) | The primary platform for Open Source and code sharing for the U.S. Federal Government | `apiKey` | Yes | Unknown | | [Colorado Information Marketplace](https://data.colorado.gov/) | Colorado State Government Open Data | No | Yes | Unknown | | [Data USA](https://datausa.io/about/api/) | US Public Data | No | Yes | Unknown | @@ -986,15 +1042,14 @@ API | Description | Auth | HTTPS | CORS | | [INEI](http://iinei.inei.gob.pe/microdatos/) | Peruvian Statistical Government Open Data | No | No | Unknown | | [Interpol Red Notices](https://interpol.api.bund.dev/) | Access and search Interpol Red Notices | No | Yes | Unknown | | [Istanbul (İBB) Open Data](https://data.ibb.gov.tr) | Data sets from the İstanbul Metropolitan Municipality (İBB) | No | Yes | Unknown | +| [National Park Service, US](https://www.nps.gov/subjects/developer/) | Data from the US National Park Service | `apiKey` | Yes | Yes | | [Open Government, ACT](https://www.data.act.gov.au/) | Australian Capital Territory Open Data | No | Yes | Unknown | | [Open Government, Argentina](https://datos.gob.ar/) | Argentina Government Open Data | No | Yes | Unknown | | [Open Government, Australia](https://www.data.gov.au/) | Australian Government Open Data | No | Yes | Unknown | | [Open Government, Austria](https://www.data.gv.at/) | Austria Government Open Data | No | Yes | Unknown | | [Open Government, Belgium](https://data.gov.be/) | Belgium Government Open Data | No | Yes | Unknown | -| [Open Government, Brazil](https://www.dados.gov.br/) | Brazilian Government Open Data | No | Yes | Unknown | | [Open Government, Canada](http://open.canada.ca/en) | Canadian Government Open Data | No | No | Unknown | | [Open Government, Colombia](https://www.dane.gov.co/) | Colombia Government Open Data | No | No | Unknown | -| [Open Government, Croatia](https://data.gov.hr/en) | Croatia Government Open Data | No | Yes | Unknown | | [Open Government, Cyprus](https://data.gov.cy/?language=en) | Cyprus Government Open Data | No | Yes | Unknown | | [Open Government, Czech Republic](https://data.gov.cz/english/) | Czech Republic Government Open Data | No | Yes | Unknown | | [Open Government, Denmark](https://www.opendata.dk/) | Denmark Government Open Data | No | Yes | Unknown | @@ -1020,7 +1075,6 @@ API | Description | Auth | HTTPS | CORS | | [Open Government, Portugal](https://dados.gov.pt/en/docapi/) | Portugal Government Open Data | No | Yes | Yes | | [Open Government, Queensland Government](https://www.data.qld.gov.au/) | Queensland Government Open Data | No | Yes | Unknown | | [Open Government, Romania](http://data.gov.ro/) | Romania Government Open Data | No | No | Unknown | -| [Open Government, Russia](https://data.gov.ru/?language=en) | Open Data Portal Russia | `apiKey` | No | Unknown | | [Open Government, Saudi Arabia](https://data.gov.sa) | Saudi Arabia Government Open Data | No | Yes | Unknown | | [Open Government, Singapore](https://data.gov.sg/developer) | Singapore Government Open Data | No | Yes | Unknown | | [Open Government, Slovakia](https://data.gov.sk/en/) | Slovakia Government Open Data | No | Yes | Unknown | @@ -1032,21 +1086,22 @@ API | Description | Auth | HTTPS | CORS | | [Open Government, Taiwan](https://data.gov.tw/) | Taiwan Government Open Data | No | Yes | Unknown | | [Open Government, Thailand](https://data.go.th/) | Thailand Government Open Data | `apiKey` | Yes | Unknown | | [Open Government, UK](https://data.gov.uk/) | UK Government Open Data | No | Yes | Unknown | -| [Open Government, Ukraine](https://data.gov.ua/) | Ukraine Government Open Data | No | Yes | Unknown | | [Open Government, USA](https://www.data.gov/) | United States Government Open Data | No | Yes | Unknown | | [Open Government, Victoria State Government](https://www.data.vic.gov.au/) | Victoria State Government Open Data | No | Yes | Unknown | | [Open Government, West Australia](https://data.wa.gov.au/) | West Australia Open Data | No | Yes | Unknown | +| [PRC Exam Schedule](https://api.whenisthenextboardexam.com/docs/) | Unofficial Philippine Professional Regulation Commission's examination schedule | No | Yes | Yes | | [Represent by Open North](https://represent.opennorth.ca/) | Find Canadian Government Representatives | No | Yes | Unknown | | [UK Companies House](https://developer.company-information.service.gov.uk/) | UK Companies House Data from the UK government | `OAuth` | Yes | Unknown | -| [UK government API catalogue](https://alphagov.github.io/api-catalogue) | APIs from UK government organisations | No | Yes | Unknown | | [US Presidential Election Data by TogaTech](https://uselection.togatech.org/api/) | Basic candidate data and live electoral vote counts for top two parties in US presidential election | No | Yes | No | +| [USA.gov](https://www.usa.gov/developer) | Authoritative information on U.S. programs, events, services and more | `apiKey` | Yes | Unknown | | [USAspending.gov](https://api.usaspending.gov/) | US federal spending data | No | Yes | Unknown | **[⬆ Back to Index](#index)** ### Health API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| -| [Coronavirus](https://pipedream.com/@pravin/http-api-for-latest-wuhan-coronavirus-data-2019-ncov-p_G6CLVM/readme) | HTTP API for Latest Wuhan Coronavirus Data | No | Yes | Unknown | +| [CMS.gov](https://data.cms.gov/provider-data/) | Access to the data from the CMS - medicare.gov | `apiKey` | Yes | Unknown | +| [Coronavirus](https://pipedream.com/@pravin/http-api-for-latest-wuhan-coronavirus-data-2019-ncov-p_G6CLVM/readme) | HTTP API for Latest Covid-19 Data | No | Yes | Unknown | | [Coronavirus in the UK](https://coronavirus.data.gov.uk/details/developers-guide) | UK Government coronavirus data, including deaths and cases by region | No | Yes | Unknown | | [Covid Tracking Project](https://covidtracking.com/data/api/version-2) | Covid-19 data for the US | No | Yes | No | | [Covid-19](https://covid19api.com/) | Covid 19 spread, infection and recovery | No | Yes | Yes | @@ -1061,15 +1116,13 @@ API | Description | Auth | HTTPS | CORS | | [COVID-19 Tracker Sri Lanka](https://www.hpb.health.gov.lk/en/api-documentation) | Provides situation of the COVID-19 patients reported in Sri Lanka | No | Yes | Unknown | | [COVID-ID](https://data.covid19.go.id/public/api/prov.json) | Indonesian government Covid data per province | No | Yes | Yes | | [Dataflow Kit COVID-19](https://covid-19.dataflowkit.com) | COVID-19 live statistics into sites per hour | No | Yes | Unknown | -| [Diabetes](http://predictbgl.com/api/) | Logging and retrieving diabetes information | `OAuth` | No | Unknown | +| [FoodData Central](https://fdc.nal.usda.gov/) | National Nutrient Database for Standard Reference | `apiKey` | Yes | Unknown | | [Healthcare.gov](https://www.healthcare.gov/developers/) | Educational content about the US Health Insurance Marketplace | No | Yes | Unknown | | [Humanitarian Data Exchange](https://data.humdata.org/) | Humanitarian Data Exchange (HDX) is open platform for sharing data across crises and organisations | No | Yes | Unknown | | [Infermedica](https://developer.infermedica.com/docs/) | NLP based symptom checker and patient triage API for health diagnosis from text | `apiKey` | Yes | Yes | -| [Kawal Corona](https://kawalcorona.com/api/) | ID COVID data, include death, positive case and recover | No | Yes | Unknown | | [LAPIS](https://cov-spectrum.ethz.ch/public) | SARS-CoV-2 genomic sequences from public sources | No | Yes | Yes | -| [Lexigram](https://docs.lexigram.io/v1/welcome) | NLP that extracts mentions of clinical concepts from text, gives access to clinical ontology | `apiKey` | Yes | Unknown | +| [Lexigram](https://docs.lexigram.io/) | NLP that extracts mentions of clinical concepts from text, gives access to clinical ontology | `apiKey` | Yes | Unknown | | [Makeup](http://makeup-api.herokuapp.com/) | Makeup Information | No | No | Unknown | -| [Medicare](https://data.medicare.gov/developers) | Access to the data from the CMS - medicare.gov | `apiKey` | Yes | Unknown | | [MyVaccination](https://documenter.getpostman.com/view/16605343/Tzm8GG7u) | Vaccination data for Malaysia | No | Yes | Unknown | | [NPPES](https://npiregistry.cms.hhs.gov/registry/help-api) | National Plan & Provider Enumeration System, info on healthcare providers registered in US | No | Yes | Unknown | | [Nutritionix](https://developer.nutritionix.com/) | Worlds largest verified nutrition database | `apiKey` | Yes | Unknown | @@ -1078,7 +1131,6 @@ API | Description | Auth | HTTPS | CORS | | [openFDA](https://open.fda.gov) | Public FDA data about drugs, devices and foods | `apiKey` | Yes | Unknown | | [Orion Health](https://developer.orionhealth.io/) | Medical platform which allows the development of applications for different healthcare scenarios | `OAuth` | Yes | Unknown | | [Quarantine](https://quarantine.country/coronavirus/api/) | Coronavirus API with free COVID-19 live updates | No | Yes | Yes | -| [USDA Nutrients](https://fdc.nal.usda.gov/) | National Nutrient Database for Standard Reference | `apiKey` | Yes | Unknown | **[⬆ Back to Index](#index)** ### Jobs @@ -1091,15 +1143,15 @@ API | Description | Auth | HTTPS | CORS | | [DevITjobs UK](https://devitjobs.uk/job_feed.xml) | Jobs with GraphQL | No | Yes | Yes | | [Findwork](https://findwork.dev/developers/) | Job board | `apiKey` | Yes | Unknown | | [GraphQL Jobs](https://graphql.jobs/docs/api/) | Jobs with GraphQL | No | Yes | Yes | -| [Indeed](https://developer.indeed.com/) | Jobs search engine | `OAuth` | Yes | Unknown | | [Jobs2Careers](http://api.jobs2careers.com/api/spec.pdf) | Job aggregator | `apiKey` | Yes | Unknown | -| [Jooble](https://us.jooble.org/api/about) | Job search engine | `apiKey` | Yes | Unknown | +| [Jooble](https://jooble.org/api/about) | Job search engine | `apiKey` | Yes | Unknown | | [Juju](http://www.juju.com/publisher/spec/) | Job search engine | `apiKey` | No | Unknown | | [Open Skills](https://github.com/workforce-data-initiative/skills-api/wiki/API-Overview) | Job titles, skills and related jobs data | No | No | Unknown | | [Reed](https://www.reed.co.uk/developers) | Job board aggregator | `apiKey` | Yes | Unknown | | [The Muse](https://www.themuse.com/developers/api/v2) | Job board and company profiles | `apiKey` | Yes | Unknown | | [Upwork](https://developers.upwork.com/) | Freelance job board and management system | `OAuth` | Yes | Unknown | | [USAJOBS](https://developer.usajobs.gov/) | US government job board | `apiKey` | Yes | Unknown | +| [WhatJobs](https://www.whatjobs.com/affiliates) | Job search engine | `apiKey` | Yes | Unknown | | [ZipRecruiter](https://www.ziprecruiter.com/publishers) | Job search app and website | `apiKey` | Yes | Unknown | **[⬆ Back to Index](#index)** @@ -1110,14 +1162,16 @@ API | Description | Auth | HTTPS | CORS | | [Clarifai](https://docs.clarifai.com/api-guide/api-overview) | Computer Vision | `OAuth` | Yes | Unknown | | [Cloudmersive](https://www.cloudmersive.com/image-recognition-and-processing-api) | Image captioning, face recognition, NSFW classification | `apiKey` | Yes | Yes | | [Deepcode](https://www.deepcode.ai) | AI for code review | No | Yes | Unknown | -| [Dialogflow](https://dialogflow.com) | Natural Language Processing | `apiKey` | Yes | Unknown | +| [Dialogflow](https://cloud.google.com/dialogflow/docs/) | Natural Language Processing | `apiKey` | Yes | Unknown | | [EXUDE-API](http://uttesh.com/exude-api/) | Used for the primary ways for filtering the stopping, stemming words from the text data | No | Yes | Yes | +| [Hirak FaceAPI](https://faceapi.hirak.site/) | Face detection, face recognition with age estimation/gender estimation, accurate, no quota limits | `apiKey` | Yes | Unknown | | [Imagga](https://imagga.com/) | Image Recognition Solutions like Tagging, Visual Search, NSFW moderation | `apiKey` | Yes | Unknown | | [Inferdo](https://rapidapi.com/user/inferdo) | Computer Vision services like Facial detection, Image labeling, NSFW classification | `apiKey` | Yes | Unknown | | [IPS Online](https://docs.identity.ps/docs) | Face and License Plate Anonymization | `apiKey` | Yes | Unknown | | [Irisnet](https://irisnet.de/api/) | Realtime content moderation API that blocks or blurs unwanted images in real-time | `apiKey` | Yes | Yes | | [Keen IO](https://keen.io/) | Data Analytics | `apiKey` | Yes | Unknown | | [Machinetutors](https://www.machinetutors.com/portfolio/MT_api.html) | AI Solutions: Video/Image Classification & Tagging, NSFW, Icon/Image/Audio Search, NLP | `apiKey` | Yes | Yes | +| [MessengerX.io](https://messengerx.rtfd.io) | A FREE API for developers to build and monetize personalized ML based chat apps | `apiKey` | Yes | Yes | | [NLP Cloud](https://nlpcloud.io) | NLP API using spaCy and transformers for NER, sentiments, classification, summarization, and more | `apiKey` | Yes | Unknown | | [OpenVisionAPI](https://openvisionapi.com) | Open source computer vision API based on open source models | No | Yes | Yes | | [Perspective](https://perspectiveapi.com) | NLP API to return probability that if text is toxic, obscene, insulting or threatening | `apiKey` | Yes | Unknown | @@ -1125,7 +1179,6 @@ API | Description | Auth | HTTPS | CORS | | [SkyBiometry](https://skybiometry.com/documentation/) | Face Detection, Face Recognition and Face Grouping | `apiKey` | Yes | Unknown | | [Time Door](https://timedoor.io) | A time series analysis API | `apiKey` | Yes | Yes | | [Unplugg](https://unplu.gg/test_api.html) | Forecasting API for timeseries data | `apiKey` | Yes | Unknown | -| [Wit.ai](https://wit.ai/) | Natural Language Processing | `OAuth` | Yes | Unknown | | [WolframAlpha](https://products.wolframalpha.com/api/) | Provides specific answers to questions using data and algorithms | `apiKey` | Yes | Unknown | **[⬆ Back to Index](#index)** @@ -1134,7 +1187,6 @@ API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [7digital](https://docs.7digital.com/reference) | Api of Music store 7digital | `OAuth` | Yes | Unknown | | [AI Mastering](https://aimastering.com/api_docs/) | Automated Music Mastering | `apiKey` | Yes | Yes | -| [Apple Music](https://developer.apple.com/documentation/applemusicapi/) | Official API of the music streaming site Apple Music | `apiKey` | Yes | Unknown | | [Audiomack](https://www.audiomack.com/data-api/docs) | Api of the streaming music hub Audiomack | `OAuth` | Yes | Unknown | | [Bandcamp](https://bandcamp.com/developer) | API of Music store Bandcamp | `OAuth` | Yes | Unknown | | [Bandsintown](https://app.swaggerhub.com/apis/Bandsintown/PublicAPI/3.0.0) | Music Events | No | Yes | Unknown | @@ -1150,7 +1202,7 @@ API | Description | Auth | HTTPS | CORS | | [KKBOX](https://developer.kkbox.com) | Get music libraries, playlists, charts, and perform out of KKBOX's platform | `OAuth` | Yes | Unknown | | [KSoft.Si Lyrics](https://docs.ksoft.si/api/lyrics-api) | API to get lyrics for songs | `apiKey` | Yes | Unknown | | [LastFm](https://www.last.fm/api) | Music | `apiKey` | Yes | Unknown | -| [Lyrics.ovh](http://docs.lyricsovh.apiary.io/) | Simple API to retrieve the lyrics of a song | No | Yes | Unknown | +| [Lyrics.ovh](https://lyricsovh.docs.apiary.io) | Simple API to retrieve the lyrics of a song | No | Yes | Unknown | | [Mixcloud](https://www.mixcloud.com/developers/) | Music | `OAuth` | Yes | Yes | | [MusicBrainz](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2) | Music | No | Yes | Unknown | | [Musixmatch](https://developer.musixmatch.com/) | Music | `apiKey` | Yes | Unknown | @@ -1179,7 +1231,7 @@ API | Description | Auth | HTTPS | CORS | | [GNews](https://gnews.io/) | Search for news from various sources | `apiKey` | Yes | Yes | | [Graphs for Coronavirus](https://corona.dnsforfamily.com/api.txt) | Each Country separately and Worldwide Graphs for Coronavirus. Daily updates | No | Yes | Yes | | [Inshorts News](https://github.com/cyberboysumanjay/Inshorts-News-API) | Provides news from inshorts | No | Yes | Unknown | -| [MarketAux](https://marketaux.com/) | Live stock market news with tagged tickers + sentiment and stats JSON API | `apiKey` | Yes | Yes | +| [MarketAux](https://www.marketaux.com/) | Live stock market news with tagged tickers + sentiment and stats JSON API | `apiKey` | Yes | Yes | | [New York Times](https://developer.nytimes.com/) | The New York Times Developer Network | `apiKey` | Yes | Unknown | | [News](https://newsapi.org/) | Headlines currently published on a range of news sources and blogs | `apiKey` | Yes | Unknown | | [NewsData](https://newsdata.io/docs) | News data API for live-breaking news and headlines from reputed news sources | `apiKey` | Yes | Unknown | @@ -1188,7 +1240,7 @@ API | Description | Auth | HTTPS | CORS | | [Spaceflight News](https://spaceflightnewsapi.net) | Spaceflight related news 🚀 | No | Yes | Yes | | [The Guardian](http://open-platform.theguardian.com/) | Access all the content the Guardian creates, categorised by tags and section | `apiKey` | Yes | Unknown | | [The Old Reader](https://github.com/theoldreader/api) | RSS reader | `apiKey` | Yes | Unknown | -| [TheNews](https://thenewsapi.com/) | Aggregated headlines, top story and live news JSON API | `apiKey` | Yes | Yes | +| [TheNews](https://www.thenewsapi.com/) | Aggregated headlines, top story and live news JSON API | `apiKey` | Yes | Yes | | [Trove](https://trove.nla.gov.au/about/create-something/using-api) | Search through the National Library of Australia collection of 1000s of digitised newspapers | `apiKey` | Yes | Unknown | **[⬆ Back to Index](#index)** @@ -1198,24 +1250,26 @@ API | Description | Auth | HTTPS | CORS | | [18F](http://18f.github.io/API-All-the-X/) | Unofficial US Federal Government API Development | No | No | Unknown | | [API Setu](https://www.apisetu.gov.in/) | An Indian Government platform that provides a lot of APIS for KYC, business, education & employment | No | Yes | Yes | | [Archive.org](https://archive.readme.io/docs) | The Internet Archive | No | Yes | No | -| [Black History Facts](https://blackhistoryapi.io/docs) | Contribute or search one of the largest black history fact databases on the web | `apiKey` | Yes | Yes | +| [Black History Facts](https://www.blackhistoryapi.io/docs) | Contribute or search one of the largest black history fact databases on the web | `apiKey` | Yes | Yes | | [BotsArchive](https://botsarchive.com/docs.html) | JSON formatted details about Telegram Bots available in database | No | Yes | Unknown | | [Callook.info](https://callook.info) | United States ham radio callsigns | No | Yes | Unknown | | [CARTO](https://carto.com/) | Location Information Prediction | `apiKey` | Yes | Unknown | -| [CivicFeed](https://developers.civicfeed.com/) | News articles and public datasets | `apiKey` | Yes | Unknown | | [CollegeScoreCard.ed.gov](https://collegescorecard.ed.gov/data/) | Data on higher education institutions in the United States | No | Yes | Unknown | -| [Enigma Public](http://docs.enigma.com/public/public_v20_api_about) | Broadest collection of public data | `apiKey` | Yes | Yes | +| [Enigma Public](https://developers.enigma.com/docs) | Broadest collection of public data | `apiKey` | Yes | Yes | | [French Address Search](https://geo.api.gouv.fr/adresse) | Address search via the French Government | No | Yes | Unknown | | [GENESIS](https://www.destatis.de/EN/Service/OpenData/api-webservice.html) | Federal Statistical Office Germany | `OAuth` | Yes | Unknown | | [Joshua Project](https://api.joshuaproject.net/) | People groups of the world with the fewest followers of Christ | `apiKey` | Yes | Unknown | | [Kaggle](https://www.kaggle.com/docs/api) | Create and interact with Datasets, Notebooks, and connect with Kaggle | `apiKey` | Yes | Unknown | | [LinkPreview](https://www.linkpreview.net) | Get JSON formatted summary with title, description and preview image for any requested URL | `apiKey` | Yes | Yes | +| [Lowy Asia Power Index](https://github.com/0x0is1/lowy-index-api-docs) | Get measure resources and influence to rank the relative power of states in Asia | No | Yes | Unknown | | [Microlink.io](https://microlink.io) | Extract structured data from any website | No | Yes | Yes | +| [Nasdaq Data Link](https://docs.data.nasdaq.com/) | Stock market data | `apiKey` | Yes | Unknown | | [Nobel Prize](https://www.nobelprize.org/about/developer-zone-2/) | Open data about nobel prizes and events | No | Yes | Yes | | [Open Data Minneapolis](https://opendata.minneapolismn.gov/) | Spatial (GIS) and non-spatial city data for Minneapolis | No | Yes | No | | [openAFRICA](https://africaopendata.org/) | Large datasets repository of African open data | No | Yes | Unknown | | [OpenCorporates](http://api.opencorporates.com/documentation/API-Reference) | Data on corporate entities and directors in many countries | `apiKey` | Yes | Unknown | -| [Quandl](https://www.quandl.com/) | Stock Market Data | No | Yes | Unknown | +| [OpenSanctions](https://www.opensanctions.org/docs/api/) | Data on international sanctions, crime and politically exposed persons | No | Yes | Yes | +| [PeakMetrics](https://rapidapi.com/peakmetrics-peakmetrics-default/api/peakmetrics-news) | News articles and public datasets | `apiKey` | Yes | Unknown | | [Recreation Information Database](https://ridb.recreation.gov/) | Recreational areas, federal lands, historic sites, museums, and other attractions/resources(US) | `apiKey` | Yes | Unknown | | [Scoop.it](http://www.scoop.it/dev) | Content Curation Service | `apiKey` | No | Unknown | | [Socrata](https://dev.socrata.com/) | Access to Open Data from Governments, Non-profits and NGOs around the world | `OAuth` | Yes | Yes | @@ -1257,7 +1311,6 @@ API | Description | Auth | HTTPS | CORS | API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [Advice Slip](http://api.adviceslip.com/) | Generate random advice slips | No | Yes | Unknown | -| [Affirmations](https://affirmations.dev/) | Generate Stuart Smalley Affirmations | No | Yes | Unknown | | [Biriyani As A Service](https://biriyani.anoram.com/) | Biriyani images placeholder | No | Yes | No | | [Dev.to](https://developers.forem.com/api) | Access Forem articles, users and other resources via API | `apiKey` | Yes | Unknown | | [Dictum](https://github.com/fisenkodv/dictum) | API to get access to the collection of the most inspiring expressions of mankind | No | Yes | Unknown | @@ -1267,6 +1320,7 @@ API | Description | Auth | HTTPS | CORS | | [icanhazdadjoke](https://icanhazdadjoke.com/api) | The largest selection of dad jokes on the internet | No | Yes | Unknown | | [Inspiration](https://inspiration.goprogram.ai/docs/) | Motivational and Inspirational quotes | No | Yes | Yes | | [kanye.rest](https://kanye.rest) | REST API for random Kanye West quotes | No | Yes | Yes | +| [kimiquotes](https://kimiquotes.herokuapp.com/doc) | Team radio and interview quotes by Finnish F1 legend Kimi Räikkönen | No | Yes | Yes | | [Medium](https://github.com/Medium/medium-api-docs) | Community of readers and writers offering unique perspectives on ideas | `OAuth` | Yes | Unknown | | [Programming Quotes](https://github.com/skolakoda/programming-quotes-api) | Programming Quotes API for open source projects | No | Yes | Unknown | | [Quotable Quotes](https://github.com/lukePeavey/quotable) | Quotable is a free, open source quotations API | No | Yes | Unknown | @@ -1288,6 +1342,7 @@ API | Description | Auth | HTTPS | CORS | | [apilayer numverify](https://numverify.com) | Phone number validation | `apiKey` | Yes | Unknown | | [Cloudmersive Validate](https://cloudmersive.com/phone-number-validation-API) | Validate international phone numbers | `apiKey` | Yes | Yes | | [Phone Specification](https://github.com/azharimm/phone-specs-api) | Rest Api for Phone specifications | No | Yes | Yes | +| [Veriphone](https://veriphone.io) | Phone number validation & carrier lookup | `apiKey` | Yes | Yes | **[⬆ Back to Index](#index)** ### Photography @@ -1298,12 +1353,13 @@ API | Description | Auth | HTTPS | CORS | | [Bruzu](https://docs.bruzu.com) | Image generation with query string | `apiKey` | Yes | Yes | | [CheetahO](https://cheetaho.com/docs/getting-started/) | Photo optimization and resize | `apiKey` | Yes | Unknown | | [Dagpi](https://dagpi.xyz) | Image manipulation and processing | `apiKey` | Yes | Unknown | +| [Duply](https://duply.co/docs#getting-started-api) | Generate, Edit, Scale and Manage Images and Videos Smarter & Faster | `apiKey` | Yes | Yes | +| [DynaPictures](https://dynapictures.com/docs/) | Generate Hundreds of Personalized Images in Minutes | `apiKey` | Yes | Yes | | [Flickr](https://www.flickr.com/services/api/) | Flickr Services | `OAuth` | Yes | Unknown | | [Getty Images](http://developers.gettyimages.com/en/) | Build applications using the world's most powerful imagery | `OAuth` | Yes | Unknown | | [Gfycat](https://developers.gfycat.com/api/) | Jiffier GIFs | `OAuth` | Yes | Unknown | | [Giphy](https://developers.giphy.com/docs/) | Get all your gifs | `apiKey` | Yes | Unknown | | [Google Photos](https://developers.google.com/photos) | Integrate Google Photos with your apps or devices | `OAuth` | Yes | Unknown | -| [Gyazo](https://gyazo.com/api/docs) | Upload images | `apiKey` | Yes | Unknown | | [Imgur](https://apidocs.imgur.com/) | Images | `OAuth` | Yes | Unknown | | [Imsea](https://imsea.herokuapp.com/) | Free image search | No | Yes | Unknown | | [Lorem Picsum](https://picsum.photos/) | Images from Unsplash | No | Yes | Unknown | @@ -1328,6 +1384,8 @@ API | Description | Auth | HTTPS | CORS | | [Codeforces](https://codeforces.com/apiHelp) | Get access to Codeforces data | `apiKey` | Yes | Unknown | | [Hackerearth](https://www.hackerearth.com/docs/wiki/developers/v4/) | For compiling and running code in several languages | `apiKey` | Yes | Unknown | | [Judge0 CE](https://ce.judge0.com/) | Online code execution system | `apiKey` | Yes | Unknown | +| [KONTESTS](https://kontests.net/api) | For upcoming and ongoing competitive coding contests | No | Yes | Unknown | +| [Mintlify](https://docs.mintlify.com) | For programmatically generating documentation for code | `apiKey` | Yes | Yes | **[⬆ Back to Index](#index)** ### Science & Math @@ -1335,7 +1393,6 @@ API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [arcsecond.io](https://api.arcsecond.io/) | Multiple astronomy data sources | No | Yes | Unknown | | [arXiv](https://arxiv.org/help/api/user-manual) | Curated research-sharing platform: physics, mathematics, quantitative finance, and economics | No | Yes | Unknown | -| [aztro](https://aztro.sameerkumar.website/) | Daily horoscope info for yesterday, today, and tomorrow | No | Yes | Unknown | | [CORE](https://core.ac.uk/services#api) | Access the world's Open Access research papers | `apiKey` | Yes | Unknown | | [GBIF](https://www.gbif.org/developer/summary) | Global Biodiversity Information Facility | No | Yes | Yes | | [iDigBio](https://github.com/idigbio/idigbio-search-api/wiki) | Access millions of museum specimens from organizations around the world | No | Yes | Unknown | @@ -1352,15 +1409,16 @@ API | Description | Auth | HTTPS | CORS | | [Noctua](https://api.noctuasky.com/api/v1/swaggerdoc/) | REST API used to access NoctuaSky features | No | Yes | Unknown | | [Numbers](https://math.tools/api/numbers/) | Number of the day, random number, number facts and anything else you want to do with numbers | `apiKey` | Yes | No | | [Numbers](http://numbersapi.com) | Facts about numbers | No | No | No | +| [Ocean Facts](https://oceanfacts.herokuapp.com/) | Facts pertaining to the physical science of Oceanography | No | Yes | Unknown | | [Open Notify](http://open-notify.org/Open-Notify-API/) | ISS astronauts, current location, etc | No | No | No | | [Open Science Framework](https://developer.osf.io) | Repository and archive for study designs, research materials, data, manuscripts, etc | No | Yes | Unknown | | [Purple Air](https://www2.purpleair.com/) | Real Time Air Quality Monitoring | No | Yes | Unknown | -| [Quadratic Solver](https://quadratic-solver-api.herokuapp.com/) | A Quadratic Solver | No | Yes | Yes | -| [Satellite Passes](https://satellites.fly.dev) | Query next satellite passes above you | No | Yes | No | +| [Remote Calc](https://github.com/elizabethadegbaju/remotecalc) | Decodes base64 encoding and parses it to return a solution to the calculation in JSON | No | Yes | Yes | | [SHARE](https://share.osf.io/api/v2/) | A free, open, dataset about research and scholarly activities | No | Yes | No | | [SpaceX](https://github.com/r-spacex/SpaceX-API) | Company, vehicle, launchpad and launch data | No | Yes | No | | [SpaceX](https://api.spacex.land/graphql/) | GraphQL, Company, Ships, launchpad and launch data | No | Yes | Unknown | | [Sunrise and Sunset](https://sunrise-sunset.org/api) | Sunset and sunrise times for a given latitude and longitude | No | Yes | No | +| [Times Adder](https://github.com/FranP-code/API-Times-Adder) | With this API you can add each of the times introduced in the array sended | No | Yes | No | | [TLE](https://tle.ivanstanojevic.me/#/docs) | Satellite information | No | Yes | No | | [USGS Earthquake Hazards Program](https://earthquake.usgs.gov/fdsnws/event/1/) | Earthquakes data real-time | No | Yes | No | | [USGS Water Services](https://waterservices.usgs.gov/) | Water quality and level info for rivers and lakes | No | Yes | No | @@ -1376,7 +1434,7 @@ API | Description | Auth | HTTPS | CORS | | [BitWarden](https://bitwarden.com/help/api/) | Best open-source password manager | `OAuth` | Yes | Unknown | | [Botd](https://github.com/fingerprintjs/botd) | Botd is a browser library for JavaScript bot detection | `apiKey` | Yes | Yes | | [Bugcrowd](https://docs.bugcrowd.com/api/getting-started/) | Bugcrowd API for interacting and tracking the reported issues programmatically | `apiKey` | Yes | Unknown | -| [Censys.io](https://censys.io/api) | Search engine for Internet connected host and devices | `apiKey` | Yes | No | +| [Censys](https://search.censys.io/api) | Search engine for Internet connected host and devices | `apiKey` | Yes | No | | [Classify](https://classify-web.herokuapp.com/#/api) | Encrypting & decrypting text messages | No | Yes | Yes | | [Complete Criminal Checks](https://completecriminalchecks.com/Developers) | Provides data of offenders from all U.S. States and Pureto Rico | `apiKey` | Yes | Yes | | [CRXcavator](https://crxcavator.io/apidocs) | Chrome extension risk scoring | `apiKey` | Yes | Unknown | @@ -1390,6 +1448,7 @@ API | Description | Auth | HTTPS | CORS | | [GitGuardian](https://api.gitguardian.com/doc) | Scan files for secrets (API Keys, database credentials) | `apiKey` | Yes | No | | [GreyNoise](https://docs.greynoise.io/reference/get_v3-community-ip) | Query IPs in the GreyNoise dataset and retrieve a subset of the full IP context data | `apiKey` | Yes | Unknown | | [HackerOne](https://api.hackerone.com/) | The industry’s first hacker API that helps increase productivity towards creative bug bounty hunting | `apiKey` | Yes | Unknown | +| [Hashable](https://hashable.space/pages/api/) | A REST API to access high level cryptographic functions and methods | No | Yes | Yes | | [HaveIBeenPwned](https://haveibeenpwned.com/API/v3) | Passwords which have previously been exposed in data breaches | `apiKey` | Yes | Unknown | | [Intelligence X](https://github.com/IntelligenceX/SDK/blob/master/Intelligence%20X%20API.pdf) | Perform OSINT via Intelligence X | `apiKey` | Yes | Unknown | | [LoginRadius](https://www.loginradius.com/docs/) | Managed User Authentication Service | `apiKey` | Yes | Yes | @@ -1401,10 +1460,10 @@ API | Description | Auth | HTTPS | CORS | | [PhishStats](https://phishstats.info/) | Phishing database | No | Yes | Unknown | | [Privacy.com](https://privacy.com/developer/docs) | Generate merchant-specific and one-time use credit card numbers that link back to your bank | `apiKey` | Yes | Unknown | | [Pulsedive](https://pulsedive.com/api/) | Scan, search and collect threat intelligence data in real-time | `apiKey` | Yes | Unknown | -| [Reconmap](https://api.reconmap.org/docs/) | Reconmap APIS for VAPT (vulnerability assessment and penetration testing) automation and reporting | `OAuth` | Yes | Unknown | | [SecurityTrails](https://securitytrails.com/corp/apidocs) | Domain and IP related information such as current and historical WHOIS and DNS records | `apiKey` | Yes | Unknown | | [Shodan](https://developer.shodan.io/) | Search engine for Internet connected devices | `apiKey` | Yes | Unknown | | [Spyse](https://spyse-dev.readme.io/reference/quick-start) | Access data on all Internet assets and build powerful attack surface management applications | `apiKey` | Yes | Unknown | +| [Threat Jammer](https://threatjammer.com/docs/index) | Risk scoring service from curated threat intelligence data | `apiKey` | Yes | Unknown | | [UK Police](https://data.police.uk/docs/) | UK Police data | No | Yes | Unknown | | [Virushee](https://api.virushee.com/) | Virushee file/data scanning | No | Yes | Yes | | [VulDB](https://vuldb.com/?doc.api) | VulDB API allows to initiate queries for one or more items along with transactional bots | `apiKey` | Yes | Unknown | @@ -1414,10 +1473,9 @@ API | Description | Auth | HTTPS | CORS | API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [Best Buy](https://bestbuyapis.github.io/api-documentation/#overview) | Products, Buying Options, Categories, Recommendations, Stores and Commerce | `apiKey` | Yes | Unknown | -| [Daraz Data](https://rapidapi.com/mnadeem24434@gmail.com/api/get-daraz-product-data/) | Get daraz product detail by it's product URL | `apiKey` | Yes | Unknown | | [Digi-Key](https://www.digikey.com/en/resources/api-solutions) | Retrieve price and inventory of electronic components as well as place orders | `OAuth` | Yes | Unknown | | [Dummy Products](https://dummyproducts-api.herokuapp.com/) | An api to fetch dummy e-commerce products JSON data with placeholder images | `apiKey` | Yes | Yes | -| [eBay](https://go.developer.ebay.com/) | Sell and Buy on eBay | `OAuth` | Yes | Unknown | +| [eBay](https://developer.ebay.com/) | Sell and Buy on eBay | `OAuth` | Yes | Unknown | | [Etsy](https://www.etsy.com/developers/documentation/getting_started/api_basics) | Manage shop and interact with listings | `OAuth` | Yes | Unknown | | [Flipkart Marketplace](https://seller.flipkart.com/api-docs/FMSAPI.html) | Product listing management, Order Fulfilment in the Flipkart Marketplace | `OAuth` | Yes | Yes | | [Lazada](https://open.lazada.com/doc/doc.htm) | Retrieve product ratings and seller performance metrics | `apiKey` | Yes | Unknown | @@ -1427,7 +1485,6 @@ API | Description | Auth | HTTPS | CORS | | [Rappi](https://dev-portal.rappi.com/) | Manage orders from Rappi's app | `OAuth` | Yes | Unknown | | [Shopee](https://open.shopee.com/documents?version=1) | Shopee's official API for integration of various services from Shopee | `apiKey` | Yes | Unknown | | [Tokopedia](https://developer.tokopedia.com/openapi/guide/#/) | Tokopedia's Official API for integration of various services from Tokopedia | `OAuth` | Yes | Unknown | -| [Wegmans](https://dev.wegmans.io) | Wegmans Food Markets | `apiKey` | Yes | Unknown | | [WooCommerce](https://woocommerce.github.io/woocommerce-rest-api-docs/) | WooCommerce REST APIS to create, read, update, and delete data on wordpress website in JSON format | `apiKey` | Yes | Yes | **[⬆ Back to Index](#index)** @@ -1436,6 +1493,7 @@ API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [4chan](https://github.com/4chan/4chan-API) | Simple image-based bulletin board dedicated to a variety of topics | No | Yes | Yes | | [Ayrshare](https://www.ayrshare.com) | Social media APIs to post, get analytics, and manage multiple users social media accounts | `apiKey` | Yes | Yes | +| [aztro](https://aztro.sameerkumar.website/) | Daily horoscope info for yesterday, today, and tomorrow | No | Yes | Unknown | | [Blogger](https://developers.google.com/blogger/) | The Blogger APIs allows client applications to view and update Blogger content | `OAuth` | Yes | Unknown | | [Cisco Spark](https://developer.ciscospark.com) | Team Collaboration Software | `OAuth` | Yes | Unknown | | [Dangerous Discord Database](https://discord.riverside.rocks/docs/index.php) | Database of malicious Discord accounts | `apiKey` | Yes | Unknown | @@ -1445,9 +1503,9 @@ API | Description | Auth | HTTPS | CORS | | [Facebook](https://developers.facebook.com/) | Facebook Login, Share on FB, Social Plugins, Analytics and more | `OAuth` | Yes | Unknown | | [Foursquare](https://developer.foursquare.com/) | Interact with Foursquare users and places (geolocation-based checkins, photos, tips, events, etc) | `OAuth` | Yes | Unknown | | [Fuck Off as a Service](https://www.foaas.com) | Asks someone to fuck off | No | Yes | Unknown | -| [Full Contact](https://www.fullcontact.com/developer/docs/) | Get Social Media profiles and contact Information | `OAuth` | Yes | Unknown | +| [Full Contact](https://docs.fullcontact.com/) | Get Social Media profiles and contact Information | `OAuth` | Yes | Unknown | | [HackerNews](https://github.com/HackerNews/API) | Social news for CS and entrepreneurship | No | Yes | Unknown | -| [Hashnode](https://api.hashnode.com/) | A blogging platform built for developers | No | Yes | Unknown | +| [Hashnode](https://hashnode.com) | A blogging platform built for developers | No | Yes | Unknown | | [Instagram](https://www.instagram.com/developer/) | Instagram Login, Share on Instagram, Social Plugins and more | `OAuth` | Yes | Unknown | | [Kakao](https://developers.kakao.com/) | Kakao Login, Share on KakaoTalk, Social Plugins and more | `OAuth` | Yes | Unknown | | [Lanyard](https://github.com/Phineas/lanyard) | Retrieve your presence on Discord through an HTTP REST API or WebSocket | No | Yes | Yes | @@ -1480,7 +1538,7 @@ API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [API-FOOTBALL](https://www.api-football.com/documentation-v3) | Get information about Football Leagues & Cups | `apiKey` | Yes | Yes | | [ApiMedic](https://apimedic.com/) | ApiMedic offers a medical symptom checker API primarily for patients | `apiKey` | Yes | Unknown | -| [balldontlie](https://balldontlie.io) | Balldontlie provides access to stats data from the NBA | No | Yes | Yes | +| [balldontlie](https://www.balldontlie.io) | Balldontlie provides access to stats data from the NBA | No | Yes | Yes | | [Canadian Football League (CFL)](http://api.cfl.ca/) | Official JSON API providing real-time league, team and player statistics about the CFL | `apiKey` | Yes | No | | [City Bikes](https://api.citybik.es/v2/) | City Bikes around the world | No | Yes | Unknown | | [Cloudbet](https://www.cloudbet.com/api/) | Official Cloudbet API provides real-time sports odds and betting API to place bets programmatically | `apiKey` | Yes | Yes | @@ -1508,7 +1566,6 @@ API | Description | Auth | HTTPS | CORS | | [Squiggle](https://api.squiggle.com.au) | Fixtures, results and predictions for Australian Football League matches | No | Yes | Yes | | [Strava](https://strava.github.io/api/) | Connect with athletes, activities and more | `OAuth` | Yes | Unknown | | [SuredBits](https://suredbits.com/api/) | Query sports data, including teams, players, games, scores and statistics | No | No | No | -| [Tennis-data](https://rapidapi.com/marindelija/api/tennis-data1/) | Get tennis playes, tournaments and matches | `apiKey` | Yes | Unknown | | [TheSportsDB](https://www.thesportsdb.com/api.php) | Crowd-Sourced Sports Data and Artwork | `apiKey` | Yes | Yes | | [Tredict](https://www.tredict.com/blog/oauth_docs/) | Get and set activities, health data and more | `OAuth` | Yes | Unknown | | [Wger](https://wger.de/en/software/api) | Workout manager data as exercises, muscles or equipment | `apiKey` | Yes | Unknown | @@ -1524,12 +1581,12 @@ API | Description | Auth | HTTPS | CORS | | [FakerAPI](https://fakerapi.it/en) | APIs collection to get fake data | No | Yes | Yes | | [FakeStoreAPI](https://fakestoreapi.com/) | Fake store rest API for your e-commerce or shopping website prototype | No | Yes | Unknown | | [GeneradorDNI](https://api.generadordni.es) | Data generator API. Profiles, vehicles, banks and cards, etc | `apiKey` | Yes | Unknown | +| [ItsThisForThat](https://itsthisforthat.com/api.php) | Generate Random startup ideas | No | Yes | No | | [JSONPlaceholder](http://jsonplaceholder.typicode.com/) | Fake data for testing and prototyping | No | No | Unknown | | [Loripsum](http://loripsum.net/) | The "lorem ipsum" generator that doesn't suck | No | No | Unknown | | [Mailsac](https://mailsac.com/docs/api) | Disposable Email | `apiKey` | Yes | Unknown | | [Metaphorsum](http://metaphorpsum.com/) | Generate demo paragraphs giving number of words and sentences | No | No | Unknown | | [Mockaroo](https://www.mockaroo.com/docs) | Generate fake data to JSON, CSV, TXT, SQL and XML | `apiKey` | Yes | Unknown | -| [PIPL](https://pipl.ir/) | Free and public API that generates random and fake people's data in JSON | No | Yes | No | | [QuickMocker](https://quickmocker.com) | API mocking tool to generate contextual, fake or random data | No | Yes | Yes | | [Random Data](https://random-data-api.com) | Random data generator | No | Yes | Unknown | | [Randommer](https://randommer.io/randommer-api) | Random data generator | `apiKey` | Yes | Yes | @@ -1547,16 +1604,19 @@ API | Description | Auth | HTTPS | CORS | ### Text Analysis API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| +| [Code Detection API](https://codedetectionapi.runtime.dev) | Detect, label, format and enrich the code in your app or in your data pipeline | `OAuth` | Yes | Unknown | | [apilayer languagelayer](https://languagelayer.com/) | Language Detection JSON API supporting 173 languages | `OAuth` | Yes | Unknown | | [Aylien Text Analysis](https://docs.aylien.com/textapi/#getting-started) | A collection of information retrieval and natural language APIs | `apiKey` | Yes | Unknown | | [Cloudmersive Natural Language Processing](https://www.cloudmersive.com/nlp-api) | Natural language processing and text analysis | `apiKey` | Yes | Yes | | [Detect Language](https://detectlanguage.com/) | Detects text language | `apiKey` | Yes | Unknown | | [ELI](https://nlp.insightera.co.th/docs/v1.0) | Natural Language Processing Tools for Thai Language | `apiKey` | Yes | Unknown | | [Google Cloud Natural](https://cloud.google.com/natural-language/docs/) | Natural language understanding technology, including sentiment, entity and syntax analysis | `apiKey` | Yes | Unknown | +| [Hirak OCR](https://ocr.hirak.site/) | Image to text -text recognition- from image more than 100 language, accurate, unlimited requests | `apiKey` | Yes | Unknown | +| [Hirak Translation](https://translate.hirak.site/) | Translate between 21 of most used languages, accurate, unlimited requests | `apiKey` | Yes | Unknown | +| [Lecto Translation](https://rapidapi.com/lecto-lecto-default/api/lecto-translation/) | Translation API with free tier and reasonable prices | `apiKey` | Yes | Yes | | [LibreTranslate](https://libretranslate.com/docs) | Translation tool with 17 available languages | No | Yes | Unknown | | [Semantria](https://semantria.readme.io/docs) | Text Analytics with sentiment analysis, categorization & named entity extraction | `OAuth` | Yes | Unknown | | [Sentiment Analysis](https://www.meaningcloud.com/developer/sentiment-analysis) | Multilingual sentiment analysis of texts from different sources | `apiKey` | Yes | Yes | -| [Sentium](https://sentim-api.herokuapp.com/) | Free API for Text Sentimental analysis | No | Yes | Unknown | | [Tisane](https://tisane.ai/) | Text Analytics with focus on detection of abusive content and law enforcement applications | `OAuth` | Yes | Yes | | [Watson Natural Language Understanding](https://cloud.ibm.com/apidocs/natural-language-understanding/natural-language-understanding) | Natural language processing for advanced text analysis | `OAuth` | Yes | Unknown | @@ -1594,7 +1654,7 @@ API | Description | Auth | HTTPS | CORS | | [Compare Flight Prices](https://rapidapi.com/obryan-software-obryan-software-default/api/compare-flight-prices/) | API for comparing flight prices across platforms | `apiKey` | Yes | Unknown | | [CTS](https://api.cts-strasbourg.eu/) | CTS Realtime API | `apiKey` | Yes | Yes | | [Grab](https://developer.grab.com/docs/) | Track deliveries, ride fares, payments and loyalty points | `OAuth` | Yes | Unknown | -| [GraphHopper](https://graphhopper.com/api/1/docs/) | A-to-B routing with turn-by-turn instructions | `apiKey` | Yes | Unknown | +| [GraphHopper](https://docs.graphhopper.com/) | A-to-B routing with turn-by-turn instructions | `apiKey` | Yes | Unknown | | [Icelandic APIs](http://docs.apis.is/) | Open APIs that deliver services in or regarding Iceland | No | Yes | Unknown | | [Impala Hotel Bookings](https://docs.impala.travel/docs/booking-api/) | Hotel content, rates and room bookings | `apiKey` | Yes | No | | [Izi](http://api-docs.izi.travel/) | Audio guide for travellers | `apiKey` | Yes | Unknown | @@ -1607,22 +1667,20 @@ API | Description | Auth | HTTPS | CORS | | [REFUGE Restrooms](https://www.refugerestrooms.org/api/docs/#!/restrooms) | Provides safe restroom access for transgender, intersex and gender nonconforming individuals | No | Yes | Unknown | | [Sabre for Developers](https://developer.sabre.com/guides/travel-agency/quickstart/getting-started-in-travel) | Travel Search - Limited usage | `apiKey` | Yes | Unknown | | [Schiphol Airport](https://developer.schiphol.nl/) | Schiphol | `apiKey` | Yes | Unknown | -| [Skyscanner](https://rapidapi.com/skyscanner/api/skyscanner-flight-search) | Search for flights & get flight prices from Skyscanner’s database | `apiKey` | Yes | Unknown | | [Tankerkoenig](https://creativecommons.tankerkoenig.de/swagger/) | German realtime gas/diesel prices | `apiKey` | Yes | Yes | -| [TransitLand](https://transit.land/documentation/datastore/api-endpoints.html) | Transit Aggregation | No | Yes | Unknown | +| [TransitLand](https://www.transit.land/documentation/datastore/api-endpoints.html) | Transit Aggregation | No | Yes | Unknown | | [Transport for Atlanta, US](http://www.itsmarta.com/app-developer-resources.aspx) | Marta | No | No | Unknown | -| [Transport for Auckland, New Zealand](https://api.at.govt.nz/) | Auckland Transport | No | Yes | Unknown | -| [Transport for Belgium](https://api.irail.be/) | The iRail API is a third-party API for Belgian public transport by train | No | Yes | Yes | +| [Transport for Auckland, New Zealand](https://dev-portal.at.govt.nz/) | Auckland Transport | No | Yes | Unknown | +| [Transport for Belgium](https://docs.irail.be/) | The iRail API is a third-party API for Belgian public transport by train | No | Yes | Yes | | [Transport for Berlin, Germany](https://github.com/derhuerst/vbb-rest/blob/3/docs/index.md) | Third-party VBB API | No | Yes | Unknown | | [Transport for Bordeaux, France](https://opendata.bordeaux-metropole.fr/explore/) | Bordeaux Métropole public transport and more (France) | `apiKey` | Yes | Unknown | -| [Transport for Boston, US](https://mbta.com/developers/v3-api) | MBTA API | No | No | Unknown | | [Transport for Budapest, Hungary](https://bkkfutar.docs.apiary.io) | Budapest public transport API | No | Yes | Unknown | -| [Transport for Chicago, US](http://www.transitchicago.com/developers/) | CTA | No | No | Unknown | +| [Transport for Chicago, US](http://www.transitchicago.com/developers/) | Chicago Transit Authority (CTA) | `apiKey` | No | Unknown | | [Transport for Czech Republic](https://www.chaps.cz/eng/products/idos-internet) | Czech transport API | No | Yes | Unknown | | [Transport for Denver, US](http://www.rtd-denver.com/gtfs-developer-guide.shtml) | RTD | No | No | Unknown | | [Transport for Finland](https://digitransit.fi/en/developers/ ) | Finnish transport API | No | Yes | Unknown | | [Transport for Germany](http://data.deutschebahn.com/dataset/api-fahrplan) | Deutsche Bahn (DB) API | `apiKey` | No | Unknown | -| [Transport for Grenoble, France](https://www.metromobilite.fr/pages/opendata/OpenDataApi.html) | Grenoble public transport | No | No | No | +| [Transport for Grenoble, France](https://www.mobilites-m.fr/pages/opendata/OpenDataApi.html) | Grenoble public transport | No | No | No | | [Transport for Hessen, Germany](https://opendata.rmv.de/site/start.html) | RMV API (Public Transport in Hessen) | No | Yes | Unknown | | [Transport for Honolulu, US](http://hea.thebus.org/api_info.asp) | Honolulu Transportation Information | `apiKey` | No | Unknown | | [Transport for Lisbon, Portugal](https://emel.city-platform.com/opendata/) | Data about buses routes, parking and traffic | `apiKey` | Yes | Unknown | @@ -1642,9 +1700,10 @@ API | Description | Auth | HTTPS | CORS | | [Transport for The Netherlands](https://github.com/skywave/KV78Turbo-OVAPI/wiki) | OVAPI, country-wide public transport | No | Yes | Unknown | | [Transport for Toronto, Canada](https://myttc.ca/developers) | TTC | No | Yes | Unknown | | [Transport for UK](https://developer.transportapi.com) | Transport API and dataset for UK | `apiKey` | Yes | Unknown | -| [Transport for United States](http://www.nextbus.com/xmlFeedDocs/NextBusXMLFeed.pdf) | NextBus API | No | No | Unknown | +| [Transport for United States](https://retro.umoiq.com/xmlFeedDocs/NextBusXMLFeed.pdf) | NextBus API | No | No | Unknown | | [Transport for Vancouver, Canada](https://developer.translink.ca/) | TransLink | `OAuth` | Yes | Unknown | | [Transport for Washington, US](https://developer.wmata.com/) | Washington Metro transport API | `OAuth` | Yes | Unknown | +| [transport.rest](https://transport.rest) | Community maintained, developer-friendly public transport API | No | Yes | Yes | | [Tripadvisor](https://developer-tripadvisor.com/home/) | Rating content for a hotel, restaurant, attraction or destination | `apiKey` | Yes | Unknown | | [Uber](https://developer.uber.com/products) | Uber ride requests and price estimation | `OAuth` | Yes | Yes | | [Velib metropolis, Paris, France](https://www.velib-metropole.fr/donnees-open-data-gbfs-du-service-velib-metropole) | Velib Open Data API | No | Yes | No | @@ -1660,6 +1719,7 @@ API | Description | Auth | HTTPS | CORS | | [Clico](https://cli.com/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config) | URL shortener service | `apiKey` | Yes | Unknown | | [Cutt.ly](https://cutt.ly/api-documentation/cuttly-links-api) | URL shortener service | `apiKey` | Yes | Unknown | | [Drivet URL Shortener](https://wiki.drivet.xyz/en/url-shortener/add-links) | Shorten a long URL easily and fast | No | Yes | Unknown | +| [Free Url Shortener](https://ulvis.net/developer.html) | Free URL Shortener offers a powerful API to interact with other sites | No | Yes | Unknown | | [Git.io](https://github.blog/2011-11-10-git-io-github-url-shortener/) | Git.io URL shortener | No | Yes | Unknown | | [GoTiny](https://github.com/robvanbakel/gotiny-api) | A lightweight URL shortener, focused on ease-of-use for the developer and end-user | No | Yes | Yes | | [Kutt](https://docs.kutt.it/) | Free Modern URL Shortener | `apiKey` | Yes | Yes | @@ -1670,13 +1730,13 @@ API | Description | Auth | HTTPS | CORS | | [Shrtcode](https://shrtco.de/docs) | URl Shortener with multiple Domains | No | Yes | Yes | | [Shrtlnk](https://shrtlnk.dev/developer) | Simple and efficient short link creation | `apiKey` | Yes | Yes | | [TinyURL](https://tinyurl.com/app/dev) | Shorten long URLs | `apiKey` | Yes | No | -| [Zero Width Shortener](https://docs.zws.im) | Shortens URLs using spaces that have zero width, making them invisible to humans | No | Yes | Unknown | +| [UrlBae](https://urlbae.com/developers) | Simple and efficient short link creation | `apiKey` | Yes | Yes | **[⬆ Back to Index](#index)** ### Vehicle API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| -| [Brazilian Vehicles and Prices](https://deividfortuna.github.io/fipe/) | Vehicles information from Fundação Instituto de Pesquisas Econômicas - Fipe | No | Yes | Unknown | +| [Brazilian Vehicles and Prices](https://deividfortuna.github.io/fipe/) | Vehicles information from Fundação Instituto de Pesquisas Econômicas - Fipe | No | Yes | No | | [Helipaddy sites](https://helipaddy.com/api/) | Helicopter and passenger drone landing site directory, Helipaddy data and much more | `apiKey` | Yes | Unknown | | [Kelley Blue Book](http://developer.kbb.com/#!/data/1-Default) | Vehicle info, pricing, configuration, plus much more | `apiKey` | Yes | No | | [Mercedes-Benz](https://developer.mercedes-benz.com/apis) | Telematics data, remotely access vehicle functions, car configurator, locate service dealers | `apiKey` | Yes | No | @@ -1688,6 +1748,7 @@ API | Description | Auth | HTTPS | CORS | API | Description | Auth | HTTPS | CORS | |---|---|---|---|---| | [An API of Ice And Fire](https://anapioficeandfire.com/) | Game Of Thrones API | No | Yes | Unknown | +| [Bob's Burgers](https://bobs-burgers-api-ui.herokuapp.com) | Bob's Burgers API | No | Yes | Yes | | [Breaking Bad](https://breakingbadapi.com/documentation) | Breaking Bad API | No | Yes | Unknown | | [Breaking Bad Quotes](https://github.com/shevabam/breaking-bad-quotes) | Some Breaking Bad quotes | No | Yes | Unknown | | [Catalogopolis](https://api.catalogopolis.xyz/docs/) | Doctor Who API | No | Yes | Unknown | @@ -1703,13 +1764,16 @@ API | Description | Auth | HTTPS | CORS | | [JSON2Video](https://json2video.com) | Create and edit videos programmatically: watermarks,resizing,slideshows,voice-over,text animations | `apiKey` | Yes | No | | [Lucifer Quotes](https://github.com/shadowoff09/lucifer-quotes) | Returns Lucifer quotes | No | Yes | Unknown | | [MCU Countdown](https://github.com/DiljotSG/MCU-Countdown) | A Countdown to the next MCU Film | No | Yes | Yes | +| [Motivational Quotes](https://nodejs-quoteapp.herokuapp.com/) | Random Motivational Quotes | No | Yes | Unknown | | [Movie Quote](https://github.com/F4R4N/movie-quote/) | Random Movie and Series Quotes | No | Yes | Yes | | [Open Movie Database](http://www.omdbapi.com/) | Movie information | `apiKey` | Yes | Unknown | +| [Owen Wilson Wow](https://owen-wilson-wow-api.herokuapp.com) | API for actor Owen Wilson's "wow" exclamations in movies | No | Yes | Yes | | [Ron Swanson Quotes](https://github.com/jamesseanwright/ron-swanson-quotes#ron-swanson-quotes-api) | Television | No | Yes | Unknown | | [Simkl](https://simkl.docs.apiary.io) | Movie, TV and Anime data | `apiKey` | Yes | Unknown | | [STAPI](http://stapi.co) | Information on all things Star Trek | No | No | No | | [Stranger Things Quotes](https://github.com/shadowoff09/strangerthings-quotes) | Returns Stranger Things quotes | No | Yes | Unknown | | [Stream](https://api.stream.cz/graphiql) | Czech internet television, films, series and online videos for free | No | Yes | No | +| [Stromberg Quotes](https://www.stromberg-api.de/) | Returns Stromberg quotes and more | No | Yes | Unknown | | [SWAPI](https://swapi.dev/) | All the Star Wars data you've ever wanted | No | Yes | Yes | | [SWAPI](https://www.swapi.tech) | All things Star Wars | No | Yes | Yes | | [SWAPI GraphQL](https://graphql.org/swapi-graphql) | Star Wars GraphQL API | No | Yes | Unknown | @@ -1718,13 +1782,13 @@ API | Description | Auth | HTTPS | CORS | | [ThronesApi](https://thronesapi.com/) | Game Of Thrones Characters Data with imagery | No | Yes | Unknown | | [TMDb](https://www.themoviedb.org/documentation/api) | Community-based movie data | `apiKey` | Yes | Unknown | | [TrailerAddict](https://www.traileraddict.com/trailerapi) | Easily embed trailers from TrailerAddict | `apiKey` | No | Unknown | -| [Trakt](https://trakt.tv/b/api-docs) | Movie and TV Data | `apiKey` | Yes | Yes | -| [TVDB](https://api.thetvdb.com/swagger) | Television data | `apiKey` | Yes | Unknown | +| [Trakt](https://trakt.docs.apiary.io/) | Movie and TV Data | `apiKey` | Yes | Yes | +| [TVDB](https://thetvdb.com/api-information) | Television data | `apiKey` | Yes | Unknown | | [TVMaze](http://www.tvmaze.com/api) | TV Show Data | No | No | Unknown | | [uNoGS](https://rapidapi.com/unogs/api/unogsng) | Unofficial Netflix Online Global Search, Search all netflix regions in one place | `apiKey` | Yes | Yes | -| [Utelly](https://rapidapi.com/utelly/api/utelly) | Movies, Series and TV shows Recommendations | `apiKey` | Yes | Unknown | | [Vimeo](https://developer.vimeo.com/) | Vimeo Developer API | `OAuth` | Yes | Unknown | | [Watchmode](https://api.watchmode.com/) | API for finding out the streaming availability of movies & shows | `apiKey` | Yes | Unknown | +| [Web Series Quotes Generator](https://github.com/yogeshwaran01/web-series-quotes) | API generates various Web Series Quote Images | No | Yes | Yes | | [YouTube](https://developers.google.com/youtube/) | Add YouTube functionality to your sites and apps | `OAuth` | Yes | Unknown | **[⬆ Back to Index](#index)** @@ -1754,16 +1818,13 @@ API | Description | Auth | HTTPS | CORS | | [OpenWeatherMap](https://openweathermap.org/api) | Weather | `apiKey` | Yes | Unknown | | [QWeather](https://dev.qweather.com/en/) | Location-based weather data | `apiKey` | Yes | Yes | | [RainViewer](https://www.rainviewer.com/api.html) | Radar data collected from different websites across the Internet | No | Yes | Unknown | -| [SimpleWeather](https://english.api.rakuten.net/mxrck/api/simple-weather/endpoints) | Simple tool for get current weather | `apiKey` | Yes | Yes | | [Storm Glass](https://stormglass.io/) | Global marine weather from multiple sources | `apiKey` | Yes | Yes | | [Tomorrow](https://docs.tomorrow.io) | Weather API Powered by Proprietary Technology | `apiKey` | Yes | Unknown | -| [Troposphere](https://www.troposphere.io/developer) | Global weather and climate data | `apiKey` | Yes | Yes | | [US Weather](https://www.weather.gov/documentation/services-web-api) | US National Weather Service | No | Yes | Yes | | [Visual Crossing](https://www.visualcrossing.com/weather-api) | Global historical and weather forecast data | `apiKey` | Yes | Yes | | [weather-api](https://github.com/robertoduessmann/weather-api) | A RESTful free API to check the weather | No | Yes | No | | [WeatherAPI](https://www.weatherapi.com/) | Weather API with other stuff like Astronomy and Geolocation API | `apiKey` | Yes | Yes | | [Weatherbit](https://www.weatherbit.io/api) | Weather | `apiKey` | Yes | Unknown | -| [Yahoo Weather](https://developer.yahoo.com/weather/) | Weather API from Yahoo | `OAuth` | Yes | Unknown | | [Yandex.Weather](https://yandex.com/dev/weather/) | Assesses weather condition in specific locations | `apiKey` | Yes | No | **[⬆ Back to Index](#index)** @@ -1771,4 +1832,4 @@ API | Description | Auth | HTTPS | CORS |
## License -[MIT](LICENSE) +[MIT](LICENSE) (c) 2022 public-apis diff --git a/build/requirements.txt b/build/requirements.txt deleted file mode 100644 index ebed23a8..00000000 --- a/build/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -flake8>=3.5.0 -httplib2==0.19.0 diff --git a/build/validate_format.py b/build/validate_format.py deleted file mode 100755 index 4610f379..00000000 --- a/build/validate_format.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python3 - -import re -import sys - -anchor = '###' -min_entries_per_section = 3 -auth_keys = ['apiKey', 'OAuth', 'X-Mashape-Key', 'No', 'User-Agent'] -punctuation = ['.', '?', '!'] -https_keys = ['Yes', 'No'] -cors_keys = ['Yes', 'No', 'Unknown'] - -index_title = 0 -index_desc = 1 -index_auth = 2 -index_https = 3 -index_cors = 4 -index_link = 5 -num_segments = 5 - -errors = [] -title_links = [] -anchor_re = re.compile(anchor + '\s(.+)') -section_title_re = re.compile('\*\s\[(.*)\]') -link_re = re.compile('\[(.+)\]\((http.*)\)') - - -def add_error(line_num, message): - """adds an error to the dynamic error list""" - err = '(L{:03d}) {}'.format(line_num + 1, message) - errors.append(err) - - -def check_alphabetical(lines): - """ - checks if all entries per section are in alphabetical order based in entry title - """ - sections = {} - section_line_num = {} - for line_num, line in enumerate(lines): - if line.startswith(anchor): - category = line.split(anchor)[1].strip() - sections[category] = [] - section_line_num[category] = line_num - continue - if not line.startswith('|') or line.startswith('|---'): - continue - raw_title = [x.strip() for x in line.split('|')[1:-1]][0] - title_re_match = link_re.match(raw_title) - if title_re_match: - sections[category].append(title_re_match.group(1).upper()) - - for category, entries in sections.items(): - if sorted(entries) != entries: - add_error(section_line_num[category], "{} section is not in alphabetical order".format(category)) - - -def check_entry(line_num, segments): - # START Title - raw_title = segments[index_title] - title_re_match = link_re.match(raw_title) - # url should be wrapped in '[TITLE](LINK)' Markdown syntax - if not title_re_match: - add_error(line_num, 'Title syntax should be "[TITLE](LINK)"') - else: - # do not allow "... API" in the entry title - title = title_re_match.group(1) - if title.upper().endswith(' API'): - add_error(line_num, 'Title should not end with "... API". Every entry is an API here!') - # END Title - # START Description - # first character should be capitalized - char = segments[index_desc][0] - if char.upper() != char: - add_error(line_num, "first character of description is not capitalized") - # last character should not punctuation - char = segments[index_desc][-1] - if char in punctuation: - add_error(line_num, "description should not end with {}".format(char)) - desc_length = len(segments[index_desc]) - if desc_length > 100: - add_error(line_num, "description should not exceed 100 characters (currently {})".format(desc_length)) - # END Description - # START Auth - # values should conform to valid options only - auth = segments[index_auth] - if auth != 'No' and (not auth.startswith('`') or not auth.endswith('`')): - add_error(line_num, "auth value is not enclosed with `backticks`") - if auth.replace('`', '') not in auth_keys: - add_error(line_num, "{} is not a valid Auth option".format(auth)) - # END Auth - # START HTTPS - # values should conform to valid options only - https = segments[index_https] - if https not in https_keys: - add_error(line_num, "{} is not a valid HTTPS option".format(https)) - # END HTTPS - # START CORS - # values should conform to valid options only - cors = segments[index_cors] - if cors not in cors_keys: - add_error(line_num, "{} is not a valid CORS option".format(cors)) - # END CORS - - -def check_format(filename): - """ - validates that each line is formatted correctly, - appending to error list as needed - """ - with open(filename) as fp: - lines = list(line.rstrip() for line in fp) - check_alphabetical(lines) - # START Check Entries - num_in_category = min_entries_per_section + 1 - category = "" - category_line = 0 - for line_num, line in enumerate(lines): - if section_title_re.match(line): - title_links.append(section_title_re.match(line).group(1)) - # check each section for the minimum number of entries - if line.startswith(anchor): - match = anchor_re.match(line) - if match: - if match.group(1) not in title_links: - add_error(line_num, "section header ({}) not added as a title link".format(match.group(1))) - else: - add_error(line_num, "section header is not formatted correctly") - if num_in_category < min_entries_per_section: - add_error(category_line, "{} section does not have the minimum {} entries (only has {})".format( - category, min_entries_per_section, num_in_category)) - category = line.split(' ')[1] - category_line = line_num - num_in_category = 0 - continue - # skips lines that we do not care about - if not line.startswith('|') or line.startswith('|---'): - continue - num_in_category += 1 - segments = line.split('|')[1:-1] - if len(segments) < num_segments: - add_error(line_num, "entry does not have all the required sections (have {}, need {})".format( - len(segments), num_segments)) - continue - # START Global - for segment in segments: - # every line segment should start and end with exactly 1 space - if len(segment) - len(segment.lstrip()) != 1 or len(segment) - len(segment.rstrip()) != 1: - add_error(line_num, "each segment must start and end with exactly 1 space") - # END Global - segments = [seg.strip() for seg in segments] - check_entry(line_num, segments) - # END Check Entries - - -def main(): - if len(sys.argv) < 2: - print("No file passed (file should contain Markdown table syntax)") - sys.exit(1) - check_format(sys.argv[1]) - if len(errors) > 0: - for err in errors: - print(err) - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 00000000..2e926a37 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,75 @@ +# Public APIs Scripts + +This directory contains all validation and testing scripts used by Public APIs. + +```bash +scripts +│ github_pull_request.sh # used to validate changes of a pull request +│ requirements.txt # contains dependencies of validate package +│ +├───tests # contains all unit tests from the validate package +│ test_validate_format.py +│ test_validate_links.py +│ +└───validate # validate package + format.py + links.py +``` + +## Install dependencies + +You must have [python](https://www.python.org/) installed to use these scripts. + +it is also necessary to install the validation package dependencies, use [pip package manager](https://pypi.org/project/pip/) for this: + +```bash +$ python -m pip install -r scripts/requirements.txt +``` + +## Run validations + +To run format validation on the `README.md` file, being in the root directory of public-apis, run: + +```bash +$ python scripts/validate/format.py README.md +``` + +To run link validation on the `README.md` file, being in the root directory of public-apis, run: + +```bash +$ python scripts/validate/links.py README.md +``` + +As there are many links to check, this process can take some time. If your goal is not to check if the links are working, you can only check for duplicate links. Run: + +```bash +$ python scripts/validate/links.py README.md -odlc +``` + +*`-odlc` is an abbreviation of `--only_duplicate_links_checker`* + +## Running Tests + +To run all tests it is necessary to change to the scripts directory: + +```bash +$ cd scripts +``` + +then run: + +```bash +$ python -m unittest discover tests/ --verbose +``` + +To run only the format tests, run: + +```bash +$ python -m unittest discover tests/ --verbose --pattern "test_validate_format.py" +``` + +To run only the links tests, run: + +```bash +$ python -m unittest discover tests/ --verbose --pattern "test_validate_links.py" +``` diff --git a/build/github-pull.sh b/scripts/github_pull_request.sh similarity index 75% rename from build/github-pull.sh rename to scripts/github_pull_request.sh index 4c5c3a4b..7dd7fa0f 100755 --- a/build/github-pull.sh +++ b/scripts/github_pull_request.sh @@ -4,20 +4,20 @@ set -e # Argument validation if [ $# -ne 3 ]; then - echo "Usage: $0 " + echo "Usage: $0 " exit 1 fi # Assign variables GITHUB_REPOSITORY="$1" GITHUB_PULL_REQUEST="$2" -FORMAT_FILE="$3" +FILENAME="$3" # Move to root of project cd "$GITHUB_WORKSPACE" # Determine files -FORMAT_FILE="$( realpath "${FORMAT_FILE}" )" +FILENAME="$( realpath "${FILENAME}" )" # Skip if build number could not be determined if [ -z "$GITHUB_REPOSITORY" -o -z "$GITHUB_PULL_REQUEST" ]; then @@ -31,7 +31,7 @@ echo "running on Pull Request #$GITHUB_PULL_REQUEST" # Trick the URL validator python script into not seeing this as a URL DUMMY_SCHEME="https" DIFF_URL="$DUMMY_SCHEME://patch-diff.githubusercontent.com/raw/$GITHUB_REPOSITORY/pull/$GITHUB_PULL_REQUEST.diff" -curl -L -o diff.txt "$DIFF_URL" +curl -L "$DIFF_URL" -o diff.txt # Construct diff echo "------- BEGIN DIFF -------" @@ -45,13 +45,13 @@ echo "------- END ADDITIONS ------" LINK_FILE=additions.txt # Validate links -echo "Running link validation..." -./build/validate_links.py "$LINK_FILE" +echo "Running link validation on additions..." +python scripts/validate/links.py "$LINK_FILE" # Vebosity if [[ $? != 0 ]]; then - echo "link validation failed!" + echo "link validation failed on additions!" exit 1 else - echo "link validation passed!" + echo "link validation passed on additions!" fi diff --git a/scripts/requirements.txt b/scripts/requirements.txt new file mode 100644 index 00000000..9b0cb453 --- /dev/null +++ b/scripts/requirements.txt @@ -0,0 +1,5 @@ +certifi==2021.10.8 +charset-normalizer==2.0.10 +idna==3.3 +requests==2.27.1 +urllib3==1.26.8 diff --git a/scripts/tests/__init__.py b/scripts/tests/__init__.py new file mode 100644 index 00000000..40a96afc --- /dev/null +++ b/scripts/tests/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/scripts/tests/test_validate_format.py b/scripts/tests/test_validate_format.py new file mode 100644 index 00000000..7cf55604 --- /dev/null +++ b/scripts/tests/test_validate_format.py @@ -0,0 +1,466 @@ +# -*- coding: utf-8 -*- + +import unittest + +from validate.format import error_message +from validate.format import get_categories_content +from validate.format import check_alphabetical_order +from validate.format import check_title +from validate.format import check_description, max_description_length +from validate.format import check_auth, auth_keys +from validate.format import check_https, https_keys +from validate.format import check_cors, cors_keys +from validate.format import check_entry +from validate.format import check_file_format, min_entries_per_category, num_segments + + +class TestValidadeFormat(unittest.TestCase): + + def test_error_message_return_and_return_type(self): + line_num_unity = 1 + line_num_ten = 10 + line_num_hundred = 100 + line_num_thousand = 1000 + + msg = 'This is a unit test' + + err_msg_unity = error_message(line_num_unity, msg) + err_msg_ten = error_message(line_num_ten, msg) + err_msg_hundred = error_message(line_num_hundred, msg) + err_msg_thousand = error_message(line_num_thousand, msg) + + self.assertIsInstance(err_msg_unity, str) + self.assertIsInstance(err_msg_ten, str) + self.assertIsInstance(err_msg_hundred, str) + self.assertIsInstance(err_msg_thousand, str) + + self.assertEqual(err_msg_unity, '(L002) This is a unit test') + self.assertEqual(err_msg_ten, '(L011) This is a unit test') + self.assertEqual(err_msg_hundred, '(L101) This is a unit test') + self.assertEqual(err_msg_thousand, '(L1001) This is a unit test') + + def test_if_get_categories_content_return_correct_data_of_categories(self): + fake_contents = [ + '### A', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [AA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [AB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '', + '### B', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [BA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [BB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |' + ] + + result = get_categories_content(fake_contents) + self.assertIsInstance(result, tuple) + + categories, category_line_num = result + self.assertIsInstance(categories, dict) + self.assertIsInstance(category_line_num, dict) + + expected_result = ({'A': ['AA', 'AB'], 'B': ['BA', 'BB']}, {'A': 0, 'B': 6}) + + for res, ex_res in zip(result, expected_result): + + with self.subTest(): + self.assertEqual(res, ex_res) + + def test_if_check_alphabetical_order_return_correct_msg_error(self): + correct_lines = [ + '### A', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [AA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [AB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '', + '### B', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [BA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [BB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |' + ] + + incorrect_lines = [ + '### A', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [AB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [AA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '', + '### B', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [BB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [BA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |' + ] + + + err_msgs_1 = check_alphabetical_order(correct_lines) + err_msgs_2 = check_alphabetical_order(incorrect_lines) + + self.assertIsInstance(err_msgs_1, list) + self.assertIsInstance(err_msgs_2, list) + + self.assertEqual(len(err_msgs_1), 0) + self.assertEqual(len(err_msgs_2), 2) + + expected_err_msgs = [ + '(L001) A category is not alphabetical order', + '(L007) B category is not alphabetical order' + ] + + for err_msg, ex_err_msg in zip(err_msgs_2, expected_err_msgs): + + with self.subTest(): + self.assertEqual(err_msg, ex_err_msg) + + def test_check_title_with_correct_title(self): + raw_title = '[A](https://www.ex.com)' + + err_msgs = check_title(0, raw_title) + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 0) + self.assertEqual(err_msgs, []) + + def test_check_title_with_markdown_syntax_incorrect(self): + raw_title = '[A(https://www.ex.com)' + + err_msgs = check_title(0, raw_title) + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + + err_msg = err_msgs[0] + expected_err_msg = '(L001) Title syntax should be "[TITLE](LINK)"' + + self.assertEqual(err_msg, expected_err_msg) + + def test_check_title_with_api_at_the_end_of_the_title(self): + raw_title = '[A API](https://www.ex.com)' + + err_msgs = check_title(0, raw_title) + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + + err_msg = err_msgs[0] + expected_err_msg = '(L001) Title should not end with "... API". Every entry is an API here!' + + self.assertEqual(err_msg, expected_err_msg) + + def test_check_description_with_correct_description(self): + desc = 'This is a fake description' + + err_msgs = check_description(0, desc) + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 0) + self.assertEqual(err_msgs, []) + + def test_check_description_with_first_char_is_not_capitalized(self): + desc = 'this is a fake description' + + err_msgs = check_description(0, desc) + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + + err_msg = err_msgs[0] + expected_err_msg = '(L001) first character of description is not capitalized' + + self.assertIsInstance(err_msg, str) + self.assertEqual(err_msg, expected_err_msg) + + def test_check_description_with_punctuation_in_the_end(self): + base_desc = 'This is a fake description' + punctuation = r"""!"#$%&'*+,-./:;<=>?@[\]^_`{|}~""" + desc_with_punc = [base_desc + punc for punc in punctuation] + + for desc in desc_with_punc: + + with self.subTest(): + err_msgs = check_description(0, desc) + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + + err_msg = err_msgs[0] + expected_err_msg = f'(L001) description should not end with {desc[-1]}' + + self.assertIsInstance(err_msg, str) + self.assertEqual(err_msg, expected_err_msg) + + def test_check_description_that_exceeds_the_character_limit(self): + long_desc = 'Desc' * max_description_length + long_desc_length = len(long_desc) + + err_msgs = check_description(0, long_desc) + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + + err_msg = err_msgs[0] + expected_err_msg = f'(L001) description should not exceed {max_description_length} characters (currently {long_desc_length})' + + self.assertIsInstance(err_msg, str) + self.assertEqual(err_msg, expected_err_msg) + + def test_check_auth_with_valid_auth(self): + auth_valid = [f'`{auth}`' for auth in auth_keys if auth != 'No'] + auth_valid.append('No') + + for auth in auth_valid: + with self.subTest(): + err_msgs = check_auth(0, auth) + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 0) + self.assertEqual(err_msgs, []) + + def test_check_auth_without_backtick(self): + auth_without_backtick = [auth for auth in auth_keys if auth != 'No'] + + for auth in auth_without_backtick: + with self.subTest(): + err_msgs = check_auth(0, auth) + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + + err_msg = err_msgs[0] + expected_err_msg = '(L001) auth value is not enclosed with `backticks`' + + self.assertIsInstance(err_msg, str) + self.assertEqual(err_msg, expected_err_msg) + + def test_check_auth_with_invalid_auth(self): + auth_invalid_without_backtick = ['Yes', 'yes', 'no', 'random', 'Unknown'] + auth_invalid_with_backtick = ['`Yes`', '`yes`', '`no`', '`random`', '`Unknown`'] + + for auth in auth_invalid_without_backtick: + with self.subTest(): + err_msgs = check_auth(0, auth) + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 2) + + err_msg_1 = err_msgs[0] + err_msg_2 = err_msgs[1] + + expected_err_msg_1 = f'(L001) auth value is not enclosed with `backticks`' + expected_err_msg_2 = f'(L001) {auth} is not a valid Auth option' + + self.assertIsInstance(err_msg_1, str) + self.assertIsInstance(err_msg_2, str) + self.assertEqual(err_msg_1, expected_err_msg_1) + self.assertEqual(err_msg_2, expected_err_msg_2) + + for auth in auth_invalid_with_backtick: + with self.subTest(): + err_msgs = check_auth(0, auth) + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + + err_msg = err_msgs[0] + expected_err_msg = f'(L001) {auth} is not a valid Auth option' + + self.assertIsInstance(err_msg, str) + self.assertEqual(err_msg, expected_err_msg) + + def test_check_https_with_valid_https(self): + for https in https_keys: + with self.subTest(): + err_msgs = check_https(0, https) + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 0) + self.assertEqual(err_msgs, []) + + def test_check_https_with_invalid_https(self): + invalid_https_keys = ['yes', 'no', 'Unknown', 'https', 'http'] + + for https in invalid_https_keys: + with self.subTest(): + err_msgs = check_https(0, https) + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + + err_msg = err_msgs[0] + expected_err_msg = f'(L001) {https} is not a valid HTTPS option' + + self.assertIsInstance(err_msg, str) + self.assertEqual(err_msg, expected_err_msg) + + def test_check_cors_with_valid_cors(self): + for cors in cors_keys: + with self.subTest(): + err_msgs = check_cors(0, cors) + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 0) + self.assertEqual(err_msgs, []) + + def test_check_cors_with_invalid_cors(self): + invalid_cors_keys = ['yes', 'no', 'unknown', 'cors'] + + for cors in invalid_cors_keys: + with self.subTest(): + err_msgs = check_cors(0, cors) + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + + err_msg = err_msgs[0] + expected_err_msg = f'(L001) {cors} is not a valid CORS option' + + self.assertIsInstance(err_msg, str) + self.assertEqual(err_msg, expected_err_msg) + + def test_check_entry_with_correct_segments(self): + correct_segments = ['[A](https://www.ex.com)', 'Desc', '`apiKey`', 'Yes', 'Yes'] + + err_msgs = check_entry(0, correct_segments) + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 0) + self.assertEqual(err_msgs, []) + + def test_check_entry_with_incorrect_segments(self): + incorrect_segments = ['[A API](https://www.ex.com)', 'desc.', 'yes', 'yes', 'yes'] + + err_msgs = check_entry(0, incorrect_segments) + expected_err_msgs = [ + '(L001) Title should not end with "... API". Every entry is an API here!', + '(L001) first character of description is not capitalized', + '(L001) description should not end with .', + '(L001) auth value is not enclosed with `backticks`', + '(L001) yes is not a valid Auth option', + '(L001) yes is not a valid HTTPS option', + '(L001) yes is not a valid CORS option' + ] + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 7) + for err_msg in err_msgs: + with self.subTest(): + self.assertIsInstance(err_msg, str) + self.assertEqual(err_msgs, expected_err_msgs) + + def test_check_file_format_with_correct_format(self): + correct_format = [ + '## Index', + '* [A](#a)', + '* [B](#b)', + '', + '### A', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [AA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [AB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [AC](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '', + '### B', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [BA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [BB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [BC](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |' + ] + + err_msgs = check_file_format(lines=correct_format) + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 0) + self.assertEqual(err_msgs, []) + + def test_check_file_format_with_category_header_not_added_to_index(self): + incorrect_format = [ + '## Index', + '', + '### A', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [AA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [AB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [AC](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + ] + + err_msgs = check_file_format(lines=incorrect_format) + expected_err_msg = '(L003) category header (A) not added to Index section' + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + err_msg = err_msgs[0] + self.assertEqual(err_msg, expected_err_msg) + + def test_check_file_format_with_category_without_min_entries(self): + incorrect_format = [ + '## Index', + '* [A](#a)', + '* [B](#b)', + '', + '### A', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [AA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '', + '### B', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [BA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [BB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [BC](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |' + ] + + category_with_err = 'A' + num_in_category = 1 + + err_msgs = check_file_format(lines=incorrect_format) + expected_err_msg = f'(L005) {category_with_err} category does not have the minimum {min_entries_per_category} entries (only has {num_in_category})' + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + err_msg = err_msgs[0] + self.assertEqual(err_msg, expected_err_msg) + + def test_check_file_format_entry_without_all_necessary_columns(self): + incorrect_format = [ + '## Index', + '* [A](#a)', + '', + '### A', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [AA](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [AB](https://www.ex.com) | Desc | `apiKey` |', # missing https and cors + '| [AC](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + ] + + current_segments_num = 3 + + err_msgs = check_file_format(lines=incorrect_format) + expected_err_msg = f'(L008) entry does not have all the required columns (have {current_segments_num}, need {num_segments})' + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + err_msg = err_msgs[0] + self.assertEqual(err_msg, expected_err_msg) + + def test_check_file_format_without_1_space_between_the_segments(self): + incorrect_format = [ + '## Index', + '* [A](#a)', + '', + '### A', + 'API | Description | Auth | HTTPS | CORS |', + '|---|---|---|---|---|', + '| [AA](https://www.ex.com) | Desc |`apiKey`| Yes | Yes |', # space between segment of auth column missing + '| [AB](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + '| [AC](https://www.ex.com) | Desc | `apiKey` | Yes | Yes |', + ] + + err_msgs = check_file_format(lines=incorrect_format) + expected_err_msg = f'(L007) each segment must start and end with exactly 1 space' + + self.assertIsInstance(err_msgs, list) + self.assertEqual(len(err_msgs), 1) + err_msg = err_msgs[0] + self.assertEqual(err_msg, expected_err_msg) diff --git a/scripts/tests/test_validate_links.py b/scripts/tests/test_validate_links.py new file mode 100644 index 00000000..64eae888 --- /dev/null +++ b/scripts/tests/test_validate_links.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- + +import unittest + +from validate.links import find_links_in_text +from validate.links import check_duplicate_links +from validate.links import fake_user_agent +from validate.links import get_host_from_link +from validate.links import has_cloudflare_protection + + +class FakeResponse(): + def __init__(self, code: int, headers: dict, text: str) -> None: + self.status_code = code + self.headers = headers + self.text = text + + +class TestValidateLinks(unittest.TestCase): + + def setUp(self): + self.duplicate_links = [ + 'https://www.example.com', + 'https://www.example.com', + 'https://www.example.com', + 'https://www.anotherexample.com', + ] + self.no_duplicate_links = [ + 'https://www.firstexample.com', + 'https://www.secondexample.com', + 'https://www.anotherexample.com', + ] + + self.code_200 = 200 + self.code_403 = 403 + self.code_503 = 503 + + self.cloudflare_headers = {'Server': 'cloudflare'} + self.no_cloudflare_headers = {'Server': 'google'} + + self.text_with_cloudflare_flags = '403 Forbidden Cloudflare We are checking your browser...' + self.text_without_cloudflare_flags = 'Lorem Ipsum' + + def test_find_link_in_text(self): + text = """ + # this is valid + + http://example.com?param1=1¶m2=2#anchor + https://www.example.com?param1=1¶m2=2#anchor + https://www.example.com.br + https://www.example.com.gov.br + [Example](https://www.example.com?param1=1¶m2=2#anchor) + lorem ipsum https://www.example.com?param1=1¶m2=2#anchor + https://www.example.com?param1=1¶m2=2#anchor lorem ipsum + + # this not is valid + + example.com + https:example.com + https:/example.com + https//example.com + https//.com + """ + + links = find_links_in_text(text) + + self.assertIsInstance(links, list) + self.assertEqual(len(links), 7) + + for link in links: + with self.subTest(): + self.assertIsInstance(link, str) + + def test_find_link_in_text_with_invalid_argument(self): + with self.assertRaises(TypeError): + find_links_in_text() + find_links_in_text(1) + find_links_in_text(True) + + def test_if_check_duplicate_links_has_the_correct_return(self): + result_1 = check_duplicate_links(self.duplicate_links) + result_2 = check_duplicate_links(self.no_duplicate_links) + + self.assertIsInstance(result_1, tuple) + self.assertIsInstance(result_2, tuple) + + has_duplicate_links, links = result_1 + no_duplicate_links, no_links = result_2 + + self.assertTrue(has_duplicate_links) + self.assertFalse(no_duplicate_links) + + self.assertIsInstance(links, list) + self.assertIsInstance(no_links, list) + + self.assertEqual(len(links), 2) + self.assertEqual(len(no_links), 0) + + def test_if_fake_user_agent_has_a_str_as_return(self): + user_agent = fake_user_agent() + self.assertIsInstance(user_agent, str) + + def test_get_host_from_link(self): + links = [ + 'example.com', + 'https://example.com', + 'https://www.example.com', + 'https://www.example.com.br', + 'https://www.example.com/route', + 'https://www.example.com?p=1&q=2', + 'https://www.example.com#anchor' + ] + + for link in links: + host = get_host_from_link(link) + + with self.subTest(): + self.assertIsInstance(host, str) + + self.assertNotIn('://', host) + self.assertNotIn('/', host) + self.assertNotIn('?', host) + self.assertNotIn('#', host) + + with self.assertRaises(TypeError): + get_host_from_link() + + def test_has_cloudflare_protection_with_code_403_and_503_in_response(self): + resp_with_cloudflare_protection_code_403 = FakeResponse( + code=self.code_403, + headers=self.cloudflare_headers, + text=self.text_with_cloudflare_flags + ) + + resp_with_cloudflare_protection_code_503 = FakeResponse( + code=self.code_503, + headers=self.cloudflare_headers, + text=self.text_with_cloudflare_flags + ) + + result1 = has_cloudflare_protection(resp_with_cloudflare_protection_code_403) + result2 = has_cloudflare_protection(resp_with_cloudflare_protection_code_503) + + self.assertTrue(result1) + self.assertTrue(result2) + + def test_has_cloudflare_protection_when_there_is_no_protection(self): + resp_without_cloudflare_protection1 = FakeResponse( + code=self.code_200, + headers=self.no_cloudflare_headers, + text=self.text_without_cloudflare_flags + ) + + resp_without_cloudflare_protection2 = FakeResponse( + code=self.code_403, + headers=self.no_cloudflare_headers, + text=self.text_without_cloudflare_flags + ) + + resp_without_cloudflare_protection3 = FakeResponse( + code=self.code_503, + headers=self.no_cloudflare_headers, + text=self.text_without_cloudflare_flags + ) + + result1 = has_cloudflare_protection(resp_without_cloudflare_protection1) + result2 = has_cloudflare_protection(resp_without_cloudflare_protection2) + result3 = has_cloudflare_protection(resp_without_cloudflare_protection3) + + self.assertFalse(result1) + self.assertFalse(result2) + self.assertFalse(result3) diff --git a/scripts/validate/__init__.py b/scripts/validate/__init__.py new file mode 100644 index 00000000..4287dcc8 --- /dev/null +++ b/scripts/validate/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from validate import format +from validate import links diff --git a/scripts/validate/format.py b/scripts/validate/format.py new file mode 100644 index 00000000..092595dc --- /dev/null +++ b/scripts/validate/format.py @@ -0,0 +1,277 @@ +# -*- coding: utf-8 -*- + +import re +import sys +from string import punctuation +from typing import List, Tuple, Dict + +# Temporary replacement +# The descriptions that contain () at the end must adapt to the new policy later +punctuation = punctuation.replace('()', '') + +anchor = '###' +auth_keys = ['apiKey', 'OAuth', 'X-Mashape-Key', 'User-Agent', 'No'] +https_keys = ['Yes', 'No'] +cors_keys = ['Yes', 'No', 'Unknown'] + +index_title = 0 +index_desc = 1 +index_auth = 2 +index_https = 3 +index_cors = 4 + +num_segments = 5 +min_entries_per_category = 3 +max_description_length = 100 + +anchor_re = re.compile(anchor + '\s(.+)') +category_title_in_index_re = re.compile('\*\s\[(.*)\]') +link_re = re.compile('\[(.+)\]\((http.*)\)') + +# Type aliases +APIList = List[str] +Categories = Dict[str, APIList] +CategoriesLineNumber = Dict[str, int] + + +def error_message(line_number: int, message: str) -> str: + line = line_number + 1 + return f'(L{line:03d}) {message}' + + +def get_categories_content(contents: List[str]) -> Tuple[Categories, CategoriesLineNumber]: + + categories = {} + category_line_num = {} + + for line_num, line_content in enumerate(contents): + + if line_content.startswith(anchor): + category = line_content.split(anchor)[1].strip() + categories[category] = [] + category_line_num[category] = line_num + continue + + if not line_content.startswith('|') or line_content.startswith('|---'): + continue + + raw_title = [ + raw_content.strip() for raw_content in line_content.split('|')[1:-1] + ][0] + + title_match = link_re.match(raw_title) + if title_match: + title = title_match.group(1).upper() + categories[category].append(title) + + return (categories, category_line_num) + + +def check_alphabetical_order(lines: List[str]) -> List[str]: + + err_msgs = [] + + categories, category_line_num = get_categories_content(contents=lines) + + for category, api_list in categories.items(): + if sorted(api_list) != api_list: + err_msg = error_message( + category_line_num[category], + f'{category} category is not alphabetical order' + ) + err_msgs.append(err_msg) + + return err_msgs + + +def check_title(line_num: int, raw_title: str) -> List[str]: + + err_msgs = [] + + title_match = link_re.match(raw_title) + + # url should be wrapped in "[TITLE](LINK)" Markdown syntax + if not title_match: + err_msg = error_message(line_num, 'Title syntax should be "[TITLE](LINK)"') + err_msgs.append(err_msg) + else: + # do not allow "... API" in the entry title + title = title_match.group(1) + if title.upper().endswith(' API'): + err_msg = error_message(line_num, 'Title should not end with "... API". Every entry is an API here!') + err_msgs.append(err_msg) + + return err_msgs + + +def check_description(line_num: int, description: str) -> List[str]: + + err_msgs = [] + + first_char = description[0] + if first_char.upper() != first_char: + err_msg = error_message(line_num, 'first character of description is not capitalized') + err_msgs.append(err_msg) + + last_char = description[-1] + if last_char in punctuation: + err_msg = error_message(line_num, f'description should not end with {last_char}') + err_msgs.append(err_msg) + + desc_length = len(description) + if desc_length > max_description_length: + err_msg = error_message(line_num, f'description should not exceed {max_description_length} characters (currently {desc_length})') + err_msgs.append(err_msg) + + return err_msgs + + +def check_auth(line_num: int, auth: str) -> List[str]: + + err_msgs = [] + + backtick = '`' + if auth != 'No' and (not auth.startswith(backtick) or not auth.endswith(backtick)): + err_msg = error_message(line_num, 'auth value is not enclosed with `backticks`') + err_msgs.append(err_msg) + + if auth.replace(backtick, '') not in auth_keys: + err_msg = error_message(line_num, f'{auth} is not a valid Auth option') + err_msgs.append(err_msg) + + return err_msgs + + +def check_https(line_num: int, https: str) -> List[str]: + + err_msgs = [] + + if https not in https_keys: + err_msg = error_message(line_num, f'{https} is not a valid HTTPS option') + err_msgs.append(err_msg) + + return err_msgs + + +def check_cors(line_num: int, cors: str) -> List[str]: + + err_msgs = [] + + if cors not in cors_keys: + err_msg = error_message(line_num, f'{cors} is not a valid CORS option') + err_msgs.append(err_msg) + + return err_msgs + + +def check_entry(line_num: int, segments: List[str]) -> List[str]: + + raw_title = segments[index_title] + description = segments[index_desc] + auth = segments[index_auth] + https = segments[index_https] + cors = segments[index_cors] + + title_err_msgs = check_title(line_num, raw_title) + desc_err_msgs = check_description(line_num, description) + auth_err_msgs = check_auth(line_num, auth) + https_err_msgs = check_https(line_num, https) + cors_err_msgs = check_cors(line_num, cors) + + err_msgs = [ + *title_err_msgs, + *desc_err_msgs, + *auth_err_msgs, + *https_err_msgs, + *cors_err_msgs + ] + + return err_msgs + + +def check_file_format(lines: List[str]) -> List[str]: + + err_msgs = [] + category_title_in_index = [] + + alphabetical_err_msgs = check_alphabetical_order(lines) + err_msgs.extend(alphabetical_err_msgs) + + num_in_category = min_entries_per_category + 1 + category = '' + category_line = 0 + + for line_num, line_content in enumerate(lines): + + category_title_match = category_title_in_index_re.match(line_content) + if category_title_match: + category_title_in_index.append(category_title_match.group(1)) + + # check each category for the minimum number of entries + if line_content.startswith(anchor): + category_match = anchor_re.match(line_content) + if category_match: + if category_match.group(1) not in category_title_in_index: + err_msg = error_message(line_num, f'category header ({category_match.group(1)}) not added to Index section') + err_msgs.append(err_msg) + else: + err_msg = error_message(line_num, 'category header is not formatted correctly') + err_msgs.append(err_msg) + + if num_in_category < min_entries_per_category: + err_msg = error_message(category_line, f'{category} category does not have the minimum {min_entries_per_category} entries (only has {num_in_category})') + err_msgs.append(err_msg) + + category = line_content.split(' ')[1] + category_line = line_num + num_in_category = 0 + continue + + # skips lines that we do not care about + if not line_content.startswith('|') or line_content.startswith('|---'): + continue + + num_in_category += 1 + segments = line_content.split('|')[1:-1] + if len(segments) < num_segments: + err_msg = error_message(line_num, f'entry does not have all the required columns (have {len(segments)}, need {num_segments})') + err_msgs.append(err_msg) + continue + + for segment in segments: + # every line segment should start and end with exactly 1 space + if len(segment) - len(segment.lstrip()) != 1 or len(segment) - len(segment.rstrip()) != 1: + err_msg = error_message(line_num, 'each segment must start and end with exactly 1 space') + err_msgs.append(err_msg) + + segments = [segment.strip() for segment in segments] + entry_err_msgs = check_entry(line_num, segments) + err_msgs.extend(entry_err_msgs) + + return err_msgs + + +def main(filename: str) -> None: + + with open(filename, mode='r', encoding='utf-8') as file: + lines = list(line.rstrip() for line in file) + + file_format_err_msgs = check_file_format(lines) + + if file_format_err_msgs: + for err_msg in file_format_err_msgs: + print(err_msg) + sys.exit(1) + + +if __name__ == '__main__': + + num_args = len(sys.argv) + + if num_args < 2: + print('No .md file passed (file should contain Markdown table syntax)') + sys.exit(1) + + filename = sys.argv[1] + + main(filename) diff --git a/scripts/validate/links.py b/scripts/validate/links.py new file mode 100644 index 00000000..9f808871 --- /dev/null +++ b/scripts/validate/links.py @@ -0,0 +1,273 @@ +# -*- coding: utf-8 -*- + +import re +import sys +import random +from typing import List, Tuple + +import requests +from requests.models import Response + + +def find_links_in_text(text: str) -> List[str]: + """Find links in a text and return a list of URLs.""" + + link_pattern = re.compile(r'((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’]))') + + raw_links = re.findall(link_pattern, text) + + links = [ + str(raw_link[0]) for raw_link in raw_links + ] + + return links + + +def find_links_in_file(filename: str) -> List[str]: + """Find links in a file and return a list of URLs from text file.""" + + with open(filename, mode='r', encoding='utf-8') as file: + readme = file.read() + index_section = readme.find('## Index') + if index_section == -1: + index_section = 0 + content = readme[index_section:] + + links = find_links_in_text(content) + + return links + + +def check_duplicate_links(links: List[str]) -> Tuple[bool, List]: + """Check for duplicated links. + + Returns a tuple with True or False and duplicate list. + """ + + seen = {} + duplicates = [] + has_duplicate = False + + for link in links: + link = link.rstrip('/') + if link not in seen: + seen[link] = 1 + else: + if seen[link] == 1: + duplicates.append(link) + + if duplicates: + has_duplicate = True + + return (has_duplicate, duplicates) + + +def fake_user_agent() -> str: + """Faking user agent as some hosting services block not-whitelisted UA.""" + + user_agents = [ + 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko)', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36', + ] + + return random.choice(user_agents) + + +def get_host_from_link(link: str) -> str: + + host = link.split('://', 1)[1] if '://' in link else link + + # Remove routes, arguments and anchors + if '/' in host: + host = host.split('/', 1)[0] + + elif '?' in host: + host = host.split('?', 1)[0] + + elif '#' in host: + host = host.split('#', 1)[0] + + return host + + +def has_cloudflare_protection(resp: Response) -> bool: + """Checks if there is any cloudflare protection in the response. + + Cloudflare implements multiple network protections on a given link, + this script tries to detect if any of them exist in the response from request. + + Common protections have the following HTTP code as a response: + - 403: When host header is missing or incorrect (and more) + - 503: When DDOS protection exists + + See more about it at: + - https://support.cloudflare.com/hc/en-us/articles/115003014512-4xx-Client-Error + - https://support.cloudflare.com/hc/en-us/articles/115003011431-Troubleshooting-Cloudflare-5XX-errors + - https://www.cloudflare.com/ddos/ + - https://superuser.com/a/888526 + + Discussions in issues and pull requests: + - https://github.com/public-apis/public-apis/pull/2409 + - https://github.com/public-apis/public-apis/issues/2960 + """ + + code = resp.status_code + server = resp.headers.get('Server') or resp.headers.get('server') + cloudflare_flags = [ + '403 Forbidden', + 'cloudflare', + 'Cloudflare', + 'Security check', + 'Please Wait... | Cloudflare', + 'We are checking your browser...', + 'Please stand by, while we are checking your browser...', + 'Checking your browser before accessing', + 'This process is automatic.', + 'Your browser will redirect to your requested content shortly.', + 'Please allow up to 5 seconds', + 'DDoS protection by', + 'Ray ID:', + 'Cloudflare Ray ID:', + '_cf_chl', + '_cf_chl_opt', + '__cf_chl_rt_tk', + 'cf-spinner-please-wait', + 'cf-spinner-redirecting' + ] + + if code in [403, 503] and server == 'cloudflare': + html = resp.text + + flags_found = [flag in html for flag in cloudflare_flags] + any_flag_found = any(flags_found) + + if any_flag_found: + return True + + return False + + +def check_if_link_is_working(link: str) -> Tuple[bool, str]: + """Checks if a link is working. + + If an error is identified when the request for the link occurs, + the return will be a tuple with the first value True and the second + value a string containing the error message. + + If no errors are identified, the return will be a tuple with the + first value False and the second an empty string. + """ + + has_error = False + error_message = '' + + try: + resp = requests.get(link, timeout=25, headers={ + 'User-Agent': fake_user_agent(), + 'host': get_host_from_link(link) + }) + + code = resp.status_code + + if code >= 400 and not has_cloudflare_protection(resp): + has_error = True + error_message = f'ERR:CLT: {code} : {link}' + + except requests.exceptions.SSLError as error: + has_error = True + error_message = f'ERR:SSL: {error} : {link}' + + except requests.exceptions.ConnectionError as error: + has_error = True + error_message = f'ERR:CNT: {error} : {link}' + + except (TimeoutError, requests.exceptions.ConnectTimeout): + has_error = True + error_message = f'ERR:TMO: {link}' + + except requests.exceptions.TooManyRedirects as error: + has_error = True + error_message = f'ERR:TMR: {error} : {link}' + + except (Exception, requests.exceptions.RequestException) as error: + has_error = True + error_message = f'ERR:UKN: {error} : {link}' + + return (has_error, error_message) + + +def check_if_list_of_links_are_working(list_of_links: List[str]) -> List[str]: + error_messages = [] + for link in list_of_links: + has_error, error_message = check_if_link_is_working(link) + + if has_error: + error_messages.append(error_message) + + return error_messages + + +def start_duplicate_links_checker(links: List[str]) -> None: + + print('Checking for duplicate links...') + + has_duplicate_link, duplicates_links = check_duplicate_links(links) + + if has_duplicate_link: + print(f'Found duplicate links:') + + for duplicate_link in duplicates_links: + print(duplicate_link) + + sys.exit(1) + else: + print('No duplicate links.') + + +def start_links_working_checker(links: List[str]) -> None: + + print(f'Checking if {len(links)} links are working...') + + errors = check_if_list_of_links_are_working(links) + if errors: + + num_errors = len(errors) + print(f'Apparently {num_errors} links are not working properly. See in:') + + for error_message in errors: + print(error_message) + + sys.exit(1) + + +def main(filename: str, only_duplicate_links_checker: bool) -> None: + + links = find_links_in_file(filename) + + start_duplicate_links_checker(links) + + if not only_duplicate_links_checker: + start_links_working_checker(links) + + +if __name__ == '__main__': + num_args = len(sys.argv) + only_duplicate_links_checker = False + + if num_args < 2: + print('No .md file passed') + sys.exit(1) + elif num_args == 3: + third_arg = sys.argv[2].lower() + + if third_arg == '-odlc' or third_arg == '--only_duplicate_links_checker': + only_duplicate_links_checker = True + else: + print(f'Third invalid argument. Usage: python {__file__} [-odlc | --only_duplicate_links_checker]') + sys.exit(1) + + filename = sys.argv[1] + + main(filename, only_duplicate_links_checker)