VTee API

A REST API for building on top of your VTee business — pull your booking calendar into home-automation dashboards, let an AI call agent check availability and book bays, or sync reservations into your own tools. JSON in, JSON out, scoped to your business by an API key. Building a venue's website instead? The website widgets need no key at all.

Request an API key
Base URL  https://vteegolf.com/api/v1

Getting started

Every request is scoped to a single VTee business by its API key — there is no business ID in the URL. To get a key for your integration (an AI call agent, a Home Assistant setup, a partner app), fill in the request form below. Keys are issued per integration, shown once at creation, and can be rotated or revoked at any time without affecting your other integrations.

curl https://vteegolf.com/api/v1/business/info \
  -H "Authorization: Bearer vtk_your_api_key"

Request an API key

Tell us what you're building and which business the integration serves. Keys are issued by hand — one per integration, so a single key can be rotated or revoked without touching the rest — and emailed to you once. We confirm with the business owner before issuing a key for a venue you don't run.

Every key is scoped to one business. Building for someone else's venue? Name theirs — we confirm with the owner before issuing.

What this key gets called on our side — one per integration, so it can be rotated on its own.

Endpoints you expect to use

Not sure yet? Leave it blank — keys aren't restricted per endpoint today, this just tells us what to keep an eye on.

Keys are issued by hand, usually within one business day.

Authentication

Send your key on every request as a bearer token. Keys start with vtk_.

Authorization: Bearer vtk_...
  • A missing or malformed header, or an invalid or revoked key, returns 401.
  • Treat the key like a password: server-side only, never in a browser, mobile app, or repository. If a key leaks, ask for a rotation — the old key stops working the moment the new one is issued.

Rate limits

Each API key may make 120 requests per minute across all endpoints (a fixed one-minute window). Higher limits can be granted per key — ask when you request the key. When the limit is exceeded, requests return 429 until the window resets:

HTTP/1.1 429 Too Many Requests
Retry-After: 21
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 21

{ "error": "Rate limit exceeded — try again shortly" }
  • Retry-After / X-RateLimit-Reset — seconds until the window resets. Wait that long before retrying.
  • X-RateLimit-Limit / X-RateLimit-Remaining — your per-minute ceiling and what is left of it. Rate-limit headers are also included on successful responses from newer endpoints (such as the bookings calendar), so clients can pace themselves before hitting the wall.
  • Back off exponentially on repeated 429s rather than hammering the reset.

Conventions & errors

  • All requests and responses are JSON. Dates are YYYY-MM-DD strings and times are 24-hour HH:MMstrings, both in the business's local timezone (returned by business info). Durations are integer minutes.
  • Read endpoints that matter to voice platforms have a POST twin that accepts the same arguments in the JSON body — platforms like Retell can only POST LLM-generated arguments to a static URL. The twin also unwraps arguments nested under a top-level args object, so Retell custom functions work without a wrapper.
  • Multi-location businesses can pass locationId on most endpoints; omitting it uses the default location (or all locations for the calendar feed).

Errors always carry an error message:

{ "error": "Missing or invalid date parameter (YYYY-MM-DD)" }
StatusMeaning
400Invalid or missing parameters
401Missing, invalid, or revoked API key
404Resource not found (or belongs to another business)
409Conflict — e.g. the slot was just taken, or the time is appointment-only
429Rate limit exceeded — retry after Retry-After seconds
500Something went wrong on our side

Need an endpoint that isn't here, or a higher rate limit than the form covers? Get in touch — the API grows with what integrators need.