GCP
Ground Control Point management
Query parameters
zoneIdintegerOptional
Responses
200
List of GCPs
application/json
500
Internal server error
application/json
get
GET /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",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"yaw": 0,
"pitch": 0,
"roll": 0
}
},
"contentType": "IMAGE",
"contentUrl": "text",
"zoneId": 1,
"gcpId": 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",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"yaw": 0,
"pitch": 0,
"roll": 0
}
},
"contentType": "IMAGE",
"contentUrl": "text",
"zoneId": 1,
"gcpId": 1,
"gcp": {
"id": 1,
"title": "text",
"description": "text",
"gcpType": "SINGLE",
"altitude": 1,
"aprilTagId": 1,
"gcpData": "text",
"photoUrls": [
"text"
],
"zoneId": 1,
"pin": "[Circular Reference]",
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"zone": {
"id": 1,
"title": "text"
},
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"zone": {
"id": 1,
"title": "text"
},
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
}
]
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
POST /api/gcp HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 258
{
"title": "text",
"description": "text",
"gcpType": "SINGLE",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"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",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"yaw": 0,
"pitch": 0,
"roll": 0
}
},
"contentType": "IMAGE",
"contentUrl": "text",
"zoneId": 1,
"gcpId": 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",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"yaw": 0,
"pitch": 0,
"roll": 0
}
},
"contentType": "IMAGE",
"contentUrl": "text",
"zoneId": 1,
"gcpId": 1,
"gcp": {
"id": 1,
"title": "text",
"description": "text",
"gcpType": "SINGLE",
"altitude": 1,
"aprilTagId": 1,
"gcpData": "text",
"photoUrls": [
"text"
],
"zoneId": 1,
"pin": "[Circular Reference]",
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"zone": {
"id": 1,
"title": "text"
},
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"zone": {
"id": 1,
"title": "text"
},
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"pin": {
"id": 1,
"title": "text",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"yaw": 0,
"pitch": 0,
"roll": 0
}
},
"contentType": "IMAGE",
"contentUrl": "text",
"zoneId": 1,
"gcpId": 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",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"yaw": 0,
"pitch": 0,
"roll": 0
}
},
"contentType": "IMAGE",
"contentUrl": "text",
"zoneId": 1,
"gcpId": 1,
"gcp": {
"id": 1,
"title": "text",
"description": "text",
"gcpType": "SINGLE",
"altitude": 1,
"aprilTagId": 1,
"gcpData": "text",
"photoUrls": [
"text"
],
"zoneId": 1,
"pin": "[Circular Reference]",
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"zone": {
"id": 1,
"title": "text"
},
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"zone": {
"id": 1,
"title": "text"
},
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
}
}
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
PUT /api/gcp/{id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 189
{
"title": "text",
"description": "text",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"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",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"yaw": 0,
"pitch": 0,
"roll": 0
}
},
"contentType": "IMAGE",
"contentUrl": "text",
"zoneId": 1,
"gcpId": 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",
"geoPose": {
"position": {
"lat": 1,
"lon": 1,
"h": 0
},
"yprAngles": {
"yaw": 0,
"pitch": 0,
"roll": 0
}
},
"contentType": "IMAGE",
"contentUrl": "text",
"zoneId": 1,
"gcpId": 1,
"gcp": {
"id": 1,
"title": "text",
"description": "text",
"gcpType": "SINGLE",
"altitude": 1,
"aprilTagId": 1,
"gcpData": "text",
"photoUrls": [
"text"
],
"zoneId": 1,
"pin": "[Circular Reference]",
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"zone": {
"id": 1,
"title": "text"
},
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"zone": {
"id": 1,
"title": "text"
},
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
},
"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-09T00:03:02.969Z"
}
],
"createdAt": "2025-10-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
}
}
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
DELETE /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
GET /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
POST /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-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
}
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
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-09T00:03:02.969Z",
"updatedAt": "2025-10-09T00:03:02.969Z"
}
],
"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
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
GET /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-09T00:03:02.969Z"
}
]
}
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
POST /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-09T00:03:02.969Z"
}
]
}