QR code — lwf.joma.film Submit Demo See live app

Living with Fire API

1,361 plants with fire data — open API for fire-resistant landscapes

Stakeholder Meeting Transcripts — context from this morning's talks. Feed to your coding agent.
No auth required for all GET endpoints. Base URL: https://lwf-api.vercel.app/api/v2

For Coding Agents

Copy these URLs into your AI coding agent to get started.

GET /api/v2/docs-raw — Full OpenAPI 3.0 spec as JSON
GET /plant-fields.json — Every field, attribute, and allowed value with descriptions
GET /api/v2/plants?includeImages=true — Browse all 1,361 plants as JSON
GET /api/v2/attributes/hierarchical — Full attribute tree with allowed values
GET /api/v2/plants/1b78126d-... — Test plant (Glossy abelia) with all values + images

Key Endpoints

GET /plants — Paginated list. ?includeImages=true ?search=abelia
Start here. Your main data feed.
GET /plants/{id} — Plant + images + all resolved values in one call.
Returns everything you need for a plant in a single request. Use resolved.value for display.
GET /plants/{id}/images — All images. Primary: isPrimary: true.
GET /attributes/hierarchical — Full attribute tree with allowed values.
Cache this. Use it to build filter UIs.
GET /values/bulk?attributeIds=...&plantIds=...&resolve=true — Batch values with display names. Both params optional. Default limit: 5,000.
Without resolve=true, returns raw IDs. Use /plants/{id} for the easiest single-plant approach.
GET /plants/{id}/risk-reduction — Fire risk score + best practices text.
GET /filter-presets — Pre-built filter configs.

Supporting Data

GET /sources — Research sources and data provenance.
GET /key-terms — Fire-related glossary with definitions.
GET /nurseries — Local nurseries with contact info.
GET /resources — Educational resource links by category.
GET /risk-reduction-snippets — Editable fire risk reduction advice text.

All prefixed with /api/v2. Pagination: ?limit=&offset=. Format: {"data":[...],"meta":{"pagination":{...}}}
For AI coding agents: GET /api/v2/docs-raw (OpenAPI spec) · GET /plant-fields.json (all fields + attribute tree)

Data Structure

  1. Attributes define what can be measured (e.g., "Water Needs")
  2. Attributes have valuesAllowed arrays (each option has an ID + display label)
  3. Values store the selected option ID for each plant
  4. Multi-select attributes = multiple value rows per plant

The API resolves display names automatically. Each value has a resolved object:

// GET /api/v2/plants/{id} — values are inline on the plant object
{
  "commonName": "Glossy Abelia",
  "values": [
    {
      "attributeName": "Water Amount",
      "rawValue": "04",
      "resolved": { "value": "Low", "type": "enum" }
    }
  ]
}

// Just use resolved.value:
plant.values.forEach(v => console.log(`${v.attributeName}: ${v.resolved.value}`));
Gotcha: Display names != stored values. "Low" is stored as "04". Filter by raw ID, display with resolved.value.

Quick Start

// Fetch plants with images
const { data, meta } = await fetch(
  'https://lwf-api.vercel.app/api/v2/plants?includeImages=true'
).then(r => r.json());

// Get a single plant with images + all resolved values in one call
const { data: plant } = await fetch(
  `https://lwf-api.vercel.app/api/v2/plants/${data[0].id}`
).then(r => r.json());

// Plant info + images + values all in one response
console.log(plant.commonName, plant.images, plant.values);
plant.values.forEach(v =>
  console.log(`${v.attributeName}: ${v.resolved?.value}`)
);

Test plant: 1b78126d-1f69-44b0-a06b-47116e41270d (Glossy abelia)

Project Ideas

Fire-Safe Garden Planner

Zone layouts by flammability + water needs

Wildlife Habitat Designer

Pollinators, birds, bloom calendars

Native Plant Finder

Region-specific recs, invasive alternatives

Plant Care Assistant

Match plants to conditions, care reminders

Neighborhood Fire Map

Nursery locations, community risk scores

Ecosystem Game

Balance fire safety, water, wildlife with real data