You’re building a golf club’s website, app or back-office system and want it to take bookings through Verde. Start here: it covers which way in fits your job, how access works, the rules every call follows, and the behavior worth knowing before you ship. The endpoint-by-endpoint detail is in the Booking API reference.
Verde’s own booking, in a frame on the club’s website, in the club’s colors, with payments, confirmations and every club rule included. Use it unless you have a reason not to: it’s the same screens golfers use on the club’s Verde site, so it’s always complete and always current. How to add it.
A JSON API, called from your server, for times, prices, bookings, cancellations and card payments across tee times, simulators, courts, rooms, dining, tournaments and private events. Use it when the booking has to live inside something you build - a mobile app, a resort system, a custom flow. Reference.
A signed POST to your https address whenever one of the club’s bookings is made, paid for or canceled - however it was made, including at the counter and in the member app. Use them to keep another system in step instead of polling. Webhooks.
They combine: the embed for booking and webhooks into the club’s CRM is a common pairing.
Everything is set up by the club, in Verde, under Website → API. Booking on outside websites has to be switched on for the club first; if it isn’t, the embed shows a short message and the API answers 402 module_inactive.
Origin header, so a key pasted into a web page or app bundle simply won’t work - by design.Prices come from the club’s own rates, fees, tax and time of day - never from you. Quote first, show that price, then book with expected_total_cents. If the price moved in between, the booking is refused with price_changed rather than charging something the golfer didn’t agree to. Every club rule - how far ahead, how many players, members-only times, account-required settings - is enforced when you book, and you get the club’s own message when one says no.
Bookings are a guest’s unless a member signs in with Sign in with Verde: a standard authorization-code sign-in on Verde, a code swapped on your server for a member token, and Verde-Member on later requests. How.
A club opening a season of tee times at once can put them through a line: golfers wait in a waiting room and book on their turn. For those dates the API offers no times and answers release_in_progress with the waiting room’s link - send the golfer there. When the release ends, booking through the API resumes. Details.
When a club takes payment up front, a booking call answers payment_required. Take the card like this - card details go from the golfer’s browser straight to Stripe and never touch your server or ours:
your server POST /payments { type, ...booking } -> { id, client_secret, publishable_key,
stripe_account, amount_cents }
your page Stripe.js: confirm the card with client_secret (and stripe_account if set)
your server POST /payments/{id}/complete -> { booking } or booking_refused_refundedVerde-Signature from the raw body with the signing secret, and reject a timestamp more than five minutes old. The reference has the code.Verde-Event-Id you’ve seen. Events for the same booking can arrive out of order; trust the status in the newest one you receive, or re-read the booking.Keys are live keys - there is no separate sandbox yet - so ask the club (or Verde) for a quiet part of the tee sheet or a test resource to book against, and cancel test bookings through the API when you’re done so they don’t sit on a real tee sheet. Card payments on a live club are real charges: arrange card testing with Verde before you try them. Point webhooks at a request-inspection service such as webhook.site and press Send a test in Verde.
Version 1 (/v1) only grows: new endpoints, new optional fields, new event types, new error codes. We won’t rename or remove a field, change a field’s meaning, or make an optional field required within v1. Write your code to ignore fields and event types it doesn’t know. Anything that would break an integration will be a /v2, announced well ahead.