Tree Inventory AI

Catalog

The products and services the org sells. Read this before writing an estimate: every line references a catalog item id.

gethttps://treeinventory.ai/api/v1/catalog/items

List catalog items

Read this before writing an estimate. Every estimate line references a catalogItemId from here, and an id you invented is a 404 you cannot diagnose from the outside.

Scope: catalog:read

Query parameters

FieldTypeNotes
cursorstringOpaque. Take it from a previous response's nextCursor and send it back unchanged. Do not parse it; its contents are not part of this contract.
limitintegerPage size. Defaults to 50, clamped to 200 rather than refused.
activeOnlystringDefaults to true. Retired items are rarely the useful answer.

Each item in data.items

FieldTypeNotes
iduuid
typestringservice | product.
namestring
descriptionstring or null
categorystring
unitPriceCentsinteger
activeboolean
workTypeHintstring or nullAn auto-match HINT, never a constraint on what this item may price. Read it as a constraint and you will build a matcher that silently drops work.
createdAtstring
updatedAtstring

Example response 200

{
  "success": true,
  "message": "Catalog items retrieved",
  "data": {
    "items": [
      {
        "id": "7b1d0c94-2f63-4e8a-9a55-c3d8e0f1a2b3",
        "type": "service",
        "name": "Crown clean",
        "description": "Remove dead, dying, diseased and crossing branches.",
        "category": "pruning",
        "unitPriceCents": 45000,
        "active": true,
        "workTypeHint": "trim",
        "createdAt": "2026-06-02T09:12:00.000Z",
        "updatedAt": "2026-06-02T09:12:00.000Z"
      }
    ],
    "nextCursor": null
  }
}

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.