Interactive background (mouse parallax + cursor glow) + OpenAPI spec + agent structured data
This commit is contained in:
42
app.py
42
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"]]
|
||||
|
||||
Reference in New Issue
Block a user