[{"data":1,"prerenderedAt":2860},["ShallowReactive",2],{"blog-little-hotelier-mcp-claude-code-cursor-vscode-en-gb":3,"blog-langs-little-hotelier-mcp-claude-code-cursor-vscode":2404,"blog-list-en-gb":2413},{"id":4,"title":5,"body":6,"description":2362,"extension":2363,"meta":2364,"navigation":1040,"path":2400,"seo":2401,"stem":2402,"__hash__":2403},"content/blog/en-gb/little-hotelier-mcp-claude-code-cursor-vscode.md","How to use your Little Hotelier data in Claude Code, Cursor and VS Code (MCP setup)",{"type":7,"value":8,"toc":2344},"minimark",[9,22,25,30,45,87,93,96,106,140,157,160,164,167,172,181,217,235,268,274,369,384,388,404,462,477,481,504,648,664,672,676,695,753,756,781,840,850,853,968,972,985,989,992,1003,1006,1549,1560,1564,1571,2058,2076,2080,2085,2088,2092,2163,2169,2173,2176,2224,2228,2304,2307,2311,2340],[10,11,12,13,17,18,21],"p",{},"Add one remote MCP server, ",[14,15,16],"code",{},"https://dashboard.hotelier.tools/api/mcp",", with a Hotelier Tools API key, and Claude Code, Cursor, VS Code (Copilot agent mode), Windsurf or Gemini CLI can read your Little Hotelier reservations, rates and invoices while they write code for you. In Claude Code it is a single command: ",[14,19,20],{},"claude mcp add --transport http hotelier-tools https://dashboard.hotelier.tools/api/mcp --header \"Authorization: Bearer htk_YOUR_API_KEY\"",".",[10,23,24],{},"Below are the exact configs for each tool (checked against each vendor's docs in October 2026), three things worth building, and when to call the REST API directly instead.",[26,27,29],"h2",{"id":28},"before-you-start-create-an-api-key","Before you start: create an API key",[10,31,32,33,40,41],{},"Little Hotelier does not publish an MCP server, and SiteMinder's own partner API docs say availability and rate data ",[34,35,39],"a",{"href":36,"rel":37},"https://developer.siteminder.com/smx-api/reference/availability-and-rates/publishers",[38],"nofollow","can't be obtained from Little Hotelier",". Hotelier Tools provides both an MCP server and a REST API, using your property's own Little Hotelier login. It is not affiliated with or endorsed by SiteMinder or Little Hotelier. Background: ",[34,42,44],{"href":43},"/blog/little-hotelier-api","does Little Hotelier have an API?",[46,47,48,61,71,81],"ol",{},[49,50,51,52,56,57,60],"li",{},"In Hotelier Tools, connect Little Hotelier on ",[53,54,55],"strong",{},"Credentials"," (",[14,58,59],{},"/credentials",") if you haven't yet.",[49,62,63,64,56,67,70],{},"Open ",[53,65,66],{},"Developer → API & MCP → API Keys",[14,68,69],{},"/developer/api-keys",").",[49,72,73,74,77,78,21],{},"Type a name that says where the key will live, such as ",[14,75,76],{},"cursor-laptop",", and press ",[53,79,80],{},"Generate key",[49,82,83,84,21],{},"Copy it straight away: \"Copy this key now — it will not be shown again.\" It starts with ",[14,85,86],{},"htk_",[88,89],"screenshot",{"alt":90,"caption":91,"path":69,"src":92},"API keys page in Hotelier Tools: the Generate a new key form with a name field and the Generate key button, one active key (MCP internal (chat), masked) with a Revoke button, and the Good security practice notes","One key per tool makes it easy to revoke just the one you no longer use.","/images/blog/demo/en/api-keys.webp",[10,94,95],{},"A key has the same permissions as your Hotelier Tools account, on the one property where you created it. You can have up to 10 keys.",[10,97,98,101,102,105],{},[53,99,100],{},"Keep the key out of your files."," Store it in an environment variable called ",[14,103,104],{},"HT_API_KEY"," and reference that from configs:",[107,108,114],"pre",{"className":109,"code":110,"filename":111,"language":112,"meta":113,"style":113},"language-bash shiki shiki-themes github-light github-dark","echo 'export HT_API_KEY=\"htk_YOUR_API_KEY\"' >> ~/.zshrc   # or ~/.bashrc\n","macOS / Linux","bash","",[14,115,116],{"__ignoreMap":113},[117,118,121,125,129,133,136],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"sj4cs","echo",[117,126,128],{"class":127},"sZZnC"," 'export HT_API_KEY=\"htk_YOUR_API_KEY\"'",[117,130,132],{"class":131},"szBVR"," >>",[117,134,135],{"class":127}," ~/.zshrc",[117,137,139],{"class":138},"sJ8bj","   # or ~/.bashrc\n",[107,141,146],{"className":142,"code":143,"filename":144,"language":145,"meta":113,"style":113},"language-powershell shiki shiki-themes github-light github-dark","setx HT_API_KEY \"htk_YOUR_API_KEY\"\n","Windows PowerShell","powershell",[14,147,148],{"__ignoreMap":113},[117,149,150,154],{"class":119,"line":120},[117,151,153],{"class":152},"sVt8B","setx HT_API_KEY ",[117,155,156],{"class":127},"\"htk_YOUR_API_KEY\"\n",[10,158,159],{},"Open a new terminal (and restart your editor) so it picks up the variable.",[26,161,163],{"id":162},"how-to-add-the-mcp-server-to-claude-code-cursor-vs-code-windsurf-and-gemini-cli","How to add the MCP server to Claude Code, Cursor, VS Code, Windsurf and Gemini CLI",[10,165,166],{},"Each tool stores the same three facts (address, transport, key) in a slightly different file. Pick yours.",[168,169,171],"h3",{"id":170},"claude-code","Claude Code",[10,173,174,175,180],{},"Claude Code has a built-in command for remote servers (",[34,176,179],{"href":177,"rel":178},"https://code.claude.com/docs/en/mcp",[38],"Anthropic's docs","):",[107,182,185],{"className":109,"code":183,"filename":184,"language":112,"meta":113,"style":113},"claude mcp add --transport http hotelier-tools https://dashboard.hotelier.tools/api/mcp --header \"Authorization: Bearer htk_YOUR_API_KEY\"\n","Terminal",[14,186,187],{"__ignoreMap":113},[117,188,189,193,196,199,202,205,208,211,214],{"class":119,"line":120},[117,190,192],{"class":191},"sScJk","claude",[117,194,195],{"class":127}," mcp",[117,197,198],{"class":127}," add",[117,200,201],{"class":123}," --transport",[117,203,204],{"class":127}," http",[117,206,207],{"class":127}," hotelier-tools",[117,209,210],{"class":127}," https://dashboard.hotelier.tools/api/mcp",[117,212,213],{"class":123}," --header",[117,215,216],{"class":127}," \"Authorization: Bearer htk_YOUR_API_KEY\"\n",[10,218,219,220,222,223,226,227,230,231,234],{},"Then start ",[14,221,192],{}," and type ",[14,224,225],{},"/mcp",". Hotelier Tools should show as ",[53,228,229],{},"connected","; a ",[14,232,233],{},"failed"," status with a 401 means the key is wrong.",[236,237,238,255],"ul",{},[49,239,240,243,244,247,248,251,252,21],{},[53,241,242],{},"Scope."," By default the server is saved for the current folder only. Add ",[14,245,246],{},"--scope user"," after the name to use it in every project, or ",[14,249,250],{},"--scope project"," to write a shared ",[14,253,254],{},".mcp.json",[49,256,257,260,261,264,265,267],{},[53,258,259],{},"Sign in instead of a key."," Run the command without ",[14,262,263],{},"--header",", then inside Claude Code type ",[14,266,225],{}," and authenticate in the browser. If you already connected Hotelier Tools as a connector on claude.ai, Claude Code can pick it up when you sign in with the same Claude account.",[10,269,270,271,273],{},"For a project you share with a colleague or keep in Git, put the server in ",[14,272,254],{}," and let each person supply their own key:",[107,275,279],{"className":276,"code":277,"filename":254,"language":278,"meta":113,"style":113},"language-json shiki shiki-themes github-light github-dark","{\n  \"mcpServers\": {\n    \"hotelier-tools\": {\n      \"type\": \"http\",\n      \"url\": \"https://dashboard.hotelier.tools/api/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${HT_API_KEY}\" }\n    }\n  }\n}\n","json",[14,280,281,286,295,303,318,331,351,357,363],{"__ignoreMap":113},[117,282,283],{"class":119,"line":120},[117,284,285],{"class":152},"{\n",[117,287,289,292],{"class":119,"line":288},2,[117,290,291],{"class":123},"  \"mcpServers\"",[117,293,294],{"class":152},": {\n",[117,296,298,301],{"class":119,"line":297},3,[117,299,300],{"class":123},"    \"hotelier-tools\"",[117,302,294],{"class":152},[117,304,306,309,312,315],{"class":119,"line":305},4,[117,307,308],{"class":123},"      \"type\"",[117,310,311],{"class":152},": ",[117,313,314],{"class":127},"\"http\"",[117,316,317],{"class":152},",\n",[117,319,321,324,326,329],{"class":119,"line":320},5,[117,322,323],{"class":123},"      \"url\"",[117,325,311],{"class":152},[117,327,328],{"class":127},"\"https://dashboard.hotelier.tools/api/mcp\"",[117,330,317],{"class":152},[117,332,334,337,340,343,345,348],{"class":119,"line":333},6,[117,335,336],{"class":123},"      \"headers\"",[117,338,339],{"class":152},": { ",[117,341,342],{"class":123},"\"Authorization\"",[117,344,311],{"class":152},[117,346,347],{"class":127},"\"Bearer ${HT_API_KEY}\"",[117,349,350],{"class":152}," }\n",[117,352,354],{"class":119,"line":353},7,[117,355,356],{"class":152},"    }\n",[117,358,360],{"class":119,"line":359},8,[117,361,362],{"class":152},"  }\n",[117,364,366],{"class":119,"line":365},9,[117,367,368],{"class":152},"}\n",[10,370,371,372,375,376,379,380,383],{},"The ",[14,373,374],{},"\"type\": \"http\""," line is required: Claude Code treats an entry with a ",[14,377,378],{},"url"," but no ",[14,381,382],{},"type"," as a configuration error.",[168,385,387],{"id":386},"cursor","Cursor",[10,389,390,391,394,395,398,399,180],{},"Cursor reads ",[14,392,393],{},"~/.cursor/mcp.json"," for all projects, or ",[14,396,397],{},".cursor/mcp.json"," inside one project (",[34,400,403],{"href":401,"rel":402},"https://cursor.com/docs/context/mcp",[38],"Cursor docs",[107,405,407],{"className":276,"code":406,"filename":393,"language":278,"meta":113,"style":113},"{\n  \"mcpServers\": {\n    \"hotelier-tools\": {\n      \"url\": \"https://dashboard.hotelier.tools/api/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${env:HT_API_KEY}\" }\n    }\n  }\n}\n",[14,408,409,413,419,425,435,450,454,458],{"__ignoreMap":113},[117,410,411],{"class":119,"line":120},[117,412,285],{"class":152},[117,414,415,417],{"class":119,"line":288},[117,416,291],{"class":123},[117,418,294],{"class":152},[117,420,421,423],{"class":119,"line":297},[117,422,300],{"class":123},[117,424,294],{"class":152},[117,426,427,429,431,433],{"class":119,"line":305},[117,428,323],{"class":123},[117,430,311],{"class":152},[117,432,328],{"class":127},[117,434,317],{"class":152},[117,436,437,439,441,443,445,448],{"class":119,"line":320},[117,438,336],{"class":123},[117,440,339],{"class":152},[117,442,342],{"class":123},[117,444,311],{"class":152},[117,446,447],{"class":127},"\"Bearer ${env:HT_API_KEY}\"",[117,449,350],{"class":152},[117,451,452],{"class":119,"line":333},[117,453,356],{"class":152},[117,455,456],{"class":119,"line":353},[117,457,362],{"class":152},[117,459,460],{"class":119,"line":359},[117,461,368],{"class":152},[10,463,464,465,468,469,472,473,476],{},"Save, then check that the server is enabled in Cursor's MCP settings (recent versions list servers under ",[53,466,467],{},"Customize"," in the sidebar). Ask in the ",[53,470,471],{},"Agent"," chat. Cursor asks for approval before running a tool by default; keep it that way for this server. Leaving out ",[14,474,475],{},"headers"," makes Cursor offer the browser sign-in instead.",[168,478,480],{"id":479},"vs-code-with-github-copilot","VS Code with GitHub Copilot",[10,482,483,484,487,488,491,492,56,494,499,500,503],{},"VS Code uses ",[14,485,486],{},".vscode/mcp.json",", with ",[14,489,490],{},"servers"," as the top key and a required ",[14,493,374],{},[34,495,498],{"href":496,"rel":497},"https://code.visualstudio.com/docs/agents/reference/mcp-configuration",[38],"VS Code docs","). Its ",[14,501,502],{},"inputs"," feature asks for the key once and keeps it in VS Code's secure storage, so it never sits in the file:",[107,505,507],{"className":276,"code":506,"filename":486,"language":278,"meta":113,"style":113},"{\n  \"inputs\": [\n    {\n      \"type\": \"promptString\",\n      \"id\": \"ht-api-key\",\n      \"description\": \"Hotelier Tools API key (htk_…)\",\n      \"password\": true\n    }\n  ],\n  \"servers\": {\n    \"hotelier-tools\": {\n      \"type\": \"http\",\n      \"url\": \"https://dashboard.hotelier.tools/api/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${input:ht-api-key}\" }\n    }\n  }\n}\n",[14,508,509,513,521,526,537,549,561,571,575,580,588,595,606,617,633,638,643],{"__ignoreMap":113},[117,510,511],{"class":119,"line":120},[117,512,285],{"class":152},[117,514,515,518],{"class":119,"line":288},[117,516,517],{"class":123},"  \"inputs\"",[117,519,520],{"class":152},": [\n",[117,522,523],{"class":119,"line":297},[117,524,525],{"class":152},"    {\n",[117,527,528,530,532,535],{"class":119,"line":305},[117,529,308],{"class":123},[117,531,311],{"class":152},[117,533,534],{"class":127},"\"promptString\"",[117,536,317],{"class":152},[117,538,539,542,544,547],{"class":119,"line":320},[117,540,541],{"class":123},"      \"id\"",[117,543,311],{"class":152},[117,545,546],{"class":127},"\"ht-api-key\"",[117,548,317],{"class":152},[117,550,551,554,556,559],{"class":119,"line":333},[117,552,553],{"class":123},"      \"description\"",[117,555,311],{"class":152},[117,557,558],{"class":127},"\"Hotelier Tools API key (htk_…)\"",[117,560,317],{"class":152},[117,562,563,566,568],{"class":119,"line":353},[117,564,565],{"class":123},"      \"password\"",[117,567,311],{"class":152},[117,569,570],{"class":123},"true\n",[117,572,573],{"class":119,"line":359},[117,574,356],{"class":152},[117,576,577],{"class":119,"line":365},[117,578,579],{"class":152},"  ],\n",[117,581,583,586],{"class":119,"line":582},10,[117,584,585],{"class":123},"  \"servers\"",[117,587,294],{"class":152},[117,589,591,593],{"class":119,"line":590},11,[117,592,300],{"class":123},[117,594,294],{"class":152},[117,596,598,600,602,604],{"class":119,"line":597},12,[117,599,308],{"class":123},[117,601,311],{"class":152},[117,603,314],{"class":127},[117,605,317],{"class":152},[117,607,609,611,613,615],{"class":119,"line":608},13,[117,610,323],{"class":123},[117,612,311],{"class":152},[117,614,328],{"class":127},[117,616,317],{"class":152},[117,618,620,622,624,626,628,631],{"class":119,"line":619},14,[117,621,336],{"class":123},[117,623,339],{"class":152},[117,625,342],{"class":123},[117,627,311],{"class":152},[117,629,630],{"class":127},"\"Bearer ${input:ht-api-key}\"",[117,632,350],{"class":152},[117,634,636],{"class":119,"line":635},15,[117,637,356],{"class":152},[117,639,641],{"class":119,"line":640},16,[117,642,362],{"class":152},[117,644,646],{"class":119,"line":645},17,[117,647,368],{"class":152},[10,649,650,651,653,654,657,658,661,662,21],{},"Open Copilot Chat, switch to ",[53,652,471],{}," mode and use ",[53,655,656],{},"Configure Tools"," to see the Hotelier Tools tools. VS Code may ask you to trust the server the first time it starts. For all workspaces, run ",[53,659,660],{},"MCP: Open User Configuration"," and paste the same block there. VS Code also supports the browser sign-in if you leave out ",[14,663,475],{},[88,665],{"alt":666,"caption":667,"path":668,"src":669,"height":670,"width":671},"VS Code / GitHub Copilot tab of the Hotelier Tools MCP setup page: a .vscode/mcp.json snippet with servers, hotelier-tools, type http, the demo's /api/mcp URL and an Authorization header with the htk_YOUR_API_KEY placeholder, then Turn on Agent mode in Copilot Chat","The MCP Setup page has a ready-made snippet for each client. The demo shows its own address; yours is dashboard.hotelier.tools.","/developer/mcp-setup","/images/blog/demo/en/mcp-config-vscode-copilot.webp",446,1036,[168,673,675],{"id":674},"windsurf-and-gemini-cli","Windsurf and Gemini CLI",[10,677,678,681,682,685,686,689,690,180],{},[53,679,680],{},"Windsurf"," (whose docs now live under Devin) reads ",[14,683,684],{},"~/.codeium/windsurf/mcp_config.json"," and uses ",[14,687,688],{},"serverUrl"," for remote servers (",[34,691,694],{"href":692,"rel":693},"https://docs.devin.ai/windsurf/plugins/cascade/mcp",[38],"docs",[107,696,698],{"className":276,"code":697,"filename":684,"language":278,"meta":113,"style":113},"{\n  \"mcpServers\": {\n    \"hotelier-tools\": {\n      \"serverUrl\": \"https://dashboard.hotelier.tools/api/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${env:HT_API_KEY}\" }\n    }\n  }\n}\n",[14,699,700,704,710,716,727,741,745,749],{"__ignoreMap":113},[117,701,702],{"class":119,"line":120},[117,703,285],{"class":152},[117,705,706,708],{"class":119,"line":288},[117,707,291],{"class":123},[117,709,294],{"class":152},[117,711,712,714],{"class":119,"line":297},[117,713,300],{"class":123},[117,715,294],{"class":152},[117,717,718,721,723,725],{"class":119,"line":305},[117,719,720],{"class":123},"      \"serverUrl\"",[117,722,311],{"class":152},[117,724,328],{"class":127},[117,726,317],{"class":152},[117,728,729,731,733,735,737,739],{"class":119,"line":320},[117,730,336],{"class":123},[117,732,339],{"class":152},[117,734,342],{"class":123},[117,736,311],{"class":152},[117,738,447],{"class":127},[117,740,350],{"class":152},[117,742,743],{"class":119,"line":333},[117,744,356],{"class":152},[117,746,747],{"class":119,"line":353},[117,748,362],{"class":152},[117,750,751],{"class":119,"line":359},[117,752,368],{"class":152},[10,754,755],{},"Windsurf caps Cascade at 100 tools in total, and Hotelier Tools offers more than 100, so you may need to switch off tools you don't use in the MCP panel.",[10,757,758,761,762,765,766,769,770,773,774,776,777,180],{},[53,759,760],{},"Gemini CLI"," reads ",[14,763,764],{},"~/.gemini/settings.json"," (or ",[14,767,768],{},".gemini/settings.json"," in a project) and uses ",[14,771,772],{},"httpUrl"," for this kind of server; ",[14,775,378],{}," would mean the older SSE transport, which Hotelier Tools does not serve (",[34,778,694],{"href":779,"rel":780},"https://geminicli.com/docs/tools/mcp-server/",[38],[107,782,784],{"className":276,"code":783,"filename":764,"language":278,"meta":113,"style":113},"{\n  \"mcpServers\": {\n    \"hotelier-tools\": {\n      \"httpUrl\": \"https://dashboard.hotelier.tools/api/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer $HT_API_KEY\" }\n    }\n  }\n}\n",[14,785,786,790,796,802,813,828,832,836],{"__ignoreMap":113},[117,787,788],{"class":119,"line":120},[117,789,285],{"class":152},[117,791,792,794],{"class":119,"line":288},[117,793,291],{"class":123},[117,795,294],{"class":152},[117,797,798,800],{"class":119,"line":297},[117,799,300],{"class":123},[117,801,294],{"class":152},[117,803,804,807,809,811],{"class":119,"line":305},[117,805,806],{"class":123},"      \"httpUrl\"",[117,808,311],{"class":152},[117,810,328],{"class":127},[117,812,317],{"class":152},[117,814,815,817,819,821,823,826],{"class":119,"line":320},[117,816,336],{"class":123},[117,818,339],{"class":152},[117,820,342],{"class":123},[117,822,311],{"class":152},[117,824,825],{"class":127},"\"Bearer $HT_API_KEY\"",[117,827,350],{"class":152},[117,829,830],{"class":119,"line":333},[117,831,356],{"class":152},[117,833,834],{"class":119,"line":353},[117,835,362],{"class":152},[117,837,838],{"class":119,"line":359},[117,839,368],{"class":152},[10,841,842,843,846,847,849],{},"Or from the terminal: ",[14,844,845],{},"gemini mcp add --transport http --header \"Authorization: Bearer htk_YOUR_API_KEY\" hotelier-tools https://dashboard.hotelier.tools/api/mcp",". Type ",[14,848,225],{}," inside Gemini CLI to check it.",[10,851,852],{},"These two configs follow each vendor's documentation; we have not tested them in every version.",[854,855,856,875],"table",{},[857,858,859],"thead",{},[860,861,862,866,869,872],"tr",{},[863,864,865],"th",{},"Tool",[863,867,868],{},"Config file",[863,870,871],{},"Top key",[863,873,874],{},"URL key",[876,877,878,899,915,934,951],"tbody",{},[860,879,880,883,887,892],{},[881,882,171],"td",{},[881,884,885],{},[14,886,254],{},[881,888,889],{},[14,890,891],{},"mcpServers",[881,893,894,896,897],{},[14,895,378],{}," + ",[14,898,374],{},[860,900,901,903,907,911],{},[881,902,387],{},[881,904,905],{},[14,906,397],{},[881,908,909],{},[14,910,891],{},[881,912,913],{},[14,914,378],{},[860,916,917,920,924,928],{},[881,918,919],{},"VS Code",[881,921,922],{},[14,923,486],{},[881,925,926],{},[14,927,490],{},[881,929,930,896,932],{},[14,931,378],{},[14,933,374],{},[860,935,936,938,943,947],{},[881,937,680],{},[881,939,940],{},[14,941,942],{},"mcp_config.json",[881,944,945],{},[14,946,891],{},[881,948,949],{},[14,950,688],{},[860,952,953,955,960,964],{},[881,954,760],{},[881,956,957],{},[14,958,959],{},"settings.json",[881,961,962],{},[14,963,891],{},[881,965,966],{},[14,967,772],{},[26,969,971],{"id":970},"three-things-worth-building","Three things worth building",[10,973,974,975,979,980,984],{},"The trick is to let the agent use MCP to ",[976,977,978],"em",{},"look"," at your real data, then write code that calls the ",[34,981,983],{"href":982},"/tools/bot/api-mcp","REST API"," so the result runs every month without AI.",[168,986,988],{"id":987},"a-monthly-occupancy-report","A monthly occupancy report",[10,990,991],{},"Ask Claude Code (or Cursor's agent) in an empty folder:",[993,994,995],"prompt",{"label":171},[10,996,997,998,1002],{},"Use the hotelier-tools MCP server to look at my room types and last month's reservations. Then write a Node.js script that calls the Hotelier Tools REST API (spec: ",[34,999,1000],{"href":1000,"rel":1001},"https://dashboard.hotelier.tools/api/v1/openapi.json",[38],") with the key in HT_API_KEY, and for any month I pass in, prints occupancy and average daily rate per room type and saves them to a CSV.",[10,1004,1005],{},"A good script starts like this. It pulls the room types and every reservation that overlaps the month, and saves the raw answer so you can check the fields before doing maths:",[107,1007,1012],{"className":1008,"code":1009,"filename":1010,"language":1011,"meta":113,"style":113},"language-js shiki shiki-themes github-light github-dark","// Usage: node fetch-month.mjs 2026-09   (needs HT_API_KEY in your environment)\nimport { writeFile } from \"node:fs/promises\";\n\nconst API = \"https://dashboard.hotelier.tools/api/v1\";\nconst headers = {\n  Authorization: `Bearer ${process.env.HT_API_KEY}`,\n  \"Content-Type\": \"application/json\",\n};\n\nasync function call(path, options = {}) {\n  const res = await fetch(`${API}${path}`, { ...options, headers });\n  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);\n  return res.json();\n}\n\nconst month = process.argv[2];\nconst [year, mon] = month.split(\"-\").map(Number);\nconst startDate = `${month}-01`;\nconst endDate = new Date(Date.UTC(year, mon, 0)).toISOString().slice(0, 10);\n\nconst roomTypes = await call(\"/room-types\");\nconst reservations = await call(\"/methods/getReservationsByDateRange\", {\n  method: \"POST\",\n  body: JSON.stringify({ params: { startDate, endDate } }),\n});\n\nawait writeFile(\n  `raw-${month}.json`,\n  JSON.stringify({ roomTypes: roomTypes.data, reservations: reservations.result }, null, 2)\n);\nconsole.log(`Saved raw-${month}.json`);\n","fetch-month.mjs","js",[14,1013,1014,1019,1036,1042,1058,1070,1095,1107,1112,1116,1145,1185,1240,1253,1257,1261,1279,1319,1340,1390,1395,1416,1438,1449,1466,1472,1477,1488,1501,1524,1529],{"__ignoreMap":113},[117,1015,1016],{"class":119,"line":120},[117,1017,1018],{"class":138},"// Usage: node fetch-month.mjs 2026-09   (needs HT_API_KEY in your environment)\n",[117,1020,1021,1024,1027,1030,1033],{"class":119,"line":288},[117,1022,1023],{"class":131},"import",[117,1025,1026],{"class":152}," { writeFile } ",[117,1028,1029],{"class":131},"from",[117,1031,1032],{"class":127}," \"node:fs/promises\"",[117,1034,1035],{"class":152},";\n",[117,1037,1038],{"class":119,"line":297},[117,1039,1041],{"emptyLinePlaceholder":1040},true,"\n",[117,1043,1044,1047,1050,1053,1056],{"class":119,"line":305},[117,1045,1046],{"class":131},"const",[117,1048,1049],{"class":123}," API",[117,1051,1052],{"class":131}," =",[117,1054,1055],{"class":127}," \"https://dashboard.hotelier.tools/api/v1\"",[117,1057,1035],{"class":152},[117,1059,1060,1062,1065,1067],{"class":119,"line":320},[117,1061,1046],{"class":131},[117,1063,1064],{"class":123}," headers",[117,1066,1052],{"class":131},[117,1068,1069],{"class":152}," {\n",[117,1071,1072,1075,1078,1081,1083,1086,1088,1090,1093],{"class":119,"line":333},[117,1073,1074],{"class":152},"  Authorization: ",[117,1076,1077],{"class":127},"`Bearer ${",[117,1079,1080],{"class":152},"process",[117,1082,21],{"class":127},[117,1084,1085],{"class":152},"env",[117,1087,21],{"class":127},[117,1089,104],{"class":123},[117,1091,1092],{"class":127},"}`",[117,1094,317],{"class":152},[117,1096,1097,1100,1102,1105],{"class":119,"line":353},[117,1098,1099],{"class":127},"  \"Content-Type\"",[117,1101,311],{"class":152},[117,1103,1104],{"class":127},"\"application/json\"",[117,1106,317],{"class":152},[117,1108,1109],{"class":119,"line":359},[117,1110,1111],{"class":152},"};\n",[117,1113,1114],{"class":119,"line":365},[117,1115,1041],{"emptyLinePlaceholder":1040},[117,1117,1118,1121,1124,1127,1130,1134,1137,1140,1142],{"class":119,"line":582},[117,1119,1120],{"class":131},"async",[117,1122,1123],{"class":131}," function",[117,1125,1126],{"class":191}," call",[117,1128,1129],{"class":152},"(",[117,1131,1133],{"class":1132},"s4XuR","path",[117,1135,1136],{"class":152},", ",[117,1138,1139],{"class":1132},"options",[117,1141,1052],{"class":131},[117,1143,1144],{"class":152}," {}) {\n",[117,1146,1147,1150,1153,1155,1158,1161,1163,1166,1169,1172,1174,1176,1179,1182],{"class":119,"line":590},[117,1148,1149],{"class":131},"  const",[117,1151,1152],{"class":123}," res",[117,1154,1052],{"class":131},[117,1156,1157],{"class":131}," await",[117,1159,1160],{"class":191}," fetch",[117,1162,1129],{"class":152},[117,1164,1165],{"class":127},"`${",[117,1167,1168],{"class":123},"API",[117,1170,1171],{"class":127},"}${",[117,1173,1133],{"class":152},[117,1175,1092],{"class":127},[117,1177,1178],{"class":152},", { ",[117,1180,1181],{"class":131},"...",[117,1183,1184],{"class":152},"options, headers });\n",[117,1186,1187,1190,1192,1195,1198,1201,1204,1207,1209,1211,1214,1216,1219,1222,1225,1227,1229,1232,1235,1237],{"class":119,"line":597},[117,1188,1189],{"class":131},"  if",[117,1191,56],{"class":152},[117,1193,1194],{"class":131},"!",[117,1196,1197],{"class":152},"res.ok) ",[117,1199,1200],{"class":131},"throw",[117,1202,1203],{"class":131}," new",[117,1205,1206],{"class":191}," Error",[117,1208,1129],{"class":152},[117,1210,1165],{"class":127},[117,1212,1213],{"class":152},"res",[117,1215,21],{"class":127},[117,1217,1218],{"class":152},"status",[117,1220,1221],{"class":127},"} ${",[117,1223,1224],{"class":131},"await",[117,1226,1152],{"class":152},[117,1228,21],{"class":127},[117,1230,1231],{"class":191},"text",[117,1233,1234],{"class":127},"()",[117,1236,1092],{"class":127},[117,1238,1239],{"class":152},");\n",[117,1241,1242,1245,1248,1250],{"class":119,"line":608},[117,1243,1244],{"class":131},"  return",[117,1246,1247],{"class":152}," res.",[117,1249,278],{"class":191},[117,1251,1252],{"class":152},"();\n",[117,1254,1255],{"class":119,"line":619},[117,1256,368],{"class":152},[117,1258,1259],{"class":119,"line":635},[117,1260,1041],{"emptyLinePlaceholder":1040},[117,1262,1263,1265,1268,1270,1273,1276],{"class":119,"line":640},[117,1264,1046],{"class":131},[117,1266,1267],{"class":123}," month",[117,1269,1052],{"class":131},[117,1271,1272],{"class":152}," process.argv[",[117,1274,1275],{"class":123},"2",[117,1277,1278],{"class":152},"];\n",[117,1280,1281,1283,1286,1289,1291,1294,1297,1300,1303,1306,1308,1311,1313,1316],{"class":119,"line":645},[117,1282,1046],{"class":131},[117,1284,1285],{"class":152}," [",[117,1287,1288],{"class":123},"year",[117,1290,1136],{"class":152},[117,1292,1293],{"class":123},"mon",[117,1295,1296],{"class":152},"] ",[117,1298,1299],{"class":131},"=",[117,1301,1302],{"class":152}," month.",[117,1304,1305],{"class":191},"split",[117,1307,1129],{"class":152},[117,1309,1310],{"class":127},"\"-\"",[117,1312,70],{"class":152},[117,1314,1315],{"class":191},"map",[117,1317,1318],{"class":152},"(Number);\n",[117,1320,1322,1324,1327,1329,1332,1335,1338],{"class":119,"line":1321},18,[117,1323,1046],{"class":131},[117,1325,1326],{"class":123}," startDate",[117,1328,1052],{"class":131},[117,1330,1331],{"class":127}," `${",[117,1333,1334],{"class":152},"month",[117,1336,1337],{"class":127},"}-01`",[117,1339,1035],{"class":152},[117,1341,1343,1345,1348,1350,1352,1355,1358,1361,1364,1367,1370,1373,1376,1379,1381,1383,1385,1388],{"class":119,"line":1342},19,[117,1344,1046],{"class":131},[117,1346,1347],{"class":123}," endDate",[117,1349,1052],{"class":131},[117,1351,1203],{"class":131},[117,1353,1354],{"class":191}," Date",[117,1356,1357],{"class":152},"(Date.",[117,1359,1360],{"class":191},"UTC",[117,1362,1363],{"class":152},"(year, mon, ",[117,1365,1366],{"class":123},"0",[117,1368,1369],{"class":152},")).",[117,1371,1372],{"class":191},"toISOString",[117,1374,1375],{"class":152},"().",[117,1377,1378],{"class":191},"slice",[117,1380,1129],{"class":152},[117,1382,1366],{"class":123},[117,1384,1136],{"class":152},[117,1386,1387],{"class":123},"10",[117,1389,1239],{"class":152},[117,1391,1393],{"class":119,"line":1392},20,[117,1394,1041],{"emptyLinePlaceholder":1040},[117,1396,1398,1400,1403,1405,1407,1409,1411,1414],{"class":119,"line":1397},21,[117,1399,1046],{"class":131},[117,1401,1402],{"class":123}," roomTypes",[117,1404,1052],{"class":131},[117,1406,1157],{"class":131},[117,1408,1126],{"class":191},[117,1410,1129],{"class":152},[117,1412,1413],{"class":127},"\"/room-types\"",[117,1415,1239],{"class":152},[117,1417,1419,1421,1424,1426,1428,1430,1432,1435],{"class":119,"line":1418},22,[117,1420,1046],{"class":131},[117,1422,1423],{"class":123}," reservations",[117,1425,1052],{"class":131},[117,1427,1157],{"class":131},[117,1429,1126],{"class":191},[117,1431,1129],{"class":152},[117,1433,1434],{"class":127},"\"/methods/getReservationsByDateRange\"",[117,1436,1437],{"class":152},", {\n",[117,1439,1441,1444,1447],{"class":119,"line":1440},23,[117,1442,1443],{"class":152},"  method: ",[117,1445,1446],{"class":127},"\"POST\"",[117,1448,317],{"class":152},[117,1450,1452,1455,1458,1460,1463],{"class":119,"line":1451},24,[117,1453,1454],{"class":152},"  body: ",[117,1456,1457],{"class":123},"JSON",[117,1459,21],{"class":152},[117,1461,1462],{"class":191},"stringify",[117,1464,1465],{"class":152},"({ params: { startDate, endDate } }),\n",[117,1467,1469],{"class":119,"line":1468},25,[117,1470,1471],{"class":152},"});\n",[117,1473,1475],{"class":119,"line":1474},26,[117,1476,1041],{"emptyLinePlaceholder":1040},[117,1478,1480,1482,1485],{"class":119,"line":1479},27,[117,1481,1224],{"class":131},[117,1483,1484],{"class":191}," writeFile",[117,1486,1487],{"class":152},"(\n",[117,1489,1491,1494,1496,1499],{"class":119,"line":1490},28,[117,1492,1493],{"class":127},"  `raw-${",[117,1495,1334],{"class":152},[117,1497,1498],{"class":127},"}.json`",[117,1500,317],{"class":152},[117,1502,1504,1507,1509,1511,1514,1517,1519,1521],{"class":119,"line":1503},29,[117,1505,1506],{"class":123},"  JSON",[117,1508,21],{"class":152},[117,1510,1462],{"class":191},[117,1512,1513],{"class":152},"({ roomTypes: roomTypes.data, reservations: reservations.result }, ",[117,1515,1516],{"class":123},"null",[117,1518,1136],{"class":152},[117,1520,1275],{"class":123},[117,1522,1523],{"class":152},")\n",[117,1525,1527],{"class":119,"line":1526},30,[117,1528,1239],{"class":152},[117,1530,1532,1535,1538,1540,1543,1545,1547],{"class":119,"line":1531},31,[117,1533,1534],{"class":152},"console.",[117,1536,1537],{"class":191},"log",[117,1539,1129],{"class":152},[117,1541,1542],{"class":127},"`Saved raw-${",[117,1544,1334],{"class":152},[117,1546,1498],{"class":127},[117,1548,1239],{"class":152},[10,1550,1551,1552,1555,1556,1559],{},"The API's own spec says reservation objects come from Little Hotelier and their \"shape may vary\", so let the agent read the saved file before it calculates anything. ",[14,1553,1554],{},"/room-types"," gives ",[14,1557,1558],{},"totalRooms"," per type, which is the other half of the occupancy sum.",[168,1561,1563],{"id":1562},"a-google-sheets-sync","A Google Sheets sync",[10,1565,1566,1567,1570],{},"For a sheet that lists the next 30 days of arrivals and refreshes every morning, open your spreadsheet, go to ",[53,1568,1569],{},"Extensions → Apps Script"," and paste:",[107,1572,1575],{"className":1008,"code":1573,"filename":1574,"language":1011,"meta":113,"style":113},"function syncArrivals() {\n  const key = PropertiesService.getScriptProperties().getProperty('HT_API_KEY');\n  const fmt = d => Utilities.formatDate(d, Session.getScriptTimeZone(), 'yyyy-MM-dd');\n  const today = new Date();\n  const in30 = new Date(today.getTime() + 30 * 24 * 60 * 60 * 1000);\n  const url = 'https://dashboard.hotelier.tools/api/v1/reservations'\n    + '?startDate=' + fmt(today) + '&endDate=' + fmt(in30) + '&limit=100';\n\n  const res = UrlFetchApp.fetch(url, {\n    headers: { Authorization: 'Bearer ' + key },\n    muteHttpExceptions: true,\n  });\n  if (res.getResponseCode() !== 200) throw new Error(res.getContentText());\n\n  const rows = JSON.parse(res.getContentText()).data.map(r => [\n    r.id, r.guestName, r.status, r.checkIn, r.checkOut, r.roomType, r.totalAmount,\n  ]);\n  const book = SpreadsheetApp.getActive();\n  const sheet = book.getSheetByName('Arrivals') || book.insertSheet('Arrivals');\n  sheet.clearContents();\n  sheet.appendRow(['ID', 'Guest', 'Status', 'Check-in', 'Check-out', 'Room type', 'Total']);\n  if (rows.length) sheet.getRange(2, 1, rows.length, rows[0].length).setValues(rows);\n}\n","Code.gs",[14,1576,1577,1588,1615,1650,1665,1715,1727,1762,1766,1783,1796,1806,1811,1847,1851,1887,1892,1897,1914,1950,1960,2006,2054],{"__ignoreMap":113},[117,1578,1579,1582,1585],{"class":119,"line":120},[117,1580,1581],{"class":131},"function",[117,1583,1584],{"class":191}," syncArrivals",[117,1586,1587],{"class":152},"() {\n",[117,1589,1590,1592,1595,1597,1600,1603,1605,1608,1610,1613],{"class":119,"line":288},[117,1591,1149],{"class":131},[117,1593,1594],{"class":123}," key",[117,1596,1052],{"class":131},[117,1598,1599],{"class":152}," PropertiesService.",[117,1601,1602],{"class":191},"getScriptProperties",[117,1604,1375],{"class":152},[117,1606,1607],{"class":191},"getProperty",[117,1609,1129],{"class":152},[117,1611,1612],{"class":127},"'HT_API_KEY'",[117,1614,1239],{"class":152},[117,1616,1617,1619,1622,1624,1627,1630,1633,1636,1639,1642,1645,1648],{"class":119,"line":297},[117,1618,1149],{"class":131},[117,1620,1621],{"class":191}," fmt",[117,1623,1052],{"class":131},[117,1625,1626],{"class":1132}," d",[117,1628,1629],{"class":131}," =>",[117,1631,1632],{"class":152}," Utilities.",[117,1634,1635],{"class":191},"formatDate",[117,1637,1638],{"class":152},"(d, Session.",[117,1640,1641],{"class":191},"getScriptTimeZone",[117,1643,1644],{"class":152},"(), ",[117,1646,1647],{"class":127},"'yyyy-MM-dd'",[117,1649,1239],{"class":152},[117,1651,1652,1654,1657,1659,1661,1663],{"class":119,"line":305},[117,1653,1149],{"class":131},[117,1655,1656],{"class":123}," today",[117,1658,1052],{"class":131},[117,1660,1203],{"class":131},[117,1662,1354],{"class":191},[117,1664,1252],{"class":152},[117,1666,1667,1669,1672,1674,1676,1678,1681,1684,1687,1690,1693,1696,1699,1701,1704,1706,1708,1710,1713],{"class":119,"line":320},[117,1668,1149],{"class":131},[117,1670,1671],{"class":123}," in30",[117,1673,1052],{"class":131},[117,1675,1203],{"class":131},[117,1677,1354],{"class":191},[117,1679,1680],{"class":152},"(today.",[117,1682,1683],{"class":191},"getTime",[117,1685,1686],{"class":152},"() ",[117,1688,1689],{"class":131},"+",[117,1691,1692],{"class":123}," 30",[117,1694,1695],{"class":131}," *",[117,1697,1698],{"class":123}," 24",[117,1700,1695],{"class":131},[117,1702,1703],{"class":123}," 60",[117,1705,1695],{"class":131},[117,1707,1703],{"class":123},[117,1709,1695],{"class":131},[117,1711,1712],{"class":123}," 1000",[117,1714,1239],{"class":152},[117,1716,1717,1719,1722,1724],{"class":119,"line":333},[117,1718,1149],{"class":131},[117,1720,1721],{"class":123}," url",[117,1723,1052],{"class":131},[117,1725,1726],{"class":127}," 'https://dashboard.hotelier.tools/api/v1/reservations'\n",[117,1728,1729,1732,1735,1738,1740,1743,1745,1748,1750,1752,1755,1757,1760],{"class":119,"line":353},[117,1730,1731],{"class":131},"    +",[117,1733,1734],{"class":127}," '?startDate='",[117,1736,1737],{"class":131}," +",[117,1739,1621],{"class":191},[117,1741,1742],{"class":152},"(today) ",[117,1744,1689],{"class":131},[117,1746,1747],{"class":127}," '&endDate='",[117,1749,1737],{"class":131},[117,1751,1621],{"class":191},[117,1753,1754],{"class":152},"(in30) ",[117,1756,1689],{"class":131},[117,1758,1759],{"class":127}," '&limit=100'",[117,1761,1035],{"class":152},[117,1763,1764],{"class":119,"line":359},[117,1765,1041],{"emptyLinePlaceholder":1040},[117,1767,1768,1770,1772,1774,1777,1780],{"class":119,"line":365},[117,1769,1149],{"class":131},[117,1771,1152],{"class":123},[117,1773,1052],{"class":131},[117,1775,1776],{"class":152}," UrlFetchApp.",[117,1778,1779],{"class":191},"fetch",[117,1781,1782],{"class":152},"(url, {\n",[117,1784,1785,1788,1791,1793],{"class":119,"line":582},[117,1786,1787],{"class":152},"    headers: { Authorization: ",[117,1789,1790],{"class":127},"'Bearer '",[117,1792,1737],{"class":131},[117,1794,1795],{"class":152}," key },\n",[117,1797,1798,1801,1804],{"class":119,"line":590},[117,1799,1800],{"class":152},"    muteHttpExceptions: ",[117,1802,1803],{"class":123},"true",[117,1805,317],{"class":152},[117,1807,1808],{"class":119,"line":597},[117,1809,1810],{"class":152},"  });\n",[117,1812,1813,1815,1818,1821,1823,1826,1829,1832,1834,1836,1838,1841,1844],{"class":119,"line":608},[117,1814,1189],{"class":131},[117,1816,1817],{"class":152}," (res.",[117,1819,1820],{"class":191},"getResponseCode",[117,1822,1686],{"class":152},[117,1824,1825],{"class":131},"!==",[117,1827,1828],{"class":123}," 200",[117,1830,1831],{"class":152},") ",[117,1833,1200],{"class":131},[117,1835,1203],{"class":131},[117,1837,1206],{"class":191},[117,1839,1840],{"class":152},"(res.",[117,1842,1843],{"class":191},"getContentText",[117,1845,1846],{"class":152},"());\n",[117,1848,1849],{"class":119,"line":619},[117,1850,1041],{"emptyLinePlaceholder":1040},[117,1852,1853,1855,1858,1860,1863,1865,1868,1870,1872,1875,1877,1879,1882,1884],{"class":119,"line":635},[117,1854,1149],{"class":131},[117,1856,1857],{"class":123}," rows",[117,1859,1052],{"class":131},[117,1861,1862],{"class":123}," JSON",[117,1864,21],{"class":152},[117,1866,1867],{"class":191},"parse",[117,1869,1840],{"class":152},[117,1871,1843],{"class":191},[117,1873,1874],{"class":152},"()).data.",[117,1876,1315],{"class":191},[117,1878,1129],{"class":152},[117,1880,1881],{"class":1132},"r",[117,1883,1629],{"class":131},[117,1885,1886],{"class":152}," [\n",[117,1888,1889],{"class":119,"line":640},[117,1890,1891],{"class":152},"    r.id, r.guestName, r.status, r.checkIn, r.checkOut, r.roomType, r.totalAmount,\n",[117,1893,1894],{"class":119,"line":645},[117,1895,1896],{"class":152},"  ]);\n",[117,1898,1899,1901,1904,1906,1909,1912],{"class":119,"line":1321},[117,1900,1149],{"class":131},[117,1902,1903],{"class":123}," book",[117,1905,1052],{"class":131},[117,1907,1908],{"class":152}," SpreadsheetApp.",[117,1910,1911],{"class":191},"getActive",[117,1913,1252],{"class":152},[117,1915,1916,1918,1921,1923,1926,1929,1931,1934,1936,1939,1941,1944,1946,1948],{"class":119,"line":1342},[117,1917,1149],{"class":131},[117,1919,1920],{"class":123}," sheet",[117,1922,1052],{"class":131},[117,1924,1925],{"class":152}," book.",[117,1927,1928],{"class":191},"getSheetByName",[117,1930,1129],{"class":152},[117,1932,1933],{"class":127},"'Arrivals'",[117,1935,1831],{"class":152},[117,1937,1938],{"class":131},"||",[117,1940,1925],{"class":152},[117,1942,1943],{"class":191},"insertSheet",[117,1945,1129],{"class":152},[117,1947,1933],{"class":127},[117,1949,1239],{"class":152},[117,1951,1952,1955,1958],{"class":119,"line":1392},[117,1953,1954],{"class":152},"  sheet.",[117,1956,1957],{"class":191},"clearContents",[117,1959,1252],{"class":152},[117,1961,1962,1964,1967,1970,1973,1975,1978,1980,1983,1985,1988,1990,1993,1995,1998,2000,2003],{"class":119,"line":1397},[117,1963,1954],{"class":152},[117,1965,1966],{"class":191},"appendRow",[117,1968,1969],{"class":152},"([",[117,1971,1972],{"class":127},"'ID'",[117,1974,1136],{"class":152},[117,1976,1977],{"class":127},"'Guest'",[117,1979,1136],{"class":152},[117,1981,1982],{"class":127},"'Status'",[117,1984,1136],{"class":152},[117,1986,1987],{"class":127},"'Check-in'",[117,1989,1136],{"class":152},[117,1991,1992],{"class":127},"'Check-out'",[117,1994,1136],{"class":152},[117,1996,1997],{"class":127},"'Room type'",[117,1999,1136],{"class":152},[117,2001,2002],{"class":127},"'Total'",[117,2004,2005],{"class":152},"]);\n",[117,2007,2008,2010,2013,2016,2019,2022,2024,2026,2028,2031,2034,2036,2039,2041,2044,2046,2048,2051],{"class":119,"line":1418},[117,2009,1189],{"class":131},[117,2011,2012],{"class":152}," (rows.",[117,2014,2015],{"class":123},"length",[117,2017,2018],{"class":152},") sheet.",[117,2020,2021],{"class":191},"getRange",[117,2023,1129],{"class":152},[117,2025,1275],{"class":123},[117,2027,1136],{"class":152},[117,2029,2030],{"class":123},"1",[117,2032,2033],{"class":152},", rows.",[117,2035,2015],{"class":123},[117,2037,2038],{"class":152},", rows[",[117,2040,1366],{"class":123},[117,2042,2043],{"class":152},"].",[117,2045,2015],{"class":123},[117,2047,70],{"class":152},[117,2049,2050],{"class":191},"setValues",[117,2052,2053],{"class":152},"(rows);\n",[117,2055,2056],{"class":119,"line":1440},[117,2057,368],{"class":152},[10,2059,2060,2061,2064,2065,2067,2068,2071,2072,2075],{},"Store the key under ",[53,2062,2063],{},"Project Settings → Script properties"," as ",[14,2066,104],{},", run it once to grant access, then add a daily time-driven trigger under ",[53,2069,2070],{},"Triggers",". ",[14,2073,2074],{},"/reservations"," returns at most 100 stays per call, filtered by check-in date, so split busy months into weeks. Remember the sheet now holds guest names: share it carefully.",[168,2077,2079],{"id":2078},"a-small-custom-dashboard","A small custom dashboard",[993,2081,2082],{"label":387},[10,2083,2084],{},"Build a small Node.js web app that shows tonight's occupancy, today's arrivals and departures, and stays with an unpaid balance, using the Hotelier Tools REST API. Keep HT_API_KEY on the server only; the browser must call my server, never the API directly. Cache answers for five minutes.",[10,2086,2087],{},"Two rules make this safe: the key stays on the server (anyone who opens a page can read keys in browser code), and you cache, because the API allows 100 requests per minute per IP address.",[26,2089,2091],{"id":2090},"mcp-or-the-rest-api-which-should-you-use","MCP or the REST API: which should you use?",[854,2093,2094,2105],{},[857,2095,2096],{},[860,2097,2098,2100,2103],{},[863,2099],{},[863,2101,2102],{},"MCP server",[863,2104,983],{},[876,2106,2107,2118,2132,2147],{},[860,2108,2109,2112,2115],{},[881,2110,2111],{},"Best for",[881,2113,2114],{},"Asking questions, letting an agent explore while it codes",[881,2116,2117],{},"Scripts, Sheets, dashboards that run on a schedule",[860,2119,2120,2123,2127],{},[881,2121,2122],{},"Address",[881,2124,2125],{},[14,2126,16],{},[881,2128,2129],{},[14,2130,2131],{},"https://dashboard.hotelier.tools/api/v1",[860,2133,2134,2137,2140],{},[881,2135,2136],{},"Auth",[881,2138,2139],{},"API key or browser sign-in",[881,2141,2142,2143,2146],{},"API key (",[14,2144,2145],{},"Authorization: Bearer htk_…",")",[860,2148,2149,2152,2157],{},[881,2150,2151],{},"Docs",[881,2153,2154,2155,2146],{},"MCP Setup page (",[14,2156,668],{},[881,2158,2159,2160,2146],{},"Swagger explorer (",[14,2161,2162],{},"/developer/rest-api",[10,2164,2165,2166,21],{},"Both use the same key and the same permissions. The REST guide is in ",[34,2167,2168],{"href":43},"Little Hotelier API",[26,2170,2172],{"id":2171},"read-vs-write-tools-keep-the-agent-on-a-leash","Read vs write tools: keep the agent on a leash",[10,2174,2175],{},"Coding agents are good at running tools quickly, which is exactly why you should slow them down here.",[236,2177,2178,2184,2190,2208],{},[49,2179,2180,2183],{},[53,2181,2182],{},"Writes run when the agent calls them."," Outside the Hotelier Tools dashboard there is no approval card. Changing a reservation, recording a payment, applying prices or setting stop sell happens as soon as the tool runs. Keep your editor's \"ask before running tools\" setting on, and don't use auto-run modes with this server.",[49,2185,2186,2189],{},[53,2187,2188],{},"Irreversible actions are blocked anyway."," Eight tools (emailing invoices to guests, refunds, filing the INE survey, team invitations, emailing guest links, answering Booking.com questions and the waitlist check that messages guests) are dashboard-only.",[49,2191,2192,2195,2196,2199,2200,2203,2204,2207],{},[53,2193,2194],{},"Reservation changes are two steps."," ",[14,2197,2198],{},"propose_reservation_changes"," shows the before/after; ",[14,2201,2202],{},"apply_reservation_changes"," needs ",[14,2205,2206],{},"confirmed: true",". Read the proposal.",[49,2209,2210,2213,2214,2217,2218,2221,2222,21],{},[53,2211,2212],{},"Never commit a key."," Use ",[14,2215,2216],{},"${HT_API_KEY}","-style references, add local config files to ",[14,2219,2220],{},".gitignore",", and revoke any key that leaks on ",[14,2223,69],{},[26,2225,2227],{"id":2226},"troubleshooting-server-not-showing","Troubleshooting \"server not showing\"",[236,2229,2230,2236,2244,2255,2261,2269,2285,2294],{},[49,2231,2232,2235],{},[53,2233,2234],{},"Nothing appears after editing a config:"," restart the editor or CLI. Most tools read MCP configs at start-up.",[49,2237,2238,2241,2242,21],{},[53,2239,2240],{},"Claude Code or VS Code ignores the server:"," check for ",[14,2243,374],{},[49,2245,2246,2249,2250,2252,2253,21],{},[53,2247,2248],{},"Gemini CLI connects but fails:"," use ",[14,2251,772],{},", not ",[14,2254,378],{},[49,2256,2257,2260],{},[53,2258,2259],{},"401:"," wrong or revoked key, or the environment variable isn't set in that terminal.",[49,2262,2263,2266,2267,21],{},[53,2264,2265],{},"400 \"No Little Hotelier credentials configured\":"," connect Little Hotelier on ",[14,2268,59],{},[49,2270,2271,2278,2279,2281,2282,21],{},[53,2272,2273,2274,2277],{},"423 ",[14,2275,2276],{},"lh_frozen",":"," Little Hotelier sign-in is paused after a failed login (often an expired password). Save the new password on ",[53,2280,55],{}," or press ",[53,2283,2284],{},"Check now & resume",[49,2286,2287,2290,2291,21],{},[53,2288,2289],{},"429:"," too many requests; wait for the time in ",[14,2292,2293],{},"Retry-After",[49,2295,2296,2299,2300,2303],{},[53,2297,2298],{},"The backslash line break fails on Windows:"," PowerShell doesn't use ",[14,2301,2302],{},"\\"," to continue lines. Paste commands on one line, as shown above.",[2305,2306],"demo-cta",{"path":668},[26,2308,2310],{"id":2309},"next-steps","Next steps",[236,2312,2313,2326,2333],{},[49,2314,2315,2316,2320,2321,2325],{},"Not a developer? ",[34,2317,2319],{"href":2318},"/blog/connect-claude-to-little-hotelier","Connect Claude"," or ",[34,2322,2324],{"href":2323},"/blog/connect-chatgpt-to-little-hotelier","ChatGPT"," in the browser instead.",[49,2327,2328,2329,21],{},"New to the idea? Read ",[34,2330,2332],{"href":2331},"/blog/what-is-mcp-server-hotels","what an MCP server is",[49,2334,2335,2336,21],{},"Want spreadsheets without code? See ",[34,2337,2339],{"href":2338},"/blog/export-little-hotelier-reservations-excel","exporting reservations to Excel",[2341,2342,2343],"style",{},"html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":113,"searchDepth":288,"depth":288,"links":2345},[2346,2347,2353,2358,2359,2360,2361],{"id":28,"depth":288,"text":29},{"id":162,"depth":288,"text":163,"children":2348},[2349,2350,2351,2352],{"id":170,"depth":297,"text":171},{"id":386,"depth":297,"text":387},{"id":479,"depth":297,"text":480},{"id":674,"depth":297,"text":675},{"id":970,"depth":288,"text":971,"children":2354},[2355,2356,2357],{"id":987,"depth":297,"text":988},{"id":1562,"depth":297,"text":1563},{"id":2078,"depth":297,"text":2079},{"id":2090,"depth":288,"text":2091},{"id":2171,"depth":288,"text":2172},{"id":2226,"depth":288,"text":2227},{"id":2309,"depth":288,"text":2310},"Add the Hotelier Tools MCP server to Claude Code, Cursor, VS Code, Windsurf or Gemini CLI, then build occupancy reports, a Sheets sync or a dashboard.","md",{"seoTitle":2365,"date":2366,"category":2367,"tags":2368,"keywords":2373,"feature":2381,"demoPath":668,"cover":2382,"coverAlt":2383,"faq":2384},"Little Hotelier MCP in Claude Code, Cursor and VS Code","2026-10-03","ai",[2369,2370,386,2371,2372],"mcp","claude code","vs code","api",[2374,2375,2376,2377,2378,2379,2380],"claude code mcp setup","cursor mcp.json","vscode mcp.json","claude code for non developers","little hotelier mcp","gemini cli mcp","windsurf mcp config","api-mcp","/images/blog/demo/en/mcp-setup.webp","MCP setup guide in Hotelier Tools: a What is MCP? explanation and Client configuration tabs for Claude Desktop, VS Code, Cursor and Custom / SDK, with Claude Desktop selected and its claude_desktop_config.json snippet",[2385,2388,2391,2394,2397],{"q":2386,"a":2387},"What is the claude mcp add command for Little Hotelier?","Run: claude mcp add --transport http hotelier-tools https://dashboard.hotelier.tools/api/mcp --header \"Authorization: Bearer htk_YOUR_API_KEY\". Replace the key with one from Developer, API Keys in Hotelier Tools, then check it with /mcp inside Claude Code.",{"q":2389,"a":2390},"Where does mcp.json live in Cursor and VS Code?","Cursor reads ~/.cursor/mcp.json for every project and .cursor/mcp.json inside a project. VS Code reads .vscode/mcp.json in the workspace, and a user-level file you open with the command MCP: Open User Configuration. VS Code uses the key servers, not mcpServers.",{"q":2392,"a":2393},"Do I need to be a developer to use Claude Code with my hotel data?","No. You install Claude Code, paste one command and then ask in plain words. It helps to know where your files go and how to run a script, but Claude Code can explain each step as it works.",{"q":2395,"a":2396},"Can I sign in instead of using an API key?","Yes, in clients that support OAuth. Add the server URL without a header, then sign in when the client asks: in Claude Code run /mcp and choose to authenticate. The sign-in lasts 30 days. Keys are better for scripts that run unattended.",{"q":2398,"a":2399},"Is this an official Little Hotelier or SiteMinder API?","No. Hotelier Tools is independent and is not affiliated with or endorsed by SiteMinder or Little Hotelier. It connects with your property's own Little Hotelier login and offers its own REST API and MCP server.","/blog/en-gb/little-hotelier-mcp-claude-code-cursor-vscode",{"title":5,"description":2362},"blog/en-gb/little-hotelier-mcp-claude-code-cursor-vscode","GC2CpoxlpwobY1_Zp1WnhIjVpayPb7B4DdhgK8ngRjs",[2405,2406,2407,2408,2409,2410,2411,2412,863],"de","en-gb","en","es","fr","id","it","pt",[2414,2435,2454,2474,2494,2513,2533,2553,2570,2589,2606,2620,2637,2656,2674,2693,2713,2732,2750,2754,2774,2793,2812,2827,2845],{"path":2415,"title":2416,"description":2417,"meta":2418},"/blog/en-gb/send-invoice-to-guest-at-checkout","A guest asked for an invoice: how to send it automatically at checkout from Little Hotelier","Booking.com doesn't invoice your guests, you do. Send the invoice from Little Hotelier by hand, or have it emailed automatically when the guest checks out.",{"date":2366,"category":2419,"tags":2420,"keywords":2426,"feature":2419,"cover":2433,"coverAlt":2434},"invoicing",[2421,2422,2423,2424,2425],"invoices","checkout","booking.com","little hotelier","automation",[2427,2428,2429,2430,2431,2432],"how to send invoice to guest on booking com","send invoice to guest little hotelier","little hotelier invoice","hotel invoice at checkout","guest asked for invoice hotel","booking.com guest invoice","/images/blog/demo/en/invoice-at-checkout.webp","Invoice on leave page in Hotelier Tools: the Automatic invoicing at check-out task running every day at 12:00, a date range with Search reservations, and the reservations table with an Auto-invoice button for each stay",{"path":2436,"title":2437,"description":2438,"meta":2439},"/blog/en-gb/ai-assistant-hotel-front-desk","AI assistant for a small hotel front desk: what it can safely do (with approvals)","An AI assistant can look up bookings, draft guest replies and prepare changes at a small hotel. What it can safely do, and why you approve every change.",{"date":2366,"category":2367,"tags":2440,"keywords":2444,"feature":2451,"cover":2452,"coverAlt":2453},[2367,2441,2442,2443,2424],"ai assistant","front desk","approvals",[2445,2446,2447,2448,2449,2450],"ai front desk hotel","ai receptionist hotel","ai hotel assistant","ai voice assistant hotel","ai agent for hotel management","best ai apps for hotel owners","ai-assistant","/images/blog/demo/en/ai-chat-start.webp","Hotelier Tools AI assistant start screen saying that anything that changes data asks for confirmation first, with suggested questions and the chat history on the left",{"path":2455,"title":2456,"description":2457,"meta":2458},"/blog/en-gb/little-hotelier-integrations","Best Little Hotelier integrations in 2026: accounting, check-in, pricing, messaging and AI","What connects to Little Hotelier in 2026: Xero and QuickBooks exports, Chekin and Duve check-in, pricing tools, messaging, AI, and free add-ons.",{"date":2366,"category":2372,"tags":2459,"keywords":2464,"feature":2381,"cover":2472,"coverAlt":2473},[2460,2461,2462,2463,2424],"integrations","app store","xero","chekin",[2465,2466,2467,2468,2469,2470,2471],"little hotelier integrations","little hotelier xero integration","little hotelier app store","little hotelier booking widget","little hotelier wordpress plugin","little hotelier chekin","little hotelier zapier","/images/blog/demo/en/developer-portal.webp","Developer portal in Hotelier Tools with cards for REST API & Swagger, MCP setup, API keys and LH methods, and an Authentication box with a cURL example using a placeholder API key",{"path":2475,"title":2476,"description":2477,"meta":2478},"/blog/en-gb/booking-com-invalid-card-no-show","Booking.com invalid credit card or no-show: what to do, step by step","Mark the card invalid, give the guest 24 hours, then cancel with no commission. Plus no-show deadlines, declined virtual cards and how to catch it early.",{"date":2366,"category":2479,"tags":2480,"keywords":2484,"feature":2491,"cover":2492,"coverAlt":2493},"operations",[2423,2481,2482,2424,2483],"no-show","payments","automated checks",[2485,2486,2487,2488,2489,2490],"booking.com invalid credit card","booking.com no show fee","booking.com virtual card declined","mark credit card invalid booking.com","booking.com reservation cancelled invalid credit card","booking.com no show commission","automated-checks","/images/blog/demo/en/automated-checks-issues.webp","Issues page in Hotelier Tools with 20 open, 5 fixed and 25 total issues, and reservations listed with an outstanding balance warning at arrival and a Verify button",{"path":2495,"title":2496,"description":2497,"meta":2498},"/blog/en-gb/little-hotelier-api","Does Little Hotelier have an API? The 2026 answer, and how to get your data out","No API key for your bookings or guests. What SiteMinder offers officially, and how to read your Little Hotelier data over REST in minutes.",{"date":2366,"category":2372,"tags":2499,"keywords":2503,"feature":2381,"cover":2511,"coverAlt":2512,"featured":1040},[2372,2500,2424,2501,2502],"rest","siteminder","developers",[2504,2505,2506,2507,2508,2509,2510],"little hotelier api","little hotelier api documentation","little hotelier api key","siteminder api","siteminder exchange api","little hotelier rest api","little hotelier integration","/images/blog/demo/en/rest-api-reference.webp","REST API reference page in Hotelier Tools with the base URL, an openapi.json download, the Quick authorize box (Bearer token field, Authorize Swagger, Use my session) and code templates in cURL, JavaScript, Python and PowerShell",{"path":2514,"title":2515,"description":2516,"meta":2517},"/blog/en-gb/dynamic-pricing-little-hotelier","Dynamic pricing for small hotels on Little Hotelier: competitor prices, local events and rules","Price by demand on Little Hotelier: a simple weekly routine, the native options, and recommendations with the reason that apply only when you confirm.",{"date":2366,"category":2518,"tags":2519,"keywords":2523,"feature":2530,"cover":2531,"coverAlt":2532},"pricing",[2520,2521,2522,2424,2518],"dynamic pricing","revenue management","competitor prices",[2524,2525,2526,2527,2528,2529],"little hotelier dynamic pricing","hotel dynamic pricing tool","hotel rate shopping tool","revenue management b&b","how to set hotel room rates","how to set room rates on booking com","dynamic-pricing","/images/blog/demo/en/price-recommendations.webp","Price recommendations page in Hotelier Tools for 14 nights: the Doble Estándar table with the current rate, recommended rate, change, market median and what the guest pays per night, and an Apply to Little Hotelier bar with no prices selected",{"path":2534,"title":2535,"description":2536,"meta":2537},"/blog/en-gb/guest-registration-rules-by-country","Guest registration rules by country (2026): Spain, Italy, Portugal, Germany, France, Brazil, Thailand and Indonesia","Which guests hotels must register, what data, how fast and where: Spain, Italy, Portugal, Germany, France, Brazil, Thailand, Indonesia. Official links.",{"date":2366,"category":2538,"tags":2539,"keywords":2542,"cover":2551,"coverAlt":2552},"compliance",[2540,2538,2410,2541,2424],"guest registration","police",[2543,2544,2545,2546,2547,2548,2549,2550],"hotel check in id requirements","why do hotels scan your passport","guest registration hotel police","alloggiati web","meldeschein hotel","fiche de police hotel","siba alojamento local","tm30 hotel","/images/blog/demo/en/automated-checks-moment-on-arrival.webp","When they arrive checks in Hotelier Tools: ID / passport (police register), physical room assignment and address and origin validation switched on, with what each check can and cannot do",{"path":2554,"title":2555,"description":2556,"meta":2557},"/blog/en-gb/hotel-front-desk-checklist-automation","Hotel front desk daily checklist for Little Hotelier: 8 problems to catch before guests arrive","A daily front-desk checklist for Little Hotelier: 8 reservation problems to catch before arrival, where to spot each one, and how to automate five of them.",{"date":2366,"category":2479,"tags":2558,"keywords":2561,"feature":2491,"cover":2568,"coverAlt":2569},[2442,2559,2560,2425,2424],"checklist","check-in",[2562,2563,2564,2565,2566,2567],"hotel front desk daily checklist","hotel front desk checklist template","hotel check in checklist","little hotelier unallocated reservations","front desk checklist little hotelier","hotel automation software","/images/blog/demo/en/automated-checks-lifecycle.webp","Automated Checks page in Hotelier Tools: how the checks work in four steps, a Nothing runs any check yet notice suggesting Before they arrive, and The journey of a reservation through its five stages",{"path":2571,"title":2572,"description":2573,"meta":2574},"/blog/en-gb/booking-com-commission","How much commission does Booking.com take? (And how to see your real net in Little Hotelier)","There's no single rate: you pay the % in your agreement, plus programmes and payment fees. What it's charged on, VAT, and your real net per booking.",{"date":2366,"category":2575,"tags":2576,"keywords":2580,"cover":2587,"coverAlt":2588},"tips",[2423,2577,2424,2578,2579],"commission","userscript","vat",[2581,2582,2583,2584,2585,2586],"how much commission does booking.com take","booking com commission rates for hotels","booking com commission calculator","booking.com commission vat","booking.com genius commission","booking.com payment fee","/images/scripts/show-booking-commissions/to.png","Little Hotelier reservation summary (Spanish interface) with the Booking.com commission, payment fee and approximate net added by a free script",{"path":2590,"title":2591,"description":2592,"meta":2593},"/blog/en-gb/connect-chatgpt-to-little-hotelier","How to connect ChatGPT to Little Hotelier (plus 18 prompts for small hotels)","Connect ChatGPT to Little Hotelier with developer mode and an MCP app, check what your plan allows, and copy 18 prompts for arrivals, payments and pricing.",{"date":2366,"category":2367,"tags":2594,"keywords":2597,"feature":2381,"cover":2604,"coverAlt":2605},[2595,2369,2367,2596,2424],"chatgpt","prompts",[2598,2599,2600,2601,2602,2603],"connect chatgpt to little hotelier","chatgpt mcp connector","chatgpt connectors mcp","chatgpt prompts for hotels","chatgpt hotel management","chatgpt developer mode mcp","/images/blog/demo/en/mcp-oauth-consent.webp","Hotelier Tools Authorize MCP access page that an AI assistant opens when it connects, with a 30-day token notice and the Deny and Allow access buttons",{"path":2607,"title":2608,"description":2609,"meta":2610},"/blog/en-gb/connect-claude-to-little-hotelier","How to connect Claude to Little Hotelier (MCP, step by step)","Connect Claude to Little Hotelier with a custom connector: paste one URL, sign in, allow access. First prompts, write safety and troubleshooting.",{"date":2366,"category":2367,"tags":2611,"keywords":2613,"feature":2381,"cover":2382,"coverAlt":2619,"featured":1040},[192,2369,2367,2612,2424],"connectors",[2614,2378,2615,2616,2617,2618],"connect claude to little hotelier","claude mcp connectors","claude desktop mcp setup","claude custom connector","little hotelier ai","Hotelier Tools MCP setup guide with the What is MCP? explanation and the Claude Desktop tab selected, showing the steps and the configuration snippet with the MCP server URL",{"path":2621,"title":2622,"description":2623,"meta":2624},"/blog/en-gb/download-all-little-hotelier-invoices","How to download all your Little Hotelier invoices at once (for your quarterly tax return)","Little Hotelier can zip invoices that already exist. Here's how, plus how to create the missing ones and send your accountant one ZIP and CSV per quarter.",{"date":2366,"category":2419,"tags":2625,"keywords":2629,"feature":2419,"cover":2635,"coverAlt":2636,"featured":1040},[2421,2626,2424,2627,2628],"accounting","quarterly tax","zip",[2630,2429,2631,2632,2633,2634],"download all invoices little hotelier","little hotelier invoice report","little hotelier billing","little hotelier export invoices","little hotelier xero","/images/blog/demo/en/invoices-by-quarter.webp","Invoices page in Hotelier Tools with 66 invoices in total, Q4 and Q3 2026 each with Preview CSV and ZIP buttons, and September 2026 open as a table of invoice numbers, guests, tax IDs, check-out dates and totals",{"path":2638,"title":2639,"description":2640,"meta":2641},"/blog/en-gb/export-little-hotelier-reservations-excel","How to export reservations and guest lists from Little Hotelier to Excel (before guest data is masked)","Little Hotelier masks guest details 180 days after check-out. Export reservations and guest lists to Excel or Google Sheets now, by hand or automatically.",{"date":2366,"category":2372,"tags":2642,"keywords":2647,"feature":2381,"cover":2472,"coverAlt":2655},[2643,2644,2645,2646,2424],"export","excel","google sheets","reports",[2648,2649,2650,2651,2652,2653,2654],"export reservations little hotelier","little hotelier reports","little hotelier export excel","little hotelier csv","hotel guest list excel","hotel reservation spreadsheet","little hotelier guest data masked","Hotelier Tools developer portal with cards for REST API and Swagger, MCP setup, API keys and LH methods, above an authentication example using an API key",{"path":2657,"title":2658,"description":2659,"meta":2660},"/blog/en-gb/ine-hotel-occupancy-survey","How to fill in the INE hotel occupancy survey from Little Hotelier (Spain)","Mandatory if the INE selects your hotel, with fines up to €30,050. What the survey asks, how IRIA works, and how to fill it in from Little Hotelier.",{"date":2366,"category":2538,"tags":2661,"keywords":2664,"feature":2671,"cover":2672,"coverAlt":2673},[2662,2663,2538,2646,2424],"ine","spain",[2665,2666,2667,2668,2669,2670],"ine hotel occupancy survey","ine survey spain hotel","encuesta ocupacion hotelera ine","encuesta ine hoteles","iria ine encuesta","encuesta ine obligatoria multa","ine-reports","/images/blog/demo/en/ine-guest-origins-report.webp","Guest Origin Statistics (INE HOT survey) in Hotelier Tools for 27 September to 3 October 2026: 8 arrivals, 24 overnight stays, 3.4 guests a day and 3 with missing data, above the Daily summary, By guest origin, Rooms, ADR by client and Data quality tabs",{"path":2675,"title":2676,"description":2677,"meta":2678},"/blog/en-gb/hotel-do-not-rent-list","How to keep a 'do not rent' list of problem guests in Little Hotelier (legally)","A hotel can keep a do-not-rent list under GDPR if it sticks to facts. What to record, what never to write, and how to get alerts in Little Hotelier.",{"date":2366,"category":2479,"tags":2679,"keywords":2684,"feature":2491,"cover":2691,"coverAlt":2692},[2680,2681,2682,2683,2424],"do not rent list","gdpr","guests","watchlist",[2685,2686,2687,2688,2689,2690],"hotel do not rent list","hotel do not rent list template","hotel guest blacklist","do not rent list gdpr","block guest booking.com","little hotelier guest notes","/images/blog/demo/en/automated-checks-do-not-rebook-list.webp","Do-not-rebook list in Hotelier Tools: the nightly check card, a reservation check showing a strong match with the factual reason, and one entry with Edit, Deactivate and Delete",{"path":2694,"title":2695,"description":2696,"meta":2697},"/blog/en-gb/booking-com-guest-messages","How to manage Booking.com guest messages without living in the extranet","Pulse, templates, scheduled messages and auto-replies, how to spot fake Booking.com messages, and one inbox for Booking.com, WhatsApp and email.",{"date":2366,"category":2682,"tags":2698,"keywords":2702,"feature":2710,"cover":2711,"coverAlt":2712},[2423,2699,2700,2701,2424],"guest messages","inbox","templates",[2703,2704,2705,2706,2707,2708,2709],"booking.com messages","booking.com messages not working","booking com scheduled messages","booking com email template","booking.com automatic replies","booking.com phishing messages","booking.com guest q&a","guest-inbox","/images/blog/demo/en/guest-inbox-ai-draft-availability.webp","Hotelier Tools guest inbox with WhatsApp, Email and Booking.com filters, an email from a guest asking about a double room in September, the AI plan in draft with an editable English reply, and the private assistant panel",{"path":2714,"title":2715,"description":2716,"meta":2717},"/blog/en-gb/hotel-waitlist-sold-out-dates","How to run a waitlist for sold-out dates (and fill cancellations fast)","Keep a list of guests who want your full dates and offer freed rooms first. A spreadsheet method, then an automatic watch and a public signup form.",{"date":2366,"category":2682,"tags":2718,"keywords":2723,"feature":2719,"cover":2730,"coverAlt":2731},[2719,2720,2721,2424,2722],"waitlist","cancellations","direct booking","availability",[2724,2725,2726,2727,2728,2729],"hotel waitlist","waitlisted hotel meaning","hotel waiting list sold out","hotel cancellation waitlist","fill hotel cancellations","hotel waiting list form","/images/blog/demo/en/availability-waiting-list.webp","Availability queue page in Hotelier Tools with History and Check the queue now, the Checks on the queue card offering Check every night at 01:00, and the Add a stay to watch form with nights, rooms needed, room types and guest details",{"path":2733,"title":2734,"description":2735,"meta":2736},"/blog/en-gb/whatsapp-little-hotelier","How to use WhatsApp with Little Hotelier (Messaging hub, WhatsApp Business and other options)","Little Hotelier's Messaging hub uses the official WhatsApp Business API. Compare it with the free WhatsApp Business app and a shared inbox, with templates.",{"date":2366,"category":2682,"tags":2737,"keywords":2741,"feature":2710,"cover":2748,"coverAlt":2749},[2738,2739,2424,2740,2700],"whatsapp","messaging","guest engagement",[2742,2743,2744,2745,2746,2747],"little hotelier whatsapp","whatsapp for hotels","whatsapp business api for hotels","whatsapp business app hotel","whatsapp templates hotel check-in","little hotelier messaging hub","/images/blog/demo/en/guest-inbox-ai-plan-late-arrival.webp","Hotelier Tools guest inbox with a WhatsApp conversation from Ingrid Kowalski about a late arrival (identity verified, booking linked), an AI plan in draft with an editable reply, and the private Assistant pane",{"path":2400,"title":5,"description":2362,"meta":2751},{"date":2366,"category":2367,"tags":2752,"keywords":2753,"feature":2381,"cover":2382,"coverAlt":2383},[2369,2370,386,2371,2372],[2374,2375,2376,2377,2378,2379,2380],{"path":2755,"title":2756,"description":2757,"meta":2758},"/blog/en-gb/little-hotelier-alternatives","Little Hotelier alternatives in 2026: an honest comparison with Cloudbeds, Mews, Beds24, Lodgify, Smoobu and Hostaway","Cloudbeds, Mews, Beds24, Lodgify, Smoobu or Hostaway? Who each suits, how it charges, API access, and when staying on Little Hotelier makes more sense.",{"date":2366,"category":2575,"tags":2759,"keywords":2764,"cover":2772,"coverAlt":2773},[2760,2761,2762,2424,2763],"pms","comparison","alternatives","cloudbeds",[2765,2766,2767,2768,2769,2770,2771],"little hotelier alternatives","little hotelier vs cloudbeds","little hotelier reviews complaints","little hotelier pricing","is little hotelier part of siteminder","best pms for small hotels","little hotelier vs lodgify","/images/blog/demo/en/dashboard-overview.webp","Hotelier Tools home dashboard for the demo property Hotel Demo Sol: an Open AI chat card, a notice that two guest-messaging channels need attention, and status tiles for Little Hotelier, Booking.com, AI knowledge and the pricing city",{"path":2775,"title":2776,"description":2777,"meta":2778},"/blog/en-gb/little-hotelier-chrome-extensions","Little Hotelier Chrome extensions: free userscripts that make it faster","Free userscripts for Little Hotelier: calendar prices, wider tables, Booking.com commission estimates and one-click invoices. How to install them safely.",{"date":2366,"category":2575,"tags":2779,"keywords":2784,"cover":2791,"coverAlt":2792},[2780,2781,2782,2424,2783],"chrome extension","tampermonkey","userscripts","productivity",[2785,2786,2787,2788,2789,2790],"little hotelier chrome extension","tampermonkey scripts","userscript chrome","little hotelier calendar prices","little hotelier full width","little hotelier booking.com commission","/images/scripts/prices-display/to.png","Little Hotelier calendar (Spanish interface) with each night's price shown under every room type, added by the Prices Display script",{"path":2794,"title":2795,"description":2796,"meta":2797},"/blog/en-gb/little-hotelier-tips","Little Hotelier tips and hidden features most owners don't know (2026)","20 Little Hotelier tips: faster calendar, passkeys, minimum rates, gap nights, booking links, audit log and free scripts that show prices in the calendar.",{"date":2366,"category":2575,"tags":2798,"keywords":2801,"feature":2809,"cover":2810,"coverAlt":2811},[2575,2799,2800,2782,2424],"how to","calendar",[2802,2803,2804,2805,2806,2807,2808],"little hotelier how to use","little hotelier tutorial","little hotelier guide","little hotelier manual","little hotelier tips","little hotelier hidden features","little hotelier calendar","dashboard","/images/scripts/full-width-reservation-table/to.png","Little Hotelier Reservations page (Spanish interface) stretched to the full screen width by the Full Width Reservation Table script: search filters, the Buscar button, 36 reservations found and the Exportar link",{"path":2813,"title":2814,"description":2815,"meta":2816},"/blog/en-gb/ses-hospedajes-little-hotelier","SES Hospedajes with Little Hotelier: how to register guests (partes de viajeros) without double work","Spain's SES.Hospedajes guest register explained: who, what data, the 24-hour deadlines, how to send it, and how Little Hotelier can send it for you.",{"date":2366,"category":2538,"tags":2817,"keywords":2819,"cover":2551,"coverAlt":2826},[2818,2663,2538,2540,2424],"ses hospedajes",[2818,2820,2821,2822,2823,2824,2825],"ses hospedajes in english","ses hospedajes little hotelier","parte de viajeros","ses hospedajes datos obligatorios","ses hospedajes servicio web","como registrar viajeros ses hospedajes","When they arrive settings in Hotelier Tools with the ID / passport (police register), Physical room assignment and Address and origin validation checks switched on, each with what it can and cannot do",{"path":2828,"title":2829,"description":2830,"meta":2831},"/blog/en-gb/little-hotelier-cta-ctd-stop-sell","What do CTA, CTD, minimum stay and stop sell mean in Little Hotelier?","CTA stops check-ins, CTD stops check-outs, min stay sets the shortest stay, stop sell closes sales. What each means and how to set it in Little Hotelier.",{"date":2366,"category":2518,"tags":2832,"keywords":2837,"feature":2530,"cover":2531,"coverAlt":2844},[2833,2834,2835,2836,2424],"restrictions","cta","ctd","stop sell",[2838,2839,2840,2841,2842,2843],"what is cta in little hotelier","little hotelier cta ctd","closed to arrival meaning","stop sell meaning","siteminder stop sell","minimum length of stay hotel","Price recommendations in Hotelier Tools for the Doble Estándar room, 3 to 16 October 2026: current and recommended price per night, a CTA / CTD column with A and D toggles, the minimum stay, a Channel column and an Apply to Little Hotelier button",{"path":2846,"title":2847,"description":2848,"meta":2849},"/blog/en-gb/what-is-mcp-server-hotels","What is an MCP server? A plain-English guide for hotel owners (and which PMS have one)","An MCP server lets Claude or ChatGPT read and act on your hotel software. Plain-English guide, safety tips, and which PMS have one as of October 2026.",{"date":2366,"category":2367,"tags":2850,"keywords":2851,"feature":2381,"cover":2382,"coverAlt":2859,"featured":1040},[2369,2367,192,2595,2760],[2852,2853,2854,2378,2855,2856,2857,2858],"what is mcp server","mcp server for hotels","mcp server for hotel booking","apaleo mcp server","mews mcp server","cloudbeds mcp server","what is mcp server in claude","MCP setup guide in Hotelier Tools with a What is MCP? explanation and Client configuration tabs for Claude Desktop, VS Code, Cursor and Custom / SDK, showing the Claude Desktop config with the server address",1791141216727]