Resumen
Wrap search calls in un failover chain: intentar primary vendor, catch errores o timeouts, rotate to secondary. Log cual vendor served cada solicitud for cost seguimiento. Keeps uptime above 99.9% incluso durante vendor outages.
Desencadenador
Every search solicitud in produccion
Programación
Every search solicitud
Pasos del flujo de trabajo
Define vendor priority lista
Primary: Scavio. Secondary: Serper. Tertiary: Brave Search API. Almacenado in config.
Try primary vendor
POST to Scavio /api/v1/search con 5s timeout.
On failure: rotate to secondary
Catch timeout/5xx, registro el failure, intentar Serper con same consulta.
On failure: rotate to tertiary
Si secondary tambien fails, intentar Brave Search API.
Log vendor usado
Record cual vendor served el respuesta for cost reconciliation y confiabilidad metricas.
Return resultado to caller
Caller sees un unified respuesta shape regardless of cual vendor served it.
Implementacion en Python
import requests, os, time
vendors = [
{"name": "scavio", "url": "https://api.scavio.dev/api/v1/search",
"headers": {"x-api-key": os.environ["SCAVIO_API_KEY"]},
"body": lambda q: {"query": q, "platform": "google", "limit": 10}},
{"name": "serper", "url": "https://google.serper.dev/search",
"headers": {"X-API-KEY": os.environ.get("SERPER_KEY", "")},
"body": lambda q: {"q": q}},
]
def search_with_failover(query: str):
for v in vendors:
try:
resp = requests.post(v["url"], headers=v["headers"],
json=v["body"](query), timeout=5)
resp.raise_for_status()
return {"vendor": v["name"], "results": resp.json()}
except Exception as e:
print(f"{v['name']} failed: {e}")
raise RuntimeError("All vendors failed")
print(search_with_failover("best crm 2026"))Implementacion en JavaScript
async function searchWithFailover(query) {
const vendors = [
{ name: "scavio", url: "https://api.scavio.dev/api/v1/search",
headers: { "x-api-key": process.env.SCAVIO_API_KEY },
body: { query, platform: "google", limit: 10 } },
{ name: "serper", url: "https://google.serper.dev/search",
headers: { "X-API-KEY": process.env.SERPER_KEY },
body: { q: query } },
];
for (const v of vendors) {
try {
const resp = await fetch(v.url, {
method: "POST", headers: { ...v.headers, "Content-Type": "application/json" },
body: JSON.stringify(v.body), signal: AbortSignal.timeout(5000)
});
if (!resp.ok) throw new Error(resp.statusText);
return { vendor: v.name, results: await resp.json() };
} catch (e) { console.error(`${v.name} failed: ${e.message}`); }
}
throw new Error("All vendors failed");
}Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA