01 / PREPARACIÓN
Qué necesitas para comenzar
Esta guía explica una integración a medida para tu tienda. No es una app lista para instalar: necesitas un desarrollador que configure el servidor y el formulario.
Tu cuenta en GetAPI
Un plan activo y tu API key. La suscripción y el consumo se gestionan en GetAPI.
Ver planes →Acceso a Shopify
Permisos para instalar una app personalizada y editar una copia del tema.
Un backend con HTTPS
Un servidor Node.js para proteger la clave, validar solicitudes y controlar el consumo.
GetAPI identifica el vehículo. Puedes mostrar sus datos o usarlos en tu flujo de cotización. La compatibilidad con productos requiere reglas y datos propios del comercio.
02 / ARQUITECTURA
Tu clave se queda en el servidor
El navegador consulta una ruta de tu tienda. Shopify envía la solicitud firmada al backend de tu integración y este consulta GetAPI.
La respuesta recorre el camino inverso. No agregues tu API key a Liquid, JavaScript público ni campos del tema. La firma del proxy valida el origen de la solicitud; además necesitas límites para evitar consumo abusivo.
03 / IMPLEMENTACIÓN
De la API a tu tienda, paso a paso
Obtén tu API key y prueba el endpoint
Contrata el plan adecuado y prueba una patente conocida desde tu servidor o Postman. Revisa los campos y permisos en la documentación. Los datos disponibles pueden variar por vehículo y plan.
curl 'https://chile.getapi.cl/v1/vehicles/plate/ABCD12' --header 'x-api-key: TU_API_KEY'Crea la integración de Shopify
Desde el Dev Dashboard, crea una app con la plantilla React Router de Shopify CLI. Usa una tienda de desarrollo para probar. Para una sola tienda puedes elegir distribución personalizada e instalarla con su autorización.
Es una app técnica propia de la tienda, no una app GetAPI publicada en el App Store. Crear una app con Shopify →
Configura los secretos del backend
Define estas variables en el servidor que aloja tu integración. Mantén también las variables y el almacenamiento de sesiones de la plantilla de Shopify.
GETAPI_API_KEY=tu_clave_privada SHOPIFY_SHOP=tu-tienda.myshopify.comConecta el App Proxy
Agrega
write_app_proxya los permisos existentes enshopify.app.toml, configura el proxy y despliega la configuración. Autoriza los nuevos permisos si Shopify lo solicita.[app_proxy] url = "/proxy" prefix = "apps" subpath = "getapi"Con esta configuración,
/apps/getapi/vehiculose envía a/proxy/vehiculoen tu backend. Si cambias el prefijo o la ruta en Shopify, actualiza también el formulario.Agrega el endpoint y el formulario
Usa los ejemplos de abajo. En una copia del tema, abre el editor visual y agrega un bloque «Liquid personalizado» donde esté disponible. Pega el formulario una sola vez por página. El ejemplo muestra los datos; no modifica el carrito ni guarda información en pedidos.
Despliega y valida antes de activar
Aloja el backend en HTTPS, actualiza la URL de la app y comprueba la instalación y las consultas. Completa los límites de consumo y la lista de validación antes de publicar el tema.
04 / PARA TU DESARROLLADOR
Ejemplos para adaptar a tu tienda
Base para una integración de una sola tienda con la plantilla React Router de Shopify. No es un paquete de producción: debes incorporar límites por tienda y visitante, monitoreo y la política de datos que corresponda a tu uso.
Backend · app/routes/proxy.vehiculo.ts
// app/routes/proxy.vehiculo.ts — plantilla Shopify React Router
import { authenticate } from "../shopify.server";
import type { LoaderFunctionArgs } from "react-router";
export async function loader({ request }: LoaderFunctionArgs) {
const { session } = await authenticate.public.appProxy(request);
if (!session || session.shop !== process.env.SHOPIFY_SHOP) {
return Response.json({ message: "Tienda no autorizada" }, { status: 403 });
}
const headers = { "Cache-Control": "no-store" };
const plate = (new URL(request.url).searchParams.get("plate") || "")
.toUpperCase().replace(/[\s-]/g, "");
if (!/^[A-Z0-9]{5,6}$/.test(plate)) {
return Response.json({ message: "Revisa la patente" }, { status: 400, headers });
}
if (!process.env.GETAPI_API_KEY) {
return Response.json({ message: "Servicio sin configurar" }, { status: 503, headers });
}
// Antes de llamar a GetAPI: aplicar límites por tienda y visitante.
try {
const response = await fetch(
"https://chile.getapi.cl/v1/vehicles/plate/" + encodeURIComponent(plate),
{ headers: { "x-api-key": process.env.GETAPI_API_KEY },
signal: AbortSignal.timeout(15000) }
);
if (!response.ok) {
const status = response.status === 404 ? 404 : response.status === 429 ? 429 : 502;
const message = status === 404 ? "Vehículo no encontrado"
: status === 429 ? "Límite de consultas alcanzado" : "No pudimos consultar el vehículo";
return Response.json({ message }, { status, headers });
}
const { data } = await response.json();
// Exponer únicamente los datos que necesita la tienda.
return Response.json({
plate: data.licensePlate || plate,
brand: data.model?.brand?.name ?? null,
model: data.model?.name ?? null,
year: data.year ?? null,
}, { headers });
} catch {
return Response.json({ message: "Servicio temporalmente no disponible" },
{ status: 503, headers });
}
} El backend devuelve un objeto reducido: plate, brand, model y year. Consulta la estructura vigente de GetAPI antes de adaptar otros endpoints. Si no hay información para un campo, devuelve null.
Formulario · Liquid personalizado
<form id="getapi-vehicle-form">
<label for="getapi-plate">Patente del vehículo</label>
<input id="getapi-plate" name="plate" placeholder="ABCD12"
maxlength="8" required autocapitalize="characters">
<button type="submit">Consultar vehículo</button>
<p id="getapi-result" role="status" aria-live="polite"></p>
</form>
<script>
document.querySelector('#getapi-vehicle-form').addEventListener('submit', async (event) => {
event.preventDefault();
const form = event.currentTarget;
const button = form.querySelector('button');
const result = form.querySelector('#getapi-result');
button.disabled = true;
result.textContent = 'Consultando…';
try {
const plate = form.querySelector('[name="plate"]').value;
const response = await fetch('/apps/getapi/vehiculo?plate=' + encodeURIComponent(plate),
{ signal: AbortSignal.timeout(20000) });
const vehicle = await response.json();
if (!response.ok) throw new Error(vehicle.message || 'No pudimos realizar la consulta');
result.textContent = [vehicle.brand, vehicle.model, vehicle.year]
.filter(Boolean).join(' · ') || 'Vehículo encontrado sin datos descriptivos';
} catch (error) {
result.textContent = error.name === 'TimeoutError'
? 'La consulta tardó demasiado. Intenta nuevamente.'
: error.message || 'No pudimos realizar la consulta';
} finally { button.disabled = false; }
});
</script> ¿Quieres usar tasación, consulta por VIN, decodificación o recalls? Conserva la misma separación entre formulario y servidor y adapta la validación, el endpoint y los campos según el contrato de cada API.
05 / VALIDACIÓN
Antes de publicar tu integración
- Prueba una patente conocida, una inexistente y una entrada inválida.
- Comprueba las respuestas ante credenciales inválidas, límite de consultas y caída del servicio.
- Verifica que solicitudes sin firma válida y de otras tiendas sean rechazadas.
- Aplica límites por tienda y visitante en el backend; la firma del App Proxy no impide que un visitante repita consultas.
- Revisa que la API key no aparezca en el HTML, las solicitudes del navegador o los logs.
- Prueba el formulario en móvil y con teclado. Confirma que no interfiera con la compra.
- Define qué datos conservarás y su eliminación; informa al comprador sobre su uso.
06 / DUDAS FRECUENTES
Lo que conviene tener claro
¿Debo pagar en Shopify o en GetAPI?
En esta integración personalizada contratas tu plan API en GetAPI. El desarrollo y alojamiento de tu integración son independientes. Una futura app pública tendría su propio flujo de contratación.
¿Puedo implementarlo sin conocimientos técnicos?
Necesitas un desarrollador para configurar la app, alojar el backend y adaptar el formulario. Puedes compartirle esta guía y la documentación de la API.
¿Esto encuentra repuestos compatibles?
La consulta entrega información del vehículo. Para filtrar productos necesitas conectar esa información con las aplicaciones y reglas del catálogo de tu tienda.
¿La consulta se guarda en el pedido?
Este ejemplo solo muestra los datos. Guardarlos en un artículo, pedido o cotización requiere una implementación adicional y pruebas del flujo correspondiente.
¿Puedo usar la misma app en varios comercios?
La distribución personalizada está destinada a una tienda o a tiendas de una misma organización Plus. Para distribuir una app a comercios independientes debes revisar la distribución pública y los requisitos de aprobación y facturación de Shopify.
Empieza por una consulta de prueba
Elige tu plan y comparte esta guía con quien desarrolla tu tienda.
Referencias: App Proxy · Validación de solicitudes · Distribución. Revisión: octubre de 2026.