Guía pública de integración
Jumpseller privilegiado para Scry
Esta guía está escrita para responder la pregunta literal: dónde empiezo, qué abro, qué escribo y cómo sé si quedó funcionando. La meta es crear una URL privada que entregue JSON para Scry.
Lee esto primero
Con solo el admin normal de Jumpseller no vas a terminar toda esta integración. Necesitas un lugar donde se pueda crear una URL que devuelva JSON: una app, un backend, una función serverless o un servicio mantenido por tu desarrollador o agencia.
Qué vas a tener al final
Una URL privada, por ejemplo GET /scry/offers, que recibe el nombre de una carta y devuelve variantes con precio, stock y URL pública en formato JSON.
Caso A
Solo tengo acceso al admin de Jumpseller
- Entra al admin de tu tienda.
- Abre el menú
Apps.
- Revisa si ya existe una app propia, una integración privada o un responsable técnico que mantenga algo conectado a la tienda.
- Si no existe nada de eso, detente aquí: no empieces por el theme ni por custom code.
- Envía esta guía a tu desarrollador o agencia y pídeles que creen una URL privada para Scry.
El admin de Jumpseller sirve para identificar tu punto de apoyo técnico. No suele ser el lugar donde se programa esta integración completa.
Caso B
Tengo desarrollador, agencia o backend
- Empieza en ese proyecto técnico, no en el admin de Jumpseller.
- Abre el proyecto en un editor de código, por ejemplo VS Code.
- Abre una terminal dentro de ese proyecto.
- Crea una ruta HTTP privada, por ejemplo
GET /scry/offers.
- Haz que esa ruta devuelva JSON.
Si ya tienes un sistema donde se puede programar, ahí es donde parte esto. La terminal se usa dentro de ese proyecto, no dentro de Jumpseller.
Recordatorio
No partas por FTP ni por el theme
- FTP por sí solo no crea una URL JSON.
- Subir archivos por FTP solo ayuda si ya tienes un servidor que ejecuta backend.
- El custom code del theme sirve mejor para frontend, snippets o scripts visuales.
- Esta integración necesita lógica de servidor, autenticación y respuesta JSON.
Texto útil
Texto corto para copiar y pegar
Necesitamos una URL privada para Scry.
Debe ser un GET /scry/offers
Debe recibir: name y limit
Debe protegerse con token por header
Debe devolver JSON con:
- variant_key
- offer_title
- price_clp
- stock
- product_url
- image_url (ideal)
Cuando esté lista, solo necesitamos:
- URL
- nombre del header
- token
Paso 2
Si tú mismo lo vas a programar, empieza así
- Abre VS Code o tu editor de código.
- Crea una carpeta nueva para esta integración, por ejemplo
scry-jumpseller-feed.
- Abre esa carpeta en el editor.
- Abre una terminal dentro del editor.
- Ejecuta los comandos del siguiente bloque para crear un servidor mínimo.
Comandos de ejemplo con Node.js
mkdir scry-jumpseller-feed
cd scry-jumpseller-feed
npm init -y
npm install express
Si no usas Node.js, no pasa nada: este bloque es solo una forma concreta y fácil de partir. La lógica se puede hacer en cualquier stack.
Paso 3
Crea un archivo server.js y pega esto
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
const TOKEN = process.env.SCRY_TOKEN || "cambia-este-token";
const catalog = [
{
variant_key: "store-variant-001",
offer_title: "Lightning Bolt | English | NM | Secret Lair",
source_title: "Lightning Bolt | English | NM | Secret Lair",
price_clp: 12990,
stock: 1,
product_url: "https://store.example.com/lightning-bolt-secret-lair",
image_url: "https://cdn.example.com/products/lightning-bolt.jpg"
}
];
function searchCatalog(name, limit) {
const query = String(name || "").trim().toLowerCase();
if (!query) return [];
return catalog
.filter((item) => item.offer_title.toLowerCase().includes(query))
.slice(0, limit);
}
app.get("/scry/offers", (req, res) => {
const token = req.get("X-Internal-Token");
if (token !== TOKEN) {
return res.status(401).json({ ok: false, error: "unauthorized" });
}
const name = String(req.query.name || "").trim();
const limit = Math.min(Number(req.query.limit || 20), 50);
if (!name) {
return res.status(400).json({ ok: false, error: "missing_name" });
}
const offers = searchCatalog(name, limit);
return res.json({ ok: true, offers });
});
app.listen(PORT, () => {
console.log(`Listening on http://localhost:${PORT}`);
});
Este archivo crea una URL real que ya responde JSON. Después solo debes reemplazar catalog por tu fuente real de productos o variantes.
Paso 4
Cómo correr el ejemplo
SCRY_TOKEN="cambia-este-token" node server.js
Si ves Listening on http://localhost:3000, tu endpoint ya está corriendo en local.
Paso 5
Cómo probar si responde JSON
curl -H "X-Internal-Token: cambia-este-token" "http://localhost:3000/scry/offers?name=Lightning%20Bolt&limit=20"
Si el resultado es JSON y no HTML, ya tienes la base correcta.
Qué hace este ejemplo
Qué estás creando realmente
- Crea una URL técnica:
/scry/offers.
- Protege esa URL con un token.
- Lee
name y limit desde la request.
- Busca datos en una lista de ejemplo.
- Devuelve esos datos como JSON.
Paso 6
Lo único que debes reemplazar
- Reemplaza
catalog por tu fuente real de productos.
- Haz que la búsqueda encuentre cartas reales desde tu tienda.
- Genera un
variant_key estable por variante.
- Deja
price_clp como entero en pesos chilenos.
- Publica el servicio en una URL accesible desde internet.
Ejemplo de salida
Respuesta aceptada
{
"ok": true,
"offers": [
{
"variant_key": "store-variant-001",
"offer_title": "Lightning Bolt | English | NM | Secret Lair",
"source_title": "Lightning Bolt | English | NM | Secret Lair",
"price_clp": 12990,
"stock": 1,
"product_url": "https://store.example.com/lightning-bolt-secret-lair",
"image_url": "https://cdn.example.com/products/lightning-bolt.jpg"
}
]
}
Herramientas
Qué te va a ayudar
- VS Code o editor similar.
- Terminal integrada del editor.
- Node.js para este ejemplo concreto.
curl, Postman o Insomnia para probar.
- ChatGPT para adaptar la búsqueda a tu catálogo real.
Campos
Mínimos y recomendados
| Campo | Estado | Notas |
variant_key | Obligatorio | Debe ser estable en el tiempo por variante. |
offer_title | Obligatorio | Título visible de la oferta. |
price_clp | Obligatorio | Entero en CLP, ya normalizado. |
stock | Obligatorio | Entero; para Scry basta disponible/no disponible. |
product_url | Obligatorio | URL absoluta y pública. |
image_url | Recomendado | URL absoluta de imagen. |
source_title | Recomendado | Título original interno de la tienda. |
language, condition, finish | Recomendado | Útiles para matching y preload fino. |
set_code, collector_number, updated_at | Recomendado | Buenos candidatos para etapas siguientes. |
Activación
Qué necesita Scry de tu lado
JUMPSELLER_PRIVILEGED_{STORE}_URL
JUMPSELLER_PRIVILEGED_{STORE}_TOKEN
JUMPSELLER_PRIVILEGED_{STORE}_HEADER
En la práctica, tú no configuras esto dentro de Scry. Tú solo envías: URL final, token y nombre del header. Scry hace la activación.
Paso 7
Cuándo la integración ya está lista
- La URL responde JSON desde internet.
- El token funciona.
- La carta consultada devuelve variantes correctas.
- El precio y stock cambian cuando cambia tu catálogo real.
- Scry confirma que la integración quedó activada.
Resumen
La idea completa en una frase
Empiezas en un proyecto donde se pueda programar una URL, no en el frontend de la tienda; creas /scry/offers, haces que responda JSON y luego le envías a Scry la URL, el token y el header.