Obtén un producto de Amazon por ASIN con un solo POST a https://api.scavio.dev/api/v1/amazon/product y luego aplica tu propia lógica de sentimiento y posición de precio sobre el título, el precio, la valoración y el texto de las reseñas que devuelve. Los datos crudos por sí solos no responden nada. Un fundador en r/SideProject recibió ese comentario tras lanzar una API de productos de Amazon: la gente no quiere "otro endpoint de búsqueda", quiere sentimiento agregado de las reseñas, señales de tendencia de precio y posicionamiento. Este tutorial muestra los cuatro pasos que convierten una respuesta estructurada en un pequeño informe de decisión. El paso de sentimiento es una heurística que ejecutas sobre texto real, no un modelo con una precisión medida.
Requisitos previos
- Una clave de API de Scavio (50 créditos gratis al registrarte, sin tarjeta). Envíala como Authorization: Bearer {API_KEY}.
- Un ASIN de Amazon para inspeccionar (el código de 10 caracteres en la URL del producto, p. ej. B08N5WRWNW).
- Python 3.9+ o Node 18+ con forma de enviar JSON (requests / fetch).
- Opcional: una clave de LLM si quieres reemplazar el léxico del paso 2 por una pasada con modelo.
Guia paso a paso
Paso 1: 1. Obtén el producto por ASIN
Envía el ASIN como query al endpoint de producto de Amazon. Cuesta 1 crédito y devuelve el título, el precio actual, la valoración media, el número de reseñas y varios textos de reseñas individuales. Es el payload estructurado sobre el que corre todo lo demás, así que captúralo una vez y reúsalo.
curl -X POST https://api.scavio.dev/api/v1/amazon/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "B08N5WRWNW"}'Paso 2: 2. Agrega el sentimiento de las reseñas (heurística)
Aplica un léxico simple de positivo/negativo sobre cada reseña, o envía esos mismos textos a un LLM en una sola pasada. Cuenta cuántas reseñas se inclinan a positivo, negativo o neutral y saca las palabras que disparan los negativos. Trátalo como una heurística direccional sobre texto real, no como una puntuación calibrada. No informes un porcentaje de precisión que no mediste. La señal útil es la forma del desglose y los términos de queja recurrentes, que es lo que necesita una decisión de intención de compra.
POS = {"great", "love", "perfect", "works", "quality", "easy"}
NEG = {"broke", "cheap", "return", "stopped", "disappointed", "slow"}
def classify(text):
t = text.lower()
p = sum(w in t for w in POS)
n = sum(w in t for w in NEG)
if p > n: return "positive"
if n > p: return "negative"
return "neutral"
reviews = [r["text"] for r in product["reviews"]]
breakdown = {"positive": 0, "negative": 0, "neutral": 0}
for r in reviews:
breakdown[classify(r)] += 1Paso 3: 3. Marca la posición de precio
Compara el precio en vivo con la valoración y el volumen de reseñas de la misma respuesta. Un precio alto con valoración baja y pocas reseñas es una posición débil; un precio competitivo con buena valoración y muchas reseñas es una posición fuerte. Codifícalo como una regla simple para que la salida sea una bandera accionable por una persona o un agente, no un número crudo.
def price_flag(price, rating, n_reviews):
if rating >= 4.3 and n_reviews >= 500:
return "strong" if price <= 50 else "premium-justified"
if rating < 3.8 or n_reviews < 50:
return "weak"
return "neutral"
flag = price_flag(product["price"], product["rating"], product["review_count"])Paso 4: 4. (Opcional) Verifica la demanda en Google Shopping
Envía el título del producto a https://api.scavio.dev/api/v1/google para ver si aparece en Shopping y en resultados orgánicos, lo que sugiere listados competidores y demanda en vivo. Usa light_request: false para todas las funciones del SERP (2 créditos) o la ruta light (1 crédito) si solo necesitas enlaces orgánicos. Es un control de la vista solo-Amazon, no un reemplazo.
curl -X POST https://api.scavio.dev/api/v1/google \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "Echo Dot 5th gen", "light_request": false}'Ejemplo en Python
import os, requests
KEY = os.environ["SCAVIO_API_KEY"]
HEAD = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}
# 1. Product by ASIN (1 credit)
product = requests.post(
"https://api.scavio.dev/api/v1/amazon/product",
headers=HEAD, json={"query": "B08N5WRWNW"},
).json()
# 2. Sentiment heuristic over real returned review text
POS = {"great", "love", "perfect", "works", "quality", "easy"}
NEG = {"broke", "cheap", "return", "stopped", "disappointed", "slow"}
def classify(text):
t = text.lower()
p, n = sum(w in t for w in POS), sum(w in t for w in NEG)
return "positive" if p > n else "negative" if n > p else "neutral"
reviews = [r["text"] for r in product.get("reviews", [])]
breakdown = {"positive": 0, "negative": 0, "neutral": 0}
for r in reviews:
breakdown[classify(r)] += 1
# 3. Price-position flag
def price_flag(price, rating, n):
if rating >= 4.3 and n >= 500:
return "strong" if price <= 50 else "premium-justified"
if rating < 3.8 or n < 50:
return "weak"
return "neutral"
flag = price_flag(product["price"], product["rating"], product["review_count"])
print({
"asin": "B08N5WRWNW",
"title": product["title"],
"price": product["price"],
"rating": product["rating"],
"reviews_sampled": len(reviews),
"sentiment": breakdown,
"price_position": flag,
"note": "sentiment is a lexicon heuristic, not a benchmarked score",
})Ejemplo en JavaScript
const KEY = process.env.SCAVIO_API_KEY;
const HEAD = { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" };
// 1. Product by ASIN (1 credit)
const product = await (await fetch("https://api.scavio.dev/api/v1/amazon/product", {
method: "POST", headers: HEAD, body: JSON.stringify({ query: "B08N5WRWNW" }),
})).json();
// 2. Sentiment heuristic over real returned review text
const POS = ["great", "love", "perfect", "works", "quality", "easy"];
const NEG = ["broke", "cheap", "return", "stopped", "disappointed", "slow"];
const classify = (text) => {
const t = text.toLowerCase();
const p = POS.filter((w) => t.includes(w)).length;
const n = NEG.filter((w) => t.includes(w)).length;
return p > n ? "positive" : n > p ? "negative" : "neutral";
};
const reviews = (product.reviews || []).map((r) => r.text);
const breakdown = { positive: 0, negative: 0, neutral: 0 };
for (const r of reviews) breakdown[classify(r)]++;
// 3. Price-position flag
const priceFlag = (price, rating, n) => {
if (rating >= 4.3 && n >= 500) return price <= 50 ? "strong" : "premium-justified";
if (rating < 3.8 || n < 50) return "weak";
return "neutral";
};
const flag = priceFlag(product.price, product.rating, product.review_count);
console.log({
asin: "B08N5WRWNW",
title: product.title,
price: product.price,
rating: product.rating,
reviews_sampled: reviews.length,
sentiment: breakdown,
price_position: flag,
note: "sentiment is a lexicon heuristic, not a benchmarked score",
});Salida esperada
{
"asin": "B08N5WRWNW",
"title": "Echo Dot (5th Gen)",
"price": 49.99,
"rating": 4.6,
"reviews_sampled": 20,
"sentiment": { "positive": 14, "negative": 3, "neutral": 3 },
"price_position": "premium-justified",
"note": "sentiment is a lexicon heuristic, not a benchmarked score"
}