For the complete documentation index, see llms.txt. This page is also available as Markdown.

GCP

Ground Control Point management

List GCPs

get
Query parameters
zoneIdintegerOptional
Responses
200

List of GCPs

application/json
idintegerOptional
titlestringOptional
descriptionstring · nullableOptional
gcpTypestring · enumOptionalPossible values:
altitudenumber · nullableOptional
aprilTagIdinteger · max: 50 · nullableOptional
gcpDatastring · nullableOptional
photoUrlsstring[]Optional
zoneIdinteger · nullableOptional
createdAtstring · date-timeOptional
updatedAtstring · date-timeOptional
get/gcp
GET /api/gcp HTTP/1.1
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,
      "userId": "text",
      "visibility": "public",
      "relocalizationPhotoUrl": "text",
      "scanInstructions": "text",
      "cameraPoseHint": {},
      "blockchainSignature": "text",
      "blockchainTxUrl": "text",
      "blockchainSyncedAt": "2026-01-01T00:00:00.000Z",
      "createdAt": "2026-01-01T00:00:00.000Z",
      "updatedAt": "2026-01-01T00:00:00.000Z"
    },
    "zone": {
      "id": 1,
      "title": "text"
    },
    "uploadedFiles": [
      {
        "id": 1,
        "fileName": "text",
        "fileUrl": "text",
        "fileSize": 1,
        "mimeType": "text",
        "bucketPath": "text",
        "gcpId": 1,
        "userId": "text",
        "uploadedAt": "2026-01-01T00:00:00.000Z"
      }
    ],
    "createdAt": "2026-01-01T00:00:00.000Z",
    "updatedAt": "2026-01-01T00:00:00.000Z"
  }
]

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
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,
      "userId": "text",
      "visibility": "public",
      "relocalizationPhotoUrl": "text",
      "scanInstructions": "text",
      "cameraPoseHint": {},
      "blockchainSignature": "text",
      "blockchainTxUrl": "text",
      "blockchainSyncedAt": "2026-01-01T00:00:00.000Z",
      "createdAt": "2026-01-01T00:00:00.000Z",
      "updatedAt": "2026-01-01T00:00:00.000Z"
    },
    "zone": {
      "id": 1,
      "title": "text"
    },
    "uploadedFiles": [
      {
        "id": 1,
        "fileName": "text",
        "fileUrl": "text",
        "fileSize": 1,
        "mimeType": "text",
        "bucketPath": "text",
        "gcpId": 1,
        "userId": "text",
        "uploadedAt": "2026-01-01T00:00:00.000Z"
      }
    ],
    "createdAt": "2026-01-01T00:00:00.000Z",
    "updatedAt": "2026-01-01T00:00:00.000Z"
  },
  "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,
    "userId": "text",
    "visibility": "public",
    "relocalizationPhotoUrl": "text",
    "scanInstructions": "text",
    "cameraPoseHint": {},
    "blockchainSignature": "text",
    "blockchainTxUrl": "text",
    "blockchainSyncedAt": "2026-01-01T00:00:00.000Z",
    "createdAt": "2026-01-01T00:00:00.000Z",
    "updatedAt": "2026-01-01T00:00:00.000Z"
  }
}

Update a GCP

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

GCP updated

application/json
messagestringOptional
put/gcp/{id}
PUT /api/gcp/{id} HTTP/1.1
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,
      "userId": "text",
      "visibility": "public",
      "relocalizationPhotoUrl": "text",
      "scanInstructions": "text",
      "cameraPoseHint": {},
      "blockchainSignature": "text",
      "blockchainTxUrl": "text",
      "blockchainSyncedAt": "2026-01-01T00:00:00.000Z",
      "createdAt": "2026-01-01T00:00:00.000Z",
      "updatedAt": "2026-01-01T00:00:00.000Z"
    },
    "zone": {
      "id": 1,
      "title": "text"
    },
    "uploadedFiles": [
      {
        "id": 1,
        "fileName": "text",
        "fileUrl": "text",
        "fileSize": 1,
        "mimeType": "text",
        "bucketPath": "text",
        "gcpId": 1,
        "userId": "text",
        "uploadedAt": "2026-01-01T00:00:00.000Z"
      }
    ],
    "createdAt": "2026-01-01T00:00:00.000Z",
    "updatedAt": "2026-01-01T00:00:00.000Z"
  }
}

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
Accept: */*

No content

Check April tag availability

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

April tag validation result

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

Upload GCP CSV file

post
Body
fileNamestringRequired
fileUrlstringRequired
zoneIdintegerRequired
rowCountintegerOptional
userIdstringOptional
Responses
200

CSV upload processed

application/json
idstringOptional
fileNamestringOptional
fileUrlstringOptional
statusstring · enumOptionalPossible values:
errorMessagestring · nullableOptional
rowCountinteger · nullableOptional
processedRowsinteger · nullableOptional
userIdstringOptional
createdAtstring · date-timeOptional
updatedAtstring · date-timeOptional
post/gcp/upload
POST /api/gcp/upload HTTP/1.1
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": "2026-01-01T00:00:00.000Z",
  "updatedAt": "2026-01-01T00:00:00.000Z"
}

Get CSV uploads for a zone

get
Path parameters
zoneIdintegerRequired
Query parameters
userIdstringOptional
Responses
200

List of CSV files for zone

application/json
zoneIdintegerOptional
zoneNamestringOptional
totalFilesintegerOptional
get/gcp/zone/{zoneId}
GET /api/gcp/zone/{zoneId} HTTP/1.1
Accept: */*
{
  "zoneId": 1,
  "zoneName": "text",
  "csvFiles": [
    {
      "id": "text",
      "fileName": "text",
      "fileUrl": "text",
      "status": "PENDING",
      "errorMessage": "text",
      "rowCount": 1,
      "processedRows": 1,
      "userId": "text",
      "createdAt": "2026-01-01T00:00:00.000Z",
      "updatedAt": "2026-01-01T00:00:00.000Z"
    }
  ],
  "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
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
statusstringOptional
get/upload/gcp-photos
GET /api/upload/gcp-photos?gcpId=1 HTTP/1.1
Accept: */*
{
  "status": "text",
  "files": [
    {
      "id": 1,
      "fileName": "text",
      "fileUrl": "text",
      "fileSize": 1,
      "mimeType": "text",
      "bucketPath": "text",
      "gcpId": 1,
      "userId": "text",
      "uploadedAt": "2026-01-01T00:00:00.000Z"
    }
  ]
}

Upload GCP photos

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

Photos uploaded successfully

application/json
statusstringOptional
messagestringOptional
post/upload/gcp-photos
POST /api/upload/gcp-photos HTTP/1.1
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": "2026-01-01T00:00:00.000Z"
    }
  ]
}

Last updated