Strains (Catalogue)
Endpoint reference: ✅ Verified live against production on 10 May 2026. Strains are the products in your store. The Dr Green platform handles inventory and fulfilment; your job is to surface the catalogue, filtered to what’s available in the customer’s country, and link strain selections into orders.
Endpoints
| Method | Path | Auth | Description |
|---|---|---|---|
GET | /dapp/strains | API-key + sig | List strains for a country, paginated |
GET | /dapp/strains/{strainId} | API-key + sig | Get one strain with full detail |
DualAuthGuard — JWT (DAPP UI) or API-key+signature (your store).
GET /dapp/strains
List strains available in the given country. Returns a paginated wrapper.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
countryCode | string | Yes | ISO 3166-1 alpha-3 code, uppercase. E.g. GBR, USA, DEU, ZAF. Alpha-2 (GB, US) returns 400. |
page | integer | No (default 1) | 1-indexed page number |
limit | integer | No (default 10) | Items per page (server may cap; 50 is safe) |
search | string | No | Free-text match on strain name |
Canonical payload (for signing)
urlencode(query) — e.g. countryCode=GBR&page=1&limit=10
Response shape (verified)
Strain summary object
Thestrains[] items contain the fields needed to render a catalogue card. The full schema isn’t formally declared in the OpenAPI spec; the verified shape from production includes:
| Field | Type | Notes |
|---|---|---|
id | string (UUID) | Strain identifier — use this everywhere |
name | string | Display name |
imageUrl | string | S3 path or full URL — see § Image URLs |
wholeSalePrice | number (USD) | Holder’s wholesale cost |
retailPrice | number (USD) | Suggested retail to the customer |
currency | string | "USD" for the canonical price |
description | string | Marketing copy |
thcContent / cbdContent | number | Cannabinoid percentages |
strainType | string | e.g. INDICA, SATIVA, HYBRID |
availableCountries | array | Countries this strain ships to |
⚠️ Field set varies by deployment. Always defensively read fields (strain.imageUrl ?? null) — fields can be added without notice.
Worked examples
cURL:Errors specific to this endpoint
| Status | Cause | Fix |
|---|---|---|
400 "countryCode must not be empty" | Missing countryCode query param | Always send it |
400 "countryCode must be a valid ISO 3166-1 alpha-3" | You sent "GB" instead of "GBR" | Use alpha-3 codes |
200 with strains: [] | No strains available in that country | Show an empty-state UI; not an error |
GET /dapp/strains/{strainId}
Get one strain with full detail. Use this when rendering a strain detail page or refreshing data on an item already in the cart.
Path parameters
| Name | Type | Description |
|---|---|---|
strainId | string (UUID) | The id from the list endpoint |
Canonical payload (for signing)
{} — no query params, the empty-params fallback. Not "". See 02-authentication.md § Canonical payload.
Response shape
Worked example (cURL)
Errors
| Status | Cause | Fix |
|---|---|---|
404 "Strain not found" | Strain was soft-deleted by Dr Green admin | Refresh your local cache, drop the stale ID |
401 "User is not authorized" | Signed "" instead of "{}" | Use the canonical payload "{}" |
Image URLs
StrainimageUrl values come in two forms:
- A bare filename / S3 key — e.g.
33eac80b-58c4-46d3-a82b-b70c875d333f-cakes-and-cream.png - A full URL — e.g.
https://cdn.drgreennft.com/strains/...
Caching guidance
The catalogue changes infrequently — new strains land, occasionally one is removed. Cache aggressively:- List response: TTL 5 minutes per
(countryCode, page, limit, search)cache key. - Detail response: TTL 10 minutes per
strainId. - 404 on detail: drop the strain from your local index immediately and refresh the list.