{
  "swagger": "2.0",
  "info": {
    "title": "vFound",
    "description": "Connect Microsoft Power Automate to the vFound front desk suite.",
    "version": "1.0"
  },
  "host": "vfound.io",
  "basePath": "/api/v1",
  "schemes": [
    "https"
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "securityDefinitions": {
    "apiKey": {
      "type": "apiKey",
      "name": "Authorization",
      "in": "header",
      "description": "Enter Bearer followed by a scoped vFound API key."
    }
  },
  "security": [
    {
      "apiKey": []
    }
  ],
  "paths": {
    "/webhooks": {
      "post": {
        "operationId": "WhenSomethingHappensInVFound",
        "summary": "When something happens in vFound",
        "x-ms-summary": "When something happens in vFound",
        "description": "When something happens in vFound.",
        "x-vfound-scope": "webhooks:manage",
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/WebhookRequest"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "type": "string",
            "description": "A unique value that makes retries safe.",
            "x-ms-visibility": "advanced"
          }
        ],
        "responses": {
          "201": {
            "description": "Subscribed",
            "headers": {
              "Location": {
                "description": "The subscription resource to delete when the flow is removed.",
                "type": "string"
              }
            },
            "schema": {
              "$ref": "#/definitions/WebhookResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ],
        "x-ms-trigger": "single"
      }
    },
    "/webhooks/{id}": {
      "delete": {
        "operationId": "DeleteWebhookSubscription",
        "summary": "Delete a webhook subscription",
        "x-ms-summary": "Delete a webhook subscription",
        "description": "Delete a webhook subscription.",
        "x-vfound-scope": "webhooks:manage",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "type": "integer",
            "format": "int64",
            "description": "Webhook subscription id"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "type": "string",
            "description": "A unique value that makes retries safe.",
            "x-ms-visibility": "advanced"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ],
        "x-ms-visibility": "internal"
      }
    },
    "/items": {
      "get": {
        "operationId": "ListFoundItems",
        "summary": "List found items",
        "x-ms-summary": "List found items",
        "description": "List found items.",
        "x-vfound-scope": "items:read",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "type": "integer"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      },
      "post": {
        "operationId": "CreateFoundItem",
        "summary": "Create a found item",
        "x-ms-summary": "Create a found item",
        "description": "Create a found item.",
        "x-vfound-scope": "items:write",
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ItemInput"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "type": "string",
            "description": "A unique value that makes retries safe.",
            "x-ms-visibility": "advanced"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      }
    },
    "/analytics": {
      "get": {
        "operationId": "GetAnalytics",
        "summary": "Get the venue analytics summary",
        "x-ms-summary": "Get the venue analytics summary",
        "description": "Get the venue analytics summary.",
        "x-vfound-scope": "analytics:read",
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      }
    },
    "/parcels": {
      "get": {
        "operationId": "ListParcels",
        "summary": "List parcels",
        "x-ms-summary": "List parcels",
        "description": "List parcels.",
        "x-vfound-scope": "parcels:read",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "type": "integer"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      },
      "post": {
        "operationId": "CreateParcel",
        "summary": "Log a parcel",
        "x-ms-summary": "Log a parcel",
        "description": "Log a parcel.",
        "x-vfound-scope": "parcels:write",
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ParcelInput"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "type": "string",
            "description": "A unique value that makes retries safe.",
            "x-ms-visibility": "advanced"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      }
    },
    "/parcels/{id}/remind": {
      "post": {
        "operationId": "RemindParcel",
        "summary": "Remind a parcel recipient",
        "x-ms-summary": "Remind a parcel recipient",
        "description": "Remind a parcel recipient.",
        "x-vfound-scope": "parcels:write",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "type": "integer",
            "format": "int64",
            "description": "Parcel id"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "type": "string",
            "description": "A unique value that makes retries safe.",
            "x-ms-visibility": "advanced"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      }
    },
    "/checkroom/tickets": {
      "get": {
        "operationId": "ListCheckroomTickets",
        "summary": "List checkroom tickets",
        "x-ms-summary": "List checkroom tickets",
        "description": "List checkroom tickets.",
        "x-vfound-scope": "checkroom:read",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "type": "integer"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      },
      "post": {
        "operationId": "CheckIn",
        "summary": "Check something into the checkroom",
        "x-ms-summary": "Check something into the checkroom",
        "description": "Check something into the checkroom.",
        "x-vfound-scope": "checkroom:write",
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TicketInput"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "type": "string",
            "description": "A unique value that makes retries safe.",
            "x-ms-visibility": "advanced"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      }
    },
    "/loans": {
      "get": {
        "operationId": "ListEquipmentCheckouts",
        "summary": "List equipment checkouts",
        "x-ms-summary": "List equipment checkouts",
        "description": "List equipment checkouts.",
        "x-vfound-scope": "loans:read",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "type": "integer"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      },
      "post": {
        "operationId": "LendEquipment",
        "summary": "Hand out equipment",
        "x-ms-summary": "Hand out equipment",
        "description": "Hand out equipment.",
        "x-vfound-scope": "loans:write",
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/LoanInput"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "type": "string",
            "description": "A unique value that makes retries safe.",
            "x-ms-visibility": "advanced"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      }
    },
    "/visitors": {
      "get": {
        "operationId": "ListVisits",
        "summary": "List visits",
        "x-ms-summary": "List visits",
        "description": "List visits.",
        "x-vfound-scope": "visitors:read",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "type": "integer"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      },
      "post": {
        "operationId": "CreateVisit",
        "summary": "Invite or sign in a visitor",
        "x-ms-summary": "Invite or sign in a visitor",
        "description": "Invite or sign in a visitor.",
        "x-vfound-scope": "visitors:write",
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/VisitInput"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "type": "string",
            "description": "A unique value that makes retries safe.",
            "x-ms-visibility": "advanced"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      }
    },
    "/people": {
      "get": {
        "operationId": "ListPeople",
        "summary": "List people",
        "x-ms-summary": "List people",
        "description": "List people.",
        "x-vfound-scope": "people:read",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "type": "string"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "type": "integer"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      }
    },
    "/people/upsert": {
      "post": {
        "operationId": "UpsertPeople",
        "summary": "Add or update people",
        "x-ms-summary": "Add or update people",
        "description": "Add or update people.",
        "x-vfound-scope": "people:write",
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PeopleUpsert"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "type": "string",
            "description": "A unique value that makes retries safe.",
            "x-ms-visibility": "advanced"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "schema": {
              "$ref": "#/definitions/AnyResponse"
            }
          },
          "401": {
            "description": "No valid API key."
          },
          "403": {
            "description": "The key lacks the required scope, the product is not open, or the venue is paused."
          },
          "422": {
            "description": "The request is invalid."
          },
          "429": {
            "description": "The API rate limit was reached."
          }
        },
        "security": [
          {
            "apiKey": []
          }
        ],
        "tags": [
          "vFound"
        ]
      }
    }
  },
  "definitions": {
    "AnyResponse": {
      "type": "object",
      "additionalProperties": true
    },
    "EventNames": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "string",
        "enum": [
          "item.created",
          "item.updated",
          "claim.created",
          "claim.status_changed",
          "lost_report.created",
          "parcel.logged",
          "parcel.updated",
          "parcel.reminded",
          "parcel.collected",
          "parcel.returned",
          "checkroom.checked_in",
          "checkroom.handed_back",
          "checkroom.left",
          "loan.lent",
          "loan.due_soon",
          "loan.overdue",
          "loan.extended",
          "loan.returned",
          "loan.lost",
          "visit.expected",
          "visit.signed_in",
          "visit.host_confirmed",
          "visit.signed_out",
          "visit.cancelled"
        ],
        "x-ms-enum": {
          "name": "VfoundEvent",
          "modelAsString": true,
          "values": [
            {
              "value": "item.created",
              "displayName": "item.created"
            },
            {
              "value": "item.updated",
              "displayName": "item.updated"
            },
            {
              "value": "claim.created",
              "displayName": "claim.created"
            },
            {
              "value": "claim.status_changed",
              "displayName": "claim.status_changed"
            },
            {
              "value": "lost_report.created",
              "displayName": "lost_report.created"
            },
            {
              "value": "parcel.logged",
              "displayName": "parcel.logged"
            },
            {
              "value": "parcel.updated",
              "displayName": "parcel.updated"
            },
            {
              "value": "parcel.reminded",
              "displayName": "parcel.reminded"
            },
            {
              "value": "parcel.collected",
              "displayName": "parcel.collected"
            },
            {
              "value": "parcel.returned",
              "displayName": "parcel.returned"
            },
            {
              "value": "checkroom.checked_in",
              "displayName": "checkroom.checked_in"
            },
            {
              "value": "checkroom.handed_back",
              "displayName": "checkroom.handed_back"
            },
            {
              "value": "checkroom.left",
              "displayName": "checkroom.left"
            },
            {
              "value": "loan.lent",
              "displayName": "loan.lent"
            },
            {
              "value": "loan.due_soon",
              "displayName": "loan.due_soon"
            },
            {
              "value": "loan.overdue",
              "displayName": "loan.overdue"
            },
            {
              "value": "loan.extended",
              "displayName": "loan.extended"
            },
            {
              "value": "loan.returned",
              "displayName": "loan.returned"
            },
            {
              "value": "loan.lost",
              "displayName": "loan.lost"
            },
            {
              "value": "visit.expected",
              "displayName": "visit.expected"
            },
            {
              "value": "visit.signed_in",
              "displayName": "visit.signed_in"
            },
            {
              "value": "visit.host_confirmed",
              "displayName": "visit.host_confirmed"
            },
            {
              "value": "visit.signed_out",
              "displayName": "visit.signed_out"
            },
            {
              "value": "visit.cancelled",
              "displayName": "visit.cancelled"
            }
          ]
        }
      }
    },
    "WebhookRequest": {
      "type": "object",
      "required": [
        "url",
        "events"
      ],
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "x-ms-notification-url": true,
          "description": "The notification URL supplied by Power Automate."
        },
        "events": {
          "$ref": "#/definitions/EventNames"
        }
      }
    },
    "WebhookResponse": {
      "type": "object",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "type": "object",
          "required": [
            "id",
            "url",
            "events",
            "enabled",
            "secret"
          ],
          "properties": {
            "id": {
              "type": "integer",
              "format": "int64"
            },
            "url": {
              "type": "string"
            },
            "events": {
              "$ref": "#/definitions/EventNames"
            },
            "enabled": {
              "type": "boolean"
            },
            "secret": {
              "type": "string"
            }
          }
        }
      }
    },
    "ParcelInput": {
      "type": "object",
      "properties": {
        "recipient_email": {
          "type": "string",
          "format": "email"
        },
        "recipient_name": {
          "type": "string"
        },
        "unit": {
          "type": "string"
        },
        "carrier": {
          "type": "string"
        },
        "tracking": {
          "type": "string"
        },
        "sender": {
          "type": "string"
        },
        "shelf": {
          "type": "string"
        },
        "notify": {
          "type": "boolean"
        }
      }
    },
    "TicketInput": {
      "type": "object",
      "required": [
        "kind"
      ],
      "properties": {
        "kind": {
          "type": "string",
          "enum": [
            "coat",
            "bag",
            "luggage",
            "other"
          ]
        },
        "pieces": {
          "type": "integer",
          "minimum": 1,
          "maximum": 20
        },
        "guest_name": {
          "type": "string"
        },
        "guest_email": {
          "type": "string",
          "format": "email"
        },
        "guest_room": {
          "type": "string"
        },
        "collect_by": {
          "type": "string",
          "format": "date-time"
        },
        "notes": {
          "type": "string"
        }
      }
    },
    "LoanInput": {
      "type": "object",
      "required": [
        "borrower_name"
      ],
      "properties": {
        "item_id": {
          "type": "integer"
        },
        "item_code": {
          "type": "string"
        },
        "borrower_name": {
          "type": "string"
        },
        "borrower_email": {
          "type": "string",
          "format": "email"
        },
        "borrower_reference": {
          "type": "string"
        },
        "due_at": {
          "type": "string",
          "format": "date-time"
        },
        "note": {
          "type": "string"
        },
        "language": {
          "type": "string",
          "enum": [
            "en",
            "es",
            "fr",
            "de",
            "nl",
            "it"
          ]
        }
      }
    },
    "VisitInput": {
      "type": "object",
      "required": [
        "visitor_name"
      ],
      "properties": {
        "visitor_name": {
          "type": "string"
        },
        "visitor_email": {
          "type": "string",
          "format": "email"
        },
        "visitor_company": {
          "type": "string"
        },
        "purpose": {
          "type": "string"
        },
        "host_email": {
          "type": "string",
          "format": "email"
        },
        "host_name": {
          "type": "string"
        },
        "expected_at": {
          "type": "string",
          "format": "date-time"
        },
        "arriving_now": {
          "type": "boolean"
        },
        "language": {
          "type": "string",
          "enum": [
            "en",
            "es",
            "fr",
            "de",
            "nl",
            "it"
          ]
        },
        "note": {
          "type": "string"
        },
        "agreed": {
          "type": "boolean"
        }
      }
    },
    "PeopleUpsert": {
      "type": "object",
      "required": [
        "people"
      ],
      "properties": {
        "people": {
          "type": "array",
          "minItems": 1,
          "maxItems": 500,
          "items": {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "email": {
                "type": "string",
                "format": "email"
              },
              "unit": {
                "type": "string"
              },
              "reference": {
                "type": "string"
              },
              "language": {
                "type": "string",
                "enum": [
                  "en",
                  "es",
                  "fr",
                  "de",
                  "nl",
                  "it"
                ]
              }
            }
          }
        }
      }
    },
    "ItemInput": {
      "type": "object",
      "required": [
        "title",
        "category"
      ],
      "properties": {
        "title": {
          "type": "string"
        },
        "category": {
          "type": "string"
        },
        "found_date": {
          "type": "string",
          "format": "date"
        },
        "found_time": {
          "type": "string"
        },
        "location": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "colour": {
          "type": "string"
        },
        "brand": {
          "type": "string"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "notes": {
          "type": "string"
        },
        "photo_public": {
          "type": "boolean"
        }
      }
    }
  }
}
