Skip to main content

moonito-python

Official Python SDK for Moonito — a smart analytics and visitor filtering platform designed to protect your website from unwanted traffic, bots, and malicious activity while providing deep visitor insights.

moonito-python is a lightweight Python SDK for integrating your web application with the Moonito Visitor Analytics API.

It allows you to:

  • Analyze and monitor web traffic intelligently
  • Filter out bots, crawlers, and unwanted visitors
  • Get real-time visitor behavior insights
  • Protect APIs, landing pages, and web apps automatically

Compatible with Flask, Django, FastAPI, and other Python web frameworks.

evaluate_visitor never raises. If the check cannot run (the API is unreachable, or refuses because a plan expired) it returns None, the visitor is let through, and the reason goes to the moonito logger. Moonito never turns into an error page on your site.

📦 Installation

pip install moonito

🚀 Quick Start

Flask Example

from flask import Flask, request, Response
from moonito import VisitorTrafficFiltering, Config

app = Flask(__name__)

# Initialize Moonito
client = VisitorTrafficFiltering(Config(
    is_protected=True,
    api_public_key="YOUR_PUBLIC_KEY",
    api_secret_key="YOUR_SECRET_KEY",
    unwanted_visitor_to="https://example.com/blocked",  # URL or HTTP status code
    unwanted_visitor_action=1  # 1 = Redirect, 2 = Iframe, 3 = Load content
))

@app.before_request
def check_visitor():
    """Middleware to check visitors before processing requests"""
    result = client.evaluate_visitor(request)
    
    if result:
        content = result['content']
        
        if isinstance(content, int):
            return Response(status=content)
        
        return Response(content, mimetype='text/html')

@app.route('/')
def home():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(port=8080)

Django Example

# middleware.py
from moonito import VisitorTrafficFiltering, Config
from django.http import HttpResponse

class MoonitoMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        
        # Initialize Moonito
        self.client = VisitorTrafficFiltering(Config(
            is_protected=True,
            api_public_key="YOUR_PUBLIC_KEY",
            api_secret_key="YOUR_SECRET_KEY",
            unwanted_visitor_to="https://example.com/blocked",
            unwanted_visitor_action=1
        ))

    def __call__(self, request):
        # Check visitor
        result = self.client.evaluate_visitor(request)
        
        if result:
            content = result['content']
            
            if isinstance(content, int):
                return HttpResponse(status=content)
            
            return HttpResponse(content)
        
        response = self.get_response(request)
        return response

Add to settings.py:

MIDDLEWARE = [
    'your_app.middleware.MoonitoMiddleware',
    # ... other middleware
]

FastAPI Example

from fastapi import FastAPI, Request, Response
from starlette.concurrency import run_in_threadpool
from moonito import VisitorTrafficFiltering, Config

app = FastAPI()

# Initialize Moonito
client = VisitorTrafficFiltering(Config(
    is_protected=True,
    api_public_key="YOUR_PUBLIC_KEY",
    api_secret_key="YOUR_SECRET_KEY",
    unwanted_visitor_to="https://example.com/blocked",
    unwanted_visitor_action=1
))

@app.middleware("http")
async def moonito_middleware(request: Request, call_next):
    """Middleware to check visitors"""
    # In a thread, so a slow decision never stalls your other requests.
    result = await run_in_threadpool(client.evaluate_visitor, request)
    
    if result:
        content = result['content']
        
        if isinstance(content, int):
            return Response(status_code=content)
        
        return Response(content=content, media_type="text/html")
    
    response = await call_next(request)
    return response

@app.get("/")
def read_root():
    return {"message": "Hello World"}

⚙️ Configuration

Field Type Description
is_protected bool Enable (True) or disable (False) protection
api_public_key str Your Moonito API public key (required)
api_secret_key str Your Moonito API secret key (required)
unwanted_visitor_to str URL to redirect unwanted visitors or HTTP error code
unwanted_visitor_action int Action for unwanted visitors: 1 = Redirect, 2 = Iframe, 3 = Load content

🔧 Manual Evaluation

For custom implementations or manual checking:

from moonito import VisitorTrafficFiltering, Config

client = VisitorTrafficFiltering(Config(
    is_protected=True,
    api_public_key="YOUR_PUBLIC_KEY",
    api_secret_key="YOUR_SECRET_KEY"
))

# Manually evaluate a visitor
result = client.evaluate_visitor_manually(
    ip="8.8.8.8",
    user_agent="Mozilla/5.0",
    event="/home",
    domain="example.com"
)

if result['need_to_block']:
    print("Blocked visitor detected.")

💡 Use Cases

  • Prevent fake signups and bot traffic
  • Protect landing pages from ad click fraud
  • Collect accurate visitor analytics
  • Detect suspicious activity in real time

📋 Requirements

  • Python 3.7 or higher
  • No external dependencies (uses Python standard library)
  • Moonito API keys from https://moonito.net

🧪 Development

# Clone the repository
git clone https://github.com/moonito-net/moonito-python.git
cd moonito-python

# Create virtual environment
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install dependencies
pip install -e .
pip install pytest

# Run tests
pytest tests/

📄 License

MIT License © 2025 Moonito

🏷️ Keywords

python analytics sdk, moonito sdk, visitor filtering python, python bot protection, python traffic analytics, moonito python sdk, moonito api, website protection sdk python, moonito visitor analytics, python security sdk

🌐 Learn More

Visit https://moonito.net to learn more about:

  • Visitor analytics
  • Website traffic protection
  • API-based bot and fraud filtering

Moonito — Stop Bad Bots. Start Accurate Web Analytics.

Metadata

Release files for moonito 2.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for moonito 2.2.0
File Size Uploaded
moonito-2.2.0.tar.gz 17.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for moonito 2.2.0
File Interpreter ABI Platform
moonito-2.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 31.1 kB

Release files / moonito-2.2.0.tar.gz

Download URL moonito-2.2.0.tar.gz
Size 17.5 kB
Tags Source
SHA-256 checksum
How to use checksums
fc81c38b911e3f6ecd4242b10005adbf8d057a5e848d5044f0ced9c2f43e9a3f
BLAKE2b-256 checksum
How to use checksums
8211efbed17b539e94ba0784db6aaa0610eba28c346b04a51dccf17064e5173f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.0

Release files / moonito-2.2.0-py3-none-any.whl

Download URL moonito-2.2.0-py3-none-any.whl
Size 13.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
18d9fcfa145cca47f693c7a14bfea421ab229f5ca68cbc10b417681b47d3fdb0
BLAKE2b-256 checksum
How to use checksums
499e5862a55282bbbf9606e2dffb4bb74420896accc41d3f88e48897d0bc6aae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.0

Release history Release notifications | RSS feed

This release

2.2.0 This release

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page