Skip to content
Free & open API

The open TerpTrack
catalog API

Every strain, brand, terpene, dispensary, and lab-tested batch in the catalog is available as a free, public, read-only REST API. No sign-up, no key request. Same data that runs this site, straight from Postgres.

Free

No account, no billing, no quota application. Reasonable use is welcome.

Open

Anyone can read the full catalog with the public key shipped on this page.

Read-only

The catalog is browse-only. There are no public write endpoints.

Privacy, provable. Only catalog tables are readable with this key. Personal logs (sessions, stash, tolerance, ratings, wishlist) are protected by per-user row-level security and return an empty array to this public key. The same key that reads the whole catalog can't read anyone's personal log. Try it in the explorer below.

Quick start

Two headers and a URL

Point any HTTP client at the base URL below. Every request needs the public API key in two headers: apikey and Authorization: Bearer. That's the whole authentication story for the catalog.

Base URL
https://dmskqjivlcrmoxsshbkx.supabase.co/rest/v1
Public key
sb_publishable_9gVDJCPlrGnfZIj2__MdeA_28Rz8GYq
Try it from your terminal
curl "https://dmskqjivlcrmoxsshbkx.supabase.co/rest/v1/strains?select=slug,name&limit=5" \
  -H "apikey: sb_publishable_9gVDJCPlrGnfZIj2__MdeA_28Rz8GYq" \
  -H "Authorization: Bearer sb_publishable_9gVDJCPlrGnfZIj2__MdeA_28Rz8GYq"
API explorer

Run a real request

These hit the live API from your browser, no proxy, no mock. Click Run it on any card to see the real JSON response, truncated for readability.

List strains

The canonical strain list. Slug, name, and description, paged to keep payloads small.

GET/rest/v1/strains?select=slug,name,description&order=name.asc&limit=5

Search strains by name

Case-insensitive wildcard match. ilike.*dream* finds Blue Dream, Dream Queen, and friends.

GET/rest/v1/strains?select=slug,name&name=ilike.*dream*&limit=5

High-THC batches with their strain & brand

Lab-tested batches over 20% THC, with the related strain and brand embedded in one round-trip.

GET/rest/v1/product_batches?select=batch_label,thc_percent_total,total_terpenes_percent,package_date,strains(name),brands(name)&thc_percent_total=gte.20&order=thc_percent_total.desc&limit=5

Terpene reference

The terpene encyclopedia: aroma, where else it shows up, common effects, and boiling point for vaping.

GET/rest/v1/terpenes?select=slug,name,scientific_name,aroma_description,also_found_in,common_effects,boiling_point_c&order=name.asc&limit=5

Per-batch terpene readings

Lab results joined across batch_terpenes. Each row links a batch to a terpene with its measured percentage.

GET/rest/v1/batch_terpenes?select=percentage,terpenes(name),product_batches(batch_label)&order=percentage.desc&limit=5

Brands & dispensaries

Producers and storefronts. Small, flat reference tables. Good for building filters or autocompletes.

GET/rest/v1/brands?select=slug,name&order=name.asc&limit=5

Reference tables

Strain types, effects, and consumption methods. The controlled vocabularies behind the catalog.

GET/rest/v1/strain_types?select=slug,name&order=display_order.asc

Privacy, proven

The same public key against a personal table. RLS returns an empty array. The catalog key can't read anyone's sessions.

GET/rest/v1/sessions?select=id,notes&limit=5
Query basics

Shape the response

The API is PostgREST, so the whole query language lives in the URL. A few of the moves you'll reach for most:

select

Pick columns. Smaller payloads, faster reads.

?select=slug,name
filter

Operators: eq, gte, lte, ilike, in, is…

?thc_percent_total=gte.20
ilike

Case-insensitive wildcard text search.

?name=ilike.*dream*
embed

Follow a foreign key in the same request.

?select=name,brands(name)
order

Sort ascending or descending.

?order=created_at.desc
page

limit + offset for classic pagination.

?limit=10&offset=20
Exact counts

Add the request header below to get the total row count without fetching every row. PostgREST returns it in the Content-Range response header (e.g. 0-4/2317 → 2,317 total).

Prefer: count=exact
Fair use

Be a good neighbor

There's no hard rate limit, but the API is backed by Supabase and shared by everyone. Be reasonable: cache responses when you can, page through large tables instead of pulling everything at once, and avoid tight polling loops. If you're building something that needs heavy traffic, email hello@terptrack.cloudand we'll figure it out together.

The catalog is free because lab numbers and strain names shouldn't be locked up. Personal data never touches it. That's baked into the database, not just a policy.