{
  "openapi" : "3.0.1",
  "info" : {
    "description" : "<details>\n<summary><strong>Rate limiting</strong> — per-account throttling on all <code>/api/external/**</code> endpoints.</summary>\n\n### Policies\n\nTwo policies apply concurrently:\n\n- **Sustained** — a per-account quota refilled continuously over a 1-hour window. The specific quota is assigned per account and may change; read the `RateLimit` response header for the current value.\n- **Spike** — 100 requests per 10 seconds. On exhaustion, there is a 60-second cooldown before the spike bucket recovers.\n\n### Response headers\n\nEvery response (success or failure) includes two headers.\n\n**`RateLimit-Policy`** — describes the active policies, following the IETF [draft-ietf-httpapi-ratelimit-headers](https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-ratelimit-headers) quoted-string format.\n\n```\nFormat:    \"<policy>\";q=<quota>;w=<window-sec>, ...\nExample:   RateLimit-Policy: \"sustained\";q=10000;w=3600, \"spike\";q=100;w=10\n```\n\n**`RateLimit`** — current status for whichever policy is closest to exhaustion. The `r` value is the available quota (it can rise as well as fall, depending on the policy), and `t` is the effective window in seconds within which no more than `r` tokens may be spent.\n\n```\nFormat:    \"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>\nExample:   RateLimit: \"spike\";r=87;t=3;os-cost=1\n```\n\nThe `os-cost` parameter is an OpenSpace-specific extension reporting the on-arrival cost of the current request: `1` on accepted requests, `0` on `429` responses (the bucket was not debited).\n\n### Cost model\n\nA request consumes 1 token on arrival. Longer-running requests cost more; the extra cost is charged after the response completes:\n\n- **< 1 second** — 1 token\n- **1 second ≤ duration < 5 seconds** — 2 tokens\n- **≥ 5 seconds** — 5 tokens\n\nExtra cost for slow requests is debited from the bucket internally; the lower available quota is reflected in the `RateLimit` header on subsequent requests.\n\n### Handling `429` responses\n\nA `429 Too Many Requests` response includes:\n\n- `Retry-After` — seconds to wait before retrying (rounded up; always ≥ 1 second).\n- An `application/problem+json` body ([RFC 7807 Problem Details](https://datatracker.ietf.org/doc/html/rfc7807)) with `type`, `title`, `status`, and `detail`.\n\nClients should honor `Retry-After` as a minimum wait, and use exponential backoff with jitter when throttling persists across retries.\n\n</details>",
    "title" : "OpenSpace API",
    "version" : "v3.0"
  },
  "servers" : [ {
    "url" : "/",
    "description" : "OpenSpace API root"
  } ],
  "tags" : [ {
    "description" : "Webhook subscription rule management APIs",
    "name" : "Webhook Rules"
  }, {
    "description" : "Field notes APIs",
    "name" : "Field notes"
  }, {
    "description" : "ExecutiveView progress data (OS Track) proxied from progress-tracking-api",
    "name" : "external-executive-view-controller"
  }, {
    "description" : "Sites APIs",
    "name" : "Sites"
  }, {
    "description" : "Images APIs",
    "name" : "Images"
  }, {
    "description" : "Reporting APIs",
    "name" : "Reports"
  }, {
    "description" : "Webhook delivery history and redelivery APIs",
    "name" : "Webhook Deliveries"
  }, {
    "description" : "Public configuration values needed before authentication",
    "name" : "Global config"
  }, {
    "description" : "Organizations APIs",
    "name" : "Organizations"
  }, {
    "description" : "Construction phases proxied from the Progress Tracking API",
    "name" : "Progress Tracking"
  }, {
    "description" : "Custom field notes APIs. Beta — subject to change without notification.",
    "name" : "Custom Field Notes"
  }, {
    "description" : "Webhook management APIs for event notifications",
    "name" : "Webhooks"
  }, {
    "description" : "Webhook custom header management APIs",
    "name" : "Webhook Headers"
  } ],
  "paths" : {
    "/api/external/v1/global-config" : {
      "get" : {
        "description" : "Anonymous endpoint returning configuration values needed before authentication.",
        "operationId" : "getGlobalConfig",
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalGlobalConfigResponse"
                }
              }
            },
            "description" : "OK"
          }
        },
        "summary" : "Get public configuration",
        "tags" : [ "Global config" ]
      }
    },
    "/api/external/v1/organizations" : {
      "get" : {
        "operationId" : "organizations",
        "parameters" : [ {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalOrganizationsGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all organizations",
        "tags" : [ "Organizations" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}" : {
      "get" : {
        "operationId" : "organizationById",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalOrganization"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get organization by id",
        "tags" : [ "Organizations" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/sites" : {
      "get" : {
        "operationId" : "sitesByOrganization",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSitesGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all sites by organization",
        "tags" : [ "Organizations" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks" : {
      "get" : {
        "description" : "Get all webhooks configured for the specified organization",
        "operationId" : "listWebhooks",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhooksGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List webhooks for an organization",
        "tags" : [ "Webhooks" ]
      },
      "post" : {
        "description" : "Register a new webhook endpoint for the organization. Newly created webhooks start in the notVerified state and do not receive rule-matched event deliveries until verified via POST /webhooks/{id}/verify.",
        "operationId" : "createWebhook",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalWebhookCreateRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhook"
                }
              }
            },
            "description" : "Webhook created"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Create a new webhook",
        "tags" : [ "Webhooks" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}" : {
      "delete" : {
        "description" : "Delete a webhook and all associated rules and headers",
        "operationId" : "deleteWebhook",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "204" : {
            "description" : "Webhook deleted"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Delete webhook",
        "tags" : [ "Webhooks" ]
      },
      "get" : {
        "description" : "Retrieve details of a specific webhook",
        "operationId" : "getWebhook",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhook"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get webhook by ID",
        "tags" : [ "Webhooks" ]
      },
      "patch" : {
        "description" : "Update webhook configuration. Can be used to pause/resume webhooks by changing status. When the URL is changed, the new URL is verified inline (HMAC-signed probe expecting HTTP 2xx) and the update is rejected with 422 if the probe fails. Pass ?skipVerify=true to save the new URL without probing; verification state is reset to notVerified in that case.",
        "operationId" : "updateWebhook",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "skipVerify",
          "required" : false,
          "schema" : {
            "type" : "boolean",
            "default" : false
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalWebhookUpdateRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhook"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "422" : {
            "description" : "URL verification failed"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Update webhook",
        "tags" : [ "Webhooks" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/deliveries" : {
      "get" : {
        "description" : "Get delivery history for a webhook",
        "operationId" : "listDeliveries",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 100
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookDeliveriesGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List webhook deliveries",
        "tags" : [ "Webhook Deliveries" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/deliveries/{deliveryId}" : {
      "get" : {
        "description" : "Get detailed information about a specific delivery including all attempts",
        "operationId" : "getDeliveryDetail",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "deliveryId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookDeliveryDetail"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Delivery not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get delivery details",
        "tags" : [ "Webhook Deliveries" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver" : {
      "post" : {
        "description" : "Retry delivery of a failed webhook event",
        "operationId" : "redeliverEvent",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "deliveryId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookDelivery"
                }
              }
            },
            "description" : "Redelivery initiated"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Delivery not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Redeliver webhook event",
        "tags" : [ "Webhook Deliveries" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/headers" : {
      "get" : {
        "description" : "Get all custom headers configured for a webhook",
        "operationId" : "listHeaders",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookHeadersGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List webhook headers",
        "tags" : [ "Webhook Headers" ]
      },
      "post" : {
        "description" : "Add a custom header to include in webhook requests",
        "operationId" : "createHeader",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalWebhookHeaderCreateRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookHeader"
                }
              }
            },
            "description" : "Header created"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Add webhook header",
        "tags" : [ "Webhook Headers" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/headers/{headerId}" : {
      "delete" : {
        "description" : "Delete a webhook header",
        "operationId" : "deleteHeader",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "headerId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "204" : {
            "description" : "Header deleted"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Header not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Delete webhook header",
        "tags" : [ "Webhook Headers" ]
      },
      "get" : {
        "description" : "Retrieve details of a specific webhook header",
        "operationId" : "getHeader",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "headerId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookHeader"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Header not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get webhook header by ID",
        "tags" : [ "Webhook Headers" ]
      },
      "patch" : {
        "description" : "Update a webhook header value",
        "operationId" : "updateHeader",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "headerId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalWebhookHeaderUpdateRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookHeader"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Header not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Update webhook header",
        "tags" : [ "Webhook Headers" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/rules" : {
      "get" : {
        "description" : "Get all subscription rules for a webhook",
        "operationId" : "listRules",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookRulesGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List webhook rules",
        "tags" : [ "Webhook Rules" ]
      },
      "post" : {
        "description" : "Create a new subscription rule for a webhook. Rules define which events trigger webhook deliveries.",
        "operationId" : "createRule",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalWebhookRuleCreateRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "201" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookRule"
                }
              }
            },
            "description" : "Rule created"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Create webhook rule",
        "tags" : [ "Webhook Rules" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/rules/{ruleId}" : {
      "delete" : {
        "description" : "Delete a webhook rule",
        "operationId" : "deleteRule",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "ruleId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "204" : {
            "description" : "Rule deleted"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Rule not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Delete webhook rule",
        "tags" : [ "Webhook Rules" ]
      },
      "get" : {
        "description" : "Retrieve details of a specific webhook rule",
        "operationId" : "getRule",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "ruleId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookRule"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Rule not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get webhook rule by ID",
        "tags" : [ "Webhook Rules" ]
      },
      "patch" : {
        "description" : "Update an existing webhook rule",
        "operationId" : "updateRule",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "ruleId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalWebhookRuleUpdateRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookRule"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Rule not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Update webhook rule",
        "tags" : [ "Webhook Rules" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/test" : {
      "post" : {
        "description" : "Send a test event to the webhook endpoint to verify configuration. Creates a field_note:created event for the specified field note. Test events bypass the verification gate — they are dispatched even when verificationState is notVerified / verificationError, as long as the webhook is ENABLED. Use /test to debug endpoint configuration before /verify succeeds.",
        "operationId" : "testWebhook",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalWebhookTestRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookTestResponse"
                }
              }
            },
            "description" : "Test event sent"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook or field note not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "503" : {
            "description" : "Test service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Test webhook",
        "tags" : [ "Webhooks" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/update-secret" : {
      "post" : {
        "description" : "Rotate the secret token used for HMAC signatures. With the default skipVerify=false, the endpoint is probed with the new secret before persistence: on success the new secret is saved and verificationState is set to verified; on failure the rotation is rejected with 422 and the old secret stays in place. Pass ?skipVerify=true to save the secret without probing — state is reset to notVerified. Use the skipVerify escape hatch when the endpoint is known to be unreachable but rotation must still complete (e.g. suspected secret leak).",
        "operationId" : "updateWebhookSecret",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "skipVerify",
          "required" : false,
          "schema" : {
            "type" : "boolean",
            "default" : false
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalWebhookUpdateSecretRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhook"
                }
              }
            },
            "description" : "Secret updated"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "422" : {
            "description" : "Verification probe failed"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Update webhook secret",
        "tags" : [ "Webhooks" ]
      }
    },
    "/api/external/v1/organizations/{organizationId}/webhooks/{webhookId}/verify" : {
      "post" : {
        "description" : "Send a signed verification probe to the webhook URL. Updates verification_state based on the response. Required before the webhook can receive event deliveries.",
        "operationId" : "verifyWebhook",
        "parameters" : [ {
          "in" : "path",
          "name" : "organizationId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "webhookId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalWebhookVerifyResponse"
                }
              }
            },
            "description" : "Webhook verified"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "description" : "Forbidden"
          },
          "404" : {
            "description" : "Webhook not found"
          },
          "422" : {
            "description" : "Verification failed"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Verify a webhook endpoint",
        "tags" : [ "Webhooks" ]
      }
    },
    "/api/external/v1/reports/360-videos" : {
      "get" : {
        "operationId" : "getReporting360Videos",
        "parameters" : [ {
          "description" : "Video started after",
          "example" : "2020-01-01T12:00:00Z",
          "in" : "query",
          "name" : "videoStartedAfter",
          "required" : false,
          "schema" : {
            "type" : "string",
            "format" : "date-time"
          }
        }, {
          "description" : "Organization ids to select",
          "in" : "query",
          "name" : "orgs",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "videoStart", "videoStart,ASC", "videoStart,DESC", "orgName", "orgName,ASC", "orgName,DESC", "siteName", "siteName,ASC", "siteName,DESC", "sheetName", "sheetName,ASC", "sheetName,DESC", "sheetCreated", "sheetCreated,ASC", "sheetCreated,DESC", "sheetDisplayOrder", "sheetDisplayOrder,ASC", "sheetDisplayOrder,DESC", "orgCreated", "orgCreated,ASC", "orgCreated,DESC", "orgUpdated", "orgUpdated,ASC", "orgUpdated,DESC", "siteCreated", "siteCreated,ASC", "siteCreated,DESC" ]
            },
            "default" : [ "videoStart,DESC" ]
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Reporting360VideoPageResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all accessible 360 videos.",
        "tags" : [ "Reports" ]
      }
    },
    "/api/external/v1/reports/drone-images" : {
      "get" : {
        "operationId" : "getReportingDroneImages",
        "parameters" : [ {
          "description" : "Drone capture created after",
          "example" : "2020-01-01T12:00:00Z",
          "in" : "query",
          "name" : "droneCaptureCreatedAfter",
          "required" : false,
          "schema" : {
            "type" : "string",
            "format" : "date-time"
          }
        }, {
          "description" : "Organization ids to select",
          "in" : "query",
          "name" : "orgs",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "droneCaptureCreated", "droneCaptureCreated,ASC", "droneCaptureCreated,DESC", "droneImageCreated", "droneImageCreated,ASC", "droneImageCreated,DESC", "orgName", "orgName,ASC", "orgName,DESC", "siteName", "siteName,ASC", "siteName,DESC", "orgCreated", "orgCreated,ASC", "orgCreated,DESC", "orgUpdated", "orgUpdated,ASC", "orgUpdated,DESC", "siteCreated", "siteCreated,ASC", "siteCreated,DESC" ]
            },
            "default" : [ "droneCaptureCreated,DESC" ]
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ReportingDroneImagePageResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all accessible drone images.",
        "tags" : [ "Reports" ]
      }
    },
    "/api/external/v1/reports/field-notes" : {
      "get" : {
        "operationId" : "getReportingFieldNotes",
        "parameters" : [ {
          "description" : "Field note updated after",
          "example" : "2020-01-01T12:00:00Z",
          "in" : "query",
          "name" : "fieldNoteUpdatedAfter",
          "required" : false,
          "schema" : {
            "type" : "string",
            "format" : "date-time"
          }
        }, {
          "description" : "Organization ids to select",
          "in" : "query",
          "name" : "orgs",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "fieldNoteCreated", "fieldNoteCreated,ASC", "fieldNoteCreated,DESC", "fieldNoteUpdated", "fieldNoteUpdated,ASC", "fieldNoteUpdated,DESC", "orgName", "orgName,ASC", "orgName,DESC", "siteName", "siteName,ASC", "siteName,DESC", "sheetName", "sheetName,ASC", "sheetName,DESC", "sheetCreated", "sheetCreated,ASC", "sheetCreated,DESC", "sheetDisplayOrder", "sheetDisplayOrder,ASC", "sheetDisplayOrder,DESC", "orgCreated", "orgCreated,ASC", "orgCreated,DESC", "orgUpdated", "orgUpdated,ASC", "orgUpdated,DESC", "siteCreated", "siteCreated,ASC", "siteCreated,DESC" ]
            },
            "default" : [ "fieldNoteUpdated,DESC" ]
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ReportingFieldNotePageResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all accessible field notes.",
        "tags" : [ "Reports" ]
      }
    },
    "/api/external/v1/reports/memberships" : {
      "get" : {
        "operationId" : "getMemberships",
        "parameters" : [ {
          "description" : "Organization ids to select",
          "in" : "query",
          "name" : "orgs",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "email", "email,ASC", "email,DESC", "membershipUpdated", "membershipUpdated,ASC", "membershipUpdated,DESC", "membershipCreated", "membershipCreated,ASC", "membershipCreated,DESC", "orgName", "orgName,ASC", "orgName,DESC", "siteName", "siteName,ASC", "siteName,DESC", "orgCreated", "orgCreated,ASC", "orgCreated,DESC", "orgUpdated", "orgUpdated,ASC", "orgUpdated,DESC", "siteCreated", "siteCreated,ASC", "siteCreated,DESC" ]
            },
            "default" : [ "email,ASC" ]
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ReportingMembershipPageResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all accessible memberships. Limited to organization administrators.",
        "tags" : [ "Reports" ]
      }
    },
    "/api/external/v1/reports/organizations" : {
      "get" : {
        "operationId" : "getReportingOrganizations",
        "parameters" : [ {
          "description" : "Organization updated after",
          "example" : "2020-01-01T12:00:00Z",
          "in" : "query",
          "name" : "organizationUpdatedAfter",
          "required" : false,
          "schema" : {
            "type" : "string",
            "format" : "date-time"
          }
        }, {
          "description" : "Organization ids to select",
          "in" : "query",
          "name" : "orgs",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "orgName", "orgName,ASC", "orgName,DESC", "orgCreated", "orgCreated,ASC", "orgCreated,DESC", "orgUpdated", "orgUpdated,ASC", "orgUpdated,DESC" ]
            },
            "default" : [ "orgUpdated,DESC" ]
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/GetReportingOrganizationsResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all accessible organizations.",
        "tags" : [ "Reports" ]
      }
    },
    "/api/external/v1/reports/sheets" : {
      "get" : {
        "operationId" : "getReportingSheets",
        "parameters" : [ {
          "description" : "Sheet created after",
          "example" : "2020-01-01T12:00:00Z",
          "in" : "query",
          "name" : "sheetCreatedAfter",
          "required" : false,
          "schema" : {
            "type" : "string",
            "format" : "date-time"
          }
        }, {
          "description" : "Organization ids to select",
          "in" : "query",
          "name" : "orgs",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "orgName", "orgName,ASC", "orgName,DESC", "siteName", "siteName,ASC", "siteName,DESC", "sheetName", "sheetName,ASC", "sheetName,DESC", "sheetCreated", "sheetCreated,ASC", "sheetCreated,DESC", "sheetDisplayOrder", "sheetDisplayOrder,ASC", "sheetDisplayOrder,DESC", "orgCreated", "orgCreated,ASC", "orgCreated,DESC", "orgUpdated", "orgUpdated,ASC", "orgUpdated,DESC", "siteCreated", "siteCreated,ASC", "siteCreated,DESC" ]
            },
            "default" : [ "sheetCreated,DESC" ]
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/GetReportingSheetPageResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all accessible sheets.",
        "tags" : [ "Reports" ]
      }
    },
    "/api/external/v1/reports/site-events" : {
      "get" : {
        "operationId" : "getReportingSiteEvents",
        "parameters" : [ {
          "description" : "Site event created after",
          "example" : "2020-01-01T12:00:00Z",
          "in" : "query",
          "name" : "siteEventCreatedAfter",
          "required" : false,
          "schema" : {
            "type" : "string",
            "format" : "date-time"
          }
        }, {
          "description" : "Organization ids to select",
          "in" : "query",
          "name" : "orgs",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "orgName", "orgName,ASC", "orgName,DESC", "orgCreated", "orgCreated,ASC", "orgCreated,DESC", "orgUpdated", "orgUpdated,ASC", "orgUpdated,DESC", "siteName", "siteName,ASC", "siteName,DESC", "siteCreated", "siteCreated,ASC", "siteCreated,DESC", "siteEventCreated", "siteEventCreated,ASC", "siteEventCreated,DESC" ]
            },
            "default" : [ "siteEventCreated,DESC" ]
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/GetReportingSiteEventPageResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all accessible site events. Limited to organization administrators, and to one event per user per day.",
        "tags" : [ "Reports" ]
      }
    },
    "/api/external/v1/reports/sites" : {
      "get" : {
        "operationId" : "getReportingSites",
        "parameters" : [ {
          "description" : "Site created after",
          "example" : "2020-01-01T12:00:00Z",
          "in" : "query",
          "name" : "siteCreatedAfter",
          "required" : false,
          "schema" : {
            "type" : "string",
            "format" : "date-time"
          }
        }, {
          "description" : "Organization ids to select",
          "in" : "query",
          "name" : "orgs",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 10
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "orgName", "orgName,ASC", "orgName,DESC", "orgCreated", "orgCreated,ASC", "orgCreated,DESC", "orgUpdated", "orgUpdated,ASC", "orgUpdated,DESC", "siteName", "siteName,ASC", "siteName,DESC", "siteCreated", "siteCreated,ASC", "siteCreated,DESC" ]
            },
            "default" : [ "siteCreated,DESC" ]
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/GetReportingSitePageResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all accessible sites.",
        "tags" : [ "Reports" ]
      }
    },
    "/api/external/v1/sites/{siteId}" : {
      "get" : {
        "operationId" : "getSite",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "include",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "accounts", "organization", "eligibleFieldNoteWatcherIds" ]
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSiteGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get site",
        "tags" : [ "Sites" ]
      }
    },
    "/api/external/v1/sites/{siteId}/captures" : {
      "get" : {
        "operationId" : "capturesBySite",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "publishedSince",
          "required" : false,
          "schema" : {
            "type" : "string",
            "format" : "date-time"
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 1000
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalCapturesGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all captures by site",
        "tags" : [ "Sites" ]
      }
    },
    "/api/external/v1/sites/{siteId}/captures/{captureId}" : {
      "get" : {
        "operationId" : "capturesById",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "captureId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "include",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "site", "sheet" ]
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalCaptureGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get capture by id",
        "tags" : [ "Sites" ]
      }
    },
    "/api/external/v1/sites/{siteId}/captures/{captureId}/panos" : {
      "get" : {
        "operationId" : "getPanos",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "captureId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 100
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalPanosGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all panos for capture",
        "tags" : [ "Sites" ]
      }
    },
    "/api/external/v1/sites/{siteId}/captures/{captureId}/panos/{panoId}/equi" : {
      "get" : {
        "operationId" : "downloadOrReprojectEquirectangularImage",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "captureId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "panoId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/vnd.openspace.signed-url+json" : { },
              "image/jpeg" : { }
            },
            "description" : "OK"
          },
          "302" : {
            "description" : "Redirect to a location for downloading"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Generate an equirectangular image on demand",
        "tags" : [ "Images" ]
      }
    },
    "/api/external/v1/sites/{siteId}/captures/{captureId}/panos/{panoId}/image" : {
      "get" : {
        "operationId" : "getImage",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "captureId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "panoId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/vnd.openspace.signed-url+json" : { },
              "image/jpeg" : { }
            },
            "description" : "The image returned may be any of the provided image media types. The provided Content-Type and Content-Disposition headers will inform you as to the file contents."
          },
          "302" : {
            "description" : "Redirect to a location for downloading"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Fetch an actual 360 image",
        "tags" : [ "Images" ]
      }
    },
    "/api/external/v1/sites/{siteId}/captures/{captureId}/panos/{panoId}/preview-equi" : {
      "get" : {
        "operationId" : "previewEquirectangularImage",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "captureId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "panoId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/vnd.openspace.signed-url+json" : { },
              "image/jpeg" : { }
            },
            "description" : "OK"
          },
          "302" : {
            "description" : "Redirect to a location for downloading"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Return the low resolution equirectangular image",
        "tags" : [ "Images" ]
      }
    },
    "/api/external/v1/sites/{siteId}/custom-field-notes/search" : {
      "post" : {
        "description" : "Beta — subject to change without notification. Lists a site's custom field notes, paged and sorted, filtered by template, integration type, crew, creator, sheet, zone, dates, free text and field values; `includeIds` narrows to specific notes. Pages hold at most 100 notes, a larger `size` is capped. Each note carries its field values as `fields.<property>.value`; when a value is an id from a vendor vocabulary or a select option, the entry also has `labels`, each resolved code mapped to its display text.",
        "operationId" : "searchCustomFieldNotes",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "include",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "templates", "templateVersions", "photos", "attachments", "creators", "comments", "sheets", "zones" ]
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 100
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "createdAt", "createdAt,ASC", "createdAt,DESC", "modifiedAt", "modifiedAt,ASC", "modifiedAt,DESC", "title", "title,ASC", "title,DESC", "closed", "closed,ASC", "closed,DESC", "uid", "uid,ASC", "uid,DESC", "sheetName", "sheetName,ASC", "sheetName,DESC", "zoneName", "zoneName,ASC", "zoneName,DESC" ]
            },
            "default" : [ "createdAt,DESC" ]
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalCustomFieldNoteSearch"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "examples" : {
                  "One ACC note, every field shape" : {
                    "description" : "One ACC note, every field shape",
                    "value" : {
                      "content" : [ {
                        "id" : "aR7EcQq0Rz6m1yN4Vw2pXg",
                        "siteId" : "qlCBQbP1TRahX2XbbJxdsQ",
                        "templateId" : "JxbiFwxLS06cHz1aXo-aAQ",
                        "templateVersionId" : "l21b_3oeTD2OLxtMbY4PIg",
                        "integrationType" : "accIssue",
                        "uniqueKey" : "9001",
                        "title" : "Conduit clash L2",
                        "closed" : false,
                        "sheetId" : "9kQmZ2xLTq6gW1bN8cV3yA",
                        "sheetPosition" : [ 0.42, 0.61, 0 ],
                        "creatorId" : "77CIu3rKQ0WcXkq8dTnVfw",
                        "createdAt" : "2026-08-27T21:20:11Z",
                        "updatedAt" : "2026-08-28T08:02:34Z",
                        "fields" : {
                          "title" : {
                            "value" : "Conduit clash L2"
                          },
                          "description" : {
                            "value" : null
                          },
                          "dueDate" : {
                            "value" : "2026-09-02"
                          },
                          "status" : {
                            "value" : "in_review",
                            "labels" : {
                              "in_review" : "In Review"
                            }
                          },
                          "issueSubtypeId" : {
                            "value" : "011dfa06-8c1e-4e4a-9d3b-2f6c7a8b9c0d",
                            "labels" : {
                              "011dfa06-8c1e-4e4a-9d3b-2f6c7a8b9c0d" : "Coordination · Clash"
                            }
                          },
                          "locationId" : {
                            "value" : "loc-301",
                            "labels" : {
                              "loc-301" : "Project > Level 3 > Room 301"
                            }
                          },
                          "rootCauseId" : {
                            "value" : null
                          },
                          "assignedTo" : {
                            "value" : "gone-1",
                            "labels" : { }
                          },
                          "assignedToType" : {
                            "value" : "company",
                            "labels" : {
                              "company" : "Company"
                            }
                          },
                          "watchers" : {
                            "value" : [ "oxygen-1", "company-1", "gone-2" ],
                            "labels" : {
                              "oxygen-1" : "Kai Weber",
                              "company-1" : "Northwind Electrical"
                            }
                          }
                        },
                        "labelsResolved" : false
                      } ],
                      "page" : {
                        "page" : 0,
                        "size" : 100,
                        "itemCount" : 1,
                        "pageCount" : 1
                      }
                    }
                  }
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalCustomFieldNotesSearchResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Search custom field notes for a site",
        "tags" : [ "Custom Field Notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/custom-field-notes/{customFieldNoteId}/attachments/{attachmentId}/download" : {
      "get" : {
        "description" : "Beta — subject to change without notification.\n      Returns one of the note's file attachments. Photo attachments are served by the photo endpoint.\n\n      Answers with a 302 to a short-lived presigned URL, or with the URL as JSON when the request sends exactly\n      `Accept: application/vnd.openspace.signed-url+json`.\n    ",
        "operationId" : "downloadAttachment",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "customFieldNoteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "attachmentId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/vnd.openspace.signed-url+json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSignedUrl"
                }
              }
            },
            "description" : "The presigned URL as JSON, returned when the request sends `Accept: application/vnd.openspace.signed-url+json`"
          },
          "302" : {
            "description" : "Redirect to the presigned URL of the attachment; the response unless JSON was asked for"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "The note is not on this site or is outside the caller's crews, or the attachment is not on the note or is a photo"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Download a custom field note attachment",
        "tags" : [ "Custom Field Notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/custom-field-notes/{customFieldNoteId}/comments" : {
      "get" : {
        "description" : "Beta — subject to change without notification. Lists the note's comments, newest first, each with its author: the OpenSpace account, or for comments synced from Autodesk or Procore the integration user, marked by `author.origin`. `lastSynced` is when the integration's comments were last pulled.",
        "operationId" : "getComments",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "customFieldNoteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "Pull the integration's comments before reading. A no-op for notes without an Autodesk or Procore integration. One round trip to the integration per call.",
          "in" : "query",
          "name" : "refresh",
          "required" : false,
          "schema" : {
            "type" : "boolean"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalCustomFieldNoteCommentsResponse"
                }
              }
            },
            "description" : "OK"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "The note does not exist on this site or is outside the caller's crews"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "503" : {
            "description" : "refresh=true was requested and the integration could not be reached"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get the comments of a custom field note",
        "tags" : [ "Custom Field Notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/custom-field-notes/{customFieldNoteId}/photos/{photoId}/image" : {
      "get" : {
        "description" : "Beta — subject to change without notification.\n      Returns one of the note's photos, photo attachments included.\n\n      Answers with a 302 to a short-lived signed URL, or with the URL as JSON when the request sends exactly\n      `Accept: application/vnd.openspace.signed-url+json`. On sites without a CDN the response body is the photo itself.\n      `size` returns a smaller copy; without it, the original.\n    ",
        "operationId" : "getPhotoImage",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "customFieldNoteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "photoId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "Serve a smaller copy of the photo; omitted serves the original",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "$ref" : "#/components/schemas/ExternalImageSize"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/vnd.openspace.signed-url+json" : {
                "example" : {
                  "url" : "https://cdn.us.openspace.ai/content/...?Policy=...&Signature=...&Key-Pair-Id=..."
                },
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSignedUrl"
                }
              },
              "image/*" : { }
            },
            "description" : "Either the signed URL as JSON, when the request sends `Accept: application/vnd.openspace.signed-url+json`, or the photo itself, on a site without a CDN. Otherwise a 302."
          },
          "302" : {
            "description" : "Redirect to the signed URL of the photo; the response unless JSON was asked for or the site has no CDN"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "The note is not on this site or is outside the caller's crews, or the photo is not on the note or was deleted"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get a custom field note photo",
        "tags" : [ "Custom Field Notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/field-note-statuses" : {
      "get" : {
        "operationId" : "getFieldNoteStatuses",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalFieldNoteStatusesGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all field note statuses by site",
        "tags" : [ "Sites" ]
      }
    },
    "/api/external/v1/sites/{siteId}/field-notes" : {
      "get" : {
        "operationId" : "fieldNotesBySite",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "include",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "assignees", "attachments", "comments", "creators", "sheets", "site", "statuses", "tags", "watchers", "zones" ]
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 100
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "assignee", "assignee,ASC", "assignee,DESC", "closed", "closed,ASC", "closed,DESC", "createdAt", "createdAt,ASC", "createdAt,DESC", "createdBy", "createdBy,ASC", "createdBy,DESC", "description", "description,ASC", "description,DESC", "dueOn", "dueOn,ASC", "dueOn,DESC", "modifiedAt", "modifiedAt,ASC", "modifiedAt,DESC", "originalCreatedAt", "originalCreatedAt,ASC", "originalCreatedAt,DESC", "sheetName", "sheetName,ASC", "sheetName,DESC", "status", "status,ASC", "status,DESC", "tag", "tag,ASC", "tag,DESC", "uid", "uid,ASC", "uid,DESC", "watcher", "watcher,ASC", "watcher,DESC", "zoneName", "zoneName,ASC", "zoneName,DESC" ]
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalFieldNotesGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all field notes by site",
        "tags" : [ "Field notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/field-notes/search" : {
      "post" : {
        "operationId" : "searchFieldNotes",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "include",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "assignees", "attachments", "comments", "creators", "sheets", "site", "statuses", "tags", "watchers", "zones" ]
            }
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 100
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "assignee", "assignee,ASC", "assignee,DESC", "closed", "closed,ASC", "closed,DESC", "createdAt", "createdAt,ASC", "createdAt,DESC", "createdBy", "createdBy,ASC", "createdBy,DESC", "description", "description,ASC", "description,DESC", "dueOn", "dueOn,ASC", "dueOn,DESC", "modifiedAt", "modifiedAt,ASC", "modifiedAt,DESC", "originalCreatedAt", "originalCreatedAt,ASC", "originalCreatedAt,DESC", "sheetName", "sheetName,ASC", "sheetName,DESC", "status", "status,ASC", "status,DESC", "tag", "tag,ASC", "tag,DESC", "uid", "uid,ASC", "uid,DESC", "watcher", "watcher,ASC", "watcher,DESC", "zoneName", "zoneName,ASC", "zoneName,DESC" ]
            }
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalFieldNoteSearch"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalFieldNotesGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Search field notes for a site",
        "tags" : [ "Field notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/field-notes/{fieldNoteId}" : {
      "get" : {
        "operationId" : "fieldNoteById",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "fieldNoteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "include",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "assignees", "attachments", "comments", "creators", "sheets", "site", "statuses", "tags", "watchers", "zones" ]
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalFieldNoteGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get a field note by id",
        "tags" : [ "Field notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/field-notes/{fieldNoteId}/activity-log" : {
      "get" : {
        "operationId" : "activityLogByFieldNoteId",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "fieldNoteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/ExternalActivityLog"
                  }
                }
              }
            },
            "description" : "OK"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all activity log related to a field note",
        "tags" : [ "Field notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/field-notes/{fieldNoteId}/attachment/{attachmentId}/download" : {
      "get" : {
        "operationId" : "downloadFieldNoteAttachment",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "fieldNoteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "attachmentId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "(Optional) The desired image size. small=360px, medium=720px, large=1440px bounding box",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "$ref" : "#/components/schemas/ExternalImageSize"
          }
        }, {
          "in" : "header",
          "name" : "Range",
          "required" : false,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/pdf" : { },
              "application/vnd.openspace.signed-url+json" : { },
              "image/heic" : { },
              "image/heif" : { },
              "image/jfif" : { },
              "image/jpeg" : { },
              "image/png" : { },
              "image/webp" : { },
              "text/plain; charset=utf-8" : { },
              "video/mp4" : { },
              "video/quicktime" : { }
            },
            "description" : "OK"
          },
          "302" : {
            "description" : "Redirect to a location for downloading"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get Field Note Attachment",
        "tags" : [ "Field notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/field-notes/{fieldNoteId}/comments" : {
      "get" : {
        "operationId" : "commentsByFieldNoteId",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "fieldNoteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "withAuthor",
          "required" : false,
          "schema" : {
            "type" : "boolean"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/ExternalFieldNoteComment"
                  }
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all comments related to a field note",
        "tags" : [ "Field notes" ]
      },
      "post" : {
        "operationId" : "addComment",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "fieldNoteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalFieldNoteCommentRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalFieldNoteComment"
                }
              }
            },
            "description" : "OK"
          },
          "201" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalFieldNoteComment"
                }
              }
            },
            "description" : "Created"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Add a comment to a field note",
        "tags" : [ "Field notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/field-notes/{fieldNoteId}/image" : {
      "get" : {
        "operationId" : "downloadFieldNoteImage",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "fieldNoteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "(Optional) The desired image size. small=360px, medium=720px, large=1440px bounding box",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "$ref" : "#/components/schemas/ExternalImageSize"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/vnd.openspace.signed-url+json" : { },
              "image/jpeg" : { }
            },
            "description" : "OK"
          },
          "302" : {
            "description" : "Redirect to a location for downloading"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get Field Note Image",
        "tags" : [ "Field notes" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/executive-view/batches" : {
      "get" : {
        "operationId" : "getExecutiveViewBatches",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalExecutiveViewBatchesGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List ExecutiveView capture batches for a site",
        "tags" : [ "external-executive-view-controller" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/executive-view/chart-progresses/search" : {
      "post" : {
        "operationId" : "searchExecutiveViewChartProgresses",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalExecutiveViewChartProgressesSearchRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalExecutiveViewChartProgressesSearchResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List actual-vs-planned chart progress for an ExecutiveView",
        "tags" : [ "external-executive-view-controller" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/executive-view/subcontractors/search" : {
      "post" : {
        "operationId" : "searchExecutiveViewSubcontractors",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalExecutiveViewSubcontractorsSearchRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalExecutiveViewSubcontractorsSearchResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List subcontractor progress for an ExecutiveView",
        "tags" : [ "external-executive-view-controller" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/executive-view/tasks/search" : {
      "post" : {
        "operationId" : "searchExecutiveViewTasks",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ExternalExecutiveViewTasksSearchRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalExecutiveViewTasksSearchResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List task progress for an ExecutiveView filtered by subcontractor",
        "tags" : [ "external-executive-view-controller" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/executive-view/tree" : {
      "get" : {
        "operationId" : "getExecutiveViewTree",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "Capture batch id whose tree to return",
          "in" : "query",
          "name" : "batchId",
          "required" : true,
          "schema" : {
            "minLength" : 1,
            "type" : "string"
          }
        }, {
          "description" : "Optional phase name to filter the tree to; omit for all phases",
          "in" : "query",
          "name" : "phaseName",
          "required" : false,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalExecutiveViewTreeGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get the ExecutiveView progress tree for a site at a capture batch, optionally filtered to one phase",
        "tags" : [ "external-executive-view-controller" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/floorplans" : {
      "get" : {
        "operationId" : "getFloorplans",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "The construction phase to list floorplans for",
          "in" : "query",
          "name" : "phaseName",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalFloorplansGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List floorplans for a phase",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/floorplans/{floorplanId}/image" : {
      "get" : {
        "operationId" : "getFloorplanImage",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "floorplanId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/vnd.openspace.signed-url+json" : { }
            },
            "description" : "Success"
          },
          "302" : {
            "description" : "Redirect to a temporary download URL that expires shortly after being issued"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Download the floorplan image",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/phases" : {
      "get" : {
        "operationId" : "getPhases",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalPhasesGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List construction phases for a site",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/progress-dates" : {
      "get" : {
        "operationId" : "getProgressDates",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalProgressDatesGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List progress capture dates for a site",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/spaces" : {
      "get" : {
        "operationId" : "getSpaces",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "The construction phase to list spaces for",
          "in" : "query",
          "name" : "phaseName",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSpacesGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List spaces for a phase",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/spaces/{spaceId}/progress/components" : {
      "get" : {
        "operationId" : "getComponentProgress",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "spaceId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Plan to report progress for; defaults to the site's default plan when omitted",
          "in" : "query",
          "name" : "planId",
          "required" : false,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalComponentProgressGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List component progress for a space",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/spaces/{spaceId}/progress/subcontractors" : {
      "get" : {
        "operationId" : "getSubcontractorProgress",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "spaceId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Plan to report progress for; defaults to the site's default plan when omitted",
          "in" : "query",
          "name" : "planId",
          "required" : false,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSubcontractorProgressGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List subcontractor progress for a space",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/spaces/{spaceId}/progress/tasks" : {
      "get" : {
        "operationId" : "getTaskProgress",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "spaceId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Plan to report progress for; defaults to the site's default plan when omitted",
          "in" : "query",
          "name" : "planId",
          "required" : false,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalTaskProgressGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List task progress for a space",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/spaces/{spaceId}/scenes" : {
      "get" : {
        "operationId" : "getScenes",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "spaceId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalScenesGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List scenes for a space",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/spaces/{spaceId}/scenes/{sceneId}/shots" : {
      "get" : {
        "operationId" : "getShots",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "spaceId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "sceneId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalShotsGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List shots for a scene",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/spaces/{spaceId}/scenes/{sceneId}/shots/{shotId}/image" : {
      "get" : {
        "operationId" : "getShotImage",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "spaceId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "sceneId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "shotId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/vnd.openspace.signed-url+json" : { }
            },
            "description" : "Success"
          },
          "302" : {
            "description" : "Redirect to a temporary download URL that expires shortly after being issued"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Download a shot's equirectangular image",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/spaces/{spaceId}/scenes/{sceneId}/spotlights" : {
      "get" : {
        "operationId" : "getSpotlights",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "spaceId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "sceneId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "0-based page index; a negative value is clamped to 0",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "Page size; must be between 1 and 200 — a value outside is rejected with 400",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "maximum" : 200,
            "minimum" : 1,
            "type" : "integer",
            "default" : 50
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSpotlightsGetResponse"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "List spotlights for a scene",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/progress-tracking/spaces/{spaceId}/scenes/{sceneId}/spotlights/{spotlightId}" : {
      "get" : {
        "operationId" : "getSpotlight",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "spaceId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "sceneId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "spotlightId",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSpotlight"
                }
              }
            },
            "description" : "Success"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "404" : {
            "description" : "Not found"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          },
          "500" : {
            "description" : "Internal server error"
          },
          "503" : {
            "description" : "Progress-tracking service unavailable"
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get a spotlight",
        "tags" : [ "Progress Tracking" ]
      }
    },
    "/api/external/v1/sites/{siteId}/sheet/{sheetId}/image" : {
      "get" : {
        "operationId" : "getSheetImage",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "sheetId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/vnd.openspace.signed-url+json" : { },
              "image/jpeg" : { }
            },
            "description" : "OK"
          },
          "302" : {
            "description" : "Redirect to a location for downloading"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Return the master image associated with a sheet",
        "tags" : [ "Images" ]
      }
    },
    "/api/external/v1/sites/{siteId}/sheets" : {
      "get" : {
        "operationId" : "sheetsBySite",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "description" : "Filters sheets created or last updated at or after the given timestamp, if specified",
          "in" : "query",
          "name" : "updatedSince",
          "required" : false,
          "schema" : {
            "type" : "string",
            "description" : "Filters sheets created or last updated at or after the given timestamp, if specified",
            "format" : "date-time"
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 100
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSheetsGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all sheets by site",
        "tags" : [ "Sites" ]
      }
    },
    "/api/external/v1/sites/{siteId}/sheets/{sheetId}" : {
      "get" : {
        "operationId" : "sheetsById",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "sheetId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalSheet"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get sheet by id",
        "tags" : [ "Sites" ]
      }
    },
    "/api/external/v1/sites/{siteId}/sheets/{sheetId}/captures" : {
      "get" : {
        "operationId" : "captures",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "path",
          "name" : "sheetId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }, {
          "in" : "query",
          "name" : "publishedSince",
          "required" : false,
          "schema" : {
            "type" : "string",
            "format" : "date-time"
          }
        }, {
          "description" : "Zero-based page index (0..N)",
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "minimum" : 0,
            "type" : "integer",
            "default" : 0
          }
        }, {
          "description" : "The size of the page to be returned",
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "minimum" : 1,
            "type" : "integer",
            "default" : 100
          }
        }, {
          "description" : "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalCapturesGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all captures by sheet",
        "tags" : [ "Sites" ]
      }
    },
    "/api/external/v1/sites/{siteId}/zones" : {
      "get" : {
        "operationId" : "getZonesBySite",
        "parameters" : [ {
          "in" : "path",
          "name" : "siteId",
          "required" : true,
          "schema" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ExternalZonesGetResponse"
                }
              }
            },
            "description" : "OK"
          },
          "400" : {
            "description" : "Bad request"
          },
          "401" : {
            "description" : "Unauthorized"
          },
          "403" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "required" : [ "error", "message", "redemptionEndpoint", "status" ],
                  "type" : "object",
                  "properties" : {
                    "email" : {
                      "type" : "string",
                      "description" : "Email of the one account the phone is bound to but its owner has not yet claimed; absent for a phone-only invitee or when several accounts hold the phone",
                      "nullable" : true,
                      "example" : "worker@example.com"
                    },
                    "error" : {
                      "type" : "string",
                      "description" : "Error code identifying the specific error type",
                      "example" : "email_capture_required"
                    },
                    "fullName" : {
                      "type" : "string",
                      "description" : "Optional full name from invitation",
                      "nullable" : true,
                      "example" : "James Bond"
                    },
                    "message" : {
                      "type" : "string",
                      "description" : "Human-readable error message",
                      "example" : "Please complete registration by providing your email address"
                    },
                    "redemptionEndpoint" : {
                      "type" : "string",
                      "description" : "Endpoint to complete email capture and finish registration",
                      "example" : "/api/external/v1/auth/redeem-phone-invitation"
                    },
                    "status" : {
                      "type" : "integer",
                      "description" : "HTTP status code",
                      "format" : "int32",
                      "example" : 403
                    }
                  }
                }
              }
            },
            "description" : "Forbidden: Partial authentication - email capture required"
          },
          "429" : {
            "content" : {
              "application/problem+json" : {
                "schema" : {
                  "type" : "object",
                  "properties" : {
                    "detail" : {
                      "type" : "string"
                    },
                    "instance" : {
                      "type" : "string",
                      "format" : "uri"
                    },
                    "status" : {
                      "type" : "integer",
                      "format" : "int32",
                      "example" : 429
                    },
                    "title" : {
                      "type" : "string"
                    },
                    "type" : {
                      "type" : "string",
                      "format" : "uri"
                    }
                  }
                }
              }
            },
            "description" : "Rate limit exceeded. Honor the `Retry-After` header before retrying.",
            "headers" : {
              "RateLimit" : {
                "description" : "Current status for whichever policy is closest to exhaustion. Format: `\"<policy>\";r=<available>;t=<window-sec>;os-cost=<tokens-consumed>`",
                "schema" : {
                  "type" : "string"
                }
              },
              "RateLimit-Policy" : {
                "description" : "Active rate-limit policies. Format: `\"<policy>\";q=<quota>;w=<window-sec>, ...`",
                "schema" : {
                  "type" : "string"
                }
              },
              "Retry-After" : {
                "description" : "Seconds to wait before retrying. Always >= 1.",
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "security" : [ {
          "api-key" : [ ]
        } ],
        "summary" : "Get all zones by site",
        "tags" : [ "Sites" ]
      }
    }
  },
  "components" : {
    "schemas" : {
      "Account" : {
        "required" : [ "editorOnboarded", "email", "hasPhoto", "id", "siteAdminOnboarded" ],
        "type" : "object",
        "properties" : {
          "agreedToTerms" : {
            "type" : "boolean"
          },
          "companyName" : {
            "type" : "string"
          },
          "companyType" : {
            "type" : "string"
          },
          "country" : {
            "type" : "string"
          },
          "editorOnboarded" : {
            "type" : "boolean"
          },
          "email" : {
            "type" : "string"
          },
          "fullName" : {
            "type" : "string"
          },
          "hasPhoto" : {
            "type" : "boolean"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "jobTitle" : {
            "type" : "string"
          },
          "language" : {
            "$ref" : "#/components/schemas/Language"
          },
          "lastLoginAt" : {
            "type" : "string",
            "format" : "date-time"
          },
          "photoVersion" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "siteAdminOnboarded" : {
            "type" : "boolean"
          },
          "type" : {
            "$ref" : "#/components/schemas/AccountType"
          }
        },
        "description" : "The author information"
      },
      "AccountType" : {
        "type" : "string",
        "enum" : [ "user", "admin", "public", "bot" ]
      },
      "ActivityAction" : {
        "type" : "string",
        "description" : "The action",
        "enum" : [ "create", "update", "delete" ]
      },
      "CapturePublishedPayload" : {
        "required" : [ "captureId", "captureType", "eventType", "siteId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "captureId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "captureType" : {
              "$ref" : "#/components/schemas/CaptureType"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "CaptureType" : {
        "type" : "string",
        "enum" : [ "manual", "passive", "lidar", "voice", "drone" ]
      },
      "CollabAppPhoneCountry" : {
        "type" : "string",
        "enum" : [ "AS", "BE", "CA", "CH", "CL", "DE", "ES", "FR", "GB", "GH", "GU", "HU", "IE", "JP", "LU", "MP", "MX", "NL", "NZ", "PL", "PR", "PT", "US", "VI" ]
      },
      "CollectionSearchType" : {
        "type" : "string",
        "enum" : [ "and", "or", "only" ]
      },
      "CustomFieldNoteFieldRole" : {
        "type" : "string",
        "description" : "A semantic role a template assigns to one of its properties through x-field-roles.",
        "enum" : [ "title", "description", "status", "assignee", "dueDate" ]
      },
      "CustomFieldNoteValueFilter" : {
        "type" : "object",
        "properties" : {
          "and" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/CustomFieldNoteValueFilterCondition"
            }
          },
          "fieldRole" : {
            "$ref" : "#/components/schemas/CustomFieldNoteFieldRole"
          },
          "operator" : {
            "$ref" : "#/components/schemas/CustomFieldNoteValueFilterOperator"
          },
          "or" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/CustomFieldNoteValueFilterCondition"
            }
          },
          "propertyKey" : {
            "type" : "string",
            "description" : "The property to filter, by its key. Mutually exclusive with fieldRole."
          },
          "value" : {
            "$ref" : "#/components/schemas/JsonNode"
          }
        },
        "description" : "A value filter on one template property, addressed by propertyKey or by fieldRole. Exactly one of the two must be set; a filter naming both or neither is rejected with 400."
      },
      "CustomFieldNoteValueFilterCombinator" : {
        "type" : "string",
        "description" : "How valueFilters combine: and (default) or or",
        "enum" : [ "and", "or" ]
      },
      "CustomFieldNoteValueFilterCondition" : {
        "required" : [ "operator" ],
        "type" : "object",
        "properties" : {
          "operator" : {
            "$ref" : "#/components/schemas/CustomFieldNoteValueFilterOperator"
          },
          "value" : {
            "$ref" : "#/components/schemas/JsonNode"
          }
        }
      },
      "CustomFieldNoteValueFilterOperator" : {
        "type" : "string",
        "enum" : [ "eq", "neq", "in", "notIn", "contains", "notContains", "containsAny", "notContainsAny", "containsAll", "notContainsAll", "refContains", "refNotContains", "gte", "lte", "between", "isNull", "isNotNull" ]
      },
      "DroneCaptureStatus" : {
        "type" : "string",
        "description" : "The status of the Drone Capture.",
        "enum" : [ "incomplete", "ready", "processing", "alignmentReprocessing", "skipped", "succeeded", "failed" ]
      },
      "DroneImageType" : {
        "type" : "string",
        "description" : "The type of the drone image.",
        "enum" : [ "orthomosaic", "freeFlight", "pano" ]
      },
      "ExternalAccount" : {
        "required" : [ "email", "id", "language" ],
        "type" : "object",
        "properties" : {
          "email" : {
            "type" : "string",
            "description" : "The email"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the account"
          },
          "language" : {
            "$ref" : "#/components/schemas/Language"
          },
          "name" : {
            "type" : "string",
            "description" : "The full name of the account holder"
          }
        },
        "description" : "Account information"
      },
      "ExternalActivityEntity" : {
        "type" : "string",
        "description" : "The entity",
        "enum" : [ "fieldNote", "fieldNoteAttachment", "fieldNoteComment", "fieldNoteMarkup", "fieldNoteTag", "fieldNoteWatch", "fieldNoteCustomFieldValue" ]
      },
      "ExternalActivityLog" : {
        "required" : [ "action", "entity", "entityId", "id", "updatedAt" ],
        "type" : "object",
        "properties" : {
          "action" : {
            "$ref" : "#/components/schemas/ActivityAction"
          },
          "entity" : {
            "$ref" : "#/components/schemas/ExternalActivityEntity"
          },
          "entityId" : {
            "type" : "string",
            "description" : "The entity ID"
          },
          "field" : {
            "type" : "string",
            "description" : "The field"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The log ID"
          },
          "newValue" : {
            "type" : "string",
            "description" : "The new value"
          },
          "oldValue" : {
            "type" : "string",
            "description" : "The old vlaue"
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "When the the log was updated",
            "format" : "date-time"
          },
          "updatedBy" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The updated user who updated it"
          }
        },
        "description" : "Activity log"
      },
      "ExternalActivityStatModel" : {
        "required" : [ "count" ],
        "type" : "object",
        "properties" : {
          "count" : {
            "type" : "integer",
            "format" : "int32"
          },
          "last" : {
            "type" : "string",
            "format" : "date-time"
          }
        }
      },
      "ExternalCapture" : {
        "required" : [ "id", "siteId", "startedAt", "stoppedAt" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the capture"
          },
          "name" : {
            "type" : "string",
            "description" : "The name of the capture"
          },
          "publishedAt" : {
            "type" : "string",
            "description" : "The published time of the capture",
            "format" : "date-time"
          },
          "sheetId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The sheet related"
          },
          "siteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The site related"
          },
          "startedAt" : {
            "type" : "string",
            "description" : "The start time of the capture",
            "format" : "date-time"
          },
          "stoppedAt" : {
            "type" : "string",
            "description" : "The stop time of the capture",
            "format" : "date-time"
          },
          "type" : {
            "$ref" : "#/components/schemas/ExternalCaptureType"
          }
        }
      },
      "ExternalCaptureBatch" : {
        "required" : [ "capturedAt", "id", "weekNumber" ],
        "type" : "object",
        "properties" : {
          "capturedAt" : {
            "type" : "string",
            "description" : "When the batch was captured; an ISO-8601 UTC timestamp",
            "format" : "date-time"
          },
          "id" : {
            "type" : "string",
            "description" : "The batch id"
          },
          "weekNumber" : {
            "type" : "integer",
            "description" : "The 1-based week number of the batch, counted from the project start date",
            "format" : "int32"
          }
        },
        "description" : "A capture batch"
      },
      "ExternalCaptureGetIncludes" : {
        "type" : "object",
        "properties" : {
          "sheet" : {
            "$ref" : "#/components/schemas/ExternalSheet"
          },
          "site" : {
            "$ref" : "#/components/schemas/ExternalSite"
          }
        }
      },
      "ExternalCaptureGetResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "$ref" : "#/components/schemas/ExternalCapture"
          },
          "includes" : {
            "$ref" : "#/components/schemas/ExternalCaptureGetIncludes"
          }
        }
      },
      "ExternalCaptureIncludes" : {
        "required" : [ "sheets" ],
        "type" : "object",
        "properties" : {
          "sheets" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSheet"
            }
          },
          "site" : {
            "$ref" : "#/components/schemas/ExternalSite"
          }
        }
      },
      "ExternalCaptureType" : {
        "type" : "string",
        "description" : "The capture type",
        "enum" : [ "PHOTO", "VIDEO", "LIDAR" ]
      },
      "ExternalCapturesGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalCapture"
            }
          },
          "includes" : {
            "$ref" : "#/components/schemas/ExternalCaptureIncludes"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        }
      },
      "ExternalCommentOrigin" : {
        "type" : "string",
        "description" : "Where the comment was written: in OpenSpace, or in the integration the note is linked to",
        "enum" : [ "openspace", "autodesk", "procore" ]
      },
      "ExternalComponentProgress" : {
        "required" : [ "component", "history" ],
        "type" : "object",
        "properties" : {
          "component" : {
            "$ref" : "#/components/schemas/ExternalProgressComponent"
          },
          "history" : {
            "type" : "array",
            "description" : "Per-batch progress history, as returned by progress tracking",
            "items" : {
              "$ref" : "#/components/schemas/ExternalProgressHistoryEntry"
            }
          }
        },
        "description" : "Progress history for a single component within a space"
      },
      "ExternalComponentProgressGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalComponentProgress"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Paginated list of component progress for a space. The returned `page` metadata reflects what the downstream actually served; `page.size` may be smaller than requested if the downstream clamps the page size."
      },
      "ExternalCustomFieldNote" : {
        "required" : [ "closed", "createdAt", "fields", "id", "labelsResolved", "siteId", "templateId", "templateVersionId", "uniqueKey", "updatedAt" ],
        "type" : "object",
        "properties" : {
          "closed" : {
            "type" : "boolean"
          },
          "createdAt" : {
            "type" : "string",
            "format" : "date-time"
          },
          "creatorId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "fields" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/ExternalCustomFieldNoteFieldValue"
            },
            "description" : "One entry per stored field, keyed by schema property. `value` is the stored answer in the shape the template version schema validates. `labels` is present only for code values (vendor ids, select options) and maps each code of the value that resolved to its display text: a missing code is unresolved, an empty map means nothing resolved, and the note's `labelsResolved` is false whenever a code is missing.",
            "example" : {
              "assignedTo" : {
                "labels" : { },
                "value" : "gone-1"
              },
              "dueDate" : {
                "value" : null
              },
              "status" : {
                "labels" : {
                  "in_review" : "In Review"
                },
                "value" : "in_review"
              },
              "title" : {
                "value" : "Conduit clash"
              },
              "watchers" : {
                "labels" : {
                  "oxygen-1" : "Tony Martinez"
                },
                "value" : [ "oxygen-1", "gone-2" ]
              }
            }
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "integrationType" : {
            "$ref" : "#/components/schemas/ExternalCustomFieldNoteIntegrationType"
          },
          "labelsResolved" : {
            "type" : "boolean",
            "description" : "False when at least one code value has no label, e.g. the vendor vocabulary is unknown or an id is no longer in it"
          },
          "sheetId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The sheet the note is placed on; null when the note has no sheet marker"
          },
          "sheetPosition" : {
            "$ref" : "#/components/schemas/Vec3"
          },
          "siteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "templateId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "templateVersionId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The exact template version the values validate against; fetch or cache its schema by this id"
          },
          "uniqueKey" : {
            "type" : "string",
            "description" : "Per-site sequence number, unique within the site"
          },
          "updatedAt" : {
            "type" : "string",
            "format" : "date-time"
          }
        },
        "description" : "A custom field note. Only real note columns are top-level; every template field lives in `fields`."
      },
      "ExternalCustomFieldNoteAttachment" : {
        "required" : [ "contentType", "createdAt", "customFieldNoteId", "fileName", "id", "kind" ],
        "type" : "object",
        "properties" : {
          "contentType" : {
            "type" : "string"
          },
          "createdAt" : {
            "type" : "string",
            "format" : "date-time"
          },
          "customFieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "fileName" : {
            "type" : "string"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "kind" : {
            "$ref" : "#/components/schemas/ExternalCustomFieldNoteAttachmentKind"
          }
        }
      },
      "ExternalCustomFieldNoteAttachmentKind" : {
        "type" : "string",
        "enum" : [ "photo", "file" ]
      },
      "ExternalCustomFieldNoteComment" : {
        "required" : [ "comment", "createdAt", "customFieldNoteId", "id" ],
        "type" : "object",
        "properties" : {
          "author" : {
            "$ref" : "#/components/schemas/ExternalCustomFieldNoteCommentAuthor"
          },
          "comment" : {
            "type" : "string"
          },
          "createdAt" : {
            "type" : "string",
            "format" : "date-time"
          },
          "customFieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "editedAt" : {
            "type" : "string",
            "description" : "When the comment was last edited; null when never edited",
            "format" : "date-time"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        },
        "description" : "A comment on a custom field note"
      },
      "ExternalCustomFieldNoteCommentAuthor" : {
        "required" : [ "origin" ],
        "type" : "object",
        "properties" : {
          "name" : {
            "type" : "string"
          },
          "origin" : {
            "$ref" : "#/components/schemas/ExternalCommentOrigin"
          }
        },
        "description" : "Who wrote the comment: an OpenSpace account, or a user of the integration the note is linked to",
        "discriminator" : {
          "mapping" : {
            "autodesk" : "#/components/schemas/ExternalIntegrationCommentAuthor",
            "openspace" : "#/components/schemas/ExternalOpenSpaceCommentAuthor",
            "procore" : "#/components/schemas/ExternalIntegrationCommentAuthor"
          },
          "propertyName" : "origin"
        },
        "oneOf" : [ {
          "$ref" : "#/components/schemas/ExternalOpenSpaceCommentAuthor"
        }, {
          "$ref" : "#/components/schemas/ExternalIntegrationCommentAuthor"
        } ]
      },
      "ExternalCustomFieldNoteCommentCount" : {
        "required" : [ "count", "customFieldNoteId" ],
        "type" : "object",
        "properties" : {
          "count" : {
            "type" : "integer",
            "format" : "int32"
          },
          "customFieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }
      },
      "ExternalCustomFieldNoteCommentsResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalCustomFieldNoteComment"
            }
          },
          "lastSynced" : {
            "type" : "string",
            "description" : "When the integration's comments were last pulled; null for notes without an Autodesk or Procore integration, or whose comments were never pulled",
            "format" : "date-time"
          }
        },
        "description" : "The comments of a custom field note, newest first"
      },
      "ExternalCustomFieldNoteFieldValue" : {
        "type" : "object",
        "properties" : {
          "labels" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "string",
              "description" : "Present only for code values (vendor ids, select options): each code of the value that resolved, keyed by the code as a string, mapped to its display text. A missing code is unresolved; an empty map means nothing resolved."
            },
            "description" : "Present only for code values (vendor ids, select options): each code of the value that resolved, keyed by the code as a string, mapped to its display text. A missing code is unresolved; an empty map means nothing resolved."
          },
          "value" : {
            "$ref" : "#/components/schemas/JsonNode"
          }
        },
        "description" : "One stored field of a note",
        "example" : {
          "title" : {
            "value" : "Conduit clash"
          },
          "dueDate" : {
            "value" : null
          },
          "status" : {
            "value" : "in_review",
            "labels" : {
              "in_review" : "In Review"
            }
          },
          "assignedTo" : {
            "value" : "gone-1",
            "labels" : { }
          },
          "watchers" : {
            "value" : [ "oxygen-1", "gone-2" ],
            "labels" : {
              "oxygen-1" : "Tony Martinez"
            }
          }
        }
      },
      "ExternalCustomFieldNoteIncludes" : {
        "required" : [ "attachments", "commentCounts", "creators", "customFieldNoteTemplateVersions", "customFieldNoteTemplates", "photos", "sheets", "zones" ],
        "type" : "object",
        "properties" : {
          "attachments" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalCustomFieldNoteAttachment"
            }
          },
          "commentCounts" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalCustomFieldNoteCommentCount"
            }
          },
          "creators" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalAccount"
            }
          },
          "customFieldNoteTemplateVersions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalCustomFieldNoteTemplateVersion"
            }
          },
          "customFieldNoteTemplates" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalCustomFieldNoteTemplate"
            }
          },
          "photos" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalCustomFieldNotePhoto"
            }
          },
          "sheets" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSheet"
            }
          },
          "zones" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalCustomFieldNoteZone"
            }
          }
        }
      },
      "ExternalCustomFieldNoteIntegrationType" : {
        "type" : "string",
        "description" : "The vendor record type a custom field note mirrors. Null for a site's own templates.",
        "enum" : [ "accIssue", "procoreObservation", "procorePunchItem" ]
      },
      "ExternalCustomFieldNotePhoto" : {
        "required" : [ "customFieldNoteId", "id", "primary" ],
        "type" : "object",
        "properties" : {
          "customFieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "primary" : {
            "type" : "boolean"
          }
        }
      },
      "ExternalCustomFieldNoteSearch" : {
        "type" : "object",
        "properties" : {
          "closed" : {
            "type" : "boolean",
            "description" : "Omitted: open and closed notes. true: closed only. false: open only."
          },
          "collabGroupIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "description" : "Filter by crew. Worklist callers: intersected with the caller's own crews, empty means all of them. API keys: a plain filter, and an empty list matches nothing.",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "createdAfter" : {
            "type" : "string",
            "format" : "date-time"
          },
          "createdBefore" : {
            "type" : "string",
            "format" : "date-time"
          },
          "creatorIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "description" : "Notes created by these accounts",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "includeIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "description" : "Only these notes, e.g. a batch fetch after a webhook or a single note for a detail view",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "integrationType" : {
            "$ref" : "#/components/schemas/ExternalCustomFieldNoteIntegrationType"
          },
          "query" : {
            "type" : "string",
            "description" : "Free text over the title field, sheet name, creator email and display key"
          },
          "sheetIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "description" : "Notes placed on these sheets",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "templateIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "description" : "Notes whose template version belongs to one of these templates",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "valueFilterCombinator" : {
            "$ref" : "#/components/schemas/CustomFieldNoteValueFilterCombinator"
          },
          "valueFilters" : {
            "type" : "array",
            "description" : "Filters on template properties; requires templateIds or integrationType. A filter names its property by propertyKey (the property must be marked x-filterable) or by fieldRole (title, description, status, assignee, dueDate), which resolves per note to the property its template version assigns that role; notes whose version lacks the role are excluded by positive operators and isNotNull and included by negated operators and isNull. A filter is {propertyKey|fieldRole, operator, value} or {propertyKey|fieldRole, or|and: [{operator, value}]}. Operators by property type: strings eq, neq, in, notIn, contains, notContains; enums eq, neq, in, notIn; numbers and dates eq, neq, gte, lte, between (two inclusive bounds); booleans eq, neq; arrays eq, neq, contains, notContains, containsAny, notContainsAny, containsAll, notContainsAll; vendor references also refContains, refNotContains on the referenced record's name; every type isNull, isNotNull. A 400 lists the allowed operators when one does not fit.",
            "items" : {
              "$ref" : "#/components/schemas/CustomFieldNoteValueFilter"
            }
          },
          "zoneIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "description" : "Notes whose position lies inside one of these zones",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        },
        "description" : "Search criteria. Every field is optional; an empty body returns every note the caller may see."
      },
      "ExternalCustomFieldNoteTemplate" : {
        "required" : [ "id", "name" ],
        "type" : "object",
        "properties" : {
          "archived" : {
            "type" : "string",
            "description" : "Set while the template is archived; read-only but still renders",
            "format" : "date-time"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "integrationType" : {
            "$ref" : "#/components/schemas/ExternalCustomFieldNoteIntegrationType"
          },
          "name" : {
            "type" : "string"
          },
          "uniqueKeyPrefix" : {
            "type" : "string"
          }
        }
      },
      "ExternalCustomFieldNoteTemplateVersion" : {
        "required" : [ "id", "schema", "templateId" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "schema" : {
            "$ref" : "#/components/schemas/JsonNode"
          },
          "templateId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }
      },
      "ExternalCustomFieldNoteZone" : {
        "required" : [ "customFieldNoteId", "id", "name", "sheetId" ],
        "type" : "object",
        "properties" : {
          "customFieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "name" : {
            "type" : "string"
          },
          "sheetId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        },
        "description" : "A zone whose area contains the note's position; one row per note and zone"
      },
      "ExternalCustomFieldNotesSearchResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalCustomFieldNote"
            }
          },
          "includes" : {
            "$ref" : "#/components/schemas/ExternalCustomFieldNoteIncludes"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        }
      },
      "ExternalExecutiveViewBatch" : {
        "required" : [ "capturedAt", "id", "kind", "weekNumber" ],
        "type" : "object",
        "properties" : {
          "capturedAt" : {
            "type" : "string",
            "description" : "When the capture batch was taken; an ISO-8601 UTC timestamp",
            "format" : "date-time"
          },
          "id" : {
            "type" : "string",
            "description" : "The capture batch id"
          },
          "kind" : {
            "type" : "string",
            "description" : "The batch source: 'actual' for a realized capture, 'planned' for a scheduled one. New kinds may appear over time; treat unrecognized values as opaque."
          },
          "weekNumber" : {
            "type" : "integer",
            "description" : "The 1-based week number of the capture batch, counted from the project start date",
            "format" : "int32"
          }
        },
        "description" : "An ExecutiveView capture batch for a site"
      },
      "ExternalExecutiveViewBatchesGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalExecutiveViewBatch"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Paginated list of ExecutiveView capture batches for a site, newest first. Unlike `/progress-tracking/progress-dates`, which lists only realized capture batches, this merges actual and planned batches (see `kind`). The downstream serves the full timeline; `page` describes the requested slice over that result set. Only the requested slice is validated, so a malformed record fails just the pages containing it and `page.itemCount` counts every row, including ones a later page may fail to serve."
      },
      "ExternalExecutiveViewChartProgressesSearchRequest" : {
        "required" : [ "spaceIds" ],
        "type" : "object",
        "properties" : {
          "spaceIds" : {
            "minItems" : 1,
            "type" : "array",
            "description" : "Space ids to report chart progress for; each must be a UUID",
            "items" : {
              "pattern" : "[0-9a-fA-F]{4}(?:[0-9a-fA-F]{4}-){4}[0-9a-fA-F]{12}",
              "type" : "string"
            }
          }
        },
        "description" : "Request body for ExecutiveView chart progress"
      },
      "ExternalExecutiveViewChartProgressesSearchResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalExecutiveViewProgressPoint"
            }
          }
        },
        "description" : "ExecutiveView chart progress time series for a site, oldest first"
      },
      "ExternalExecutiveViewNodeProgress" : {
        "type" : "object",
        "properties" : {
          "actual" : {
            "type" : "number",
            "description" : "Actual progress as a percentage (0-100), if recorded",
            "format" : "double",
            "nullable" : true
          },
          "planned" : {
            "type" : "number",
            "description" : "Planned progress as a percentage (0-100), if recorded",
            "format" : "double",
            "nullable" : true
          },
          "status" : {
            "type" : "string",
            "description" : "Progress status, if recorded",
            "nullable" : true
          }
        },
        "description" : "Actual vs planned progress for an ExecutiveView node"
      },
      "ExternalExecutiveViewProgressPoint" : {
        "required" : [ "capturedAt" ],
        "type" : "object",
        "properties" : {
          "actual" : {
            "type" : "number",
            "description" : "Actual progress as a percentage (0-100), if recorded",
            "format" : "double",
            "nullable" : true
          },
          "batchId" : {
            "type" : "string",
            "description" : "The capture batch id, if recorded",
            "nullable" : true
          },
          "capturedAt" : {
            "type" : "string",
            "description" : "When the capture batch was taken; an ISO-8601 UTC timestamp",
            "format" : "date-time"
          },
          "planned" : {
            "type" : "number",
            "description" : "Planned progress as a percentage (0-100), if recorded",
            "format" : "double",
            "nullable" : true
          }
        },
        "description" : "Actual vs planned progress recorded for a single capture batch"
      },
      "ExternalExecutiveViewSubcontractor" : {
        "required" : [ "history", "schedules", "subcontractor" ],
        "type" : "object",
        "properties" : {
          "history" : {
            "type" : "array",
            "description" : "Actual vs planned progress history, oldest first",
            "items" : {
              "$ref" : "#/components/schemas/ExternalExecutiveViewProgressPoint"
            }
          },
          "schedules" : {
            "$ref" : "#/components/schemas/ExternalExecutiveViewSubcontractorSchedules"
          },
          "subcontractor" : {
            "$ref" : "#/components/schemas/ExternalProgressSubcontractor"
          }
        },
        "description" : "Subcontractor progress for an ExecutiveView"
      },
      "ExternalExecutiveViewSubcontractorSchedules" : {
        "type" : "object",
        "properties" : {
          "endOn" : {
            "type" : "string",
            "description" : "Planned end date, as provided by the downstream (format not enforced)",
            "nullable" : true
          },
          "startOn" : {
            "type" : "string",
            "description" : "Planned start date, as provided by the downstream (format not enforced)",
            "nullable" : true
          }
        },
        "description" : "Planned schedule for a subcontractor"
      },
      "ExternalExecutiveViewSubcontractorsSearchRequest" : {
        "required" : [ "spaceIds" ],
        "type" : "object",
        "properties" : {
          "spaceIds" : {
            "minItems" : 1,
            "type" : "array",
            "description" : "Space ids to report subcontractor progress for; each must be a UUID",
            "items" : {
              "pattern" : "[0-9a-fA-F]{4}(?:[0-9a-fA-F]{4}-){4}[0-9a-fA-F]{12}",
              "type" : "string"
            }
          }
        },
        "description" : "Request body for ExecutiveView subcontractor progress"
      },
      "ExternalExecutiveViewSubcontractorsSearchResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalExecutiveViewSubcontractor"
            }
          }
        },
        "description" : "ExecutiveView subcontractor progress for a site"
      },
      "ExternalExecutiveViewTask" : {
        "required" : [ "history", "schedules", "task" ],
        "type" : "object",
        "properties" : {
          "history" : {
            "type" : "array",
            "description" : "Actual vs planned progress history, oldest first",
            "items" : {
              "$ref" : "#/components/schemas/ExternalExecutiveViewProgressPoint"
            }
          },
          "schedules" : {
            "$ref" : "#/components/schemas/ExternalExecutiveViewTaskSchedules"
          },
          "task" : {
            "$ref" : "#/components/schemas/ExternalExecutiveViewTaskInfo"
          }
        },
        "description" : "Task progress for an ExecutiveView"
      },
      "ExternalExecutiveViewTaskInfo" : {
        "required" : [ "id", "name" ],
        "type" : "object",
        "properties" : {
          "displayIndex" : {
            "type" : "integer",
            "description" : "The task display index, if provided",
            "format" : "int32",
            "nullable" : true
          },
          "id" : {
            "type" : "string",
            "description" : "The task id"
          },
          "name" : {
            "type" : "string",
            "description" : "The task name"
          }
        },
        "description" : "A task"
      },
      "ExternalExecutiveViewTaskSchedules" : {
        "type" : "object",
        "properties" : {
          "endOn" : {
            "type" : "string",
            "description" : "Planned end date, as provided by the downstream (format not enforced)",
            "nullable" : true
          },
          "startOn" : {
            "type" : "string",
            "description" : "Planned start date, as provided by the downstream (format not enforced)",
            "nullable" : true
          }
        },
        "description" : "Planned schedule for a task"
      },
      "ExternalExecutiveViewTasksSearchRequest" : {
        "required" : [ "spaceIds", "subcontractorId" ],
        "type" : "object",
        "properties" : {
          "spaceIds" : {
            "minItems" : 1,
            "type" : "array",
            "description" : "Space ids to report task progress for; each must be a UUID",
            "items" : {
              "pattern" : "[0-9a-fA-F]{4}(?:[0-9a-fA-F]{4}-){4}[0-9a-fA-F]{12}",
              "type" : "string"
            }
          },
          "subcontractorId" : {
            "minLength" : 1,
            "pattern" : "[0-9a-fA-F]{4}(?:[0-9a-fA-F]{4}-){4}[0-9a-fA-F]{12}",
            "type" : "string",
            "description" : "Subcontractor id to filter tasks by; must be a UUID"
          }
        },
        "description" : "Request body for ExecutiveView task progress"
      },
      "ExternalExecutiveViewTasksSearchResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalExecutiveViewTask"
            }
          }
        },
        "description" : "ExecutiveView task progress for a site"
      },
      "ExternalExecutiveViewTreeGetResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalExecutiveViewTreeNode"
            }
          }
        },
        "description" : "ExecutiveView progress tree for a site at a capture batch"
      },
      "ExternalExecutiveViewTreeNode" : {
        "required" : [ "children", "id", "leafSpaces", "level", "name", "progress", "spaces", "tags" ],
        "type" : "object",
        "properties" : {
          "children" : {
            "type" : "array",
            "description" : "Child nodes",
            "items" : {
              "$ref" : "#/components/schemas/ExternalExecutiveViewTreeNode"
            }
          },
          "displayIndex" : {
            "type" : "integer",
            "description" : "Display ordering index, if set",
            "format" : "int32",
            "nullable" : true
          },
          "id" : {
            "type" : "string",
            "description" : "The node id"
          },
          "leafSpaces" : {
            "type" : "array",
            "description" : "Leaf space ids under this node",
            "items" : {
              "type" : "string"
            }
          },
          "level" : {
            "type" : "string",
            "description" : "The hierarchy level of this node"
          },
          "name" : {
            "type" : "string",
            "description" : "The node name"
          },
          "progress" : {
            "$ref" : "#/components/schemas/ExternalExecutiveViewNodeProgress"
          },
          "spaces" : {
            "type" : "array",
            "description" : "Space ids grouped under this node",
            "items" : {
              "type" : "string"
            }
          },
          "tags" : {
            "type" : "array",
            "description" : "Tags applied to the node",
            "items" : {
              "type" : "string"
            }
          }
        },
        "description" : "A node in the ExecutiveView progress hierarchy; nests to arbitrary depth via `children`"
      },
      "ExternalFieldNote" : {
        "required" : [ "closed", "createdAt", "id", "siteId", "uniqueKey", "updatedAt" ],
        "type" : "object",
        "properties" : {
          "assigneeId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The assignee ID"
          },
          "captureId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The capture ID"
          },
          "closed" : {
            "type" : "boolean",
            "description" : "Whether the field note is closed"
          },
          "collabGroupId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The collab group ID"
          },
          "collabGroupName" : {
            "type" : "string",
            "description" : "The name of the collab group (crew) this field note is assigned to, if any"
          },
          "createdAt" : {
            "type" : "string",
            "description" : "When the field note was created",
            "format" : "date-time"
          },
          "creatorId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The account ID of the user that created this field note"
          },
          "customFields" : {
            "type" : "array",
            "description" : "The custom fields applied to this field note",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFieldNoteCustomField"
            }
          },
          "description" : {
            "type" : "string",
            "description" : "Description"
          },
          "dueOn" : {
            "type" : "string",
            "description" : "The due date",
            "format" : "date"
          },
          "geoPosition" : {
            "$ref" : "#/components/schemas/GeoPoint"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the note"
          },
          "markerOffset" : {
            "$ref" : "#/components/schemas/Vec3"
          },
          "masterPosition" : {
            "$ref" : "#/components/schemas/Vec3"
          },
          "panoId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The pano ID"
          },
          "positionType" : {
            "$ref" : "#/components/schemas/PositionType"
          },
          "sheetId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The sheet ID"
          },
          "sheetPosition" : {
            "$ref" : "#/components/schemas/Vec3"
          },
          "siteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The site ID"
          },
          "status" : {
            "type" : "string",
            "description" : "Human-readable status title, localized to the caller account's preferred language for system-default statuses (e.g. \"Open\", \"Contested\"); customer-defined titles are returned verbatim. Intended for display only — use `statusKey` to drive business logic. Not affected by the Accept-Language request header."
          },
          "statusId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The status ID"
          },
          "statusKey" : {
            "type" : "string",
            "description" : "Stable status key. For system-default statuses this is the English literal (\"Open\", \"Contested\", \"Closed\", ...); for customer-defined statuses it is the customer's title verbatim. Use this field as the stable identifier when driving business logic — `status` may vary by caller locale."
          },
          "uniqueKey" : {
            "type" : "string",
            "description" : "The unique key"
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "When the field note was updated",
            "format" : "date-time"
          }
        },
        "description" : "Field note information"
      },
      "ExternalFieldNoteAttachment" : {
        "required" : [ "createdAt", "fieldNoteId", "filename", "id", "mime", "size" ],
        "type" : "object",
        "properties" : {
          "createdAt" : {
            "type" : "string",
            "description" : "When the field note attachment was created",
            "format" : "date-time"
          },
          "creatorId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The creator ID"
          },
          "fieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The field note ID"
          },
          "filename" : {
            "type" : "string",
            "description" : "The attachment filename"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the note attachment"
          },
          "mime" : {
            "type" : "string",
            "description" : "The attachment mime"
          },
          "size" : {
            "type" : "integer",
            "description" : "The attachment size",
            "format" : "int64"
          },
          "url" : {
            "type" : "string",
            "description" : "The attachment url"
          }
        }
      },
      "ExternalFieldNoteComment" : {
        "required" : [ "comment", "createdAt", "fieldNoteId", "id" ],
        "type" : "object",
        "properties" : {
          "author" : {
            "$ref" : "#/components/schemas/Account"
          },
          "authorId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The author ID"
          },
          "comment" : {
            "type" : "string",
            "description" : "The comment"
          },
          "createdAt" : {
            "type" : "string",
            "description" : "When the field note comment was created",
            "format" : "date-time"
          },
          "editedAt" : {
            "type" : "string",
            "description" : "When the field note comment was edited",
            "format" : "date-time"
          },
          "fieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The field note ID"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The comment ID"
          }
        },
        "description" : "Field note comment"
      },
      "ExternalFieldNoteCommentRequest" : {
        "required" : [ "comment" ],
        "type" : "object",
        "properties" : {
          "comment" : {
            "maxLength" : 8192,
            "minLength" : 0,
            "type" : "string"
          }
        }
      },
      "ExternalFieldNoteCustomField" : {
        "required" : [ "fieldType", "id", "name", "required" ],
        "type" : "object",
        "properties" : {
          "createdAt" : {
            "type" : "string",
            "description" : "When the field note custom field was created",
            "format" : "date-time"
          },
          "fieldType" : {
            "type" : "string",
            "description" : "The custom field type"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the custom field"
          },
          "name" : {
            "type" : "string",
            "description" : "The custom field name"
          },
          "required" : {
            "type" : "boolean",
            "description" : "If the custom field is required"
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "When the field note custom field was updated",
            "format" : "date-time"
          },
          "value" : {
            "type" : "string",
            "description" : "The custom field value"
          }
        },
        "description" : "The custom fields applied to this field note"
      },
      "ExternalFieldNoteGetResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "associations" : {
            "$ref" : "#/components/schemas/FieldNoteAssociations"
          },
          "content" : {
            "$ref" : "#/components/schemas/ExternalFieldNote"
          },
          "includes" : {
            "$ref" : "#/components/schemas/ExternalFieldNoteIncludes"
          }
        }
      },
      "ExternalFieldNoteIncludes" : {
        "required" : [ "assignees", "attachments", "comments", "creators", "sheets", "sites", "statuses", "tags", "watchers", "zones" ],
        "type" : "object",
        "properties" : {
          "assignees" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalAccount"
            }
          },
          "attachments" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFieldNoteAttachment"
            }
          },
          "comments" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFieldNoteComment"
            }
          },
          "creators" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalAccount"
            }
          },
          "sheets" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSheet"
            }
          },
          "sites" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSite"
            }
          },
          "statuses" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFieldNoteStatus"
            }
          },
          "tags" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFieldNoteTag"
            }
          },
          "watchers" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalAccount"
            }
          },
          "zones" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFieldNoteZone"
            }
          }
        }
      },
      "ExternalFieldNoteSearch" : {
        "type" : "object",
        "properties" : {
          "accountIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "assigneeIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "collabGroupAssignedAfter" : {
            "type" : "string",
            "format" : "date"
          },
          "collabGroupAssignedBefore" : {
            "type" : "string",
            "format" : "date"
          },
          "collabGroupIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "createdAfter" : {
            "type" : "string",
            "format" : "date-time"
          },
          "createdBefore" : {
            "type" : "string",
            "format" : "date-time"
          },
          "dueAfter" : {
            "type" : "string",
            "format" : "date"
          },
          "dueBefore" : {
            "type" : "string",
            "format" : "date"
          },
          "excludeIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "includeIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "query" : {
            "type" : "string"
          },
          "sheetIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "showClosed" : {
            "type" : "boolean"
          },
          "showNoStatus" : {
            "type" : "boolean"
          },
          "showOnlyClosed" : {
            "type" : "boolean"
          },
          "showUnassigned" : {
            "type" : "boolean"
          },
          "statusIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "watcherIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "watchersFilter" : {
            "$ref" : "#/components/schemas/CollectionSearchType"
          },
          "zoneIds" : {
            "uniqueItems" : true,
            "type" : "array",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        }
      },
      "ExternalFieldNoteStatus" : {
        "required" : [ "color", "id", "localizedTitle", "readOnly", "title" ],
        "type" : "object",
        "properties" : {
          "color" : {
            "type" : "string",
            "description" : "The color"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the field note status"
          },
          "localizedTitle" : {
            "type" : "string",
            "description" : "Human-readable status title, localized to the caller account's preferred language for system-default statuses. Customer-defined titles are returned verbatim. Intended for display only — do not match against this field, as wording may change with translation updates. Not affected by the Accept-Language request header."
          },
          "readOnly" : {
            "type" : "boolean",
            "description" : "True if this is a global status that cannot be modified or deleted"
          },
          "title" : {
            "type" : "string",
            "description" : "The status title. For system-default statuses this is a stable English literal (e.g. \"Open\", \"Contested\"); customer-defined titles are returned verbatim. Use this field as the stable identifier when driving business logic."
          }
        }
      },
      "ExternalFieldNoteStatusesGetResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFieldNoteStatus"
            }
          }
        }
      },
      "ExternalFieldNoteTag" : {
        "required" : [ "id", "label" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the field note tag"
          },
          "label" : {
            "type" : "string",
            "description" : "The label"
          }
        }
      },
      "ExternalFieldNoteZone" : {
        "required" : [ "createdAt", "geometry", "id", "name", "siteId" ],
        "type" : "object",
        "properties" : {
          "createdAt" : {
            "type" : "string",
            "description" : "When the zone was created",
            "format" : "date-time"
          },
          "description" : {
            "type" : "string",
            "description" : "A description for the zone."
          },
          "geometry" : {
            "oneOf" : [ {
              "$ref" : "#/components/schemas/LineString"
            }, {
              "$ref" : "#/components/schemas/Polygon"
            } ]
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the zone"
          },
          "name" : {
            "type" : "string",
            "description" : "A name for the zone. Must be unique within the sheet."
          },
          "sheetId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The sheet ID related"
          },
          "siteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The site ID to which the zone belongs."
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "When the zone was updated",
            "format" : "date-time"
          }
        }
      },
      "ExternalFieldNotesGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "associations" : {
            "$ref" : "#/components/schemas/FieldNoteAssociations"
          },
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFieldNote"
            }
          },
          "includes" : {
            "$ref" : "#/components/schemas/ExternalFieldNoteIncludes"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        }
      },
      "ExternalFloorplan" : {
        "required" : [ "height", "id", "originX", "originY", "scaleFactorMm", "sequences", "space", "width" ],
        "type" : "object",
        "properties" : {
          "floorHeightMm" : {
            "type" : "number",
            "description" : "Floor height in millimetres, if known",
            "format" : "double",
            "nullable" : true
          },
          "height" : {
            "type" : "number",
            "description" : "Image height in pixels",
            "format" : "double"
          },
          "id" : {
            "type" : "string",
            "description" : "The floorplan id"
          },
          "originX" : {
            "type" : "number",
            "description" : "X origin of the floorplan in the sheet coordinate system",
            "format" : "double"
          },
          "originY" : {
            "type" : "number",
            "description" : "Y origin of the floorplan in the sheet coordinate system",
            "format" : "double"
          },
          "scaleFactorMm" : {
            "type" : "number",
            "description" : "Scale factor in millimeters per pixel.",
            "format" : "double"
          },
          "sequences" : {
            "type" : "array",
            "description" : "Capture sequences associated with the floorplan",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFloorplanSequence"
            }
          },
          "space" : {
            "$ref" : "#/components/schemas/ExternalFloorplanSpace"
          },
          "trueNorthAngleDeg" : {
            "type" : "number",
            "description" : "True-north angle in degrees, if known",
            "format" : "double",
            "nullable" : true
          },
          "width" : {
            "type" : "number",
            "description" : "Image width in pixels",
            "format" : "double"
          }
        },
        "description" : "A floorplan (drawing) within a construction phase"
      },
      "ExternalFloorplanSequence" : {
        "required" : [ "id", "scanLevel", "sequencePrefix" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The sequence id"
          },
          "scanLevel" : {
            "type" : "string",
            "description" : "The scan level"
          },
          "sequencePrefix" : {
            "type" : "string",
            "description" : "The sequence prefix"
          }
        },
        "description" : "A capture sequence associated with a floorplan"
      },
      "ExternalFloorplanSpace" : {
        "required" : [ "id", "name" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The space id; the same id served by the spaces endpoint"
          },
          "name" : {
            "type" : "string",
            "description" : "The space name"
          }
        },
        "description" : "The space a floorplan belongs to"
      },
      "ExternalFloorplansGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalFloorplan"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Paginated list of floorplans for a phase, ordered by the space's display order. The returned `page` metadata reflects what the downstream actually served; `page.size` may be smaller than requested if the downstream clamps the page size."
      },
      "ExternalGlobalConfig" : {
        "required" : [ "allowedCollabAppPhoneNumberCountries" ],
        "type" : "object",
        "properties" : {
          "allowedCollabAppPhoneNumberCountries" : {
            "type" : "array",
            "description" : "ISO 3166-1 alpha-2 country codes whose phone numbers are accepted in CollabApp flows (SMS OTP login, crew invites). The frontend uses this to filter the country dropdown in the phone-input component. Mirrors Twilio Geo Permissions registrations on the backend.",
            "items" : {
              "$ref" : "#/components/schemas/CollabAppPhoneCountry"
            }
          }
        }
      },
      "ExternalGlobalConfigResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "$ref" : "#/components/schemas/ExternalGlobalConfig"
          }
        }
      },
      "ExternalImageSize" : {
        "type" : "string",
        "enum" : [ "small", "medium", "large" ]
      },
      "ExternalIntegrationCommentAuthor" : {
        "required" : [ "integrationUserId", "origin" ],
        "type" : "object",
        "description" : "A comment synced in from Autodesk or Procore",
        "allOf" : [ {
          "$ref" : "#/components/schemas/ExternalCustomFieldNoteCommentAuthor"
        }, {
          "type" : "object",
          "properties" : {
            "integrationUserId" : {
              "type" : "string",
              "description" : "The integration's own user id, Autodesk alphanumeric or Procore numeric"
            },
            "name" : {
              "type" : "string",
              "description" : "Null when the user is missing from the cached integration directory or nameless there"
            }
          }
        } ]
      },
      "ExternalOpenSpaceCommentAuthor" : {
        "required" : [ "accountId", "origin" ],
        "type" : "object",
        "description" : "A comment written in OpenSpace, including those mirrored out to the integration",
        "allOf" : [ {
          "$ref" : "#/components/schemas/ExternalCustomFieldNoteCommentAuthor"
        }, {
          "type" : "object",
          "properties" : {
            "accountId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string",
              "description" : "The account, the same id as the note's `creatorId` and the `creators` include"
            },
            "email" : {
              "type" : "string"
            },
            "name" : {
              "type" : "string"
            }
          }
        } ]
      },
      "ExternalOrganization" : {
        "required" : [ "createdAt", "id", "name" ],
        "type" : "object",
        "properties" : {
          "createdAt" : {
            "type" : "string",
            "description" : "When the organization was created.",
            "format" : "date-time"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique identifier for the organization"
          },
          "name" : {
            "type" : "string",
            "description" : "The organization name."
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "When the organization was last updated.",
            "format" : "date-time"
          }
        },
        "description" : "Organization information"
      },
      "ExternalOrganizationsGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalOrganization"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        }
      },
      "ExternalPano" : {
        "required" : [ "id", "startedAt" ],
        "type" : "object",
        "properties" : {
          "captureId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The capture id for the pano"
          },
          "frameNumber" : {
            "type" : "integer",
            "description" : "The frame number of the pano, zero based",
            "format" : "int32"
          },
          "geoPosition" : {
            "$ref" : "#/components/schemas/GeoPoint"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the pano"
          },
          "projectPose" : {
            "$ref" : "#/components/schemas/ExternalProjectPose"
          },
          "sharpnessScore" : {
            "type" : "number",
            "description" : "Image quality metric for the pano.  This number is scene dependent, larger is better, but only images of similar scenes should be compared. It is useful for selecting the sharpest pano out of a set taken in similar locations.",
            "format" : "float"
          },
          "sheetPose" : {
            "$ref" : "#/components/schemas/ExternalSheetPose"
          },
          "startedAt" : {
            "type" : "string",
            "description" : "The start date/time of the pano",
            "format" : "date-time"
          }
        },
        "description" : "Pano information"
      },
      "ExternalPanoIncludes" : {
        "type" : "object",
        "properties" : {
          "capture" : {
            "$ref" : "#/components/schemas/ExternalCapture"
          },
          "organization" : {
            "$ref" : "#/components/schemas/ExternalOrganization"
          },
          "sheet" : {
            "$ref" : "#/components/schemas/ExternalSheet"
          },
          "site" : {
            "$ref" : "#/components/schemas/ExternalSite"
          }
        }
      },
      "ExternalPanosGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalPano"
            }
          },
          "includes" : {
            "$ref" : "#/components/schemas/ExternalPanoIncludes"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        }
      },
      "ExternalPhase" : {
        "required" : [ "name" ],
        "type" : "object",
        "properties" : {
          "name" : {
            "type" : "string",
            "description" : "The phase name"
          }
        },
        "description" : "A construction phase"
      },
      "ExternalPhasesGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalPhase"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Paginated list of construction phases for a site. The returned `page` metadata reflects what the downstream actually served; `page.size` may be smaller than requested if the downstream clamps the page size."
      },
      "ExternalProgressComponent" : {
        "required" : [ "id", "name" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The component id"
          },
          "name" : {
            "type" : "string",
            "description" : "The component name"
          }
        },
        "description" : "A construction component"
      },
      "ExternalProgressDate" : {
        "required" : [ "capturedAt", "id", "weekNumber" ],
        "type" : "object",
        "properties" : {
          "capturedAt" : {
            "type" : "string",
            "description" : "When the capture batch was taken; an ISO-8601 UTC timestamp",
            "format" : "date-time"
          },
          "id" : {
            "type" : "string",
            "description" : "The capture batch id"
          },
          "weekNumber" : {
            "type" : "integer",
            "description" : "The 1-based week number of the capture batch, counted from the project start date",
            "format" : "int32"
          }
        },
        "description" : "A progress capture date (batch) for a site"
      },
      "ExternalProgressDatesGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalProgressDate"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Paginated list of progress capture dates for a site, newest first. The returned `page` metadata reflects what the downstream actually served; `page.size` may be smaller than requested if the downstream clamps the page size."
      },
      "ExternalProgressHistoryEntry" : {
        "required" : [ "batchId", "batchWeek", "capturedAt" ],
        "type" : "object",
        "properties" : {
          "batchId" : {
            "type" : "string",
            "description" : "The capture batch id"
          },
          "batchWeek" : {
            "type" : "integer",
            "description" : "The week number of the capture batch",
            "format" : "int32"
          },
          "capturedAt" : {
            "type" : "string",
            "description" : "When the capture batch was taken, as provided by the downstream (format not enforced)"
          },
          "progress" : {
            "type" : "number",
            "description" : "Progress as a percentage (0-100) for this batch, if recorded",
            "format" : "double",
            "nullable" : true
          }
        },
        "description" : "Progress recorded for a single capture batch"
      },
      "ExternalProgressSubcontractor" : {
        "required" : [ "id", "name" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The subcontractor id"
          },
          "name" : {
            "type" : "string",
            "description" : "The subcontractor name"
          }
        },
        "description" : "A subcontractor"
      },
      "ExternalProgressTask" : {
        "required" : [ "id", "name" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The task id"
          },
          "name" : {
            "type" : "string",
            "description" : "The task name"
          }
        },
        "description" : "A construction task"
      },
      "ExternalProjectPose" : {
        "required" : [ "orientation", "position" ],
        "type" : "object",
        "properties" : {
          "orientation" : {
            "$ref" : "#/components/schemas/Quat"
          },
          "position" : {
            "$ref" : "#/components/schemas/Vec3"
          }
        },
        "description" : "Position and Orientation of the frame in the Project coordinate system. The Project coordinate system is the shared space for combining models, point clouds, etc. It has an arbitrary origin and units.<br/> [x units, y units, z units]<br/><1,0,0>: Project east<br/><0,1,0>: Project north<br/><0,0,1>: Project Up"
      },
      "ExternalScene" : {
        "required" : [ "aliasIds", "id", "name" ],
        "type" : "object",
        "properties" : {
          "aliasIds" : {
            "type" : "array",
            "description" : "Ids of other scenes that alias this one; empty when the scene has no aliases",
            "items" : {
              "type" : "string"
            }
          },
          "id" : {
            "type" : "string",
            "description" : "The scene id"
          },
          "name" : {
            "type" : "string",
            "description" : "The scene name"
          },
          "xMm" : {
            "type" : "number",
            "description" : "X position of the scene in the space, in millimetres; null when the scene has no position",
            "format" : "double"
          },
          "yMm" : {
            "type" : "number",
            "description" : "Y position of the scene in the space, in millimetres; null when the scene has no position",
            "format" : "double"
          },
          "zOffsetMm" : {
            "type" : "number",
            "description" : "Height of the scene above the floor, in millimetres; null when the scene has no offset",
            "format" : "double"
          }
        },
        "description" : "A scene: a named scan point within a space"
      },
      "ExternalScenesGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalScene"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Scenes for a space, ordered by the scene's display order"
      },
      "ExternalSheet" : {
        "required" : [ "id", "name", "siteId", "size", "type" ],
        "type" : "object",
        "properties" : {
          "createdAt" : {
            "type" : "string",
            "description" : "When the sheet was created",
            "format" : "date-time"
          },
          "displayOrder" : {
            "type" : "integer",
            "description" : "The sheet display order",
            "format" : "int32"
          },
          "estimate" : {
            "$ref" : "#/components/schemas/SheetEstimate"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the sheet "
          },
          "imageId" : {
            "type" : "string",
            "description" : "The sheet image ID"
          },
          "name" : {
            "type" : "string",
            "description" : "The sheet name"
          },
          "registration" : {
            "$ref" : "#/components/schemas/RegistrationType"
          },
          "sheetStats" : {
            "$ref" : "#/components/schemas/ExternalSheetStatsModel"
          },
          "siteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the site "
          },
          "size" : {
            "$ref" : "#/components/schemas/Vec3"
          },
          "sizeRegistration" : {
            "$ref" : "#/components/schemas/RegistrationType"
          },
          "type" : {
            "$ref" : "#/components/schemas/Type"
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "Last time when the sheet was updated",
            "format" : "date-time"
          }
        },
        "description" : "Sheet information"
      },
      "ExternalSheetIncludes" : {
        "type" : "object",
        "properties" : {
          "site" : {
            "$ref" : "#/components/schemas/ExternalSite"
          }
        }
      },
      "ExternalSheetPose" : {
        "required" : [ "orientation", "position" ],
        "type" : "object",
        "properties" : {
          "orientation" : {
            "$ref" : "#/components/schemas/Quat"
          },
          "position" : {
            "$ref" : "#/components/schemas/Vec3"
          }
        },
        "description" : "Position of the pano where the units are normalized such that the width of the sheet is 2 units, and height is 2/aspect units. The orientation is the same that generates the equirectangular image.<br/>[x norms, y norms, z norms]<br/>[0,0,0]: [centerX, centerY, floorZ]<br/>[1,0,0]: [maxX, centerY, floorZ]<br/>[0,1/aspect,0]: [centerX, maxY, floorZ]<br/><1, 0, 0>: right and perpendicular to the optical axis<br/><0, 1, 0>: down and perpendicular to the optical axis<br/><0, 0, 1>: along the optical axis<br/>"
      },
      "ExternalSheetStatsModel" : {
        "required" : [ "fieldNotes", "lidarCaptures", "photoCaptures", "videoCaptures" ],
        "type" : "object",
        "properties" : {
          "fieldNotes" : {
            "$ref" : "#/components/schemas/ExternalActivityStatModel"
          },
          "lastCaptureDate" : {
            "type" : "string",
            "format" : "date-time"
          },
          "lidarCaptures" : {
            "$ref" : "#/components/schemas/ExternalActivityStatModel"
          },
          "photoCaptures" : {
            "$ref" : "#/components/schemas/ExternalActivityStatModel"
          },
          "videoCaptures" : {
            "$ref" : "#/components/schemas/ExternalActivityStatModel"
          }
        },
        "description" : "If the sheet has any capture"
      },
      "ExternalSheetsGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSheet"
            }
          },
          "includes" : {
            "$ref" : "#/components/schemas/ExternalSheetIncludes"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        }
      },
      "ExternalShot" : {
        "required" : [ "batch", "id" ],
        "type" : "object",
        "properties" : {
          "batch" : {
            "$ref" : "#/components/schemas/ExternalCaptureBatch"
          },
          "id" : {
            "type" : "string",
            "description" : "The shot id"
          },
          "imageId" : {
            "type" : "string",
            "description" : "Identifier of the shot image, provided by the downstream (format not enforced)",
            "nullable" : true
          },
          "name" : {
            "type" : "string",
            "description" : "The shot name, if set",
            "nullable" : true
          },
          "yaw" : {
            "type" : "number",
            "description" : "The shot's yaw (heading) in degrees, if recorded",
            "format" : "double",
            "nullable" : true
          }
        },
        "description" : "A shot: a single camera capture within a scene"
      },
      "ExternalShotsGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalShot"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Shots for a scene, ordered newest capture batch first"
      },
      "ExternalSignedUrl" : {
        "required" : [ "url" ],
        "type" : "object",
        "properties" : {
          "url" : {
            "type" : "string",
            "format" : "uri"
          }
        },
        "description" : "A short-lived URL, returned in place of a redirect"
      },
      "ExternalSite" : {
        "required" : [ "active", "name" ],
        "type" : "object",
        "properties" : {
          "active" : {
            "type" : "boolean",
            "description" : "The site status"
          },
          "address" : {
            "type" : "string",
            "description" : "The site street address"
          },
          "area" : {
            "type" : "number",
            "description" : "Square value of the unit of measure",
            "format" : "float"
          },
          "areaUnitOfMeasure" : {
            "type" : "string",
            "description" : "Square feet or meters unit",
            "enum" : [ "feet", "meters" ]
          },
          "country" : {
            "type" : "string",
            "description" : "The site country"
          },
          "createdAt" : {
            "type" : "string",
            "description" : "When the site was created",
            "format" : "date-time"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the site"
          },
          "name" : {
            "type" : "string",
            "description" : "The site name."
          },
          "organizationId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The organization id."
          },
          "projectKey" : {
            "type" : "string",
            "description" : "The site project key"
          },
          "registrationType" : {
            "$ref" : "#/components/schemas/RegistrationType"
          },
          "timeZone" : {
            "type" : "string",
            "description" : "The site time zone"
          }
        },
        "description" : "Site information"
      },
      "ExternalSiteGetResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "$ref" : "#/components/schemas/ExternalSite"
          },
          "includes" : {
            "$ref" : "#/components/schemas/ExternalSiteIncludes"
          }
        }
      },
      "ExternalSiteIncludes" : {
        "type" : "object",
        "properties" : {
          "accounts" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalAccount"
            }
          },
          "eligibleFieldNoteWatcherIds" : {
            "type" : "array",
            "description" : "Ids of the site accounts visible to the caller that can be added as field note watchers",
            "items" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          },
          "organization" : {
            "$ref" : "#/components/schemas/ExternalOrganization"
          }
        }
      },
      "ExternalSitesGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSite"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        }
      },
      "ExternalSpace" : {
        "required" : [ "bimModels", "displayIndex", "id", "name", "tags" ],
        "type" : "object",
        "properties" : {
          "bim" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/ExternalSpaceBim"
            } ]
          },
          "bimModels" : {
            "type" : "array",
            "description" : "BIM models associated with the space",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSpaceBimModel"
            }
          },
          "category" : {
            "type" : "string",
            "description" : "The space category",
            "nullable" : true
          },
          "displayIndex" : {
            "type" : "integer",
            "description" : "Display ordering index within the phase",
            "format" : "int32"
          },
          "id" : {
            "type" : "string",
            "description" : "The space id"
          },
          "name" : {
            "type" : "string",
            "description" : "The space name"
          },
          "parentId" : {
            "type" : "string",
            "description" : "The parent space id, if this space is nested",
            "nullable" : true
          },
          "parentName" : {
            "type" : "string",
            "description" : "The parent space name, if this space is nested",
            "nullable" : true
          },
          "tags" : {
            "type" : "array",
            "description" : "Tags applied to the space",
            "items" : {
              "type" : "string"
            }
          },
          "type" : {
            "type" : "string",
            "description" : "The space type",
            "nullable" : true
          }
        },
        "description" : "A construction space (area of a project) within a phase"
      },
      "ExternalSpaceBim" : {
        "type" : "object",
        "properties" : {
          "floorIds" : {
            "type" : "array",
            "description" : "Floor ids covered by the space",
            "nullable" : true,
            "items" : {
              "type" : "string"
            }
          },
          "floorModels" : {
            "type" : "array",
            "description" : "BIM floor models covered by the space",
            "nullable" : true,
            "items" : {
              "$ref" : "#/components/schemas/ExternalSpaceFloorModel"
            }
          },
          "originXMm" : {
            "type" : "number",
            "description" : "Origin X offset in millimetres",
            "format" : "double",
            "nullable" : true
          },
          "originYMm" : {
            "type" : "number",
            "description" : "Origin Y offset in millimetres",
            "format" : "double",
            "nullable" : true
          },
          "originZMm" : {
            "type" : "number",
            "description" : "Origin Z offset in millimetres",
            "format" : "double",
            "nullable" : true
          },
          "projectId" : {
            "type" : "string",
            "description" : "The BIM project id",
            "nullable" : true
          }
        },
        "description" : "BIM alignment details for a space"
      },
      "ExternalSpaceBimModel" : {
        "required" : [ "bimModelId", "label" ],
        "type" : "object",
        "properties" : {
          "bimModelId" : {
            "type" : "string",
            "description" : "The BIM model id"
          },
          "isCommon" : {
            "type" : "boolean",
            "description" : "Whether the model is shared across spaces, if known",
            "nullable" : true
          },
          "label" : {
            "type" : "string",
            "description" : "The BIM model label"
          }
        },
        "description" : "A BIM model associated with a space"
      },
      "ExternalSpaceFloorModel" : {
        "required" : [ "bimFloorId", "label" ],
        "type" : "object",
        "properties" : {
          "bimFloorId" : {
            "type" : "string",
            "description" : "The BIM floor id"
          },
          "isCommon" : {
            "type" : "boolean",
            "description" : "Whether the floor model is shared across spaces, if known",
            "nullable" : true
          },
          "label" : {
            "type" : "string",
            "description" : "The floor model label"
          }
        },
        "description" : "A BIM floor model covered by a space"
      },
      "ExternalSpacesGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSpace"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Paginated list of spaces for a phase. The returned `page` metadata reflects what the downstream actually served; `page.size` may be smaller than requested if the downstream clamps the page size."
      },
      "ExternalSpotlight" : {
        "required" : [ "history", "id", "type" ],
        "type" : "object",
        "properties" : {
          "comment" : {
            "type" : "string",
            "description" : "Latest comment text, if set",
            "nullable" : true
          },
          "commentAuthor" : {
            "type" : "string",
            "description" : "Author of the latest comment, if set",
            "nullable" : true
          },
          "createdInBatch" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/ExternalCaptureBatch"
            } ]
          },
          "defaultPriority" : {
            "type" : "string",
            "description" : "Default priority for the spotlight type, if set",
            "nullable" : true
          },
          "deleted" : {
            "type" : "boolean",
            "description" : "Whether the spotlight is deleted, if known",
            "nullable" : true
          },
          "description" : {
            "type" : "string",
            "description" : "Free-text description, if set",
            "nullable" : true
          },
          "history" : {
            "type" : "array",
            "description" : "Comment/update history for the spotlight, oldest first",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSpotlightHistoryEntry"
            }
          },
          "id" : {
            "type" : "string",
            "description" : "The spotlight id"
          },
          "mapping" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/ExternalSpotlightMapping"
            } ]
          },
          "p2Type" : {
            "type" : "string",
            "description" : "Secondary type classification, if set",
            "nullable" : true
          },
          "position" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/ExternalSpotlightPosition"
            } ]
          },
          "priority" : {
            "type" : "string",
            "description" : "Priority, as provided by the downstream, if set",
            "nullable" : true
          },
          "published" : {
            "type" : "boolean",
            "description" : "Whether the spotlight is published, if known",
            "nullable" : true
          },
          "resolvedInBatch" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/ExternalCaptureBatch"
            } ]
          },
          "sequenceNumber" : {
            "type" : "integer",
            "description" : "Ordering sequence number, if set",
            "format" : "int32",
            "nullable" : true
          },
          "status" : {
            "type" : "string",
            "description" : "Status, as provided by the downstream, if set",
            "nullable" : true
          },
          "subcontractor" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/ExternalSpotlightSubcontractor"
            } ]
          },
          "type" : {
            "type" : "string",
            "description" : "The spotlight type, as provided by the downstream"
          },
          "userCreated" : {
            "type" : "boolean",
            "description" : "Whether the spotlight was created by a user (rather than detected), if known",
            "nullable" : true
          }
        },
        "description" : "A spotlight: an observation pinned inside a scene"
      },
      "ExternalSpotlightHistoryEntry" : {
        "required" : [ "author", "capturedAt", "id" ],
        "type" : "object",
        "properties" : {
          "author" : {
            "type" : "string",
            "description" : "The entry author"
          },
          "body" : {
            "nullable" : true,
            "allOf" : [ {
              "$ref" : "#/components/schemas/JsonNode"
            } ]
          },
          "capturedAt" : {
            "type" : "string",
            "description" : "When the entry was made; an ISO-8601 UTC timestamp",
            "format" : "date-time"
          },
          "id" : {
            "type" : "string",
            "description" : "The history entry id"
          }
        },
        "description" : "A comment/update in a spotlight's history"
      },
      "ExternalSpotlightMapping" : {
        "required" : [ "componentId", "id", "spaceId" ],
        "type" : "object",
        "properties" : {
          "componentId" : {
            "type" : "string",
            "description" : "The component id"
          },
          "id" : {
            "type" : "string",
            "description" : "The mapping id"
          },
          "spaceId" : {
            "type" : "string",
            "description" : "The space id"
          }
        },
        "description" : "The space/component mapping a spotlight is attached to"
      },
      "ExternalSpotlightPosition" : {
        "required" : [ "pitch", "yaw" ],
        "type" : "object",
        "properties" : {
          "pitch" : {
            "type" : "number",
            "description" : "Pitch in degrees",
            "format" : "double"
          },
          "yaw" : {
            "type" : "number",
            "description" : "Yaw (heading) in degrees",
            "format" : "double"
          }
        },
        "description" : "A spotlight's position within its scene"
      },
      "ExternalSpotlightSubcontractor" : {
        "required" : [ "id", "name" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The subcontractor id"
          },
          "name" : {
            "type" : "string",
            "description" : "The subcontractor name"
          }
        },
        "description" : "The subcontractor associated with a spotlight"
      },
      "ExternalSpotlightsGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSpotlight"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Spotlights for a scene, ordered by the spotlight's sequence number"
      },
      "ExternalSubcontractorProgress" : {
        "required" : [ "history", "subcontractor" ],
        "type" : "object",
        "properties" : {
          "history" : {
            "type" : "array",
            "description" : "Per-batch progress history, as returned by progress tracking",
            "items" : {
              "$ref" : "#/components/schemas/ExternalProgressHistoryEntry"
            }
          },
          "subcontractor" : {
            "$ref" : "#/components/schemas/ExternalProgressSubcontractor"
          }
        },
        "description" : "Progress history for a single subcontractor within a space"
      },
      "ExternalSubcontractorProgressGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalSubcontractorProgress"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Paginated list of subcontractor progress for a space. The returned `page` metadata reflects what the downstream actually served; `page.size` may be smaller than requested if the downstream clamps the page size."
      },
      "ExternalTaskProgress" : {
        "required" : [ "history", "task" ],
        "type" : "object",
        "properties" : {
          "history" : {
            "type" : "array",
            "description" : "Per-batch progress history, as returned by progress tracking",
            "items" : {
              "$ref" : "#/components/schemas/ExternalProgressHistoryEntry"
            }
          },
          "task" : {
            "$ref" : "#/components/schemas/ExternalProgressTask"
          }
        },
        "description" : "Progress history for a single task within a space"
      },
      "ExternalTaskProgressGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalTaskProgress"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Paginated list of task progress for a space. The returned `page` metadata reflects what the downstream actually served; `page.size` may be smaller than requested if the downstream clamps the page size."
      },
      "ExternalWebhook" : {
        "required" : [ "createdAt", "id", "namespace", "organizationId", "status", "url", "verificationState" ],
        "type" : "object",
        "properties" : {
          "createdAt" : {
            "type" : "string",
            "description" : "When the webhook was created",
            "format" : "date-time"
          },
          "createdBy" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "Account ID of the user who created this webhook"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique identifier for the webhook"
          },
          "namespace" : {
            "type" : "string",
            "description" : "A user-friendly name or description for this webhook"
          },
          "organizationId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The organization this webhook belongs to"
          },
          "rateLimit" : {
            "type" : "integer",
            "description" : "Optional rate limit for webhook deliveries (events per hour)",
            "format" : "int32"
          },
          "status" : {
            "$ref" : "#/components/schemas/WebhookStatus"
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "When the webhook was last updated",
            "format" : "date-time"
          },
          "url" : {
            "type" : "string",
            "description" : "The destination URL where webhook events will be sent"
          },
          "verificationState" : {
            "$ref" : "#/components/schemas/WebhookVerificationState"
          }
        },
        "description" : "Webhook endpoint configuration"
      },
      "ExternalWebhookCreateRequest" : {
        "required" : [ "namespace", "secretToken", "url" ],
        "type" : "object",
        "properties" : {
          "namespace" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string",
            "description" : "A user-friendly name or description for this webhook"
          },
          "rateLimit" : {
            "type" : "integer",
            "description" : "Optional rate limit for webhook deliveries (events per hour)",
            "format" : "int32"
          },
          "secretToken" : {
            "maxLength" : 255,
            "minLength" : 32,
            "type" : "string",
            "description" : "Secret token for HMAC signature verification (min 32 characters). If omitted, a secure token is generated automatically."
          },
          "status" : {
            "$ref" : "#/components/schemas/WebhookStatus"
          },
          "url" : {
            "maxLength" : 2048,
            "minLength" : 0,
            "type" : "string",
            "description" : "The destination URL where webhook events will be sent"
          }
        },
        "description" : "Request to create a new webhook"
      },
      "ExternalWebhookDeliveriesGetResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "description" : "List of webhook deliveries",
            "items" : {
              "$ref" : "#/components/schemas/ExternalWebhookDelivery"
            }
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          }
        },
        "description" : "Response containing a paginated list of webhook deliveries"
      },
      "ExternalWebhookDelivery" : {
        "required" : [ "attemptCount", "createdAt", "deliveryId", "eventId", "status", "webhookId" ],
        "type" : "object",
        "properties" : {
          "attemptCount" : {
            "type" : "integer",
            "description" : "Number of delivery attempts made",
            "format" : "int32"
          },
          "createdAt" : {
            "type" : "string",
            "description" : "When the delivery was created",
            "format" : "date-time"
          },
          "deliveryId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique identifier for the delivery"
          },
          "eventId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The event that was delivered"
          },
          "lastErrorCode" : {
            "type" : "string",
            "description" : "Last error code if delivery failed"
          },
          "lastErrorMessage" : {
            "type" : "string",
            "description" : "Last error message if delivery failed"
          },
          "payload" : {
            "$ref" : "#/components/schemas/WebhookEventPayload"
          },
          "status" : {
            "$ref" : "#/components/schemas/WebhookDeliveryStatus"
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "When the delivery was last updated",
            "format" : "date-time"
          },
          "webhookId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The webhook that received the delivery"
          }
        },
        "description" : "Webhook delivery record tracking the delivery of an event to a webhook"
      },
      "ExternalWebhookDeliveryAttempt" : {
        "required" : [ "attemptId", "deliveryId", "requested" ],
        "type" : "object",
        "properties" : {
          "attemptId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique identifier for the attempt"
          },
          "deliveryId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The delivery this attempt belongs to"
          },
          "errorType" : {
            "$ref" : "#/components/schemas/WebhookDeliveryError"
          },
          "latencyMs" : {
            "type" : "integer",
            "description" : "Request latency in milliseconds",
            "format" : "int32"
          },
          "requested" : {
            "type" : "string",
            "description" : "When the request was sent",
            "format" : "date-time"
          },
          "responseBodyExcerpt" : {
            "type" : "string",
            "description" : "Excerpt of the response body"
          },
          "responseCode" : {
            "type" : "integer",
            "description" : "HTTP response code received",
            "format" : "int32"
          }
        },
        "description" : "Webhook delivery attempt record"
      },
      "ExternalWebhookDeliveryDetail" : {
        "required" : [ "attempts", "delivery" ],
        "type" : "object",
        "properties" : {
          "attempts" : {
            "type" : "array",
            "description" : "All delivery attempts",
            "items" : {
              "$ref" : "#/components/schemas/ExternalWebhookDeliveryAttempt"
            }
          },
          "delivery" : {
            "$ref" : "#/components/schemas/ExternalWebhookDelivery"
          }
        },
        "description" : "Webhook delivery detail including all attempts"
      },
      "ExternalWebhookHeader" : {
        "required" : [ "createdAt", "headerKey", "headerValue", "id", "isSecret", "webhookId" ],
        "type" : "object",
        "properties" : {
          "createdAt" : {
            "type" : "string",
            "description" : "When the header was created",
            "format" : "date-time"
          },
          "createdBy" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "Account ID of the user who created this header"
          },
          "headerKey" : {
            "type" : "string",
            "description" : "Header name"
          },
          "headerValue" : {
            "type" : "string",
            "description" : "Header value (masked if secret)"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique identifier for the header"
          },
          "isSecret" : {
            "type" : "boolean",
            "description" : "Whether the header value is encrypted/sensitive"
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "When the header was last updated",
            "format" : "date-time"
          },
          "webhookId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The webhook this header belongs to"
          }
        },
        "description" : "Custom header to include in webhook requests"
      },
      "ExternalWebhookHeaderCreateRequest" : {
        "required" : [ "headerKey", "headerValue" ],
        "type" : "object",
        "properties" : {
          "headerKey" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string",
            "description" : "Header name (e.g., 'Authorization', 'X-API-Key')"
          },
          "headerValue" : {
            "maxLength" : 4096,
            "minLength" : 0,
            "type" : "string",
            "description" : "Header value"
          },
          "isSecret" : {
            "type" : "boolean",
            "description" : "Whether the header value should be encrypted at rest (defaults to true)"
          }
        },
        "description" : "Request to add a custom header to a webhook"
      },
      "ExternalWebhookHeaderUpdateRequest" : {
        "required" : [ "headerValue" ],
        "type" : "object",
        "properties" : {
          "headerValue" : {
            "maxLength" : 4096,
            "minLength" : 0,
            "type" : "string",
            "description" : "New header value"
          }
        },
        "description" : "Request to update a webhook header"
      },
      "ExternalWebhookHeadersGetResponse" : {
        "required" : [ "headers" ],
        "type" : "object",
        "properties" : {
          "headers" : {
            "type" : "array",
            "description" : "List of webhook headers",
            "items" : {
              "$ref" : "#/components/schemas/ExternalWebhookHeader"
            }
          }
        },
        "description" : "Response containing a list of webhook headers"
      },
      "ExternalWebhookIncludes" : {
        "required" : [ "headers", "rules" ],
        "type" : "object",
        "properties" : {
          "headers" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalWebhookHeader"
            }
          },
          "rules" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalWebhookRule"
            }
          }
        },
        "description" : "Included resources for webhook responses"
      },
      "ExternalWebhookRule" : {
        "required" : [ "action", "createdAt", "eventType", "id", "organizationId", "scope", "webhookId" ],
        "type" : "object",
        "properties" : {
          "action" : {
            "$ref" : "#/components/schemas/WebhookRuleAction"
          },
          "createdAt" : {
            "type" : "string",
            "description" : "When the rule was created",
            "format" : "date-time"
          },
          "createdBy" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "Account ID of the user who created this rule"
          },
          "eventType" : {
            "$ref" : "#/components/schemas/WebhookEventType"
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique identifier for the rule"
          },
          "organizationId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The organization this rule applies to"
          },
          "rateLimit" : {
            "type" : "integer",
            "description" : "Optional rate limit specific to this rule (events per hour)",
            "format" : "int32"
          },
          "scope" : {
            "$ref" : "#/components/schemas/WebhookRuleScope"
          },
          "siteGroupId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "Site group ID (required when scope is SITE_GROUP)"
          },
          "siteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "Site ID (required when scope is SITE)"
          },
          "updatedAt" : {
            "type" : "string",
            "description" : "When the rule was last updated",
            "format" : "date-time"
          },
          "webhookId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The webhook this rule belongs to"
          }
        },
        "description" : "Webhook subscription rule defining which events trigger deliveries"
      },
      "ExternalWebhookRuleCreateRequest" : {
        "required" : [ "action", "eventType", "scope" ],
        "type" : "object",
        "properties" : {
          "action" : {
            "$ref" : "#/components/schemas/WebhookRuleAction"
          },
          "eventType" : {
            "$ref" : "#/components/schemas/WebhookEventType"
          },
          "rateLimit" : {
            "type" : "integer",
            "description" : "Optional rate limit specific to this rule (events per hour)",
            "format" : "int32"
          },
          "scope" : {
            "$ref" : "#/components/schemas/WebhookRuleScope"
          },
          "siteGroupId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "Site group ID (required when scope is SITE_GROUP)"
          },
          "siteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "Site ID (required when scope is SITE)"
          }
        },
        "description" : "Request to create a webhook rule"
      },
      "ExternalWebhookRuleUpdateRequest" : {
        "type" : "object",
        "properties" : {
          "action" : {
            "$ref" : "#/components/schemas/WebhookRuleAction"
          },
          "eventType" : {
            "$ref" : "#/components/schemas/WebhookEventType"
          },
          "rateLimit" : {
            "type" : "integer",
            "description" : "Optional rate limit specific to this rule (events per hour)",
            "format" : "int32"
          }
        },
        "description" : "Request to update a webhook rule"
      },
      "ExternalWebhookRulesGetResponse" : {
        "required" : [ "rules" ],
        "type" : "object",
        "properties" : {
          "rules" : {
            "type" : "array",
            "description" : "List of webhook rules",
            "items" : {
              "$ref" : "#/components/schemas/ExternalWebhookRule"
            }
          }
        },
        "description" : "Response containing a list of webhook rules"
      },
      "ExternalWebhookTestRequest" : {
        "required" : [ "fieldNoteId" ],
        "type" : "object",
        "properties" : {
          "fieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The field note ID to create a test event for"
          }
        },
        "description" : "Request to send a test webhook event"
      },
      "ExternalWebhookTestResponse" : {
        "required" : [ "eventId", "eventType", "message", "siteId", "webhookId" ],
        "type" : "object",
        "properties" : {
          "eventId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The event ID of the created test event"
          },
          "eventType" : {
            "type" : "string",
            "description" : "The event type that was created"
          },
          "message" : {
            "type" : "string",
            "description" : "Message describing the test event"
          },
          "siteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The site ID the event was created for"
          },
          "webhookId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The webhook ID that the test event was created for"
          }
        },
        "description" : "Response from webhook test request"
      },
      "ExternalWebhookUpdateRequest" : {
        "type" : "object",
        "properties" : {
          "namespace" : {
            "maxLength" : 255,
            "minLength" : 0,
            "type" : "string",
            "description" : "A user-friendly name or description for this webhook"
          },
          "rateLimit" : {
            "type" : "integer",
            "description" : "Optional rate limit for webhook deliveries (events per hour)",
            "format" : "int32"
          },
          "status" : {
            "$ref" : "#/components/schemas/WebhookStatus"
          },
          "url" : {
            "maxLength" : 2048,
            "minLength" : 0,
            "type" : "string",
            "description" : "The destination URL where webhook events will be sent"
          }
        },
        "description" : "Request to update an existing webhook"
      },
      "ExternalWebhookUpdateSecretRequest" : {
        "required" : [ "secretToken" ],
        "type" : "object",
        "properties" : {
          "secretToken" : {
            "maxLength" : 255,
            "minLength" : 32,
            "type" : "string",
            "description" : "New secret token for HMAC signature verification (min 32 characters)"
          }
        },
        "description" : "Request to update webhook secret token"
      },
      "ExternalWebhookVerifyResponse" : {
        "required" : [ "message" ],
        "type" : "object",
        "properties" : {
          "message" : {
            "type" : "string",
            "description" : "Status message describing the verification result"
          }
        },
        "description" : "Response from webhook verification request"
      },
      "ExternalWebhooksGetResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalWebhook"
            }
          },
          "includes" : {
            "$ref" : "#/components/schemas/ExternalWebhookIncludes"
          }
        },
        "description" : "Response containing a list of webhooks"
      },
      "ExternalZone" : {
        "required" : [ "geometry", "id", "name", "sheetId" ],
        "type" : "object",
        "properties" : {
          "description" : {
            "type" : "string",
            "description" : "A description for the zone."
          },
          "geometry" : {
            "oneOf" : [ {
              "$ref" : "#/components/schemas/LineString"
            }, {
              "$ref" : "#/components/schemas/Polygon"
            } ]
          },
          "id" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The unique ID for the zone"
          },
          "name" : {
            "type" : "string",
            "description" : "The zone name."
          },
          "sheetId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string",
            "description" : "The UUID of the sheet that this zone is on"
          }
        }
      },
      "ExternalZonesGetResponse" : {
        "required" : [ "content" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ExternalZone"
            }
          }
        }
      },
      "FieldNoteAssociations" : {
        "type" : "object",
        "properties" : {
          "fieldNotesToTags" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/FieldNoteToTag"
            }
          },
          "fieldNotesToWatchers" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/FieldNoteToWatcher"
            }
          },
          "fieldNotesToZones" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/FieldNoteToZone"
            }
          }
        }
      },
      "FieldNoteAttachmentCreatedPayload" : {
        "required" : [ "attachmentId", "eventType", "fieldNoteId", "siteId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "attachmentId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "fieldNoteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "FieldNoteAttachmentDeletedPayload" : {
        "required" : [ "attachmentId", "eventType", "fieldNoteId", "siteId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "attachmentId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "fieldNoteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "FieldNoteCommentCreatedPayload" : {
        "required" : [ "commentId", "eventType", "fieldNoteId", "siteId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "commentId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "fieldNoteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "FieldNoteCommentDeletedPayload" : {
        "required" : [ "commentId", "eventType", "fieldNoteId", "siteId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "commentId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "fieldNoteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "FieldNoteCommentUpdatedPayload" : {
        "required" : [ "commentId", "eventType", "fieldNoteId", "siteId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "commentId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "fieldNoteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "FieldNoteCreatedPayload" : {
        "required" : [ "eventType", "fieldNoteId", "siteId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "fieldNoteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "FieldNoteDeletedPayload" : {
        "required" : [ "eventType", "fieldNoteId", "siteId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "fieldNoteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "FieldNoteToTag" : {
        "required" : [ "fieldNoteId", "tagId" ],
        "type" : "object",
        "properties" : {
          "fieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "tagId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }
      },
      "FieldNoteToWatcher" : {
        "required" : [ "fieldNoteId", "watcherId" ],
        "type" : "object",
        "properties" : {
          "fieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "watcherId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }
      },
      "FieldNoteToZone" : {
        "required" : [ "fieldNoteId", "zoneId" ],
        "type" : "object",
        "properties" : {
          "fieldNoteId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          },
          "zoneId" : {
            "pattern" : "[0-9A-Za-z_-]{22}",
            "type" : "string"
          }
        }
      },
      "FieldNoteUpdatedPayload" : {
        "required" : [ "changedFields", "eventType", "fieldNoteId", "siteId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "changedFields" : {
              "type" : "array",
              "items" : {
                "type" : "string"
              }
            },
            "fieldNoteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "GeoJsonObject" : {
        "required" : [ "type" ],
        "type" : "object",
        "properties" : {
          "type" : {
            "type" : "string"
          }
        },
        "description" : "A base GeoJSON schema",
        "discriminator" : {
          "propertyName" : "type"
        }
      },
      "GeoPoint" : {
        "maxItems" : 3,
        "minItems" : 3,
        "type" : "array",
        "description" : "3-element geo point as [long, lat, alt] array",
        "example" : [ 0.0, 0.0, 0.0 ],
        "items" : {
          "type" : "number"
        }
      },
      "GetReportingOrganizationsResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingOrganization"
            }
          },
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          },
          "reportingPage" : {
            "$ref" : "#/components/schemas/ReportingPageReportingOrganization"
          }
        }
      },
      "GetReportingSheetPageResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingSheet"
            }
          },
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          },
          "reportingPage" : {
            "$ref" : "#/components/schemas/ReportingPageReportingSheet"
          }
        }
      },
      "GetReportingSiteEventPageResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingSiteEvent"
            }
          },
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          },
          "reportingPage" : {
            "$ref" : "#/components/schemas/ReportingPageReportingSiteEvent"
          }
        }
      },
      "GetReportingSitePageResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingSite"
            }
          },
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          },
          "reportingPage" : {
            "$ref" : "#/components/schemas/ReportingPageReportingSite"
          }
        }
      },
      "JsonNode" : {
        "type" : "object",
        "description" : "JSON Schema (draft 2020-12) with the x-ui-schema, x-external-one-of, x-ui-treatment and x-field-roles extensions. Immutable per version."
      },
      "Language" : {
        "type" : "string",
        "description" : "The language preference of the account holder",
        "example" : "en",
        "enum" : [ "de", "en", "es", "ja", "zh", "zh-TW" ]
      },
      "LineString" : {
        "required" : [ "coordinates", "type" ],
        "type" : "object",
        "description" : "\n    A line string geometry is defined by a list of 2 or more points.\n  ",
        "example" : {
          "type" : "LineString",
          "coordinates" : [ [ 0.0, 0.0 ], [ 1.0, 1.0 ], [ 2.0, 0.0 ] ]
        },
        "allOf" : [ {
          "$ref" : "#/components/schemas/GeoJsonObject"
        }, {
          "type" : "object",
          "properties" : {
            "coordinates" : {
              "type" : "array",
              "items" : {
                "$ref" : "#/components/schemas/Point"
              }
            },
            "type" : {
              "type" : "string",
              "enum" : [ "LineString" ]
            }
          }
        } ]
      },
      "PageData" : {
        "required" : [ "itemCount", "page", "pageCount", "size" ],
        "type" : "object",
        "properties" : {
          "itemCount" : {
            "type" : "integer",
            "format" : "int32"
          },
          "page" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageCount" : {
            "type" : "integer",
            "format" : "int32"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PageReporting360Video" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/Reporting360Video"
            }
          },
          "empty" : {
            "type" : "boolean"
          },
          "first" : {
            "type" : "boolean"
          },
          "last" : {
            "type" : "boolean"
          },
          "number" : {
            "type" : "integer",
            "format" : "int32"
          },
          "numberOfElements" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageable" : {
            "$ref" : "#/components/schemas/PageableObject"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "sort" : {
            "$ref" : "#/components/schemas/SortObject"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PageReportingDroneImage" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingDroneImage"
            }
          },
          "empty" : {
            "type" : "boolean"
          },
          "first" : {
            "type" : "boolean"
          },
          "last" : {
            "type" : "boolean"
          },
          "number" : {
            "type" : "integer",
            "format" : "int32"
          },
          "numberOfElements" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageable" : {
            "$ref" : "#/components/schemas/PageableObject"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "sort" : {
            "$ref" : "#/components/schemas/SortObject"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PageReportingFieldNote" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingFieldNote"
            }
          },
          "empty" : {
            "type" : "boolean"
          },
          "first" : {
            "type" : "boolean"
          },
          "last" : {
            "type" : "boolean"
          },
          "number" : {
            "type" : "integer",
            "format" : "int32"
          },
          "numberOfElements" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageable" : {
            "$ref" : "#/components/schemas/PageableObject"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "sort" : {
            "$ref" : "#/components/schemas/SortObject"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PageReportingMembership" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingMembership"
            }
          },
          "empty" : {
            "type" : "boolean"
          },
          "first" : {
            "type" : "boolean"
          },
          "last" : {
            "type" : "boolean"
          },
          "number" : {
            "type" : "integer",
            "format" : "int32"
          },
          "numberOfElements" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageable" : {
            "$ref" : "#/components/schemas/PageableObject"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "sort" : {
            "$ref" : "#/components/schemas/SortObject"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PageReportingOrganization" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingOrganization"
            }
          },
          "empty" : {
            "type" : "boolean"
          },
          "first" : {
            "type" : "boolean"
          },
          "last" : {
            "type" : "boolean"
          },
          "number" : {
            "type" : "integer",
            "format" : "int32"
          },
          "numberOfElements" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageable" : {
            "$ref" : "#/components/schemas/PageableObject"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "sort" : {
            "$ref" : "#/components/schemas/SortObject"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PageReportingSheet" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingSheet"
            }
          },
          "empty" : {
            "type" : "boolean"
          },
          "first" : {
            "type" : "boolean"
          },
          "last" : {
            "type" : "boolean"
          },
          "number" : {
            "type" : "integer",
            "format" : "int32"
          },
          "numberOfElements" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageable" : {
            "$ref" : "#/components/schemas/PageableObject"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "sort" : {
            "$ref" : "#/components/schemas/SortObject"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PageReportingSite" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingSite"
            }
          },
          "empty" : {
            "type" : "boolean"
          },
          "first" : {
            "type" : "boolean"
          },
          "last" : {
            "type" : "boolean"
          },
          "number" : {
            "type" : "integer",
            "format" : "int32"
          },
          "numberOfElements" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageable" : {
            "$ref" : "#/components/schemas/PageableObject"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "sort" : {
            "$ref" : "#/components/schemas/SortObject"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PageReportingSiteEvent" : {
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingSiteEvent"
            }
          },
          "empty" : {
            "type" : "boolean"
          },
          "first" : {
            "type" : "boolean"
          },
          "last" : {
            "type" : "boolean"
          },
          "number" : {
            "type" : "integer",
            "format" : "int32"
          },
          "numberOfElements" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageable" : {
            "$ref" : "#/components/schemas/PageableObject"
          },
          "size" : {
            "type" : "integer",
            "format" : "int32"
          },
          "sort" : {
            "$ref" : "#/components/schemas/SortObject"
          },
          "totalElements" : {
            "type" : "integer",
            "format" : "int64"
          },
          "totalPages" : {
            "type" : "integer",
            "format" : "int32"
          }
        }
      },
      "PageableObject" : {
        "type" : "object",
        "properties" : {
          "offset" : {
            "type" : "integer",
            "format" : "int64"
          },
          "pageNumber" : {
            "type" : "integer",
            "format" : "int32"
          },
          "pageSize" : {
            "type" : "integer",
            "format" : "int32"
          },
          "paged" : {
            "type" : "boolean"
          },
          "sort" : {
            "$ref" : "#/components/schemas/SortObject"
          },
          "unpaged" : {
            "type" : "boolean"
          }
        }
      },
      "Point" : {
        "maxItems" : 3,
        "minItems" : 2,
        "type" : "array",
        "description" : "2D or 3D point as [x, y] or [x, y, z] array",
        "example" : [ 0.0, 0.0, 0.0 ],
        "items" : {
          "type" : "number"
        }
      },
      "Polygon" : {
        "required" : [ "coordinates", "type" ],
        "type" : "object",
        "description" : "\n    A polygon geometry, which is defined by a list of rings.\n    The first ring is the outer ring, and any subsequent rings are holes in the polygon.\n    A ring must be closed, meaning the first and last points must be the same.\n    Additionally, all coordinates must be either 2d or 3d, not both.\n  ",
        "example" : {
          "type" : "Polygon",
          "coordinates" : [ [ [ 0.0, 0.0 ], [ 0.1, 0.0 ], [ 0.1, 0.1 ], [ 0.0, 0.1 ], [ 0.0, 0.0 ] ] ]
        },
        "allOf" : [ {
          "$ref" : "#/components/schemas/GeoJsonObject"
        }, {
          "type" : "object",
          "properties" : {
            "coordinates" : {
              "type" : "array",
              "items" : {
                "type" : "array",
                "items" : {
                  "$ref" : "#/components/schemas/Point"
                }
              }
            },
            "type" : {
              "type" : "string",
              "enum" : [ "Polygon" ]
            }
          }
        } ]
      },
      "PositionType" : {
        "type" : "string",
        "description" : "The position type; specifies how the markerOffset was defined",
        "enum" : [ "pano", "forward", "constant", "photo" ]
      },
      "Quat" : {
        "maxItems" : 4,
        "minItems" : 4,
        "type" : "array",
        "description" : "4-element quaternion as [x, y, z, w] array",
        "example" : [ 0.0, 0.0, 0.0, 0.0 ],
        "items" : {
          "type" : "number"
        }
      },
      "RegistrationType" : {
        "type" : "string",
        "description" : "The sheet size registration",
        "enum" : [ "none", "autoFit", "autoGps", "full" ]
      },
      "Reporting360Video" : {
        "required" : [ "isSiteSharedFolder", "organizationCreated", "organizationId", "organizationName", "siteCreated", "siteId", "siteName", "videoId", "videoStart" ],
        "type" : "object",
        "properties" : {
          "isSiteSharedFolder" : {
            "type" : "boolean",
            "description" : "Indicates if this site is a shared folder."
          },
          "isVideoPublished" : {
            "type" : "boolean",
            "description" : "A boolean column for whether or not the 360 video is published."
          },
          "organizationCreated" : {
            "type" : "string",
            "description" : "When the organization was created.",
            "format" : "date-time"
          },
          "organizationId" : {
            "type" : "string",
            "description" : "The unique identifier for the organization. Can be used to generate a hyperlink."
          },
          "organizationName" : {
            "type" : "string",
            "description" : "The organization name."
          },
          "organizationUpdated" : {
            "type" : "string",
            "description" : "When the organization was last updated.",
            "format" : "date-time"
          },
          "sheetCreated" : {
            "type" : "string",
            "description" : "When the sheet was uploaded.",
            "format" : "date-time"
          },
          "sheetDisplayOrder" : {
            "type" : "integer",
            "description" : "The display order of the sheet. Can be changed by dragging sheets around in Site Settings.",
            "format" : "int32"
          },
          "sheetId" : {
            "type" : "string",
            "description" : "The unique identifier for the sheet."
          },
          "sheetName" : {
            "type" : "string",
            "description" : "The sheet name."
          },
          "siteAddress" : {
            "type" : "string",
            "description" : "The address of the site, as input into site settings."
          },
          "siteArea" : {
            "type" : "number",
            "description" : "Square value of the unit of measure.",
            "format" : "float"
          },
          "siteAreaUnitOfMeasure" : {
            "type" : "string",
            "description" : "Square feet or meters unit",
            "enum" : [ "feet", "meters" ]
          },
          "siteContractValue" : {
            "type" : "integer",
            "description" : "The total amount of construction work performed during the project.",
            "format" : "int64"
          },
          "siteCreated" : {
            "type" : "string",
            "description" : "When the site was created.",
            "format" : "date-time"
          },
          "siteEndDate" : {
            "type" : "string",
            "description" : "The date that the project finished, or will finish.",
            "format" : "date"
          },
          "siteExternalId" : {
            "type" : "string",
            "description" : "The external ID for the site. Can be customized after enabling the custom link from site settings."
          },
          "siteGroupId" : {
            "type" : "string",
            "description" : "The unique ID for the site group. Note that site groups are optional, so this field can be null."
          },
          "siteGroupName" : {
            "type" : "string",
            "description" : "The name of the site group. Note that site groups are optional, so this field can be null."
          },
          "siteId" : {
            "type" : "string",
            "description" : "The unique ID for the site. Can be used to generate a hyperlink into OpenSpace."
          },
          "siteLatitude" : {
            "type" : "number",
            "description" : "The site latitude. Can be customized from site settings."
          },
          "siteLongitude" : {
            "type" : "number",
            "description" : "The site longitude. Can be customized from site settings."
          },
          "siteName" : {
            "type" : "string",
            "description" : "The site name."
          },
          "siteStartDate" : {
            "type" : "string",
            "description" : "The date that the project started, or will start.",
            "format" : "date"
          },
          "siteStatus" : {
            "type" : "string",
            "description" : "The status of the site."
          },
          "userCompanyNameCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCompanyNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCountryCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCountrySiteCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCreatedCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userCreatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userEmailCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userEmailSiteCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userFullNameCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userFullNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userIdCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userIdSiteCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userJobTitleCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userJobTitleSiteCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userLastLoginCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userLastLoginSiteCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userUpdatedCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          },
          "userUpdatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          },
          "videoDeviceId" : {
            "type" : "string",
            "description" : "The unique identifier for the device used for the 360 video."
          },
          "videoDurationMinutes" : {
            "type" : "number",
            "description" : "The duration of the 360 video in minutes.",
            "format" : "double"
          },
          "videoId" : {
            "type" : "string",
            "description" : "The unique identifier for the 360 video."
          },
          "videoName" : {
            "type" : "string",
            "description" : "The name of the 360 video."
          },
          "videoNumberOfFrames" : {
            "type" : "integer",
            "description" : "The number of frames of the 360 Video. All videos are captured at two frames per second.",
            "format" : "int32"
          },
          "videoStart" : {
            "type" : "string",
            "description" : "When the 360 video was started.",
            "format" : "date-time"
          }
        }
      },
      "Reporting360VideoPageResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/Reporting360Video"
            }
          },
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          },
          "reportingPage" : {
            "$ref" : "#/components/schemas/ReportingPageReporting360Video"
          }
        }
      },
      "ReportingDroneImage" : {
        "required" : [ "droneCaptureCreated", "droneCaptureCreatorUserId", "droneCaptureId", "droneCaptureStatus", "droneImageId", "droneImageType", "isSiteSharedFolder", "organizationCreated", "organizationId", "organizationName", "siteCreated", "siteId", "siteName" ],
        "type" : "object",
        "properties" : {
          "droneCaptureCreated" : {
            "type" : "string",
            "description" : "When the Drone Capture was created.",
            "format" : "date-time"
          },
          "droneCaptureCreatorUserId" : {
            "type" : "string",
            "description" : "Who created the Drone Capture."
          },
          "droneCaptureId" : {
            "type" : "string",
            "description" : "The unique identifier for the Drone Capture."
          },
          "droneCaptureName" : {
            "type" : "string",
            "description" : "The name of the Drone Capture."
          },
          "droneCaptureStatus" : {
            "$ref" : "#/components/schemas/DroneCaptureStatus"
          },
          "droneImageCreated" : {
            "type" : "string",
            "description" : "When the drone image was captured.",
            "format" : "date-time"
          },
          "droneImageDeviceAttitude" : {
            "$ref" : "#/components/schemas/Quat"
          },
          "droneImageId" : {
            "type" : "string",
            "description" : "The unique identifier for the Drone Image."
          },
          "droneImageLocation" : {
            "$ref" : "#/components/schemas/Vec3"
          },
          "droneImageType" : {
            "$ref" : "#/components/schemas/DroneImageType"
          },
          "isSiteSharedFolder" : {
            "type" : "boolean",
            "description" : "Indicates if this site is a shared folder."
          },
          "organizationCreated" : {
            "type" : "string",
            "description" : "When the organization was created.",
            "format" : "date-time"
          },
          "organizationId" : {
            "type" : "string",
            "description" : "The unique identifier for the organization. Can be used to generate a hyperlink."
          },
          "organizationName" : {
            "type" : "string",
            "description" : "The organization name."
          },
          "organizationUpdated" : {
            "type" : "string",
            "description" : "When the organization was last updated.",
            "format" : "date-time"
          },
          "siteAddress" : {
            "type" : "string",
            "description" : "The address of the site, as input into site settings."
          },
          "siteArea" : {
            "type" : "number",
            "description" : "Square value of the unit of measure.",
            "format" : "float"
          },
          "siteAreaUnitOfMeasure" : {
            "type" : "string",
            "description" : "Square feet or meters unit",
            "enum" : [ "feet", "meters" ]
          },
          "siteContractValue" : {
            "type" : "integer",
            "description" : "The total amount of construction work performed during the project.",
            "format" : "int64"
          },
          "siteCreated" : {
            "type" : "string",
            "description" : "When the site was created.",
            "format" : "date-time"
          },
          "siteEndDate" : {
            "type" : "string",
            "description" : "The date that the project finished, or will finish.",
            "format" : "date"
          },
          "siteExternalId" : {
            "type" : "string",
            "description" : "The external ID for the site. Can be customized after enabling the custom link from site settings."
          },
          "siteGroupId" : {
            "type" : "string",
            "description" : "The unique ID for the site group. Note that site groups are optional, so this field can be null."
          },
          "siteGroupName" : {
            "type" : "string",
            "description" : "The name of the site group. Note that site groups are optional, so this field can be null."
          },
          "siteId" : {
            "type" : "string",
            "description" : "The unique ID for the site. Can be used to generate a hyperlink into OpenSpace."
          },
          "siteLatitude" : {
            "type" : "number",
            "description" : "The site latitude. Can be customized from site settings."
          },
          "siteLongitude" : {
            "type" : "number",
            "description" : "The site longitude. Can be customized from site settings."
          },
          "siteName" : {
            "type" : "string",
            "description" : "The site name."
          },
          "siteStartDate" : {
            "type" : "string",
            "description" : "The date that the project started, or will start.",
            "format" : "date"
          },
          "siteStatus" : {
            "type" : "string",
            "description" : "The status of the site."
          },
          "userCompanyNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCountrySiteCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCreatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userEmailSiteCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userFullNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userIdSiteCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userJobTitleSiteCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userLastLoginSiteCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userUpdatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          }
        }
      },
      "ReportingDroneImagePageResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingDroneImage"
            }
          },
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          },
          "reportingPage" : {
            "$ref" : "#/components/schemas/ReportingPageReportingDroneImage"
          }
        }
      },
      "ReportingFieldNote" : {
        "required" : [ "fieldNoteCreated", "fieldNoteId", "fieldNoteUpdated", "isSiteSharedFolder", "organizationCreated", "organizationId", "organizationName", "siteCreated", "siteId", "siteName" ],
        "type" : "object",
        "properties" : {
          "fieldNoteCreated" : {
            "type" : "string",
            "description" : "When the field note was created.",
            "format" : "date-time"
          },
          "fieldNoteDescription" : {
            "type" : "string",
            "description" : "Field note description. The naming predates the comment thread function."
          },
          "fieldNoteId" : {
            "type" : "string",
            "description" : "The unique identifier for the Field Note."
          },
          "fieldNotePositionType" : {
            "type" : "string",
            "description" : "The position type; specifies how the markerOffset was defined"
          },
          "fieldNoteUpdated" : {
            "type" : "string",
            "description" : "When the field note was last updated.",
            "format" : "date-time"
          },
          "isSiteSharedFolder" : {
            "type" : "boolean",
            "description" : "Indicates if this site is a shared folder."
          },
          "organizationCreated" : {
            "type" : "string",
            "description" : "When the organization was created.",
            "format" : "date-time"
          },
          "organizationId" : {
            "type" : "string",
            "description" : "The unique identifier for the organization. Can be used to generate a hyperlink."
          },
          "organizationName" : {
            "type" : "string",
            "description" : "The organization name."
          },
          "organizationUpdated" : {
            "type" : "string",
            "description" : "When the organization was last updated.",
            "format" : "date-time"
          },
          "sheetCreated" : {
            "type" : "string",
            "description" : "When the sheet was uploaded.",
            "format" : "date-time"
          },
          "sheetDisplayOrder" : {
            "type" : "integer",
            "description" : "The display order of the sheet. Can be changed by dragging sheets around in Site Settings.",
            "format" : "int32"
          },
          "sheetId" : {
            "type" : "string",
            "description" : "The unique identifier for the sheet."
          },
          "sheetName" : {
            "type" : "string",
            "description" : "The sheet name."
          },
          "siteAddress" : {
            "type" : "string",
            "description" : "The address of the site, as input into site settings."
          },
          "siteArea" : {
            "type" : "number",
            "description" : "Square value of the unit of measure.",
            "format" : "float"
          },
          "siteAreaUnitOfMeasure" : {
            "type" : "string",
            "description" : "Square feet or meters unit",
            "enum" : [ "feet", "meters" ]
          },
          "siteContractValue" : {
            "type" : "integer",
            "description" : "The total amount of construction work performed during the project.",
            "format" : "int64"
          },
          "siteCreated" : {
            "type" : "string",
            "description" : "When the site was created.",
            "format" : "date-time"
          },
          "siteEndDate" : {
            "type" : "string",
            "description" : "The date that the project finished, or will finish.",
            "format" : "date"
          },
          "siteExternalId" : {
            "type" : "string",
            "description" : "The external ID for the site. Can be customized after enabling the custom link from site settings."
          },
          "siteGroupId" : {
            "type" : "string",
            "description" : "The unique ID for the site group. Note that site groups are optional, so this field can be null."
          },
          "siteGroupName" : {
            "type" : "string",
            "description" : "The name of the site group. Note that site groups are optional, so this field can be null."
          },
          "siteId" : {
            "type" : "string",
            "description" : "The unique ID for the site. Can be used to generate a hyperlink into OpenSpace."
          },
          "siteLatitude" : {
            "type" : "number",
            "description" : "The site latitude. Can be customized from site settings."
          },
          "siteLongitude" : {
            "type" : "number",
            "description" : "The site longitude. Can be customized from site settings."
          },
          "siteName" : {
            "type" : "string",
            "description" : "The site name."
          },
          "siteStartDate" : {
            "type" : "string",
            "description" : "The date that the project started, or will start.",
            "format" : "date"
          },
          "siteStatus" : {
            "type" : "string",
            "description" : "The status of the site."
          },
          "userCompanyNameCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCompanyNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCountryCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCountrySiteCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCreatedCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userCreatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userEmailCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userEmailSiteCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userFullNameCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userFullNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userIdCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userIdSiteCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userJobTitleCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userJobTitleSiteCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userLastLoginCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userLastLoginSiteCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userUpdatedCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          },
          "userUpdatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          }
        }
      },
      "ReportingFieldNotePageResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingFieldNote"
            }
          },
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          },
          "reportingPage" : {
            "$ref" : "#/components/schemas/ReportingPageReportingFieldNote"
          }
        }
      },
      "ReportingMembership" : {
        "required" : [ "isSiteSharedFolder", "organizationCreated", "organizationId", "organizationName", "role", "scopeType", "siteCreated", "siteId", "siteName" ],
        "type" : "object",
        "properties" : {
          "isSiteSharedFolder" : {
            "type" : "boolean",
            "description" : "Indicates if this site is a shared folder."
          },
          "membershipCreated" : {
            "type" : "string",
            "description" : "When the membership was created.",
            "format" : "date-time"
          },
          "membershipUpdated" : {
            "type" : "string",
            "description" : "When the membership was last updated.",
            "format" : "date-time"
          },
          "organizationCreated" : {
            "type" : "string",
            "description" : "When the organization was created.",
            "format" : "date-time"
          },
          "organizationId" : {
            "type" : "string",
            "description" : "The unique identifier for the organization. Can be used to generate a hyperlink."
          },
          "organizationName" : {
            "type" : "string",
            "description" : "The organization name."
          },
          "organizationUpdated" : {
            "type" : "string",
            "description" : "When the organization was last updated.",
            "format" : "date-time"
          },
          "role" : {
            "type" : "string",
            "description" : "The role name"
          },
          "scopeType" : {
            "type" : "string"
          },
          "siteAddress" : {
            "type" : "string",
            "description" : "The address of the site, as input into site settings."
          },
          "siteArea" : {
            "type" : "number",
            "description" : "Square value of the unit of measure.",
            "format" : "float"
          },
          "siteAreaUnitOfMeasure" : {
            "type" : "string",
            "description" : "Square feet or meters unit",
            "enum" : [ "feet", "meters" ]
          },
          "siteContractValue" : {
            "type" : "integer",
            "description" : "The total amount of construction work performed during the project.",
            "format" : "int64"
          },
          "siteCreated" : {
            "type" : "string",
            "description" : "When the site was created.",
            "format" : "date-time"
          },
          "siteEndDate" : {
            "type" : "string",
            "description" : "The date that the project finished, or will finish.",
            "format" : "date"
          },
          "siteExternalId" : {
            "type" : "string",
            "description" : "The external ID for the site. Can be customized after enabling the custom link from site settings."
          },
          "siteGroupId" : {
            "type" : "string",
            "description" : "The unique ID for the site group. Note that site groups are optional, so this field can be null."
          },
          "siteGroupName" : {
            "type" : "string",
            "description" : "The name of the site group. Note that site groups are optional, so this field can be null."
          },
          "siteId" : {
            "type" : "string",
            "description" : "The unique ID for the site. Can be used to generate a hyperlink into OpenSpace."
          },
          "siteLatitude" : {
            "type" : "number",
            "description" : "The site latitude. Can be customized from site settings."
          },
          "siteLongitude" : {
            "type" : "number",
            "description" : "The site longitude. Can be customized from site settings."
          },
          "siteName" : {
            "type" : "string",
            "description" : "The site name."
          },
          "siteStartDate" : {
            "type" : "string",
            "description" : "The date that the project started, or will start.",
            "format" : "date"
          },
          "siteStatus" : {
            "type" : "string",
            "description" : "The status of the site."
          },
          "userCompanyName" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCompanyNameMembershipCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCompanyNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCountry" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCountryMembershipCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCountrySiteCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCreated" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userCreatedMembershipCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userCreatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userEmail" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userEmailMembershipCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userEmailSiteCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userFullName" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userFullNameMembershipCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userFullNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userId" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userIdMembershipCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userIdSiteCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userJobTitle" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userJobTitleMembershipCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userJobTitleSiteCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userLastLogin" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userLastLoginMembershipCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userLastLoginSiteCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userUpdated" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          },
          "userUpdatedMembershipCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          },
          "userUpdatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          }
        }
      },
      "ReportingMembershipPageResponse" : {
        "required" : [ "content", "page" ],
        "type" : "object",
        "properties" : {
          "content" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ReportingMembership"
            }
          },
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageData"
          },
          "reportingPage" : {
            "$ref" : "#/components/schemas/ReportingPageReportingMembership"
          }
        }
      },
      "ReportingOrganization" : {
        "required" : [ "organizationCreated", "organizationId", "organizationName" ],
        "type" : "object",
        "properties" : {
          "organizationCreated" : {
            "type" : "string",
            "description" : "When the organization was created.",
            "format" : "date-time"
          },
          "organizationId" : {
            "type" : "string",
            "description" : "The unique identifier for the organization. Can be used to generate a hyperlink."
          },
          "organizationName" : {
            "type" : "string",
            "description" : "The organization name."
          },
          "organizationUpdated" : {
            "type" : "string",
            "description" : "When the organization was last updated.",
            "format" : "date-time"
          }
        }
      },
      "ReportingPageReporting360Video" : {
        "required" : [ "page" ],
        "type" : "object",
        "properties" : {
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageReporting360Video"
          }
        }
      },
      "ReportingPageReportingDroneImage" : {
        "required" : [ "page" ],
        "type" : "object",
        "properties" : {
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageReportingDroneImage"
          }
        }
      },
      "ReportingPageReportingFieldNote" : {
        "required" : [ "page" ],
        "type" : "object",
        "properties" : {
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageReportingFieldNote"
          }
        }
      },
      "ReportingPageReportingMembership" : {
        "required" : [ "page" ],
        "type" : "object",
        "properties" : {
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageReportingMembership"
          }
        }
      },
      "ReportingPageReportingOrganization" : {
        "required" : [ "page" ],
        "type" : "object",
        "properties" : {
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageReportingOrganization"
          }
        }
      },
      "ReportingPageReportingSheet" : {
        "required" : [ "page" ],
        "type" : "object",
        "properties" : {
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageReportingSheet"
          }
        }
      },
      "ReportingPageReportingSite" : {
        "required" : [ "page" ],
        "type" : "object",
        "properties" : {
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageReportingSite"
          }
        }
      },
      "ReportingPageReportingSiteEvent" : {
        "required" : [ "page" ],
        "type" : "object",
        "properties" : {
          "lastRefreshed" : {
            "type" : "string",
            "format" : "date-time"
          },
          "page" : {
            "$ref" : "#/components/schemas/PageReportingSiteEvent"
          }
        }
      },
      "ReportingSheet" : {
        "required" : [ "isSiteSharedFolder", "organizationCreated", "organizationId", "organizationName", "siteCreated", "siteId", "siteName" ],
        "type" : "object",
        "properties" : {
          "isSiteSharedFolder" : {
            "type" : "boolean",
            "description" : "Indicates if this site is a shared folder."
          },
          "organizationCreated" : {
            "type" : "string",
            "description" : "When the organization was created.",
            "format" : "date-time"
          },
          "organizationId" : {
            "type" : "string",
            "description" : "The unique identifier for the organization. Can be used to generate a hyperlink."
          },
          "organizationName" : {
            "type" : "string",
            "description" : "The organization name."
          },
          "organizationUpdated" : {
            "type" : "string",
            "description" : "When the organization was last updated.",
            "format" : "date-time"
          },
          "sheetCreated" : {
            "type" : "string",
            "description" : "When the sheet was uploaded.",
            "format" : "date-time"
          },
          "sheetDisplayOrder" : {
            "type" : "integer",
            "description" : "The display order of the sheet. Can be changed by dragging sheets around in Site Settings.",
            "format" : "int32"
          },
          "sheetId" : {
            "type" : "string",
            "description" : "The unique identifier for the sheet."
          },
          "sheetName" : {
            "type" : "string",
            "description" : "The sheet name."
          },
          "siteAddress" : {
            "type" : "string",
            "description" : "The address of the site, as input into site settings."
          },
          "siteArea" : {
            "type" : "number",
            "description" : "Square value of the unit of measure.",
            "format" : "float"
          },
          "siteAreaUnitOfMeasure" : {
            "type" : "string",
            "description" : "Square feet or meters unit",
            "enum" : [ "feet", "meters" ]
          },
          "siteContractValue" : {
            "type" : "integer",
            "description" : "The total amount of construction work performed during the project.",
            "format" : "int64"
          },
          "siteCreated" : {
            "type" : "string",
            "description" : "When the site was created.",
            "format" : "date-time"
          },
          "siteEndDate" : {
            "type" : "string",
            "description" : "The date that the project finished, or will finish.",
            "format" : "date"
          },
          "siteExternalId" : {
            "type" : "string",
            "description" : "The external ID for the site. Can be customized after enabling the custom link from site settings."
          },
          "siteGroupId" : {
            "type" : "string",
            "description" : "The unique ID for the site group. Note that site groups are optional, so this field can be null."
          },
          "siteGroupName" : {
            "type" : "string",
            "description" : "The name of the site group. Note that site groups are optional, so this field can be null."
          },
          "siteId" : {
            "type" : "string",
            "description" : "The unique ID for the site. Can be used to generate a hyperlink into OpenSpace."
          },
          "siteLatitude" : {
            "type" : "number",
            "description" : "The site latitude. Can be customized from site settings."
          },
          "siteLongitude" : {
            "type" : "number",
            "description" : "The site longitude. Can be customized from site settings."
          },
          "siteName" : {
            "type" : "string",
            "description" : "The site name."
          },
          "siteStartDate" : {
            "type" : "string",
            "description" : "The date that the project started, or will start.",
            "format" : "date"
          },
          "siteStatus" : {
            "type" : "string",
            "description" : "The status of the site."
          },
          "userCompanyNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCountrySiteCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCreatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userEmailSiteCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userFullNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userIdSiteCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userJobTitleSiteCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userLastLoginSiteCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userUpdatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          }
        }
      },
      "ReportingSite" : {
        "required" : [ "isSiteSharedFolder", "organizationCreated", "organizationId", "organizationName", "siteCreated", "siteId", "siteName" ],
        "type" : "object",
        "properties" : {
          "isSiteSharedFolder" : {
            "type" : "boolean",
            "description" : "Indicates if this site is a shared folder."
          },
          "organizationCreated" : {
            "type" : "string",
            "description" : "When the organization was created.",
            "format" : "date-time"
          },
          "organizationId" : {
            "type" : "string",
            "description" : "The unique identifier for the organization. Can be used to generate a hyperlink."
          },
          "organizationName" : {
            "type" : "string",
            "description" : "The organization name."
          },
          "organizationUpdated" : {
            "type" : "string",
            "description" : "When the organization was last updated.",
            "format" : "date-time"
          },
          "siteAddress" : {
            "type" : "string",
            "description" : "The address of the site, as input into site settings."
          },
          "siteArea" : {
            "type" : "number",
            "description" : "Square value of the unit of measure.",
            "format" : "float"
          },
          "siteAreaUnitOfMeasure" : {
            "type" : "string",
            "description" : "Square feet or meters unit",
            "enum" : [ "feet", "meters" ]
          },
          "siteContractValue" : {
            "type" : "integer",
            "description" : "The total amount of construction work performed during the project.",
            "format" : "int64"
          },
          "siteCreated" : {
            "type" : "string",
            "description" : "When the site was created.",
            "format" : "date-time"
          },
          "siteEndDate" : {
            "type" : "string",
            "description" : "The date that the project finished, or will finish.",
            "format" : "date"
          },
          "siteExternalId" : {
            "type" : "string",
            "description" : "The external ID for the site. Can be customized after enabling the custom link from site settings."
          },
          "siteGroupId" : {
            "type" : "string",
            "description" : "The unique ID for the site group. Note that site groups are optional, so this field can be null."
          },
          "siteGroupName" : {
            "type" : "string",
            "description" : "The name of the site group. Note that site groups are optional, so this field can be null."
          },
          "siteId" : {
            "type" : "string",
            "description" : "The unique ID for the site. Can be used to generate a hyperlink into OpenSpace."
          },
          "siteLatitude" : {
            "type" : "number",
            "description" : "The site latitude. Can be customized from site settings."
          },
          "siteLongitude" : {
            "type" : "number",
            "description" : "The site longitude. Can be customized from site settings."
          },
          "siteName" : {
            "type" : "string",
            "description" : "The site name."
          },
          "siteStartDate" : {
            "type" : "string",
            "description" : "The date that the project started, or will start.",
            "format" : "date"
          },
          "siteStatus" : {
            "type" : "string",
            "description" : "The status of the site."
          },
          "userCompanyNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCountrySiteCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCreatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userEmailSiteCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userFullNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userIdSiteCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userJobTitleSiteCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userLastLoginSiteCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userUpdatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          }
        }
      },
      "ReportingSiteEvent" : {
        "required" : [ "isSiteSharedFolder", "organizationCreated", "organizationId", "organizationName", "siteCreated", "siteEventCreated", "siteEventId", "siteId", "siteName" ],
        "type" : "object",
        "properties" : {
          "isSiteSharedFolder" : {
            "type" : "boolean",
            "description" : "Indicates if this site is a shared folder."
          },
          "organizationCreated" : {
            "type" : "string",
            "description" : "When the organization was created.",
            "format" : "date-time"
          },
          "organizationId" : {
            "type" : "string",
            "description" : "The unique identifier for the organization. Can be used to generate a hyperlink."
          },
          "organizationName" : {
            "type" : "string",
            "description" : "The organization name."
          },
          "organizationUpdated" : {
            "type" : "string",
            "description" : "When the organization was last updated.",
            "format" : "date-time"
          },
          "siteAddress" : {
            "type" : "string",
            "description" : "The address of the site, as input into site settings."
          },
          "siteArea" : {
            "type" : "number",
            "description" : "Square value of the unit of measure.",
            "format" : "float"
          },
          "siteAreaUnitOfMeasure" : {
            "type" : "string",
            "description" : "Square feet or meters unit",
            "enum" : [ "feet", "meters" ]
          },
          "siteContractValue" : {
            "type" : "integer",
            "description" : "The total amount of construction work performed during the project.",
            "format" : "int64"
          },
          "siteCreated" : {
            "type" : "string",
            "description" : "When the site was created.",
            "format" : "date-time"
          },
          "siteEndDate" : {
            "type" : "string",
            "description" : "The date that the project finished, or will finish.",
            "format" : "date"
          },
          "siteEventCreated" : {
            "type" : "string",
            "description" : "When the site event took place. Counting distinct dates and sites with engagement, rather than counting this column, is recommended.",
            "format" : "date-time"
          },
          "siteEventId" : {
            "type" : "string",
            "description" : "The unique identifier for the site event.  Counting distinct dates and sites with engagement, rather than counting this column, is recommended."
          },
          "siteExternalId" : {
            "type" : "string",
            "description" : "The external ID for the site. Can be customized after enabling the custom link from site settings."
          },
          "siteGroupId" : {
            "type" : "string",
            "description" : "The unique ID for the site group. Note that site groups are optional, so this field can be null."
          },
          "siteGroupName" : {
            "type" : "string",
            "description" : "The name of the site group. Note that site groups are optional, so this field can be null."
          },
          "siteId" : {
            "type" : "string",
            "description" : "The unique ID for the site. Can be used to generate a hyperlink into OpenSpace."
          },
          "siteLatitude" : {
            "type" : "number",
            "description" : "The site latitude. Can be customized from site settings."
          },
          "siteLongitude" : {
            "type" : "number",
            "description" : "The site longitude. Can be customized from site settings."
          },
          "siteName" : {
            "type" : "string",
            "description" : "The site name."
          },
          "siteStartDate" : {
            "type" : "string",
            "description" : "The date that the project started, or will start.",
            "format" : "date"
          },
          "siteStatus" : {
            "type" : "string",
            "description" : "The status of the site."
          },
          "userCompanyName" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCompanyNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's company name."
          },
          "userCountry" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCountrySiteCreator" : {
            "type" : "string",
            "description" : "The user's country."
          },
          "userCreated" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userCreatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was created.",
            "format" : "date-time"
          },
          "userEmail" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userEmailSiteCreator" : {
            "type" : "string",
            "description" : "The user's email."
          },
          "userFullName" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userFullNameSiteCreator" : {
            "type" : "string",
            "description" : "The user's full name."
          },
          "userId" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userIdSiteCreator" : {
            "type" : "string",
            "description" : "The user's unique identifier."
          },
          "userJobTitle" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userJobTitleSiteCreator" : {
            "type" : "string",
            "description" : "The user's job title."
          },
          "userLastLogin" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userLastLoginSiteCreator" : {
            "type" : "string",
            "description" : "The last time the user logged in, if ever.",
            "format" : "date-time"
          },
          "userUpdated" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          },
          "userUpdatedSiteCreator" : {
            "type" : "string",
            "description" : "When the user was last updated.",
            "format" : "date-time"
          }
        }
      },
      "SheetEstimate" : {
        "required" : [ "id", "sizeEstimate" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "sizeEstimate" : {
            "$ref" : "#/components/schemas/Vec3"
          },
          "sizeEstimateMethod" : {
            "type" : "string"
          }
        },
        "description" : "The sheet estimate information"
      },
      "SortObject" : {
        "type" : "object",
        "properties" : {
          "empty" : {
            "type" : "boolean"
          },
          "sorted" : {
            "type" : "boolean"
          },
          "unsorted" : {
            "type" : "boolean"
          }
        }
      },
      "Type" : {
        "type" : "string",
        "description" : "The sheet type",
        "enum" : [ "plan", "elevation" ]
      },
      "Vec3" : {
        "maxItems" : 3,
        "minItems" : 3,
        "type" : "array",
        "description" : "3-element vector as [x, y, z] array",
        "example" : [ 0.0, 0.0, 0.0 ],
        "items" : {
          "type" : "number"
        }
      },
      "VoiceCapturePublishedPayload" : {
        "required" : [ "captureSessionId", "eventType", "siteId", "voiceCaptureId" ],
        "type" : "object",
        "allOf" : [ {
          "$ref" : "#/components/schemas/WebhookEventPayload"
        }, {
          "type" : "object",
          "properties" : {
            "captureSessionId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "siteId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            },
            "voiceCaptureId" : {
              "pattern" : "[0-9A-Za-z_-]{22}",
              "type" : "string"
            }
          }
        } ]
      },
      "WebhookDeliveryError" : {
        "type" : "string",
        "description" : "Type of error that occurred (if any)",
        "enum" : [ "none", "connectionError", "responseError", "timeout", "securityError", "internalError", "circuitBreakerSkip" ]
      },
      "WebhookDeliveryStatus" : {
        "type" : "string",
        "description" : "Current status of the delivery",
        "enum" : [ "pending", "delivering", "delivered", "failed", "circuitBreakerOpen" ]
      },
      "WebhookEventPayload" : {
        "required" : [ "eventType" ],
        "type" : "object",
        "properties" : {
          "eventType" : {
            "$ref" : "#/components/schemas/WebhookEventType"
          }
        },
        "description" : "The event payload that was delivered",
        "discriminator" : {
          "mapping" : {
            "capture:published" : "#/components/schemas/CapturePublishedPayload",
            "field_note:created" : "#/components/schemas/FieldNoteCreatedPayload",
            "field_note:deleted" : "#/components/schemas/FieldNoteDeletedPayload",
            "field_note:updated" : "#/components/schemas/FieldNoteUpdatedPayload",
            "field_note_attachment:created" : "#/components/schemas/FieldNoteAttachmentCreatedPayload",
            "field_note_attachment:deleted" : "#/components/schemas/FieldNoteAttachmentDeletedPayload",
            "field_note_comment:created" : "#/components/schemas/FieldNoteCommentCreatedPayload",
            "field_note_comment:deleted" : "#/components/schemas/FieldNoteCommentDeletedPayload",
            "field_note_comment:updated" : "#/components/schemas/FieldNoteCommentUpdatedPayload",
            "voice_capture:published" : "#/components/schemas/VoiceCapturePublishedPayload"
          },
          "propertyName" : "eventType"
        },
        "oneOf" : [ {
          "$ref" : "#/components/schemas/FieldNoteCreatedPayload"
        }, {
          "$ref" : "#/components/schemas/FieldNoteDeletedPayload"
        }, {
          "$ref" : "#/components/schemas/FieldNoteUpdatedPayload"
        }, {
          "$ref" : "#/components/schemas/FieldNoteCommentCreatedPayload"
        }, {
          "$ref" : "#/components/schemas/FieldNoteCommentUpdatedPayload"
        }, {
          "$ref" : "#/components/schemas/FieldNoteCommentDeletedPayload"
        }, {
          "$ref" : "#/components/schemas/FieldNoteAttachmentCreatedPayload"
        }, {
          "$ref" : "#/components/schemas/FieldNoteAttachmentDeletedPayload"
        }, {
          "$ref" : "#/components/schemas/CapturePublishedPayload"
        }, {
          "$ref" : "#/components/schemas/VoiceCapturePublishedPayload"
        } ]
      },
      "WebhookEventType" : {
        "type" : "string",
        "description" : "Event type to subscribe to",
        "enum" : [ "field_note:created", "field_note:deleted", "field_note:updated", "field_note_comment:created", "field_note_comment:updated", "field_note_comment:deleted", "field_note_attachment:created", "field_note_attachment:deleted", "capture:published", "voice_capture:published" ]
      },
      "WebhookRuleAction" : {
        "type" : "string",
        "description" : "Action to take when this rule matches (ALLOW or DENY)",
        "enum" : [ "allow", "deny" ]
      },
      "WebhookRuleScope" : {
        "type" : "string",
        "description" : "Scope level at which this rule applies (ORGANIZATION, SITE_GROUP, or SITE)",
        "enum" : [ "site", "siteGroup", "organization" ]
      },
      "WebhookStatus" : {
        "type" : "string",
        "description" : "Initial status of the webhook (defaults to ENABLED)",
        "enum" : [ "enabled", "disabled" ]
      },
      "WebhookVerificationState" : {
        "type" : "string",
        "description" : "Verification status of the webhook endpoint",
        "enum" : [ "verified", "notVerified", "verificationError" ]
      }
    },
    "securitySchemes" : {
      "api-key" : {
        "in" : "header",
        "name" : "api-key",
        "type" : "apiKey"
      },
      "jwt-auth" : {
        "bearerFormat" : "jwt",
        "scheme" : "bearer",
        "type" : "http"
      }
    }
  }
}