GCP

Ground Control Point management

List GCPs

get
Query parameters
zoneIdintegerOptional
Responses
200

List of GCPs

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

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

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

Remove a photo from a GCP

delete
Path parameters
idintegerRequired
Query parameters
photoUrlstring · uriRequired
Responses
200

Photo removed successfully

No content

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

Get CSV uploads for a zone

get
Path parameters
zoneIdintegerRequired
Query parameters
userIdstringOptional
Responses
200

List of CSV files for zone

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
}

Delete a CSV file from a zone

delete
Path parameters
zoneIdintegerRequired
Query parameters
userIdstringOptional
Body
csvUploadIdstringRequired
Responses
200

CSV file deleted

No content

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

Upload GCP photos

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

Photos uploaded successfully

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