Un utilisateur de r/SideProject en avait assez de payer 29 $ ou plus par mois pour des outils SEO qu'il utilisait à peine. Ce tutoriel construit une couche API légère qui enveloppe Scavio, suit les coûts par requête et vous permet (ou à vos utilisateurs) de voir l'utilisation exacte. Considérez cela comme une API SEO mesurée que vous contrôlez.
Prérequis
- Clé API Scavio
- Python 3.8+ avec Flask ou FastAPI
- SQLite pour le suivi d'utilisation
Parcours
Étape 1: Configurer le serveur API
Application FastAPI minimale qui fait proxy vers Scavio avec suivi d'utilisation.
from fastapi import FastAPI, Header, HTTPException
from pydantic import BaseModel
import requests, os, sqlite3, datetime
app = FastAPI()
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
conn = sqlite3.connect('usage.db', check_same_thread=False)
conn.execute('CREATE TABLE IF NOT EXISTS usage (ts TEXT, user TEXT, query TEXT, cost REAL)')
class SearchRequest(BaseModel):
query: str
country_code: str = 'us'Étape 2: Proxifier les requêtes de recherche avec suivi des coûts
Chaque requête enregistre le coût.
@app.post('/seo/rank-check')
async def rank_check(req: SearchRequest, x_user: str = Header()):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H,
json={'platform': 'google', 'query': req.query,
'country_code': req.country_code}).json()
# Log usage: $0.005 per query
conn.execute('INSERT INTO usage VALUES (?, ?, ?, ?)',
(datetime.datetime.now().isoformat(), x_user, req.query, 0.005))
conn.commit()
return {'results': data.get('organic_results', []), 'cost': 0.005}Étape 3: Ajouter un point de terminaison de tableau de bord d'utilisation
Permettez aux utilisateurs de voir leur utilisation et leurs coûts.
@app.get('/usage/{user}')
async def get_usage(user: str):
rows = conn.execute(
'SELECT date(ts) as day, count(*) as queries, sum(cost) as total '
'FROM usage WHERE user=? GROUP BY date(ts) ORDER BY day DESC LIMIT 30',
(user,)).fetchall()
return {'user': user,
'daily_usage': [{'date': r[0], 'queries': r[1], 'cost': r[2]} for r in rows],
'total_cost': sum(r[2] for r in rows)}Étape 4: Ajouter des limites de budget
Empêcher les utilisateurs de dépasser un budget mensuel.
@app.post('/seo/rank-check-metered')
async def rank_check_metered(req: SearchRequest, x_user: str = Header()):
monthly_spend = conn.execute(
'SELECT sum(cost) FROM usage WHERE user=? AND ts >= date("now", "start of month")',
(x_user,)).fetchone()[0] or 0
budget = 5.00 # $5/month default budget
if monthly_spend >= budget:
raise HTTPException(429, f'Monthly budget of ${budget} exceeded. Current: ${monthly_spend:.2f}')
return await rank_check(req, x_user)Exemple Python
# Self-hosted metered SEO API:
# $0.005 per rank check via Scavio
# SQLite tracks per-user usage
# Budget limits prevent overuse
# 100 queries/month = $0.50 vs $29+ for Ahrefs StarterExemple JavaScript
// Express.js equivalent:
app.post('/seo/rank-check', async (req, res) => {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform: 'google', query: req.body.query})
}).then(r => r.json());
// log usage to DB
res.json({results: data.organic_results, cost: 0.005});
});Sortie attendue
Self-hosted metered SEO API with per-query cost tracking, usage dashboard, and budget limits. 100 queries/month = $0.50 vs Ahrefs Starter at $29/mo.