Metadata-Version: 2.4
Name: authloop
Version: 0.0.1
Summary: Human-in-the-loop authentication for AI agents — placeholder release.
Project-URL: Homepage, https://authloop.ai
Project-URL: Repository, https://github.com/authloop/authloop
Project-URL: Issues, https://github.com/authloop/authloop/issues
Author-email: AuthLoop <hello@authloop.ai>
License-Expression: MIT
License-File: LICENSE
Keywords: ai-agents,authentication,authloop,browser-automation,captcha,human-in-the-loop,otp
Classifier: Development Status :: 1 - Planning
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Description-Content-Type: text/markdown

# authloop

**Human-in-the-loop authentication for AI agents.**

> 🚧 **This is a placeholder release (`0.0.1`).** The full Python SDK ships in `0.1.0`.
>
> See [authloop.ai](https://authloop.ai) and the [TypeScript SDK](https://www.npmjs.com/package/@authloop-ai/sdk) for what's available today.

When your browser agent (Stagehand, Browser Use, Playwright, OpenClaw, any
CDP runtime) hits an authentication wall it cannot solve — an SMS OTP, a
behavioral CAPTCHA, a password prompt, a security question, an ID upload —
the agent stops. AuthLoop replaces that stop with a 30-second handoff.

The agent calls `authloop.to_human()`. AuthLoop streams the live browser
tab to the user's phone, the user resolves the wall directly, and the
agent continues. **Credentials never touch AuthLoop's servers.** The agent
never restarts. The user never opens a laptop.

## Coming in 0.1.0

```python
from authloop import AuthLoop

authloop = AuthLoop(api_key="al_live_...")

session = await authloop.to_human(
    service="HDFC NetBanking",
    cdp_url="ws://localhost:9222",
    context={"wall_type": "sms_otp", "hint": "OTP sent to ****1234"},
)

# Send session.session_url to the human via your notification channel
# Wait for the human to resolve it:
result = await authloop.wait_for_resolution(session.session_id)
```

## License

MIT — see [LICENSE](./LICENSE).
