ax-check.com
by Gauge
J
Homebase
joinhomebase.com
ax-check.com
Checked 19 September 2026
B
73/100
Agents need your login
Pricing is clear upfront, but developer docs are missing.
Plans list plainly: Basic $0, Essentials $30, Plus $70, All-in-One $120 per location/month. No API, CLI, or SDK docs were found for deeper integration.
2 fixes to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no joinhomebase.com account. Recorded 19 September 2026 on Pi.
3 recorded · 7m 51s
7m 51s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
The user wants me to build a simple example using Homebase. They want to know how pricing works, and whether this product will be easy for me to manage. They also want me to check if I get blocked. If the product has no developer workflow I can act on, say so plainly and stop. Stay light: use hosted product through SDK or API. Don't start local service stacks or wait for long-running commands.
Let me start by understanding what Homebase is. Homebase could be multiple things:
- Homebase - the small business scheduling/time tracking software (joinhomebase.com)
- Homebase - a database/SQLite-related tool
- Homebase - something else
Let me research. I should check if there's an SDK or API available.
Let me first explore the working directory and search for any context about Homebase.
Let me also check the environment. I should not start local services. Let me investigate.
Let me search the web? I don't have web access directly, but I can use bash to curl things. Let me check what's in the repo first.
✓$ ls -la && echo "---" && find . -maxdepth 2 -type f 2>/dev/null | head -50✓└{"content":[{"text":"total 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 19 00:09 ..\ndrwxr-xr-x 8 root root 4096 Sep 18 08:00…ctrl+o
{"content":[{"text":"total 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 19 00:09 ..\ndrwxr-xr-x 8 root root 4096 Sep 18 08:00 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n---\n./.gitignore\n./.git/COMMIT_EDITMSG\n./.git/config\n./.git/index\n./.git/HEAD\n./.git/description\n","type":"text"}]}✓$ env | grep -iE 'homebase|api|token|key' | sed 's/=.*/=<redacted>/' | head -20✓└{"content":[{"text":"PI_GATEWAY_API_KEY=<redacted>\nGIT_CONFIG_KEY_0=<redacted>\n","type":"text"}]}
›Thinking…
The repo is essentially empty. Let me research Homebase. There are a few "Homebase" products:
- Homebase (joinhomebase.com) - small business employee scheduling, time clock, payroll, team communication. This is a well-known product.
- Homebase (homebase.io) - a real estate AI/CRM product.
- Roommates/homebase - older.
The user is asking about "Homebase" and wants a simple example using SDK or API, and pricing info.
Let me search the web via curl to figure out which Homebase and if there's a developer API.
✓$ curl -sL --max-time 15 "https://joinhomebase.com/api" -o /dev/null -w "%{http_code} %{url_effective}\n" 2>&1 | head -5✓└{"content":[{"text":"404 https://www.joinhomebase.com/api\n","type":"text"}]}
✓$ curl -sL --max-time 15 "https://homebase.io" -o /dev/null -w "%{http_code} %{url_effective}\n" 2>&1 | head -5✓└{"content":[{"text":"000 https://homebase.io/\n","type":"text"}]}
›Thinking…
Let me search more carefully. There are two distinct "Homebase" products:
- Homebase (joinhomebase.com) - small business team management
- Homebase (homebase.io) - actually I think there's "Homebase" which is a vacation rental / real estate proptech. Let me check.
Actually homebase.io returned 000 (couldn't resolve or failed). Let me investigate further.
The user says "If this product has no developer workflow you can act on, say so plainly and stop." This suggests they want me to determine whether Homebase has a developer API/SDK that I can use.
Let me search. I'll use curl to search engines or check known docs.
✓$ curl -sL --max-time 15 "https://www.joinhomebase.com/" -o /tmp/hb.html -w "%{http_code}\n"; grep -oiE '(api|developer|sdk|integrations)' /tmp/hb.html | sort -u | head✓└{"content":[{"text":"200\nIntegrations\nintegrations\n","type":"text"}]}
×$ curl -sL --max-time 15 "https://docs.homebase.io" -o /dev/null -w "%{http_code} %{url_effective}\n" 2>&1; curl -sL --max-time 15 "https://developers.joinhomebase.com" -o /dev/null -w "%{http_code} %{u…✓└{"content":[{"text":"000 https://docs.homebase.io/\n000 https://developers.joinhomebase.com/\n\n\nCommand exited with code 6","type":"text"}],"details":{}}ctrl+o
curl -sL --max-time 15 "https://docs.homebase.io" -o /dev/null -w "%{http_code} %{url_effective}\n" 2>&1; curl -sL --max-time 15 "https://developers.joinhomebase.com" -o /dev/null -w "%{http_code} %{url_effective}\n" 2>&1
›Thinking…
The joinhomebase.com site has "Integrations" mentions. Let me look for developer docs. Let me search more.
✓$ grep -oiE 'href="[^"]*"' /tmp/hb.html | grep -iE 'api|developer|integrat|partner' | sort -u | head -30✓└{"content":[{"text":"href=\"/become-a-partner\"\nhref=\"/integrations\"\n","type":"text"}]}
✓$ curl -sL --max-time 15 "https://www.joinhomebase.com/integrations" -o /tmp/hb-int.html -w "%{http_code}\n"; grep -oiE '(api|developer|sdk|auth|oauth|webhook)' /tmp/hb-int.html | sort -u✓└{"content":[{"text":"200\nauth\n","type":"text"}]}
›Thinking…
Let me look deeper at the integrations page and partner page. Homebase (joinhomebase.com) is a small business HR/scheduling platform. It doesn't have a public developer API that I'm aware of — it has partnerships and some integrations (like POS systems, payroll). There's no public SDK.
But wait — there might be another "Homebase" that's more developer-focused. Let me think. There's:
- Homebase (joinhomebase.com) - SMB scheduling/payroll - no public API.
- Homebase (homebase.com) - real estate tech company (homebase.com?). Actually Homebase is a real estate/proptech startup that does renters' insurance / home financing. homebase.com might redirect.
- @homebase - ?
Also there's "Homebase" the database? No that's "Homebase" from the Datomic world? Actually there's "Homebase" which is a ClojureScript database (hometower? no). There's "homebase" a reactive database for ClojureScript. Hmm.
Wait, there's a well-known "Homebase" that IS developer-facing: Homebase.io? Let me check. Actually I recall "Homebase" (homebase.io) is a "site builder / no-code"? Not sure.
Let me search via a search engine API. I can try DuckDuckGo HTML.
✓$ curl -sL --max-time 20 "https://html.duckduckgo.com/html/?q=Homebase+developer+API+SDK+pricing" -A "Mozilla/5.0" -o /tmp/ddg.html -w "%{http_code}\n"; grep -oiE 'result__a[^>]*>[^<]+' /tmp/ddg.html | …✓└{"content":[{"text":"202\n","type":"text"}]}ctrl+o
curl -sL --max-time 20 "https://html.duckduckgo.com/html/?q=Homebase+developer+API+SDK+pricing" -A "Mozilla/5.0" -o /tmp/ddg.html -w "%{http_code}\n"; grep -oiE 'result__a[^>]*>[^<]+' /tmp/ddg.html | head -20
×$ curl -sL --max-time 15 "https://homebase.com" -o /dev/null -w "%{http_code} %{url_effective}\n" 2>&1✓└{"content":[{"text":"000 https://homebase.com/\n\n\nCommand exited with code 28","type":"text"}],"details":{}}
›Thinking…
DuckDuckGo returned 202 (likely a challenge, no results). Let me try a different search approach or check the actual Homebase website more thoroughly. Let me look at the integrations/partner pages of joinhomebase.com to determine if there's a public API.
✓$ grep -oiE 'href="[^"]*"' /tmp/hb-int.html | sort -u | grep -iE 'api|developer|partner|post|shopify|square|clover|payroll|pos' | head -40✓└{"content":[{"text":"href=\"#ppi2026-payroll-price\"\nhref=\"/become-a-partner\"\nhref=\"/integrations/clover\"\nhref=\"/integrations/millennium-payroll-service…ctrl+o
{"content":[{"text":"href=\"#ppi2026-payroll-price\"\nhref=\"/become-a-partner\"\nhref=\"/integrations/clover\"\nhref=\"/integrations/millennium-payroll-services\"\nhref=\"/integrations/shopify\"\nhref=\"/integrations/square\"\nhref=\"/integrations/square-payroll\"\nhref=\"/integrations/surepayroll\"\nhref=\"/payroll\"\nhref=\"/switch-payroll\"\n","type":"text"}]}✓$ curl -sL --max-time 15 "https://www.joinhomebase.com/become-a-partner" -o /tmp/hb-partner.html -w "%{http_code}\n"; grep -oiE '(api|developer|sdk|oauth|webhook|documentation|docs)' /tmp/hb-partner.htm…✓└{"content":[{"text":"200\n","type":"text"}]}ctrl+o
curl -sL --max-time 15 "https://www.joinhomebase.com/become-a-partner" -o /tmp/hb-partner.html -w "%{http_code}\n"; grep -oiE '(api|developer|sdk|oauth|webhook|documentation|docs)' /tmp/hb-partner.html | sort -u
›Thinking…
The partner page doesn't mention API/developer/SDK/OAuth/webhook/documentation. Let me look at its content to see what the partner program entails.
✓$ grep -oiE '<(h1|h2|h3|p|li)[^>]*>[^<]{5,200}' /tmp/hb-partner.html | sed 's/<[^>]*>//g' | head -50✓└{"content":[{"text":"Become a Partner\nHowdy, partner.\nPartner with Homebase to offer powerful HR tools to small businesses.\nWhat other products can power you…ctrl+o
{"content":[{"text":"Become a Partner\nHowdy, partner.\nPartner with Homebase to offer powerful HR tools to small businesses.\nWhat other products can power your restaurant’s success?\nAffiliate Partners\nI am a company that wants to promote Homebase to my customers through a linking relationship.\nReferrals\nI am a Homebase user who wants to refer other businesses to Homebase.\nIntegrations\nI am a company interested in a technology integration with Homebase to expand my offerings.\n100,000+ small business rely on Homebase.\nBut don’t take our word for it.\n9.5 of 10\nBest Employee Scheduling\nBest Payroll Services\n4.8 of 5\nTop 50 Business App\nBest Employee Scheduling Software\nRatings as of March 2026\nHomebase integrates with PAR POS to offer merchants all-in-one scheduling, complete timesheet management, and powerful labor cost and sales reporting.\nCombine your Square Register data with Homebase's employee scheduling and time-tracking features to save time, money, and paperwork.\nExport timesheets from Homebase that are specifically formatted for Wells Fargo to make payroll prep a breeze.\nConnect your Clover POS with Homebase to run Time Clock by Homebase on your devices, sync employees and sales, schedule your team with reminders, and track labor costs against sales in real time.\nExport timesheets from Homebase that are formatted for Paychex Flex or Paychex Preview to make payroll prep a breeze.\nHomebase integrates with Toast to offer merchants all-in-one scheduling, complete timesheet management, and powerful labor cost and sales reporting. Homebase syncs with Toast per location. If you have\nSync employees and sales between Shopify and Homebase to track and forecast labor costs versus sales.\nSync employee ID, hours, overtime, and tips between Homebase and ADP RUN to make payroll prep a breeze. Export timesheets for ADP Pay eXpert.\nSync employees, hours, overtime, wage rates, and PTO between Homebase and Gusto to make payroll prep a breeze.\nUse the Homebase time clock on your GoDaddy terminal. Sync employees and sales to track and forecast labor versus sales.\nSync employees and hours between Homebase and QuickBooks Online Plus to make payroll prep a breeze.\nExport timesheets from Homebase to Bank of America payroll to make payroll prep a breeze.\nSync employees and sales between Lightspeed and Homebase to track and forecast labor costs versus sales.\nExport timesheets from Homebase that are specifically formatted for Heartland to make payroll prep a breeze.\nSync employee ID and time cards between Homebase and Square Payroll to make payroll prep a breeze.\nExport timesheets from Homebase that are specifically formatted for Millennium to make payroll prep a breeze.\nExport timesheets from Homebase that are specifically formatted for SurePayroll to make payroll prep a breeze.\nTop-rated app built for small business teams.\nBest Payroll for Hourly Teams\nBest in Business for Best AI Implementation\nBest Employee Scheduling\nBest HR & Employee App\nPeople who've talked about us.\nProduct\nCustomers\nResources\nCompany\n© 2026 Pioneer Works, Inc. All Rights Reserved.\n","type":"text"}]}›Thinking…
So Homebase (joinhomebase.com) is a small-business HR/scheduling/payroll product. Their "technology integration" path is via a partner program, not a self-serve public API/SDK. There's no public developer documentation, no public SDK, no public OAuth/webhook docs accessible.
Let me verify whether there's any public API documentation. Let me check for a developer portal, status page, or NPM package.
✓$ for u in "https://developer.joinhomebase.com" "https://api.joinhomebase.com" "https://www.joinhomebase.com/developers" "https://docs.joinhomebase.com" "https://status.joinhomebase.com"; do code=$(curl…✓└{"content":[{"text":"000 https://developer.joinhomebase.com\n401 https://api.joinhomebase.com\n404 https://www.joinhomebase.com/developers\n200 https://docs.joi…ctrl+o
for u in "https://developer.joinhomebase.com" "https://api.joinhomebase.com" "https://www.joinhomebase.com/developers" "https://docs.joinhomebase.com" "https://status.joinhomebase.com"; do code=$(curl -sL --max-time 10 -o /dev/null -w "%{http_code}" "$u" 2>/dev/null); echo "$code $u"; done
{"content":[{"text":"000 https://developer.joinhomebase.com\n401 https://api.joinhomebase.com\n404 https://www.joinhomebase.com/developers\n200 https://docs.joinhomebase.com\n200 https://status.joinhomebase.com\n","type":"text"}]}✓$ npm view homebase 2>/dev/null | head -30; echo "---py---"; curl -sL --max-time 10 "https://pypi.org/pypi/homebase/json" -o /dev/null -w "%{http_code}\n" 2>/dev/null✓└{"content":[{"text":"\nhomebase@0.0.32 | Proprietary | deps: 18 | versions: 27\nBoiler plate for nodejs, express, dnode, sql\nhttps://github.com/Traksewt/HomeBa…ctrl+o
{"content":[{"text":"\nhomebase@0.0.32 | Proprietary | deps: 18 | versions: 27\nBoiler plate for nodejs, express, dnode, sql\nhttps://github.com/Traksewt/HomeBase#readme\n\ndist\n.tarball: https://registry.npmjs.org/homebase/-/homebase-0.0.32.tgz\n.shasum: 3de7c49efd7f311cba5177a0be07309dc7501fa8\n.integrity: sha512-27DwQuInUpJZEm9hX0uoPEudJ4HUvEctrObDUgfehearyPccVsEgtbZ5kmhJ4ufl8rD9nC+YoLUx1xydndb0Ig==\n\ndependencies:\nbody-parser: *\ndomready: *\nejs: *\nemailjs: *\nes6-promise: *\nexpress: *\nfavicon: *\nforever: *\nhtml-entities: *\nmocha-html-reporter: *\nmocha: *\nmorgan: *\nmysql: *\nrequirejs: *\nrimraf: *\nshould: *\nsocket.io: ^1.7.3\nwinston: *\n\n---py---\n200\n","type":"text"}]}›Thinking…
Interesting. There's api.joinhomebase.com returning 401 (meaning it exists, but requires auth). There's docs.joinhomebase.com returning 200. Let me check what docs.joinhomebase.com is — maybe it's a developer documentation portal? The earlier docs.homebase.io was 000. Let me check docs.joinhomebase.com content.
✓$ curl -sL --max-time 15 "https://docs.joinhomebase.com" -o /tmp/hbdocs.html -w "%{http_code}\n"; head -c 2000 /tmp/hbdocs.html✓└{"content":[{"text":"200\n<!DOCTYPE html><html lang=\"en\" style=\"\" data-color-mode=\"system\" class=\" useReactApp isRefPage \"><head><meta charset=\"utf-8\"…ctrl+o
{"content":[{"text":"200\n<!DOCTYPE html><html lang=\"en\" style=\"\" data-color-mode=\"system\" class=\" useReactApp isRefPage \"><head><meta charset=\"utf-8\"><link rel=\"preconnect\" href=\"https://cdn.readme.io\"><link rel=\"preconnect\" href=\"https://cdn.readme.io\" crossorigin><meta name=\"readme-deploy\" content=\"5.894.0\"><meta name=\"readme-subdomain\" content=\"homebaseapi\"><meta name=\"readme-repo\" content=\"homebase-ggqo-910e87e183fa\"><meta name=\"readme-project-flags\" content=\"WP/gmap8gEDtldCXAcSwWg==:+TiUGtZGFqic8TmpG0sx1mAJY8gTUAjXFZ3BCfHtNwNNsMzcawoJIK7mxgj6ORbINl7bfOSohnCWqpniCM86tcVT2bX8kej1tByR/QoDoeJqkBhUlNVT8ZTUcAPxGBAT\"><meta name=\"readme-version\" content=\"1.0\"><title>Introduction</title><meta name=\"description\" content=\"Request an API Key To access the API, you first need to request an API key. You can do this from the API Settings page within the Homebase application. Navigate to Settings in the left-hand navigation menu, and under the Account section, select API Access . Click the Request API Key button to submit…\" data-rh=\"true\"><meta property=\"og:title\" content=\"Introduction\" data-rh=\"true\"><meta property=\"og:description\" content=\"Request an API Key To access the API, you first need to request an API key. You can do this from the API Settings page within the Homebase application. Navigate to Settings in the left-hand navigation menu, and under the Account section, select API Access . Click the Request API Key button to submit…\" data-rh=\"true\"><meta property=\"og:site_name\" content=\"Homebase\"><meta name=\"twitter:title\" content=\"Introduction\" data-rh=\"true\"><meta name=\"twitter:description\" content=\"Request an API Key To access the API, you first need to request an API key. You can do this from the API Settings page within the Homebase application. Navigate to Settings in the left-hand navigation menu, and under the Account section, select API Access . Click the Request API Key button to submit…\" data-rh=\"true\"><meta name=\"twitter:card\" content=\"summary_large_image\"><meta name=\"viewport\" ","type":"text"}]}✓$ curl -sL --max-time 15 -D /tmp/hdrs.txt "https://api.joinhomebase.com" -o /tmp/hbapi.txt -w "%{http_code}\n"; echo "---HEADERS---"; cat /tmp/hdrs.txt | head -30; echo "---BODY---"; head -c 1000 /tmp/h…✓└{"content":[{"text":"401\n---HEADERS---\nHTTP/2 401 \r\ndate: Sat, 19 Sep 2026 00:10:32 GMT\r\ncontent-type: application/json; charset=utf-8\r\ncontent-length: …ctrl+o
curl -sL --max-time 15 -D /tmp/hdrs.txt "https://api.joinhomebase.com" -o /tmp/hbapi.txt -w "%{http_code}\n"; echo "---HEADERS---"; cat /tmp/hdrs.txt | head -30; echo "---BODY---"; head -c 1000 /tmp/hbapi.txt
{"content":[{"text":"401\n---HEADERS---\nHTTP/2 401 \r\ndate: Sat, 19 Sep 2026 00:10:32 GMT\r\ncontent-type: application/json; charset=utf-8\r\ncontent-length: 158\r\nserver: nginx/1.29.5\r\ncache-control: no-store, no-cache\r\nwww-authenticate: Bearer realm=\"Doorkeeper\", error=\"invalid_token\", error_description=\"The Authorization header supplied is invalid. The Authorization header should be of the form: \"Bearer <auth token>\"\"\r\nset-cookie: arpa_context=%7B%7D; path=/; max-age=7.0; expires=Thu, 01 Jan 1970 00:00:07 GMT; HttpOnly; secure\r\ncontent-security-policy-report-only: default-src 'self' * data: blob: file: 'unsafe-inline' 'unsafe-eval' 'wasm-unsafe-eval'; frame-ancestors 'self' https://app.joinhomebase.com/ https://admin.shopify.com https://www.clover.com; report-uri https://csp-report.browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pubc9b68eab420fbded41e1cf1f1227b2cb&dd-evp-origin=content-security-policy&ddsource=csp-report-prod\r\nx-request-id: d3796b17-677a-49dc-a371-d8328b5fef5f\r\nx-runtime: 0.011698\r\nstrict-transport-security: max-age=63072000; includeSubDomains\r\nvary: Origin\r\n\r\n---BODY---\n{\"error\":\"The Authorization header supplied is invalid. The Authorization header should be of the form: \\\"Bearer <auth token>\\\"\",\"error_code\":\"invalid_token\"}","type":"text"}]}›Thinking…
There IS a developer API. docs.joinhomebase.com is a ReadMe-based developer documentation ("Introduction" page), and api.joinhomebase.com uses OAuth Bearer tokens (Doorkeeper). The docs say: "Request an API Key: To access the API, you first need to request an API key. You can do this from the API Settings page within the Homebase application. Navigate to Settings... under Account, select API Access. Click Request API Key button to submit…"
Let me fetch the full docs site. ReadMe docs are typically served as HTML with content embedded, or there's a JSON API at https://docs.joinhomebase.com/. Actually ReadMe projects expose the content via the HTML (RSC/react-query). Let me extract the text content from the HTML.
Let me get the full HTML and extract the visible text and any OpenAPI spec endpoints. ReadMe docs may have a .json or the content is embedded. Let me search for endpoint paths in the HTML.
✓$ wc -c /tmp/hbdocs.html; grep -oE 'https?://[^"< ]+' /tmp/hbdocs.html | sort -u | head -50✓└{"content":[{"text":"133586 /tmp/hbdocs.html\nhttps://3bbe57a973254129bcb93e47dc0cc46f@o343074.ingest.sentry.io/2052166\nhttps://cdn.readme.io\nhttps://cdn.read…ctrl+o
{"content":[{"text":"133586 /tmp/hbdocs.html\nhttps://3bbe57a973254129bcb93e47dc0cc46f@o343074.ingest.sentry.io/2052166\nhttps://cdn.readme.io\nhttps://cdn.readme.io","dashDomain":"dash.readme.com","domain":"readme.io","domainFull":"https://dash.readme.com","encryptedLocalStorageKey":"ekfls-2025-03-27","fullstory":{"enabled":true,"orgId":"FSV9A"},"git":{"preview":"https://githug-prod.gitto.rdme.io","sync":{"bitbucket":{"installationLink":"https://developer.atlassian.com/console/install/310151e6-ca1a-4a44-9af6-1b523fea0561?signature=REDACTED&product=bitbucket"}}},"metrics":{"billingCronEnabled":"true","dashUrl":"https://m.readme.io","defaultUrl":"https://m.readme.io","exportMaxRetries":12,"wsUrl":"wss://m.readme.io"},"micro":{"baseUrl":"https://micro-beta.readme.com"},"novuNotification":{"appId":"ob_MiAPOPqgP","showUnreleasedWorkflows":false},"proxyUrl":"https://try.readme.io","readmeRecaptchaSiteKey":"6LesVBYpAAAAAESOCHOyo2kF9SZXPVb54Nwf3i2x","releaseVersion":"5.894.0","reservedWords":{"tools":["execute-request","get-endpoint","get-server-variables","list-endpoints","list-specs","search-endpoints","search","fetch"]},"sentry":{"dsn":"https://3bbe57a973254129bcb93e47dc0cc46f@o343074.ingest.sentry.io/2052166","enabled":true},"shMigration":{"promoVideo":"","forceWaitlist":false,"migrationPreview":false},"sslBaseDomain":"readmessl.com","sslGenerationService":"ssl.readmessl.com","superHub":{"newProjectsEnabled":true},"tiptapCloud":{"appId":"8mzorjl9","url":"wss://8mzorjl9.collab.tiptap.cloud"},"wootric":{"accountToken":"NPS-122b75a4","enabled":true}}\nhttps://cdn.readme.io/og-image/create?type=reference&title=Introduction&projectTitle=Homebase&description=Request%20an%20API%20Key%20To%20access%20the%20API%2C%20you%20first%20need%20to%20request%20an%20API%20key.%20You%20can%20do%20this%20from%20the%20API%20Settings%20page%20within%20the%20Homebase%20application.%20Navigate%20to%20Settings%20in%20the%20left-hand%20navigation%20menu%2C%20and%20under%20the%20Account%20section%2C%20select%20API%20Access%20.%20Click%20the%20Request%20API%20Key%20button%20to%20submit%E2%80%A6&logoUrl=https%3A%2F%2Ffiles.readme.io%2F596ca13ee52637d740e7a7d615b6b0119ad4dc673f382932cdbc7902d71a8177-small-purple-wordmark.png&color=%238044a8&variant=light\nhttps://cdn.readme.io/public/hub/web/1306.50782c5e797f388d05de.js\nhttps://cdn.readme.io/public/hub/web/1347.6265ddeff9b9202723b8.js\nhttps://cdn.readme.io/public/hub/web/2493.9eb320223aedcca08a37.js\nhttps://cdn.readme.io/public/hub/web/2712.833c6d420da7e5c75746.js\nhttps://cdn.readme.io/public/hub/web/2966.363c7ebc853b08620543.js\nhttps://cdn.readme.io/public/hub/web/2985.447b14d171badee0cdb5.css\nhttps://cdn.readme.io/public/hub/web/2985.e4282569af2baf0c86d1.js\nhttps://cdn.readme.io/public/hub/web/3258.7c0cb2340f872d2423f1.js\nhttps://cdn.readme.io/public/hub/web/3727.09575e89009f25a50170.js\nhttps://cdn.readme.io/public/hub/web/4148.5d6a6c106480d473c1e8.js\nhttps://cdn.readme.io/public/hub/web/441.0bca8969b4854384884a.js\nhttps://cdn.readme.io/public/hub/web/4818.840c4c8b487a740167cc.js\nhttps://cdn.readme.io/public/hub/web/5278.a20eba87bd084a3924f7.js\nhttps://cdn.readme.io/public/hub/web/5446.66a863132dae0648c54c.js\nhttps://cdn.readme.io/public/hub/web/6146.e0750bc6839fd326854d.js\nhttps://cdn.readme.io/public/hub/web/6269.82ca93632cc2c596cafb.js\nhttps://cdn.readme.io/public/hub/web/6383.cd4dfc0c792f839724d4.js\nhttps://cdn.readme.io/public/hub/web/686.eacc65c4b4e6d4c222e2.js\nhttps://cdn.readme.io/public/hub/web/7137.6d393781d59245222014.js\nhttps://cdn.readme.io/public/hub/web/779.787e23290115569e9f85.js\nhttps://cdn.readme.io/public/hub/web/830.61da1b02ef0a296b3acc.js\nhttps://cdn.readme.io/public/hub/web/8444.3d577a8b92c614d67531.js\nhttps://cdn.readme.io/public/hub/web/8836.278c0fa83edd766823b0.js\nhttps://cdn.readme.io/public/hub/web/97.47c7787fd14e96c29972.js\nhttps://cdn.readme.io/public/hub/web/9977.a933c2a0ee96169ffef7.js\nhttps://cdn.readme.io/public/hub/web/ConnectMetadata.8e41ab6b4d0ad2a555e4.js\nhttps://cdn.readme.io/public/hub/web/Containers-EndUserContainer.0d7afb462003a64764a3.css\nhttps://cdn.readme.io/public/hub/web/Containers-EndUserContainer.2e79dafe38550c37fdd1.js\nhttps://cdn.readme.io/public/hub/web/Footer.72b0e0d83d6f8b281611.js\nhttps://cdn.readme.io/public/hub/web/Footer.769aa3e9fc194cc963d9.css\nhttps://cdn.readme.io/public/hub/web/Header.3cc9715187a6b28f09f3.js\nhttps://cdn.readme.io/public/hub/web/Header.c5ef215a568f1fcad11c.css\nhttps://cdn.readme.io/public/hub/web/RMDXISH.159422ed8463cae8cb3f.css\nhttps://cdn.readme.io/public/hub/web/RMDXISH.b81307bd65a8a1e2a4ef.js\nhttps://cdn.readme.io/public/hub/web/Reference.b576659cd9a3bc39948f.js\nhttps://cdn.readme.io/public/hub/web/Reference.ee7e0a17a7b5d8e5be88.css\nhttps://cdn.readme.io/public/hub/web/main.23265813a98034e80d33.css\nhttps://cdn.readme.io/public/hub/web/main.dbef6087ac03068d027f.js\nhttps://cdn.readme.io/public/hub/web/routes-SuperHub-Routes.6d0d041993ae40b4f388.js\nhttps://cdn.readme.io/public/hub/web/routes-SuperHub-components-AIDropdown.99bc192bac06a6bceec5.css\nhttps://cdn.readme.io/public/hub/web/routes-SuperHub-components-AIDropdown.f7c4be243eba23e7e26a.js\nhttps://cdn.readme.io/public/hub/web/routes-SuperHub.4c070b3eecb0b8f8a130.js\nhttps://cdn.readme.io/public/hub/web/ui-styles.850caf2de1b92f91cc1d.css\nhttps://cdn.readme.io/public/js/cash-dom.min.js?1789768016527\nhttps://dash.readme.com\nhttps://dash.readme.com/project/homebaseapi/v1.0/refs/introduction\n","type":"text"}]}✓$ python3 - <<'EOF'✓└{"content":[{"text":" Introduction For AI agents: visit https://docs.joinhomebase.com/llms.txt for an index of all pages formatted in Markdown and endpoints in …ctrl+o
python3 - <<'EOF'
import re,html
s=open('/tmp/hbdocs.html',encoding='utf-8').read()
s=re.sub(r'<script[^>]*>.*?</script>','',s,flags=re.S)
s=re.sub(r'<style[^>]*>.*?</style>','',s,flags=re.S)
t=re.sub(r'<[^>]+>',' ',s)
t=html.unescape(t)
t=re.sub(r'\s+',' ',t)
print(t[:4000])
EOF
{"content":[{"text":" Introduction For AI agents: visit https://docs.joinhomebase.com/llms.txt for an index of all pages formatted in Markdown and endpoints in OpenAPI. Append .md to any documentation page URL to get its markdown version. Jump to Content API Reference v1.0 Log In API Reference Log In v1.0 API Reference Introduction Getting Started Introduction Authentication Usage Rate Limiting Homebase Public API Sales /locations/{location_uuid}/sales post Companies /company get Employees /locations/{location_uuid}/employees post /locations/{location_uuid}/employees get /locations/{location_uuid}/employees/{id} put /locations/{location_uuid}/employees/{id} get Shifts /locations/{location_uuid}/shifts/{id} get /locations/{location_uuid}/shifts/deleted get /locations/{location_uuid}/shifts get Timecards /locations/{location_uuid}/timecards/{id} get /locations/{location_uuid}/timecards/deleted get /locations/{location_uuid}/timecards get Labor /locations/{location_uuid}/labor/by_role get /locations/{location_uuid}/labor/by_employee get /locations/{location_uuid}/labor get Locations /locations post /locations get /locations/{location_uuid}/plan get /locations/{location_uuid} get Timeclock /timeclock/end_break post /timeclock/start_break post /timeclock/clock_out post /timeclock/clock_in post /timeclock/status get Powered by Copy Page Introduction Request an API Key To access the API, you first need to request an API key. You can do this from the API Settings page within the Homebase application. Navigate to Settings in the left-hand navigation menu, and under the Account section, select API Access . Click the Request API Key button to submit your request. Once approved, your new API key will be displayed on this page. Updated about 1 year ago Authentication Did this page help you? Yes No Updated about 1 year ago Authentication Did this page help you? Yes No Request an API Key \n","type":"text"}]}›Thinking…
Excellent! There's a developer API, and even better, the docs mention an llms.txt for AI agents and markdown versions of pages. Let me fetch https://docs.joinhomebase.com/llms.txt and the OpenAPI spec. This is exactly what I need.
The API is a public API with endpoints for sales, companies, employees, shifts, timecards, labor, locations, timeclock. It uses an API key (requested in-app), and Bearer tokens? Wait, the api.joinhomebase.com returned 401 with www-authenticate: Bearer realm="Doorkeeper". But the docs say "Request an API Key". Let me look at the authentication page.
Let me fetch llms.txt and the auth page markdown.
✓$ curl -sL --max-time 20 "https://docs.joinhomebase.com/llms.txt" -o /tmp/hb-llms.txt -w "%{http_code}\n"; wc -l /tmp/hb-llms.txt; head -100 /tmp/hb-llms.txt✓└{"content":[{"text":"200\n35 /tmp/hb-llms.txt\n# Homebase Documentation\n\n> Documentation for Homebase\n\nAppend .md to any documentation page URL to get its m…ctrl+o
{"content":[{"text":"200\n35 /tmp/hb-llms.txt\n# Homebase Documentation\n\n> Documentation for Homebase\n\nAppend .md to any documentation page URL to get its markdown version.\n\n## API Reference\n- [Introduction](https://docs.joinhomebase.com/reference/introduction.md)\n- [Authentication](https://docs.joinhomebase.com/reference/authentication-1.md)\n- [Usage](https://docs.joinhomebase.com/reference/usage.md)\n- [Rate Limiting](https://docs.joinhomebase.com/reference/rate-limiting.md)\n- [/locations/{location_uuid}/sales](https://docs.joinhomebase.com/reference/postlocationslocationuuidsales.md): Creates sales for a location\n- [/company](https://docs.joinhomebase.com/reference/getcompany.md): Retrieve the company for the current account\n- [/locations/{location_uuid}/employees](https://docs.joinhomebase.com/reference/postlocationslocationuuidemployees.md): Create employee\n- [/locations/{location_uuid}/employees](https://docs.joinhomebase.com/reference/getlocationslocationuuidemployees.md): Retrieve employees for a given location\n- [/locations/{location_uuid}/employees/{id}](https://docs.joinhomebase.com/reference/putlocationslocationuuidemployeesid.md): Update an employee for a given location\n- [/locations/{location_uuid}/employees/{id}](https://docs.joinhomebase.com/reference/getlocationslocationuuidemployeesid.md): Retrieve a single employee for a given location\n- [/locations/{location_uuid}/shifts/{id}](https://docs.joinhomebase.com/reference/getlocationslocationuuidshiftsid.md): Retrieve a single shift for a given location\n- [/locations/{location_uuid}/shifts/deleted](https://docs.joinhomebase.com/reference/getlocationslocationuuidshiftsdeleted.md): Retrieve the IDs of deleted shifts for a given location\n- [/locations/{location_uuid}/shifts](https://docs.joinhomebase.com/reference/getlocationslocationuuidshifts.md): Retrieve shifts for a given location\n- [/locations/{location_uuid}/timecards/{id}](https://docs.joinhomebase.com/reference/getlocationslocationuuidtimecardsid.md): Retrieve a single timecard for a given location\n- [/locations/{location_uuid}/timecards/deleted](https://docs.joinhomebase.com/reference/getlocationslocationuuidtimecardsdeleted.md): Retrieve the IDs of deleted timecards for a given location\n- [/locations/{location_uuid}/timecards](https://docs.joinhomebase.com/reference/getlocationslocationuuidtimecards.md): Retrieve timecards for a given location\n- [/locations/{location_uuid}/labor/by_role](https://docs.joinhomebase.com/reference/getlocationslocationuuidlaborbyrole.md): Retrieve aggregate labor for a given location, grouped by role\n- [/locations/{location_uuid}/labor/by_employee](https://docs.joinhomebase.com/reference/getlocationslocationuuidlaborbyemployee.md): Retrieve aggregate labor for a given location, grouped by employee\n- [/locations/{location_uuid}/labor](https://docs.joinhomebase.com/reference/getlocationslocationuuidlabor.md): Retrieve aggregate labor for a given location, grouped by hour or by day\n- [/locations](https://docs.joinhomebase.com/reference/postlocations.md): Create a new location\n- [/locations](https://docs.joinhomebase.com/reference/getlocations.md): Retrieve locations for the current account\n- [/locations/{location_uuid}/plan](https://docs.joinhomebase.com/reference/getlocationslocationuuidplan.md): Retrieve plan for location\n- [/locations/{location_uuid}](https://docs.joinhomebase.com/reference/getlocationslocationuuid.md): Retrieve a given location for the current account\n- [/timeclock/end_break](https://docs.joinhomebase.com/reference/posttimeclockendbreak.md): End a break\n- [/timeclock/start_break](https://docs.joinhomebase.com/reference/posttimeclockstartbreak.md): Start a break\n- [/timeclock/clock_out](https://docs.joinhomebase.com/reference/posttimeclockclockout.md): Clock out of a shift\n- [/timeclock/clock_in](https://docs.joinhomebase.com/reference/posttimeclockclockin.md): Clock into a shift\n- [/timeclock/status](https://docs.joinhomebase.com/reference/gettimeclockstatus.md): Retrieve the current timeclock status for a given job\n","type":"text"}]}›Thinking…
There's a full API reference. Now I need to understand authentication and usage. Let me fetch auth, intro, usage, rate-limiting markdown pages. Also there should be an OpenAPI spec link. Let me fetch those markdown pages.
✓$ for p in introduction authentication-1 usage rate-limiting; do echo "===== $p ====="; curl -sL --max-time 15 "https://docs.joinhomebase.com/reference/$p.md" | head -120; echo; done✓└{"content":[{"text":"===== introduction =====\n---\nupdatedAt: 2025-09-15T19:12:40.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhome…ctrl+o
{"content":[{"text":"===== introduction =====\n---\nupdatedAt: 2025-09-15T19:12:40.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhomebase.com/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.\n\n# Introduction\n\n## Request an API Key\n\nTo access the API, you first need to request an API key. You can do this from the *API Settings* page within the Homebase application.\n\nNavigate to *Settings* in the left-hand navigation menu, and under the *Account* section, select *API Access*. Click the *Request API Key* button to submit your request.\n\nOnce approved, your new API key will be displayed on this page.\n\n<Image align=\"center\" src=\"https://files.readme.io/81319fb69c6166cc3c5abd255d663c5e55583ceb6edca176bcaf25d54c34f418-Screenshot_2025-09-15_at_2.45.39_PM.png\" />\n===== authentication-1 =====\n---\nupdatedAt: 2025-09-15T19:13:42.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhomebase.com/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.\n\n# Authentication\n\nAll API requests must be authenticated. This is done by providing your API key in the `Authorization` header with the `Bearer` scheme. Please check [these steps](https://homebaseapi.readme.io/reference/introduction#request-an-api-key) to acquire your access token\n\nAn example cURL request might look like this:\n\n```sh\ncurl -H 'Authorization: Bearer YOUR_API_KEY' \\\n -H 'Accept: application/vnd.homebase-v1+json' \\\n https://api.joinhomebase.com/locations\n```\n\nBe sure to replace *YOUR\\_API\\_KEY* with the actual key from your API settings page.\n===== usage =====\n---\nupdatedAt: 2025-09-15T19:12:13.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhomebase.com/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.\n\n# Usage\n\n## Versioning & Content Type\n\nAPI versioning is specified in the `Accept` header. All requests must include the following header to ensure you are accessing the correct version of the API.\n\n```\nAccept: application/vnd.homebase-v1+json\n```\n\nAs of now, the API only supports returning JSON-formatted data.\n\n## Dates\n\nAll dates and timestamps returned from the API are in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (e.g., `2025-09-15T15:00:00Z`). For best results, please use this format when specifying dates in request parameters.\n\n## Pagination\n\nRequests that return a list of items are paginated. Pagination metadata is included in the response headers and uses the [RFC-5988](https://tools.ietf.org/html/rfc5988) standard for Web Linking.\n\nThe following headers are included in paginated responses:\n\n* **Total**\n * The total number of resources matching the request parameters.\n * `Total: 2`\n\n* **Per-Page**\n * The number of resources included in each response.\n * `Per-Page: 100`\n\n* **Link**\n * A set of links that can be parsed to navigate to the next, previous, or last page of results\n * ```\n https://api.joinhomebase.com/locations/f9e46145-b6b1-4e9e-92a0-320510e2c1f3/employees?page=2&per_page=1\n ```\n\n<br />\n===== rate-limiting =====\n---\nupdatedAt: 2025-09-15T19:16:13.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhomebase.com/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.\n\n# Rate Limiting\n\n## Rate Limiting\n\nRequests to the API are rate limited to prevent abuse.\n\nAll requests that include a UUID in the URL are limited to **60 requests per minute per UUID**.\nIf you exceed this limit, you will receive a **429 Rate limit exceeded** response.\n\n* **HTTP Status Code:** `429`\n* **JSON Response:**\n ```json\n {\n \"error\": \"Rate limit exceeded\"\n }\n ```\n","type":"text"}]}›Thinking…
Now I understand:
- Authentication:
Authorization: Bearer YOUR_API_KEY - Content type:
Accept: application/vnd.homebase-v1+json - Base URL:
https://api.joinhomebase.com - API key is requested in-app (Settings → Account → API Access → Request API Key), and needs approval.
So there IS a developer workflow I can act on — a public REST API. But I need an API key, which requires an in-app request that needs approval (human action). I don't have an API key in the environment.
Let me verify by trying an unauthenticated request and confirm I'm blocked without a key. Also, let me get the OpenAPI spec to understand the exact request/response shapes so I can build a "simple example" (code) even if I can't execute live requests without a key.
Let me also check pricing. Homebase pricing for the product: Homebase has a Free plan (basic scheduling/time clock for 1 location, up to 20 employees) and paid plans (Essentials ~$20/mo/location, Plus ~$48/mo/location, All-in-one ~$80/mo/location) plus payroll add-on. I should verify current pricing from the site. Let me fetch the pricing page.
Also, is there an OpenAPI spec? The llms.txt mentions "endpoints in OpenAPI". Let me find the spec URL. ReadMe usually provides https://docs.joinhomebase.com/openapi.json or similar. Let me try a few common paths.
✓$ for u in "https://docs.joinhomebase.com/openapi.json" "https://docs.joinhomebase.com/api/openapi.json" "https://docs.joinhomebase.com/reference/openapi.json" "https://homebaseapi.readme.io/openapi.jso…✓└{"content":[{"text":"404 https://docs.joinhomebase.com/openapi.json\n404 https://docs.joinhomebase.com/api/openapi.json\n404 https://docs.joinhomebase.com/refer…ctrl+o
for u in "https://docs.joinhomebase.com/openapi.json" "https://docs.joinhomebase.com/api/openapi.json" "https://docs.joinhomebase.com/reference/openapi.json" "https://homebaseapi.readme.io/openapi.json"; do code=$(curl -sL --max-time 10 -o /dev/null -w "%{http_code}" "$u" 2>/dev/null); echo "$code $u"; done
{"content":[{"text":"404 https://docs.joinhomebase.com/openapi.json\n404 https://docs.joinhomebase.com/api/openapi.json\n404 https://docs.joinhomebase.com/reference/openapi.json\n404 https://homebaseapi.readme.io/openapi.json\n","type":"text"}]}✓$ curl -sL --max-time 15 -H 'Accept: application/vnd.homebase-v1+json' "https://api.joinhomebase.com/locations" -o /tmp/loc.json -w "%{http_code}\n"; head -c 500 /tmp/loc.json✓└{"content":[{"text":"401\n{\"error\":\"The Authorization header supplied is invalid. The Authorization header should be of the form: \\\"Bearer <auth token>\\\"…ctrl+o
{"content":[{"text":"401\n{\"error\":\"The Authorization header supplied is invalid. The Authorization header should be of the form: \\\"Bearer <auth token>\\\"\",\"error_code\":\"invalid_token\"}","type":"text"}]}›Thinking…
Confirmed: without an API key, I get 401. I don't have an API key in the environment, and it requires in-app request + approval (a manual, human step). So I'm blocked from making live API calls.
But I can still build a "simple example" — a minimal, working client script (Python or Node) that demonstrates how to use the API, which the user can run once they have a key. I should not start local servers. I can write a small script that:
- Reads HOMEbase API key from env
- Calls /locations (GET) and prints locations
- Shows the header requirements
Let me first gather the endpoint details (request/response payloads) from the markdown pages so my example is accurate. Let me fetch a few key endpoint pages: get locations, get employees, get company, get shifts maybe, and post locations (to show create). I'll fetch a handful to understand response schema.
Also let me get pricing. Let me fetch the pricing page.
Let me do these in parallel.
✓$ for p in getlocations getcompany getlocationslocationuuidemployees getlocationslocationuuidshifts; do echo "===== $p ====="; curl -sL --max-time 15 "https://docs.joinhomebase.com/reference/$p.md" | se…✓└{"content":[{"text":"===== getlocations =====\n---\nupdatedAt: 2025-09-08T15:29:36.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhome…ctrl+o
for p in getlocations getcompany getlocationslocationuuidemployees getlocationslocationuuidshifts; do echo "===== $p ====="; curl -sL --max-time 15 "https://docs.joinhomebase.com/reference/$p.md" | sed -n '1,160p'; echo; done
{"content":[{"text":"===== getlocations =====\n---\nupdatedAt: 2025-09-08T15:29:36.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhomebase.com/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.\n\n# /locations\n\nRetrieve locations for the current account\n\n# OpenAPI definition\n\n````json\n{\n \"openapi\": \"3.0.3\",\n \"info\": {\n \"title\": \"Homebase Public API\",\n \"description\": \"Homebase provides a collection of APIs to enable building integrations for a wide range of use cases.\\n\\n## Request an API Key\\nRequest a key from the [API Settings](https://app.joinhomebase.com/settings/api) page within the Homebase app. Once approved, your API key will be available on that page.\\n\\n## Authentication\\nInclude a bearer token in the `Authorization` header, e.g.:\\n\\n```\\ncurl -H 'Authorization: Bearer xxx' -H 'Accept: application/vnd.homebase-v1+json' https://api.joinhomebase.com/locations\\n```\\n\\n## Versioning / Content Type\\nSpecify the API version via the `Accept` header:\\n\\n```\\nAccept: application/vnd.homebase-v1+json\\n```\\n\\nResponses are JSON.\\n\\n## Dates\\nAll dates are ISO 8601.\\n\\n## Pagination\\nPagination metadata is returned via headers per RFC-5988 Web Linking: `Total`, `Per-Page`, and `Link`.\\n\\n## Rate Limiting\\nRequests that include a UUID in the URL are limited to 60 requests/min/UUID. Exceeding this returns HTTP 429 with `{ \\\"error\\\": \\\"Rate limit exceeded\\\" }`.\\n\",\n \"termsOfService\": \"https://app.joinhomebase.com/terms\",\n \"contact\": {\n \"email\": \"help@joinhomebase.com\"\n },\n \"version\": \"1.0.0\"\n },\n \"servers\": [\n {\n \"url\": \"https://app.joinhomebase.com/api/public\",\n \"description\": \"Production\"\n }\n ],\n \"tags\": [\n {\n \"name\": \"locations\",\n \"description\": \"Operations about locations\"\n }\n ],\n \"paths\": {\n \"/locations\": {\n \"get\": {\n \"tags\": [\n \"locations\"\n ],\n \"operationId\": \"getLocations\",\n \"description\": \"Retrieve locations for the current account\",\n \"responses\": {\n \"200\": {\n \"description\": \"Retrieve locations for the current account\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicApi_Entities_V1_Location\"\n }\n }\n }\n }\n }\n }\n }\n },\n \"components\": {\n \"securitySchemes\": {\n \"bearerAuth\": {\n \"type\": \"http\",\n \"scheme\": \"bearer\",\n \"bearerFormat\": \"JWT\"\n }\n },\n \"schemas\": {\n \"PublicApi_Entities_V1_Location\": {\n \"type\": \"object\",\n \"description\": \"PublicApi_Entities_V1_Location model\",\n \"properties\": {\n \"uuid\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"address_1\": {\n \"type\": \"string\"\n },\n \"address_2\": {\n \"type\": \"string\"\n },\n \"city\": {\n \"type\": \"string\"\n },\n \"state\": {\n \"type\": \"string\"\n },\n \"zip\": {\n \"type\": \"string\"\n },\n \"country_code\": {\n \"type\": \"string\"\n },\n \"phone\": {\n \"type\": \"string\"\n },\n \"website\": {\n \"type\": \"string\"\n },\n \"time_zone\": {\n \"type\": \"string\"\n },\n \"partner_merchant_id\": {\n \"type\": \"string\"\n },\n \"created_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"updated_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n }\n }\n }\n },\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ]\n}\n````\n===== getcompany =====\n---\nupdatedAt: 2025-09-08T15:29:36.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhomebase.com/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.\n\n# /company\n\nRetrieve the company for the current account\n\n# OpenAPI definition\n\n````json\n{\n \"openapi\": \"3.0.3\",\n \"info\": {\n \"title\": \"Homebase Public API\",\n \"description\": \"Homebase provides a collection of APIs to enable building integrations for a wide range of use cases.\\n\\n## Request an API Key\\nRequest a key from the [API Settings](https://app.joinhomebase.com/settings/api) page within the Homebase app. Once approved, your API key will be available on that page.\\n\\n## Authentication\\nInclude a bearer token in the `Authorization` header, e.g.:\\n\\n```\\ncurl -H 'Authorization: Bearer xxx' -H 'Accept: application/vnd.homebase-v1+json' https://api.joinhomebase.com/locations\\n```\\n\\n## Versioning / Content Type\\nSpecify the API version via the `Accept` header:\\n\\n```\\nAccept: application/vnd.homebase-v1+json\\n```\\n\\nResponses are JSON.\\n\\n## Dates\\nAll dates are ISO 8601.\\n\\n## Pagination\\nPagination metadata is returned via headers per RFC-5988 Web Linking: `Total`, `Per-Page`, and `Link`.\\n\\n## Rate Limiting\\nRequests that include a UUID in the URL are limited to 60 requests/min/UUID. Exceeding this returns HTTP 429 with `{ \\\"error\\\": \\\"Rate limit exceeded\\\" }`.\\n\",\n \"termsOfService\": \"https://app.joinhomebase.com/terms\",\n \"contact\": {\n \"email\": \"help@joinhomebase.com\"\n },\n \"version\": \"1.0.0\"\n },\n \"servers\": [\n {\n \"url\": \"https://app.joinhomebase.com/api/public\",\n \"description\": \"Production\"\n }\n ],\n \"tags\": [\n {\n \"name\": \"companies\",\n \"description\": \"Operations about companies\"\n }\n ],\n \"paths\": {\n \"/company\": {\n \"get\": {\n \"tags\": [\n \"companies\"\n ],\n \"operationId\": \"getCompany\",\n \"description\": \"Retrieve the company for the current account\",\n \"responses\": {\n \"200\": {\n \"description\": \"Retrieve the company for the current account\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicApi_Entities_V1_Company\"\n }\n }\n }\n }\n }\n }\n }\n },\n \"components\": {\n \"securitySchemes\": {\n \"bearerAuth\": {\n \"type\": \"http\",\n \"scheme\": \"bearer\",\n \"bearerFormat\": \"JWT\"\n }\n },\n \"schemas\": {\n \"PublicApi_Entities_V1_Company\": {\n \"type\": \"object\",\n \"description\": \"PublicApi_Entities_V1_Company model\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"owner\": {\n \"$ref\": \"#/components/schemas/PublicApi_Entities_V1_User\",\n \"description\": \"The company owner\"\n },\n \"created_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"updated_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n }\n },\n \"PublicApi_Entities_V1_User\": {\n \"type\": \"object\",\n \"description\": \"PublicApi_Entities_V1_User model\",\n \"properties\": {\n \"id\": {\n \"type\": \"integer\",\n \"format\": \"int32\"\n },\n \"first_name\": {\n \"type\": \"string\"\n },\n \"last_name\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"phone\": {\n \"type\": \"string\"\n },\n \"job\": {\n \"$ref\": \"#/components/schemas/PublicApi_Entities_V1_Job\"\n },\n \"created_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"updated_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n }\n },\n \"PublicApi_Entities_V1_Job\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"integer\",\n \"format\": \"int32\"\n },\n \"level\": {\n \"type\": \"string\",\n \"description\": \"Employee, Manager, or General Manager\"\n },\n \"default_role\": {\n \"type\": \"string\",\n \"description\": \"The default role, e.g. Server, Host, Cashier\"\n },\n \"pin\": {\n \"type\": \"string\",\n \"description\": \"The pin number which the employee uses to clock in/out\"\n },\n \"pos_partner_id\": {\n \"type\": \"string\",\n \"description\": \"External ID of employee in POS partner\"\n },\n \"payroll_id\": {\n \"type\": \"string\",\n \"description\": \"For locations with payroll integrations\"\n },\n \"wage_rate\": {\n \"type\": \"number\",\n \"format\": \"float\",\n \"description\": \"How much the employee gets paid\"\n },\n \"wage_type\": {\n \"type\": \"string\",\n \"description\": \"Hourly or salary\"\n },\n \"roles\": {\n \"type\": \"array\",\n\n===== getlocationslocationuuidemployees =====\n---\nupdatedAt: 2025-09-08T15:29:36.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhomebase.com/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.\n\n# /locations/{location_uuid}/employees\n\nRetrieve employees for a given location\n\n# OpenAPI definition\n\n````json\n{\n \"openapi\": \"3.0.3\",\n \"info\": {\n \"title\": \"Homebase Public API\",\n \"description\": \"Homebase provides a collection of APIs to enable building integrations for a wide range of use cases.\\n\\n## Request an API Key\\nRequest a key from the [API Settings](https://app.joinhomebase.com/settings/api) page within the Homebase app. Once approved, your API key will be available on that page.\\n\\n## Authentication\\nInclude a bearer token in the `Authorization` header, e.g.:\\n\\n```\\ncurl -H 'Authorization: Bearer xxx' -H 'Accept: application/vnd.homebase-v1+json' https://api.joinhomebase.com/locations\\n```\\n\\n## Versioning / Content Type\\nSpecify the API version via the `Accept` header:\\n\\n```\\nAccept: application/vnd.homebase-v1+json\\n```\\n\\nResponses are JSON.\\n\\n## Dates\\nAll dates are ISO 8601.\\n\\n## Pagination\\nPagination metadata is returned via headers per RFC-5988 Web Linking: `Total`, `Per-Page`, and `Link`.\\n\\n## Rate Limiting\\nRequests that include a UUID in the URL are limited to 60 requests/min/UUID. Exceeding this returns HTTP 429 with `{ \\\"error\\\": \\\"Rate limit exceeded\\\" }`.\\n\",\n \"termsOfService\": \"https://app.joinhomebase.com/terms\",\n \"contact\": {\n \"email\": \"help@joinhomebase.com\"\n },\n \"version\": \"1.0.0\"\n },\n \"servers\": [\n {\n \"url\": \"https://app.joinhomebase.com/api/public\",\n \"description\": \"Production\"\n }\n ],\n \"tags\": [\n {\n \"name\": \"employees\",\n \"description\": \"Operations about employees\"\n }\n ],\n \"paths\": {\n \"/locations/{location_uuid}/employees\": {\n \"get\": {\n \"tags\": [\n \"employees\"\n ],\n \"operationId\": \"getLocationsLocationUuidEmployees\",\n \"description\": \"Retrieve employees for a given location\",\n \"parameters\": [\n {\n \"name\": \"page\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\",\n \"format\": \"int32\",\n \"default\": 1\n },\n \"description\": \"Page of results to fetch.\"\n },\n {\n \"name\": \"per_page\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\",\n \"format\": \"int32\"\n },\n \"description\": \"Number of results to return per page.\"\n },\n {\n \"name\": \"location_uuid\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"name\": \"with_archived\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"description\": \"Include archived employees\"\n }\n ],\n \"responses\": {\n \"200\": {\n \"description\": \"Retrieve employees for a given location\",\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicApi_Entities_V1_User\"\n }\n }\n }\n }\n }\n }\n }\n },\n \"components\": {\n \"securitySchemes\": {\n \"bearerAuth\": {\n \"type\": \"http\",\n \"scheme\": \"bearer\",\n \"bearerFormat\": \"JWT\"\n }\n },\n \"schemas\": {\n \"PublicApi_Entities_V1_User\": {\n \"type\": \"object\",\n \"description\": \"PublicApi_Entities_V1_User model\",\n \"properties\": {\n \"id\": {\n \"type\": \"integer\",\n \"format\": \"int32\"\n },\n \"first_name\": {\n \"type\": \"string\"\n },\n \"last_name\": {\n \"type\": \"string\"\n },\n \"email\": {\n \"type\": \"string\"\n },\n \"phone\": {\n \"type\": \"string\"\n },\n \"job\": {\n \"$ref\": \"#/components/schemas/PublicApi_Entities_V1_Job\"\n },\n \"created_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"updated_at\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n }\n },\n \"PublicApi_Entities_V1_Job\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"integer\",\n \"format\": \"int32\"\n },\n \"level\": {\n \"type\": \"string\",\n \"description\": \"Employee, Manager, or General Manager\"\n },\n \"default_role\": {\n \"type\": \"string\",\n \"description\": \"The default role, e.g. Server, Host, Cashier\"\n },\n \"pin\": {\n \"type\": \"string\",\n \"description\": \"The pin number which the employee uses to clock in/out\"\n\n===== getlocationslocationuuidshifts =====\n---\nupdatedAt: 2025-09-08T15:29:36.000Z\n---\n\nFetch the complete documentation index at: https://docs.joinhomebase.com/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.\n\n# /locations/{location_uuid}/shifts\n\nRetrieve shifts for a given location\n\n# OpenAPI definition\n\n````json\n{\n \"openapi\": \"3.0.3\",\n \"info\": {\n \"title\": \"Homebase Public API\",\n \"description\": \"Homebase provides a collection of APIs to enable building integrations for a wide range of use cases.\\n\\n## Request an API Key\\nRequest a key from the [API Settings](https://app.joinhomebase.com/settings/api) page within the Homebase app. Once approved, your API key will be available on that page.\\n\\n## Authentication\\nInclude a bearer token in the `Authorization` header, e.g.:\\n\\n```\\ncurl -H 'Authorization: Bearer xxx' -H 'Accept: application/vnd.homebase-v1+json' https://api.joinhomebase.com/locations\\n```\\n\\n## Versioning / Content Type\\nSpecify the API version via the `Accept` header:\\n\\n```\\nAccept: application/vnd.homebase-v1+json\\n```\\n\\nResponses are JSON.\\n\\n## Dates\\nAll dates are ISO 8601.\\n\\n## Pagination\\nPagination metadata is returned via headers per RFC-5988 Web Linking: `Total`, `Per-Page`, and `Link`.\\n\\n## Rate Limiting\\nRequests that include a UUID in the URL are limited to 60 requests/min/UUID. Exceeding this returns HTTP 429 with `{ \\\"error\\\": \\\"Rate limit exceeded\\\" }`.\\n\",\n \"termsOfService\": \"https://app.joinhomebase.com/terms\",\n \"contact\": {\n \"email\": \"help@joinhomebase.com\"\n },\n \"version\": \"1.0.0\"\n },\n \"servers\": [\n {\n \"url\": \"https://app.joinhomebase.com/api/public\",\n \"description\": \"Production\"\n }\n ],\n \"tags\": [\n {\n \"name\": \"shifts\",\n \"description\": \"Operations about shifts\"\n }\n ],\n \"paths\": {\n \"/locations/{location_uuid}/shifts\": {\n \"get\": {\n \"tags\": [\n \"shifts\"\n ],\n \"operationId\": \"getLocationsLocationUuidShifts\",\n \"description\": \"Retrieve shifts for a given location\",\n \"parameters\": [\n {\n \"name\": \"page\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\",\n \"format\": \"int32\",\n \"default\": 1\n },\n \"description\": \"Page of results to fetch.\"\n },\n {\n \"name\": \"per_page\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\",\n \"format\": \"int32\",\n \"default\": 25\n },\n \"description\": \"Number of results to return per page.\"\n },\n {\n \"name\": \"location_uuid\",\n \"in\": \"path\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"name\": \"start_date\",\n \"in\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n },\n {\n \"name\": \"end_date\",\n \"in\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n },\n {\n \"name\": \"open\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"description\": \"Retrieve open shifts only\"\n },\n {\n \"name\": \"with_note\",\n \"in\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n …✓$ curl -sL --max-time 15 "https://www.joinhomebase.com/pricing" -o /tmp/hb-pricing.html -w "%{http_code}\n"; python3 - <<'EOF'✓└{"content":[{"text":"200\nOfficial Homebase Pricing | Try Homebase Free Today\n6 Months Free: Payroll & Plus Plan\nFree 14-day trial of All-in-One\nAdd payroll …ctrl+o
curl -sL --max-time 15 "https://www.joinhomebase.com/pricing" -o /tmp/hb-pricing.html -w "%{http_code}\n"; python3 - <<'EOF'
import re,html
s=open('/tmp/hb-pricing.html',encoding='utf-8').read()
s=re.sub(r'<script[^>]*>.*?</script>','',s,flags=re.S)
s=re.sub(r'<style[^>]*>.*?</style>','',s,flags=re.S)
t=re.sub(r'<[^>]+>','\n',s)
t=html.unescape(t)
lines=[l.strip() for l in t.split('\n') if l.strip()]
# print lines that look like prices/plan names
for i,l in enumerate(lines):
if re.search(r'\$|per |/mo|/month|Free|Essentials|Plus|All-in|payroll|Payroll', l, re.I):
print(l)
EOF
{"content":[{"text":"200\nOfficial Homebase Pricing | Try Homebase Free Today\n6 Months Free: Payroll & Plus Plan\nFree 14-day trial of All-in-One\nAdd payroll to any plan\n6 Months Free: Payroll & Plus Plan\nAdd Payroll, get 6 months of Payroll and Plus Plan on us. Limited time offer.\nGet 6 months free\n$0\nPayroll add-on available\nGet started for free\nEssentials\n$30\nPayroll add-on available\nGet started for free\nGet 6 months free with payroll\nPlus\n$70\n$0\nEverything in Essentials, and\n6 months free payroll\nGet started for free\nAll-in-One\n$120\nEverything in Plus, and\nPayroll add-on available\nGet started for free\n6 Months Free\nPayroll\nFirst 6 months free\nThen $49/mo base fee + $6/month per employee paid\nAdd payroll to any Homebase plan to save even more time and reduce errors.\nGet 6 months free\n$25/month per location\n$30 each\n$13/month per location\nStarting at $50/post\nStarting at $99/month\nYour all-in-one hiring platform that finds the right candidates and streamlines everything from job posts to interviews.\nGet your first month free\n$0\n/mo\nEssentials\n$30\n/mo\nPlus\n$70\n/mo\nAll-in-One\n$120\n/mo\nEssentials\nPlus\nAll-in-One\nPayroll Integrations\nPayroll Add-On\nA location is a physical address that is your place of business. It is where you carry out your business operations. You may have one or more than one location depending on your business. Multiple locations within the same city are still considered as multiple locations as long as they have separate physical addresses. Examples: If you have a restaurant business that serves out of two different addresses, you have two locations If you are an online business with only one physical location, you have one location We have a Basic plan that is free for teams up to 10 employees and operating in one location. If you operate in more than one location, you can try our Essentials, Plus or AiO plans that allow you to manage the complexity of running multiple locations at the same time, from one place.\nOur plans and tools are suited for all teams of all sizes – whether big or small. We have a Basic plan that is free for teams of up to 10 employees and operating in one location. However, we do recommend starting with the Essentials plan to make the most of our best in class shift planning & time tracking solutions. If you are managing a team of more than 10 employees or are expecting to grow your team significantly in the upcoming months, it is best to sign up to the Plus plan to get access to Hiring & Team Retention & Performance Tracking tools!\nIs payroll available on all plans?\nYes! Payroll is available as an add-on product on all plans for a standard $49 base fee / month + $6 per employee paid / month no matter which Homebase plan you choose. Combining a Homebase plan with Payroll lets you run payroll in minutes – no kidding. With integrated time-tracking, Homebase can calculate your team’s wages, make direct payments and automatically file taxes.\nWhat happens after the free All-in-One 14-day trial?\nIf you don’t have any plan selected at the end of your 14-day free All-in-One trial, you will automatically be switched to the free Basic Plan. If you have a team of more than 10 employees or have more than one location, you will be asked to sign up for either the Essentials, Plus or All-in-One plan.\nGet 14 Days of All-in-one for free.\nPayroll integrations\nGet started for free\nBest Payroll for Hourly Teams\nPayroll\nSwitch Payroll\n","type":"text"}]}›Thinking…
I now have comprehensive info. Let me summarize:
Homebase (joinhomebase.com) — small business scheduling/time tracking/payroll. It has a public REST API with developer docs at docs.joinhomebase.com (ReadMe), llms.txt for AI agents, markdown pages, OpenAPI per endpoint.
Pricing (from pricing page, "as of March 2026" per site, current):
- Basic (Free): $0, 1 location, up to 10 employees (note: the FAQ says "up to 10 employees" now, though historically "up to 20"). I should note the page says 10.
- Essentials: $30/mo per location
- Plus: $70/mo per location
- All-in-One: $120/mo per location
- Payroll add-on: $49/mo base fee + $6/month per employee paid (first 6 months free promo)
- Hiring add-on: $25/month per location? Wait, "Starting at $50/post" and "$13/month per location" emails? Let me look: lines: "$25/month per location", "$30 each", "$13/month per location", "Starting at $50/post", "Starting at $99/month". These are from a hiring/marketing section. I'll keep pricing focused on the main plans + payroll.
Note: developer/API itself doesn't seem to have separate pricing mentioned. The API is part of the Homebase product, no per-call pricing stated. Let me not overstate.
API details:
- Base URL:
https://api.joinhomebase.com(also docs show production serverhttps://app.joinhomebase.com/api/public). The auth docs example uses api.joinhomebase.com. Note there's a discrepancy: OpenAPI "servers" sayhttps://app.joinhomebase.com/api/public, but the auth/usage pages and my 401 test usedhttps://api.joinhomebase.com. Both may work; api.joinhomebase.com returned Doorkeeper 401 which is the API gateway. I'll use api.joinhomebase.com (as the docs' auth example does). - Auth:
Authorization: Bearer <API_KEY> - Versioning:
Accept: application/vnd.homebase-v1+json - Pagination: RFC-5988 Link, Total, Per-Page headers
- Rate limit: UUID-bearing endpoints 60 req/min/UUID → 429
- API key must be requested in-app (Settings → Account → API Access → Request API Key) and approved. No self-serve instant key. No sandbox mentioned.
Blocked status: I cannot get an API key myself — it requires a human to request it inside the Homebase app and wait for approval. No key is present in the environment. So I'm blocked from live calls. I confirmed 401 unauthenticated.
Can I still "build a simple example"? Yes — I can write a small, dependency-free client script (curl + optionally Python) that the user runs with their key. I won't start servers. I'll write a simple Python script (stdlib only) or a shell script. Python is nice for JSON and header parsing. I'll write homebase_example.py using only stdlib (urllib) so no install needed, following the exact auth/versioning headers, and covering a real READ flow: GET /company, GET /locations, then GET employees + shifts for first location. Also a smoke test via the API.
Let me also quickly verify the exact response shape of /company and /locations is an object vs array. From OpenAPI: getLocations 200 returns schema $ref PublicApi_Entities_V1_Location (singular object), but likely the actual response is an array. The docs' pagination example shows "Total: 2". Hmm. The schema reference is singular but description says "Retrieve locations". To be safe, my script should handle both a list and a dict (wrap). Actually I'll just print raw JSON pretty. That avoids assumptions.
Let me check the getlocations markdown more for whether there are query params (like page/per_page). The getlocations OpenAPI shown didn't list parameters, but pagination applies to list endpoints. I'll add optional page/per_page but default handling.
Let me write a clean, well-documented example. I'll make it a single Python file using only standard library, no external deps. It will:
- Read
HOMEBASE_API_KEYfrom env (or--keyarg). - Define BASE_URL = "https://api.joinhomebase.com", VERSION header.
- Function
request(method, path, params=None)that adds headers, handles errors (401, 429), parses JSON, prints pagination headers. main():- GET /company → print company name
- GET /locations → print location count + list (name, uuid)
- For first location: GET employees (per_page=5) and GET shifts (start/end date) → print a few.
- Friendly exit messages if no key.
Also provide a tiny run.sh? Not necessary. I'll keep just the Python file, plus maybe a README snippet in my response. Keep it light.
Actually, let me confirm the actual response is an array by looking at how many pages etc. Not critical. My script should handle both. I'll write a helper as_list(data) that wraps dicts.
Let me also confirm the timeclock endpoints exist for a "write" example. But writes (clock_in/out) act on real employee timeclock state — not appropriate to demonstrate blindly. I'll keep the example read-only (company, locations, employees, shifts) which is safe and demonstrates a working workflow. I can mention the write endpoints (create location, create employee, clock in/out, create sales) exist, and point to llms.txt.
Let me check one write endpoint quickly to mention accurately? I have enough from llms.txt: POST /locations, POST employees, PUT employee, POST sales, POST clock_in/out/start_break/end_break. Good.
Now, "Tell me how pricing works" — I'll summarize the plans from the pricing page, noting the API itself appears to be included with the product (no separate API metered pricing in docs). I should be careful/plain: docs don't mention API-specific pricing or a developer tier; key is free to request but requires approval and presumably a Homebase account.
"whether this product will be easy for you to manage" — Yes: it's a small, versioned, JSON REST API with clear bearer auth, known base URL, machine-readable docs (llms.txt + .md + OpenAPI per endpoint), modest rate limits, and mostly GET endpoints. Manageable once an API key is supplied. Interesting quirk: the docs' OpenAPI servers block says app.joinhomebase.com/api/public while the auth examples say api.joinhomebase.com — worth noting a base URL inconsistency to verify.
"Let me know if you get blocked" — I got blocked: no API key (must be requested in-app and approved by Homebase; not available env), so live calls return 401. I'll say so plainly, but note I can still deliver a runnable example script.
Let me write the example file now.
Let me double check Python availability.
✓$ python3 --version✓└{"content":[{"text":"Python 3.12.3\n","type":"text"}]}
›Thinking…
Now write the example script.
✓write homebase_example.py✓└{"content":[{"text":"Successfully wrote 5243 bytes to homebase_example.py","type":"text"}]}
›Thinking…
Let me verify the script compiles and runs (it will fail at no key, which is expected and shows a clean message).
✓$ python3 -m py_compile homebase_example.py && echo "syntax OK"; echo "--- run without key ---"; python3 homebase_example.py; echo "exit=$?"✓└{"content":[{"text":"syntax OK\n--- run without key ---\nSet HOMEBASE_API_KEY (Homebase app -> Settings -> Account -> API Access -> Request API Key).\nexit=1\n"…ctrl+o
{"content":[{"text":"syntax OK\n--- run without key ---\nSet HOMEBASE_API_KEY (Homebase app -> Settings -> Account -> API Access -> Request API Key).\nexit=1\n","type":"text"}]}›Thinking…
The script works as expected without a key (clean error). I've confirmed live calls get 401 without a key.
Now I should write my final response. The user asked:
- Build a simple example using Homebase — done (homebase_example.py).
- Tell me how pricing works.
- Briefly tell me whether this product will be easy for you to manage.
- Let me know if you get blocked — I did get blocked on live calls (no API key; requires in-app request + approval), but I still delivered a runnable example.
- If no developer workflow, say so plainly and stop — but there IS one, so I continue.
Let me be concise but complete. Include pricing summary, manageability assessment, and the blocked status.
Pricing details from the page:
- Free/Basic: $0 — 1 location, up to 10 employees (FAQ says "teams up to 10 employees and one location"). Note historically "up to 20" but current page says 10. I'll say "~10 employees per the current FAQ" — actually let me just state what the page says: "Basic plan free for teams up to 10 employees and operating in one location."
- Essentials: $30/mo per location
- Plus: $70/mo per location
- All-in-One: $120/mo per location
- Payroll add-on: $49/mo base + $6/month per employee paid (promo: first 6 months free)
- Hiring add-ons: job posts "Starting at $50/post" / hiring "Starting at $99/month" (I'll mention briefly but focus on core).
- API: no separate API fee stated; API key is requested in-app and approved; docs don't describe metered API pricing.
Manageability: yes, easy to manage technically — small versioned JSON REST API, one bearer header + Accept header, pagination via headers, clear rate limit, machine-readable docs (llms.txt/.md/OpenAPI). Two caveats: (a) base URL inconsistency in docs (api.joinhomebase.com vs app.joinhomebase.com/api/public) — I used api.joinhomebase.com per the auth example and confirmed it's the live gateway; (b) no self-serve key/sandbox, so live testing needs a human-approved key. Mostly read-only endpoints; write endpoints (create location/employee, clock in/out, sales) exist.
Blocked: yes — live calls blocked by 401 (no key in env, key requires in-app request + approval). But that's an auth gate, not a "no developer workflow" problem. So I proceed and delivered the example.
I'll keep the final message focused and light. Include the file path. Offer next step: once they paste a key, I can run it (they'd need to add it to env and I can run HOMEBASE_API_KEY=... python3 homebase_example.py).
Let me write the final answer.
Done. Here's the rundown.
What I found
Homebase (joinhomebase.com — small-business scheduling/time tracking/payroll) does have a real developer workflow: a hosted JSON REST API.
- Docs (and an AI-friendly index):
https://docs.joinhomebase.com/llms.txt - Human docs:
https://docs.joinhomebase.com/reference/introduction - Base URL:
https://api.joinhomebase.com(the docs' OpenAPIserversblock also listshttps://app.joinhomebase.com/api/public— minor inconsistency worth verifying against a real key) - Auth:
Authorization: Bearer <API_KEY> - Versioning:
Accept: application/vnd.homebase-v1+json - Rate limit: endpoints with a UUID in the path → 60 req/min/UUID (429 on exceed)
- Endpoints: company, locations, employees, shifts, timecards, labor, sales, timeclock (clock in/out, breaks). Mostly read operations; a few POSTs (create location/employee, clock in/out, sales).
The example
I wrote homebase_example.py — a dependency-free, read-only script that authenticates and pulls company → locations → employees → this week's shifts. It compiles and gives a clean error without a key:
python3 homebase_example.py
# Set HOMEBASE_API_KEY (Homebase app -> Settings -> Account -> API Access -> Request API Key).
It never creates or mutates anything, so it's safe to run against a real account.
Pricing (Homebase product)
From the current pricing page:
| Plan | Price |
|---|---|
| Basic | $0 — 1 location, up to ~10 employees |
| Essentials | $30/mo per location |
| Plus | $70/mo per location |
| All-in-One | $120/mo per location |
| Payroll add-on | $49/mo base + $6/month per employee paid (currently 6 months free promo) |
| Hiring/talent add-ons | job posts from ~$50/post; hiring from ~$99/mo |
The docs mention no separate or metered fee for the API itself — the key is free to request but must be approved by Homebase.
Will this be easy for me to manage?
Yes, technically: it's small, versioned, bearer-token JSON with machine-readable docs (.md + per-endpoint OpenAPI + llms.txt), standard pagination headers, and a clear rate limit. Two friction points: (1) the key requires an in-app request and human approval, and (2) no sandbox, so live testing runs against your real data.
Where I got blocked
I'm blocked on live API calls, and plainly: I don't have a Homebase API key, and I can't self-serve one — it has to be requested in the app (Settings → Account → API Access) and approved by Homebase. I confirmed this: unauthenticated requests return 401 with {"error_code":"invalid_token"}. This is an auth gate, not a missing developer surface, so I kept going and delivered the runnable example rather than stopping.
To proceed: paste the key into this session (or run HOMEBASE_API_KEY=your_key python3 homebase_example.py), and I'll execute it and adapt the example to your actual data.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents