# APIProtector 🛡️
A comprehensive and lightweight API protection library for Python that provides rate limiting, authentication, request validation, and security scanning capabilities. Works with any Python web framework including Flask, Django, FastAPI, and more.
## Features
- **Rate Limiting**: Configurable rate limiting with sliding window algorithm
- **Authentication**: Support for API keys and JWT tokens
- **Security Scanning**: Detects SQL injection, XSS, and path traversal attacks
- **Request Validation**: JSON schema validation and field validation
- **IP Blocking/Whitelisting**: Block malicious IPs and whitelist trusted ones
- **Framework Agnostic**: Works with Flask, Django, FastAPI, Pyramid, Tornado, and more
- **Thread-Safe**: Built for concurrent applications
- **Logging**: Comprehensive request logging and monitoring
- **Zero Dependencies**: Pure Python implementation with no external dependencies
## Installation
```bash
pip install apiprotector
```
## Quick Start
### Basic Usage
```python
from apiprotector import APIProtector
# Create protector instance
protector = APIProtector({
'rate_limit': 100, # 100 requests per hour
'window': 3600, # 1 hour window
'api_keys': {'your-api-key': 'user1'},
'enable_security_scan': True
})
# Use as decorator
@protector.protect(rate_limit=50, require_auth=True)
def your_api_endpoint():
return {"message": "Protected endpoint"}
```
### Flask Integration
```python
from flask import Flask, request
from apiprotector import APIProtector
app = Flask(__name__)
protector = APIProtector({
'rate_limit': 100,
'api_keys': {'secret-key-123': 'user1'},
'blocked_ips': ['192.168.1.100'],
'whitelisted_ips': ['192.168.1.1']
})
@app.route('/api/data')
@protector.protect(rate_limit=50, require_auth=True, auth_type='api_key')
def get_data():
return {"data": "This is protected data"}
@app.route('/api/users', methods=['POST'])
@protector.protect(
rate_limit=20,
require_auth=True,
validate_schema={'name': str, 'email': str},
required_fields=['name', 'email'],
field_limits={'name': 50, 'email': 100}
)
def create_user():
return {"message": "User created"}
```
### FastAPI Integration
```python
from fastapi import FastAPI, Request
from apiprotector import APIProtector
app = FastAPI()
protector = APIProtector({
'rate_limit': 100,
'jwt_secret': 'your-jwt-secret-key',
'enable_security_scan': True
})
@app.get("/api/protected")
@protector.protect(rate_limit=30, require_auth=True, auth_type='jwt')
async def protected_endpoint(request: Request):
return {"message": "JWT Protected endpoint"}
@app.post("/api/validate")
@protector.protect(
rate_limit=10,
validate_schema={'username': str, 'password': str},
required_fields=['username', 'password'],
enable_security_scan=True
)
async def validate_data(request: Request):
return {"message": "Data validated"}
```
### Django Integration
```python
from django.http import JsonResponse
from apiprotector import APIProtector
protector = APIProtector({
'rate_limit': 100,
'api_keys': {'django-api-key': 'user1'}
})
@protector.protect(rate_limit=25, require_auth=True)
def django_api_view(request):
return JsonResponse({"message": "Django protected view"})
```
## Configuration Options
```python
config = {
# Rate limiting
'rate_limit': 100, # Default requests per window
'window': 3600, # Time window in seconds
# Authentication
'api_keys': { # API key to user mapping
'key1': 'user1',
'key2': 'user2'
},
'jwt_secret': 'secret', # JWT secret key
# Security
'enable_security_scan': True,
'blocked_ips': ['1.2.3.4'],
'whitelisted_ips': ['192.168.1.1'],
'blocked_user_agents': ['BadBot/1.0'],
# Logging
'enable_logging': True,
}
protector = APIProtector(config)
```
## Decorator Parameters
```python
@protector.protect(
rate_limit=50, # Override default rate limit
window=1800, # Override default window (30 min)
require_auth=True, # Require authentication
auth_type='api_key', # 'api_key' or 'jwt'
validate_schema={ # JSON schema validation
'name': str,
'age': int
},
required_fields=['name'], # Required fields list
field_limits={ # Field length limits
'name': 100,
'description': 500
},
enable_security_scan=True # Enable security scanning
)
def your_endpoint():
pass
```
## Security Features
### SQL Injection Detection
```python
# These patterns are automatically detected:
# - UNION SELECT statements
# - INSERT INTO statements
# - DELETE FROM statements
# - DROP TABLE statements
# - EXEC statements
```
### XSS Protection
```python
# Detects various XSS patterns:
# - <script> tags
# - javascript: URLs
# - Event handlers (onclick, onload, etc.)
# - iframe, object, embed tags
```
### Path Traversal Protection
```python
# Detects directory traversal attempts:
# - ../../../etc/passwd
# - ..%2f..%2f..%2fetc%2fpasswd
# - Various encoding variations
```
## Authentication Methods
### API Key Authentication
```python
# Request headers:
# X-API-Key: your-api-key
# or
# Authorization: Bearer your-api-key
@protector.protect(require_auth=True, auth_type='api_key')
def protected_endpoint():
pass
```
### JWT Authentication
```python
# Request headers:
# Authorization: Bearer jwt-token-here
@protector.protect(require_auth=True, auth_type='jwt')
def jwt_protected_endpoint():
pass
```
## Management Methods
```python
# Get protection statistics
stats = protector.get_stats()
print(stats)
# Manage blocked IPs
protector.add_blocked_ip('192.168.1.100')
protector.remove_blocked_ip('192.168.1.100')
# Manage whitelisted IPs
protector.add_whitelisted_ip('192.168.1.1')
protector.remove_whitelisted_ip('192.168.1.1')
```
## Error Handling
```python
from apiprotector import (
APIProtectorError,
RateLimitExceeded,
AuthenticationFailed,
ValidationError,
SecurityThreat
)
try:
# Your protected endpoint
pass
except RateLimitExceeded:
return {"error": "Rate limit exceeded"}, 429
except AuthenticationFailed:
return {"error": "Authentication failed"}, 401
except ValidationError:
return {"error": "Validation failed"}, 400
except SecurityThreat:
return {"error": "Security threat detected"}, 403
except APIProtectorError:
return {"error": "API protection error"}, 500
```
## Quick Protection Helper
For simple use cases, use the quick protection helper:
```python
from apiprotector import quick_protect
@quick_protect(rate_limit=50, window=3600, require_auth=True)
def simple_endpoint():
return {"message": "Simply protected"}
```
## Logging
APIProtector provides comprehensive logging of all requests:
```python
{
"timestamp": "2024-01-15T10:30:00Z",
"ip": "192.168.1.100",
"method": "POST",
"path": "/api/users",
"user_agent": "Mozilla/5.0...",
"status": "ALLOWED",
"message": ""
}
```
Log statuses:
- `ALLOWED`: Request passed all checks
- `BLOCKED`: Request blocked (IP/User-Agent)
- `RATE_LIMITED`: Rate limit exceeded
- `AUTH_FAILED`: Authentication failed
- `VALIDATION_FAILED`: Request validation failed
- `SECURITY_THREAT`: Security threat detected
- `ERROR`: Internal error occurred
## Advanced Usage
### Custom Security Scanning
```python
from apiprotector import SecurityScanner
scanner = SecurityScanner()
# Check for specific threats
data = {"query": "SELECT * FROM users WHERE id = 1"}
threats = scanner.scan_all(data)
if threats:
print(f"Threats detected: {threats}")
```
### Custom Rate Limiting
```python
from apiprotector import RateLimiter
limiter = RateLimiter()
# Check if client is within limits
if limiter.is_allowed("client_id", limit=10, window=60):
print("Request allowed")
else:
print("Rate limit exceeded")
# Get remaining requests
remaining = limiter.get_remaining_requests("client_id", limit=10, window=60)
print(f"Remaining requests: {remaining}")
```
### Framework-Specific Examples
#### Tornado
```python
import tornado.web
from apiprotector import APIProtector
protector = APIProtector({'rate_limit': 100})
class MainHandler(tornado.web.RequestHandler):
@protector.protect(rate_limit=20)
def get(self):
self.write({"message": "Tornado protected"})
app = tornado.web.Application([
(r"/", MainHandler),
])
```
#### Pyramid
```python
from pyramid.config import Configurator
from pyramid.response import Response
from apiprotector import APIProtector
protector = APIProtector({'rate_limit': 100})
@protector.protect(rate_limit=30)
def hello_world(request):
return Response('Pyramid protected!')
config = Configurator()
config.add_route('hello', '/')
config.add_view(hello_world, route_name='hello')
```
## Best Practices
1. **Use Environment Variables**: Store API keys and JWT secrets in environment variables
2. **Configure Appropriate Limits**: Set rate limits based on your API capacity
3. **Enable Security Scanning**: Always enable security scanning for public APIs
4. **Monitor Logs**: Regularly monitor protection logs for suspicious activity
5. **Update IP Lists**: Keep blocked and whitelisted IP lists updated
6. **Use HTTPS**: Always use HTTPS in production
7. **Validate All Input**: Use schema validation for all user inputs
## Performance Considerations
- **Thread-Safe**: All operations are thread-safe
- **Memory Usage**: Rate limiting data is stored in memory
- **Cleanup**: Old rate limit data is automatically cleaned up
- **Scalability**: For high-traffic applications, consider using Redis for rate limiting
## Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests
5. Submit a pull request
## License
MIT License - see LICENSE file for details.
## Support
- GitHub Issues: [Report bugs or request features](https://github.com/phanikumar715/apiprotector/issues)
- Email: phanikumark715@gmail.com
## Changelog
### Version 1.0.0
- Initial release
- Rate limiting with sliding window
- API key and JWT authentication
- Security scanning (SQL injection, XSS, path traversal)
- Request validation
- IP blocking/whitelisting
- Framework-agnostic design
- Comprehensive logging
## Examples Repository
For more examples and use cases, check out the [examples repository](https://github.com/phanikumar715/apiprotector-examples).
---
Made with ❤️ by Kodukulla Phani Kumar
Raw data
{
"_id": null,
"home_page": "https://github.com/phanikumar715/apiprotector",
"name": "apiprotector",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": "Kodukulla Phani Kumar <phanikumark715@gmail.com>",
"keywords": "api, protection, rate limiting, authentication, security, flask, django, fastapi, middleware, ddos, validation, throttling",
"author": "Kodukulla Phani Kumar",
"author_email": "Kodukulla Phani Kumar <phanikumark715@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/9a/fd/b4ea26494adc7794b8a83e231c1b91668a9f426874f772e3f061bd5feae0/apiprotector-1.0.0.tar.gz",
"platform": null,
"description": "# APIProtector \ud83d\udee1\ufe0f\r\n\r\nA comprehensive and lightweight API protection library for Python that provides rate limiting, authentication, request validation, and security scanning capabilities. Works with any Python web framework including Flask, Django, FastAPI, and more.\r\n\r\n## Features\r\n\r\n- **Rate Limiting**: Configurable rate limiting with sliding window algorithm\r\n- **Authentication**: Support for API keys and JWT tokens\r\n- **Security Scanning**: Detects SQL injection, XSS, and path traversal attacks\r\n- **Request Validation**: JSON schema validation and field validation\r\n- **IP Blocking/Whitelisting**: Block malicious IPs and whitelist trusted ones\r\n- **Framework Agnostic**: Works with Flask, Django, FastAPI, Pyramid, Tornado, and more\r\n- **Thread-Safe**: Built for concurrent applications\r\n- **Logging**: Comprehensive request logging and monitoring\r\n- **Zero Dependencies**: Pure Python implementation with no external dependencies\r\n\r\n## Installation\r\n\r\n```bash\r\npip install apiprotector\r\n```\r\n\r\n## Quick Start\r\n\r\n### Basic Usage\r\n\r\n```python\r\nfrom apiprotector import APIProtector\r\n\r\n# Create protector instance\r\nprotector = APIProtector({\r\n 'rate_limit': 100, # 100 requests per hour\r\n 'window': 3600, # 1 hour window\r\n 'api_keys': {'your-api-key': 'user1'},\r\n 'enable_security_scan': True\r\n})\r\n\r\n# Use as decorator\r\n@protector.protect(rate_limit=50, require_auth=True)\r\ndef your_api_endpoint():\r\n return {\"message\": \"Protected endpoint\"}\r\n```\r\n\r\n### Flask Integration\r\n\r\n```python\r\nfrom flask import Flask, request\r\nfrom apiprotector import APIProtector\r\n\r\napp = Flask(__name__)\r\nprotector = APIProtector({\r\n 'rate_limit': 100,\r\n 'api_keys': {'secret-key-123': 'user1'},\r\n 'blocked_ips': ['192.168.1.100'],\r\n 'whitelisted_ips': ['192.168.1.1']\r\n})\r\n\r\n@app.route('/api/data')\r\n@protector.protect(rate_limit=50, require_auth=True, auth_type='api_key')\r\ndef get_data():\r\n return {\"data\": \"This is protected data\"}\r\n\r\n@app.route('/api/users', methods=['POST'])\r\n@protector.protect(\r\n rate_limit=20,\r\n require_auth=True,\r\n validate_schema={'name': str, 'email': str},\r\n required_fields=['name', 'email'],\r\n field_limits={'name': 50, 'email': 100}\r\n)\r\ndef create_user():\r\n return {\"message\": \"User created\"}\r\n```\r\n\r\n### FastAPI Integration\r\n\r\n```python\r\nfrom fastapi import FastAPI, Request\r\nfrom apiprotector import APIProtector\r\n\r\napp = FastAPI()\r\nprotector = APIProtector({\r\n 'rate_limit': 100,\r\n 'jwt_secret': 'your-jwt-secret-key',\r\n 'enable_security_scan': True\r\n})\r\n\r\n@app.get(\"/api/protected\")\r\n@protector.protect(rate_limit=30, require_auth=True, auth_type='jwt')\r\nasync def protected_endpoint(request: Request):\r\n return {\"message\": \"JWT Protected endpoint\"}\r\n\r\n@app.post(\"/api/validate\")\r\n@protector.protect(\r\n rate_limit=10,\r\n validate_schema={'username': str, 'password': str},\r\n required_fields=['username', 'password'],\r\n enable_security_scan=True\r\n)\r\nasync def validate_data(request: Request):\r\n return {\"message\": \"Data validated\"}\r\n```\r\n\r\n### Django Integration\r\n\r\n```python\r\nfrom django.http import JsonResponse\r\nfrom apiprotector import APIProtector\r\n\r\nprotector = APIProtector({\r\n 'rate_limit': 100,\r\n 'api_keys': {'django-api-key': 'user1'}\r\n})\r\n\r\n@protector.protect(rate_limit=25, require_auth=True)\r\ndef django_api_view(request):\r\n return JsonResponse({\"message\": \"Django protected view\"})\r\n```\r\n\r\n## Configuration Options\r\n\r\n```python\r\nconfig = {\r\n # Rate limiting\r\n 'rate_limit': 100, # Default requests per window\r\n 'window': 3600, # Time window in seconds\r\n \r\n # Authentication\r\n 'api_keys': { # API key to user mapping\r\n 'key1': 'user1',\r\n 'key2': 'user2'\r\n },\r\n 'jwt_secret': 'secret', # JWT secret key\r\n \r\n # Security\r\n 'enable_security_scan': True,\r\n 'blocked_ips': ['1.2.3.4'],\r\n 'whitelisted_ips': ['192.168.1.1'],\r\n 'blocked_user_agents': ['BadBot/1.0'],\r\n \r\n # Logging\r\n 'enable_logging': True,\r\n}\r\n\r\nprotector = APIProtector(config)\r\n```\r\n\r\n## Decorator Parameters\r\n\r\n```python\r\n@protector.protect(\r\n rate_limit=50, # Override default rate limit\r\n window=1800, # Override default window (30 min)\r\n require_auth=True, # Require authentication\r\n auth_type='api_key', # 'api_key' or 'jwt'\r\n validate_schema={ # JSON schema validation\r\n 'name': str,\r\n 'age': int\r\n },\r\n required_fields=['name'], # Required fields list\r\n field_limits={ # Field length limits\r\n 'name': 100,\r\n 'description': 500\r\n },\r\n enable_security_scan=True # Enable security scanning\r\n)\r\ndef your_endpoint():\r\n pass\r\n```\r\n\r\n## Security Features\r\n\r\n### SQL Injection Detection\r\n```python\r\n# These patterns are automatically detected:\r\n# - UNION SELECT statements\r\n# - INSERT INTO statements\r\n# - DELETE FROM statements\r\n# - DROP TABLE statements\r\n# - EXEC statements\r\n```\r\n\r\n### XSS Protection\r\n```python\r\n# Detects various XSS patterns:\r\n# - <script> tags\r\n# - javascript: URLs\r\n# - Event handlers (onclick, onload, etc.)\r\n# - iframe, object, embed tags\r\n```\r\n\r\n### Path Traversal Protection\r\n```python\r\n# Detects directory traversal attempts:\r\n# - ../../../etc/passwd\r\n# - ..%2f..%2f..%2fetc%2fpasswd\r\n# - Various encoding variations\r\n```\r\n\r\n## Authentication Methods\r\n\r\n### API Key Authentication\r\n```python\r\n# Request headers:\r\n# X-API-Key: your-api-key\r\n# or\r\n# Authorization: Bearer your-api-key\r\n\r\n@protector.protect(require_auth=True, auth_type='api_key')\r\ndef protected_endpoint():\r\n pass\r\n```\r\n\r\n### JWT Authentication\r\n```python\r\n# Request headers:\r\n# Authorization: Bearer jwt-token-here\r\n\r\n@protector.protect(require_auth=True, auth_type='jwt')\r\ndef jwt_protected_endpoint():\r\n pass\r\n```\r\n\r\n## Management Methods\r\n\r\n```python\r\n# Get protection statistics\r\nstats = protector.get_stats()\r\nprint(stats)\r\n\r\n# Manage blocked IPs\r\nprotector.add_blocked_ip('192.168.1.100')\r\nprotector.remove_blocked_ip('192.168.1.100')\r\n\r\n# Manage whitelisted IPs\r\nprotector.add_whitelisted_ip('192.168.1.1')\r\nprotector.remove_whitelisted_ip('192.168.1.1')\r\n```\r\n\r\n## Error Handling\r\n\r\n```python\r\nfrom apiprotector import (\r\n APIProtectorError,\r\n RateLimitExceeded,\r\n AuthenticationFailed,\r\n ValidationError,\r\n SecurityThreat\r\n)\r\n\r\ntry:\r\n # Your protected endpoint\r\n pass\r\nexcept RateLimitExceeded:\r\n return {\"error\": \"Rate limit exceeded\"}, 429\r\nexcept AuthenticationFailed:\r\n return {\"error\": \"Authentication failed\"}, 401\r\nexcept ValidationError:\r\n return {\"error\": \"Validation failed\"}, 400\r\nexcept SecurityThreat:\r\n return {\"error\": \"Security threat detected\"}, 403\r\nexcept APIProtectorError:\r\n return {\"error\": \"API protection error\"}, 500\r\n```\r\n\r\n## Quick Protection Helper\r\n\r\nFor simple use cases, use the quick protection helper:\r\n\r\n```python\r\nfrom apiprotector import quick_protect\r\n\r\n@quick_protect(rate_limit=50, window=3600, require_auth=True)\r\ndef simple_endpoint():\r\n return {\"message\": \"Simply protected\"}\r\n```\r\n\r\n## Logging\r\n\r\nAPIProtector provides comprehensive logging of all requests:\r\n\r\n```python\r\n{\r\n \"timestamp\": \"2024-01-15T10:30:00Z\",\r\n \"ip\": \"192.168.1.100\",\r\n \"method\": \"POST\",\r\n \"path\": \"/api/users\",\r\n \"user_agent\": \"Mozilla/5.0...\",\r\n \"status\": \"ALLOWED\",\r\n \"message\": \"\"\r\n}\r\n```\r\n\r\nLog statuses:\r\n- `ALLOWED`: Request passed all checks\r\n- `BLOCKED`: Request blocked (IP/User-Agent)\r\n- `RATE_LIMITED`: Rate limit exceeded\r\n- `AUTH_FAILED`: Authentication failed\r\n- `VALIDATION_FAILED`: Request validation failed\r\n- `SECURITY_THREAT`: Security threat detected\r\n- `ERROR`: Internal error occurred\r\n\r\n## Advanced Usage\r\n\r\n### Custom Security Scanning\r\n\r\n```python\r\nfrom apiprotector import SecurityScanner\r\n\r\nscanner = SecurityScanner()\r\n\r\n# Check for specific threats\r\ndata = {\"query\": \"SELECT * FROM users WHERE id = 1\"}\r\nthreats = scanner.scan_all(data)\r\nif threats:\r\n print(f\"Threats detected: {threats}\")\r\n```\r\n\r\n### Custom Rate Limiting\r\n\r\n```python\r\nfrom apiprotector import RateLimiter\r\n\r\nlimiter = RateLimiter()\r\n\r\n# Check if client is within limits\r\nif limiter.is_allowed(\"client_id\", limit=10, window=60):\r\n print(\"Request allowed\")\r\nelse:\r\n print(\"Rate limit exceeded\")\r\n\r\n# Get remaining requests\r\nremaining = limiter.get_remaining_requests(\"client_id\", limit=10, window=60)\r\nprint(f\"Remaining requests: {remaining}\")\r\n```\r\n\r\n### Framework-Specific Examples\r\n\r\n#### Tornado\r\n\r\n```python\r\nimport tornado.web\r\nfrom apiprotector import APIProtector\r\n\r\nprotector = APIProtector({'rate_limit': 100})\r\n\r\nclass MainHandler(tornado.web.RequestHandler):\r\n @protector.protect(rate_limit=20)\r\n def get(self):\r\n self.write({\"message\": \"Tornado protected\"})\r\n\r\napp = tornado.web.Application([\r\n (r\"/\", MainHandler),\r\n])\r\n```\r\n\r\n#### Pyramid\r\n\r\n```python\r\nfrom pyramid.config import Configurator\r\nfrom pyramid.response import Response\r\nfrom apiprotector import APIProtector\r\n\r\nprotector = APIProtector({'rate_limit': 100})\r\n\r\n@protector.protect(rate_limit=30)\r\ndef hello_world(request):\r\n return Response('Pyramid protected!')\r\n\r\nconfig = Configurator()\r\nconfig.add_route('hello', '/')\r\nconfig.add_view(hello_world, route_name='hello')\r\n```\r\n\r\n## Best Practices\r\n\r\n1. **Use Environment Variables**: Store API keys and JWT secrets in environment variables\r\n2. **Configure Appropriate Limits**: Set rate limits based on your API capacity\r\n3. **Enable Security Scanning**: Always enable security scanning for public APIs\r\n4. **Monitor Logs**: Regularly monitor protection logs for suspicious activity\r\n5. **Update IP Lists**: Keep blocked and whitelisted IP lists updated\r\n6. **Use HTTPS**: Always use HTTPS in production\r\n7. **Validate All Input**: Use schema validation for all user inputs\r\n\r\n## Performance Considerations\r\n\r\n- **Thread-Safe**: All operations are thread-safe\r\n- **Memory Usage**: Rate limiting data is stored in memory\r\n- **Cleanup**: Old rate limit data is automatically cleaned up\r\n- **Scalability**: For high-traffic applications, consider using Redis for rate limiting\r\n\r\n## Contributing\r\n\r\n1. Fork the repository\r\n2. Create a feature branch\r\n3. Make your changes\r\n4. Add tests\r\n5. Submit a pull request\r\n\r\n## License\r\n\r\nMIT License - see LICENSE file for details.\r\n\r\n## Support\r\n\r\n- GitHub Issues: [Report bugs or request features](https://github.com/phanikumar715/apiprotector/issues)\r\n- Email: phanikumark715@gmail.com\r\n\r\n## Changelog\r\n\r\n### Version 1.0.0\r\n- Initial release\r\n- Rate limiting with sliding window\r\n- API key and JWT authentication\r\n- Security scanning (SQL injection, XSS, path traversal)\r\n- Request validation\r\n- IP blocking/whitelisting\r\n- Framework-agnostic design\r\n- Comprehensive logging\r\n\r\n## Examples Repository\r\n\r\nFor more examples and use cases, check out the [examples repository](https://github.com/phanikumar715/apiprotector-examples).\r\n\r\n---\r\n\r\nMade with \u2764\ufe0f by Kodukulla Phani Kumar\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A comprehensive API protection library for Python with rate limiting, authentication, and security features",
"version": "1.0.0",
"project_urls": {
"Bug Tracker": "https://github.com/phanikumar715/apiprotector/issues",
"Changelog": "https://github.com/phanikumar715/apiprotector/blob/main/CHANGELOG.md",
"Documentation": "https://apiprotector.readthedocs.io/",
"Homepage": "https://github.com/phanikumar715/apiprotector",
"Repository": "https://github.com/phanikumar715/apiprotector"
},
"split_keywords": [
"api",
" protection",
" rate limiting",
" authentication",
" security",
" flask",
" django",
" fastapi",
" middleware",
" ddos",
" validation",
" throttling"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "279b0f55f60a90a9b501d028dabdf54c1cf6fb5a1ed52bc6bc23149261138d20",
"md5": "f671811bb97425688cfa0a556a8bcc00",
"sha256": "9919bc081ded5738f5fb5e45e48f0468b5e39ffdefa4e449b98210a9ae04a4af"
},
"downloads": -1,
"filename": "apiprotector-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f671811bb97425688cfa0a556a8bcc00",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 11260,
"upload_time": "2025-07-11T13:27:04",
"upload_time_iso_8601": "2025-07-11T13:27:04.775708Z",
"url": "https://files.pythonhosted.org/packages/27/9b/0f55f60a90a9b501d028dabdf54c1cf6fb5a1ed52bc6bc23149261138d20/apiprotector-1.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9afdb4ea26494adc7794b8a83e231c1b91668a9f426874f772e3f061bd5feae0",
"md5": "6dce4e936191778d72f0380fdaa5dc6e",
"sha256": "b602555af3e9e8987c8a2730d81847ce9b08dd0ed4494057e640fde1ccbd425d"
},
"downloads": -1,
"filename": "apiprotector-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "6dce4e936191778d72f0380fdaa5dc6e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 18184,
"upload_time": "2025-07-11T13:27:06",
"upload_time_iso_8601": "2025-07-11T13:27:06.221052Z",
"url": "https://files.pythonhosted.org/packages/9a/fd/b4ea26494adc7794b8a83e231c1b91668a9f426874f772e3f061bd5feae0/apiprotector-1.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-11 13:27:06",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "phanikumar715",
"github_project": "apiprotector",
"github_not_found": true,
"lcname": "apiprotector"
}