Un post sur r/SideProject demandait un outil qui vérifie la demande sur Reddit avec des filtres de récence. Ce tutoriel construit cet outil sous forme d'API REST : il enveloppe l'endpoint Reddit de Scavio, ajoute des fenêtres de récence configurables (1j, 7j, 30j) et score l'intensité de la demande. Déployez-le et vous obtenez un endpoint de validation réutilisable.
Prérequis
- Clé API Scavio
- Python 3.8+ avec FastAPI
- uvicorn pour le déploiement
Parcours
Étape 1: Configurer le projet FastAPI
API minimale avec un seul endpoint.
from fastapi import FastAPI, Query
from pydantic import BaseModel
from datetime import datetime, timedelta
import requests, os
app = FastAPI(title='Reddit Demand API')
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
class DemandResult(BaseModel):
query: str
window: str
post_count: int
demand_score: int
top_posts: listÉtape 2: Construire l'endpoint de demande
Endpoint unique avec paramètre de filtre de récence.
@app.get('/demand', response_model=DemandResult)
async def check_demand(
query: str,
window: str = Query('7d', regex='^(1d|7d|30d)$')
):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H,
json={'platform': 'reddit', 'query': query, 'sort': 'new'}).json()
results = data.get('results', [])
# Filter by recency
days = {'1d': 1, '7d': 7, '30d': 30}[window]
cutoff = datetime.now() - timedelta(days=days)
recent = []
for r in results:
post_date = r.get('date', '')
if post_date:
try:
dt = datetime.fromisoformat(post_date.replace('Z', '+00:00'))
if dt.replace(tzinfo=None) >= cutoff:
recent.append(r)
except ValueError:
continue
# Score demand
score = sum(r.get('upvotes', 0) + r.get('comments', 0) * 2 for r in recent)
return DemandResult(
query=query, window=window, post_count=len(recent),
demand_score=score,
top_posts=[{'title': r.get('title', ''), 'upvotes': r.get('upvotes', 0),
'subreddit': r.get('subreddit', ''), 'url': r.get('url', '')}
for r in recent[:10]])Étape 3: Ajouter un endpoint de validation par lot
Vérifier plusieurs idées à la fois.
@app.post('/demand/batch')
async def batch_demand(queries: list[str], window: str = '7d'):
results = []
for q in queries:
result = await check_demand(q, window)
results.append(result)
# Sort by demand score descending
results.sort(key=lambda x: x.demand_score, reverse=True)
return resultsÉtape 4: Lancer le serveur
Démarrer l'API avec uvicorn.
# Install: pip install fastapi uvicorn requests
# Run: uvicorn demand_api:app --reload --port 8000
#
# Test: curl 'http://localhost:8000/demand?query=invoice+tool&window=7d'
#
# Cost: each demand check = 1 Scavio query = $0.005Exemple Python
# Full demand API server:
# pip install fastapi uvicorn requests
# uvicorn demand_api:app --port 8000
#
# GET /demand?query=crm+for+freelancers&window=7d
# POST /demand/batch with ["idea1", "idea2", "idea3"]
#
# Each check: 1 query = $0.005 via ScavioExemple JavaScript
// Call the demand API from JS:
const res = await fetch('http://localhost:8000/demand?query=invoice+tool&window=7d');
const data = await res.json();
console.log(`Demand score: ${data.demand_score}, Posts: ${data.post_count}`);Sortie attendue
REST API at /demand with recency filtering (1d/7d/30d) and demand scoring. Batch endpoint for validating multiple ideas. Each query costs $0.005.