Metadata-Version: 2.1
Name: acrossed
Version: 1.0.0
Summary: Sub-millisecond rule enforcement engine — Python SDK
Author: Acrossed
License: MIT
Project-URL: Homepage, https://acrossed.com
Project-URL: Docs, https://acrossed.com/docs
Project-URL: Source, https://github.com/acrossed-com/acrossed
Keywords: rule-engine,security,rate-limit,middleware
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Provides-Extra: async
Requires-Dist: aiohttp >=3.8 ; extra == 'async'

# acrossed — Python SDK

Sub-millisecond rule enforcement for Flask, FastAPI, Django, and any Python backend.

## Install

```bash
pip install acrossed
pip install "acrossed[async]"  # for asyncio / aiohttp
```

## Quick start

```python
from acrossed import Acrossed

ac = Acrossed(
    api_key="ack_live_...",
    signing_secret="acsk_...",
)

d = ac.check(ip="203.0.113.1", method="POST", path="/login")
if d.deny:
    print("blocked:", d.reason)
```

## Flask

```python
from flask import Flask, request, abort
from acrossed import Acrossed

ac = Acrossed(api_key="ack_live_...", signing_secret="acsk_...")
app = Flask(__name__)

@app.before_request
def gate():
    d = ac.check_request(request)
    if d.deny:
        abort(403, description=d.reason)
```

## FastAPI (async)

```python
from fastapi import FastAPI, Request, HTTPException
from acrossed import AsyncAcrossed

ac = AsyncAcrossed(api_key="ack_live_...", signing_secret="acsk_...")
app = FastAPI()

@app.middleware("http")
async def gate(req: Request, call_next):
    d = await ac.check_request(req)
    if d.deny:
        raise HTTPException(status_code=403, detail=d.reason)
    return await call_next(req)
```

Fails **open** by default. Use `fail_closed=True` for stricter postures.
