Qué es Wyra Rails
Wyra Rails es la forma de mostrar el catálogo de Wyra — recargas prepagas, eSIM de viaje y gift cards digitales, ya con precios reales — directamente en tu propio sitio, app o herramienta, con pago incluido. Pegas un widget (o llamas nuestra API si tienes tu propio backend), tu cliente compra sin salir de tu página, y Wyra se encarga de todo lo demás: el pago (Wyra es el comerciante registrado de cada venta, siempre — nunca tú), el cumplimiento (incluidas las restricciones de países sancionados), la entrega del producto, y tu comisión.
Hoy Wyra Rails es un nivel de widget embebible + API: el checkout y los correos que recibe tu cliente llevan la marca de Wyra. Es, deliberadamente, el primer paso hacia una API completamente white-label — donde esos mismos correos, y potencialmente el checkout, lleven tu propia marca. Esa versión todavía no está construida. No es una promesa vacía: es una base real, en producción, sobre la que se construye la siguiente — y la sección 10 te cuenta exactamente qué falta y cómo se llega ahí.
Cómo funciona, paso a paso
Desde tu primera visita hasta tu primer pago, así se ve el camino completo:
- Creas tu cuenta, gratis.En el portal de partners, con Google, Apple, o tu correo con un código — sin contraseña. Una cuenta de Wyra Rails es, por dentro, la misma identidad que un afiliado de Wyra: si ya tienes cuenta (de afiliado, de recargas, de eSIM), inicias sesión y activas Rails en un paso.
- Recibes tus claves al instante.Una clave pública (segura para pegar en el navegador) y una clave secreta (solo para tu propio backend, nunca en JavaScript). Puedes tener varias de cada tipo — en modo prueba o en vivo — y rotarlas cuando quieras desde tu panel.
- Wyra configura tu margen.Por defecto, 10% sobre nuestro precio normal — configurable por Wyra hasta un techo de 30%, para que el precio final siga siendo competitivo para tu cliente. Hoy el número lo fija Wyra sobre tu cuenta (no es un campo que edites tú mismo desde el panel); si quieres pedir un ajuste, escríbenos.
- Pegas el widget — o llamas la API.Para la mayoría de los sitios (WordPress, Wix, Squarespace, o código propio) un
<div>más un<script>alcanza. Si tienes tu propio backend, puedes saltarte el widget y llamar los mismos endpoints REST directo con tu clave secreta — ver la especificación técnica. - Wyra revisa tu cuenta antes de que se mueva plata real.Una clave nueva puede leer el catálogo (precios reales, en vivo) de inmediato — eso es solo lectura, sin riesgo. Pero crear una sesión de pago real requiere que Wyra active tu cuenta para modo en vivo, una revisión manual, normalmente 1-2 días hábiles.
- Tu cliente compra sin salir de tu sitio.Ve el precio final, sin sorpresas, completa sus datos, y es redirigido — dentro de la misma pestaña — a una página de pago segura operada por Stripe, a nombre de Wyra. Al terminar, vuelve automáticamente a tu sitio.
- Wyra entrega el producto.Usando exactamente el mismo sistema que ya entrega cada recarga, eSIM y gift card de Wyra hoy — nada nuevo, nada distinto, para una venta que llegó por tu widget.
- Tu comisión se acumula, visible en tiempo real.El 100% del margen que agregaste queda registrado a tu favor apenas se confirma el pago, con un período de espera (la ventana de reembolso) antes de estar disponible para retiro — ver la sección de ganancias.
- Cobras.Vía Stripe Connect — el mismo sistema de pagos que ya usan los afiliados de Wyra. Wyra nunca ve tu información bancaria.
Cómo se ve en tu negocio
El widget, embebido en tu sitio: una caja compacta que adopta el color de acento de tu marca (tú lo defines con un solo atributo). Muestra pestañas por producto (Recargas / eSIM / Gift cards, o solo el que habilites), un buscador de país, y una lista de precios donde el número grande — lo que tu cliente realmente paga, ya con tu margen incluido — es el titular. Al tocar un ítem se abre el formulario de compra, con ese mismo precio final. Abajo, un pequeño crédito "Impulsado por Wyra" — no removible en este nivel, el mismo patrón que usan Stripe Checkout u otras plataformas de pago en su plan gratuito/de bajo costo.
La compra, para tu cliente: completa su correo (y el dato del producto — el número a recargar, por ejemplo), toca "Comprar", y una verificación anti-bot invisible resuelve en segundo plano sin pedirle nada. Enseguida es redirigido — en la misma pestaña, sin abrir una ventana nueva — a una página de pago real, operada por Stripe, con el nombre de Wyra Technologies en el resumen de la tarjeta. Ahí completa su tarjeta (o Apple Pay / Google Pay, si el navegador lo ofrece) con la interfaz estándar de Stripe — esa pantalla nunca lleva tu marca, deliberadamente: es la prueba de que Wyra, no tú, es quien está cobrando. Al confirmar, Stripe lo redirige de vuelta a tu propio sitio, a la página de éxito que tú definas.
Para qué negocios está pensado
Wyra Rails no es "para todos" — está pensado para negocios que ya tienen una audiencia propia y quieren venderle algo más, sin construir infraestructura de pagos ni negociar con proveedores mayoristas:
Y, siendo igual de honestos sobre para quién no es la mejor opción hoy: si necesitas que el checkout y los correos de tu cliente lleven tu marca de punta a punta, esa versión (white-label completo) todavía no está construida — ver la sección 10. Y si tu negocio no tiene ninguna audiencia propia todavía, el programa de afiliados (compartir un link, sin sitio propio) suele ser un mejor punto de partida que Wyra Rails.
Especificaciones regulatorias
Ninguna. No necesitas licencia de transmisor de dinero, registro como MSB (Money Services Business), ni ningún tipo de cuenta de pagos o entidad regulada propia para vender a través de Wyra Rails.
Esto es posible porque Wyra — no tú — es siempre el comerciante registrado de cada venta. Wyra opera bajo la exención de la FinCEN para prepago de circuito cerrado (31 CFR 1010.100): el saldo que se entrega (minutos, datos, el código de una gift card) no es dinero transferible ni redimible en efectivo, así que la actividad no califica como transmisión de dinero bajo ese marco. Tu cliente paga directamente a Wyra a través de Stripe; tú nunca procesas el pago, nunca tienes acceso a los fondos, y nunca eres parte de la cadena de custodia del dinero.
Ganancias y pagos
La matemática, con un ejemplo real
Tu margen se agrega sobre el precio de Wyra — el mismo que ya cobra en su propio sitio. Es puramente adicional, y el 100% es tuyo.
Tu comisión no le resta nada a la economía propia de Wyra en esa venta: existe solo porque tu tráfico existe.
Lo que no cambia, pase lo que pase
- $0 por adelantado. No hay costo para crear tu cuenta, no hay cuota mensual, no hay mínimo de ventas. Es puro pago-por-resultado: ganas cuando tu cliente compra, y nada antes de eso.
- Reembolso automático de tu comisión si la venta se revierte. Si una venta se reembolsa o se disputa (chargeback), tu comisión se revierte automáticamente — el mismo mecanismo que ya usa el programa de afiliados de Wyra, activado por el mismo webhook que procesa cada reembolso de Wyra, sin importar si la venta vino de tu widget o de wyraapp.com directamente. Nunca cobras por una venta que no se sostiene.
- Margen configurado por Wyra, no autoservicio. El porcentaje que agregas (10% por defecto, hasta 30%) lo define Wyra sobre tu cuenta — no es un slider que edites tú mismo hoy desde el panel.
Cuándo y cómo te pagan
Cada venta atribuida a tu cuenta queda registrada como comisión "pendiente" apenas se confirma el pago. Antes de estar disponible para retiro, pasa por dos filtros reales, no cosméticos:
- Ventana de reembolso (~30 días).Tu comisión pasa de "pendiente" a "disponible" recién cuando se cierra la ventana de reembolso de esa venta — el mismo período de espera que ya protege al programa de afiliados de Wyra. No es una demora arbitraria: es el tiempo estándar en el que un reembolso o un contracargo podría todavía llegar.
- Retiro mínimo: $25.Puedes retirar tu saldo disponible una vez que llega a $25 — el mismo umbral que ya usan los afiliados de Wyra hoy, vía Stripe Connect. Wyra nunca ve tu información bancaria; eso lo maneja Stripe directamente contigo.
- Aprobación manual antes de que se mueva dinero.Cada lote de pago pasa por una revisión humana en Wyra antes de que se ejecute la transferencia — hoy es igual para cualquier monto. La intención de Wyra es que los retiros notablemente grandes reciban una mirada más de cerca antes de liberarse (le da tiempo al propio período de liquidación de Stripe a terminar de asentarse, reduciendo el riesgo de pagarte una comisión justo antes de que llegue un reembolso tardío) — pero eso hoy es criterio manual dentro de esa misma revisión, no una fórmula automática de "monto más grande = espera más larga" todavía codificada en el sistema.
Instalación y especificación técnica
Esta sección es la referencia completa — autenticación, endpoints, formas exactas de request/response, y códigos de error. Si estás integrando (o si eres un asistente de código leyendo esto por un humano), esto es todo lo que necesitas.
Lo mínimo para empezar
<!-- Todo lo que hace falta pegar en tu sitio --> <div id="wyra-rails" data-wyra-pubkey="wr_pub_live_TU_CLAVE"></div> <script src="https://wyraapp.com/rails/widget.js" async></script>
Atributos del widget (data-wyra-*)
| Atributo | Obligatorio | Valores | Por defecto |
|---|---|---|---|
data-wyra-pubkey | Sí | wr_pub_live_… / wr_pub_test_… | — |
data-wyra-product | No | esim · recargas · giftcard · all | all (con selector de pestañas) |
data-wyra-country | No | ISO-2, ej. MX | ninguno — tu cliente busca |
data-wyra-lang | No | es · en · pt | <html lang> de tu página, o es |
data-wyra-theme | No | light · dark · auto | light |
data-wyra-accent | No | cualquier color CSS (#hex, rgb(), nombre) | cian de Wyra |
data-wyra-success-url | No | URL absoluta en tu propio dominio | la página actual |
data-wyra-cancel-url | No | URL absoluta en tu propio dominio | la página actual |
Un success_url / cancel_url que no apunte a un dominio que registraste en tu cuenta se ignora silenciosamente y cae a una página genérica de Wyra — es una protección real: una clave pública filtrada no se puede usar para redirigir a un cliente recién pagado a un sitio arbitrario.
Autenticación
Dos tipos de clave, con reglas de exposición muy distintas:
wr_pub_…Segura para pegar en el navegador. Es lo que trae el widget. Solo puede leer el catálogo y crear una sesión de pago (nunca leer datos de otros clientes).wr_sec_…Solo para tu propio backend. Nunca la pongas en JavaScript del lado del navegador.Envía tu clave como header x-rails-key (recomendado — funciona en cualquier entorno, incluidos builders de bajo código donde el header Authorization es incómodo de configurar), o como Authorization: Bearer <tu-clave>.
Si llamas desde tu propio backend (sin el widget), no necesitas nada más:
Authorization: Bearer wr_sec_live_TU_CLAVE_SECRETASi llamas desde el navegador con el widget, viajan dos capas de auth — el widget ya las maneja por ti, no tienes que armarlas a mano: el par público de Supabase (Wyra, no el tuyo) más tu propia clave:
apikey: <clave anónima pública de Wyra — la trae widget.js> Authorization: Bearer <la misma clave anónima> x-rails-key: wr_pub_live_TU_CLAVE_PUBLICA
test se autentica y puede leer el catálogo sin problema (útil para probar tu integración visual con precios reales). Pero crear una sesión de pago con una clave test se rechaza hoy con test_mode_not_supported — todavía no existe un entorno sandbox de Stripe separado para simular un cobro sin moverlo de verdad. Para probar el checkout de punta a punta necesitas una clave live ya aprobada por Wyra.Catálogo — GET /rails?action=catalog
Base: https://owvktacuqmlymszkrwxv.supabase.co/functions/v1/rails. Lectura pura, sin efectos secundarios — cualquier clave activa (pública o secreta, live o test) puede llamarla. Los precios que devuelve ya incluyen tu margen (partner_price_usd); nunca expone el costo mayorista de Wyra.
GET /rails?action=catalog&product=recargas&country=MX{
"product": "recargas", "country": "MX",
"operators": [{
"wyra_operator_id": 100234,
"operator_name": "Telcel Mexico",
"is_bundle": false,
"logo_url": "https://.../telcel.png",
"brackets": [{
"bracket_id": 3,
"wyra_retail_usd": 20.65,
"partner_price_usd": 22.72,
"markup_usd": 2.07,
"local_amount": 350, "currency_delivered": "MXN",
"denomination_type": "fixed",
"product_label": "Recarga de $350 MXN",
"validity": null, "benefits": null
}]
}]
}Ejemplo ilustrativo con la forma real de campos — un país trae varios operadores, cada uno con varias denominaciones (brackets).
GET /rails?action=catalog&product=esim&country_code=ES{
"product": "esim", "country_code": "ES",
"packages": [{
"package_id": "6b6f6e5b-…", "name": "España 20GB 30 días",
"country_code": "ES", "data_quantity": 20, "data_unit": "GB",
"validity": 30, "validity_unit": "days", "unlimited": false,
"wyra_retail_usd": 23.99, "partner_price_usd": 26.39, "markup_usd": 2.40
}],
"truncated": false
}GET /rails?action=catalog&product=giftcard&country_iso=US&brand=amazon{
"product": "giftcard", "country_iso": "US",
"cards": [{
"catalog_id": "b21e4b0e-…", "brand": "Amazon", "category": "retail",
"country_iso": "US", "face_value": 25, "face_currency": "USD",
"logo_url": "https://.../amazon.png",
"wyra_retail_usd": 25.00, "partner_price_usd": 27.50, "markup_usd": 2.50
}],
"truncated": false
}El catálogo de gift cards solo incluye marcas cuyo canal de origen ya está validado del lado de Wyra — el mismo filtro de seguridad que usa la tienda de Wyra directamente, no uno distinto para Rails.
Checkout — POST /rails?action=checkout-session
Crea la sesión de pago real (Stripe Checkout Session, en la cuenta de Wyra) y la orden pendiente asociada. Requiere una clave live y una cuenta ya aprobada para modo en vivo.
POST /rails?action=checkout-session { "product": "recargas", "customer_email": "cliente@correo.com", "wyra_operator_id": 100234, "bracket_id": 3, "country_iso": "MX", "recipient_phone": "5215512345678", "operator_name": "Telcel Mexico", "turnstile_token": "…", // solo con clave pública (navegador) "success_url": "https://tunegocio.com/gracias", "cancel_url": "https://tunegocio.com/recargas" }
| Producto | Campos propios del body |
|---|---|
recargas | wyra_operator_id, bracket_id, country_iso, recipient_phone, operator_name (opcional) |
esim | package_id |
giftcard | catalog_id |
Comunes a los tres: product, customer_email, y opcionalmente turnstile_token (obligatorio solo si llamas con una clave pública desde el navegador — el widget ya lo resuelve solo), success_url, cancel_url.
{
"checkout_url": "https://checkout.stripe.com/c/pay/cs_live_…",
"transaction_id": "b0e21c4a-…", // esim devuelve "order_id" en su lugar
"wyra_retail_usd": 20.65, "markup_usd": 2.07, "partner_price_usd": 22.72
}Un 200 es la señal de éxito — redirige a checkout_url (misma pestaña). Solo las respuestas de error llevan success:false.
{
"ok": false, "success": false,
"error_code": "destination_not_supported",
"error": "Destination country not supported",
"message": "Destination country not supported"
}Códigos de error más comunes
| error_code | Estado | Qué significa |
|---|---|---|
invalid_api_key | 401 | Clave ausente, mal escrita o revocada. |
rate_limited | 429 | Superaste el límite de solicitudes — ver más abajo. |
product_not_enabled | 403 | Tu cuenta no tiene ese producto habilitado. |
rails_not_live | 403 | Tu cuenta (o el sistema en general) todavía no está aprobada para checkout real. |
test_mode_not_supported | 403 | Intentaste crear un checkout con una clave test — hoy no es posible, ver arriba. |
captcha_failed | 403 | La verificación anti-bot (Turnstile) no se resolvió — solo aplica a claves públicas. |
destination_not_supported | 403 | País de destino sancionado / no vendible — el mismo bloqueo que aplica en wyraapp.com. |
missing_fields | 400 | Faltan campos requeridos — vienen listados en error_params.fields. |
invalid_phone | 400 | El número de destino no tiene el largo esperado para ese país. |
bracket_unavailable | 404 | Esa denominación específica ya no está disponible — vuelve a pedir el catálogo. |
esim_package_wrong_type | 409 | Ese paquete de eSIM está fuera del alcance v1 (no es "solo datos, un país"). |
limit_exceeded_… | 403 | El monto supera los límites de cumplimiento de la cuenta del cliente final. |
disposable_email_not_allowed | 400 | El correo del cliente es de un dominio desechable bloqueado. |
upstream_error | 502 | Stripe no pudo crear la sesión — reintenta. |
service_temporarily_unavailable | 503 | Hipo de infraestructura de Wyra — reintenta, nunca es definitivo. |
Límites de uso
| Alcance | Por minuto | Por día |
|---|---|---|
| Catálogo, por clave | 120 | 20,000 |
| Checkout, por clave | 30 | 2,000 |
| Checkout, por IP (capa extra, cualquier clave) | 4 | 15 por hora |
La capa por IP usa el mismo mecanismo que protege recargas, eSIM y gift cards en wyraapp.com, pero con un cupo propio de Rails — un checkout hecho en tu sitio no consume el cupo de otro producto Wyra desde esa misma IP, ni al revés.
Un hipo de infraestructura del lado de Wyra nunca bloquea tu integración por error: estos límites fallan "abiertos" — si algo interno no responde, tu solicitud sigue adelante en vez de rechazarse.
catalog para mostrar precios y checkout-session cuando tu cliente confirme, con tu clave secreta desde tu propio servidor. No necesitas usar widget.js en absoluto.Quién es Wyra
Wyra Technologies LLC ya opera tres líneas de producto reales, en vivo, vendidas directamente a la diáspora latina en Estados Unidos en wyraapp.com: recargas prepagas a más de 140 países, eSIM de viaje, y gift cards digitales. Wyra Rails no es un experimento aparte — es la misma infraestructura que ya cobra, ya entrega, y ya cumple, extendida para que también la puedas usar tú. Cuando tu widget muestra un precio, es el mismo motor de precios que corre en la propia tienda de Wyra; cuando tu cliente compra, es el mismo webhook de Stripe y los mismos sistemas de entrega que ya procesan cada venta de Wyra hoy.
Esa misma estructura legal — la exención de la FinCEN para prepago de circuito cerrado — es la que hace posible que Wyra Rails no te exija ninguna licencia (ver la sección 5).
Velocidad
No hay una ruta separada, más lenta, para una venta que llega por Rails. El catálogo se lee de las mismas tablas de precios curados que consulta la propia wyraapp.com — no existe un "feed de precios para partners" aparte y potencialmente desactualizado. El checkout es una sesión de Stripe Checkout real, el mismo flujo de un solo redirect que Wyra ya usa hoy para cada recarga, eSIM y gift card que vende directamente. Y la entrega — el SMS de confirmación, el QR de la eSIM, el código de la gift card — corre por los mismos webhooks que ya sirven a los clientes de Wyra en vivo, sin modificar, sin poner una venta de Rails en una cola aparte ni tratarla como de segunda clase.
No publicamos un número de milisegundos aquí a propósito: preferimos describir la arquitectura real (la misma que ya está en producción, sirviendo tráfico real) antes que inventar una cifra que no podamos sostener en cada condición de red.
El camino al white-label completo
Siendo honestos sobre dónde está parado esto: hoy, los correos que recibe el cliente de un partner (el recibo de compra, el QR de la eSIM, el código de la gift card) salen con la marca de Wyra — no la tuya. Es la fase actual, no la versión final. La versión completamente white-label (correos con tu propia marca, y potencialmente un checkout con tu propia identidad visual) está en el roadmap, pero todavía no está construida.
Hay dos caminos reales para desbloquearla — y ambos son política actual de Wyra, no una garantía fija para siempre:
Sostener un volumen real de ventas — hoy la referencia de Wyra es alrededor de $1,000/mes en precio Wyra, durante dos meses consecutivos — demuestra que vale la pena construir el trabajo de marca por-partner, y Wyra lo prioriza para tu cuenta.
Si quieres desbloquearlo antes de demostrar ese volumen por tu cuenta, puedes financiar la construcción con una cuota de configuración por adelantado — hoy la referencia de Wyra está entre $250 y $1,000, según el alcance de lo que necesites.
Ninguno de los dos es una promesa contractual escrita en piedra — son la intención actual de Wyra, y los montos exactos pueden ajustarse. Si te interesa cualquiera de los dos caminos, escríbenos a support@wyraapp.com y lo conversamos sobre tu caso concreto.
Página alojada, para un local físico sin sitio propio
Esto es distinto del widget embebible descrito en las secciones anteriores, y distinto también del roadmap white-label de la sección 10 — es una tercera opción, más chica, pensada para un caso puntual: un negocio que no tiene ningún sitio web propio donde pegar un widget — un kiosco, un mostrador de remesas, una tablet parada sobre el mostrador esperando que un cliente toque la pantalla.
Para ese caso, en vez de pedirte que primero construyas un sitio, Wyra puede alojarte una página propia — mismo catálogo, mismo checkout, sin escribir una sola línea de código — y apuntas el navegador de tu tablet o mostrador a esa URL. La pides desde tu panel una vez que tu cuenta de Rails está activa, y hoy no tiene costo.