diff --git a/app.py b/app.py index 6772a2c..2544838 100644 --- a/app.py +++ b/app.py @@ -530,6 +530,7 @@ Sells residential SOCKS5 and HTTP CONNECT proxies with global geo-targeting - Signup: username + password only (no email, no KYC) ## API +- OpenAPI spec: {SITE_HOST}/openapi.json - GET /api/v1/info -> service info (JSON) - GET /api/v1/plans -> residential GB plans (JSON) - POST /api/v1/proxy -> one-call purchase (JSON: plan_id, country, city, username, password) -> creds + BTCPay checkout URL @@ -652,6 +653,47 @@ def api_order_status(order_id): return jsonify({"order_id": order_id, "status": o["status"], "amount_sats": o["amount_sats"]}) +@app.route("/openapi.json") +def openapi(): + spec = { + "openapi": "3.0.3", + "info": { + "title": "Clean Proxys API", + "version": "1.0.0", + "description": "Programmatic residential SOCKS5/HTTP proxy purchase. No KYC. " + "One-call provisioning with Bitcoin (BTCPay) billing.", + }, + "servers": [{"url": f"https://{SITE_HOST}"}], + "paths": { + "/api/v1/info": {"get": {"summary": "Service info", "responses": {"200": {"description": "ok"}}}}, + "/api/v1/plans": {"get": {"summary": "List residential GB plans", "responses": {"200": {"description": "plans"}}}}, + "/api/v1/proxy": {"post": { + "summary": "One-call purchase: create account + invoice, return proxy credentials", + "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": { + "plan_id": {"type": "integer", "description": "plan id from /api/v1/plans"}, + "country": {"type": "string", "description": "ISO country code, e.g. US"}, + "city": {"type": "string", "description": "optional city"}, + "username": {"type": "string", "description": "optional; auto-generated if omitted"}, + "password": {"type": "string", "description": "optional; auto-generated if omitted"}, + }}}}}, + "responses": {"200": {"description": "username, proxy_password, socks5/http strings, invoice checkout_url, status_url"}}, + }}, + "/api/v1/order/{order_id}": {"get": { + "summary": "Payment status (pending/paid)", + "parameters": [{"name": "order_id", "in": "path", "required": True, "schema": {"type": "string"}}], + "responses": {"200": {"description": "status"}}, + }}, + "/api/v1/dedicated/locations": {"get": { + "summary": "Dedicated IP location catalog", + "parameters": [{"name": "product", "in": "query", "schema": {"type": "integer", "enum": [3, 9]}, + "description": "3=datacenter, 9=ISP"}], + "responses": {"200": {"description": "locations"}}, + }}, + }, + } + return jsonify(spec) + + @app.route("/sitemap.xml") def sitemap(): urls = [f"https://{SITE_HOST}/{p}" for p in ["", "plans", "signup", "login", "llms.txt"]] diff --git a/static/style.css b/static/style.css index 94eff88..90a376d 100644 --- a/static/style.css +++ b/static/style.css @@ -45,6 +45,19 @@ body { opacity: 0.6; } +/* ---- cursor glow (follows mouse, subtle) ---- */ +#glow { + position: fixed; + left: 0; top: 0; + width: 520px; height: 520px; + margin-left: -260px; margin-top: -260px; + border-radius: 50%; + pointer-events: none; + z-index: 0; + background: radial-gradient(circle, rgba(0, 229, 255, 0.07), rgba(0, 255, 156, 0.03) 45%, transparent 70%); + will-change: transform; +} + /* ---- grid overlay ---- */ .grid-overlay { position: fixed; diff --git a/templates/base.html b/templates/base.html index 5da3a1b..f5608dc 100644 --- a/templates/base.html +++ b/templates/base.html @@ -6,9 +6,21 @@ {% block title %}Clean Proxys{% endblock %} + + @@ -18,6 +30,7 @@
+