PageSourceSearch

https://www.raixer.com/assets/Desarrolladores-DK0tNNcb.js

js raixer.com collected 2026-09-25 06:57:44 UTC 16,173 bytes, 25 lines download raw bytes

1import{j as a}from"./react-vendor-DL_jcNr5.js";import{u as b,M as f}from"./MarketingTranslations-dVwfSwUG.js";import{P as g,S as o,A as u,C as p,N as y,H as n,T as d,F as P}from"./HospitalityShared-wRyHz6Ax.js";/* empty css                      */import{A}from"./arrow-right-B9VrOL2C.js";import{H as h}from"./hash-Dy-tMgyS.js";import{P as q}from"./phone-call-BvK8Z-Tn.js";import{D as T}from"./door-open-BDOrmzCy.js";import{U as x}from"./users-round-DBtgKSE2.js";import{C as m}from"./calendar-clock-DhqK0S3U.js";import{L as E,A as S,F as N}from"./list-tree-BlF71jUU.js";import{S as O}from"./scan-line-rmhophuw.js";import{K as z}from"./key-round-Crk73eAi.js";import{T as w}from"./trash-2-Cfz9-HXJ.js";import{S as L}from"./shield-check-VuSfY20B.js";import{B as C}from"./bluetooth-D3Ep8Es-.js";import{W as R}from"./webhook-D3B4yWDV.js";import{T as v}from"./terminal-BBau4GW4.js";import"./index-CyhMsy3Z.js";import"./react-query-D7GX_s2z.js";import"./helmet-_v06W0yj.js";import"./legacy-redirects-jyAQCFZG.js";import"./screenshots-DP5M6IVc.js";import"./TourismChannels-Otk8Sbjk.js";import"./PageSection-CqvJHLST.js";import"./tracking-CA7oSlaX.js";import"./tracking-Dxhy2gfo.js";import"./check-BW2Vf0FK.js";import"./createLucideIcon-C621SLsM.js";import"./house-BwmguI9C.js";import"./calendar-days-W3oSrGTB.js";import"./volume-2-uvP1QttU.js";import"./chevron-down-Dah1I6OU.js";const I=`curl "https://api.raixer.com/connections" \\
2  -H "Authorization: Basic your_encoded_base64_string"`,H=`curl -X POST \\
3  "https://api.raixer.com/devices/abcde12345/doors/0/open" \\
4  -H "Authorization: Basic your_encoded_base64_string"
5
6# { "ok": 1 }`,k=`curl -X POST "https://api.raixer.com/authorized-codes/" \\
7  -H "Authorization: Basic your_encoded_base64_string" \\
8  -H "Content-Type: application/json" \\
9  -d '{
10    "deviceId": "abcde12345",
11    "doorId": "door123",
12    "code": "123456",
13    "alias": "Reserva 4821",
14    "authorizedFrom": 1790017740000,
15    "authorizedTo": 1790782202000,
16    "deleteOnEnd": true
17  }'`,D=`POST https://tu-servidor.com/webhook
18
19{
20  "event": "door_opened",
21  "deviceId": "abcde12345",
22  "doorId": "12345abcde",
23  "timestamp": "2026-04-08T10:00:00.000Z",
24  "phone": 34111223344
25}`,U=e=>[{question:e("¿Cómo me autentico?"),answer:e("Con HTTP Basic Auth. Sacas tu usuario y tu contraseña de API en app.raixer.com/profile/api, los juntas como usuario:contraseña, los codificas en Base64 y los mandas en la cabecera Authorization de cada petición. No hay OAuth ni tokens que caduquen.")},{question:e("¿Puedo verla antes de comprar hardware?"),answer:e("La documentación está publicada y es la misma que usamos nosotros: endpoints, parámetros, respuestas y ejemplos en shell, Ruby, Python, PHP, Java y Node. Léela antes de decidir nada; si algo no encaja con tu sistema, prefieres saberlo ahora.")},{question:e("¿En qué formato van las fechas?"),answer:e("En epoch UTC en MILISEGUNDOS, no en ISO. Es el error más común al integrar: si mandas una fecha en texto, la comparación de la API no falla con un error claro, simplemente el permiso no se comporta como esperas. authorizedFrom y authorizedTo siempre numéricos.")},{question:e("¿Se pueden hacer permisos que se borren solos?"),answer:e("Sí, y es lo que querrás en casi toda integración. deleteOnEnd borra el código o el teléfono cuando termina su rango de fechas. deleteOnCall junto a deleteOnCallAfter lo borra después de un número de usos. Así tu sistema no tiene que acordarse de limpiar.")},{question:e("¿Y los horarios recurrentes?"),answer:e("repeatDaysOfWeek con los días en números (0 es domingo), repeatStartHour y repeatEndHour en formato de 24 horas, y repeatTimezone con la zona horaria. Sirve para turnos, clases o limpiezas que se repiten cada semana sin crear un permiso por día.")},{question:e("¿Cómo me entero de que alguien ha abierto?"),answer:e("Configuras una URL de webhook en tu conexión y recibes un POST cuando ocurre un evento, con el tipo, el dispositivo, la puerta, el momento y el dato de quién. Si prefieres consultar en lugar de recibir, también puedes leer el historial de una conexión.")},{question:e("Si mi servidor se cae, ¿se quedan encerrados?"),answer:e("No, porque las vías que no depen
25den de ti siguen funcionando: los códigos y los teléfonos autorizados ya están en el dispositivo, Auto Access abre en su franja sin preguntar a nadie, y hay apertura presencial por Bluetooth desde un enlace web. Tu integración añade automatización, no se convierte en el único camino.")},{question:e("¿Qué hardware acaba al otro lado?"),answer:e("Depende de la puerta: un equipo sobre el telefonillo, uno con bornero de 12 voltios para cerraderos y automatismos, o un girallave sobre la cerradura que ya existe. Algunos llevan conectividad móvil propia. Para la API es lo mismo: dispositivos con puertas en posiciones numeradas.")},{question:e("¿Hay límite de dispositivos por integración?"),answer:e("La API lista las conexiones y los dispositivos de tu cuenta, así que puedes gobernar varias ubicaciones desde una sola integración. Lo que conviene revisar antes de un despliegue grande es la parte comercial y la instalación, no el código: eso lo vemos contigo.")}];function c({label:e,code:l}){return a.jsxs("div",{className:"dev-code",children:[a.jsxs("div",{className:"dev-code-bar",children:[a.jsx(v,{size:14,"aria-hidden":"true"}),a.jsx("span",{children:e})]}),a.jsx("pre",{children:a.jsx("code",{children:l})})]})}function B(){const{copy:e}=b(),l=U(e);return a.jsx(g,{title:e("API de control de accesos para desarrolladores | Raixer"),description:e("API REST con autenticación básica para crear códigos y teléfonos autorizados, poner horarios, abrir puertas y recibir webhooks. Documentación abierta."),faqs:l,children:a.jsxs("div",{className:"vs dev",children:[a.jsx(o,{className:"vs-hero",children:a.jsxs("div",{className:"vs-hero-grid",children:[a.jsxs("div",{children:[a.jsx("p",{className:"hs-eyebrow",children:e("RAIXER PARA DESARROLLADORES")}),a.jsxs("h1",{children:[e("Tu software abre la puerta."),a.jsx("br",{}),a.jsx("span",{className:"raixer-highlight",children:e("Sin reinventar la cerradura.")})]}),a.jsx("p",{className:"hs-lead",children:e("Una API REST para crear y borrar accesos, ponerles horario, abrir una puerta y enterarte de lo que pasa. La documentación está publicada: léela antes de comprar nada.")}),a.jsxs("div",{className:"hs-actions",children:[a.jsx(u,{to:"/cerradura-inteligente-desarrolladores-software/api",children:e("Ver la documentación")}),a.jsxs("a",{className:"hs-button hs-button-secondary",href:"#empezar",children:[e("Empezar en dos minutos"),a.jsx(A,{size:17,"aria-hidden":"true"})]})]}),a.jsx(p,{items:[e("HTTP Basic Auth, sin OAuth"),e("Ejemplos en seis lenguajes")]})]}),a.jsxs("figure",{className:"dev-hero-visual",children:[a.jsx(c,{label:e("Abrir una puerta"),code:H}),a.jsx("figcaption",{children:e("Un POST y la puerta se abre. Nada más que eso.")})]})]})}),a.jsx(y,{items:[{id:"empezar",label:e("Empezar")},{id:"api",label:e("La API")},{id:"permisos",label:e("Permisos")},{id:"eventos",label:e("Eventos")},{id:"hardware",label:e("El hardware")},{id:"preguntas",label:e("Dudas")}]}),a.jsx(o,{id:"empezar",children:a.jsxs("div",{className:"dev-split",children:[a.jsxs("div",{children:[a.jsx(n,{eyebrow:e("LO PRIMERO"),title:e("Credenciales, cabecera y ya estás dentro."),children:e("La autenticación es HTTP Basic. Sacas tu usuario y contraseña de API desde tu perfil, los codificas en Base64 y los mandas en cada petición. No hay flujo de autorización que implementar.")}),a.jsx(p,{items:[e("Credenciales desde app.raixer.com/profile/api."),e("Una cabecera Authorization en cada llamada."),e("Respuestas en JSON, sin envoltorios raros.")]}),a.jsx(d,{to:"/cerradura-inteligente-desarrolladores-software/api",children:e("Ir a la autenticación")})]}),a.jsx(c,{label:e("Listar tus conexiones"),code:I})]})}),a.jsxs(o,{id:"api",className:"vs-soft",children:[a.jsx(n,{eyebrow:e("QUÉ PUEDES HACER"),title:e("Lo mismo que hace la app, desde tu código."),children:e("No hay una API recortada para integradores y otra completa para nosotros: los accesos que gestiona la aplicación son los mismos que puedes crear, consultar y borrar por HTTP.")}),a.jsx("div",{className:"dev-grid",children:[{icon:h,title:e("Códigos autorizados"),text:e("Crear, editar, consultar y borrar códigos numéricos de una puerta."),path:"POST /authorized-codes/"},{icon:q,title:e("Teléfonos autorizados"),text:e("Alta, baja e importación en bloque de números que abren llamando."),path:"POST /authorized-phones/"},{icon:T,title:e("Abrir una puerta"),text:e("Apertura por posición de puerta dentro del dispositivo."),path:"POST /devices/:id/doors/:position/open"},{icon:x,title:e("Usuarios del dispositivo"),text:e("Listar, añadir, editar y quitar personas con acceso, y su perfil."),path:"GET /devices/:id/users"},{icon:m,title:e("Horarios de Auto Access"),text:e("Crear y borrar las sesiones en las que la puerta responde sola."),path:"POST /schedules/"},{icon:E,title:e("Conexiones e historial"),text:e("Tus ubicaciones, sus dispositivos, sus constantes y lo que ha pasado."),path:"GET /connections"}
25,{icon:O,title:e("Check-in y reservas"),text:e("Reservas, huéspedes, formulario de registro y libro de viajeros."),path:"POST /bookings/"},{icon:z,title:e("Enlace de puerta y QR"),text:e("Crear el enlace público, activarlo, desactivarlo y sacar su QR en PDF."),path:"POST /devices/:id/doors/:doorId/code"}].map(({icon:r,title:s,text:i,path:t})=>a.jsxs("div",{children:[a.jsx(r,{size:21,"aria-hidden":"true"}),a.jsx("h3",{children:s}),a.jsx("p",{children:i}),a.jsx("code",{children:t})]},s))}),a.jsx("p",{className:"hs-note",children:e("Las rutas de arriba son una muestra: la documentación tiene más de ochenta endpoints con sus parámetros, sus respuestas y ejemplos en shell, Ruby, Python, PHP, Java y Node.")})]}),a.jsx(o,{id:"permisos",children:a.jsxs("div",{className:"dev-split dev-split-wide",children:[a.jsxs("div",{children:[a.jsx(n,{eyebrow:e("EL MODELO DE PERMISOS"),title:e("Un acceso que se limpia solo."),children:e("En una integración de verdad, lo difícil no es crear el acceso: es acordarse de quitarlo. Por eso los permisos llevan su propia caducidad dentro.")}),a.jsx("div",{className:"dev-params",children:[{icon:S,name:"authorizedFrom · authorizedTo",text:e("El rango de validez, en epoch UTC y en milisegundos.")},{icon:w,name:"deleteOnEnd",text:e("Borra el acceso al terminar el rango, sin que tengas que volver.")},{icon:m,name:"repeatDaysOfWeek · repeatStartHour · repeatEndHour · repeatTimezone",text:e("Horario semanal con su zona horaria, para turnos y clases.")},{icon:h,name:"deleteOnCall · deleteOnCallAfter",text:e("Caducidad por usos: se borra después de abrir las veces que digas.")}].map(({icon:r,name:s,text:i})=>a.jsxs("div",{children:[a.jsx(r,{size:18,"aria-hidden":"true"}),a.jsxs("div",{children:[a.jsx("code",{children:s}),a.jsx("p",{children:i})]})]},s))}),a.jsxs("div",{className:"dev-warning",children:[a.jsx(L,{size:18,"aria-hidden":"true"}),a.jsxs("p",{children:[a.jsx("strong",{children:e("Las fechas van en milisegundos, no en ISO.")}),a.jsx("br",{}),e("Es el tropiezo más común: con una fecha en texto el permiso no se comporta como esperas, y el error no siempre salta a la vista.")]})]})]}),a.jsx(c,{label:e("Un código que caduca solo"),code:k})]})}),a.jsx(o,{id:"eventos",className:"vs-soft",children:a.jsxs("div",{className:"dev-split",children:[a.jsxs("div",{children:[a.jsx(n,{eyebrow:e("ENTERARTE DE LO QUE PASA"),title:e("Webhooks a tu servidor, o consultarlo tú."),children:e("Pones una URL en tu conexión y recibes un POST cuando ocurre un evento. Si prefieres no exponer un endpoint, puedes leer el historial cuando te convenga.")}),a.jsx(p,{items:[e("Tipo de evento, dispositivo, puerta y momento."),e("El dato de quién abrió, cuando el método lo identifica."),e("Historial de una conexión, si prefieres consultar.")]})]}),a.jsx(c,{label:e("Lo que recibe tu servidor"),code:D})]})}),a.jsxs(o,{id:"hardware",children:[a.jsx(n,{eyebrow:e("AL OTRO LADO DE LA API"),title:e("Para tu código, todo son puertas en posiciones."),children:e("Lo que cambia entre una instalación y otra es el aparato, no la integración: un equipo sobre el telefonillo, un bornero de 12 voltios o un girallave sobre la cerradura de siempre.")}),a.jsx("div",{className:"dev-hardware",children:[{title:e("Sobre el telefonillo"),text:e("Para portales de edificio, sin tocar la placa de la calle ni el cableado común."),to:"/product/raixer-mini",link:e("Ver Raixer Mini")},{title:e("Bornero de 12 voltios"),text:e("Para cerraderos eléctricos, barreras y automatismos que ya están instalados."),to:"/product/raixer-12v",link:e("Ver Raixer 12V")},{title:e("Girallave"),text:e("Se monta sobre la cerradura existente y gira la llave desde dentro."),to:"/product/raixer-gyro",link:e("Ver Raixer Gyro")}].map(({title:r,text:s,to:i,link:t})=>a.jsxs("div",{children:[a.jsx("h3",{children:r}),a.jsx("p",{children:s}),a.jsx(d,{to:i,children:t})]},r))}),a.jsxs("div",{className:"dev-resilience",children:[a.jsxs("div",{children:[a.jsx(C,{size:20,"aria-hidden":"true"}),a.jsx("h3",{children:e("Si tu servidor no responde")}),a.jsx("p",{children:e("Los códigos y los teléfonos ya autorizados siguen abriendo, Auto Access abre en su franja y queda la apertura presencial por Bluetooth desde un enlace web. Tu integración automatiza; no se convierte en el único camino.")})]}),a.jsxs("div",{children:[a.jsx(N,{size:20,"aria-hidden":"true"}),a.jsx("h3",{children:e("Si prefieres probar antes")}),a.jsx("p",{children:e("La documentación está abierta y con ejemplos copiables. Míralos contra tu caso y, si falta algo, dínoslo antes de que compres el hardware.")}),a.jsx(d,{to:"/contactar",children:e("Hablar con alguien técnico")})]})]})]}),a.jsxs(o,{className:"vs-soft",children:[a.jsx(n,{eyebrow:e("DÓNDE ENCAJA"),title:e("Integraciones en las que la reserva ya existe."),children:e("El patrón se repite: tu sistema ya sabe quién entra y cuándo. Lo único que falta es que eso abra una puerta.")}
25),a.jsx("div",{className:"vs-audience-grid",children:[{icon:m,title:e("Software de reservas"),text:e("La reserva crea el código con su franja y lo borra al terminar, sin nadie en medio."),to:"/funcionamiento/reservas-de-espacios",link:e("Ver reservas de espacios")},{icon:x,title:e("Gestión de espacios de trabajo"),text:e("Altas y bajas de socios que se convierten en permisos con horario."),to:"/cerradura-oficinas-coworking",link:e("Ver oficinas y coworking")},{icon:R,title:e("Plataformas y paneles propios"),text:e("Abrir desde tu panel y recibir el evento en tu servidor cuando ocurre."),to:"/cerradura-inteligente-desarrolladores-software/api",link:e("Ver la API")}].map(({icon:r,title:s,text:i,to:t,link:j})=>a.jsxs("div",{children:[a.jsx(r,{size:25,"aria-hidden":"true"}),a.jsx("h3",{children:s}),a.jsx("p",{children:i}),a.jsx(d,{to:t,children:j})]},s))}),a.jsxs("div",{className:"vs-related-inline",children:[a.jsx(v,{size:24,"aria-hidden":"true"}),a.jsxs("p",{children:[a.jsx("strong",{children:e("¿Prefieres leer código a leer una landing?")})," ",e("La referencia completa está a un clic, con sus parámetros y sus respuestas.")]}),a.jsx(d,{to:"/cerradura-inteligente-desarrolladores-software/api",children:e("Abrir la referencia")})]})]}),a.jsx(P,{items:l}),a.jsxs(o,{className:"hs-final",children:[a.jsx("p",{className:"hs-eyebrow",children:e("EMPIEZA POR LA DOCUMENTACIÓN")}),a.jsxs("h2",{children:[e("Léela primero."),a.jsx("br",{}),a.jsx("span",{className:"raixer-highlight",children:e("Compra después.")})]}),a.jsx("p",{children:e("Si tu caso encaja, lo verás en diez minutos de documentación. Y si no encaja, preferimos que nos lo cuentes antes de que pidas hardware.")}),a.jsxs("div",{className:"hs-actions",children:[a.jsx(u,{to:"/cerradura-inteligente-desarrolladores-software/api",children:e("Ver la documentación")}),a.jsx(u,{to:"/contactar",secondary:!0,children:e("Hablar con alguien técnico")})]})]})]})})}function ge(){return a.jsx(f,{children:a.jsx(B,{})})}export{ge as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.