{
  "openapi": "3.0.3",
  "info": {
    "title": "Jason Kent Sound and Lighting - Agent API",
    "version": "1.0.0",
    "description": "Public API for AI assistants helping couples book a wedding DJ in Toledo / Northwest Ohio. Check a date, get an exact quote using the same rules as jasonkentdj.com, and submit an inquiry on the couple's behalf (with their consent). No payments are taken through this API: the couple pays the $250 deposit and signs the contract in their own account. Business facts: https://jasonkentdj.com/ai/catalog.json An MCP server with the same tools is available at https://api.jasonkentdj.com/api/mcp.",
    "contact": {
      "name": "Jason Kent",
      "email": "jasonkentdj@gmail.com",
      "url": "https://jasonkentdj.com"
    }
  },
  "servers": [
    {
      "url": "https://api.jasonkentdj.com"
    }
  ],
  "paths": {
    "/api/agent/availability": {
      "get": {
        "operationId": "checkAvailability",
        "summary": "Check whether a DJ is available on a date",
        "parameters": [
          {
            "name": "date",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2027-06-12"
          }
        ],
        "responses": {
          "200": {
            "description": "Availability",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "date": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "available",
                        "booked",
                        "unknown"
                      ]
                    },
                    "message": {
                      "type": "string"
                    },
                    "hold_policy": {
                      "type": "string"
                    },
                    "next_step": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid date"
          },
          "429": {
            "description": "Rate limited (60/hour)"
          }
        }
      }
    },
    "/api/agent/quote": {
      "post": {
        "operationId": "getQuote",
        "summary": "Get an itemized quote (same rules as the website's instant quote)",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "date"
                ],
                "properties": {
                  "date": {
                    "type": "string",
                    "format": "date",
                    "example": "2027-06-12",
                    "description": "Event date (YYYY-MM-DD)."
                  },
                  "event_type": {
                    "type": "string",
                    "enum": [
                      "wedding",
                      "party"
                    ],
                    "default": "wedding",
                    "description": "Use 'party' for corporate parties, birthdays and other non-wedding events ($200/hour, 2-hour minimum)."
                  },
                  "ceremony": {
                    "type": "string",
                    "enum": [
                      "none",
                      "same_location",
                      "different_location"
                    ],
                    "default": "none",
                    "description": "Wedding ceremony music. Any ceremony requires the Diamond package or higher; a different location adds $50."
                  },
                  "hours": {
                    "type": "integer",
                    "example": 6,
                    "description": "Reception hours. More than 5 requires Diamond (unlimited time). For parties: hours booked."
                  },
                  "package": {
                    "type": "string",
                    "enum": [
                      "platinum",
                      "diamond",
                      "deluxe"
                    ],
                    "description": "Optional preferred package; the quote never goes below what the ceremony/hours require."
                  },
                  "venue": {
                    "type": "string",
                    "example": "Nazareth Hall",
                    "description": "Venue name. Preferred venues get $200 off."
                  },
                  "public_safety": {
                    "type": "boolean",
                    "default": false,
                    "description": "Active-duty military, veteran, nurse, police, firefighter or other public safety professional ($250 off, proof required)."
                  },
                  "uplighting": {
                    "type": "boolean",
                    "default": false
                  },
                  "photobooth": {
                    "type": "boolean",
                    "default": false
                  },
                  "photobooth_printing": {
                    "type": "boolean",
                    "default": false
                  },
                  "guests": {
                    "type": "integer",
                    "example": 150
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Quote",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "date": {
                      "type": "string"
                    },
                    "package_id": {
                      "type": "string"
                    },
                    "package_name": {
                      "type": "string"
                    },
                    "package_price": {
                      "type": "number"
                    },
                    "discounts": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "label": {
                            "type": "string"
                          },
                          "amount": {
                            "type": "number"
                          }
                        }
                      }
                    },
                    "discount_total": {
                      "type": "number"
                    },
                    "extras": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "label": {
                            "type": "string"
                          },
                          "amount": {
                            "type": "number"
                          }
                        }
                      }
                    },
                    "surcharges": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "label": {
                            "type": "string"
                          },
                          "amount": {
                            "type": "number"
                          }
                        }
                      }
                    },
                    "total": {
                      "type": "number",
                      "description": "Total before any travel fee."
                    },
                    "deposit": {
                      "type": "number"
                    },
                    "balance_due": {
                      "type": "string"
                    },
                    "includes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "pricing_url": {
                      "type": "string"
                    },
                    "book_url": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid request"
          },
          "429": {
            "description": "Rate limited (60/hour)"
          }
        }
      }
    },
    "/api/agent/inquiry": {
      "post": {
        "operationId": "submitInquiry",
        "summary": "Submit a booking inquiry for a couple (requires their consent)",
        "description": "Before calling, ask the couple for their first name, email, phone number, wedding date and venue city, and get their permission to share these so we can email and text them their quote. Creates the couple's inquiry in our system. The assigned DJ confirms (usually within 12-24 hours), then the couple receives an email and text with their quote, a link to set their password, and how to pay the $250 deposit. Only submit with the couple's explicit permission to share their contact details.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "first_name",
                  "email",
                  "phone",
                  "venue_city",
                  "consent",
                  "quote"
                ],
                "properties": {
                  "first_name": {
                    "type": "string"
                  },
                  "last_name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "phone": {
                    "type": "string",
                    "description": "10-digit US phone"
                  },
                  "venue_name": {
                    "type": "string"
                  },
                  "venue_city": {
                    "type": "string"
                  },
                  "venue_state": {
                    "type": "string",
                    "default": "OH"
                  },
                  "notes": {
                    "type": "string",
                    "maxLength": 1000
                  },
                  "agent_name": {
                    "type": "string",
                    "description": "Name of the assistant submitting, e.g. 'ChatGPT' or 'Claude'."
                  },
                  "consent": {
                    "type": "boolean",
                    "description": "Must be true: the couple agreed to be contacted by email and text about this inquiry."
                  },
                  "quote": {
                    "type": "object",
                    "required": [
                      "date"
                    ],
                    "properties": {
                      "date": {
                        "type": "string",
                        "format": "date",
                        "example": "2027-06-12",
                        "description": "Event date (YYYY-MM-DD)."
                      },
                      "event_type": {
                        "type": "string",
                        "enum": [
                          "wedding",
                          "party"
                        ],
                        "default": "wedding",
                        "description": "Use 'party' for corporate parties, birthdays and other non-wedding events ($200/hour, 2-hour minimum)."
                      },
                      "ceremony": {
                        "type": "string",
                        "enum": [
                          "none",
                          "same_location",
                          "different_location"
                        ],
                        "default": "none",
                        "description": "Wedding ceremony music. Any ceremony requires the Diamond package or higher; a different location adds $50."
                      },
                      "hours": {
                        "type": "integer",
                        "example": 6,
                        "description": "Reception hours. More than 5 requires Diamond (unlimited time). For parties: hours booked."
                      },
                      "package": {
                        "type": "string",
                        "enum": [
                          "platinum",
                          "diamond",
                          "deluxe"
                        ],
                        "description": "Optional preferred package; the quote never goes below what the ceremony/hours require."
                      },
                      "venue": {
                        "type": "string",
                        "example": "Nazareth Hall",
                        "description": "Venue name. Preferred venues get $200 off."
                      },
                      "public_safety": {
                        "type": "boolean",
                        "default": false,
                        "description": "Active-duty military, veteran, nurse, police, firefighter or other public safety professional ($250 off, proof required)."
                      },
                      "uplighting": {
                        "type": "boolean",
                        "default": false
                      },
                      "photobooth": {
                        "type": "boolean",
                        "default": false
                      },
                      "photobooth_printing": {
                        "type": "boolean",
                        "default": false
                      },
                      "guests": {
                        "type": "integer",
                        "example": 150
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Inquiry received"
          },
          "200": {
            "description": "Received (existing client or date booked; see status)"
          },
          "400": {
            "description": "Validation errors"
          },
          "429": {
            "description": "Rate limited"
          }
        }
      }
    }
  }
}