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-11-28T20:38:26.616Z",
"updatedAt": "2025-11-28T20:38:26.616Z"
},
"zone": {
"id": 1,
"title": "text"
},
"uploadedFiles": [
{
"id": 1,
"fileName": "text",
"fileUrl": "text",
"fileSize": 1,
"mimeType": "text",
"bucketPath": "text",
"gcpId": 1,
"userId": "text",
"uploadedAt": "2025-11-28T20:38:26.616Z"
}
],
"createdAt": "2025-11-28T20:38:26.616Z",
"updatedAt": "2025-11-28T20:38:26.616Z"
}
]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-11-28T20:38:26.616Z",
"updatedAt": "2025-11-28T20:38:26.616Z"
},
"zone": {
"id": 1,
"title": "text"
},
"uploadedFiles": [
{
"id": 1,
"fileName": "text",
"fileUrl": "text",
"fileSize": 1,
"mimeType": "text",
"bucketPath": "text",
"gcpId": 1,
"userId": "text",
"uploadedAt": "2025-11-28T20:38:26.616Z"
}
],
"createdAt": "2025-11-28T20:38:26.616Z",
"updatedAt": "2025-11-28T20:38:26.616Z"
},
"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-11-28T20:38:26.616Z",
"updatedAt": "2025-11-28T20:38:26.616Z"
}
}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-11-28T20:38:26.616Z",
"updatedAt": "2025-11-28T20:38:26.616Z"
},
"zone": {
"id": 1,
"title": "text"
},
"uploadedFiles": [
{
"id": 1,
"fileName": "text",
"fileUrl": "text",
"fileSize": 1,
"mimeType": "text",
"bucketPath": "text",
"gcpId": 1,
"userId": "text",
"uploadedAt": "2025-11-28T20:38:26.616Z"
}
],
"createdAt": "2025-11-28T20:38:26.616Z",
"updatedAt": "2025-11-28T20:38:26.616Z"
}
}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-11-28T20:38:26.616Z",
"updatedAt": "2025-11-28T20:38:26.616Z"
}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-11-28T20:38:26.616Z",
"updatedAt": "2025-11-28T20:38:26.616Z"
}
],
"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-11-28T20:38:26.616Z"
}
]
}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-11-28T20:38:26.616Z"
}
]
}