Lyrical Systems GRM API

These are the resources available to access the Lyrical Systems GRM (Guest Relationship Management) package.

Please contact us to receive an API key to use these features.

See the overview documentation for details about response codes, error handling, organizations, sessions, and other background that will be assumed in this document.

Usage

There are two primary ways to create a reservation using the Lyrical Systems calendar:

Reservation Request

This is a simple one-shot reservation request, which adds a reservation in the new state to the calendar, to be followed up by location staff to actually confirm.

Multi-step Confirmation

This is a more involved multi-step online reservation confirmation flow.
It currently requires the additional GRM online package.

  • First the user searches for available time slots at a date and location.
  • Then after the user selects a time slot and rate, a time slot is reserved on the calendar in the reserved_online state.
  • Then the reservation is updated with additional information, including the guest identity.
  • Finally, the reservation is confirmed, which updates the reservation to the confirmed_online state, and a confirmation email is sent to the guest.

Both flows share some resources to get information about reservations.

Resource Overview

Common for both reservation flows:

Request only:

Multi-step confirmation:


Common resources:

GET /api/version/reservations/info.format

Get available values for various drop-downs, including Occasions and HDYHAUs. HDYHAU is “How did you hear about us?”.
These enumerated values are supported in the ‘occasion’ and ‘hdyhau’ fields of a reservation, respectively.

Parameters

None

Examples

To get all available form info

GET /api/v1/reservations/info

Example Response

{
  "occasions": [
    {
      "value": "birthday_adult",
      "text": "Birthday - Adults"
    },
    {
      "value": "birthday_kid",
      "text": "Birthday - Kids"
    },
    {
      "value": "company",
      "text": "Company Party"
    }
  ],
  "hdyhaus": [
    {
      "value": "returning",
      "text": "Been here before"
    },
    {
      "value": "friend",
      "text": "Friend"
    }
  ]
}

GET /api/version/reservations/guid.format

Get information about a reservation by its GUID. The intended usage is for the “Reservation Status” page on our booking website.

Parameters

  • guid (required)
    This should be a 32-character GUID identifying the reservation.
    It is returned in the response of POST /api/v1/reservations/request

Examples

To get information about the current status of a reservation

GET /api/v1/reservations/30d57d688e42410c8714ab83e0e7f343?organization=00000000000000000000000000000000

Example Response

{
    "guid": "30d57d688e42410c8714ab83e0e7f343",
    "guest_guid": "83b6062bf77d447b821839f494f5a7df",
    "first_name": "Jenny",
    "last_name": "Tutone",
    "phone": "(555) 867-5309",
    "email": "jenny@columbia.net",
    "location": "Northwest",
    "region": "Portland",
    "state": "confirmed",
    "business_date": "2015-02-14",
    "start_time": "9:30pm",
    "start_time_minus_15": "9:15pm",
    "end_time": "12:00am",
    "party_size": "8+",
    "minors": false,
    "rate_text": "based on our individual prime rate of $11 per guest per hour"
}

In the response, the state can be one of the following values:

State Category Description
new Requested The reservation has just been created. Our staff will respond to the guest ASAP.
contacted Reqeusted One of our staff has contacted the guest, and is awaiting a response.
needs_contact Requested Our staff needs to get back in touch with the guest before confirming.
wait_list Requested If there is available space, one of our staff will contact the guest to confirm.
     
penciled_in Reserved The reservation is merely penciled-in on the calendar and may be subject to change.
confirmed Reserved The reservation is confirmed and on the calendar.
reserved_online Reserved The time slot has been reserved using the multi-step confirmation flow.
confirmed_online Reserved The reservation has been confirmed using the multi-step confirmation flow.
     
arrived Active Some of the guests have arrived, but the party has not yet started.
in_progress Active The party is currently in progress.
running_late Active A guest has called ahead to inform us that the party will start soon.
     
completed Closed The party finished normally, and the reservation is complete.
no_show Closed The guests did not show up for the reservation.
cancelled Closed The reservation has been cancelled.
cancelled_online Closed The reservation was cancelled by the guest using the multi-step confirmation flow.
out_of_luck Closed The reservation was on the wait-list, but we were unable to serve them.
timed_out_online Closed The reservation timed out after inactivity during the multi-step confirmation flow.
abandoned Closed For various other reasons, the reservation was removed.

Resource for request flow:

POST /api/version/reservations/request.format

Create a new reservation request. This will put a reservation request on the Lyrical Systems calendar. The intended usage is for a booking form on our clients’ websites, such as the Book Your Box form for Voicebox Karaoke.

Parameters

  • api_key (required)
    This key is provided by Lyrical Systems to its clients.
    Without this key, clients are unable to create reservation requests.

  • first_name (required)
  • last_name (required)
    The name of the guest making the request

  • phone (required)
    A valid 10-digit phone number at which the guest may be contacted
    Ignores any punctuation, so a variety of formats may be accepted
    e.g. (555) 867-5309, 555-867-5309, 5558675309
    Accepts an optional extension, after an x, e.g. 555-867-5309x123

  • email (required)
    A valid email address at which the guest may be contacted

  • business_date (required)
    The desired date of reservation.
    Accepts a variety of formats, but the following is recommended: 2012-02-14
    Even if the start_time is after midnight, use the date on which the location last opened its doors for business prior to the start_time.

  • location (optional)
    The desired location for the reservation. For Voicebox, it may be one of ‘Northwest’, ‘Southeast’, or ‘RiNo’.
    It may also be omitted or left blank, to indicate no location preference.

  • region (optional)
    The desired region for the reservation. For Voicebox, it may be one of ‘Portland’ or ‘Denver’.
    It is only necessary to set this when there is no location provided, e.g. to specify ‘Portland’, without specifying a specific location preference.

  • start_time (required)
    The desired starting time of the reservation. It should be on a quarter-hour boundary.
    Acceptable formats include: ‘11am’, ‘11:00am’, ‘8:15pm’, ‘11pm’, ‘12am’, ‘1:45am’
    ‘8:05pm’ would not be acceptable, because it is not on a quarter-hour boundary.

  • duration (optional)
    The desired duration of the reservation in hours. Must be in intervals of a quarter-hour.
    e.g. ‘1’, ‘1.0’, ‘1.25’, ‘3’

  • party_size (optional)
    The estimated party size. Accepts a number, a bounded range, or an unbounded range.
    e.g. ‘5’, ‘5-12’, ‘14+’

  • minors (optional)
    Whether any minors under the age of 21 are expected to attend.
    One of: ‘0’, ‘1’, ‘f’, ‘t’, ‘false’, ‘true’
    Defaults to false.

  • hdyhau (optional)
    “How did you hear about us?”
    One of the values returned by a call to GET /api/v1/reservations/hdyhaus

  • occasion (optional)
    In order to best serve our guests, select the type of occasion.
    One of the values returned by a call to GET /api/v1/reservations/occasions

  • notes (optional)
    Any additional notes that the guest would like the location to be aware of.
    This may contain arbitrary text, including newlines.

  • utm_source (optional)
  • utm_medium (optional)
  • utm_term (optional)
  • utm_content (optional)
  • utm_campaign (optional)
    These optional fields indicate the corresponding Google Ad information.
    This is useful for tracking how guests discover our clients’ websites and then book reservations

Examples

To create a request, use something like the following:

POST /api/v1/reservations/request?organization=00000000000000000000000000000000&api_key=ThisIsNotARealKey&first_name=Jenny&last_name=Tutone&phone=555-867-5309&email=jenny@columbia.net&business_date=2015-02-14&location=Northwest&start_time=9:30pm&duration=2.5&party_size=8+&minors=false&hdyhau=friend&occasion=company_party&notes=I%20love%20karaoke&utm_source=google&utm_medium=cpc&utm_term=karaoke&utm_content=textlink&utm_campaign=bridal

Example Response

{
    "guid": "30d57d688e42410c8714ab83e0e7f343",
    "guest_guid": "83b6062bf77d447b821839f494f5a7df",
    "guest_new": false
}

In the response, the guid can be used to track the reservation throughout its lifetime.

The guest_guid refers to the identity of the person creating the reservation. The system tries to match to an existing guest in the GRM database, by using name, email, and phone number. If an existing guest is found, guest_new will be false. Otherwise, a new guest is created, and guest_new will be true.


Resources for multi-step confirmation flow:

GET /api/version/reservations/time_slots.format

Search for available time slots for a given date and location.

Parameters

  • api_key (required)
    This key is provided by Lyrical Systems to its clients.
    Without this key, clients are unable to create reservation requests.

  • business_date (required)
    The desired date of reservation.
    Accepts a variety of formats, but the following is recommended: 2012-02-14
    Even if the start_time is after midnight, use the date on which the location last opened its doors for business prior to the start_time.

  • location (required if multi-location)
    The desired location for the reservation. For Voicebox, it may be one of ‘Northwest’, ‘Southeast’, or ‘RiNo’.
    It may be omitted if the organization has only one location.

  • start_time (required)
    The desired starting time of the reservation. It should be on a quarter-hour boundary.
    Acceptable formats include: ‘11am’, ‘11:00am’, ‘8:15pm’, ‘11pm’, ‘12am’, ‘1:45am’
    ‘8:05pm’ would not be acceptable, because it is not on a quarter-hour boundary.

  • duration (required)
    The desired duration of the reservation in hours. Must be in intervals of a quarter-hour.
    e.g. ‘1’, ‘1.0’, ‘1.25’, ‘3’

  • party_size (required)
    The estimated party size. Accepts a postive integer.
    e.g. ‘5’

  • minors (optional)
    Whether any minors under the age of 21 are expected to attend.
    One of: ‘0’, ‘1’, ‘f’, ‘t’, ‘false’, ‘true’
    Defaults to false.

  • utm_source (optional)
  • utm_medium (optional)
  • utm_term (optional)
  • utm_content (optional)
  • utm_campaign (optional)
    These optional fields indicate the corresponding Google Ad information.
    This is useful for tracking how guests discover our clients’ websites and then book reservations

Examples

To search for available time slots for the Northwest location on Valentine’s Day around 7pm:

GET /api/v1/reservations/time_slots?organization=00000000000000000000000000000000&api_key=ThisIsNotARealKey&business_date=2020-02-14&location=Northwest&start_time=7:00pm&duration=2.5&party_size=8+&minors=false

Example Response

{
    "location": "Northwest",
    "business_date": "2020-01-14",
    "start_time": "7:00pm",
    "duration": 2.5,
    "party_size": 8,
    "minors": false,
    "time_slots": [
        {
            "start_time": "7:30pm",
            "end_time": "9:30pm",
            "duration": 2.0,
            "room_type": "standard",
            "emphasis": "medium",
            "rates": [
                {
                    "type": "individual",
                    "name": "Individual",
                    "description": "$7 per guest per hour"
                },
                {
                    "type": "group",
                    "name": "Group",
                    "description": "$60 per hour"
                }
            ]
        },
        {
            "start_time": "7:45pm",
            "end_time": "10:00pm",
            "duration": 2.25,
            "room_type": "standard",
            "emphasis": "medium",
            "rates": [
                {
                    "type": "individual",
                    "name": "Individual",
                    "description": "$7 per guest per hour"
                },
                {
                    "type": "group",
                    "name": "Group",
                    "description": "$60 per hour"
                }
            ]
        }
    ]
}

POST /api/version/reservations/reserve.format

Begin the booking process by reserving a time slot. The intended usage is for a booking form on our clients’ websites, such as the Book Your Box form for Voicebox Karaoke.

After selecting from available time slots using GET /api/version/reservations/time_slots.format, this will put a temporary reserved_online reservation on the Lyrical Systems calendar.

Parameters

  • api_key (required)
    This key is provided by Lyrical Systems to its clients.
    Without this key, clients are unable to create reservation requests.

  • business_date (required)
    The desired date of reservation.
    Accepts a variety of formats, but the following is recommended: 2012-02-14
    Even if the start_time is after midnight, use the date on which the location last opened its doors for business prior to the start_time.

  • location (required)
    The desired location for the reservation. For Voicebox, it may be one of ‘Northwest’, ‘Southeast’, or ‘RiNo’.
    It may be omitted if the organization has only one location.

  • start_time (required)
    The starting time of the reservation, as presented from an available time_slot.
    e.g. ‘11am’, ‘11:00am’, ‘8:15pm’, ‘11pm’, ‘12am’, ‘1:45am’

  • duration (required)
    The duration of the reservation in hours, as presented from an available time_slot.
    e.g. ‘1’, ‘1.0’, ‘1.25’, ‘3’

  • party_size (required)
    The estimated party size as a positive integer, same as when the search was done for available time slots.
    e.g. ‘5’

  • minors (optional)
    Whether any minors under the age of 21 are expected to attend, same as when the search was done for available time slots.
    One of: ‘0’, ‘1’, ‘f’, ‘t’, ‘false’, ‘true’
    Defaults to false.

  • room_type (required)
    One of ‘standard’, ‘lpremier’, or ‘spremier’, as presented from an available time_slot.
    e.g. ‘standard’

  • rate_type (required)
    One of ‘individual’, ‘group’, or ‘special’, as presented from an available time_slot.
    e.g. ‘individual’

  • desired_start_time (optional)
    The desired starting time of the reservation, typically the input provided to search for available time slots.
    It should be on a quarter-hour boundary.
    Acceptable formats include: ‘11am’, ‘11:00am’, ‘8:15pm’, ‘11pm’, ‘12am’, ‘1:45am’
    ‘8:05pm’ would not be acceptable, because it is not on a quarter-hour boundary.

  • desired_duration (optional)
    The desired duration of the reservation in hours, typically the input provided to search for available time slots.
    Must be in intervals of a quarter-hour.
    e.g. ‘1’, ‘1.0’, ‘1.25’, ‘3’

  • utm_source (optional)
  • utm_medium (optional)
  • utm_term (optional)
  • utm_content (optional)
  • utm_campaign (optional)
    These optional fields indicate the corresponding Google Ad information.
    This is useful for tracking how guests discover our clients’ websites and then book reservations

Examples

To reserve a time slot and begin the booking process, use something like the following:

POST /api/v1/reservations/reserve?organization=00000000000000000000000000000000&api_key=ThisIsNotARealKey&business_date=2015-02-14&location=Northwest&start_time=9:30pm&duration=2.5&party_size=8+&minors=false&room_type=standard&rate_type=individual&utm_source=google&utm_medium=cpc&utm_term=karaoke&utm_content=textlink&utm_campaign=bridal

Example Response

{
    "guid": "30d57d688e42410c8714ab83e0e7f343",
    "guest_guid": "83b6062bf77d447b821839f494f5a7df"
}

In the response, the guid can be used to track the reservation throughout its lifetime.

The guest_guid refers to the identity of the person creating the reservation, which will be available if the session is already associated to a guest. See the clear-guest route below to change this identity.


POST /api/version/reservations/guid/clear_guest.format

Reset which guest is associated to a reservation in the reserved_online state.
If, after reserving a time-slot, the user discovers that the stored guest profile information associated with their session is incorrect, this may be used to clear the guest association.

Before calling this, a new session UUID should be generated on the client, so that this and future activity by the user is not incorrectly tracked with the old session. Please provide the old_session in this case.

Parameters

  • guid (required)
    This should be a 32-character GUID identifying the reservation.
    It is returned in the response of POST /api/v1/reservations/reserve

  • api_key (required)
    This key is provided by Lyrical Systems to its clients.
    Without this key, clients are unable to create or modify reservations.

  • old_session (optional)
    Indicates which previous session UUID was in use, which caused the user to then want to clear and start fresh.

Examples

To clear the guest for a reservation, use something like the following:

POST /api/v1/reservations/30d57d688e42410c8714ab83e0e7f343/clear_guest?organization=00000000000000000000000000000000&api_key=ThisIsNotARealKey&old_session=12345678-1234-1234-1234-123456abcdef

Example Response

{
    "guid": "30d57d688e42410c8714ab83e0e7f343",
    "guest_guid": null,
    "first_name": null,
    "last_name": null,
    "phone": null,
    "email": null,
    "location": "Northwest",
    "region": "Portland",
    "state": "reserved_online",
    "business_date": "2015-02-14",
    "start_time": "9:30pm",
    "start_time_minus_15": "9:15pm",
    "end_time": "12:00am",
    "party_size": "8",
    "minors": false,
    "rate_text": "based on our individual prime rate of $11 per guest per hour"
}

PATCH /api/version/reservations/guid.format

Update a reservation in the reserved_online state.
This may be called zero or more times for the same reservation, depending on the details of the user interface flow.
Note, if any of the guest information is provided, it is all required at once, in order to correctly infer identify.

Parameters

  • guid (required)
    This should be a 32-character GUID identifying the reservation.
    It is returned in the response of POST /api/v1/reservations/reserve

  • api_key (required)
    This key is provided by Lyrical Systems to its clients.
    Without this key, clients are unable to create reservation requests.

  • first_name (required if updating guest)
  • last_name (required if updating guest)
    The name of the guest making the request

  • guest_guid (optional)
    This is returned in the response of POST /api/v1/reservations/reserve and GET /api/v1/reservations and should be passed in this call, to indicate that the guest intends to change their profile information, such as first_name or phone.
    Without providing this, if there is an existing guest and certain identifying fields in the update no longer match, a new guest record will be created instead of modifying the existing one.

  • phone (required if updating guest)
    A valid 10-digit phone number at which the guest may be contacted
    Ignores any punctuation, so a variety of formats may be accepted
    e.g. (555) 867-5309, 555-867-5309, 5558675309
    Accepts an optional extension, after an x, e.g. 555-867-5309x123

  • email (required if updating guest)
    A valid email address at which the guest may be contacted

  • hdyhau (optional)
    “How did you hear about us?”
    One of the values returned by a call to GET /api/v1/reservations/hdyhaus

  • occasion (optional)
    In order to best serve our guests, select the type of occasion.
    One of the values returned by a call to GET /api/v1/reservations/occasions

  • notes (optional)
    Any additional notes that the guest would like the location to be aware of.
    This may contain arbitrary text, including newlines.

Examples

To update a reservation, use something like the following:

PATCH /api/v1/reservations/30d57d688e42410c8714ab83e0e7f343/request?organization=00000000000000000000000000000000&api_key=ThisIsNotARealKey&first_name=Jenny&last_name=Tutone&phone=555-867-5309&email=jenny@columbia.net&hdyhau=friend&occasion=company_party&notes=I%20love%20karaoke

Example Response

{
    "guid": "30d57d688e42410c8714ab83e0e7f343",
    "guest_guid": "83b6062bf77d447b821839f494f5a7df",
    "guest_new": false
}

The guest_guid refers to the identity of the person creating the reservation. The system tries to match to an existing guest in the GRM database, by using name, email, and phone number. If an existing guest is found, guest_new will be false. Otherwise, a new guest is created, and guest_new will be true.


POST /api/version/reservations/guid/confirm.format

Update and confirm a reservation in the reserved_online state.
This will change the reservation state to confirmed_online and send an confirmation email to the guest.

Similar to PATCH /api/v1/reservations/GUID, this may accept any additional information to update the reservation, depending on the details of the user interface flow. It may also contain no additional information, and simply confirm a reservation. Note, if any of the guest information is provided, it is all required at once, in order to correctly infer identify.

Parameters

  • guid (required)
    This should be a 32-character GUID identifying the reservation.
    It is returned in the response of POST /api/v1/reservations/reserve

  • api_key (required)
    This key is provided by Lyrical Systems to its clients.
    Without this key, clients are unable to create reservation requests.

  • first_name (required if updating guest)
  • last_name (required if updating guest)
    The name of the guest making the request

  • phone (required if updating guest)
    A valid 10-digit phone number at which the guest may be contacted
    Ignores any punctuation, so a variety of formats may be accepted
    e.g. (555) 867-5309, 555-867-5309, 5558675309
    Accepts an optional extension, after an x, e.g. 555-867-5309x123

  • email (required if updating guest)
    A valid email address at which the guest may be contacted

  • hdyhau (optional)
    “How did you hear about us?”
    One of the values returned by a call to GET /api/v1/reservations/hdyhaus

  • occasion (optional)
    In order to best serve our guests, select the type of occasion.
    One of the values returned by a call to GET /api/v1/reservations/occasions

  • notes (optional)
    Any additional notes that the guest would like the location to be aware of.
    This may contain arbitrary text, including newlines.

Examples

To confirm a reservation, use something like the following:

POST /api/v1/reservations/30d57d688e42410c8714ab83e0e7f343/confirm?organization=00000000000000000000000000000000&api_key=ThisIsNotARealKey

Example Response

{
    "guid": "30d57d688e42410c8714ab83e0e7f343",
    "guest_guid": "83b6062bf77d447b821839f494f5a7df",
    "guest_new": false
}

The guest_guid refers to the identity of the person creating the reservation. The system tries to match to an existing guest in the GRM database, by using name, email, and phone number. If an existing guest is found, guest_new will be false. Otherwise, a new guest is created, and guest_new will be true.


POST /api/version/reservations/guid/cancel.format

Cancel a reservation in the reserved_online or confirmed_online state.
This will change the reservation state to cancelled_online and send a cancellation email to the guest.

Parameters

  • guid (required)
    This should be a 32-character GUID identifying the reservation.
    It is returned in the response of POST /api/v1/reservations/reserve

  • api_key (required)
    This key is provided by Lyrical Systems to its clients.
    Without this key, clients are unable to create reservation requests.

  • notes (optional)
    Any additional notes that may indicate why the guest intends to cancel the reservation.
    This may contain arbitrary text, including newlines.

Examples

To cancel a reservation, use something like the following:

POST /api/v1/reservations/30d57d688e42410c8714ab83e0e7f343/cancel?organization=00000000000000000000000000000000&api_key=ThisIsNotARealKey

Example Response

{
    "guid": "30d57d688e42410c8714ab83e0e7f343",
    "guest_guid": "83b6062bf77d447b821839f494f5a7df"
}

The guest_guid refers to the identity of the person who created the reservation.


Powered by Lyrical Systems