El problema
Los flujos de trabajo n8n que llaman a múltiples API de enriquecimiento (búsqueda, datos de la empresa, perfiles sociales) reciben respuestas en diferentes esquemas. Una API devuelve resultados en una matriz de "datos", otra en "resultados" y otra en "elementos". Los nombres de los campos difieren: 'título', 'nombre' y 'título'. Los tipos difieren: precio como cadena versus número. Cada nodo posterior debe manejar todas las variaciones posibles del esquema, o el flujo de trabajo se interrumpe silenciosamente cuando una API cambia su formato de respuesta. Depurar estas fallas en un generador de flujo de trabajo visual es doloroso porque el error muestra tres nodos posteriores al problema real.
La solucion de Scavio
Cree un subflujo de trabajo normalizador en n8n que se encuentre entre cada llamada a la API de enriquecimiento y su lógica descendente. El normalizador valida la respuesta, asigna campos específicos del proveedor a su esquema canónico, maneja los campos faltantes con valores predeterminados y pasa un objeto uniforme en sentido descendente. El esquema de respuesta consistente de Scavio lo convierte en la fuente más fácil de normalizar porque regresa la misma estructura JSON independientemente de la plataforma. Una plantilla de normalizador cubre Google, YouTube, Amazon, Walmart, Reddit y TikTok.
Antes
Antes de la normalización, los flujos de trabajo de n8n se interrumpían silenciosamente cuando las API de enriquecimiento cambiaban los formatos de respuesta. La depuración requería rastrear datos a través de múltiples nodos para encontrar dónde una discrepancia en el nombre de un campo causaba una falla posterior.
Después
Después de agregar subflujos de trabajo del normalizador, cada nodo posterior recibe esquemas idénticos. Los cambios de formato de API se detectan en la capa del normalizador y solucionarlos requiere actualizar un subflujo de trabajo en lugar de cada nodo que consume los datos.
Para quien es
Los creadores de flujos de trabajo n8n que encadenan múltiples API de enriquecimiento y están cansados de depurar errores de esquema en tres nodos posteriores. Cualquiera que cree flujos de trabajo de automatización complejos que consuman datos de múltiples fuentes.
Beneficios clave
- Esquema canónico en sentido descendente independientemente del formato de API de origen
- Los valores predeterminados de los campos faltantes evitan fallos silenciosos en sentido descendente
- Una plantilla de normalizador cubre las seis plataformas Scavio
- Los cambios de formato de API se detectan y corrigen en un solo lugar
- Subflujo de trabajo n8n reutilizable en múltiples flujos de trabajo principales
Ejemplo en Python
import requests
API_KEY = "your_scavio_api_key"
def normalize_scavio_response(raw: dict, platform: str) -> list[dict]:
"""Normalize Scavio response to canonical schema for n8n downstream nodes."""
normalized = []
for item in raw.get("organic", []):
entry = {
"title": item.get("title", ""),
"url": item.get("link", ""),
"description": item.get("snippet", ""),
"position": item.get("position"),
"source_platform": platform,
}
# Platform-specific enrichment
if platform in ("amazon", "walmart"):
entry["price"] = float(item.get("price", 0)) if item.get("price") else None
entry["rating"] = float(item.get("rating", 0)) if item.get("rating") else None
entry["reviews"] = int(item.get("reviews", 0)) if item.get("reviews") else 0
elif platform == "youtube":
entry["views"] = int(item.get("views", 0)) if item.get("views") else 0
entry["channel"] = item.get("channel", "")
elif platform == "reddit":
entry["score"] = int(item.get("score", 0)) if item.get("score") else 0
entry["comments"] = int(item.get("comments", 0)) if item.get("comments") else 0
entry["subreddit"] = item.get("subreddit", "")
normalized.append(entry)
return normalized
def search_and_normalize(query: str, platform: str) -> list[dict]:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": platform, "query": query},
timeout=15,
)
res.raise_for_status()
return normalize_scavio_response(res.json(), platform)
# Same downstream schema regardless of platform
google_results = search_and_normalize("project management tool", "google")
amazon_results = search_and_normalize("project management book", "amazon")
reddit_results = search_and_normalize("project management tool recommendation", "reddit")
for source in [google_results, amazon_results, reddit_results]:
if source:
print(f"Platform: {source[0]['source_platform']} - {len(source)} results")
print(f" First: {source[0]['title'][:60]}")Ejemplo en JavaScript
const API_KEY = "your_scavio_api_key";
function normalizeResponse(raw, platform) {
return (raw.organic ?? []).map((item) => {
const entry = {
title: item.title ?? "",
url: item.link ?? "",
description: item.snippet ?? "",
position: item.position ?? null,
sourcePlatform: platform,
};
if (["amazon", "walmart"].includes(platform)) {
entry.price = item.price ? Number(item.price) : null;
entry.rating = item.rating ? Number(item.rating) : null;
entry.reviews = item.reviews ? Number(item.reviews) : 0;
} else if (platform === "youtube") {
entry.views = item.views ? Number(item.views) : 0;
entry.channel = item.channel ?? "";
} else if (platform === "reddit") {
entry.score = item.score ? Number(item.score) : 0;
entry.comments = item.comments ? Number(item.comments) : 0;
entry.subreddit = item.subreddit ?? "";
}
return entry;
});
}
async function searchAndNormalize(query, platform) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform, query }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
return normalizeResponse(await res.json(), platform);
}
const google = await searchAndNormalize("project management tool", "google");
const amazon = await searchAndNormalize("project management book", "amazon");
console.log(`Google: ${google.length} results, Amazon: ${amazon.length} results`);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA
YouTube
Búsqueda de videos con transcripciones y metadatos
Amazon
Búsqueda de productos con precios, calificaciones y reseñas
Walmart
Búsqueda de productos con precios y datos de cumplimiento
Comunidad, publicaciones y comentarios en hilos de cualquier subreddit
TikTok
Descubrimiento de videos, creadores y productos en tendencia