Living with Fire API

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

No auth required for all GET endpoints. Base URL: https://lwf-api.vercel.app/api/v1

Key Endpoints

GET /plants — Paginated list. ?includeImages=true ?search=abelia
Start here. Your main data feed.
GET /plants/{id}/values — All attributes for a plant, with resolved display names.
The money endpoint. 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=... — Batch values. plantIds optional.
GET /plants/{id}/risk-reduction — Fire risk score + best practices text.
GET /filter-presets — Pre-built filter configs.
GET /key-terms — Fire glossary.   GET /nurseries — Where to buy.   GET /resources — Educational links.

All prefixed with /api/v1. Pagination: ?limit=&offset=. Format: {"data":[...],"meta":{"pagination":{...}}}

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/v1/plants/{id}/values
{
  "attributeName": "Water Amount",
  "rawValue": "04",                         // stored ID
  "resolved": { "value": "Low", "type": "enum" }  // display name
}

// Just use resolved.value:
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/v1/plants?includeImages=true'
).then(r => r.json());

// Get a plant's attributes
const { data: values } = await fetch(
  `https://lwf-api.vercel.app/api/v1/plants/${data[0].id}/values`
).then(r => r.json());

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