Le problème
Les développeurs créant des prototypes basés sur la recherche épuisent le niveau gratuit d'un seul fournisseur en quelques jours. Changer de fournisseur implique de réécrire les appels API et la logique d'analyse. La plupart des niveaux gratuits sont trop petits pour des tests appropriés : Tavily donne 1K/mois, Brave donne 5 $ de crédit, Scavio donne 250 crédits. Aucun niveau gratuit seul ne suffit pour le développement.
La solution Scavio
Cumulez les niveaux gratuits des fournisseurs avec un wrapper de rotation. Les 250 crédits gratuits/mois de Scavio, les 1K requêtes gratuites/mois de Tavily et les 5 $ de crédit mensuel de Brave se combinent pour offrir 2K+ recherches gratuites pour le prototypage. Le wrapper essaie chaque fournisseur dans l'ordre et normalise les réponses en un schéma commun.
Avant
Un développeur utilise le niveau gratuit de Tavily. Il s'épuise en 3 jours de développement actif. Il passe à Brave, réécrit le code d'analyse. Il s'épuise à nouveau. Le développement s'arrête.
Après
Le wrapper de rotation cumule 3 niveaux gratuits. 2K+ recherches gratuites par mois. Schéma de réponse commun. Le développement se poursuit sans interruption.
À qui cela s'adresse
Développeurs en phase de prototypage qui souhaitent maximiser l'utilisation gratuite de l'API de recherche avant de s'engager dans un plan payant.
Avantages clés
- 2K+ recherches gratuites/mois sur l'ensemble des fournisseurs cumulés
- Schéma de réponse normalisé entre les fournisseurs
- Bascule automatique lorsqu'un niveau est épuisé
- Coût nul pendant la phase de prototypage
- Migration facile vers le niveau payant quand vous êtes prêt
Exemple Python
import requests, os, json
from pathlib import Path
SCAVIO_KEY = os.environ.get("SCAVIO_API_KEY", "")
USAGE_FILE = Path("free_tier_usage.json")
def load_usage() -> dict:
if USAGE_FILE.exists():
return json.loads(USAGE_FILE.read_text())
return {"scavio": 0, "scavio_limit": 250}
def save_usage(usage: dict):
USAGE_FILE.write_text(json.dumps(usage))
def scavio_free(query: str) -> dict:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": SCAVIO_KEY, "Content-Type": "application/json"},
json={"query": query, "country_code": "us"},
timeout=10,
)
if resp.status_code == 200:
data = resp.json()
return {"provider": "scavio", "results": data.get("organic_results", [])}
return None
def rotate_search(query: str) -> dict:
usage = load_usage()
# Try Scavio first (250 free/month)
if usage["scavio"] < usage["scavio_limit"] and SCAVIO_KEY:
result = scavio_free(query)
if result:
usage["scavio"] += 1
save_usage(usage)
return result
return {"provider": "exhausted", "results": []}
result = rotate_search("fastapi deployment best practices")
print(f"Provider: {result['provider']}, Results: {len(result['results'])}")Exemple JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = await import('fs');
function loadUsage() {
try { return JSON.parse(fs.readFileSync('free_tier_usage.json','utf8')); } catch { return {scavio:0, scavioLimit:250}; }
}
function saveUsage(u) { fs.writeFileSync('free_tier_usage.json', JSON.stringify(u)); }
async function scavioFree(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query, country_code:'us'})});
if (r.ok) { const d = await r.json(); return {provider:'scavio', results:d.organic_results||[]}; }
return null;
}
async function rotateSearch(query) {
const usage = loadUsage();
if (usage.scavio < usage.scavioLimit) {
const r = await scavioFree(query);
if (r) { usage.scavio++; saveUsage(usage); return r; }
}
return {provider:'exhausted', results:[]};
}
const r = await rotateSearch('fastapi deployment best practices');
console.log('Provider: '+r.provider+', Results: '+r.results.length);Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA