Agregue capacidades de búsqueda en vivo a su producto SaaS integrando una API de búsqueda en su backend y exponiéndola a través de sus propios puntos finales. Esto evita el envío de claves API de terceros al cliente y le permite aplicar límites de velocidad, almacenamiento en caché y control de acceso en la capa de aplicación. La API multiplataforma de clave única de Scavio simplifica esto porque una integración cubre los resultados de Google, YouTube, Amazon, Reddit y Walmart. Este tutorial crea un proxy de búsqueda listo para producción con almacenamiento en caché y limitación de velocidad por usuario.
Requisitos previos
- Un servicio backend en ejecución (Python/Flask, Express o similar)
- Una clave API de Scavio de scavio.dev
- Comprensión básica del diseño de API REST
- Redis o un caché en memoria (opcional pero recomendado)
Guia paso a paso
Paso 1: Crear el punto final del proxy de búsqueda
Cree un punto final de backend que reciba solicitudes de búsqueda desde su frontend y las envíe a través de Scavio.
from flask import Flask, request, jsonify
import requests, os
app = Flask(__name__)
API_KEY = os.environ['SCAVIO_API_KEY']
@app.route('/api/search', methods=['POST'])
def search():
body = request.json
query = body.get('query', '')
platform = body.get('platform', 'google')
if not query:
return jsonify({'error': 'query required'}), 400
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': platform, 'query': query}, timeout=10)
return jsonify(resp.json()), resp.status_codePaso 2: Agregar almacenamiento en caché de respuestas
Almacene en caché los resultados de búsqueda por consulta+clave de plataforma con un TTL para reducir las llamadas a la API y mejorar los tiempos de respuesta para consultas repetidas.
from functools import lru_cache
import hashlib, time
cache = {}
CACHE_TTL = 300 # 5 minutes
def cached_search(query: str, platform: str) -> dict:
key = hashlib.md5(f'{platform}:{query}'.encode()).hexdigest()
if key in cache and time.time() - cache[key]['ts'] < CACHE_TTL:
return cache[key]['data']
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': platform, 'query': query}, timeout=10)
data = resp.json()
cache[key] = {'data': data, 'ts': time.time()}
return dataPaso 3: Agregar limitación de tarifa por usuario
Limite la cantidad de búsquedas que cada usuario puede realizar por minuto para proteger su presupuesto de crédito API.
from collections import defaultdict
rate_limits = defaultdict(list)
MAX_PER_MINUTE = 10
def check_rate_limit(user_id: str) -> bool:
now = time.time()
rate_limits[user_id] = [t for t in rate_limits[user_id] if now - t < 60]
if len(rate_limits[user_id]) >= MAX_PER_MINUTE:
return False
rate_limits[user_id].append(now)
return True
@app.route('/api/search', methods=['POST'])
def search_with_limits():
user_id = request.headers.get('X-User-Id', 'anon')
if not check_rate_limit(user_id):
return jsonify({'error': 'rate limit exceeded'}), 429
body = request.json
data = cached_search(body.get('query', ''), body.get('platform', 'google'))
return jsonify(data)Ejemplo en Python
from flask import Flask, request, jsonify
import requests, os, time, hashlib
app = Flask(__name__)
API_KEY = os.environ['SCAVIO_API_KEY']
cache = {}
@app.route('/api/search', methods=['POST'])
def search():
q = request.json.get('query', '')
key = hashlib.md5(q.encode()).hexdigest()
if key in cache and time.time() - cache[key]['ts'] < 300:
return jsonify(cache[key]['data'])
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY}, json={'platform': 'google', 'query': q})
cache[key] = {'data': resp.json(), 'ts': time.time()}
return jsonify(cache[key]['data'])Ejemplo en JavaScript
import express from 'express';
const app = express();
app.use(express.json());
const cache = new Map();
app.post('/api/search', async (req, res) => {
const {query, platform = 'google'} = req.body;
const key = `${platform}:${query}`;
const cached = cache.get(key);
if (cached && Date.now() - cached.ts < 300000) return res.json(cached.data);
const r = 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, query})
});
const data = await r.json();
cache.set(key, {data, ts: Date.now()});
res.json(data);
});
app.listen(3000);Salida esperada
A backend search proxy endpoint that caches results and enforces per-user rate limits, exposing Scavio search through your own SaaS API.