xPlantAPI
API referencePricing and sell-through

List culture line prices

Each priced culture line's current list and wholesale price and its pricing tier, newest first by when the line was first priced. Filter to one culture line with plant_id, or to one tier with pricing_tier.

GET/api/v1/pricing/culture-lines
Scope read:pricing

Every amount is exact decimal text with its currency. Never add amounts in different currencies.

Needs culture line pricing in the workspace's plan; without it the answer is FEATURE_NOT_INCLUDED.

Query parameters

NameTypeRequiredDescription
plant_idstring (uuid)NoOnly this culture line's price. A culture line is identified by its plant id.
pricing_tierstringNoOnly culture lines in this pricing tier, spelled exactly as your lab names it. 1–40 characters.
limitintegerNoPage size. Values above 200 are capped at 200. Default 50. From 1 to 200.
offsetintegerNoNumber of records to skip. Prefer cursor where a list offers it: an offset shifts when records are added ahead of it. Default 0. At least 0.
cursorstringNoContinue from the previous page: pass its meta.next_cursor unchanged, with the same filters. Treat it as opaque. Not combinable with offset. Up to 2048 characters.

Example

curl "https://app.xplantpro.com/api/v1/pricing/culture-lines?plant_id=0b8e2f4c-6a1d-4c3e-9f7a-2d5b8c1e4a90" \
  -H "Authorization: Bearer $XPLANT_API_KEY"

Response

200 with { "ok": true, "data": … }. data is an array. To get the next page, pass meta.next_cursor back as cursor; it is null on the last page. See Pagination.

FieldTypeRequiredDescription
idstring (uuid)Yes—
plant_idstring (uuid)YesThe culture line this price is for (a plant id).
list_priceobjectYes—
list_price.amountstringYesAn exact decimal, as text — for example "1250.00". Never a floating-point number; parse it with a decimal type.
list_price.currencystring | nullYesISO 4217 currency code, for example USD. Null only when the record carries no currency. Never add amounts in different currencies.
wholesale_priceobject | nullYes—
previous_list_priceobject | nullYesThe list price before the latest change, in the currency it was set in. Null until the price has changed once.
pricing_tierstring | nullYesThe line's pricing tier, as your lab names its tiers.
tier_scorestring | nullYesThe score the tier was derived from, as exact decimal text. Not money.
price_sourcestringYesWho set the list price: manual, store_adopted, store_follow. manual is a person typing it, store_adopted a person accepting the price from your store, and store_follow an automatic update that follows your store's price.
price_source_atstring | nullYesWhen the list price was last set that way, as an ISO 8601 timestamp.
notesstring | nullYes—
created_atstring | nullYesWhen the culture line was first priced.
updated_atstring | nullYes—
Response
{
  "ok": true,
  "data": [
    {
      "id": "a4c8e2f6-1b3d-4f5a-9c7e-2d4b6f8a0c12",
      "plant_id": "6d1b3f8a-4c2e-4a97-b5d0-8e7f2a1c9b43",
      "list_price": {
        "amount": "18.50",
        "currency": "USD"
      },
      "wholesale_price": {
        "amount": "11.00",
        "currency": "USD"
      },
      "previous_list_price": {
        "amount": "16.00",
        "currency": "USD"
      },
      "pricing_tier": "B",
      "tier_score": "72.500",
      "price_source": "manual",
      "price_source_at": "2026-09-10T09:12:00.000Z",
      "notes": null,
      "created_at": "2026-02-03T11:40:22.000Z",
      "updated_at": "2026-09-10T09:12:00.000Z"
    }
  ]
}

The envelope can also carry meta:

FieldTypeRequiredDescription
next_cursorstring | nullYesPass as cursor to fetch the next page. null means this is the last page.
Response headerMeaning
X-Request-IdIdentifies this request. Include it when you contact support.

Errors

StatusCodeWhen
401UNAUTHORIZEDThe key is missing, malformed or revoked, or its owner is no longer a member of the workspace.
402PAID_PLAN_REQUIREDThe workspace's plan does not include the API. The full API is included with xPlant+ Teams and Enterprise; on Hobby and Pro Lab, keys can connect devices only.
402FEATURE_NOT_INCLUDEDCulture line pricing is not included in your plan.
403FORBIDDENThe key lacks a scope this operation requires, or its owner's current role in the workspace cannot use it — a key never does more than its owner can in xPlant. error names the scope, and for a role, the role it needs.
403DEVICE_TOKEN_NOT_ACCEPTEDA device token was sent; this operation needs a workspace API key.
404NOT_FOUNDplant_id names no culture line in the key's workspace.
422VALIDATION_ERRORBoth cursor and offset were sent; use one.
422INVALID_CURSORThe cursor is malformed, or came from a different list or different filters. Start again without it.
422VALIDATION_ERRORA query parameter is malformed. error names it.
429RATE_LIMIT_EXCEEDEDToo many requests for this key, device token or workspace. Wait Retry-After seconds.
500FEATURE_CHECK_FAILEDYour plan could not be checked. Retry later.
500CULTURE_LINE_PRICE_QUERY_FAILEDThe prices could not be read. Retry later.

Branch on code, never on the error text. See Errors.

On this page