pryscraper/routers/referrals.py
cryptorugmunch 2f1eec2f78
Some checks failed
CI / lint (pull_request) Successful in 33s
CI / typecheck (pull_request) Failing after 1m42s
CI / test (pull_request) Failing after 2m33s
CI / security (pull_request) Failing after 39s
CI / gitleaks (pull_request) Successful in 36s
CI / commitlint (pull_request) Failing after 10s
style: ruff format
2026-07-03 18:12:36 +02:00

80 lines
2.5 KiB
Python

"""Pry — Referrals router (remaining api.py routes).
Auto-extracted from api.py during the router-split refactor.
"""
# SPDX-License-Identifier: MIT
# Copyright (c) 2026 Rug Munch Media LLC
from __future__ import annotations
import logging
from typing import Any
from fastapi import APIRouter, Body
logger = logging.getLogger(__name__)
router = APIRouter(tags=["Referrals"])
@router.get(
"/v1/referrals/catalog",
tags=["Referrals"],
summary="Get all available referral/affiliate programs",
)
async def get_referral_catalog(category: str = "") -> dict[str, Any]:
"""List all referral programs Pry supports.
60+ providers across categories: LLM, hosting, domains, CDN, email,
monitoring, proxies, voice, media, devtools, search, CAPTCHA.
"""
from referrals import ReferralTracker
return {"success": True, "data": ReferralTracker().get_catalog(category)}
@router.get(
"/v1/referrals/stats", tags=["Referrals"], summary="Get referral click and conversion stats"
)
async def get_referral_stats(days_back: int = 30) -> dict[str, Any]:
"""Get referral tracking statistics for the last N days."""
from referrals import ReferralTracker
return {"success": True, "data": ReferralTracker().get_stats(days_back)}
@router.post("/v1/referrals/click", tags=["Referrals"], summary="Record a referral link click")
async def record_referral_click(
provider_tag: str = Body(...),
source: str = Body("api"),
user_id: str = Body(""),
) -> dict[str, Any]:
"""Record when a user clicks a referral link. Returns tracking ID."""
from referrals import PROVIDER_CATALOG, ReferralTracker
url = ""
for _cat, providers in PROVIDER_CATALOG.items():
for p in providers:
if p.get("tag") == provider_tag:
url = p["url"]
break
if url:
break
if not url:
return {"success": False, "error": f"Unknown provider: {provider_tag}"}
click_id = ReferralTracker().record_click(provider_tag, url, source, user_id)
return {"success": True, "data": {"click_id": click_id, "url": url}}
@router.post("/v1/referrals/convert", tags=["Referrals"], summary="Record a referral conversion")
async def record_referral_conversion(
click_id: str = Body(...),
revenue_usd: float = Body(0.0),
notes: str = Body(""),
) -> dict[str, Any]:
"""Record that a referral click resulted in a conversion."""
from referrals import ReferralTracker
success = ReferralTracker().record_conversion(click_id, revenue_usd, notes)
return {"success": success}