GCP
Ground Control Point management
Query parameters
zoneIdintegerOptional
Responses
200
List of GCPs
application/json
500
Internal server error
application/json
get
/gcpGET /api/gcp HTTP/1.1
Host: 
Accept: */*
[
  {
    "id": 1,
    "title": "text",
    "description": "text",
    "gcpType": "SINGLE",
    "altitude": 1,
    "aprilTagId": 1,
    "gcpData": "text",
    "photoUrls": [
      "text"
    ],
    "zoneId": 1,
    "pin": {
      "id": 1,
      "title": "text",
      "latitude": 1,
      "longitude": 1,
      "geoPose": {},
      "contentType": "APK",
      "contentUrl": "text",
      "localizationData": {
        "trackingMode": "WORLD",
        "worldmapURL": "https://example.com"
      },
      "zoneId": 1,
      "gcpId": 1,
      "createdAt": "2025-10-30T17:41:36.958Z",
      "updatedAt": "2025-10-30T17:41:36.958Z"
    },
    "zone": {
      "id": 1,
      "title": "text"
    },
    "uploadedFiles": [
      {
        "id": 1,
        "fileName": "text",
        "fileUrl": "text",
        "fileSize": 1,
        "mimeType": "text",
        "bucketPath": "text",
        "gcpId": 1,
        "userId": "text",
        "uploadedAt": "2025-10-30T17:41:36.958Z"
      }
    ],
    "createdAt": "2025-10-30T17:41:36.958Z",
    "updatedAt": "2025-10-30T17:41:36.958Z"
  }
]Body
titlestringRequired
descriptionstringOptional
gcpTypestring · enumRequiredPossible values: 
altitudenumberOptional
aprilTagIdinteger · max: 50Optional
gcpDatastringOptional
photoUrlsstring · uri[] · max: 3Optional
uploadedFileIdsinteger[]Optional
zoneIdintegerOptional
Responses
201
GCP created
application/json
400
Bad request
application/json
500
Internal server error
application/json
post
/gcpPOST /api/gcp HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 255
{
  "title": "text",
  "description": "text",
  "gcpType": "SINGLE",
  "geoPose": {
    "position": {
      "lat": 1,
      "lon": 1,
      "h": 0
    },
    "angles": {
      "yaw": 0,
      "pitch": 0,
      "roll": 0
    }
  },
  "altitude": 1,
  "aprilTagId": 1,
  "gcpData": "text",
  "photoUrls": [
    "https://example.com"
  ],
  "uploadedFileIds": [
    1
  ],
  "zoneId": 1
}{
  "gcp": {
    "id": 1,
    "title": "text",
    "description": "text",
    "gcpType": "SINGLE",
    "altitude": 1,
    "aprilTagId": 1,
    "gcpData": "text",
    "photoUrls": [
      "text"
    ],
    "zoneId": 1,
    "pin": {
      "id": 1,
      "title": "text",
      "latitude": 1,
      "longitude": 1,
      "geoPose": {},
      "contentType": "APK",
      "contentUrl": "text",
      "localizationData": {
        "trackingMode": "WORLD",
        "worldmapURL": "https://example.com"
      },
      "zoneId": 1,
      "gcpId": 1,
      "createdAt": "2025-10-30T17:41:36.958Z",
      "updatedAt": "2025-10-30T17:41:36.958Z"
    },
    "zone": {
      "id": 1,
      "title": "text"
    },
    "uploadedFiles": [
      {
        "id": 1,
        "fileName": "text",
        "fileUrl": "text",
        "fileSize": 1,
        "mimeType": "text",
        "bucketPath": "text",
        "gcpId": 1,
        "userId": "text",
        "uploadedAt": "2025-10-30T17:41:36.958Z"
      }
    ],
    "createdAt": "2025-10-30T17:41:36.958Z",
    "updatedAt": "2025-10-30T17:41:36.958Z"
  },
  "pin": {
    "id": 1,
    "title": "text",
    "latitude": 1,
    "longitude": 1,
    "geoPose": {},
    "contentType": "APK",
    "contentUrl": "text",
    "localizationData": {
      "trackingMode": "WORLD",
      "worldmapURL": "https://example.com"
    },
    "zoneId": 1,
    "gcpId": 1,
    "createdAt": "2025-10-30T17:41:36.958Z",
    "updatedAt": "2025-10-30T17:41:36.958Z"
  }
}Path parameters
idintegerRequired
Body
titlestringRequired
descriptionstring | nullableOptional
altitudenumber | nullableOptional
aprilTagIdinteger | nullableOptional
photoUrlsstring · uri[]Optional
Responses
200
GCP updated
application/json
400
Bad request
application/json
404
Resource not found
application/json
409
April tag conflict
500
Internal server error
application/json
put
/gcp/{id}PUT /api/gcp/{id} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 186
{
  "title": "text",
  "description": "text",
  "geoPose": {
    "position": {
      "lat": 1,
      "lon": 1,
      "h": 0
    },
    "angles": {
      "yaw": 0,
      "pitch": 0,
      "roll": 0
    }
  },
  "altitude": 1,
  "aprilTagId": 1,
  "photoUrls": [
    "https://example.com"
  ]
}{
  "message": "text",
  "gcp": {
    "id": 1,
    "title": "text",
    "description": "text",
    "gcpType": "SINGLE",
    "altitude": 1,
    "aprilTagId": 1,
    "gcpData": "text",
    "photoUrls": [
      "text"
    ],
    "zoneId": 1,
    "pin": {
      "id": 1,
      "title": "text",
      "latitude": 1,
      "longitude": 1,
      "geoPose": {},
      "contentType": "APK",
      "contentUrl": "text",
      "localizationData": {
        "trackingMode": "WORLD",
        "worldmapURL": "https://example.com"
      },
      "zoneId": 1,
      "gcpId": 1,
      "createdAt": "2025-10-30T17:41:36.958Z",
      "updatedAt": "2025-10-30T17:41:36.958Z"
    },
    "zone": {
      "id": 1,
      "title": "text"
    },
    "uploadedFiles": [
      {
        "id": 1,
        "fileName": "text",
        "fileUrl": "text",
        "fileSize": 1,
        "mimeType": "text",
        "bucketPath": "text",
        "gcpId": 1,
        "userId": "text",
        "uploadedAt": "2025-10-30T17:41:36.958Z"
      }
    ],
    "createdAt": "2025-10-30T17:41:36.958Z",
    "updatedAt": "2025-10-30T17:41:36.958Z"
  }
}Path parameters
idintegerRequired
Query parameters
photoUrlstring · uriRequired
Responses
200
Photo removed successfully
No content
400
Bad request
application/json
404
Resource not found
application/json
500
Internal server error
application/json
delete
/gcp/{id}/remove-photoDELETE /api/gcp/{id}/remove-photo?photoUrl=https%3A%2F%2Fexample.com HTTP/1.1
Host: 
Accept: */*
No content
Query parameters
aprilTagIdinteger · max: 50Required
latitudenumberOptional
longitudenumberOptional
excludeGcpIdintegerOptional
Responses
200
April tag validation result
application/json
400
Bad request
application/json
500
Internal server error
application/json
get
/gcp/check-april-tagGET /api/gcp/check-april-tag?aprilTagId=1 HTTP/1.1
Host: 
Accept: */*
{
  "available": true,
  "conflicts": [
    {}
  ]
}Body
fileNamestringRequired
fileUrlstringRequired
zoneIdintegerRequired
rowCountintegerOptional
userIdstringOptional
Responses
200
CSV upload processed
application/json
400
Bad request
application/json
401
Unauthorized
application/json
404
Resource not found
application/json
500
Internal server error
application/json
post
/gcp/uploadPOST /api/gcp/upload HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 76
{
  "fileName": "text",
  "fileUrl": "text",
  "zoneId": 1,
  "rowCount": 1,
  "userId": "text"
}{
  "id": "text",
  "fileName": "text",
  "fileUrl": "text",
  "status": "PENDING",
  "errorMessage": "text",
  "rowCount": 1,
  "processedRows": 1,
  "userId": "text",
  "createdAt": "2025-10-30T17:41:36.958Z",
  "updatedAt": "2025-10-30T17:41:36.958Z"
}Path parameters
zoneIdintegerRequired
Query parameters
userIdstringOptional
Responses
200
List of CSV files for zone
application/json
400
Bad request
application/json
404
Resource not found
application/json
500
Internal server error
application/json
get
/gcp/zone/{zoneId}GET /api/gcp/zone/{zoneId} HTTP/1.1
Host: 
Accept: */*
{
  "zoneId": 1,
  "zoneName": "text",
  "csvFiles": [
    {
      "id": "text",
      "fileName": "text",
      "fileUrl": "text",
      "status": "PENDING",
      "errorMessage": "text",
      "rowCount": 1,
      "processedRows": 1,
      "userId": "text",
      "createdAt": "2025-10-30T17:41:36.958Z",
      "updatedAt": "2025-10-30T17:41:36.958Z"
    }
  ],
  "totalFiles": 1
}Path parameters
zoneIdintegerRequired
Query parameters
userIdstringOptional
Body
csvUploadIdstringRequired
Responses
200
CSV file deleted
No content
400
Bad request
application/json
404
Resource not found
application/json
500
Internal server error
application/json
delete
/gcp/zone/{zoneId}DELETE /api/gcp/zone/{zoneId} HTTP/1.1
Host: 
Content-Type: application/json
Accept: */*
Content-Length: 22
{
  "csvUploadId": "text"
}No content
Query parameters
gcpIdintegerRequired
userIdstringOptional
Responses
200
List of uploaded files
application/json
400
Bad request
application/json
500
Internal server error
application/json
get
/upload/gcp-photosGET /api/upload/gcp-photos?gcpId=1 HTTP/1.1
Host: 
Accept: */*
{
  "status": "text",
  "files": [
    {
      "id": 1,
      "fileName": "text",
      "fileUrl": "text",
      "fileSize": 1,
      "mimeType": "text",
      "bucketPath": "text",
      "gcpId": 1,
      "userId": "text",
      "uploadedAt": "2025-10-30T17:41:36.958Z"
    }
  ]
}Body
filesstring · binary[] · max: 3Required
gcpIdstringOptional
userIdstringOptional
Responses
200
Photos uploaded successfully
application/json
400
Bad request
application/json
500
Internal server error
application/json
post
/upload/gcp-photosPOST /api/upload/gcp-photos HTTP/1.1
Host: 
Content-Type: multipart/form-data
Accept: */*
Content-Length: 51
{
  "files": [
    "binary"
  ],
  "gcpId": "text",
  "userId": "text"
}{
  "status": "text",
  "message": "text",
  "files": [
    {
      "id": 1,
      "fileName": "text",
      "fileUrl": "text",
      "fileSize": 1,
      "mimeType": "text",
      "bucketPath": "text",
      "gcpId": 1,
      "userId": "text",
      "uploadedAt": "2025-10-30T17:41:36.958Z"
    }
  ]
}