Venue API
Your booking system calls us when a host taps Make your invites, when a booking moves or is cancelled, and, if you like, to say which packages offer invites. Nothing is sent to us before the host taps.
The full contract, served without a key and generated from the same schemas the API validates with. Point your client generator at it.
Overview
When a parent books a party with you, your confirmation page and emails show a Make your invites button. When they tap it, your server calls us with the party details, and we reply with a link to send them to. They land on an invite with the date, time and place already filled in and locked, pick a design and share it. Your team then sees the party’s headcount in the venue dashboard: numbers only, never guests’ names or notes.
- Data moves only when the host taps, so a booking that never makes invites is never shared with us.
- The booking email is included so only the person who booked can claim the invite.
- Calls are idempotent per booking: a repeat handoff for the same reference returns the same link.
- Any party works, not only a children’s birthday: send the occasion, or set one per package in your venue dashboard.
Authentication
Every call carries your venue’s API key as a bearer token. Create and revoke keys in the venue dashboard; keep them on your server, never in a browser or an email.
Authorization: Bearer YOUR_API_KEYStart with a test key, which begins rsvps_test_. It works exactly like a live key, but every invite it makes is marked Test, is kept apart from your live bookings even when the reference is the same, and sends no reminders or updates. Packages it names are never added to your settings or renamed. Switch to a live key, which beginsrsvps_live_, when your integration is ready for real parents.
The API keys page in your venue dashboard lists the last 50 bookings your keys sent in the past 30 days, with what happened to each: an invite started, the same booking sent again, or a refusal and why, down to the fields a request got wrong. Once you have a test key, Send a test booking there sends a practice one so you can watch it arrive.
Each key can make 120 requests a minute. To rotate a key, create a new one, switch your server over to it, then revoke the old one. The base URL ishttps://app.inviteroo.com.
Create a handoff
PUT/api/v1/venue/handoffs/:externalRef
Call this when the parent taps the button. externalRef is your booking reference: letters, numbers, dots, dashes and underscores, up to 64 characters. Send a JSON body; unknown fields are rejected.
| Field | Type | Required | What it is |
|---|---|---|---|
occasion | one of "kids_birthday", "adult_birthday", "baby_shower", "bridal_shower", "christening", "gender_reveal", "hen_do", "stag_do", "halloween", "christmas", "dinner", "get_together", "memorial", "first_birthday" | No | What the party is. Leave it out for a children’s birthday, or to use the occasion you set for the package in your venue dashboard. One of kids_birthday (Kids’ birthday), adult_birthday (Adult birthday), baby_shower (Baby shower), bridal_shower (Bridal shower), christening (Christening), gender_reveal (Gender reveal), hen_do (Hen do), stag_do (Stag do), halloween (Halloween), christmas (Christmas), dinner (Dinner at home), get_together (Any get-together), memorial (Memorial or celebration of life), first_birthday (First birthday). Only occasions open to hosts are accepted. |
childFirstName | text, 1 to 40 characters | Yes | The first name of the person the party is for: the child, for a children’s party. It goes on the invite. |
childAge | whole number, 0 to 120, or null | No | The age they’re turning, if you know it. Leave it out or send null if not. Birthdays only. |
partyDate | date, YYYY-MM-DD | Yes | The party date, local to the venue (Europe/London): today or later. A booking whose date has passed is refused, unless its invites were already made, when you get the same link back. |
startTime | time, HH:MM (24-hour) | Yes | When the party starts, local to the venue. |
endTime | time, HH:MM (24-hour) | Yes | When the party ends, local to the venue. A time at or before the start means the party runs past midnight. |
hostFirstName | text, up to 40 characters | No | The host’s first name, used to greet them. Optional. |
capacity | whole number, 1 to 1000, or null | No | How many places the booking is for, if you limit it: children for a children’s party, guests for a grown-up one. If your venue settings show it, guests can’t reply coming for more than this, and the host sees it as “booked for up to N” and can lower it. Optional. |
roomName | text, 1 to 80 characters | No | The room or space booked, as you name it, such as “Jungle room”. If your venue settings show it, it is shown to the host and their guests with your address. Optional. |
bookingEmail | email address | Yes | The email address on the booking. Only someone signed in with this address can save the invite. We keep a one-way hash and a masked hint, never the address itself. |
bookingPhone | text, up to 32 characters | No | The UK mobile number on the booking, in any usual form (07700 900123 or +44 7700 900123). Someone who signs in by text with this number can save the invite, as the booking email can. We keep a keyed hash and a masked hint, never the number. Optional. |
bookingType | object with "id" and "name" | No | The party package booked: your id for it and its name. You choose in your venue dashboard which packages offer invites; a package you have switched off is refused with not_offered. Optional. |
curl -X PUT https://app.inviteroo.com/api/v1/venue/handoffs/BB-20417 \
-H "Authorization: Bearer $RSVP_SORTED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"childFirstName": "Mabel",
"childAge": 7,
"partyDate": "2027-10-17",
"startTime": "14:00",
"endTime": "16:00",
"hostFirstName": "Jo",
"bookingEmail": "jo@example.com"
}'A successful call returns 200 with the link to redirect the parent to, usually with a 303 See Other from your own route:
{ "url": "https://app.inviteroo.com/start/…" }Make the call outside any database transaction on your side, and if it fails, show the host a friendly “Invites are having a moment, try again shortly” page. The link opens the host’s draft, so never store it, log it or put it in an email: hand it over with a redirect from a button they pressed.
Moves and cancellations
PATCH/api/v1/venue/bookings/:externalRef
Call this whenever a confirmed booking changes date or time, or is cancelled or expires. It carries no personal data. If the parent has shared the invite, guests see the new details, or that the party is cancelled, the next time they open it.
| Field | Type | Required | What it is |
|---|---|---|---|
partyDate | date, YYYY-MM-DD | Yes | The booking’s date now, local to the venue. A confirmed booking can’t move to a date that has passed; a cancellation is taken whatever its date. If the host’s reply-by date no longer falls before the party, it moves to the day before the party (the party day itself, for a party today). |
startTime | time, HH:MM (24-hour) | Yes | The booking’s start time now. |
endTime | time, HH:MM (24-hour) | Yes | The booking’s end time now. A time at or before the start means the party runs past midnight. |
status | one of "confirmed", "cancelled" | Yes | Send cancelled when the booking is cancelled or expires; confirmed otherwise. |
curl -X PATCH https://app.inviteroo.com/api/v1/venue/bookings/BB-20417 \
-H "Authorization: Bearer $RSVP_SORTED_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "partyDate": "2027-10-24", "startTime": "14:00", "endTime": "16:00", "status": "confirmed" }'It returns { "updated": true }. A 404 means the host never made invites, so there is nothing to update. Send these from a queue and retry with backoff on anything else, including a 503 while updates are paused.
Packages that offer invites
A package is a party product your booking system sells, such as a jungle party or an adult hire. Name it in each handoff’s bookingType and we learn it from there; you then choose in your venue dashboard which packages offer invites, and what each one’s invites start as. Two optional calls keep your system in step.
GET/api/v1/venue/booking-types
Ask before showing the button, and cache the answer for a few minutes. Show the button when the venue-wide switch is on and the booking’s package offers invites, or, for a package we haven’t seen, when new packages are set to offer.
| Field | Type | Always sent | What it is |
|---|---|---|---|
offerInvites | true or false | Yes | The venue-wide switch. When false, show the button for no booking, whatever its package. |
newBookingTypes | one of "offer", "ask" | Yes | What happens to a package we haven’t seen yet: offer means its bookings offer invites straight away, ask means they wait until you switch it on. |
bookingTypes | list of object with "id" and "name" and "offerInvites" | Yes | Every package we know, with its id, name and whether its bookings offer invites. |
PUT/api/v1/venue/booking-types/:bookingTypeId
Registers or renames a package ahead of any booking, so the venue can decide on it before anyone books. bookingTypeId is your own id for it: letters, numbers, dots, dashes and underscores, up to 64 characters. It never changes whether the package offers invites; that stays with the venue dashboard. Send it from a queue too: while handoffs are paused it answers 503 and changes nothing, so retry it with backoff.
| Field | Type | Required | What it is |
|---|---|---|---|
name | text, 1 to 80 characters | Yes | The package’s name, as your staff know it. Sending a new name renames it. |
curl https://app.inviteroo.com/api/v1/venue/booking-types \
-H "Authorization: Bearer $RSVP_SORTED_API_KEY"
curl -X PUT https://app.inviteroo.com/api/v1/venue/booking-types/jungle-party \
-H "Authorization: Bearer $RSVP_SORTED_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Jungle party" }'The GET answers with your venue-wide switch and every package with whether it offers invites, as in the table above. The PUT answers with the package as we now hold it:{ "id": "jungle-party", "name": "Jungle party", "offerInvites": true }.
Errors
Errors are RFC 9457 problem details (application/problem+json) with a stable code. Log the code and the status, never the body you sent, which carries personal data.
| Status | Code | What to do |
|---|---|---|
| 400 | invalid_request | The reference or body doesn’t match the schema. errors lists each field that failed, as a JSON pointer. |
| 401 | unauthorised | The API key is missing, wrong or revoked. |
| 403 | not_offered | Invites are switched off for your venue or for this package. Treat it like any other failure and don’t show the button for that package. |
| 404 | not_found | For a booking update, the host never made invites for this booking: safe to ignore. On any other call, the path doesn’t exist; check it against this page. |
| 405 | method_not_allowed | The path exists but not with that method; the Allow header says which. |
| 429 | rate_limited | More than 120 requests in a minute with one key. Wait for the seconds the Retry-After header gives, then retry. |
| 500 | internal_error | Something went wrong on our side. Retry with backoff, and tell us if it keeps happening. |
| 503 | unavailable | Handoffs, booking updates and package registrations are paused on our side. For a handoff, show the host a friendly message and let them try again shortly; keep a booking update or a package registration queued and retry it with backoff. |
Where to show the link
- On your booking confirmation page, next to Add to my calendar, for confirmed and paid bookings only.
- In the booking confirmation and payment emails, as a link to a page on your site with one button. Mail scanners and link previews open links before anyone clicks, so the handoff itself must only ever happen from a button someone pressed, never from the email link.
- Wherever hosts look up their booking.
Suggested wording: “Make invites for Mabel’s party in a minute, free with your booking.” The button itself says Make your invites.
Security and data
- We store the first name and age of the person the party is for, the occasion, the party date and times, the room, the package, the number of places, the booking reference and the parent’s first name. For the booking email and mobile number we store a keyed hash and a masked hint only.
- Booking updates carry no personal data.
- The list of bookings received keeps each booking’s reference, package, outcome and key for 30 days, and nothing about the family.
- Invites, replies and everything attached to them are deleted 90 days after the party.
- Your dashboard shows each party’s numbers: children coming, grown-ups staying and who is still to reply. Never guests’ names, notes or contact details.
- We act as a separate controller for the host’s and guests’ data. Add a line to your privacy notice saying that if a parent chooses to make invitations, you share their child’s first name and age, the occasion, the party’s date, times, room, package and number of places, the booking reference, their first name, and the email address and mobile number they booked with, with Inviteroo.
Questions about connecting? Email hello@rsvpsorted.com.