← bizvoid

Bookings API

Send bookings from any booking tool to a business in bizvoid. This is the API the bizvoid apps for Make and Zapier call, and any tool that can send an HTTP request can call it too.

Base URL: https://www.bizvoid.com/api/bookings
Last updated: October 2026

Overview

Each business in bizvoid, your own or an agency client's, can turn on an incoming booking link. A booking sent to it lands in that business's Bookings tab, where its Appointment reminder and Review request agents can text the customer.

There are two calls. Both use HTTPS and answer in JSON.

Bookings from other tools come with the Pro and Agency plans, for your own business and for each of your clients.

Authentication

A business's booking link is its credential. There is no API key or app to register.

Get the link

  1. In bizvoid, open Agents, then My business or one of your clients.
  2. Open the Booking tools tab. If the link isn't on yet, press Turn on my link.
  3. Press Copy link.

Each business has its own link. It looks like this:

https://www.bizvoid.com/api/bookings/in/YOUR_BOOKING_SECRET

The last part is the secret: 20 to 100 letters, digits, hyphens or underscores. In the examples on this page, put your secret in place of YOUR_BOOKING_SECRET.

Keep it secret

Anyone with the link can add, move and cancel that business's bookings, so treat it like a password. Keep it out of shared documents, screenshots and support chats. If it gets out, open Booking tools and replace it or turn it off:

Either way, the old link answers 404 from then on.

Send it in a header

Authorization: Bearer YOUR_BOOKING_SECRET

This is what the bizvoid apps for Make and Zapier send. bizvoid also accepts X-Bizvoid-Booking-Key: YOUR_BOOKING_SECRET.

A tool that can only call a URL, like Make's HTTP module or Webhooks by Zapier, can use the whole link instead: send bookings to the link itself, and check it at the link with /me added. Use the header when you can, because URLs end up in logs.

curl -X POST https://www.bizvoid.com/api/bookings/in/YOUR_BOOKING_SECRET \
  -H "Content-Type: application/json" \
  -d '{"phone": "+1 512 555 0141", "start_time": "2026-11-05T14:00:00-06:00"}'

GEThttps://www.bizvoid.com/api/bookings/in/me

Answers with the name of the business the link is for. The bizvoid apps for Make and Zapier call it when you connect, and show the name next to the connection.

curl https://www.bizvoid.com/api/bookings/in/me \
  -H "Authorization: Bearer YOUR_BOOKING_SECRET"

The answer:

{
  "success": true,
  "data": {
    "business": "Example Hair Studio"
  }
}

business is the name bizvoid uses for the business. When it has none, it is My business, or Client for an agency's client.

It can answer 403, 404, 429, 500 or 503, as in Errors. With the link as the URL, it is GET https://www.bizvoid.com/api/bookings/in/YOUR_BOOKING_SECRET/me.

Send a booking

POSThttps://www.bizvoid.com/api/bookings/in

Creates a booking, or moves or cancels one sent before. Send one booking per request, as a JSON object. Form fields (application/x-www-form-urlencoded or multipart/form-data) work too. A JSON or form-encoded body can be up to 20,000 characters.

curl -X POST https://www.bizvoid.com/api/bookings/in \
  -H "Authorization: Bearer YOUR_BOOKING_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Jordan Lee",
    "phone": "+1 512 555 0141",
    "email": "jordan@example.com",
    "start_time": "2026-11-05T14:00:00-06:00",
    "duration_minutes": 30,
    "service": "Haircut",
    "booking_id": "bk_10482"
  }'

With the link as the URL, it is POST https://www.bizvoid.com/api/bookings/in/YOUR_BOOKING_SECRET.

Fields

name
Optional The customer's name, up to 200 characters. You can send first_name and last_name instead. A new booking without a name is saved as Customer.
phone
Phone or email The customer's mobile with the area code, like +1 512 555 0141: digits, spaces and + ( ) . - only. A number without + is read as US or Canada (10 digits, or 11 starting with 1). Other countries need + and the country code. Every booking needs a phone or an email, except a cancel.
email
Phone or email The customer's email address, up to 200 characters.
start_time
Required When the booking starts, no more than 2 years before or after now. See Dates and time zones. Not needed to cancel by booking_id.
end_time
Optional When it ends: after start_time, and at most 24 hours later. Wins over duration_minutes.
duration_minutes
Optional How long it is, in whole minutes from 1 to 1440, like 30. Only used without end_time. With neither, the booking is 60 minutes.
time_zone
Optional A time zone name, like America/Chicago. Only used for times sent without a time zone.
service
Optional What was booked, like Haircut. Saved as the first line of the booking's notes, cut at 200 characters.
notes
Optional Anything else to keep with the booking, saved under the service, cut at 1,000 characters.
booking_id
Best to send The booking's ID in your booking tool, up to 200 characters. A booking sent again with the same ID updates the one already saved. See Sending a booking again.
status
Optional Empty or booked for a new booking, rescheduled, or cancelled. confirmed, scheduled and created also mean booked, and any word with cancel in it, like canceled or invitee.canceled, means cancelled. Anything else is refused.
agreed_to_texts
Optional yes if the customer ticked the box for texts about the appointment (the words are under Booking tools, Texts to your customers), and no if they didn't. true, 1 and on also mean yes, and false, 0 and off mean no. A booking without a yes here gets its confirmation and reminders by email, never by text.
agreed_to_review_texts
Optional yes if the customer ticked the second box, for one review request by text after the appointment, and no if they didn't. A review request is only texted with a yes here.

Field names are matched without case, spaces or punctuation, so start_time, Start Time and startTime are the same field. Names booking tools often use work too, like phone_number, mobile, start, end, event_id and invitee_email. A nested object is read with its parent's name in front, so {"customer": {"phone": "..."}} is customer_phone. A JSON list holding one booking is read as that booking; a longer list is refused.

Dates and time zones

start_time and end_time take ISO 8601. Send the time zone with the time when you can:

They also take Unix time in seconds or milliseconds, and text like 11/05/2026 2:00 PM (month first), November 5, 2026 2:00 PM and 5 November 2026 14:00.

A time with no time zone is read in time_zone when the booking has one, and otherwise in the business's own time zone in bizvoid. If bizvoid doesn't know the business's time zone, the booking is refused with a 400. It is never guessed as UTC.

A date with no time is refused, and so is a start more than 2 years before or after now. Answers give times in UTC, like 2026-11-05T20:00:00.000Z.

Sending a booking again

bizvoid never saves the same booking twice. It first looks for one the business already got from its link:

Then:

Each update is read as a whole booking: send end_time or duration_minutes again, or its length goes back to 60 minutes. A name, phone, email or notes left out keep what was saved, and agreed_to_texts and agreed_to_review_texts both left out keep the answers already saved.

Two copies with the same booking_id sent at the same moment still make one booking, so a retry is safe.

curl -X POST https://www.bizvoid.com/api/bookings/in \
  -H "Authorization: Bearer YOUR_BOOKING_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "booking_id": "bk_10482",
    "status": "rescheduled",
    "phone": "+1 512 555 0141",
    "start_time": "2026-11-06T10:00:00-06:00",
    "duration_minutes": 30
  }'
curl -X POST https://www.bizvoid.com/api/bookings/in \
  -H "Authorization: Bearer YOUR_BOOKING_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"booking_id": "bk_10482", "status": "cancelled"}'

Responses

A booking that was read answers 200:

{
  "success": true,
  "data": {
    "action": "created",
    "message": "Booking saved.",
    "appointmentId": "8d0c6b8e-3f4a-4b7e-9a51-2f6d1c0e7a42",
    "startsAt": "2026-11-05T20:00:00.000Z"
  }
}
created
Booking saved. A new booking.
updated
Booking updated. A booking already saved, at the same time and length.
rescheduled
Booking moved to the new time. A booking already saved, at a new time or length.
cancelled
Booking cancelled. A booking already saved, now cancelled.
not_found
No matching booking was found, so nothing was cancelled. A cancel that found no booking. Nothing changed.

appointmentId is the booking's ID in bizvoid, and null for not_found. startsAt is the start time in UTC, and null for a cancel sent without a start_time.

A new booking that hasn't started yet sends the business its new booking alert. One whose start time has passed is saved without an alert, so past bookings can be sent too.

Errors

Every error answers with an HTTP status and JSON like this:

{
  "success": false,
  "error": "Missing phone or email. Send at least one so we know who booked.",
  "code": "VALIDATION_ERROR"
}

error is written for a person and says what to fix, so show it as it is. code is for your code.

400 VALIDATION_ERROR
The booking couldn't be read: a field is missing or can't be used, or the body isn't JSON or form fields. error names the field and what to send. Only a booking, a POST, gets this one. What to do: Fix the booking and send it again.
403 FORBIDDEN
The link is paused, because the bizvoid plan no longer includes bookings from other tools. What to do: Upgrade in bizvoid. The same link then works again.
404 NOT_FOUND
The link isn't active: the secret is wrong or missing, the link was replaced or turned off in Booking tools, or its business is gone. What to do: In Booking tools, copy the current link, or press Turn on my link if it was turned off, and paste it into Make, Zapier or your own tool.
429 RATE_LIMITED
Too many requests in the last minute. It comes with a Retry-After: 60 header. What to do: Wait a minute, then send it again.
500 SERVER_ERROR
Something went wrong on bizvoid's side. What to do: Send it again. With a booking_id, a retry never saves the booking twice.
503 TEMPORARILY_UNAVAILABLE
Bookings from other tools aren't switched on yet. What to do: Try again later.

A path or method the API doesn't have, like a typo in the path or GET /in, answers 404 or 405 with no JSON.

Rate limits

Each link takes up to 60 bookings a minute. Each IP address can make up to 120 requests a minute to booking links, counting every call. The counts start again at the top of each minute. Past either limit, the answer is 429 with Retry-After: 60.

Make and Zapier

The bizvoid apps call this API for you. You connect with the booking link: the app checks it with GET /in/me and names the connection after the business. The secret only goes in the Authorization header, and only to www.bizvoid.com, whatever host a pasted link names.

In both, a link that was replaced or turned off answers 404, which stops the step with bizvoid's message, so you can connect again with the new link.

Questions

Reach us at bizvoid.com/?support=1 or support@bizvoid.com.