1;!function(){try { var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&((e._debugIds|| (e._debugIds={}))[n]="2969f899-be89-1e60-6d0e-97cb529958de")}catch(e){}}(); 2(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,204297,e=>{"use strict";var t=e.i(843476);e.i(522016);let s={
2"Next.js":(0,t.jsx)
2(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M11.572 0c-.176 0-.31.001-.358.007a19.76 19.76 0 01-.364.033C7.443.346 4.25 2.185 2.228 5.012a11.875 11.875 0 00-2.119 5.243c-.096.659-.108.854-.108 1.747s.012 1.089.108 1.748c.652 4.506 3.86 8.292 8.209 9.695.779.25 1.6.422 2.534.525.363.04 1.935.04 2.299 0 1.611-.178 2.977-.577 4.323-1.264.207-.106.247-.134.219-.158-.02-.013-.9-1.193-1.955-2.62l-1.919-2.592-2.404-3.558a338.739 338.739 0 00-2.422-3.556c-.009-.002-.018 1.579-.023 3.51-.007 3.38-.01 3.515-.052 3.595a.426.426 0 01-.206.214c-.075.037-.14.044-.495.044H7.81l-.108-.068a.438.438 0 01-.157-.171l-.05-.106.006-4.703.007-4.705.073-.091a.637.637 0 01.174-.143c.096-.047.134-.051.54-.051.478 0 .558.018.682.154.035.038 1.337 1.999 2.895 4.361a10760.433 10760.433 0 004.735 7.17l1.9 2.879.096-.063a12.317 12.317 0 002.466-2.163 11.944 11.944 0 002.824-6.134c.096-.66.108-.854.108-1.748 0-.893-.012-1.088-.108-1.747-.652-4.506-3.86-8.292-8.208-9.695a12.597 12.597 0 00-2.499-.523A33.119 33.119 0 0011.572 0zm4.069 7.217c.347 0 .408.005.486.047a.473.473 0 01.237.277c.018.06.023 1.365.018 4.304l-.006 4.218-.744-1.14-.746-1.14v-3.066c0-1.982.01-3.097.023-3.15a.478.478 0 01.233-.296c.096-.05.13-.054.5-.054z"})})},{}),Python:(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09 3.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z"})})},{}),Go:(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M1.811 10.231c-.047 0-.058-.023-.035-.059l.246-.315c.023-.035.081-.058.128-.058h4.172c.046 0 .058.035.035.07l-.199.303c-.023.036-.082.07-.117.07zM.047 11.306c-.047 0-.059-.023-.035-.058l.245-.316c.023-.035.082-.058.129-.058h5.328c.047 0 .07.035.058.07l-.093.28c-.012.047-.058.07-.105.07zm2.828 1.075c-.047 0-.059-.035-.035-.07l.163-.292c.023-.035.07-.07.117-.07h2.337c.047 0 .07.035.07.082l-.023.28c0 .047-.047.082-.082.082zm12.129-2.36c-.736.187-1.239.327-1.963.514-.176.046-.187.058-.34-.117-.174-.199-.303-.327-.548-.444-.737-.362-1.45-.257-2.115.175-.789.514-1.195 1.274-1.183 2.196.012.921.647 1.682 1.556 1.786.793.093 1.463-.163 2.003-.757.117-.14.222-.292.34-.457H12.68c-.245 0-.304-.152-.222-.35.152-.362.432-.97.596-1.274a.315.315 0 01.292-.187h4.253c-.023.316-.023.631-.07.947a6.238 6.238 0 01-1.017 2.767 5.934 5.934 0 01-3.166 2.337c-1.18.374-2.313.339-3.376-.234-.921-.502-1.497-1.274-1.742-2.278-.292-1.182-.175-2.313.468-3.342.737-1.182 1.786-1.952 3.132-2.255 1.088-.245 2.138-.187 3.108.372.56.327.968.783 1.262 1.345.082.117.047.175-.117.222z"})})},{}),Express:(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"
2currentColor",children:(0,t.jsx)("path",{d:"M24 18.588a1.529 1.529 0 01-1.895-.72l-3.45-4.771-.5-.667-4.003 5.444a1.466 1.466 0 01-1.802.708l5.158-6.92-4.798-6.251a1.595 1.595 0 011.9.666l3.511 4.86 3.556-4.86a1.466 1.466 0 011.802-.708L17.2 10.963zm-13.872.326H6.773V5.626H1.124l-1.11-.001C.015 5.625 0 5.51 0 5.506a8.078 8.078 0 01.038-.53 10.016 10.016 0 01.33-1.748c.245-.838.639-1.635 1.164-2.353a8.157 8.157 0 012.025-1.943c.886-.616 1.9-1.043 2.963-1.298.506-.126 1.025-.202 1.543-.262a10.14 10.14 0 011.524-.042c.574.04 1.13.14 1.672.31.553.173 1.08.41 1.569.72a7.655 7.655 0 012.467 2.411 8.66 8.66 0 011.134 2.677c.121.481.196.975.233 1.472h-5.33v-.001c-.02-.457-.102-.9-.245-1.326a5.38 5.38 0 00-.687-1.247 4.675 4.675 0 00-1.031-1.04 3.875 3.875 0 00-1.272-.679 3.987 3.987 0 00-1.4-.18 3.827 3.827 0 00-1.39.37A4.016 4.016 0 004.65 3.258a4.965 4.965 0 00-.853 1.444 6.637 6.637 0 00-.445 1.814c-.052.516-.075 1.036-.04 1.555.03.47.098.937.213 1.394.177.7.48 1.362.891 1.953a4.65 4.65 0 001.587 1.435c.355.207.74.36 1.142.453.37.084.75.126 1.133.117a3.45 3.45 0 001.326-.349 4.51 4.51 0 001.194-.849c.362-.372.66-.8.877-1.268a5.62 5.62 0 00.466-1.588h-3.727v-1.69h5.416c.019.28.019.563 0 .843a8.503 8.503 0 01-.347 2.18 7.573 7.573 0 01-.947 2.055 6.617 6.617 0 01-1.57 1.689 5.863 5.863 0 01-2.069 1.046 6.053 6.053 0 01-2.404.301z"})})},{}),"Ruby on Rails":(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M.985 7.965h2.372v8.069H.985V7.965zM0 17.996h4.342v-1.962H0v1.962zm0-12.028h4.342V4.006H0v1.962zm5.65 2.08h10.022c2.387 0 3.27.998 3.27 2.756v2.388c0 1.758-.883 2.756-3.27 2.756H5.65V7.965h2.372v5.107h7.28c.883 0 1.226-.372 1.226-1.025v-1.759c0-.653-.343-1.025-1.226-1.025H5.65V7.965h-2.37v10.03H5.65V17.997h-2.37v-1.962H5.65v-8.068zM22.312 4.006H24V17.996h-1.688v-1.962h1.688v-8.069h-1.688V4.006z"})})},{}),Laravel:(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M23.642 5.43a.364.364 0 01.014.1v5.149c0 .135-.073.26-.189.326l-4.323 2.49v4.934a.378.378 0 01-.188.326L9.93 23.949a.316.316 0 01-.066.027c-.008.002-.016.008-.024.01a.348.348 0 01-.192 0c-.011-.002-.02-.008-.03-.012-.02-.008-.042-.014-.062-.025L.533 18.755a.376.376 0 01-.189-.326V2.974c0-.033.005-.066.014-.098.003-.012.01-.02.014-.032a.369.369 0 01.023-.058c.004-.013.015-.022.023-.033l.033-.045c.012-.01.025-.018.037-.027.014-.012.027-.024.041-.034h.001L5.044.05a.375.375 0 01.375 0L9.933 2.697h.001c.015.01.027.021.04.033.013.01.026.018.037.028.013.014.02.03.033.045.008.011.02.021.025.033.01.02.017.038.024.058.003.011.01.021.013.032.01.031.014.064.014.098v9.652l3.76-2.164V5.527c0-.033.004-.066.013-.098.003-.01.01-.02.013-.032a.487.487 0 01.024-.059c.007-.012.018-.02.025-.033.012-.015.021-.03.033-.043.012-.012.025-.02.037-.028.015-.012.027-.024.041-.034h.001l4.513-2.598a.375.375 0 01.375 0l4.513 2.598c.016.01.027.021.042.033.012.01.025.018.036.028.013.014.022.03.034.045.008.012.019.021.024.033a.3.3 0 01.024.058c.003.011.01.021.013.032zM23.085 10.57V6.003l-1.58.91-2.18 1.255v4.568l3.76-2.164zm-4.51 7.75V13.75l-2.145 1.228-6.126 3.498v4.61l8.271-4.765zM1.095 3.624v14.588l8.273 4.761v-4.61l-4.322-2.445-.001-.002h-.002c-.014-.01-.025-.021-.04-.032-.012-.011-.025-.02-.035-.03l-.002-.001c-.013-.014-.02-.03-.031-.045-.01-.013-.022-.023-.03-.037l-.002-.003c-.008-.016-.012-.035-.018-.053-.006-.013-.013-.028-.018-.043l-.001-.006c-.003-.018-.004-.036-.005-.054-.002-.014-.005-.027-.005-.04V5.789l-2.18-1.257zM5.231.825 1.473 2.974l3.756 2.164 3.758-2.164zm1.956 13.861L9.368 13.43V3.624L7.788 4.535l-2.18 1.255v9.805zm11.581-10.4-3.756 2.163 3.756 2.163 3.758-2.164zm-.376 4.978-2.18-1.255-1.579-.91v4.568l2.18 1.255 1.58.908zm-8.65 9.654 5.514-3.148 2.756-1.572-3.757-2.164-4.323 2.489-3.941 2.27z"})})},{}),TypeScript:(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75c.612 0 1.154.037 1.627.111a6.38 6.38 0 011.306.34v2.458a3.95 3.95 0 00-.643-.361 5.093 5.093 0 00-.717-.26 5.453 5.453 0 00-1.426-.2c-.3 0-.573.028-.819.086a2.1 2.1 0 00-.623.242c-.17.104-.3.229-.393.374a.888.888 0 00-.14.49c0 .196.053.373.156.529.104.156.252.304.443.444s.423.276.696.41c.273.135.582.274.926.416.47.197.892.407 1.266.628.374.222.695.473.963.753.268.279.472.598.614.957.142.359.214.776.214 1.253 0 .657-.125 1.21-.373 1.656a3.033 3.033 0 01-1.012 1.085 4.38 4.38 0 01-1.487.596c-.566.12-1.163.18-1.79.18a9.916 9.916 0 01-1.84-.164 5.544 5.544 0 01-1.512-.493v-2.63a5.033 5.033 0 003.237 1.2c.333 0 .624-.03.872-.09.249-.06.456-.144.623-.25.166-.108.29-.234.373-.38a1.023 1.023 0 00-.074-1.089 2.12 2.12 0 00-.537-.5 5.597 5.597 0 00-.807-.444 27.72 27.72 0 00-1.007-.436c-.918-.383-1.602-.852-2.053-1.405-.45-.553-.676-1.222-.676-2.005 0-.614.123-1.141.369-1.582.246-.441.58-.804 1.004-1.089a4.494 4.494 0 011.47-.629 7.536 7.536 0 011.77-.201zm-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z"})})},{}),PHP:(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"
2currentColor",children:(0,t.jsx)("path",{d:"M7.01 10.207h-.944l-.515 2.648h.838c.556 0 .97-.105 1.242-.314.272-.21.455-.559.55-1.049.092-.47.05-.802-.124-.995-.175-.193-.523-.29-1.047-.29zM12 5.688C5.373 5.688 0 8.514 0 12s5.373 6.313 12 6.313S24 15.486 24 12c0-3.486-5.373-6.312-12-6.312zm-3.26 7.451c-.261.25-.575.438-.917.551-.336.108-.765.164-1.285.164H5.357l-.327 1.681H3.652l1.23-6.326h2.65c.797 0 1.378.209 1.744.628.366.418.476 1.002.33 1.752a2.836 2.836 0 01-.305.847c-.143.255-.33.49-.56.7zm4.89.637h-1.378l.515-2.648H11.74l-.515 2.648H9.846l1.23-6.326h1.378l-.422 2.167h1.028l.422-2.167h1.378zm5.343-2.541c-.068.34-.185.654-.35.938a2.72 2.72 0 01-.561.7c-.261.25-.575.438-.917.55-.336.109-.765.164-1.286.164h-1.18l-.328 1.682h-1.378l1.23-6.326h2.649c.797 0 1.378.209 1.744.628.366.418.476 1.002.33 1.752a2.81 2.81 0 01-.305.848c-.002.002-.046.072-.048.064zm-1.455-.091c.092-.47.05-.802-.124-.995-.175-.193-.524-.29-1.048-.29h-.943l-.516 2.648h.838c.557 0 .971-.105 1.242-.314.272-.21.456-.559.55-1.049z"})})},{}),Ruby:(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M20.156.083c3.033.525 3.96 2.528 3.844 4.461-.089 1.471-.622 2.59-1.932 3.983C20.908 9.73 15.895 12.689 5.4 20.95l-.618.507-.083.063-.031.022c-.152.107-.218.148-.21.163-.084-.068.073-.024-.3.267-.19.149-.373.292-.562.441-.137.105-.283.214-.426.326-.202.152-.323.207-.508.236-.175.027-.385-.033-.544-.093L.005 23.887 5.847 16.3l-3.47-6.49L4.762.192 14.82.003l5.336.08z"})})},{}),CLI:(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",strokeWidth:"0",children:(0,t.jsx)("path",{d:"M0 2.75C0 1.784.784 1 1.75 1h20.5c.966 0 1.75.784 1.75 1.75v18.5A1.75 1.75 0 0122.25 23H1.75A1.75 1.75 0 010 21.25zm1.75-.25a.25.25 0 00-.25.25v18.5c0 .138.112.25.25.25h20.5a.25.25 0 00.25-.25V2.75a.25.25 0 00-.25-.25zM7.28 9.22a.75.75 0 00-1.06 1.06l2.22 2.22-2.22 2.22a.75.75 0 101.06 1.06l2.75-2.75a.75.75 0 000-1.06zm3.97 4.28a.75.75 0 000 1.5h4.5a.75.75 0 000-1.5z"})})},{}),"MCP Server":(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M12 0C5.372 0 0 5.372 0 12s5.372 12 12 12 12-5.372 12-12S18.628 0 12 0zm0 2a10 10 0 0110 10 10 10 0 01-10 10A10 10 0 012 12 10 10 0 0112 2zm-1 4v2H9v2h2v2H9v2h2v2H9v2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6z"})})},{}),curl:(0,t.jsx)(function(){return(0,t.jsx)("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",fill:"currentColor",children:(0,t.jsx)("path",{d:"M3.738.755C2.177.755.828 1.545.258 2.794c-.569 1.25-.33 2.726.614 3.792 6.142 6.934 7.274 7.09 7.82 7.09.544 0 .861-.1 1.917-1.204.145-.152.52-.546 1.06-1.112l.056-.059C15.88 7.01 16.468 6.185 16.468 4.87c0-1.29-.563-2.384-1.534-3.094C14.017 1.1 12.897.755 11.626.755zm7.616 9.636c-.76.796-1.242 1.262-1.617 1.533l.152.163c3.063 3.299 4.395 5.677 4.395 8.298 0 .56-.08 1.105-.233 1.625a6.09 6.09 0 00.36.094c.372.087.68.14.944.14.7 0 1.263-.286 1.612-.65.353-.367.594-.924.676-1.715.094-.898-.122-2.031-.638-3.298-.508-1.247-1.3-2.65-2.325-4.164-.46-.68-.815-1.125-1.327-1.662z"})})},{})};e.s(["FrameworkNavIcon",0,function({name:e}){let a=s[e];return a?(0,t.jsx)("span",{className:"w-4 h-4 flex items-center justify-center text-zinc-500 dark:text-zinc-400 [&_svg]:w-3.5 [&_svg]:h-3.5",children:a}):null}])},650738,e=>{"use strict";var t=e.i(843476),s=e.i(522016),a=e.i(271645),n=e.i(526732),o=e.i(948148),r=e.i(499053),i=e.i(204297),l=e.i(741338),c=e.i(618566),d=e.i(689664);let h=["en","es","fr","de","it","pt","pl"],u=["/pricing","/open-source","/use-cases","/vrbo-api","/airbnb-api","/booking-com-api","/for-platforms","/migrate","/network","/claude-code","/cursor","/answers","/repull-studio"],p={en:{native:"English",english:"English",flag:"ð¬ð§"},es:{native:"Español",english:"Spanish",flag:"ðªð¸"},fr:{native:"Français",english:"French",flag:"ð«ð·"},de:{native:"Deutsch",english:"German",flag:"ð©ðª"},it:{native:"Italiano",english:"Italian",flag:"ð®ð¹"},pt:{native:"Português",english:"Portuguese",flag:"ðµð¹"},pl:{native:"Polski",english:"Polish",flag:"ðµð±"}},m="cubic-bezier(0.16, 1, 0.3, 1)";function g({variant:e="desktop",onAfterSelect:s}){let n=(0,c.usePathname)()??"/",o=(0,c.useRouter)(),[r,i]=(0,a.useState)("en");(0,a.useEffect)(()=>{i(function(e){for(let t of h)if("en"!==t&&(e===`/${t}`||e.startsWith(`/${t}/`)))return t;return null}(n)??function(){if("u"<typeof document)return"en";let e=document.cookie.match(/(?:^|; )NEXT_LOCALE=([^;
2]+)/),t=e?.[1];return t&&h.includes(t)?t:"en"}())},[n]);let l=e=>{e!==r&&(document.cookie=`NEXT_LOCALE=${e}; path=/; max-age=31536000; samesite=lax`,o.push(function(e,t){if(!function(e){let t=e;for(let e of h)if("en"!==e){if(t===`/${e}`)return!0;if(t.startsWith(`/${e}/`)){t=t.slice(`/${e}`.length);break}}if("/"===t||""===t)return!0;for(let e of u)if(t===e||t.startsWith(`${e}/`))return!0;return!1}(e))return"en"===t?"/":`/${t}`;let s=e;for(let e of h)if("en"!==e){if(s===`/${e}`){s="/";break}if(s.startsWith(`/${e}/`)){s=s.slice(`/${e}`.length);break}}return"en"===t?s||"/":"/"===s?`/${t}`:`/${t}${s}`}(n,e))),s?.()};return"mobile"===e?(0,t.jsx)(b,{active:r,onChange:l}):(0,t.jsx)(y,{active:r,onChange:l})}function f({symbol:e,size:s=18}){return(0,t.jsx)("span",{"aria-hidden":"true",className:"inline-flex items-center justify-center shrink-0 leading-none",style:{fontFamily:'"Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", "Twemoji Mozilla", sans-serif',fontSize:s,width:s+4,height:s+4},children:e})}function y({active:e,onCh
2ange:s}){let[n,o]=(0,a.useState)(!1),[r,i]=(0,a.useState)(!1),[l,c]=(0,a.useState)(!1),u=(0,a.useRef)(null),g=(0,a.useRef)(null),b=(0,a.useRef)(null),k=(0,a.useId)();(0,a.useEffect)(()=>{if(n){i(!0);let e=0,t=requestAnimationFrame(()=>{e=requestAnimationFrame(()=>c(!0))});return()=>{cancelAnimationFrame(t),e&&cancelAnimationFrame(e)}}{if(c(!1),!r)return;let e=window.setTimeout(()=>i(!1),220);return()=>window.clearTimeout(e)}},[n]),(0,a.useEffect)(()=>{if(!n)return;let e=e=>{u.current&&!u.current.contains(e.target)&&o(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[n]),(0,a.useEffect)(()=>{if(!n)return;let e=e=>{"Escape"===e.key&&(o(!1),g.current?.focus())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[n]),(0,a.useEffect)(()=>{if(!l||!b.current)return;let e=Array.from(b.current.querySelectorAll('button[role="menuitemradio"]')),t=e.findIndex(e=>"true"===e.getAttribute("aria-checked"));e[t>=0?t:0]?.focus()},[l]);let v=p[e];return(0,t.jsxs)("div",{ref:u,className:"relative",children:[(0,t.jsxs)("button",{ref:g,type:"button",onClick:()=>o(e=>!e),"aria-haspopup":"menu","aria-expanded":n,"aria-controls":k,"aria-label":"Change language",className:"inline-flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-[13px] text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-white hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors",children:[(0,t.jsx)(f,{symbol:v.flag,size:14}),(0,t.jsx)("span",{className:"font-medium",children:v.native}),(0,t.jsx)("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5","aria-hidden":"true",className:"transition-transform",style:{transitionDuration:"200ms",transitionTimingFunction:m,transform:n?"rotate(180deg)":"rotate(0deg)"},children:(0,t.jsx)("path",{d:"m6 9 6 6 6-6"})})]}),r&&(0,t.jsxs)("div",{ref:b,id:k,role:"menu","aria-label":"Select language","aria-orientation":"vertical",onKeyDown:e=>{if(!b.current)return;let t=Array.from(b.current.querySelectorAll('button[role="menuitemradio"]')),s=t.indexOf(document.activeElement);"ArrowDown"===e.key?(e.preventDefault(),t[(s+1)%t.length]?.focus()):"ArrowUp"===e.key?(e.preventDefault(),t[(s-1+t.length)%t.length]?.focus()):"Home"===e.key?(e.preventDefault(),t[0]?.focus()):"End"===e.key&&(e.preventDefault(),t[t.length-1]?.focus())},className:"absolute top-full right-0 mt-2 w-64 origin-top-right rounded-xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-950 shadow-2xl shadow-zinc-900/10 dark:shadow-black/50 ring-1 ring-zinc-900/5 dark:ring-white/5 p-1.5",style:{opacity:+!!l,transform:l?"translateY(0) scale(1)":"translateY(-4px) scale(0.97)",pointerEvents:l?"auto":"none",transition:`opacity 200ms ${m}, transform 200ms ${m}`,willChange:"opacity, transform"},children:[(0,t.jsx)("p",{className:"text-[10px] font-bold text-zinc-400 uppercase tracking-widest px-3 pt-2 pb-1.5",children:"Language"}),(0,t.jsx)("div",{className:"flex flex-col",children:h.map(a=>{let n=p[a],r=a===e;return(0,t.jsxs)("button",{type:"button",role:"menuitemradio","aria-checked":r,onClick:()=>{s(a),o(!1),g.current?.focus()},lang:a,className:`group relative w-full flex items-center gap-3 px-3 py-2 rounded-lg text-left transition-colors outline-none focus-visible:bg-zinc-50 dark:focus-visible:bg-zinc-900 ${r?"bg-zinc-50 dark:bg-zinc-900":"hover:bg-zinc-50 dark:hover:bg-zinc-900"}`,children:[(0,t.jsx)(f,{symbol:n.flag,size:18}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:`text-[13px] font-semibold truncate ${r?"text-zinc-900 dark:text-white":"text-zinc-800 dark:text-zinc-100 group-hover:text-zinc-900 dark:group-hover:text-white"}`,children:n.native}),(0,t.jsx)("p",{className:"text-[11px] text-zinc-500 dark:text-zinc-400 truncate",children:n.english})]}),r&&(0,t.jsx)(d.Check,{size:14,strokeWidth:2.5,className:"text-emerald-500 dark:text-emerald-400 shrink-0","aria-hidden":"true"})]},a)})})]})]})}
2function b({active:e,onChange:s}){let[n,o]=(0,a.useState)(!1),r=(0,a.useId)(),i=p[e];return(0,t.jsxs)("div",{className:"rounded-xl border border-zinc-200 dark:border-zinc-800 overflow-hidden",children:[(0,t.jsxs)("button",{type:"button","aria-expanded":n,"aria-controls":r,onClick:()=>o(e=>!e),className:"w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors hover:bg-zinc-50 dark:hover:bg-zinc-900",children:[(0,t.jsx)(f,{symbol:i.flag,size:18}),(0,t.jsx)("span",{className:"flex-1 min-w-0 text-[14px] font-semibold text-zinc-900 dark:text-white truncate",children:i.native}),(0,t.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5","aria-hidden":"true",className:"text-zinc-400 dark:text-zinc-500 transition-transform",style:{transitionDuration:"200ms",transitionTimingFunction:m,transform:n?"rotate(180deg)":"rotate(0deg)"},children:(0,t.jsx)("path",{d:"m6 9 6 6 6-6"})})]}),n&&(0,t.jsx)("div",{id:r,role:"radiogroup","aria-label":"Select language",className:"border-t border-zinc-100 dark:border-zinc-900 flex flex-col",children:h.map((a,n)=>{let o=p[a],r=a===e;return(0,t.jsxs)("button",{type:"button",role:"radio","aria-checked":r,onClick:()=>s(a),lang:a,className:`w-full flex items-center gap-3 px-3 py-2.5 text-left transition-colors ${0===n?"":"border-t border-zinc-100 dark:border-zinc-900"} ${r?"bg-zinc-50 dark:bg-zinc-900":"hover:bg-zinc-50 dark:hover:bg-zinc-900"}`,children:[(0,t.jsx)(f,{symbol:o.flag,size:18}),(0,t.jsx)("span",{className:"flex-1 min-w-0 text-[14px] font-semibold text-zinc-900 dark:text-white truncate",children:o.native}),r&&(0,t.jsx)(d.Check,{size:16,strokeWidth:2.5,className:"text-emerald-500 dark:text-emerald-400 shrink-0","aria-hidden":"true"})]},a)})})]})}let k=[{key:"studio",href:"/repull-studio"},{key:"openSource",href:"/open-source"},{key:"pricing",href:"/pricing"},{key:"blog",href:"/blog"},{key:"changelog",href:"/changelog"}],v=[{key:"guestInbox",href:"/use-cases/guest-inbox"},{key:"aiAssistant",href:"/use-cases/ai-assistant"},{key:"reviews",href:"/use-cases/reviews"},{key:"upsells",href:"/use-cases/upsells"},{key:"operations",href:"/use-cases/operations"},{key:"useCases",href:"/use-cases"},{key:"forPlatforms",href:"/for-platforms"},{key:"migrate",href:"/migrate"},{key:"airbnbApi",href:"/airbnb-api"},{key:"bookingApi",href:"/booking-com-api"},{key:"vrboApi",href:"/vrbo-api"}],x=[{key:"gettingStarted",href:"/docs/introduction"},{key:"apiReference",href:"/docs/api/introduction"},{key:"webhooks",href:"/docs/webhooks/event-types"},{key:"sdks",href:"/docs/sdks"},{key:"mcpServer",href:"/docs/mcp-server"},{key:"cli",href:"/docs/cli"}],w="cubic-bezier(0.16, 1, 0.3, 1)";function A({open:e,reducedMotion:s}){let a={transformOrigin:"12px 12px",transition:s?"none":`transform 280ms ${w}, opacity 200ms ease-out`};return(0,t.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round","aria-hidden":"true",style:{pointerEvents:"none"},children:[(0,t.jsx)("line",{x1:"4",x2:"20",y1:"6",y2:"6",style:{...a,transform:e?"translateY(6px) rotate(45deg)":"translateY(0) rotate(0deg)"}}),(0,t.jsx)("line",{x1:"4",x2:"20",y1:"12",y2:"12",style:{...a,opacity:+!e,transform:e?"scaleX(0.4)":"scaleX(1)"}}),(0,t.jsx)("line",{x1:"4",x2:"20",y1:"18",y2:"18",style:{...a,transform:e?"translateY(-6px) rotate(-45deg)":"translateY(0) rotate(0deg)"}})]})}function T(){let{data:e}=(0,n.useSession)(),i=!!e?.user,l=(0,o.useTranslations)("mobileMenu"),c=(0,o.useTranslations)("siteNav"),[d,h]=(0,a.useState)(!1),[u,p]=(0,a.useState)(!1),[m,f]=(0,a.useState)(!1),[y,b]=(0,a.useState)(!1),[T,I]=(0,a.useState)(0),[j,P]=(0,a.useState)(!1),S=(0,a.useRef)(null),N=(0,a.useRef)(null),R=(0,a.useRef)(null),M=(0,a.useRef)(null),E=(0,a.useRef)(null),q=(0,a.useRef)(null);(0,a.useEffect)(()=>{let e=window.matchMedia("(prefers-reduced-motion: reduce)"),t=()=>b(e.matches);return t(),e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[]),(0,a.useEffect)(()=>{if(d){p(!0);let e=0,t=requestAnimationFrame(()=>{e=requestAnimationFrame(()=>f(!0))});return()=>{cancelAnimationFrame(t),e&&cancelAnimationFrame(e)}}{if(f(!1),!u)return;let e=window.setTimeout(()=>{p(!1),I(0)},340*!y);return()=>window.clearTimeout(e)}},[d,y]),(0,a.useEffect)(()=>
2{if(!d)return;let e=document.documentElement,t=document.body,s=window.innerWidth-e.clientWidth,a={htmlOverflow:e.style.overflow,htmlPaddingRight:e.style.paddingRight,bodyOverflow:t.style.overflow,bodyPaddingRight:t.style.paddingRight};return s>0&&(e.style.paddingRight=`${s}px`),e.style.overflow="hidden",t.style.overflow="hidden",()=>{e.style.overflow=a.htmlOverflow,e.style.paddingRight=a.htmlPaddingRight,t.style.overflow=a.bodyOverflow,t.style.paddingRight=a.bodyPaddingRight}},[d]),(0,a.useEffect)(()=>{if(!d)return;let e=e=>{"Escape"===e.key&&(h(!1),E.current?.focus())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[d]),(0,a.useEffect)(()=>{if(!m)return;let e=window.setTimeout(()=>q.current?.focus(),320*!y),t=e=>{if("Tab"!==e.key||!M.current)return;let t=M.current.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])');if(0===t.length)return;let s=t[0],a=t[t.length-1];e.shiftKey&&document.activeElement===s?(e.preventDefault(),a.focus()):e.shiftKey||document.activeElement!==a||(e.preventDefault(),s.focus())};return document.addEventListener("keydown",t),()=>{window.clearTimeout(e),document.removeEventListener("keydown",t)}},[m,y]);let G=(0,a.useCallback)(()=>h(!1),[]),H=(0,a.useCallback)(e=>{if(y)return;let t=e.touches[0];S.current=t.clientX,N.current=t.clientY,R.current=null},[y]),O=(0,a.useCallback)(e=>{if(y)return;let t=S.current,s=N.current;if(null==t||null==s)return;let a=e.touches[0],n=a.clientX-t,o=a.clientY-s;if(null==R.current)if(!(Math.abs(n)>6||Math.abs(o)>6))return;else R.current=Math.abs(n)>Math.abs(o)?"x":"y";if("x"!==R.current)return;let r=Math.max(0,n);I(r),!j&&r>0&&P(!0)},[j,y]),B=(0,a.useCallback)(()=>{if(y){S.current=null,N.current=null,R.current=null;return}P(!1),S.current=null,N.current=null,R.current=null,T>80?h(!1):I(0)},[T,y]),L=y?m?"translateX(0)":"translateX(100%)":j?`translateX(${T}px)`:m?"translateX(0)":"translateX(100%)",K=y?+!!m:j?Math.max(0,Math.min(1,m?1-T/320:0)):+!!m;return(0,t.jsxs)("div",{className:"md:hidden",children:[(0,t.jsx)("button",{ref:E,type:"button","aria-label":l("toggleAriaLabel"),"aria-expanded":d,"aria-controls":"mobile-nav-panel",onClick:()=>h(e=>!e),className:"relative inline-flex items-center justify-center w-9 h-9 rounded-lg text-zinc-700 dark:text-zinc-200 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors",children:(0,t.jsx)(A,{open:d,reducedMotion:y})}),u&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{"aria-hidden":"true",onClick:G,className:"fixed inset-0 z-[60] bg-zinc-950/40 backdrop-blur-sm",style:{opacity:K,transition:y||j?"none":"opacity 220ms cubic-bezier(0.32, 0.72, 0, 1)",willChange:"opacity"}}),(0,t.jsxs)("div",{ref:M,id:"mobile-nav-panel",role:"dialog","aria-modal":"true","aria-label":l("dialogAriaLabel"),onTouchStart:H,onTouchMove:O,onTouchEnd:B,onTouchCancel:B,className:"fixed top-0 right-0 z-[70] h-[100dvh] w-[88%] max-w-sm bg-white dark:bg-zinc-950 border-l border-zinc-200 dark:border-zinc-800 flex flex-col",style:{transform:L,transition:y||j?"none":`transform 320ms ${w}`,boxShadow:"-8px 0 32px -8px rgba(0, 0, 0, 0.18), -1px 0 0 0 rgba(0, 0, 0, 0.04)",willChange:"transform"},children:[(0,t.jsxs)("div",{className:"flex items-center justify-between h-14 px-4 border-b border-zinc-200 dark:border-zinc-800",children:[(0,t.jsx)("span",{className:"text-[13px] font-bold uppercase tracking-widest text-zinc-400",children:l("menu")}),(0,t.jsx)("button",{ref:q,type:"button","aria-label":l("closeAriaLabel"),onClick:G,className:"inline-flex items-center justify-center w-9 h-9 rounded-lg text-zinc-700 dark:text-zinc-200 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors",children:(0,t.jsx)(A,{open:!0,reducedMotion:y})})]}),(0,t.jsxs)(z,{visible:m,reducedMotion:y,children:[(0,t.jsxs)("div",{className:"flex-1 overflow-y-auto px-4 py-5 space-y-6","data-stagger-scroll":!0,children:[(0,t.jsxs)(C,{label:c("solutions.label"),children:[(0,t.jsx)(s.default,{href:"/docs/alongside-your-pms",onClick:G,className:"px-2 py-2.5 rounded-lg text-[15px] font-semibold text-emerald-600 dark:text-emerald-400 hover:bg-zinc-50 dark:hover:bg-zinc-900 transition-colors",children:c("solutions.featured.label")}),v.map(e=>(0,t.jsx)(s.default,{href:e.href,onClick:G,className:"px-2 py-2.5 rounded-lg text-[15px] text-zinc-700 dark:text-zinc-200 hover:bg-zinc-50 dark:hover:bg-zinc-900 transition-colors",children:c(`docs.${e.key}.label`)},e.href))]}),(0,t.jsx)(C,{label:l("sectionNavigation"),children:k.map(e=>(0,t.jsx)(s.default,{href:e.href,onClick:G,className:"px-2 py-2.5 rounded-lg text-[15px] text-zinc-700 dark:text-zinc-200 hover:bg-zinc-50 dark:hover:bg-zinc-900 transition-colors",children:l(`nav.${e.key}`)},e.href))}),(0,t.jsx)(C,{label:l("sectionDocs"),children:x.map(e=>(0,t.jsx)(s.default,{href:e.href,onClick:G,className:"px-2 py-2.5 rounded-lg text-[15px] text-zinc-700 dark:text-zinc-200 hover:bg-zinc-50 dark:hover:bg-zinc-900 transition-colors",children:l(`docs.${e.key}`)},e.href))})]}),(0,t.jsxs)("div",{className:"border-t border-zinc-200 dark:border-zinc-800 p-4 space-y-3","data-stagger-footer":!0,children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-[10px] font-bold text-zinc-400 uppercase tracking-widest mb-2",children:l("language")}),(0,t.jsx)(g,{variant:"mobile",onAfterSelect:G})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-[13px] text-zinc-500",children:l("theme")}),(0,t.jsx)(r.ThemeToggle,{})]}),i?(0,t.jsx)(s.default,{href:"/dashboard",onClick:G,className:"block w-full text-center text-[14px] px-4 py-2.5 rounded-lg bg-zinc-900 dark:bg-white text-white dark:text-black font-medium hover:opacity-80 transition",children:l("dashboard")}):(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-2",children:[(0,t.jsx)(s.default,{href:"/login",onClick:G,className:"text-center text-[14px] px-4 py-2.5 rounded-lg border border-zinc-200 dark:border-zinc-800 text-zinc-700 dark:text-zinc-200 font-medium hover:bg-zinc-50 dark:hover:bg-zinc-900 transition",children:l("logIn")}),(0,t.jsx)(s.default,{href:"/register",onClick:G,className:"text-center text-[14px] px-4 py-2.5 rounded-lg bg-zinc-900 dark:bg-white text-white dark:text-black font-medium hover:opacity-80 transition",children:l("getStarted")})]})]})]})]})]})]})}function C({label:e,children:s}){return(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-[10px] font-bold text-zinc-400 uppercase tracking-widest mb-2 px-2",children:e}),(0,t.jsx)("div",{className:"flex flex-col",children:s})]})}function z({visible:e,reducedMotion:s,children:n}){let o=(0,a.useRef)(null);return(0,a.useEffect)(()=>
2{let t=o.current;t&&Array.from(t.querySelectorAll("a, button, [data-stagger-item]")).forEach((t,a)=>{let n=s?0:e?120+28*a:0;t.style.transition=s?"none":`opacity 240ms ${w} ${n}ms, transform 280ms ${w} ${n}ms`,t.style.opacity=e?"1":"0",t.style.transform=e?"translateY(0)":"translateY(8px)",t.style.willChange=e?"opacity, transform":""})},[e,s]),(0,t.jsx)("div",{ref:o,className:"flex-1 flex flex-col min-h-0",children:n})}let I=[{name:"Next.js",href:"/docs/connect-with-nextjs"},{name:"Express",href:"/docs/connect-with-express"},{name:"Python",href:"/docs/connect-with-python"},{name:"Ruby on Rails",href:"/docs/connect-with-rails"},{name:"Laravel",href:"/docs/connect-with-laravel"},{name:"Go",href:"/docs/connect-with-go"}],j=[{key:"gettingStarted",href:"/docs/introduction"},{key:"apiReference",href:"/docs/api/introduction"},{key:"webhooks",href:"/docs/webhooks/event-types"},{key:"knowledgeBase",href:"/docs/pms-coverage"},{key:"sdks",href:"/docs/sdks"}],P=[{key:"guestInbox",href:"/use-cases/guest-inbox"},{key:"aiAssistant",href:"/use-cases/ai-assistant"},{key:"reviews",href:"/use-cases/reviews"},{key:"upsells",href:"/use-cases/upsells"},{key:"operations",href:"/use-cases/operations"}],S=[{key:"useCases",href:"/use-cases"},{key:"forPlatforms",href:"/for-platforms"},{key:"migrate",href:"/migrate"}],N=[{key:"airbnbApi",href:"/airbnb-api"},{key:"bookingApi",href:"/booking-com-api"},{key:"vrboApi",href:"/vrbo-api"}],R=[{key:"mcpServer",href:"/docs/mcp-server"},{key:"cli",href:"/docs/cli"},{key:"sdks",href:"/docs/sdks"},{key:"claudeCode",href:"/claude-code"},{key:"cursor",href:"/cursor"},{key:"aiOperations",href:"/docs/ai-operations"}];e.s(["SiteNav",0,function(){let{data:e}=(0,n.useSession)(),c=(0,o.useTranslations)("siteNav"),d=!!e?.user,[h,u]=(0,a.useState)(!1),[p,m]=(0,a.useState)(!1),[f,y]=(0,a.useState)(!1),b=(0,a.useRef)(null),k=(0,a.useRef)(null),v=(0,a.useRef)(null);return(0,a.useEffect)(()=>{let e=e=>{b.current&&!b.current.contains(e.target)&&u(!1),k.current&&!k.current.contains(e.target)&&m(!1),v.current&&!v.current.contains(e.target)&&y(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[]),(0,t.jsx)("nav",{className:"border-b border-zinc-200 dark:border-zinc-800 bg-white/80 dark:bg-black/80 backdrop-blur-xl sticky top-0 z-50",children:(0,t.jsxs)("div",{className:"max-w-6xl mx-auto px-4 h-14 flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center gap-6",children:[(0,t.jsxs)(s.default,{href:"/",className:"flex items-center gap-2",children:[(0,t.jsx)(l.RepullLogo,{}),(0,t.jsx)("span",{className:"text-[15px] font-bold tracking-tight",children:"Repull"})]}),(0,t.jsxs)("div",{className:"hidden md:flex items-center gap-6",children:[(0,t.jsxs)("div",{ref:b,className:"relative",children:[(0,t.jsxs)("button",{onClick:()=>{u(!h),m(!1),y(!1)},className:`text-[14px] transition flex items-center gap-1 ${h?"text-zinc-900 dark:text-white":"text-zinc-500 hover:text-zinc-900 dark:hover:text-white"}`,children:[c("solutions.label"),(0,t.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:`transition-transform duration-200 ${h?"rotate-180":""}`,children:(0,t.jsx)("path",{d:"m6 9 6 6 6-6"})})]}),(0,t.jsxs)("div",{className:`absolute top-full left-0 mt-2 w-[calc(100vw-2rem)] sm:w-[560px] lg:w-[820px] max-w-[820px] bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl shadow-2xl shadow-zinc-900/10 dark:shadow-black/40 p-4 sm:p-5 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6 transition-all duration-200 origin-top-left ${h?"opacity-100 scale-100 pointer-events-auto":"opacity-0 scale-95 pointer-events-none"}`,children:[(0,t.jsxs)(s.default,{href:"/docs/alongside-your-pms",onClick:()=>u(!1),className:"sm:col-span-2 lg:col-span-3 block rounded-lg border border-emerald-500/25 bg-emerald-500/[0.06] hover:bg-emerald-500/10 px-4 py-3 transition",children:[(0,t.jsxs)("p",{className:"text-[13.5px] font-semibold text-zinc-900 dark:text-white",children:[c("solutions.featured.label")," â"]}),(0,t.jsx)("p",{className:"text-[12px] text-zinc-500 dark:text-zinc-400 mt-0.5",children:c("solutions.featured.desc")})]}),[["sectionProduct",P],["sectionBuild",S],["sectionChannels",N]].map(([e,a])=>(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-[10px] font-bold text-zinc-400 uppercase tracking-widest mb-3",children:c(`solutions.${e}`)}),(0,t.jsx)("div",{className:"space-y-0.5",children:a.map(e=>(0,t.jsxs)(s.default,{href:e.href,onClick:()=>u(!1),className:"block px-3 py-2 rounded-lg hover:bg-zinc-50 dark:hover:bg-zinc-800 transition group",children:[(0,t.jsx)("p",{className:"text-[13px] font-medium text-zinc-900 dark:text-white",children:c(`docs.${e.key}.label`)}),(0,t.jsx)("p",{className:"text-[11px] text-zinc-400",children:c(`docs.${e.key}.desc`)})]},e.key))})]},e))]})]}),(0,t.jsxs)("div",{ref:k,className:"relative",children:[(0,t.jsxs)("button",{onClick:()=>{m(!p),y(!1),u(!1)},className:`text-[14px] transition flex items-center gap-1 ${p?"text-zinc-900 dark:text-white":"text-zinc-500 hover:text-zinc-900 dark:hover:text-white"}`,children:[c("docs.label"),(0,t.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:`transition-transform duration-200 ${p?"rotate-180":""}`,children:(0,t.jsx)("path",{d:"m6 9 6 6 6-6"})})]}),(0,t.jsxs)("div",{className:`absolute top-full left-0 mt-2 w-[calc(100vw-2rem)] sm:w-[580px] max-w-[580px] bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl shadow-2xl shadow-zinc-900/10 dark:shadow-black/40 p-4 sm:p-5 grid grid-cols-1 sm:grid-cols-2 gap-4 sm:gap-6 transition-all duration-200 origin-top-left ${p?"opacity-100 scale-100 pointer-events-auto":"opacity-0 scale-95 pointer-events-none"}`,children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-[10px] font-bold text-zinc-400 uppercase tracking-widest mb-3",children:c("docs.sectionLabel")}),(0,t.jsx)("div",{className:"space-y-0.5",children:j.map(e=>(0,t.jsxs)(s.default,{href:e.href,onClick:()=>m(!1),className:"block px-3 py-2 rounded-lg hover:bg-zinc-50 dark:hover:bg-zinc-800 transition group",children:[(0,t.jsx)("p",{className:"text-[13px] font-medium text-zinc-900 dark:text-white",children:c(`docs.${e.key}.label`)}),(0,t.jsx)("p",{className:"text-[11px] text-zinc-400",children:c(`docs.${e.key}.desc`)})]},e.key))})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-[10px] font-bold text-zinc-400 uppercase tracking-widest mb-3",children:c("quickstarts.label")}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-0.5",children:I.map(e=>(0,t.jsxs)(s.default,{href:e.href,onClick:()=>m(!1),className:"flex items-center gap-2.5 px-3 py-2 rounded-lg hover:bg-zinc-50 dark:hover:bg-zinc-800 transition group",children:[(0,t.jsx)("span",{className:"text-zinc-400 group-hover:text-zinc-700 dark:group-hover:text-zinc-200 transition-colors",children:(0,t.jsx)(i.FrameworkNavIcon,{name:e.name})}),(0,t.jsx)("span",{className:"text-[13px] text-zinc-600 dark:text-zinc-400 group-hover:text-zinc-900 dark:group-hover:text-white transition-colors",children:e.name})]},e.href))}),(0,t.jsx)(s.default,{href:"/docs/introduction",onClick:()=>m(!1),className:"block mt-4 text-[11px] text-[var(--brand)] hover:underline px-3 font-medium",children:c("docs.viewAll")})]})]})]}),(0,t.jsxs)("div",{ref:v,className:"relative",children:[(0,t.jsxs)("button",{onClick:()=>{y(!f),m(!1),u(!1)},className:`text-[14px] transition flex items-center gap-1 ${f?"text-zinc-900 dark:text-white":"text-zinc-500 hover:text-zinc-900 dark:hover:text-white"}`,children:[c("ai.label"),(0,t.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:`transition-transform duration-200 ${f?"rotate-180":""}`,children:(0,t.jsx)("path",{d:"m6 9 6 6 6-6"})})]}),(0,t.jsxs)("div",{className:`absolute top-full left-0 mt-2 w-[calc(100vw-2rem)] sm:w-[340px] max-w-[340px] bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 rounded-xl shadow-2xl shadow-zinc-900/10 dark:shadow-black/40 p-4 transition-all duration-200 origin-top-left ${f?"opacity-100 scale-100 pointer-events-auto":"opacity-0 scale-95 pointer-events-none"}`,children:[(0,t.jsx)("p",{className:"text-[10px] font-bold text-zinc-400 uppercase tracking-widest mb-3",children:c("ai.sectionLabel")}),(0,t.jsx)("div",{className:"space-y-0.5",children:R.map(e=>(0,t.jsxs)(s.default,{href:e.href,onClick:()=>y(!1),className:"block px-3 py-2 rounded-lg hover:bg-zinc-50 dark:hover:bg-zinc-800 transition group",children:[(0,t.jsx)("p",{className:"text-[13px] font-medium text-zinc-900 dark:text-white",children:c(`aiTools.${e.key}.label`)}),(0,t.jsx)("p",{className:"text-[11px] text-zinc-400",children:c(`aiTools.${e.key}.desc`)})]},e.href))})]})]}),(0,t.jsx)(s.default,{href:"/repull-studio",className:"text-[14px] text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition",children:c("links.studio")}
2),(0,t.jsx)(s.default,{href:"/open-source",className:"text-[14px] text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition",children:c("links.openSource")}),(0,t.jsx)(s.default,{href:"/pricing",className:"text-[14px] text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition",children:c("links.pricing")}),(0,t.jsx)(s.default,{href:"/blog",className:"text-[14px] text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition hidden lg:inline",children:c("links.blog")}),(0,t.jsx)(s.default,{href:"/changelog",className:"text-[14px] text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition hidden lg:inline",children:c("links.changelog")})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsxs)("div",{className:"hidden md:flex items-center gap-1",children:[(0,t.jsx)(g,{}),(0,t.jsx)(r.ThemeToggle,{})]}),d?(0,t.jsx)(s.default,{href:"/dashboard",className:"text-[14px] px-4 py-1.5 rounded-lg bg-zinc-900 dark:bg-white text-white dark:text-black font-medium hover:opacity-80 transition",children:c("cta.dashboard")}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.default,{href:"/login",className:"text-[14px] text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition hidden md:inline",children:c("cta.login")}),(0,t.jsx)(s.default,{href:"/register",className:"text-[14px] px-4 py-1.5 rounded-lg bg-zinc-900 dark:bg-white text-white dark:text-black font-medium hover:opacity-80 transition",children:c("cta.getStarted")})]}),(0,t.jsx)(T,{})]})]})})}],650738)},683119,e=>{"use strict";var t=e.i(843476),s=e.i(522016),a=e.i(948148);let n={listings:!1,reservations:!1,calendar:!1,messages:!1,webhooks:!1,guests:!1},o=[{id:"hostaway",name:"Hostaway",authType:"OAuth2 Client Credentials",authFields:["clientId","clientSecret"],description:"Full-featured PMS with strong API coverage. Excellent for large property managers.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!0,guests:!0},fieldCoverage:[{resource:"Reservation",fields:[{name:"confirmationCode",supported:"full"},{name:"checkIn/checkOut",supported:"full"},{name:"totalPrice",supported:"full"}
2,{name:"priceBreakdown",supported:"full"},{name:"guestDetails",supported:"full"},{name:"platform/source",supported:"full"},{name:"paymentStatus",supported:"full"}]},{resource:"Listing",fields:[{name:"name",supported:"full"},{name:"address",supported:"full"},{name:"coordinates",supported:"full"},{name:"thumbnail",supported:"full"},{name:"customFields",supported:"full"}]}],notes:["Tokens last ~24 months â minimal refresh needed","Rate limit: 15 req/10s per IP, 20 req/10s per account","Supports custom variables import","The Public API must be turned on in Hostaway; while it is off every call is refused and the connection asks to be reconnected","Channel mapping available (Airbnb, Booking and other channel sources)"],connectionGuide:"In Hostaway, open Settings â Public API (turn the Public API on if it is off) and create an API key. Send your Hostaway Account ID as clientId and the API key as clientSecret."},{id:"guesty",name:"Guesty",authType:"OAuth2 Client Credentials",authFields:["clientId","clientSecret"],description:"Enterprise PMS with comprehensive API. Strong webhook support.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!0,guests:!0},fieldCoverage:[{resource:"Reservation",fields:[{name:"confirmationCode",supported:"full"},{name:"checkIn/checkOut",supported:"full"},{name:"totalPrice",supported:"full"}
2,{name:"priceBreakdown",supported:"full"},{name:"guestDetails",supported:"full"},{name:"platform/source",supported:"full"},{name:"paymentStatus",supported:"full"}]}],notes:["HMAC SHA-256 webhook signature validation","Supports guest profile management","Rich conversation threading"],connectionGuide:"In Guesty, go to Settings â Integrations â Open API and create an application. Copy the Client ID and Client Secret â the secret is shown once.",deep:{published:"2026-09-20",reviewed:"2026-10-03",quotable:"Guesty exposes a REST Open API at open-api.guesty.com covering listings, reservations, calendar, guests, messaging and webhooks, authenticated with OAuth2 client credentials issued from Settings â Integrations â Open API.",whatItIs:["Guesty runs a REST API â the Open API â at `https://open-api.guesty.com/v1`. It covers most of what the product does: listings, reservations, the availability and pricing calendar, guests, guest messaging and webhooks. You can read bookings, write nightly rates and minimum stays, block dates, and reply to a guest.","Access is not gated. Unlike Airbnb or Booking.com, there is no partner programme to apply to and no review to pass â an account holder creates credentials in the dashboard in about a minute. If your client is on Guesty and will give you access, you can be reading their reservations this afternoon.","So the question is not whether it can do the job. It is what the job turns out to cost, and that is what the rest of this page is about."],access:{steps:["In Guesty, open Settings â Integrations â Open API. You need an account with permission to manage integrations; a staff user usually does not have it.","Create an application. Guesty issues a Client ID and a Client Secret. The secret is shown once â store it before you close the dialog.","Exchange them for an access token at `https://open-api.guesty.com/oauth2/token` with `grant_type=client_credentials` and `scope=open-api`.","Call the API with `Authorization: Bearer <token>` against `https://open-api.guesty.com/v1`. Read the next section before you write that code."],note:"There is no consent screen and no redirect flow, which makes Guesty quick to connect and also means the credentials belong to the account holder. If you are building for clients, each client creates their own application and hands you the pair â and you are now storing their secrets."},gotchas:[{title:"The Guesty API token limit: five per key per 24 hours",detail
2:"This is the one that hurts, and it is not in the place you would look. Guesty does not merely rate-limit the token endpoint â it caps you at five tokens per key per rolling day. Fetch a token per request, which is what almost every HTTP client does by default, and you are locked out after five calls for a day, with your integration dark and nothing obviously wrong in your code. Cache the token, persist it somewhere every process and every deploy can reach, and refresh only near expiry. Our connector caches in memory, then in the database, refreshes five minutes before the token dies, and counts issuance against a rolling 24-hour window so it refuses locally rather than spending the fifth one."},{title:"The channel is called airbnb2",detail:'A reservation that came from Airbnb has `source: "airbnb2"`, not `"airbnb"`. Booking.com is `"bookingcom"`. Anything handling cross-channel bookings branches on this, and matching the obvious string sends every Airbnb reservation quietly down your fallback path. It raises no error, passes code review, and shows up a week later as "why are the Airbnb ones wrong".'},{title:"The calendar is not where the rest of the API is",detail:'Listings, reservations and guests sit at `/v1/<resource>`. The calendar sits at `/availability-pricing/api/calendar/listings/{listingId}` â a different base path, a different shape, reading and writing a `days` array. Any abstraction you build over "Guesty resources" needs a special case for it on day one, which usually means discovering it on day two.'},{title:'Messages are "posts" inside "conversations"',detail:"Messaging lives under `/communication/conversations`. The messages in a conversation come from `/communication/conversations/{id}/posts`, and sending is a separate verb-shaped endpoint, `/communication/conversations/{id}/send-message`, rather than a POST to the collection you just read."},{title:"Offset pagination, and filters as stringified JSON",detail:'Collections take `limit` and `skip`. Deep pagination slows as you go, and a record inserted mid-walk shifts rows under you â so a nightly full sync can skip or double a booking. Filters are passed as a JSON-encoded array inside a query parameter: `filters=[{"field":"status","operator":"$eq","value":"confirmed"}]`.'},{title:"Ids are Mongo ObjectIds",detail:"Every id is `_id`, a 24-character hex string. Not an integer, not a UUID. If your schema types ids as integers you find out at insert time; if it types them as UUIDs, your validation rejects perfectly good data."}],maintenance:{lead:"Getting the first reservation out of Guesty is an afternoon. Keeping it working is the part worth costing, because it never goes back to zero.",items:["The token cache is now infrastructure you own. It has to be shared across processes, survive deploys, and never race â five tokens a day leaves no room to be sloppy.","Credentials are per account. Every client creates their own application and hands you a Client ID and Secret, and every pair is a secret you store, rotate, revoke and get asked about in a security review.","Payloads move. Reservation fields and webhook bodies change as Guesty ships; nothing announces it, the shape is simply different one morning.","Channel source values are Guestyâs vocabulary, not the channelsâ. When Guesty adds an integration, a new string appears in your data before it appears in your code.","None of this is Guesty being difficult â it is the ordinary cost of owning an integration. The point is that it is the same cost again for the next system, and it does not get cheaper with practice."]},example:{theirsLabel:"Guesty directly",theirs:'# Get a token. You get five a day, so this must be cached.\ncurl -s -X POST \'https://open-api.guesty.com/oauth2/token\' \\\n -H \'Content-Type: application/json\' \\\n -d \'{\n "grant_type": "client_credentials",\n "scope": "open-api",\n "client_id": "YOUR_CLIENT_ID",\n "client_secret": "YOUR_CLIENT_SECRET"\n }\'\n\n# Then read, with offset pagination.\ncurl -s \'https://open-api.guesty.com/v1/reservations?limit=100&skip=0\' \\\n -H \'Authorization: Bearer <token>\'\n\n# Then write the mapping, the token cache, the airbnb2 special case,\n# and the calendar\'s separate base path. The
2n do it again for the\n# next system your next client uses.',oursLabel:"Through Repull",ours:"curl -s 'https://api.repull.dev/v1/reservations?limit=100' \\\n -H 'Authorization: Bearer sk_live_YOUR_KEY'\n\n# Guesty, Airbnb, Booking.com, Hostaway, Lodgify, OwnerRez, Smoobu,\n# Beds24, iGMS and BookingSync come back from this one call.\n# `platform` says where each reservation came from."},secondClient:{heading:"Why use Repull for Guesty",subheading:"Your second client will not be on Guesty",lead:"If you have one client, they are on Guesty, and they always will be, use the Open API directly â we would be a layer you do not need. Almost nobody stays in that position, and the second client is where the cost lands.",points:[{title:"Every system authenticates differently",detail:"Guesty is OAuth2 client credentials with a five-token-a-day cap. Hospitable is a personal access token. Lodgify is an API key. Smoobu signs every request with an API key and secret (HMAC), and retires its old single keys on October 31, 2026. OwnerRez is basic auth or OAuth2. Beds24 is a refresh-token exchange. Hostaway is client credentials, and signs its webhooks with optional basic auth rather than an HMAC. Seven models across nine systems, each one a credential to store, refresh, rotate and explain to somebodyâs security team."},{title:"Every system has its own trap, and you meet them one at a time",detail:"The five-token cap is Guestyâs. Lodgifyâs messaging API is read-only, so you cannot reply through it at all. OwnerRez has no guest messaging API. None of these are in the documentation â you find them in production, usually on a Frid
2ay. We have already found them, which is most of what you are buying."},{title:"Some clients have no PMS at all",detail:"The next one may run on an Airbnb account and a spreadsheet. No amount of Guesty integration reaches them, and direct channel access cannot be bought â Airbnb approves software companies one product category at a time through a commercial and compliance review, and Booking.com designates connectivity partners. Neither is a signup form and neither is measured in days. Repull already holds that access, so one key covers a Guesty account and a direct Airbnb or Booking.com connection at once."},{title:"A PMS is not a route to a channelâs own features",detail:"Guesty passes through most of what you need from Airbnb â reservations, calendar, prices, messaging, review replies, booking requests and pre-approvals, listing content and photos. What it cannot pass through is anything that exists only in Airbnbâs protocol: the reservation alteration flow, special offers, reviewing a guest, permits and safety disclosures, the per-listing sync category that decides whether a write is accepted at all. Those are 36 Airbnb-specific endpoints on Repull, alongside the same unified read."}]},faq:[{q:"Does Guesty have a public API?",a:"Yes. The Guesty Open API is a REST API at https://open-api.guesty.com/v1 covering listings, reservations, calendar, guests, messaging and webhooks. Any account holder with permission to manage integrations can create credentials from Settings â Integrations â Open API â there is no partner application to submit."},{q:"How do I get Guesty API credentials?",a:"In Guesty, go to Settings â Integrations â Open API and create an application. You are issued a Client ID and Client Secret; the secret is shown once. Exchange them at https://open-api.guesty.com/oauth2/token with grant_type=client_credentials and scope=open-api for a bearer token."},{q:"Why is my Guesty token request failing?",a:"Most often because you have used your five tokens for the day. Guesty caps token issuance at five per API key per 24 hours. If you request a token per API call rather than caching one, you exhaust the allowance almost immediately and every request after that fails until the window rolls. Cache the token across processes and refresh only near expiry."},{q:"What are the Guesty API rate limits?",a:"The limit developers hit first is not on requests but on tokens: five per API key per 24 hours. Request limits apply on top and vary by endpoint and plan. In practice, treat a token as a shared resource rather than something you fetch per call."},{q:"Why do my Airbnb reservations not match on source?",a:'Guesty labels Airbnb reservations source: "airbnb2", not "airbnb". Booking.com is "bookingcom". Code that branches on the obvious string sends every Airbnb booking down the fallback path without raising an error.'},{q:"How long does a Guesty integration take to build?",a:'Reading your first reservation is an afternoon. A production integration is longer: a shared token cache that respects the five-a-day cap, offset pagination that does not skip records mid-sync, the calendar on its separate base path, channel source values like "airbnb2", and webhook handling. Budget days rather than hours, then ongoing maintenance as payloads change.'},{q:"Can I use Guesty and Repull together?",a:"Yes. Repull connects to the same Open API you would call yourself, so nothing changes inside Guesty. You can read through Repullâs unified schema and still call Guesty directly for anything Guesty-specific."}]}},{id:"ownerrez",name:"OwnerRez",authType:"API Token",authFields:["apiToken"],description:"Popular with independent hosts. Simple API token authentication.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!0,guests:!1},fieldCoverage:[{resource:"Reservation",fields:[{name:"confirmationCode",supported:"full"},{name:"checkIn/checkOut",supported:"full"},{name:"totalPrice",supported:"full"}
2,{name:"priceBreakdown",supported:"full"},{name:"guestDetails",supported:"full"},{name:"platform/source",supported:"full"}]}],notes:["HTTP Basic Auth or OAuth2 Bearer token","Good calendar sync support"],connectionGuide:"Go to OwnerRez â Settings â API Keys â Generate new token."},{id:"smoobu",name:"Smoobu",authType:"API Key + Secret (HMAC)",authFields:["apiKey","apiSecret"],description:"European-focused PMS with channel management. Requests are signed with an API key and secret (HMAC).",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!0,guests:!1},fieldCoverage:[],notes:["Legacy single API keys stop working Oct 31, 2026","Good channel manager integration"],connectionGuide:"Smoobu â Settings â Advanced â API Keys â Create API Key, then Generate Secret (shown once); paste both."},{id:"beds24",name:"Beds24",authType:"API Key + Property Key",authFields:["apiKey","propKey"],description:"Feature-rich PMS with extensive automation. Requires property-level key.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!0,guests:!1},fieldCoverage:[],notes:["Requires both account API key and property key","Rich automation/rule engine"],connectionGuide:"Go to Beds24 â Settings â Account Access â API Key. Also get Property Key from each property settings."},{id:"igms",name:"iGMS",authType:"API Key",authFields:["apiKey"],description:"Multi-platform management tool with automated messaging.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!1,guests:!1},fieldCoverage:[],notes:["No native webhook support â uses polling","Good for hosts running several OTA channels"],connectionGuide:"Go to iGMS â Settings â API â Generate API key."},{id:"hospitable",name:"Hospitable",authType:"API Key",authFields:["apiKey"],description:"Focused on automated guest communication. Clean API.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!0,guests:!1},fieldCoverage:[],notes:["Strong messaging automation","Good Airbnb/Booking integration"],connectionGuide:"Go to Hospitable â Settings â API â Create API key."},{id:"lodgify",name:"Lodgify",authType:"API Key",authFields:["apiKey"],description:"Website builder + PMS. Good for direct booking hosts.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!0,guests:!1},fieldCoverage:[],notes:["HMAC webhook signatures","Built-in website/booking engine","OAuth2 also supported"],connectionGuide:"Go to Lodgify â Settings â Developer â API Key."},{id:"bookingsync",name:"BookingSync",authType:"OAuth2",authFields:["clientId","clientSecret"],description:"European vacation rental PMS with marketplace. OAuth2 flow.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!0,guests:!1},fieldCoverage:[],notes:["Full OAuth2 with refresh tokens","HMAC webhook signatures","Strong calendar sync"],connectionGuide:"Go to BookingSync â Applications â Create new app. Get Client ID and Secret, then authorize."},{id:"cloudbeds",name:"Cloudbeds",authType:"API key",authFields:["apiKey"],description:"Hotel and hostel PMS with a REST API. Repull maps each room type to a listing and its rooms to units, and writes prices, restrictions and reservations back.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!1,webhooks:!0,guests:!0},fieldCoverage:[{resource:"Listing (room type)",fields:[{name:"name / description",supported:"full"},{name:"capacity",supported:"full"},{name:"units (rooms)",supported:"full"},{name:"address",supported:"full"},{name:"check-in/out times",supported:"full"}
2,{name:"photos",supported:"full"}]},{resource:"Reservation",fields:[{name:"dates",supported:"full"},{name:"assigned room",supported:"full"},{name:"status",supported:"full"},{name:"guest",supported:"full"},{name:"totals (grand, accommodation, extras, taxes)",supported:"full"},{name:"channel",supported:"full"}]},{resource:"Calendar",fields:[{name:"rooms left per night",supported:"full"},{name:"price",supported:"full"},{name:"min/max stay",supported:"full"},{name:"closed to arrival/departure",supported:"full"}]}],notes:["A listing is a room type; its rooms are units","A booking with several rooms becomes one reservation per room","Writes prices, restrictions and reservations back to Cloudbeds","Guest messaging is not available through the Cloudbeds API","Additional items and taxes come as totals per booking, not itemized"],connectionGuide:"In Cloudbeds, open Apps & Marketplace â API Credentials, create credentials, then create an API key and approve its scopes. Paste the key (it starts with cbat_) into Repull Connect.",deep:{published:"2026-09-27",reviewed:"2026-09-27",quotable:"Cloudbeds exposes a REST API (v1.3 at api.cloudbeds.com) covering properties, room types, rooms, rates, reservations, guests and webhooks, authenticated with a property or organization API key sent as x-api-key.",whatItIs:["Cloudbeds is a PMS for hotels, hostels and vacation rentals, with a REST API at `https://api.cloudbeds.com/api/v1.3`. It covers the property, room types, rooms, rate plans, availability, reservations, guests and webhooks.","Like Mews, it is built on the hotel model: a room type has rooms under it, and a reservation can hold several rooms, each of a different type. Repull maps a room type to a listing and each room to a unit, and splits a multi-room booking into one reservation per room.","A property can create its own API key without a partner agreement, which makes Cloudbeds quick to connect for a single property.","Through Repull: `GET /v1/listings/{id}/units` lists a room typeâs rooms, every reservation carries `unit`, and availability reports `availableUnits` per night. Calendar edits and bookings (`POST /v1/reservations`, `PATCH /v1/reservations/{id}`, `POST /v1/reservations/{id}/cancel`) are made in Cloudbeds first."],access:{steps:["In Cloudbeds, open Apps & Marketplace â API Credentials and create credentials (name, category, and a redirect URI; `https://localhost` is fine for an API key).","In the new row, choose API Key â Create, select the scopes you need, and approve them. Cloudbeds may ask the user to verify with a one-time code.","Copy the key when it is shown; it is not shown again. It starts with `cbat_`.","Send it to `POST /v1/connect/cloudbeds/credentials` (or paste it into Repull Connect)."],note:"A key that is not used for 30 days expires. A connected propertyâs regular sync keeps it alive."},gotchas:[{title:"Errors can arrive as 200",detail:'Cloudbeds often answers a refused request with HTTP 200 and `{ "success": false, "message": ... }`. Code that trusts the status code records a failure as a success.'},{title:"Rate updates are jobs, not writes",detail:"`patchRate` and `putRate` queue a job and return a job reference; the change is applied afterwards and can still fail. One request takes at most 30 intervals, and derived rate plans cannot be written at all."},{title:"Writes are form-encoded with nesting",detail:"Reads are GET with query parameters; writes are `application/x-www-form-urlencoded` with bracketed nesting such as `rooms[0][roomTypeID]`. A JSON body is not what the write endpoints expect."},{title:"A booking can hold several rooms",detail:"One reservation id can cover rooms of different types, each with its own dates and guest counts. The total is per booking, not per room."},{title:"No room-count adjustment and no messaging",detail:"Availability can be opened or closed per night, but there is no API to hold back a number of rooms, and there is no guest-messaging API."}],maintenance:{lead:"Connecting one property is quick. The work is in the rate jobs and the multi-room bookings.",items:["Every rate write needs a follow-up to confirm the job ran.","Multi-room bookings have to be split and their money apportioned consistently.","Unused keys expire after 30 days, so an idle connection silently stops working.","Organization keys cover several properties, and each property has its own webhooks to manage."]},example:{theirsLabel:"Cloudbeds directly",theirs:"curl -s 'https://api.cloudbeds.com/api/v1.3/getReservationsWithRateDetails?pageSize=100' \\\n -H 'x-api-key: cbat_...'\n\n# Then split multi-room bookings, check success:false on every 200,\n# and poll getRateJobs after every price change.",oursLabel:"Through Repull",ours:"curl -s 'https://api.repull.dev/v1/reservations?limit=100' \\\n -H 'Authorization: Bearer sk_live_YOUR_KEY'\n\n# One reservation per room, each naming its room type and room."},secondClient:{heading:"Why use Repull for Cloudbeds",subheading:"Your next property may not be on Cloudbeds",lead:"For a single Cloudbeds property, use its API key and API directly â we would be a layer you do not need. The cost arrives with the second system.",points:[{title:"One hotel model",detail:"Room types, rooms, room counts and assigned rooms come back the same way for Cloudbeds and Mews."}
2,{title:"Channels next to the PMS",detail:"The same Repull key reaches Airbnb and Booking.com directly, alongside the PMS."}]},faq:[{q:"Does Cloudbeds have a public API?",a:"Yes. The Cloudbeds API (v1.3) is documented at developers.cloudbeds.com and published as OpenAPI specs. It covers properties, room types, rooms, rates, reservations, guests and webhooks."},{q:"How do I get a Cloudbeds API key?",a:"In Cloudbeds, go to Apps & Marketplace â API Credentials, create credentials, then choose API Key â Create, select scopes and approve them. The key starts with cbat_ and is shown once."},{q:"Why did my Cloudbeds API key stop working?",a:"Keys that are not used for 30 days expire. Create a new key and reconnect."},{q:"Can I message guests through the Cloudbeds API?",a:"No. The Cloudbeds API has no guest-messaging endpoints."},{q:"How are multi-room bookings handled?",a:"Repull returns one reservation per room, each with its own room type, room and share of the bookingâs money."}]}},{id:"hostfully",name:"Hostfully",comingSoon:!0,authType:"",authFields:[],description:"Hostfully is a property management platform for vacation rental managers, with a REST API covering properties, leads (reservations), guests and webhooks.",supported:n,fieldCoverage:[],notes:[],connectionGuide:""},{id:"mews",name:"Mews",authType:"Access token",authFields:["accessToken"],description:"Hotel PMS with a JSON Connector API. Repull maps each room type to a listing and its rooms to units, and writes prices, restrictions, availability and reservations back.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!1,webhooks:!0,guests:!0},fieldCoverage:[{resource:"Listing (room type)",fields:[{name:"name / description",supported:"full"},{name:"capacity",supported:"full"},{name:"units (rooms)",supported:"full"},{name:"address",supported:"full"},{name:"check-in/out times",supported:"full"}
2,{name:"photos",supported:"full"}]},{resource:"Reservation",fields:[{name:"dates (property-local)",supported:"full"},{name:"assigned room",supported:"full"},{name:"status",supported:"full"},{name:"guest",supported:"full"},{name:"money breakdown",supported:"full"},{name:"payments",supported:"full"},{name:"channel",supported:"full"}]},{resource:"Calendar",fields:[{name:"rooms left per night",supported:"full"},{name:"price",supported:"full"},{name:"min/max stay",supported:"full"},{name:"closed to arrival/departure",supported:"full"}]}],notes:["A listing is a room type; its rooms are units","Writes prices, restrictions, availability and reservations back to Mews","Webhooks are enabled per integration by Mews","Guest messaging is not available through the Mews API"],connectionGuide:'The property enables Repull in the Mews Marketplace and shares the access token Mews shows. To try it first, connect Mewsâs public demo property with its published demo token and environment "demo".',deep:{published:"2026-09-27",reviewed:"2026-09-27",quotable:"Mews exposes the Connector API, a JSON-over-POST API where a listing is a room type (resource category) whose physical rooms (resources) are assigned to each reservation, authenticated with a ClientToken identifying the integration plus a property AccessToken.",whatItIs:["Mews is a hotel PMS, and its Connector API is built for hotels. Every operation is a POST to `https://api.mews.com/api/connector/v1/<operation>` with three credentials in the JSON body: a ClientToken that identifies the integration, an AccessToken that identifies the property, and a Client name.","The model is the hotel model. A property sells room types (Mews calls them resource categories); each has several physical rooms (resources); prices, restrictions and availability are set per room type, and a specific room is assigned to a stay later. Repull maps a room type to a listing and its rooms to units, so a vacation-rental operator whose room types each hold one home sees exactly one listing per home.","The API is deep: reservations, rates, restrictions, availability, customers, bills and payments are all readable and most are writable. What it is not is a guest-messaging API, and the demo environment is shared by every developer building on Mews.","Through Repull: `GET /v1/listings/{id}/units` lists a room typeâs rooms, every reservation carries `unit` (the room it was assigned), and availability reports `availableUnits` per night. Calendar edits (`PUT /v1/availability/{propertyId}`) and bookings (`POST /v1/reservations`, `PATCH /v1/reservations/{id}`, `POST /v1/reservations/{id}/cancel`) are made in Mews first and read back."],access:{steps:["To build or test, use the Mews demo environment at `https://api.mews-demo.com`. Mews publishes a demo ClientToken and two demo AccessTokens (a gross-pricing UK property and a net-pricing US property) in its documentation.","For a real property, an integration must be certified by Mews before it receives a production ClientToken. Mews does not partner before certification.","The property then enables the integration in the Mews Marketplace, which issues an AccessToken for that property (or a portfolio token covering several).","Through Repull, send that token to `POST /v1/connect/mews/credentials`; Repull reads the property it belongs to and starts the first sync."],note:"The ClientToken belongs to the integration, not the property. A property never sees it and never has to create an account with you to connect."},gotchas:[{title:"A day starts at local midnight, in UTC",detail:'Mews stores instants in UTC but a "day" begins at midnight in the propertyâs own time zone. For a Budapest hotel in summer, the night of 7 October begins at `2026-10-06T22:00:00Z`. Ask for availability or prices from `00:00:00Z` and Mews refuses with "FirstTimeUnitStartUtc is not start of TimeUnit". Reading a stayâs date straight off its UTC timestamp shifts it a day for any property east or west of UTC. Every date has to go through the propertyâs time zone, and check-in/check-out come from the serviceâs own offsets (15:00 is `PT15H`; some are negative, meaning the evening before).'},{title:"The reservation has no money on it",detail:"A reservation record carries ids, dates and a state â no price, no guest name. The money is on order items (one per night, plus products such as breakfast or cleaning, plus city tax lines), each with a net and a gross value; the guest is a separate customer record. A new reservationâs order items are posted a few seconds after it is created, so a read straight after `reservations/add` shows a free stay."}
2,{title:"Gross or net depends on the property",detail:'Some properties price gross (tax included), others net (tax added). The same room can read 100 on one and 100 plus tax on the other, and a custom price must carry the tax codes Mews taxes it under or it is refused with "Invalid TaxCodes".'},{title:"Most services are not stays",detail:"A property has many services and most sell add-ons: parking, breakfast, a point of sale. Only an active, bookable, nightly service sells stays. Taking the first service in the list picks an add-on on Mewsâs own demo property."},{title:"Some writes are applied a moment later",detail:'Availability changes and a new bookingâs charges appear seconds after the call returns. A write that follows another too closely can be refused with "Someone else just changed this bill" â a conflict that succeeds on retry, not a real refusal.'},{title:"Webhooks carry ids only, and Mews registers them",detail:"Mews sends several events per delivery, each with just an entity id, so every event means a fresh read. The endpoint is registered by Mews for the whole integration, not per property, and Mews does not sign the request."},{title:"The demo token is shared",detail:'Every developer testing on Mews uses the same demo AccessToken, and its limit of 200 requests per 30 seconds is shared too. A client that only counts its own requests still gets "Too many requests" â it has to back off on the response, not on its own arithmetic.'}],maintenance:{lead:"Reading a room type is quick. Keeping a hotel integration correct is mostly about time zones and money.",items:["Every date conversion is a place a stay can land a day early. Daylight-saving changes make it worse twice a year.","The money model differs by property (gross versus net) and changes as the property adds products or taxes.","Deprecated request options are removed on Mewsâs schedule, and certification checks that you do not use them.","Certification is a review of every request you make; changing what you call means reviewing it again."]},example:{theirsLabel:"Mews directly",theirs:'# Find the stay service, then its room types, then their rooms.\nMEWS=\'https://api.mews.com/api/connector/v1\'\ncurl -s -X POST "$MEWS/services/getAll" \\\n -H \'Content-Type: application/json\' \\\n -d \'{"ClientToken":"...","AccessToken":"...","Client":"You 1.0","Limitation":{"Count":1000}}\'\n\n# Then reservations (no money on them), then order items for the money,\n# then customers for the guest, in the property\'s time zone.',oursLabel:"Through Repull",ours:"curl -s 'https://api.repull.dev/v1/reservations?limit=100' \\\n -H 'Authorization: Bearer sk_live_YOUR_KEY'\n\n# Dates are the property's own, money is broken down,\n# and each stay names the room it was assigned."},secondClient:{heading:"Why use Repull for Mews",subheading:"Your next hotel may not be on Mews",lead:"If every property you serve runs Mews, the Connector API is a good API and you can build on it directly. The cost arrives with the first property on something else.",points:[{title:"The hotel model, once",detail:"Room types with rooms under them, counts instead of yes/no availability, rooms assigned after booking. Repull models it the same way for Mews and Cloudbeds, and keeps the one-home-one-listing shape vacation-rental systems use."},{title:"Certification is per integration",detail:"Mews certifies an integration before it can reach a real property. Building your own means going through it yourself."},{title:"Channels next to the PMS",detail:"The same Repull key reaches Airbnb and Booking.com directly, alongside the PMS."}]},faq:[{q:"Does Mews have a public API?",a:"Yes. The Mews Connector API is documented at docs.mews.com. Every call is a POST with a ClientToken (the integration), an AccessToken (the property) and a Client name in the JSON body. A demo environment with published tokens is available for building and testing."},{q:"How do I get a Mews access token?",a:"The property enables your integration in the Mews Marketplace, which issues the AccessToken. Your own ClientToken is issued by Mews after your integration is certified; before that, build against the demo environment."},{q:"Why does Mews say my time is not the start of a time unit?",a:"A Mews day starts at local midnight in the propertyâs time zone, expressed in UTC. For a property at UTC+2, the day starts at 22:00Z the previous day. Convert each date through the propertyâs time zone before sending it."},{q:"Where is the price of a Mews reservation?",a:"On its order items, not on the reservation. Read `orderItems/getAll` for the reservationâs id: one item per night plus products and city tax, each with net and gross values."},{q:"Can I message guests through the Mews API?",a:"No. Mewsâs messaging API returns only message threads your integration created itself, not the propertyâs guest conversations."},{q:"Can I try it without a Mews customer?",a:'Yes. Connect Mewsâs demo property through Repull with its published demo access token and environment "demo".'}]}}
2,{id:"track",name:"Track",authType:"API key + secret (HMAC)",authFields:["domain","apiKey","apiSecret","keyType","authMode"],description:"TRACK Hospitality Software, a PMS for vacation rental managers. Repull reads units, reservations, guests, conversations and the calendar, and writes bookings, prices and restrictions back. Track has no webhooks, so Repull polls it about every minute.",supported:{listings:!0,reservations:!0,calendar:!0,messages:!0,webhooks:!1,guests:!0},fieldCoverage:[{resource:"Listing (unit)",fields:[{name:"name / headline / descriptions",supported:"full"},{name:"address",supported:"full"},{name:"occupancy, bedrooms, bathrooms",supported:"full"},{name:"photos",supported:"full"},{name:"amenities",supported:"full"},{name:"check-in/out times",supported:"full"}]},{resource:"Reservation",fields:[{name:"dates",supported:"full"},{name:"status",supported:"full"},{name:"guest",supported:"full"},{name:"channel",supported:"full"},{name:"rent, fees and per-tax breakdown",supported:"full"},{name:"amount paid and balance",supported:"full"}]},{resource:"Calendar",fields:[{name:"availability per night",supported:"full"},{name:"min/max stay",supported:"full"},{name:"closed to arrival/departure",supported:"full"}]}],notes:["Each Track unit is a listing","No webhooks: Repull polls Track about every minute, for reservations and for guest messages","Outbound guest messages are sent through Track; a message the guest sent elsewhere cannot be written into Track","A Server Key has full access; a Channel Key can only quote, create, confirm and cancel bookings","Hold or Confirmed is decided by the propertyâs policies in Track","Bookings locked to a channel (Airbnb, Vrbo, Booking.com) cannot be changed or cancelled through the API","No refund API"],connectionGuide:"In Track, go to Configuration â Company Setup â API Keys and create a Server Key (full access, recommended). Paste your Track domain, the API key and the API secret into Repull Connect. A Channel Key, under Configuration â PMS Setup â Distribution Channels, only allows booking.",deep:{published:"2026-10-03",reviewed:"2026-10-03",quotable:"Track (TRACK Hospitality Software) exposes a REST API at https://{your-domain}.trackhs.com/api covering units, reservations, quotes, contacts, folios, messages and unit blocks, authenticated with an API key and secret signed with HMAC; it has no webhooks.",whatItIs:["Track (TRACK Hospitality Software) is a PMS for vacation rental managers. Each company has its own Track domain, such as `acme.trackhs.com`, and its API lives at `https://acme.trackhs.com/api`. It covers units and the property (node) hierarchy they sit in, reservations, quotes, contacts, folios and payments, guest messages, unit blocks and nightly pricing.","Requests are signed with an API key and secret, using HMAC by default (Basic authentication is also accepted). There are two kinds of key: a Server Key reaches the whole API, while a Channel Key reaches only what a booking channel needs.","Track has no webhooks. Repull polls it about every minute for changed reservations, and guest conversations and messages are polled every minute too, so a change made in Track reaches you within a minute or two rather than instantly. Messages you send through Repull go out to the guest from Track.","Through Repull: each Track unit is a listing, reservations carry Trackâs status and the full money breakdown (rent, fees, per-tax lines, amount paid and balance), and bookings are created, changed, quoted and cancelled with `POST /v1/reservations/quote`, `POST /v1/reservations`, `PATCH /v1/reservations/{id}` and `POST /v1/reservations/{id}/cancel`, made in Track first."],access:{steps:["In Track, go to Configuration â Company Setup â API Keys and create a Server Key. It has full read and write access, and is the one we recommend.","Copy the API key and the API secret. Note your Track domain, the address you sign in at (for example `acme.trackhs.com`).","Send the domain, key and secret to `POST /v1/connect/track/credentials`, or paste them into Repull Connect. `keyType` defaults to `server` and `authMode` to `hmac`; leave `authMode` alone unless Track support tells you otherwise.","Repull checks the key against Track before saving anything, then starts the first import of units and reservations."],note:'A Channel Key, created under Configuration â PMS Setup â Distribution Channels, can only quote, create, confirm and cancel bookings. Send `keyType: "channel"` with it. Changing bookings, guest messages, payments and calendar changes need a Server Key. Optional settings in `credentials`: `moveReasonId` (the Track move reason used when a booking moves to another unit â without it, a unit change is refused), `paymentTypeId` (the Track payment type that payments taken elsewhere are recorded under), and, only if Track support asks, `hmacRealm` (default `Acquia`) and `secretIsBase64` (default `true`).'},gotchas:[{title:"Moving a booking to another unit needs a move reason",detail
2:"Track requires a move reason when a booking changes unit. Set `moveReasonId` on the connection to the id of a move reason in Track; without it, a unit change is refused. Date and guest changes do not need it."},{title:"No webhooks",detail:"Track does not push changes. Everything is found by polling: reservations by their last update time, guest messages by their last event. Repull polls about every minute; built directly, you own that loop and its rate budget (10,000 requests per 5 minutes per IP)."},{title:"Hold or Confirmed is Trackâs decision",detail:"A new booking becomes a Hold or a Confirmed reservation depending on the propertyâs channel settings and guarantee policy. Without a payment it is usually a Hold, which Track can let expire. Repull asks Track to confirm it when you ask for a confirmed booking; if Track refuses, the booking stays a Hold and the response says so."},{title:"Custom prices need a setting on Channel Keys",detail:'Booking at your own price rather than Trackâs quote needs "Allow Custom Pricing" turned on for the distribution channel when you use a Channel Key. Without it, Track refuses the booking and Repull tells you how to turn it on.'},{title:"Channel bookings are locked",detail:"Bookings that came from Airbnb, Vrbo or Booking.com are locked to that channel in Track. They cannot be changed or cancelled through the API: Trackâs own unlock would break the channelâs sync, so Repull never does it. Change them on the channel."},{title:"No refunds and no inbound messages",detail:"Track has no refund API, so refunds are made in Track. You can send guest messages, but there is no way to record a message the guest sent elsewhere into Trackâs thread."}],maintenance:{lead:"The API is broad, but every customer is on their own domain, and nothing tells you when data changes.",items:["A polling loop per customer, with a cursor for reservations past Trackâs 10,000-result paging limit.","HMAC request signing per customer, with the key type deciding which calls are allowed at all.","Holds that expire, and bookings that come back a Hold when you asked for Confirmed.","Channel-locked bookings, which must be left alone."]},example:{theirsLabel:"Track directly",theirs:'# Every request is HMAC-signed with your key and secret\ncurl -s \'https://acme.trackhs.com/api/v2/pms/reservations?updatedSince=2026-10-01T00:00:00Z\' \\\n -H \'Authorization: acquia-http-hmac id="...",nonce="...",realm="Acquia",signature="...",version="2.0"\' \\\n -H \'X-Authorization-Timestamp: ...\'\n\n# Then poll again every minute, and page past the 10,000-result limit.',oursLabel:"Through Repull",ours:"curl -s 'https://api.repull.dev/v1/reservations?limit=100' \\\n -H 'Authorization: Bearer sk_live_YOUR_KEY'\n\n# Track bookings, kept current by Repull's polling, in the same shape as every other PMS."},secondClient:{heading:"Why use Repull for Track",subheading:"Your next customer may not be on Track",lead:"If you only ever need one Track customer, use its API directly â you would be adding a layer you do not need. The cost arrives with the second customer and the second system.",points:[{title:"Polling handled",detail:"Track has no webhooks. Repull runs the polling for you, so Track bookings and messages stay current without a loop of your own."},{title:"One booking API",detail:"Quote, create, change and cancel through the same endpoints as the other PMSes, with what Track cannot do refused in plain words rather than failing silently."},{title:"Channels next to the PMS",detail:"The same Repull key reaches Airbnb, Booking.com and Vrbo directly, alongside Track."}]},faq:[{q:"Does Track have a public API?",a:"Yes. TRACK Hospitality Software documents its API at developer.trackhs.com. It covers units, reservations, quotes, contacts, folios, guest messages and unit blocks, on your own Track domain."},{q:"Which Track key should I use, a Server Key or a Channel Key?",a:"A Server Key, created under Configuration â Company Setup â API Keys. It has full access. A Channel Key, under Configuration â PMS Setup â Distribution Channels, can only quote, create, confirm and cancel bookings."},{q:"Does Track have webhooks?",a:"No. Repull polls Track about every minute, so a change made in Track shows up through Repull within a minute or two."},{q:"Can I message guests in Track through Repull?",a:"Yes, with a Server Key. Guest conversations are polled every minute, and messages you send through Repull are sent to the guest from Track. A message the guest sent somewhere else cannot be written into Trackâs conversation."},{q:"Why did my new booking come back as a Hold?",a:"Track decides between Hold and Confirmed from the propertyâs channel settings and guarantee policy; with no payment it is usually a Hold. Repull asks Track to confirm it when you ask for a confirmed booking, and tells you when Track refuses."},{q:"Can I change an Airbnb or Vrbo booking in Track through Repull?",a:"No. Track locks bookings from Airbnb, Vrbo and Booking.com to their channel, and unlocking them would break the channelâs sync. Change them on the channel."},{q:"Has this been tested against a live Track account?",a:"Repullâs Track connector is built and verified against Trackâs API documentation. Tell us at [email protected] if anything you see in Track differs."}]}},{id:"tokeet",name:"Tokeet",comingSoon:!0,authType:"",authFields:[],description:"Tokeet is a vacation rental PMS and channel manager for small and mid-size hosts, with a client REST API for rentals and bookings.",supported:n,fieldCoverage:[],notes:[],connectionGuide:""},{id:"streamline",name:"Streamline",comingSoon:!0,authType:"",authFields:[],description:"Streamline is enterprise vacation rental softw
2are used by large US property managers. Its API is available to approved partners.",supported:n,fieldCoverage:[],notes:[],connectionGuide:""},{id:"zeevou",name:"Zeevou",comingSoon:!0,authType:"",authFields:[],description:"Zeevou is a PMS and channel manager for serviced accommodation and vacation rentals, with a REST API described by a published OpenAPI spec.",supported:n,fieldCoverage:[],notes:[],connectionGuide:""},{id:"uplisting",name:"Uplisting",comingSoon:!0,authType:"",authFields:[],description:"Uplisting is a vacation rental PMS and channel manager with a webhook-driven API. Uplisting grants API access on request.",supported:n,fieldCoverage:[],notes:[],connectionGuide:""},{id:"apaleo",name:"Apaleo",comingSoon:!0,authType:"",authFields:[],description:"Apaleo is an API-first hotel PMS with a REST API and OAuth 2.0 authorization.",supported:n,fieldCoverage:[],notes:[],connectionGuide:""},{id:"escapia",name:"Escapia",comingSoon:!0,authType:"",authFields:[],description:"Escapia is a vacation rental PMS owned by Expedia Group, with a partner-only GraphQL API.",supported:n,fieldCoverage:[],notes:[],connectionGuide:""},{id:"amenitiz",name:"Amenitiz",comingSoon:!0,authType:"",authFields:[],description:"Amenitiz is an all-in-one platform for small hotels and vacation rentals, combining a PMS, a channel manager and a booking website.",supported:n,fieldCoverage:[],notes:[],connectionGuide:""}];[...o.filter(e=>!e.comingSoon),...o.filter(e=>e.comingSoon)].map(e=>({id:e.id,name:e.name,comingSoon:!!e.comingSoon,values:[e.supported.listings,e.supported.reservations,e.supported.calendar,e.supported.messages,e.supported.webhooks,e.supported.guests]})),o.filter(e=>!e.comingSoon),o.filter(e=>e.comingSoon);var r=e.i(580904);let i=new Set(["hostaway","guesty","hospitable","lodgify","ownerrez","smoobu","beds24","igms","bookingsync"]),l=o.filter(e=>i.has(e.id)),c=[{key:"product",links:[{h:"/docs/introduction",k:"documentation"},{h:"/pricing",k:"pricing"},{h:"/repull-studio",k:"studio"},{h:"/changelog",k:"changelog"},{h:"/blog",k:"blog"}]},{key:"solutions",links:[{h:"/docs/alongside-your-pms",k:"alongside"},{h:"/use-cases/guest-inbox",k:"guestInbox"},{h:"/use-cases/ai-assistant",k:"aiAssistant"},{h:"/use-cases/reviews",k:"reviews"},{h:"/use-cases/upsells",k:"upsells"},{h:"/use-cases/operations",k:"operations"},{h:"/use-cases",k:"useCases"}]},{key:"developers",links:[{h:"/docs/quickstart",k:"quickstart"},{h:"/docs/api/introduction",k:"apiReference"},{h:"/docs/webhooks/event-types",k:"webhooks"},{h:"/docs/sdks",k:"sdks"},{h:"/docs/mcp-server",k:"mcpServer"},{h:"/docs/cli",k:"cli"}]},{key:"channels",links:[{h:"/airbnb-api",k:"airbnbApi"},{h:"/booking-com-api",k:"bookingApi"},{h:"/vrbo-api",k:"vrboApi"},{h:"/docs/pms-coverage",k:"pmsCoverage"}]},{key:"resources",links:[{h:"/for-platforms",k:"forPlatforms"},{h:"/migrate",k:"migrate"},{h:"/network",k:"network"},{h:"/open-source",k:"openSource"},{h:"/claude-code",k:"claudeCode"},{h:"/cursor",k:"cursor"}]}];e.s(["SiteFooter",0,function(){let e=(0,a.useTranslations)("siteFooter");return(0,t.jsxs)("footer",{className:"border-t border-zinc-200 dark:border-zinc-900 px-6 py-16",children:[(0,t.jsxs)("div",{className:"max-w-6xl mx-auto grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-10",children:[(0,t.jsxs)("div",{className:"col-span-2 md:col-span-3 lg:col-span-1",children:[(0,t.jsx)("p",{className:"font-bold text-sm mb-3",children:"Repull"}),(0,t.jsx)("p",{className:"text-xs text-zinc-500 leading-relaxed",children:e("tagline")})]}),c.map(a=>(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-xs font-bold text-zinc-400 uppercase tracking-widest mb-4",children:e(`columns.${a.key}.title`)}),(0,t.jsx)("div",{className:"space-y-2",children:a.links.map(n=>(0,t.jsx)(s.default,{href:n.h,className:"block text-sm text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition",children:e(`columns.${a.key}.links.${n.k}`)},n.h))})]},a.key))]}),(0,t.jsxs)("div",{className:"max-w-6xl mx-auto mt-12 pt-8 border-t border-zinc-200 dark:border-zinc-900",children:[(0,t.jsx)("p",{className:"text-xs font-bold text-zinc-400 uppercase tracking-widest mb-4",children:e("systems.title")}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-x-5 gap-y-2.5",children:[l.map(e=>(0,t.jsxs)(s.default,{href:`/docs/pms/${e.id}`,className:"text-sm text-zinc-500 hover:text-zinc-900 dark:hover:text-white transition",children:[e.name," API"]},e.id)),(0,t.jsx)(s.default,{href:"/docs/pms-coverage",className:"text-sm text-zinc-400 hover:text-zinc-900 dark:hover:text-white transition",children:e("systems.all")})]})]}),(0,t.jsxs)("div",{className:"max-w-6xl mx-auto mt-12 pt-8 border-t border-zinc-200 dark:border-zinc-900 flex flex-wrap items-center justify-between gap-4",children:[(0,t.jsx)(r.StatusBadge,{variant:"inline"}),(0,t.jsx)("div",{className:"flex items-center gap-4 text-xs text-zinc-500",children:(0,t.jsx)(s.default,{href:"/studio/transparency",className:"hover:text-zinc-900 dark:hover:text-white transition",children:"Transparency"})})]}),(0,t.jsxs)("div",{className:"max-w-6xl mx-auto mt-6 text-xs text-zinc-400 flex justify-between",children:[(0,t.jsx)("span",{children:"Repull · repull.dev"}),(0,t.jsx)("span",{children:e("copyrightTagline")})]})]})}],683119)}]); 3 4//# debugId=2969f899-be89-1e60-6d0e-97cb529958de
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.