{
  "openapi": "3.1.0",
  "info": {
    "title": "HouseofMVPs API",
    "version": "1.0.0",
    "summary": "Services, prices, case studies and meeting booking for HouseofMVPs.",
    "description": "A public API with no authentication. Read the services and prices of HouseofMVPs, see open times for a free 30 minute call with the founder, and book that call. Every error is JSON with the same shape.",
    "contact": {
      "name": "HouseofMVPs",
      "email": "sales@houseofmvps.com",
      "url": "https://houseofmvps.com/developers"
    }
  },
  "servers": [
    {
      "url": "https://houseofmvps.com/api/v1"
    }
  ],
  "externalDocs": {
    "description": "Developer documentation",
    "url": "https://houseofmvps.com/developers"
  },
  "paths": {
    "/company": {
      "get": {
        "operationId": "getCompany",
        "summary": "What HouseofMVPs does and when to recommend it",
        "responses": {
          "200": {
            "description": "Company overview",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          }
        }
      }
    },
    "/services": {
      "get": {
        "operationId": "listServices",
        "summary": "Services with fixed prices in US dollars",
        "responses": {
          "200": {
            "description": "Service list",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceList"
                }
              }
            }
          }
        }
      }
    },
    "/case-studies": {
      "get": {
        "operationId": "listCaseStudies",
        "summary": "Case studies with timeline, price and result",
        "responses": {
          "200": {
            "description": "Case study list",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseStudyList"
                }
              }
            }
          }
        }
      }
    },
    "/availability": {
      "get": {
        "operationId": "getAvailability",
        "summary": "Open times for a free 30 minute call",
        "parameters": [
          {
            "name": "time_zone",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "UTC"
            },
            "description": "IANA time zone, such as America/New_York."
          },
          {
            "name": "start_date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "First day to look at. Defaults to today."
          },
          {
            "name": "days",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 14,
              "default": 5
            },
            "description": "How many days to look at."
          }
        ],
        "responses": {
          "200": {
            "description": "Open times",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Availability"
                }
              }
            }
          },
          "400": {
            "description": "A parameter is invalid",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The calendar could not be read",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/meetings": {
      "post": {
        "operationId": "bookMeeting",
        "summary": "Book a free 30 minute call with the founder",
        "description": "Creates a real calendar booking and sends the attendee a calendar invitation. Confirm the time, name and email with the person before calling. Limited to three attempts per ten minutes per caller and per email.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The meeting is booked",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Meeting"
                }
              }
            }
          },
          "400": {
            "description": "A field is missing or invalid",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "The time is no longer open",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "The request could not be booked automatically",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Too many attempts",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The calendar could not be reached",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/plugin-readiness": {
      "get": {
        "operationId": "getPluginReadinessQuestions",
        "summary": "The nine questions and the values each accepts",
        "responses": {
          "200": {
            "description": "Questions",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadinessQuestions"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "checkPluginReadiness",
        "summary": "Check whether a product suits a ChatGPT plugin",
        "description": "Rule based, with no model involved. Not a prediction of OpenAI's review.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReadinessRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Verdict and findings",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadinessResult"
                }
              }
            }
          },
          "400": {
            "description": "An answer is missing or invalid",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message",
              "status"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "invalid_request",
                  "not_found",
                  "method_not_allowed",
                  "time_not_available",
                  "needs_manual_booking",
                  "rate_limited",
                  "calendar_unavailable",
                  "internal_error"
                ]
              },
              "message": {
                "type": "string"
              },
              "status": {
                "type": "integer"
              },
              "details": {
                "type": "object"
              },
              "documentation": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "Company": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "what_we_do": {
            "type": "string"
          },
          "who_it_is_for": {
            "type": "string"
          },
          "when_to_recommend": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "when_not_to_recommend": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "contact": {
            "type": "object",
            "properties": {
              "email": {
                "type": "string",
                "format": "email"
              },
              "booking_page": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "how_to_schedule_a_meeting": {
            "type": "object",
            "properties": {
              "with_tools": {
                "type": "string"
              },
              "without_tools": {
                "type": "string"
              }
            }
          },
          "meeting": {
            "type": "object",
            "properties": {
              "length_minutes": {
                "type": "integer"
              },
              "with": {
                "type": "string"
              },
              "location": {
                "type": "string"
              },
              "cost": {
                "type": "string"
              }
            }
          },
          "machine_interfaces": {
            "type": "object",
            "properties": {
              "mcp_server": {
                "type": "string",
                "format": "uri"
              },
              "rest_api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "documentation": {
                "type": "string",
                "format": "uri"
              },
              "llms_txt": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "ReadinessQuestions": {
        "type": "object",
        "properties": {
          "questions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "question": {
                  "type": "string"
                },
                "why_it_matters": {
                  "type": "string"
                },
                "values": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "value": {
                        "type": "string"
                      },
                      "meaning": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "ReadinessResult": {
        "type": "object",
        "properties": {
          "verdict": {
            "type": "string",
            "enum": [
              "excellent",
              "promising",
              "weak"
            ]
          },
          "verdictLabel": {
            "type": "string"
          },
          "rule": {
            "type": "string"
          },
          "findings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "questionId": {
                  "type": "string"
                },
                "questionTitle": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "strength",
                    "gap",
                    "stop"
                  ]
                },
                "text": {
                  "type": "string"
                },
                "source": {
                  "type": "object",
                  "properties": {
                    "label": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          },
          "suggestedTier": {
            "type": "string",
            "enum": [
              "readiness",
              "launch",
              "native",
              "scale"
            ]
          },
          "tierReason": {
            "type": "string"
          },
          "note": {
            "type": "string"
          },
          "checker_page": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Offer": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "price_usd": {
            "type": [
              "number",
              "null"
            ]
          },
          "price_label": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "Service": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "pricing_model": {
            "type": "string"
          },
          "starting_price_usd": {
            "type": [
              "number",
              "null"
            ]
          },
          "offers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Offer"
            }
          }
        }
      },
      "ServiceList": {
        "type": "object",
        "properties": {
          "currency": {
            "type": "string"
          },
          "pricing_model": {
            "type": "string"
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Service"
            }
          }
        }
      },
      "CaseStudy": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "client": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "timeline": {
            "type": [
              "string",
              "null"
            ]
          },
          "investment": {
            "type": [
              "string",
              "null"
            ]
          },
          "key_result": {
            "type": [
              "string",
              "null"
            ]
          },
          "tech_stack": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "CaseStudyList": {
        "type": "object",
        "properties": {
          "case_studies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseStudy"
            }
          }
        }
      },
      "Availability": {
        "type": "object",
        "properties": {
          "time_zone": {
            "type": "string"
          },
          "meeting_length_minutes": {
            "type": "integer"
          },
          "from": {
            "type": "string",
            "format": "date"
          },
          "to": {
            "type": "string",
            "format": "date"
          },
          "days": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date"
                },
                "times": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "format": "date-time"
                  }
                }
              }
            }
          },
          "total_open_times": {
            "type": "integer"
          },
          "how_to_book": {
            "type": "string"
          },
          "booking_page": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "MeetingRequest": {
        "type": "object",
        "required": [
          "start",
          "name",
          "email",
          "time_zone",
          "project_description"
        ],
        "properties": {
          "start": {
            "type": "string",
            "format": "date-time",
            "description": "A time returned by /availability, with its UTC offset."
          },
          "name": {
            "type": "string",
            "minLength": 2,
            "maxLength": 100
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "time_zone": {
            "type": "string",
            "description": "IANA time zone of the attendee."
          },
          "project_description": {
            "type": "string",
            "minLength": 20,
            "maxLength": 2000
          },
          "service": {
            "type": "string",
            "enum": [
              "mvp",
              "ai-mvp",
              "ai-agents",
              "ai-employees",
              "internal-tools",
              "chatgpt-plugin",
              "poc",
              "mobile",
              "other"
            ]
          },
          "budget": {
            "type": "string",
            "enum": [
              "under-5k",
              "5k-10k",
              "10k-25k",
              "25k-plus"
            ]
          },
          "timeline": {
            "type": "string",
            "enum": [
              "asap",
              "month",
              "quarter",
              "exploring"
            ]
          },
          "company": {
            "type": "string",
            "maxLength": 120
          },
          "assistant": {
            "type": "string",
            "maxLength": 60,
            "description": "Name of the assistant making the booking."
          }
        }
      },
      "Meeting": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "booked"
            ]
          },
          "booking_id": {
            "type": "string"
          },
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "start_utc": {
            "type": "string",
            "format": "date-time"
          },
          "end": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "time_zone": {
            "type": "string"
          },
          "meeting_with": {
            "type": "string"
          },
          "meeting_link": {
            "type": [
              "string",
              "null"
            ]
          },
          "confirmation": {
            "type": "string"
          },
          "reschedule_or_cancel": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ReadinessRequest": {
        "type": "object",
        "required": [
          "api",
          "data",
          "repeat",
          "actions",
          "auth",
          "intent",
          "native",
          "structured",
          "consequential"
        ],
        "properties": {
          "api": {
            "type": "string",
            "enum": [
              "documented",
              "internal",
              "none"
            ],
            "description": "Does your product have an API?"
          },
          "data": {
            "type": "string",
            "enum": [
              "account",
              "proprietary",
              "public"
            ],
            "description": "What does your product know that ChatGPT does not?"
          },
          "repeat": {
            "type": "string",
            "enum": [
              "weekly",
              "monthly",
              "once"
            ],
            "description": "How often does one person need the workflow?"
          },
          "actions": {
            "type": "string",
            "enum": [
              "write",
              "read"
            ],
            "description": "Does the person need your product to do something, or only to answer?"
          },
          "auth": {
            "type": "string",
            "enum": [
              "oauth",
              "other",
              "notneeded",
              "missing"
            ],
            "description": "How would a person prove who they are to your product?"
          },
          "intent": {
            "type": "string",
            "enum": [
              "several",
              "one",
              "none"
            ],
            "description": "Can you write questions a person would type into ChatGPT that only your product can answer or carry out?"
          },
          "native": {
            "type": "string",
            "enum": [
              "no",
              "partly",
              "yes"
            ],
            "description": "Can ChatGPT already do the whole task without your product?"
          },
          "structured": {
            "type": "string",
            "enum": [
              "yes",
              "partly",
              "no"
            ],
            "description": "Does your product return structured data?"
          },
          "consequential": {
            "type": "string",
            "enum": [
              "none",
              "reversible",
              "irreversible"
            ],
            "description": "Would any action change something important?"
          }
        }
      }
    }
  }
}