VWP Python SDK — primitives for vibe-coded backends (rate limiting, auth, notifications, and more).
Project description
vwp-sdk
Python SDK for VWP — primitives for vibe-coded backends.
pip install vwp-sdk
Quickstart
import vwp
client = vwp.Client(api_key="vwp_test_...") # or set VWP_API_KEY in env
result = client.rate_limit.check(
key="login:user@example.com",
limit=5,
window="15m",
)
if not result.allowed:
# Block this request — your handler returns 429 to the end user.
print(f"Try again in {result.retry_after_seconds}s")
Or, async:
import asyncio
import vwp
async def main():
async with vwp.AsyncClient(api_key="vwp_test_...") as client:
result = await client.rate_limit.check(
key="login:user@example.com", limit=5, window="15m",
)
print(result)
asyncio.run(main())
What's in this release (0.2.0a1)
vwp.rate_limit.check(...)—SECURITY-RATE-LIMIT-001, fully wired againsthttps://api.vibewithprimitiveai.com/v1.vwp.auth.magic_link.request(email, return_to, ...)— issues a single-use magic link via email (Azure Communication Services on our side).vwp.auth.magic_link.exchange(request | url | dict, handle?)— turns a clicked link into a signed JWT session. SDK pulls_vwp_hout of the request URL automatically.vwp.Client/vwp.AsyncClient— explicit clients for connection reuse.- Typed errors —
ApiKeyError(401),BadRequestError(400),MetaRateLimitedError(429),ServerError(5xx),NetworkError(no response).
Other modules (vwp.notify, vwp.data, vwp.queue) are present as stubs and will be implemented
in subsequent releases. Calling them raises NotImplementedError with a pointer to the docs.
Magic-link quickstart
import vwp
client = vwp.Client(api_key="vwp_test_...")
# Step 1 — user types their email
r = client.auth.magic_link.request(
email="user@example.com",
return_to="https://yourapp.com/dashboard",
)
# r.expires_at — when the link expires (default 15 min)
# r.delivery_status — "queued"
# Step 2 — user clicks the link, your callback handler runs:
session = client.auth.magic_link.exchange(request) # request from your framework
# Or pass the URL/handle directly:
session = client.auth.magic_link.exchange(handle="<_vwp_h value from URL>")
# session.session.user_id, session.session.email — for your user table upsert
# session.jwt — set as a HttpOnly cookie
Errors
Every error subclasses vwp.VWPError. Catch the base class to handle anything:
try:
result = vwp.rate_limit.check(key="...", limit=5, window="15m")
except vwp.ApiKeyError as e:
print("Bad API key:", e.request_id)
except vwp.BadRequestError as e:
print("Bad input:", e.field, e.message)
except vwp.VWPError as e:
print("Other VWP error:", e)
Compatibility
Python 3.9+. Production-tested on 3.12.
License
Apache-2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vwp_sdk-0.7.0.tar.gz.
File metadata
- Download URL: vwp_sdk-0.7.0.tar.gz
- Upload date:
- Size: 20.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd637be27143e4d593d797705467072703e4a97f641337286ccc8a6bd4659461
|
|
| MD5 |
f0652678cd959e20d385c7ce0b5a489d
|
|
| BLAKE2b-256 |
1a98399691c58f5b90dfa50597b84fbaeb1e4647f3db83005f793cb945b6dc2b
|
File details
Details for the file vwp_sdk-0.7.0-py3-none-any.whl.
File metadata
- Download URL: vwp_sdk-0.7.0-py3-none-any.whl
- Upload date:
- Size: 18.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f938a5560748792a34c0bee31ee8a2b9495ffcba16e3b2089b28d5c6c6c30d3
|
|
| MD5 |
b2e7ece57cd9069d99a914a55be04fa3
|
|
| BLAKE2b-256 |
cc89bd9a5acb72b5b18d2150b7680879e55a20feb53b8ec001f5a466de5ef79d
|