GCP

Ground Control Point management

List GCPs

get
Query parameters
zoneIdintegerOptional
Responses
200

List of GCPs

application/json
get
/gcp
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",
      "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"
  }
]

Create a new GCP (Ground Control Point)

post
Body
titlestringRequired
descriptionstringOptional
gcpTypestring · enumRequiredPossible values:
altitudenumberOptional
aprilTagIdinteger · max: 50Optional
gcpDatastringOptional
photoUrlsstring · uri[] · max: 3Optional
uploadedFileIdsinteger[]Optional
zoneIdintegerOptional
Responses
201

GCP created

application/json
post
/gcp
POST /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"
  }
}

Update a GCP

put
Path parameters
idintegerRequired
Body
titlestringRequired
descriptionstring | nullableOptional
altitudenumber | nullableOptional
aprilTagIdinteger | nullableOptional
photoUrlsstring · uri[]Optional
Responses
200

GCP updated

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"
  }
}

Remove a photo from a GCP

delete
Path parameters
idintegerRequired
Query parameters
photoUrlstring · uriRequired
Responses
200

Photo removed successfully

No content

delete
/gcp/{id}/remove-photo
DELETE /api/gcp/{id}/remove-photo?photoUrl=https%3A%2F%2Fexample.com HTTP/1.1
Host: 
Accept: */*

No content

Check April tag availability

get
Query parameters
aprilTagIdinteger · max: 50Required
latitudenumberOptional
longitudenumberOptional
excludeGcpIdintegerOptional
Responses
200

April tag validation result

application/json
get
/gcp/check-april-tag
GET /api/gcp/check-april-tag?aprilTagId=1 HTTP/1.1
Host: 
Accept: */*
{
  "available": true,
  "conflicts": [
    {}
  ]
}

Upload GCP CSV file

post
Body
fileNamestringRequired
fileUrlstringRequired
zoneIdintegerRequired
rowCountintegerOptional
userIdstringOptional
Responses
200

CSV upload processed

application/json
post
/gcp/upload
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-30T17:41:36.958Z",
  "updatedAt": "2025-10-30T17:41:36.958Z"
}

Get CSV uploads for a zone

get
Path parameters
zoneIdintegerRequired
Query parameters
userIdstringOptional
Responses
200

List of CSV files for zone

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
}

Delete a CSV file from a zone

delete
Path parameters
zoneIdintegerRequired
Query parameters
userIdstringOptional
Body
csvUploadIdstringRequired
Responses
200

CSV file deleted

No content

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

Get uploaded files for a GCP

get
Query parameters
gcpIdintegerRequired
userIdstringOptional
Responses
200

List of uploaded files

application/json
get
/upload/gcp-photos
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-30T17:41:36.958Z"
    }
  ]
}

Upload GCP photos

post
Body
filesstring · binary[] · max: 3Required
gcpIdstringOptional
userIdstringOptional
Responses
200

Photos uploaded successfully

application/json
post
/upload/gcp-photos
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-30T17:41:36.958Z"
    }
  ]
}