# GCP

Ground Control Point management

## GET /gcp

> List GCPs

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/gcp":{"get":{"summary":"List GCPs","tags":["GCP"],"parameters":[{"name":"zoneId","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"List of GCPs","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GCP"}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"GCP":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"gcpType":{"type":"string","enum":["SINGLE","MULTIPLE"]},"altitude":{"type":"number","nullable":true},"aprilTagId":{"type":"integer","nullable":true,"minimum":0,"maximum":50},"gcpData":{"type":"string","nullable":true},"photoUrls":{"type":"array","items":{"type":"string"}},"zoneId":{"type":"integer","nullable":true},"pin":{"$ref":"#/components/schemas/Pin","nullable":true},"zone":{"type":"object","nullable":true,"properties":{"id":{"type":"integer"},"title":{"type":"string"}}},"uploadedFiles":{"type":"array","items":{"$ref":"#/components/schemas/UploadedFile"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Pin":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"geoPose":{"type":"object","description":"JSON object containing geographic position and orientation data"},"contentType":{"type":"string","enum":["APK","GLB","IMAGE","VIDEO","URL","LENS","GCP","AUDIO","USDZ","BIN"]},"contentUrl":{"type":"string"},"localizationData":{"type":"object","nullable":true,"description":"ARWorld localization data for iOS AR experiences","properties":{"trackingMode":{"type":"string","enum":["WORLD","GEO"],"description":"AR tracking mode for the pin"},"worldmapURL":{"type":"string","format":"uri","nullable":true,"description":"S3 URL of the ARWorld binary data"}}},"zoneId":{"type":"integer","nullable":true},"gcpId":{"type":"integer","nullable":true},"userId":{"type":"string","nullable":true},"visibility":{"type":"string","enum":["public","private","friends"],"description":"Pin visibility setting"},"relocalizationPhotoUrl":{"type":"string","nullable":true,"description":"URL of the relocalization reference photo"},"scanInstructions":{"type":"string","nullable":true,"description":"Instructions for scanning/relocalizing"},"cameraPoseHint":{"type":"object","nullable":true,"description":"Camera pose hint for AR relocalization"},"blockchainSignature":{"type":"string","nullable":true},"blockchainTxUrl":{"type":"string","nullable":true},"blockchainSyncedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UploadedFile":{"type":"object","properties":{"id":{"type":"integer"},"fileName":{"type":"string"},"fileUrl":{"type":"string"},"fileSize":{"type":"integer","nullable":true},"mimeType":{"type":"string","nullable":true},"bucketPath":{"type":"string","nullable":true},"gcpId":{"type":"integer","nullable":true},"userId":{"type":"string","nullable":true},"uploadedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}},"responses":{"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

## POST /gcp

> Create a new GCP (Ground Control Point)

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/gcp":{"post":{"summary":"Create a new GCP (Ground Control Point)","tags":["GCP"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GCPCreateRequest"}}}},"responses":{"201":{"description":"GCP created","content":{"application/json":{"schema":{"type":"object","properties":{"gcp":{"$ref":"#/components/schemas/GCP"},"pin":{"$ref":"#/components/schemas/Pin"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"GCPCreateRequest":{"type":"object","required":["title","gcpType","geoPose"],"properties":{"title":{"type":"string"},"description":{"type":"string"},"gcpType":{"type":"string","enum":["SINGLE","MULTIPLE"]},"geoPose":{"$ref":"#/components/schemas/GeoPose"},"altitude":{"type":"number"},"aprilTagId":{"type":"integer","minimum":0,"maximum":50},"gcpData":{"type":"string"},"photoUrls":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":3},"uploadedFileIds":{"type":"array","items":{"type":"integer"}},"zoneId":{"type":"integer"}}},"GeoPose":{"type":"object","required":["position","angles"],"properties":{"position":{"$ref":"#/components/schemas/Position"},"angles":{"$ref":"#/components/schemas/YprAngles"}}},"Position":{"type":"object","required":["lat","lon"],"properties":{"lat":{"type":"number","description":"Latitude in decimal degrees"},"lon":{"type":"number","description":"Longitude in decimal degrees"},"h":{"type":"number","description":"Height/altitude in meters","default":0}}},"YprAngles":{"type":"object","required":["yaw","pitch","roll"],"properties":{"yaw":{"type":"number","description":"Yaw angle in degrees","default":0},"pitch":{"type":"number","description":"Pitch angle in degrees","default":0},"roll":{"type":"number","description":"Roll angle in degrees","default":0}}},"GCP":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"gcpType":{"type":"string","enum":["SINGLE","MULTIPLE"]},"altitude":{"type":"number","nullable":true},"aprilTagId":{"type":"integer","nullable":true,"minimum":0,"maximum":50},"gcpData":{"type":"string","nullable":true},"photoUrls":{"type":"array","items":{"type":"string"}},"zoneId":{"type":"integer","nullable":true},"pin":{"$ref":"#/components/schemas/Pin","nullable":true},"zone":{"type":"object","nullable":true,"properties":{"id":{"type":"integer"},"title":{"type":"string"}}},"uploadedFiles":{"type":"array","items":{"$ref":"#/components/schemas/UploadedFile"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Pin":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"geoPose":{"type":"object","description":"JSON object containing geographic position and orientation data"},"contentType":{"type":"string","enum":["APK","GLB","IMAGE","VIDEO","URL","LENS","GCP","AUDIO","USDZ","BIN"]},"contentUrl":{"type":"string"},"localizationData":{"type":"object","nullable":true,"description":"ARWorld localization data for iOS AR experiences","properties":{"trackingMode":{"type":"string","enum":["WORLD","GEO"],"description":"AR tracking mode for the pin"},"worldmapURL":{"type":"string","format":"uri","nullable":true,"description":"S3 URL of the ARWorld binary data"}}},"zoneId":{"type":"integer","nullable":true},"gcpId":{"type":"integer","nullable":true},"userId":{"type":"string","nullable":true},"visibility":{"type":"string","enum":["public","private","friends"],"description":"Pin visibility setting"},"relocalizationPhotoUrl":{"type":"string","nullable":true,"description":"URL of the relocalization reference photo"},"scanInstructions":{"type":"string","nullable":true,"description":"Instructions for scanning/relocalizing"},"cameraPoseHint":{"type":"object","nullable":true,"description":"Camera pose hint for AR relocalization"},"blockchainSignature":{"type":"string","nullable":true},"blockchainTxUrl":{"type":"string","nullable":true},"blockchainSyncedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UploadedFile":{"type":"object","properties":{"id":{"type":"integer"},"fileName":{"type":"string"},"fileUrl":{"type":"string"},"fileSize":{"type":"integer","nullable":true},"mimeType":{"type":"string","nullable":true},"bucketPath":{"type":"string","nullable":true},"gcpId":{"type":"integer","nullable":true},"userId":{"type":"string","nullable":true},"uploadedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

## PUT /gcp/{id}

> Update a GCP

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/gcp/{id}":{"put":{"summary":"Update a GCP","tags":["GCP"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GCPUpdateRequest"}}}},"responses":{"200":{"description":"GCP updated","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"gcp":{"$ref":"#/components/schemas/GCP"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"April tag conflict"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"GCPUpdateRequest":{"type":"object","required":["title","geoPose"],"properties":{"title":{"type":"string"},"description":{"type":"string","nullable":true},"geoPose":{"$ref":"#/components/schemas/GeoPose"},"altitude":{"type":"number","nullable":true},"aprilTagId":{"type":"integer","nullable":true,"minimum":0,"maximum":50},"photoUrls":{"type":"array","items":{"type":"string","format":"uri"}}}},"GeoPose":{"type":"object","required":["position","angles"],"properties":{"position":{"$ref":"#/components/schemas/Position"},"angles":{"$ref":"#/components/schemas/YprAngles"}}},"Position":{"type":"object","required":["lat","lon"],"properties":{"lat":{"type":"number","description":"Latitude in decimal degrees"},"lon":{"type":"number","description":"Longitude in decimal degrees"},"h":{"type":"number","description":"Height/altitude in meters","default":0}}},"YprAngles":{"type":"object","required":["yaw","pitch","roll"],"properties":{"yaw":{"type":"number","description":"Yaw angle in degrees","default":0},"pitch":{"type":"number","description":"Pitch angle in degrees","default":0},"roll":{"type":"number","description":"Roll angle in degrees","default":0}}},"GCP":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"gcpType":{"type":"string","enum":["SINGLE","MULTIPLE"]},"altitude":{"type":"number","nullable":true},"aprilTagId":{"type":"integer","nullable":true,"minimum":0,"maximum":50},"gcpData":{"type":"string","nullable":true},"photoUrls":{"type":"array","items":{"type":"string"}},"zoneId":{"type":"integer","nullable":true},"pin":{"$ref":"#/components/schemas/Pin","nullable":true},"zone":{"type":"object","nullable":true,"properties":{"id":{"type":"integer"},"title":{"type":"string"}}},"uploadedFiles":{"type":"array","items":{"$ref":"#/components/schemas/UploadedFile"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Pin":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"geoPose":{"type":"object","description":"JSON object containing geographic position and orientation data"},"contentType":{"type":"string","enum":["APK","GLB","IMAGE","VIDEO","URL","LENS","GCP","AUDIO","USDZ","BIN"]},"contentUrl":{"type":"string"},"localizationData":{"type":"object","nullable":true,"description":"ARWorld localization data for iOS AR experiences","properties":{"trackingMode":{"type":"string","enum":["WORLD","GEO"],"description":"AR tracking mode for the pin"},"worldmapURL":{"type":"string","format":"uri","nullable":true,"description":"S3 URL of the ARWorld binary data"}}},"zoneId":{"type":"integer","nullable":true},"gcpId":{"type":"integer","nullable":true},"userId":{"type":"string","nullable":true},"visibility":{"type":"string","enum":["public","private","friends"],"description":"Pin visibility setting"},"relocalizationPhotoUrl":{"type":"string","nullable":true,"description":"URL of the relocalization reference photo"},"scanInstructions":{"type":"string","nullable":true,"description":"Instructions for scanning/relocalizing"},"cameraPoseHint":{"type":"object","nullable":true,"description":"Camera pose hint for AR relocalization"},"blockchainSignature":{"type":"string","nullable":true},"blockchainTxUrl":{"type":"string","nullable":true},"blockchainSyncedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UploadedFile":{"type":"object","properties":{"id":{"type":"integer"},"fileName":{"type":"string"},"fileUrl":{"type":"string"},"fileSize":{"type":"integer","nullable":true},"mimeType":{"type":"string","nullable":true},"bucketPath":{"type":"string","nullable":true},"gcpId":{"type":"integer","nullable":true},"userId":{"type":"string","nullable":true},"uploadedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

## DELETE /gcp/{id}/remove-photo

> Remove a photo from a GCP

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/gcp/{id}/remove-photo":{"delete":{"summary":"Remove a photo from a GCP","tags":["GCP"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"photoUrl","in":"query","required":true,"schema":{"type":"string","format":"uri"}}],"responses":{"200":{"description":"Photo removed successfully"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}}}}
```

## GET /gcp/check-april-tag

> Check April tag availability

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/gcp/check-april-tag":{"get":{"summary":"Check April tag availability","tags":["GCP"],"parameters":[{"name":"aprilTagId","in":"query","required":true,"schema":{"type":"integer","minimum":0,"maximum":50}},{"name":"latitude","in":"query","schema":{"type":"number"}},{"name":"longitude","in":"query","schema":{"type":"number"}},{"name":"excludeGcpId","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"April tag validation result","content":{"application/json":{"schema":{"type":"object","properties":{"available":{"type":"boolean"},"conflicts":{"type":"array","items":{"type":"object"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}}}}
```

## POST /gcp/upload

> Upload GCP CSV file

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/gcp/upload":{"post":{"summary":"Upload GCP CSV file","tags":["GCP"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["fileName","fileUrl","zoneId"],"properties":{"fileName":{"type":"string"},"fileUrl":{"type":"string"},"zoneId":{"type":"integer"},"rowCount":{"type":"integer"},"userId":{"type":"string"}}}}}},"responses":{"200":{"description":"CSV upload processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CSVUpload"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"CSVUpload":{"type":"object","properties":{"id":{"type":"string"},"fileName":{"type":"string"},"fileUrl":{"type":"string"},"status":{"type":"string","enum":["PENDING","COMPLETED","FAILED"]},"errorMessage":{"type":"string","nullable":true},"rowCount":{"type":"integer","nullable":true},"processedRows":{"type":"integer","nullable":true},"userId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

## GET /gcp/zone/{zoneId}

> Get CSV uploads for a zone

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/gcp/zone/{zoneId}":{"get":{"summary":"Get CSV uploads for a zone","tags":["GCP"],"parameters":[{"name":"zoneId","in":"path","required":true,"schema":{"type":"integer"}},{"name":"userId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"List of CSV files for zone","content":{"application/json":{"schema":{"type":"object","properties":{"zoneId":{"type":"integer"},"zoneName":{"type":"string"},"csvFiles":{"type":"array","items":{"$ref":"#/components/schemas/CSVUpload"}},"totalFiles":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"CSVUpload":{"type":"object","properties":{"id":{"type":"string"},"fileName":{"type":"string"},"fileUrl":{"type":"string"},"status":{"type":"string","enum":["PENDING","COMPLETED","FAILED"]},"errorMessage":{"type":"string","nullable":true},"rowCount":{"type":"integer","nullable":true},"processedRows":{"type":"integer","nullable":true},"userId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

## DELETE /gcp/zone/{zoneId}

> Delete a CSV file from a zone

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/gcp/zone/{zoneId}":{"delete":{"summary":"Delete a CSV file from a zone","tags":["GCP"],"parameters":[{"name":"zoneId","in":"path","required":true,"schema":{"type":"integer"}},{"name":"userId","in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["csvUploadId"],"properties":{"csvUploadId":{"type":"string"}}}}}},"responses":{"200":{"description":"CSV file deleted"},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}}}}
```

## GET /upload/gcp-photos

> Get uploaded files for a GCP

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/upload/gcp-photos":{"get":{"summary":"Get uploaded files for a GCP","tags":["GCP"],"parameters":[{"name":"gcpId","in":"query","required":true,"schema":{"type":"integer"}},{"name":"userId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"List of uploaded files","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"files":{"type":"array","items":{"$ref":"#/components/schemas/UploadedFile"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"UploadedFile":{"type":"object","properties":{"id":{"type":"integer"},"fileName":{"type":"string"},"fileUrl":{"type":"string"},"fileSize":{"type":"integer","nullable":true},"mimeType":{"type":"string","nullable":true},"bucketPath":{"type":"string","nullable":true},"gcpId":{"type":"integer","nullable":true},"userId":{"type":"string","nullable":true},"uploadedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

## POST /upload/gcp-photos

> Upload GCP photos

```json
{"openapi":"3.0.0","info":{"title":"Zones API","version":"1.0.0"},"tags":[{"name":"GCP","description":"Ground Control Point management"}],"servers":[{"url":"/api","description":"API base path"}],"paths":{"/upload/gcp-photos":{"post":{"summary":"Upload GCP photos","tags":["GCP"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["files"],"properties":{"files":{"type":"array","items":{"type":"string","format":"binary"},"maxItems":3},"gcpId":{"type":"string"},"userId":{"type":"string"}}}}}},"responses":{"200":{"description":"Photos uploaded successfully","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"files":{"type":"array","items":{"$ref":"#/components/schemas/UploadedFile"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"UploadedFile":{"type":"object","properties":{"id":{"type":"integer"},"fileName":{"type":"string"},"fileUrl":{"type":"string"},"fileSize":{"type":"integer","nullable":true},"mimeType":{"type":"string","nullable":true},"bucketPath":{"type":"string","nullable":true},"gcpId":{"type":"integer","nullable":true},"userId":{"type":"string","nullable":true},"uploadedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"object"}}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.meshmap.com/api/zones/gcp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
