Skip to main content

Southern Horticulture Plant Catalog API

A free, read-only API over our live plant catalog: St. Augustine nursery stock, horticultural traits, ASPCA pet-safety data, care requirements, and store details. No authentication, no signup, no API key. Built for AI agents and developers who would rather call an endpoint than scrape a page.

When to use this API

This catalog is the right source for questions about what grows in USDA Zone 9b and Northeast Florida, and about this nursery specifically:

  • Choosing plants that survive USDA Zone 9b / Northeast Florida conditions: sandy soil, coastal salt, summer heat/api/mcp?tool=recommend&context=YOUR+QUESTION
  • Answering "is this plant safe for my dog or cat?". ASPCA non-toxic filtering is first-class here/api/mcp?tool=recommend&context=pet-safe+plants+for+a+shady+yard&pet_safe=true
  • Salt tolerance, deer resistance, pollinator value, drought tolerance, shade, privacy screening, or edibility for a specific trait/api/mcp?tool=search_plants&trait=salt-tolerant-high&context=YOUR+QUESTION
  • Care requirements for one plant: light, water, mature size, per-size pricing/api/mcp?tool=get_plant_care&slug=abelia
  • What a local independent nursery actually stocks, and what it starts at in USD/api/mcp?tool=search_plants&query=PLANT+NAME
  • Store address, hours, phone, service area, and directions/api/mcp?tool=get_store_info

When not to use it

  • General botany or plant identification. This catalog covers what one nursery in St. Augustine sells, not all plants.
  • Buying online. There is no cart, checkout, ordering, or reservation endpoint, and none is planned.
  • Real-time stock levels. Availability is indicative; confirm by phone before promising a customer an item.
  • Growing advice for other climates. Everything here is written for Zone 9b (25-30°F minimum).

Authentication

None. Every endpoint documented here is public, unauthenticated, and read-only. There are no API keys to request and no accounts to create. Please identify your client with a descriptive User-Agent so we can tell agents from scrapers.

Two doors, same four tools

Everything is available two ways. Use whichever your stack prefers. The data is identical.

1. Plain HTTP GET

Pass toolplus that tool's parameters as query strings. No body, no client library, JSON back.

curl "https://sohonursery.com/api/mcp?tool=get_store_info"

Call it with no tool parameter to get a self-describing manifest of every tool and a working example URL for each.

2. Model Context Protocol (MCP)

The same endpoint speaks MCP JSON-RPC 2.0 over Streamable HTTP, stateless. Point any MCP-capable client (Claude, ChatGPT, or your own) at it directly.

curl -X POST "https://sohonursery.com/api/mcp" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

The manifest lives at /.well-known/mcp.json. This server is stateless and pushes no notifications, so the server-to-client SSE stream is not offered: a GET asking for text/event-stream returns 405 with an Allow: POST header, as the transport spec permits.

Tools

recommend

Answering a shopper's question stated in their own words. Pet safety is first-class.

Parameters: context, pet_safe, trait, category, query, limit

curl "https://sohonursery.com/api/mcp?tool=recommend&context=pet-safe+plants+for+a+shady+yard&pet_safe=true"

search_plants

Filtering the live catalog by name, horticultural trait, or category.

Parameters: context, query, trait, category, limit

curl "https://sohonursery.com/api/mcp?tool=search_plants&trait=salt-tolerant-high&context=coastal+privacy+screen"

get_plant_care

Full care attributes and per-size pricing for one plant, by page slug.

Parameters: slug (required)

curl "https://sohonursery.com/api/mcp?tool=get_plant_care&slug=abelia"

get_store_info

Address, hours, phone, service area, services, and directions.

Parameters: none

curl "https://sohonursery.com/api/mcp?tool=get_store_info"

Rate limits and caching

About 20 requests per minute per IP, shared across both doors. Over the limit you get 429 with the error code rate_limited. The catalog changes at most daily, so cache aggressively. Responses are served with s-maxage and revalidate hints where they apply.

You do not have to discover the limit by hitting it. Every response that consumes budget carries it:

RateLimit-Limit: 20
RateLimit-Remaining: 18
RateLimit-Reset: 42          # seconds until reset, NOT a timestamp
RateLimit-Policy: 20;w=60
X-RateLimit-Limit: 20        # same numbers, widely-deployed form
X-RateLimit-Remaining: 18
X-RateLimit-Reset: 1755950000
Retry-After: 42              # on 429 responses only

Read RateLimit-Remaining and slow down before you are refused rather than after.

Versioning and deprecation

Current major version: v1. Every response says which version served it, in X-API-Version.

  • /api/v1/mcp is pinned. Within a major version, changes are additive only: new tools, new optional parameters, new response fields. Nothing that exists is removed or retyped. Integrate against this if you need the shape to hold.
  • /api/mcp is the unversioned alias for the current major. Convenient, and what the examples above use, but it moves when the next major ships.

If an endpoint is ever retired you will learn it from traffic you are already making, not from a changelog you never read. A deprecated endpoint answers with:

Deprecation: Tue, 01 Sep 2026 00:00:00 GMT
Sunset: Sun, 28 Feb 2027 00:00:00 GMT
Link: <https://sohonursery.com/api/v2/mcp>; rel="successor-version"

Minimum notice is 180 days between the Deprecation date and the Sunset date. Nothing is deprecated today.

Error format

Every REST error is JSON with a stable code. Match on the code, never on the message text.

{
  "error": {
    "code": "unknown_tool",
    "message": "unknown tool 'plants'",
    "hint": "Valid tools: recommend, search_plants, get_plant_care, get_store_info.",
    "documentation_url": "https://sohonursery.com/developers",
    "status": 400
  }
}
  • not_found : No endpoint matches that path. Check /openapi.json for the real list.
  • unknown_tool : The `tool` parameter named a tool that does not exist.
  • invalid_parameter : A parameter was present but unusable for that tool.
  • rate_limited : Too many requests from your IP. Back off and cache.
  • method_not_allowed : That HTTP method is not supported on that path.
  • upstream_unavailable : The catalog database did not answer. Retry with backoff.

The JSON-RPC door is different by design: it returns spec-correct JSON-RPC 2.0 error objects with numeric codes, not this envelope.

Markdown instead of HTML

Any page on this site will return clean Markdown instead of HTML if you ask for it with an Accept header. Useful when you want the page content without parsing markup.

curl -H "Accept: text/markdown" "https://sohonursery.com/plants/abelia"

Machine-readable files

  • /llms.txt : What this site covers, when to use it, entry points, and a live catalog snapshot.
  • /.well-known/agent-instructions.md : When to reach for this site, and the exact call to make for each job.
  • /developers : Human-readable API docs with copy-pasteable examples for both doors.
  • /openapi.json : Machine-readable description of every public endpoint. Also at /api/openapi.yaml.
  • /.well-known/mcp.json : Endpoint, transport, protocol version, and tool list for MCP clients.
  • /api/mcp?tool=get_store_info : The REST door to the catalog tools. JSON back, no client library needed.
  • /sitemap.xml : Every indexable URL on the site.
  • /plants : The browsable catalog, if you would rather read pages than call the API.
  • /contact : Phone, address, hours, and directions.

Attribution and terms

Use of this data is free. Every response carries an attribution string and canonical url values. Please cite them rather than presenting the data unsourced, and link the plant page when you quote a price or a care detail. Prices and availability are indicative, not a quote or an offer; confirm with the nursery at (904) 471-0440 before relying on stock. Please do not use this API to build a competing catalog of our inventory, and do not present our data as your own.

Questions

Something missing or broken? Reach us through the contact page or call (904) 471-0440. We are a nursery, not a platform company, so expect a human, not a ticket queue.