{
  "openapi": "3.1.1",
  "info": {
    "title": "SESAME API",
    "description": "Projects, builds, customers, presentations and consumption, as the person whose Hotelwize token it is. The same calls are MCP tools at /mcp.",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://api.staging.sesamecreate.com/"
    }
  ],
  "paths": {
    "/themes": {
      "get": {
        "tags": [
          "Account"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Theme"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/personas": {
      "get": {
        "tags": [
          "Account"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Persona"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/consumption": {
      "get": {
        "tags": [
          "Account"
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Consumption"
                }
              }
            }
          }
        }
      }
    },
    "/projects": {
      "get": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Project"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "readProperty",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProjectRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProjectRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProjectRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          }
        }
      }
    },
    "/projects/{id}": {
      "get": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProjectRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProjectRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProjectRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": { }
            }
          }
        }
      }
    },
    "/projects/{id}/read-property": {
      "post": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          }
        }
      }
    },
    "/projects/{id}/build": {
      "post": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Build"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/projects/{id}/rebuild": {
      "post": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RebuildRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RebuildRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RebuildRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          }
        }
      }
    },
    "/projects/{id}/customer": {
      "get": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Customer"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Customer"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Customer"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Customer"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Customer"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": { }
            }
          }
        }
      }
    },
    "/projects/{id}/presentation": {
      "get": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Presentation"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/PresentationRequest"
                  }
                ]
              }
            },
            "text/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/PresentationRequest"
                  }
                ]
              }
            },
            "application/*+json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/PresentationRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Presentation"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PresentationRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PresentationRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PresentationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Presentation"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content",
            "content": {
              "application/json": { }
            }
          }
        }
      }
    },
    "/projects/{id}/presentation/screenshots": {
      "put": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "allOf": [
                  {
                    "type": "object",
                    "properties": {
                      "ContentType": {
                        "type": "string"
                      },
                      "ContentDisposition": {
                        "type": "string"
                      },
                      "Headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      },
                      "Length": {
                        "pattern": "^-?(?:0|[1-9]\\d*)$",
                        "type": [
                          "integer",
                          "string"
                        ],
                        "format": "int64"
                      },
                      "Name": {
                        "type": "string"
                      },
                      "FileName": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "ContentType": {
                        "type": "string"
                      },
                      "ContentDisposition": {
                        "type": "string"
                      },
                      "Headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      },
                      "Length": {
                        "pattern": "^-?(?:0|[1-9]\\d*)$",
                        "type": [
                          "integer",
                          "string"
                        ],
                        "format": "int64"
                      },
                      "Name": {
                        "type": "string"
                      },
                      "FileName": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "ContentType": {
                        "type": "string"
                      },
                      "ContentDisposition": {
                        "type": "string"
                      },
                      "Headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      },
                      "Length": {
                        "pattern": "^-?(?:0|[1-9]\\d*)$",
                        "type": [
                          "integer",
                          "string"
                        ],
                        "format": "int64"
                      },
                      "Name": {
                        "type": "string"
                      },
                      "FileName": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "properties": {
                      "ContentType": {
                        "type": "string"
                      },
                      "ContentDisposition": {
                        "type": "string"
                      },
                      "Headers": {
                        "type": "object",
                        "additionalProperties": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      },
                      "Length": {
                        "pattern": "^-?(?:0|[1-9]\\d*)$",
                        "type": [
                          "integer",
                          "string"
                        ],
                        "format": "int64"
                      },
                      "Name": {
                        "type": "string"
                      },
                      "FileName": {
                        "type": "string"
                      }
                    }
                  }
                ]
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Presentation"
                }
              }
            }
          }
        }
      }
    },
    "/projects/{id}/presentation/audit": {
      "put": {
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AuditUpload"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AuditUpload"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AuditUpload"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Presentation"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AccessibilityResult": {
        "required": [
          "passed",
          "violations"
        ],
        "type": "object",
        "properties": {
          "passed": {
            "type": "boolean"
          },
          "violations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AccessibilityViolation"
            }
          }
        },
        "description": "WCAG 2.1 AA, as axe tests it: passes with no violation at all. The worst first."
      },
      "AccessibilityViolation": {
        "required": [
          "id",
          "impact",
          "help",
          "helpUrl",
          "nodes"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "impact": {
            "type": [
              "null",
              "string"
            ],
            "description": "`critical`, `serious`, `moderate` or `minor`."
          },
          "help": {
            "type": "string"
          },
          "helpUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "nodes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "tags": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          }
        },
        "description": "One axe rule broken: `color-contrast` on 19 elements."
      },
      "AuditUpload": {
        "required": [
          "today",
          "new"
        ],
        "type": "object",
        "properties": {
          "today": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SiteChecks"
              }
            ]
          },
          "new": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SiteChecks"
              }
            ]
          }
        },
        "description": "What a browser saw on the two websites, for `PUT /projects/{id}/presentation/audit`: the facts only. SESAME\nworks out the verdicts itself. Either site may be sent alone."
      },
      "BookingUnit": {
        "required": [
          "url"
        ],
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "name": {
            "type": [
              "null",
              "string"
            ]
          }
        },
        "description": "One unit's own Booking.com listing, and the unit's name when it has one."
      },
      "Build": {
        "required": [
          "id",
          "status",
          "phase",
          "message",
          "phases",
          "queuedAt",
          "startedAt",
          "heartbeatAt",
          "finishedAt",
          "siteId",
          "siteCode"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "description": "`Queued`, `Running`, `Succeeded` or `Failed`."
          },
          "phase": {
            "type": [
              "null",
              "string"
            ]
          },
          "message": {
            "type": [
              "null",
              "string"
            ]
          },
          "phases": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "The pipeline's phases (`01-crawl` … `12-publish`) and each one's state."
          },
          "queuedAt": {
            "type": "string",
            "format": "date-time"
          },
          "startedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "heartbeatAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "finishedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "siteId": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "siteCode": {
            "type": [
              "null",
              "string"
            ]
          }
        },
        "description": "A build, as the builder reports it."
      },
      "Consumption": {
        "required": [
          "scope",
          "days",
          "from",
          "to",
          "truncated",
          "costUsd",
          "costEur",
          "unpriced",
          "projects",
          "calls"
        ],
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "description": "`tenant` or `projects`."
          },
          "days": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "truncated": {
            "type": "boolean",
            "description": "The period held more calls than one read returns: these are the newest."
          },
          "costUsd": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "description": "The total, in US dollars, of the calls whose model had a price.",
            "format": "double"
          },
          "costEur": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "The same in euros, at each call's day's rate; null when the rates could not be read.",
            "format": "double"
          },
          "unpriced": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Calls whose model had no price: counted, not costed.",
            "format": "int32"
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ConsumptionProject"
            }
          },
          "calls": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ConsumptionCall"
            }
          }
        },
        "description": "What a team's model calls cost over a period. A team's admin reads the whole team; anyone else reads only the\nprojects they own (string Consumption.Scope says which)."
      },
      "ConsumptionCall": {
        "required": [
          "at",
          "projectId",
          "buildId",
          "source",
          "provider",
          "model",
          "keyOwner",
          "calls",
          "inputTokens",
          "outputTokens",
          "cacheReadTokens",
          "cacheWriteTokens",
          "costUsd",
          "costEur"
        ],
        "type": "object",
        "properties": {
          "at": {
            "type": "string",
            "format": "date-time"
          },
          "projectId": {
            "type": [
              "null",
              "string"
            ]
          },
          "buildId": {
            "type": [
              "null",
              "string"
            ]
          },
          "source": {
            "type": "string",
            "description": "What asked for it: a build phase (`06-content`), `regenerate:&lt;field&gt;`, `build-chat`."
          },
          "provider": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "keyOwner": {
            "type": "string",
            "description": "Whose key paid: `user`, `tenant` or `app`."
          },
          "calls": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "inputTokens": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "outputTokens": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "cacheReadTokens": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "cacheWriteTokens": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "costUsd": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "costEur": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          }
        },
        "description": "One priced model call, or a build phase's calls together."
      },
      "ConsumptionProject": {
        "required": [
          "projectId",
          "name",
          "calls",
          "costUsd",
          "costEur"
        ],
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "calls": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "costUsd": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "costEur": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          }
        },
        "description": "One project's share of the period."
      },
      "CreateProjectRequest": {
        "required": [
          "input"
        ],
        "type": "object",
        "properties": {
          "input": {
            "$ref": "#/components/schemas/ProjectInput"
          },
          "name": {
            "type": [
              "null",
              "string"
            ]
          },
          "customer": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Customer"
              }
            ]
          }
        },
        "description": "A new project: its inputs, its name (taken from the website when not given), and the customer it is for."
      },
      "Customer": {
        "required": [
          "kind",
          "company",
          "contactName"
        ],
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "`Account` or `Lead`."
          },
          "company": {
            "type": "string",
            "description": "The property's business: \"Thalassa Suites\"."
          },
          "contactName": {
            "type": "string",
            "description": "The person the page is addressed to: \"Maria Kostaki\"."
          },
          "language": {
            "type": "string",
            "description": "The presentation's language: `en` or `el`.",
            "default": "en"
          },
          "crmSystem": {
            "type": [
              "null",
              "string"
            ],
            "description": "The CRM the record is in, for example `zoho`."
          },
          "crmId": {
            "type": [
              "null",
              "string"
            ],
            "description": "The record's id there."
          },
          "location": {
            "type": [
              "null",
              "string"
            ],
            "description": "Where it is, as the page says it: \"Naxos\"."
          },
          "greeting": {
            "type": [
              "null",
              "string"
            ],
            "description": "How the page addresses them when not by first name: Greek is formal, \"Κυρία Κωστάκη\"."
          },
          "email": {
            "type": [
              "null",
              "string"
            ]
          },
          "phone": {
            "type": [
              "null",
              "string"
            ]
          },
          "greekName": {
            "type": [
              "null",
              "string"
            ],
            "description": "How Greek copy names them after a preposition, with its article: \"τη Μαρία Κωστάκη\". Without it the Greek page names the company instead."
          }
        },
        "description": "Who a website is made for: a CRM Account or Lead, and the person there the presentation is addressed to."
      },
      "Error": {
        "required": [
          "code",
          "message"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "description": "Every failure: a stable code to branch on, and a sentence to show a person."
      },
      "GdprResult": {
        "required": [
          "passed",
          "https",
          "consentBannerFound",
          "cookiesBeforeConsent",
          "privacyPolicyUrl",
          "cookiePolicyUrl",
          "issues"
        ],
        "type": "object",
        "properties": {
          "passed": {
            "type": "boolean"
          },
          "https": {
            "type": "boolean"
          },
          "consentBannerFound": {
            "type": "boolean"
          },
          "cookiesBeforeConsent": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TrackingCookie"
            }
          },
          "privacyPolicyUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "cookiePolicyUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "issues": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "What fails, in words for the salesperson."
          }
        },
        "description": "GDPR: passes with https, no tracking cookie before consent, and a privacy and a cookie policy linked."
      },
      "Offer": {
        "required": [
          "introMonthly",
          "introMonths",
          "monthly"
        ],
        "type": "object",
        "properties": {
          "introMonthly": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "introMonths": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "monthly": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "offerUntil": {
            "type": [
              "null",
              "string"
            ],
            "description": "The last day the offer holds.",
            "format": "date"
          },
          "tier": {
            "type": [
              "null",
              "string"
            ]
          },
          "currency": {
            "type": "string",
            "default": "EUR"
          }
        },
        "description": "The plan the page offers: decimal Offer.IntroMonthly a month for int Offer.IntroMonths months, then decimal Offer.Monthly."
      },
      "Persona": {
        "required": [
          "id",
          "name",
          "summary",
          "kind"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "description": "`builtin`, `promoted` or `tenant`."
          }
        },
        "description": "A voice SESAME can write in: a built-in by its name, a promoted or team persona by its id."
      },
      "Presentation": {
        "required": [
          "status",
          "url",
          "friendlyUrl",
          "createdAt",
          "expiresAt",
          "endedAt",
          "salesperson",
          "offer",
          "stats",
          "currentSiteFrameable",
          "views",
          "responses"
        ],
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "`Active`, `Expired` or `Withdrawn`."
          },
          "url": {
            "type": "string",
            "description": "`https://demo.sesamecreate.com/&lt;project id&gt;`: the address to give out."
          },
          "friendlyUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "`https://demo.sesamecreate.com/&lt;site code&gt;`: shorter, and guessable."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          },
          "endedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "salesperson": {
            "$ref": "#/components/schemas/Salesperson"
          },
          "offer": {
            "$ref": "#/components/schemas/Offer"
          },
          "stats": {
            "$ref": "#/components/schemas/PresentationStats"
          },
          "currentSiteFrameable": {
            "type": "boolean",
            "description": "Whether the page can show the property's website today beside the new one; when not, it links to it."
          },
          "views": {
            "$ref": "#/components/schemas/PresentationViews"
          },
          "responses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PresentationResponse"
            }
          },
          "screenshots": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "The new website and the property's own, which the page compares side by side: captured when the presentation was made, or uploaded to `PUT /projects/{id}/presentation/screenshots` afterwards. Null when they were not all captured: then the page frames the new website.",
                "$ref": "#/components/schemas/PresentationScreenshots"
              }
            ]
          },
          "audit": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "Both websites measured: Google PageSpeed (filled a few minutes after the presentation is made), and what a browser saw before consent and against WCAG 2.1 AA (when it was made, or uploaded to `PUT /projects/{id}/presentation/audit`). The page shows only the scores and the GDPR verdict; the findings are for the salesperson.",
                "$ref": "#/components/schemas/PresentationAudit"
              }
            ]
          },
          "plugins": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            },
            "description": "The plugins active on the site when the presentation was made, by name."
          },
          "followUpOn": {
            "type": [
              "null",
              "string"
            ],
            "description": "The day the salesperson will call the customer.",
            "format": "date"
          }
        },
        "description": "The page the customer is shown their new website on."
      },
      "PresentationAudit": {
        "required": [
          "today",
          "new"
        ],
        "type": "object",
        "properties": {
          "today": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SiteAudit"
              }
            ]
          },
          "new": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SiteAudit"
              }
            ]
          }
        },
        "description": "Both websites measured. SiteAudit? PresentationAudit.Today is null when the property has no website of its own."
      },
      "PresentationRequest": {
        "type": "object",
        "properties": {
          "expiresAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the page ends. After it, the page says so and the project goes to the recycle bin. At most 90 days ahead.",
            "format": "date-time"
          },
          "salesperson": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Salesperson"
              }
            ]
          },
          "offer": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Offer"
              }
            ]
          },
          "recapture": {
            "type": "boolean",
            "description": "On a change, take the screenshots of the new website and the property's own again, for when either has changed. Making a presentation always takes them.",
            "default": false
          },
          "followUpOn": {
            "type": [
              "null",
              "string"
            ],
            "description": "The day the salesperson will call the customer, which the page's note promises. Before the page ends.",
            "format": "date"
          }
        },
        "description": "Makes, or changes, a presentation. Everything is optional: a new one is up for a week, introduces the caller,\nand makes the standard offer. On a change, only what is sent changes."
      },
      "PresentationResponse": {
        "required": [
          "kind",
          "at"
        ],
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "`OpenSite`, `Call`, `Start` or `NotInterested`."
          },
          "at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "description": "What the customer did on the page."
      },
      "PresentationScreenshots": {
        "required": [
          "newDesktop",
          "newPhone",
          "todayDesktop",
          "todayPhone",
          "at"
        ],
        "type": "object",
        "properties": {
          "newDesktop": {
            "type": "string"
          },
          "newPhone": {
            "type": "string"
          },
          "todayDesktop": {
            "type": "string"
          },
          "todayPhone": {
            "type": "string"
          },
          "at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "description": "The four screenshots the page compares, each a public https address."
      },
      "PresentationStats": {
        "required": [
          "pages",
          "photos",
          "roomTypes"
        ],
        "type": "object",
        "properties": {
          "pages": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "photos": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "roomTypes": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          }
        },
        "description": "\"[N] pages · [N] photos · [N] room types\", as the site stood when the presentation was made."
      },
      "PresentationViews": {
        "required": [
          "count",
          "first",
          "last"
        ],
        "type": "object",
        "properties": {
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "first": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "last": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          }
        },
        "description": "How often the customer opened the page."
      },
      "Project": {
        "required": [
          "id",
          "name",
          "status",
          "tenantId",
          "input",
          "lodging",
          "lodgingReason",
          "siteId",
          "siteCode",
          "previewUrl",
          "liveUrl",
          "build",
          "customer",
          "presentation",
          "createdAt",
          "updatedAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "description": "`Draft`, `Queued`, `Building`, `Review`, `Live` or `Failed`."
          },
          "tenantId": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "input": {
            "$ref": "#/components/schemas/ProjectInput"
          },
          "lodging": {
            "type": [
              "null",
              "string"
            ],
            "description": "Whether the website read is a place to stay (`Lodging`, `NotLodging`, `Unchecked`); null before it is read. Only `Lodging` builds."
          },
          "lodgingReason": {
            "type": [
              "null",
              "string"
            ]
          },
          "siteId": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "siteCode": {
            "type": [
              "null",
              "string"
            ]
          },
          "previewUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "The site on its Hotelwize Staging preview, once it has one."
          },
          "liveUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "The site on its own domain, once it is published there."
          },
          "build": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Build"
              }
            ]
          },
          "customer": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Customer"
              }
            ]
          },
          "presentation": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Presentation"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "logo": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ProjectLogo"
              }
            ]
          }
        },
        "description": "One website being made with SESAME."
      },
      "ProjectInput": {
        "type": "object",
        "properties": {
          "url": {
            "type": [
              "null",
              "string"
            ],
            "description": "The property's current website. Required unless NoWebsite."
          },
          "noWebsite": {
            "type": "boolean",
            "description": "The property has no website: it is built from the files uploaded to the project instead.",
            "default": false
          },
          "theme": {
            "type": [
              "null",
              "string"
            ],
            "description": "The Hotelwize theme, by the name `GET /themes` gives. Default Fusion."
          },
          "persona": {
            "type": [
              "null",
              "string"
            ],
            "description": "The voice SESAME writes in, by the id `GET /personas` gives it. Default \"Warm personal\"."
          },
          "languages": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            },
            "description": "Two-letter codes, the first being the site's main language. Default `en`, `el`."
          },
          "bookingEngine": {
            "type": [
              "null",
              "string"
            ],
            "description": "`None`, `Webhotelier` or `Bookwize`."
          },
          "hotelCode": {
            "type": [
              "null",
              "string"
            ],
            "description": "The property's code in its booking engine."
          },
          "bookingUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "The property's Booking.com listing."
          },
          "bookingUnits": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/BookingUnit"
            },
            "description": "Booking.com listings of single units (villas, apartments), each built as a room type of its own."
          },
          "seo": {
            "type": "boolean",
            "description": "Build the site for search, aimed at Keywords. Needs a Gemini key on the caller or their team.",
            "default": false
          },
          "keywords": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            }
          },
          "importOffers": {
            "type": "boolean",
            "description": "Build the booking engine's special offers into the site. Default true.",
            "default": true
          },
          "sourceFidelity": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "1 keeps the property's own sentences, 3 its facts in a new voice, 5 (the default) writes afresh.",
            "format": "int32",
            "default": 5
          }
        },
        "description": "What a website is built from. Everything but string? ProjectInput.Url (or bool ProjectInput.NoWebsite with a name) has a\ndefault, so the smallest request is a website address."
      },
      "ProjectLogo": {
        "required": [
          "url",
          "variant"
        ],
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "variant": {
            "type": "string",
            "description": "`light`, `dark` or `colour`: the presentation page sets a light logo on navy, the others on white."
          }
        },
        "description": "The property's own logo, as the last build reported it."
      },
      "RebuildRequest": {
        "required": [
          "confirmName"
        ],
        "type": "object",
        "properties": {
          "confirmName": {
            "type": "string"
          }
        },
        "description": "Builds the website again as a new Hotelwize site. string RebuildRequest.ConfirmName is the project's name, typed back."
      },
      "Salesperson": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "email": {
            "type": [
              "null",
              "string"
            ]
          },
          "phone": {
            "type": [
              "null",
              "string"
            ]
          },
          "calendarUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "Their booking page, an https address; \"Book a call\" goes there."
          },
          "photoUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "Their photograph, an https address. Left out, SESAME looks for one: the caller's own Hotelwize avatar when they are the salesperson, then the salesperson's Microsoft 365 photo."
          },
          "title": {
            "type": [
              "null",
              "string"
            ],
            "description": "What they do, under their name: \"Hotel websites · Hotelwize\"."
          },
          "message": {
            "type": [
              "null",
              "string"
            ],
            "description": "A note to the customer, in the customer's language."
          },
          "greekName": {
            "type": [
              "null",
              "string"
            ],
            "description": "How Greek copy names them after a verb, with its article: \"τη Μυρτώ\", \"τον Γιώργο\". Without it the Greek page asks the customer to call \"us\"."
          },
          "greekSubject": {
            "type": [
              "null",
              "string"
            ],
            "description": "How Greek copy names them as a sentence's subject, with its article: \"Η Μυρτώ\". Without it the Greek page speaks for \"us\" there."
          }
        },
        "description": "The person the presentation introduces, whom the customer is asked to call. Needs an email or a phone."
      },
      "SeenCookie": {
        "required": [
          "name",
          "domain"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "domain": {
            "type": "string"
          }
        }
      },
      "SeenLink": {
        "required": [
          "href",
          "text"
        ],
        "type": "object",
        "properties": {
          "href": {
            "type": [
              "null",
              "string"
            ]
          },
          "text": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "SiteAudit": {
        "required": [
          "url",
          "performanceDesktop",
          "performanceMobile",
          "accessibilityDesktop",
          "accessibilityMobile",
          "pageSpeedAt",
          "pageSpeedError",
          "accessibility",
          "gdpr",
          "browserChecksAt",
          "browserChecksBy"
        ],
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "performanceDesktop": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Google PageSpeed performance, 0 to 100, on desktop.",
            "format": "int32"
          },
          "performanceMobile": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "accessibilityDesktop": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "accessibilityMobile": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Google's accessibility score, 0 to 100, on mobile: what the page shows.",
            "format": "int32"
          },
          "pageSpeedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "pageSpeedError": {
            "type": [
              "null",
              "string"
            ],
            "description": "Why PageSpeed last failed, when it did."
          },
          "accessibility": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "The axe test against WCAG 2.1 AA, in a browser.",
                "$ref": "#/components/schemas/AccessibilityResult"
              }
            ]
          },
          "gdpr": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "What the first page did before the visitor consented, and the policies it links.",
                "$ref": "#/components/schemas/GdprResult"
              }
            ]
          },
          "browserChecksAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "browserChecksBy": {
            "type": [
              "null",
              "string"
            ],
            "description": "`sesame` when SESAME's browser looked, `upload` when the results were uploaded."
          }
        },
        "description": "One website's measurements; each part null until measured."
      },
      "SiteChecks": {
        "required": [
          "url",
          "finalUrl",
          "httpRedirectsToHttps",
          "cookies",
          "consentBannerFound",
          "links",
          "violations"
        ],
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "The address asked for."
          },
          "finalUrl": {
            "type": [
              "null",
              "string"
            ],
            "description": "Where it landed, after redirects."
          },
          "httpRedirectsToHttps": {
            "type": [
              "null",
              "boolean"
            ],
            "description": "Whether the plain http address sends visitors on to https; null when not tried."
          },
          "cookies": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/SeenCookie"
            },
            "description": "Every cookie the page set, for any domain, before consent. At most 200."
          },
          "consentBannerFound": {
            "type": "boolean",
            "description": "Whether a cookie consent banner was seen."
          },
          "links": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/SeenLink"
            },
            "description": "The page's links, as they were written. At most 1000."
          },
          "violations": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "$ref": "#/components/schemas/AccessibilityViolation"
            },
            "description": "axe's violations for the tags wcag2a, wcag2aa, wcag21a and wcag21aa, on the desktop page and the phone one. At most 200."
          }
        },
        "description": "What a browser saw on one website's first page, before anything was clicked."
      },
      "Theme": {
        "required": [
          "id",
          "code",
          "name",
          "type",
          "tier",
          "image",
          "demo"
        ],
        "type": "object",
        "properties": {
          "id": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "code": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "tier": {
            "type": "string"
          },
          "image": {
            "type": [
              "null",
              "string"
            ]
          },
          "demo": {
            "type": [
              "null",
              "string"
            ]
          }
        },
        "description": "A theme a website can be built on."
      },
      "TrackingCookie": {
        "required": [
          "name",
          "domain",
          "vendor",
          "thirdParty"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "domain": {
            "type": "string"
          },
          "vendor": {
            "type": [
              "null",
              "string"
            ]
          },
          "thirdParty": {
            "type": "boolean"
          }
        },
        "description": "A tracking cookie set before consent. string? TrackingCookie.Vendor is null for an unknown third party's."
      },
      "UpdateProjectRequest": {
        "type": "object",
        "properties": {
          "input": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ProjectInput"
              }
            ]
          },
          "name": {
            "type": [
              "null",
              "string"
            ]
          }
        },
        "description": "Changes a project that has not been sent to build yet. Only what is sent changes; once built, only the name does."
      }
    }
  },
  "tags": [
    {
      "name": "Account"
    },
    {
      "name": "Projects"
    }
  ]
}