opensquat 2.2.3__tar.gz → 2.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. opensquat-2.3.1/PKG-INFO +434 -0
  2. opensquat-2.3.1/README.md +403 -0
  3. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/__init__.py +1 -1
  4. opensquat-2.3.1/opensquat/api_client.py +255 -0
  5. opensquat-2.3.1/opensquat/app.py +486 -0
  6. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/arg_parser.py +114 -0
  7. opensquat-2.3.1/opensquat/auth.py +89 -0
  8. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/check_update.py +12 -2
  9. opensquat-2.3.1/opensquat/cli.py +369 -0
  10. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/ct.py +1 -1
  11. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/feed_manager.py +52 -11
  12. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/output.py +14 -9
  13. opensquat-2.3.1/opensquat/phishing.py +337 -0
  14. opensquat-2.3.1/opensquat/vt.py +169 -0
  15. opensquat-2.3.1/opensquat.egg-info/PKG-INFO +434 -0
  16. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat.egg-info/SOURCES.txt +7 -0
  17. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat.egg-info/requires.txt +3 -2
  18. {opensquat-2.2.3 → opensquat-2.3.1}/pyproject.toml +5 -6
  19. opensquat-2.3.1/tests/test_api_client.py +361 -0
  20. opensquat-2.3.1/tests/test_arg_parser.py +169 -0
  21. opensquat-2.3.1/tests/test_auth.py +139 -0
  22. opensquat-2.3.1/tests/test_feed_manager.py +106 -0
  23. opensquat-2.3.1/tests/test_phishing.py +395 -0
  24. opensquat-2.2.3/PKG-INFO +0 -249
  25. opensquat-2.2.3/README.md +0 -217
  26. opensquat-2.2.3/opensquat/app.py +0 -163
  27. opensquat-2.2.3/opensquat/cli.py +0 -181
  28. opensquat-2.2.3/opensquat/phishing.py +0 -159
  29. opensquat-2.2.3/opensquat/vt.py +0 -106
  30. opensquat-2.2.3/opensquat.egg-info/PKG-INFO +0 -249
  31. {opensquat-2.2.3 → opensquat-2.3.1}/LICENSE +0 -0
  32. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/dns_resolvers.py +0 -0
  33. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/dns_validator.py +0 -0
  34. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/file_input.py +0 -0
  35. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/homograph.py +0 -0
  36. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/port_check.py +0 -0
  37. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/squatting_detector.py +0 -0
  38. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat/validations.py +0 -0
  39. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat.egg-info/dependency_links.txt +0 -0
  40. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat.egg-info/entry_points.txt +0 -0
  41. {opensquat-2.2.3 → opensquat-2.3.1}/opensquat.egg-info/top_level.txt +0 -0
  42. {opensquat-2.2.3 → opensquat-2.3.1}/setup.cfg +0 -0
  43. {opensquat-2.2.3 → opensquat-2.3.1}/tests/test_ct.py +0 -0
  44. {opensquat-2.2.3 → opensquat-2.3.1}/tests/test_validations.py +0 -0
@@ -0,0 +1,434 @@
1
+ Metadata-Version: 2.4
2
+ Name: opensquat
3
+ Version: 2.3.1
4
+ Summary: openSquat - Detection of domain squatting, typosquatting, IDN homograph attacks, and phishing threats
5
+ Author-email: Andre Tenreiro <andre@opensquat.com>
6
+ License-Expression: GPL-3.0-only
7
+ Project-URL: Homepage, https://opensquat.com
8
+ Project-URL: Repository, https://github.com/atenreiro/opensquat
9
+ Project-URL: Issues, https://github.com/atenreiro/opensquat/issues
10
+ Keywords: cybersecurity,phishing,typosquatting,domain-squatting,osint,homograph,brand-protection
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: Intended Audience :: System Administrators
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Security
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: confusable_homoglyphs>=2.0.0
24
+ Requires-Dist: homoglyphs>=2.0.0
25
+ Requires-Dist: colorama>=0.4.1
26
+ Requires-Dist: requests>=2.33.0
27
+ Requires-Dist: beautifulsoup4>=4.4.0
28
+ Requires-Dist: dnspython>=2.6.1
29
+ Requires-Dist: urllib3>=2.6.3
30
+ Dynamic: license-file
31
+
32
+ <p align="center">
33
+ <img src="https://raw.githubusercontent.com/atenreiro/opensquat/master/screenshots/openSquat_logo.png" alt="openSquat Logo" width="550"/>
34
+ </p>
35
+
36
+ <h1 align="center">openSquat Core</h1>
37
+
38
+ <p align="center">
39
+ <a href="https://pypi.org/project/opensquat/"><img src="https://img.shields.io/pypi/v/opensquat" alt="PyPI"></a>
40
+ <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" alt="Python 3.10+"></a>
41
+ <a href="https://github.com/atenreiro/opensquat/blob/master/LICENSE"><img src="https://img.shields.io/badge/License-GPLv3-blue.svg" alt="License: GPL v3"></a>
42
+ <a href="https://github.com/atenreiro/opensquat/issues"><img src="https://img.shields.io/github/issues/atenreiro/opensquat" alt="GitHub issues"></a>
43
+ <a href="https://github.com/atenreiro/opensquat/stargazers"><img src="https://img.shields.io/github/stars/atenreiro/opensquat" alt="GitHub stars"></a>
44
+ </p>
45
+
46
+ ---
47
+
48
+ ## 📑 Table of Contents
49
+
50
+ - [What is openSquat?](#-what-is-opensquat)
51
+ - [Featured In](#-featured-in)
52
+ - [Open-Core Model](#-open-core-model)
53
+ - [Key Features](#-key-features)
54
+ - [Quick Start](#-quick-start)
55
+ - [Requirements](#-requirements)
56
+ - [Usage](#-usage)
57
+ - [Premium and API Modes](#-premium-and-api-modes)
58
+ - [MCP Server](#-mcp-server)
59
+ - [Configuration](#%EF%B8%8F-configuration)
60
+ - [Automation](#-automation)
61
+ - [CLI Reference](#-cli-reference)
62
+ - [Contributing](#-contributing)
63
+ - [Author](#-author)
64
+ - [License](#-license)
65
+
66
+ ---
67
+
68
+ ## 🎯 What is openSquat?
69
+
70
+ openSquat is an **Open Source Intelligence (OSINT)** security tool that identifies cyber squatting threats targeting your brand or domains:
71
+
72
+ | Threat Type | Description |
73
+ |-------------|-------------|
74
+ | 🎣 **Phishing** | Fraudulent domains mimicking your brand |
75
+ | 🔤 **Typosquatting** | Domains with common typos (e.g., `gooogle.com`) |
76
+ | 🌐 **IDN Homograph** | Look-alike characters from other alphabets |
77
+ | 👥 **Doppelgänger** | Domains containing your brand name |
78
+ | 🔀 **Bitsquatting** | Single-bit errors in domain names |
79
+
80
+ ---
81
+
82
+ ## 🌟 Featured In
83
+
84
+ > **"A powerful swiss army knife for brand protection"**
85
+ > — [WhoisXML API Blog](https://www.whoisxmlapi.com/blog/orchestrating-open-source-software-and-whois-newly-registered-domain-data-feeds-to-fight-the-typosquatting-plague), August 2022
86
+
87
+ > **"A handy tool for collecting information on newly registered domains."** — ranked Top 5 phishing detection tool
88
+ > — [SOCRadar Blog](https://socradar.io/blog/top-5-tools-for-phishing-domain-detection/), July 2022
89
+
90
+ > **"openSquat provides essential protection against domain squatting and phishing attacks through automated monitoring and detection."**
91
+ > — [Prince Yadav, TutorialsPoint](https://www.tutorialspoint.com/article/opensquat-ndash-domain-squatting-and-phishing-watchdog), March 2026
92
+
93
+ ### Academic Citation
94
+
95
+ > **"OpenSquat identified 103 squatting domains, 960 active phishing websites, and 53 domains with suspicious certificates."**
96
+ > — Sharma et al., [Journal of Information Security and Cybercrimes Research (JISCR)](https://journals.nauss.edu.sa/index.php/JISCR/article/download/2805/1349), Vol. 7, Issue 1, June 2024
97
+
98
+ ---
99
+
100
+ ## 🔓 Open-Core Model
101
+
102
+ openSquat follows an **open-core model**:
103
+
104
+ - **Core detection engine** — Open source and community-driven
105
+ - **Advanced capabilities** — Delivered through commercial intelligence services
106
+
107
+ This model enables transparency and community collaboration while supporting the scale, reliability, and operational requirements of enterprise use.
108
+
109
+ ---
110
+
111
+ ## ✨ Key Features
112
+
113
+ - 📅 **Daily NRD feeds** — Automatic newly registered domain updates
114
+ - 🔍 **Similarity detection** — Levenshtein distance algorithm
115
+ - 🔓 **Three operating modes** — **Community** (free feed), **Premium Feed** (paid feed, same local pipeline), or **Premium API** (hosted lookalike service). The two Premium modes share a single openSquat API key — see [Premium and API Modes](#-premium-and-api-modes).
116
+ - 🛡️ **VirusTotal integration** — Check domain reputation
117
+ - 🌐 **Quad9 DNS validation** — Identify malicious domains
118
+ - 📜 **Certificate Transparency** — Monitor SSL/TLS certificates
119
+ - 📊 **Multiple output formats** — TXT, JSON, CSV
120
+
121
+ ---
122
+
123
+ ## 🚀 Quick Start
124
+
125
+ ### Install via pip (recommended)
126
+
127
+ ```bash
128
+ pip install opensquat
129
+ opensquat -k keywords.txt
130
+ ```
131
+
132
+ ### Or clone the repository
133
+
134
+ ```bash
135
+ git clone https://github.com/atenreiro/opensquat
136
+ cd opensquat
137
+ pip install -r requirements.txt
138
+ python3 opensquat.py -k keywords.txt
139
+ ```
140
+
141
+ > **Repo users:** in all the examples below, replace `opensquat` with `python3 opensquat.py` to run from a cloned checkout.
142
+
143
+ ### See it in action
144
+
145
+ <p align="center">
146
+ <img src="screenshots/openSquat_v2.3.0.png" alt="openSquat 2.3.0 scanning the daily NRD feed for lookalikes of google, facebook, amazon and paypal" width="650"/>
147
+ </p>
148
+
149
+ ---
150
+
151
+ ## 📦 Requirements
152
+
153
+ - **Python 3.10+**
154
+ - Dependencies: `confusable_homoglyphs`, `homoglyphs`, `colorama`, `requests`, `dnspython`, `beautifulsoup4`
155
+
156
+ ---
157
+
158
+ ## 📖 Usage
159
+
160
+ ### Basic Commands
161
+
162
+ ```bash
163
+ # Default run
164
+ opensquat
165
+
166
+ # Show all options
167
+ opensquat -h
168
+
169
+ # Use custom keywords file
170
+ opensquat -k my_keywords.txt
171
+ ```
172
+
173
+ ### Validation Options
174
+
175
+ ```bash
176
+ # DNS validation via Quad9
177
+ opensquat --dns
178
+
179
+ # Check Certificate Transparency logs
180
+ opensquat --ct
181
+
182
+ # Scan for open ports (80/443)
183
+ opensquat --portcheck
184
+
185
+ # Cross-reference phishing databases
186
+ opensquat --phishing results.txt
187
+ ```
188
+
189
+ ### Output Formats
190
+
191
+ ```bash
192
+ # Save as JSON
193
+ opensquat -o results.json -t json
194
+
195
+ # Save as CSV
196
+ opensquat -o results.csv -t csv
197
+ ```
198
+
199
+ ### Confidence Levels
200
+
201
+ | Level | Flag | Description |
202
+ |-------|------|-------------|
203
+ | 0 | `-c 0` | Very high (fewer results, high accuracy) |
204
+ | 1 | `-c 1` | High (default) |
205
+ | 2 | `-c 2` | Medium |
206
+ | 3 | `-c 3` | Low |
207
+ | 4 | `-c 4` | Very low (more results, more false positives) |
208
+
209
+ > **Note:** On the API side (`--api`), the five confidence levels map to four fuzziness values (`exact`, `low`, `auto`, `high`) — `-c 3` and `-c 4` both map to `high`. See [Premium and API Modes](#-premium-and-api-modes) for the full mapping and how to override with `--api-fuzziness`.
210
+
211
+ ---
212
+
213
+ ## 💎 Premium and API Modes
214
+
215
+ openSquat supports three modes. The default (Community) is unchanged — existing users need no flags. The two Premium modes share a single openSquat API key; pick **Premium Feed** if you want the same local detection pipeline with a larger feed, or **Premium API** if you want server-side detection with no local feed download.
216
+
217
+ | Mode | Flag | What it does |
218
+ |------|------|--------------|
219
+ | **Community** (default) | _(none)_ | Downloads the free NRD feed (~100k domains/day) and runs local Levenshtein detection. |
220
+ | **Premium Feed** | `--premium` | Downloads the paid NRD feed (`nrd-lite`, much larger) using your openSquat API key, then runs the same local Levenshtein detection. |
221
+ | **Premium API** | `--api` | Skips local feed download. Queries the openSquat lookalike REST API per keyword and returns server-side matches. |
222
+
223
+ ### Get an API key
224
+
225
+ Sign up at [opensquat.com](https://opensquat.com) to get a key. The same key works for both Premium Feed (`--premium`) and Premium API (`--api`).
226
+
227
+ ### Provide the API key (priority order)
228
+
229
+ 1. `--api-key YOUR_KEY` on the command line
230
+ 2. `OPENSQUAT_API_KEY` environment variable
231
+ 3. `api_key.txt` in the current directory (one key per file, `#` comments allowed)
232
+
233
+ > The CLI flag is visible in `ps` output. Prefer the env var or key file in shared environments.
234
+
235
+ ### Examples
236
+
237
+ ```bash
238
+ # Premium Feed mode — same local pipeline, larger feed
239
+ export OPENSQUAT_API_KEY=os_xxxxxxxxxxxx
240
+ opensquat -k keywords.txt --premium
241
+
242
+ # Premium API mode — server-side detection per keyword
243
+ opensquat -k keywords.txt --api
244
+
245
+ # Premium API + DNS reputation check on each returned domain
246
+ opensquat -k keywords.txt --api --dns
247
+
248
+ # Premium API with JSON output grouped by keyword
249
+ opensquat -k keywords.txt --api -t json -o results.json
250
+
251
+ # Tune the Premium API search
252
+ opensquat -k keywords.txt --api --api-fuzziness high --api-history-days 7 --api-max-results 200
253
+ ```
254
+
255
+ When `--premium` or `--api` successfully loads a key, the CLI prints a masked confirmation line so you can verify which key was picked up without leaking it:
256
+
257
+ ```
258
+ [*] API key loaded: os_gL...L5Mb
259
+ ```
260
+
261
+ In Premium API mode, the run summary reports the active mode, the number of API calls made, and your remaining balance with usage delta (for example, `4972 (used 4 of 4976 this run)`). Per-keyword progress lines appear in the same order as your keywords file even though the calls run in parallel. Quota exhaustion (HTTP 429) returns partial results gracefully; auth errors (401) and plan errors (403) abort with a clear message.
262
+
263
+ If the backend rate-limits your request (HTTP 429 with a `Retry-After` header), the tool distinguishes it from quota exhaustion: you'll see a yellow `[!] Rate limit hit (retry in Ns)` warning instead of the red `quota exhausted` message, partial results are still returned, and the summary preserves your real API balance so you can see exactly how many credits you actually used. To avoid triggering rate limits on large scans, pass `--api-rate-limit N` to cap outbound requests per second across all workers. A value of `8` is a safe starting point for most backends.
264
+
265
+ ```bash
266
+ # Throttle to 8 requests/second across all workers
267
+ opensquat -k keywords.txt --api --api-rate-limit 8
268
+ ```
269
+
270
+ ### Output format recommendation
271
+
272
+ **JSON is the recommended output format for Premium API mode** because the API returns per-domain metadata that the other formats cannot carry as cleanly: the registered TLD, the NRD first-seen date, an IDN homograph flag, and the unicode rendering of the homograph when the domain is one.
273
+
274
+ ```bash
275
+ opensquat -k keywords.txt --api -t json -o results.json
276
+ ```
277
+
278
+ Example of the richer output in Premium API mode (trimmed):
279
+
280
+ ```json
281
+ [
282
+ {
283
+ "keyword": "microsoft",
284
+ "domains": [
285
+ {"domain": "securite-microsoft.fr", "tld": "fr", "date": "09-04-2026", "idn": false},
286
+ {"domain": "xn--mirosoft-hw7c.com", "tld": "com", "date": "09-04-2026", "idn": true, "unicode": "miᴄrosoft.com"}
287
+ ]
288
+ }
289
+ ]
290
+ ```
291
+
292
+ The `idn` flag plus the `unicode` rendering let you see at a glance that `xn--mirosoft-hw7c.com` is actually `ᴄ` (Latin Letter Small Capital C) impersonating the `c` in "microsoft" — information that a plain punycode string completely hides.
293
+
294
+ CSV output is also supported and produces one row per domain with the same metadata columns, which suits analysts working in Excel or pandas:
295
+
296
+ ```bash
297
+ opensquat -k keywords.txt --api -t csv -o results.csv
298
+ ```
299
+
300
+ The CSV is written with a UTF-8 BOM so Excel on Windows correctly renders the unicode homograph column.
301
+
302
+ Community and Premium Feed modes emit the same JSON top-level shape for cross-mode consistency, but with only the `domain` field populated per entry — the NRD feed does not carry the per-domain metadata that only the hosted API has:
303
+
304
+ ```json
305
+ [
306
+ {
307
+ "keyword": "microsoft",
308
+ "domains": [
309
+ {"domain": "mirosoft.com"},
310
+ {"domain": "mcrosoft.net"}
311
+ ]
312
+ }
313
+ ]
314
+ ```
315
+
316
+ If you pass `--api-key` without also selecting `--premium` or `--api`, the CLI prints a one-line hint that the key will be ignored in Community mode (no silent mode-switching).
317
+
318
+ In Premium API mode, `-c/--confidence` is auto-mapped to API fuzziness (`0→exact`, `1→low`, `2→auto`, `3→high`, `4→high`). Use `--api-fuzziness` to override.
319
+
320
+ Premium API (`--api`) is incompatible with `--doppelganger` and `-d/--domains`.
321
+
322
+ ---
323
+
324
+ ## 🔌 MCP Server
325
+
326
+ openSquat is also available as a **Model Context Protocol (MCP) server**, so AI assistants and agents (Claude, and any other MCP-compatible client) can query lookalike-domain intelligence directly:
327
+
328
+ | Tool | What it does | Quota cost |
329
+ |------|--------------|------------|
330
+ | `search_lookalike_domains` | Find newly registered domains impersonating a brand or keyword (phishing, brand abuse, typosquatting) | 1 query per search |
331
+ | `validate_api_key` | Confirm the connection is authenticated | Free |
332
+
333
+ Authentication uses the same openSquat account as the Premium modes: either sign in with OAuth, or supply your API key (`os_...`) via the `Authorization: Bearer` header (or `X-OpenSquat-Key`). Searches draw from the same plan quota as the Premium API.
334
+
335
+ See [opensquat.com](https://opensquat.com) for the MCP endpoint and client setup instructions.
336
+
337
+ ---
338
+
339
+ ## ⚙️ Configuration
340
+
341
+ ### Keywords File (`keywords.txt`)
342
+
343
+ ```text
344
+ # Lines starting with # are comments
345
+ mycompany
346
+ mybrand
347
+ myproduct
348
+ ```
349
+
350
+ ### VirusTotal API Key (`vt_key.txt`)
351
+
352
+ To use `--vt` or `--subdomains`, add your API key:
353
+ ```text
354
+ # Get your free API key at https://www.virustotal.com
355
+ your_api_key_here
356
+ ```
357
+
358
+ ### openSquat API Key (`api_key.txt`)
359
+
360
+ Required for `--premium` and `--api`. Create an `api_key.txt` file in the working directory:
361
+ ```text
362
+ # Get your key at https://opensquat.com
363
+ # Lines starting with # are ignored; the first non-comment line is used.
364
+ os_your_key_here
365
+ ```
366
+
367
+ The CLI resolves the key in this order: `--api-key` flag → `$OPENSQUAT_API_KEY` environment variable → `api_key.txt` file. The env var and file methods are preferred over the CLI flag in shared environments, since CLI arguments are visible via `ps`.
368
+
369
+ ---
370
+
371
+ ## 🤖 Automation
372
+
373
+ Run daily via crontab:
374
+
375
+ ```bash
376
+ # pip-installed (recommended) — every day at 8 AM, feeds update ~7:30 AM UTC
377
+ 0 8 * * * cd /path/to/workdir && opensquat -k keywords.txt -o results.json -t json
378
+
379
+ # Repo checkout — invoke opensquat.py directly with python3
380
+ 0 8 * * * cd /path/to/opensquat && python3 opensquat.py -k keywords.txt -o results.json -t json
381
+ ```
382
+
383
+ > The `cd` into a working directory matters if you rely on `api_key.txt` (resolved from the current directory) or want `results.json` written to a specific place.
384
+
385
+ ---
386
+
387
+ ## 📋 CLI Reference
388
+
389
+ | Argument | Default | Description |
390
+ |----------|---------|-------------|
391
+ | `-k, --keywords` | `keywords.txt` | Keywords file to search |
392
+ | `-o, --output` | `results.txt` | Output filename |
393
+ | `-t, --type` | `txt` | Output format: `txt`, `json`, `csv` |
394
+ | `-c, --confidence` | `1` | Confidence level (0-4). In `--api` mode this is auto-mapped to fuzziness (`-c 3` and `-c 4` both → `high`). |
395
+ | `-d, --domains` | — | Use local domain file instead of downloading |
396
+ | `-u, --url` | opensquat feed | URL to download domain feed |
397
+ | `--dns` | — | Enable Quad9 DNS validation |
398
+ | `--doppelganger` | — | Doppelganger-only mode (keyword in domain + reachability check) |
399
+ | `--ct` | — | Search Certificate Transparency logs |
400
+ | `--phishing` | — | Cross-reference phishing database |
401
+ | `--phishing-fallback` | — | Optional `https` list of phishing domains/URLs, used only when the default database cannot be downloaded |
402
+ | `--subdomains` | — | Fetch subdomains via VirusTotal |
403
+ | `--portcheck` | — | Check for open ports 80/443 |
404
+ | `--vt` | — | Validate against VirusTotal |
405
+ | `--premium` | — | **Premium Feed mode** — use the paid NRD feed (requires openSquat API key) |
406
+ | `--api` | — | **Premium API mode** — query the openSquat lookalike REST API per keyword (no local feed) |
407
+ | `--api-key` | — | openSquat API key (or set `$OPENSQUAT_API_KEY`, or use `api_key.txt`) |
408
+ | `--api-fuzziness` | _(from `-c`)_ | Premium API mode: `exact`, `low`, `high`, or `auto` |
409
+ | `--api-history-days` | — | Premium API mode: NRD history window in days (clipped to plan cap) |
410
+ | `--api-max-results` | — | Premium API mode: max results per keyword (clipped to plan cap) |
411
+ | `--api-rate-limit` | _(unlimited)_ | Premium API mode: max outbound requests per second across all workers |
412
+
413
+ ---
414
+
415
+ ## 🤝 Contributing
416
+
417
+ We welcome contributions! See our [Contributing Guide](CONTRIBUTING.md) for details.
418
+
419
+ - 🐛 **Report bugs** via [GitHub Issues](https://github.com/atenreiro/opensquat/issues)
420
+ - 💡 **Request features** by opening an issue
421
+ - 🔧 **Submit PRs** for bug fixes or enhancements
422
+ - 📝 **Release notes** — see the [CHANGELOG](CHANGELOG) for what's new in each version
423
+
424
+ ---
425
+
426
+ ## 👤 Author
427
+
428
+ **Andre Tenreiro** — [LinkedIn](https://www.linkedin.com/in/andretenreiro/) · [PGP Key](https://mail-api.proton.me/pks/lookup?op=get&search=andre@opensquat.com)
429
+
430
+ ---
431
+
432
+ ## 📜 License
433
+
434
+ This project is licensed under the [GNU GPL v3](LICENSE).