Tree Inventory AI

Trees

Individual trees captured in the field, with their measurements and the confidence attached to each one. Read-only: capture happens in the mobile app, where the camera is.

gethttps://treeinventory.ai/api/v1/sites/{siteId}/trees

List the trees captured at a site

Not paginated. A site is one property walked by one arborist, so this is tens of records; a cursor here would cost you a loop and gain you nothing.

Scope: inventory:read

Path parameters

FieldTypeNotes
siteIdrequireduuidThe site's id.

Each item in data.items

FieldTypeNotes
iduuid
siteIduuid
commonNamestring or nullNull until identified.
scientificNamestring or null
speciesConfidencenumber or null0-1. Published beside the value it qualifies: a measurement without its confidence reads as certainty nobody has.
dbhInchesnumber or nullDiameter at breast height.
dbhConfidencenumber or null0-1 confidence in dbhInches. Null means it was not estimated.
heightFeetnumber or null
heightConfidencenumber or null0-1 confidence in heightFeet.
canopySpreadFeetnumber or null
canopyConfidencenumber or null0-1 confidence in canopySpreadFeet.
trunkCountnumber or null
quantitynumberHow many physical trees this record stands for. Usually 1.
healthConditionstring or nullgood | fair | poor | dead | hazardous.
hazardRatingnumber or null
riskAssessmentstring or null
defectsstring[]
observationsstring[]
recommendationsstring[]
tagsstring[]
latitudenumber or null
longitudenumber or null
gpsAccuracyMetersnumber or null
capturedAtstring
createdAtstring
updatedAtstring

Example response 200

{
  "success": true,
  "message": "Trees retrieved",
  "data": {
    "items": [
      {
        "id": "c04f8a55-1d2e-4b39-8a71-6f5c2d9e3b40",
        "siteId": "3a7c9e21-5b48-4f0a-9d33-71c6ee204b18",
        "commonName": "Northern Red Oak",
        "scientificName": "Quercus rubra",
        "speciesConfidence": 0.91,
        "dbhInches": 22,
        "dbhConfidence": 0.44,
        "heightFeet": 58,
        "heightConfidence": 0.6,
        "canopySpreadFeet": 34,
        "canopyConfidence": 0.55,
        "trunkCount": 1,
        "quantity": 1,
        "healthCondition": "fair",
        "hazardRating": 3,
        "riskAssessment": "Deadwood over the driveway; included bark at the main union.",
        "defects": [
          "included bark"
        ],
        "observations": [
          "Deadwood concentrated on the south side"
        ],
        "recommendations": [
          "Crown clean",
          "Reduce the driveway-side limb"
        ],
        "tags": [],
        "latitude": 39.19124,
        "longitude": -86.58471,
        "gpsAccuracyMeters": 4,
        "capturedAt": "2026-08-20T15:41:02.000Z",
        "createdAt": "2026-08-20T15:41:05.220Z",
        "updatedAt": "2026-08-20T15:41:05.220Z"
      }
    ]
  }
}

Failures

  • 401 Missing, malformed, revoked or expired credential. The WWW-Authenticate header names the scheme, which is ApiKey.
  • 403 The key is valid but does not carry the scope this operation requires. The message names the scope, so you can ask for exactly the grant you need.
  • 404 No such record in your organization. A record belonging to somebody else is indistinguishable from one that does not exist.
  • 422 Validation failed. Every bad field is named, at once.
  • 429 Rate limit exceeded.
  • 500 Something failed on our side. Retry with the SAME Idempotency-Key; a 5xx is the one status where retrying is correct.
gethttps://treeinventory.ai/api/v1/trees/{treeId}

Get one tree

A tree in another organization answers 404, identically to one that does not exist.

Scope: inventory:read

Path parameters

FieldTypeNotes
treeIdrequireduuidThe tree's id.

data

FieldTypeNotes
iduuid
siteIduuid
commonNamestring or nullNull until identified.
scientificNamestring or null
speciesConfidencenumber or null0-1. Published beside the value it qualifies: a measurement without its confidence reads as certainty nobody has.
dbhInchesnumber or nullDiameter at breast height.
dbhConfidencenumber or null0-1 confidence in dbhInches. Null means it was not estimated.
heightFeetnumber or null
heightConfidencenumber or null0-1 confidence in heightFeet.
canopySpreadFeetnumber or null
canopyConfidencenumber or null0-1 confidence in canopySpreadFeet.
trunkCountnumber or null
quantitynumberHow many physical trees this record stands for. Usually 1.
healthConditionstring or nullgood | fair | poor | dead | hazardous.
hazardRatingnumber or null
riskAssessmentstring or null
defectsstring[]
observationsstring[]
recommendationsstring[]
tagsstring[]
latitudenumber or null
longitudenumber or null
gpsAccuracyMetersnumber or null
capturedAtstring
createdAtstring
updatedAtstring

Example response 200

{
  "success": true,
  "message": "Tree retrieved",
  "data": {
    "id": "c04f8a55-1d2e-4b39-8a71-6f5c2d9e3b40",
    "siteId": "3a7c9e21-5b48-4f0a-9d33-71c6ee204b18",
    "commonName": "Northern Red Oak",
    "scientificName": "Quercus rubra",
    "speciesConfidence": 0.91,
    "dbhInches": 22,
    "dbhConfidence": 0.44,
    "heightFeet": 58,
    "heightConfidence": 0.6,
    "canopySpreadFeet": 34,
    "canopyConfidence": 0.55,
    "trunkCount": 1,
    "quantity": 1,
    "healthCondition": "fair",
    "hazardRating": 3,
    "riskAssessment": "Deadwood over the driveway; included bark at the main union.",
    "defects": [
      "included bark"
    ],
    "observations": [
      "Deadwood concentrated on the south side"
    ],
    "recommendations": [
      "Crown clean",
      "Reduce the driveway-side limb"
    ],
    "tags": [],
    "latitude": 39.19124,
    "longitude": -86.58471,
    "gpsAccuracyMeters": 4,
    "capturedAt": "2026-08-20T15:41:02.000Z",
    "createdAt": "2026-08-20T15:41:05.220Z",
    "updatedAt": "2026-08-20T15:41:05.220Z"
  }
}

Failures

  • 401 Missing, malformed, revoked or expired credential. The WWW-Authenticate header names the scheme, which is ApiKey.
  • 403 The key is valid but does not carry the scope this operation requires. The message names the scope, so you can ask for exactly the grant you need.
  • 404 No such record in your organization. A record belonging to somebody else is indistinguishable from one that does not exist.
  • 422 Validation failed. Every bad field is named, at once.
  • 429 Rate limit exceeded.
  • 500 Something failed on our side. Retry with the SAME Idempotency-Key; a 5xx is the one status where retrying is correct.