All projects
VenueVox AI
Sole builder

VenueVox AI

A performer can ask which slots are open, and request one, over the phone.

Proof

2 tools
The agent can query open slots or request a booking
Pending
A phone request is stored until the venue approves it
Fallback
If Gemini fails, the webhook speaks up to three slots from the database

The problem

Venues and performers trade availability over calls and email. The caller cannot see the calendar, and the venue cannot tell which request belongs to a real slot.

What I built

I built the marketplace and the phone path alone. Venues publish calendar slots. Performers discover them and send a request. Each organization can provision a Vapi receptionist whose tools read and write that venue's rows in PostgreSQL.

How it helps businesses and services

  • A venue can take a performer call when nobody is free to answer. The receptionist only talks about slots that are still open.
  • The call becomes a pending booking on that venue's calendar, so staff approve a real slot instead of reconstructing the request from notes.
  • Performers request a published time instead of emailing back and forth before a date is even possible.
  • One organization can run this across its venues, each with its own calendar and receptionist.

How it works

  1. 1

    Call

    A performer phones the organization's Vapi receptionist.

  2. 2

    Normalize

    The phone service sometimes hides the tool name inside a nested object, and sometimes sends the arguments as text. The server reads both shapes. Without that, it did not know which action to run.

  3. 3

    Query

    The lookup loads slots that are still open, dated in the future, and limited to that organization.

  4. 4

    Speak

    Gemini writes the spoken answer and is told never to say a slot id. If that call fails, a local fallback describes up to three slots with the weekday, date, and 12-hour times.

  5. 5

    Book

    The booking step writes a pending request. The same result includes the slot ids, so the receptionist can book without saying them. The venue approves or rejects from the calendar.

The hard part

The tool name never reached the handler

The phone service sometimes wraps the tool name inside a nested object, and sends the arguments as text. The server was reading the usual fields, found nothing, and replied that the action was unsupported. It now accepts both shapes before it looks up open slots or writes a booking. The spoken answer and the slot ids travel together: the reply is not allowed to say the ids, and the booking step uses them.

Stack

Backend

API

Express.js
JWT Auth
Swagger

Data

PostgreSQL
Prisma ORM

Voice

Vapi AI
Gemini AI

Delivery

Docker

Frontend

App

Next.js 16
React 19
Typescript
Tailwind CSS 4

State

Redux Toolkit
Zustand

Interface

Radix UI
Recharts
Sonner

What I owned

  • Venue and performer dashboards, with calendar slots and an approve or reject path
  • Checks that reject overlapping slot times
  • A voice receptionist per organization, with provision and deprovision
  • Call logs stored against that assistant
  • Messages between a venue and a performer on a request
  • Prisma models, a Swagger spec, and Docker Compose for Postgres, the API, and the web app
    VenueVox AI | Sahil Jain - Full Stack Engineer