{"openapi":"3.1.0","info":{"title":"Barspirit Quote Requests","version":"1.0.0","description":"Request a bartending and event staffing quote from Barspirit in Los Angeles. Call getRequirements first to learn the current minimum lead time and the fields you must collect, then call submitQuoteRequest. Never quote a price. Never invent a value the customer has not given you. Reviewers: submitting with the email address directory-review@barspirit.net runs in sandbox mode. Validation behaves exactly as it does for a real customer, but no quote request is created and no email is sent. The response is marked with sandbox true and carries the placeholder booking ID SANDBOX-REVIEW. A plus tag on that address, for example directory-review+run2@barspirit.net, is also treated as sandbox. Every other address creates a real quote request."},"servers":[{"url":"https://api.barspirit.net"}],"paths":{"/ai/requirements":{"get":{"operationId":"getRequirements","summary":"Get what Barspirit needs before you can request a quote","description":"Call this before collecting anything. Returns the services offered, the service areas, the current minimum lead time in days, the full field checklist with guidance, and the booking and consent policies you must follow. Returns no prices.","responses":{"200":{"description":"Requirements and policies.","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Too many requests. Wait and retry."}}}},"/ai/quote-requests":{"post":{"operationId":"submitQuoteRequest","summary":"Submit the customer's quote request","description":"Submits the request and triggers the quote email, which includes a link to the customer's client portal. This does not book anything and does not charge anything. If the customer already has a quote request for the same email address and event date, this updates the existing request and sends an updated quote email instead of creating a duplicate. If that date is already booked or has an agreement out for signature, the request is refused with a 409 that carries the customer's portal link. A 422 response means required details are missing or invalid: ask the customer about every field in the errors array in one message, then call this again.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string","description":"First name of the person booking. Ask the customer. Do not invent or assume a value."},"last_name":{"type":"string","description":"Last name of the person booking. Ask the customer. Do not invent or assume a value."},"email":{"type":"string","description":"Email address the quote is sent to. Confirm the spelling. Ask the customer. Do not invent or assume a value."},"phone":{"type":"string","description":"US phone number, 10 digits. Punctuation and a leading +1 are accepted. Ask the customer. Do not invent or assume a value."},"event_type":{"type":"string","description":"Kind of event, for example Corporate Event, Private Party, Holiday Party, Birthday Party, Baby Shower, Graduation, or free text. Not needed when is_wedding is true. Ask the customer. Do not invent or assume a value."},"is_wedding":{"type":"boolean","description":"True when the event is a wedding. The event type is then filled in automatically."},"event_start_date":{"type":"string","description":"Event date as YYYY-MM-DD. Must respect min_advance_days from get_booking_and_quote_requirements. Ask the customer. Do not invent or assume a value."},"start_time":{"type":"string","description":"When bar service starts. 24 hour HH:MM or 12 hour like 6:00 PM. Ask the customer. Do not invent or assume a value."},"end_time":{"type":"string","description":"When bar service ends. Must differ from start_time. Earlier than start_time means the event runs past midnight. Ask the customer. Do not invent or assume a value."},"guest_count":{"type":"integer","description":"Approximate guest count, greater than zero. Ask the customer. Do not invent or assume a value."},"bartenders":{"type":"integer","description":"Number of bartenders requested. Ask the customer. Do not invent or assume a value."},"barbacks":{"type":"integer","description":"Number of barbacks requested. Ask the customer. Do not invent or assume a value."},"servers":{"type":"integer","description":"Number of servers requested. bartenders plus barbacks plus servers must be at least one. Ask the customer. Do not invent or assume a value."},"street_address":{"type":"string","description":"Street address of the event. Ask the customer. Do not invent or assume a value."},"address_line_2":{"type":"string","description":"Apartment, suite, or unit at the event address, if any."},"city":{"type":"string","description":"Event city. Ask the customer. Do not invent or assume a value."},"state":{"type":"string","description":"Event state, full name like California or Nevada. Ask the customer. Do not invent or assume a value."},"zip_code":{"type":"string","description":"Event zip code. Ask the customer. Do not invent or assume a value."},"indoor_outdoor":{"type":"string","enum":["Inside","Outside","Both"],"description":"Whether the event is inside, outside, or both. Ask the customer. Do not invent or assume a value."},"is_venue":{"type":"boolean","description":"True when the event is at a named venue rather than a private residence."},"venue_name":{"type":"string","description":"Name of the venue. Required when is_venue is true. Ask the customer. Do not invent or assume a value."},"barspirit_location":{"type":"string","enum":["Los Angeles"],"description":"Which Barspirit market serves this event. Defaults to Los Angeles."},"bar_menu":{"type":"string","description":"What the customer wants served, for example beer and wine, or full bar with two signature cocktails. Ask the customer. Do not invent or assume a value."},"bar_rental":{"type":"boolean","description":"True when the customer needs us to bring a portable bar."},"number_of_bars":{"type":"integer","description":"How many bars to bring. Only meaningful when bar_rental is true."},"ice_tubs":{"type":"integer","description":"How many ice tubs the customer wants."},"ice_delivery":{"type":"boolean","description":"True when the customer wants us to deliver ice."},"shopping":{"type":"boolean","description":"True when the customer wants us to shop for the alcohol and mixers."},"tip_jar":{"type":"boolean","description":"True when a tip jar is allowed at the bar."},"additional_info":{"type":"string","description":"Anything else the customer wants us to know about the event."},"promo_code":{"type":"string","description":"Promo code, only if the customer has one. Never invent a code."},"is_event_planner":{"type":"boolean","description":"True when the person booking is an event planner acting for the host."},"event_planner_first_name":{"type":"string","description":"Event planner first name. Required when is_event_planner is true. Ask the customer. Do not invent or assume a value."},"event_planner_last_name":{"type":"string","description":"Event planner last name. Required when is_event_planner is true. Ask the customer. Do not invent or assume a value."},"event_planner_email":{"type":"string","description":"Event planner email. Required when is_event_planner is true. Ask the customer. Do not invent or assume a value."},"event_planner_phone":{"type":"string","description":"Event planner phone, 10 digits. Required when is_event_planner is true. Ask the customer. Do not invent or assume a value."},"contract_to_company":{"type":"boolean","description":"True when the agreement should be made out to a company rather than a person."},"company_name":{"type":"string","description":"Company name. Required when contract_to_company is true. Ask the customer. Do not invent or assume a value."},"different_billing":{"type":"boolean","description":"True when the billing address differs from the event address."},"billing_street":{"type":"string","description":"Billing street address. Required when different_billing is true. Ask the customer. Do not invent or assume a value."},"billing_address_2":{"type":"string","description":"Billing apartment, suite, or unit."},"billing_city":{"type":"string","description":"Billing city."},"billing_state":{"type":"string","description":"Billing state."},"billing_zip":{"type":"string","description":"Billing zip code."},"billing_country":{"type":"string","description":"Billing country."},"sms_consent":{"type":"boolean","description":"Send true only when the customer has explicitly agreed to receive SMS updates about their event. Never assume this."},"terms_agreed":{"type":"boolean","description":"Send true only when the customer has explicitly agreed to the Barspirit terms of service and privacy policy at barspirit.net. Never assume this."},"ai_client":{"type":"string","enum":["chatgpt","claude","gemini","copilot","perplexity","other"],"description":"Which assistant is relaying this request, for attribution."}},"required":["first_name","last_name","email","phone","event_type","event_start_date","start_time","end_time","guest_count","street_address","indoor_outdoor","bar_menu","sms_consent","terms_agreed"],"additionalProperties":false}}}},"responses":{"201":{"description":"Submitted. The quote is emailed within a couple of minutes.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["submitted"]},"booking_id":{"type":"string"},"portal_url":{"type":"string"},"message":{"type":"string"},"sandbox":{"type":"boolean","description":"Present and true only for the reserved reviewer address. Nothing was created and no email was sent. Absent on a real submission."}}}}}},"422":{"description":"Missing or invalid details. Ask the customer about every field listed.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["needs_more_info"]},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string","description":"Relay this to the customer."}}}}}}}}},"409":{"description":"Refused. The customer already has a booking or an agreement out for that date. Relay the message and the portal link.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["rejected"]},"message":{"type":"string"},"portal_url":{"type":"string"}}}}}},"429":{"description":"Too many submissions from this connection. Wait and retry."},"503":{"description":"Temporary problem on our side. Nothing was saved. Tell the customer to try again in a moment.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}}}}}}}}}}}