List price changes
Every change to a culture line's price, newest first: what it moved from, what it moved to, when, who or what moved it. Filter with plant_id for one culture line and from and to for a period.
https://app.xplantpro.com/ api/ v1/ pricing/ eventsread:pricingEach amount carries its own currency, and a previous price may be in a different currency from the new one.
Needs culture line pricing in the workspace's plan; without it the answer is FEATURE_NOT_INCLUDED.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
plant_id | string (uuid) | No | Only changes to this culture line's price (a plant id). |
from | string (date-time) | No | Only changes made at or after this time, as an ISO 8601 timestamp. |
to | string (date-time) | No | Only changes made at or before this time, as an ISO 8601 timestamp. |
limit | integer | No | Page size. Values above 200 are capped at 200. Default 50. From 1 to 200. |
offset | integer | No | Number 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. |
cursor | string | No | Continue 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/events?plant_id=0b8e2f4c-6a1d-4c3e-9f7a-2d5b8c1e4a90&from=2026-09-01T00%3A00%3A00Z" \
-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.
| Field | Type | Required | Description |
|---|---|---|---|
id | string (uuid) | Yes | — |
plant_id | string (uuid) | Yes | The culture line whose price changed (a plant id). |
list_price | object | Yes | — |
list_price.amount | string | Yes | An exact decimal, as text — for example "1250.00". Never a floating-point number; parse it with a decimal type. |
list_price.currency | string | null | Yes | ISO 4217 currency code, for example USD. Null only when the record carries no currency. Never add amounts in different currencies. |
previous_list_price | object | null | Yes | The price it moved from, in its own currency. Null for a line's first price. |
price_source | string | Yes | Who 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. |
changed_by | string | null (uuid) | Yes | The workspace member who changed it. Null for an automatic change. |
changed_at | string | null | Yes | When the price moved, as an ISO 8601 timestamp in UTC. |
{
"ok": true,
"data": [
{
"id": "e7b1d3f5-9a2c-4e6b-8d0f-3a5c7e9b1d24",
"plant_id": "6d1b3f8a-4c2e-4a97-b5d0-8e7f2a1c9b43",
"list_price": {
"amount": "18.50",
"currency": "USD"
},
"previous_list_price": {
"amount": "16.00",
"currency": "USD"
},
"price_source": "manual",
"changed_by": "0d7e4b9a-6f21-4c3e-8a5b-2e9f1c7d4a60",
"changed_at": "2026-09-10T09:12:00.000Z"
}
]
}The envelope can also carry meta:
| Field | Type | Required | Description |
|---|---|---|---|
next_cursor | string | null | Yes | Pass as cursor to fetch the next page. null means this is the last page. |
| Response header | Meaning |
|---|---|
X-Request-Id | Identifies this request. Include it when you contact support. |
Errors
| Status | Code | When |
|---|---|---|
401 | UNAUTHORIZED | The key is missing, malformed or revoked, or its owner is no longer a member of the workspace. |
402 | PAID_PLAN_REQUIRED | The 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. |
402 | FEATURE_NOT_INCLUDED | Culture line pricing is not included in your plan. |
403 | FORBIDDEN | The 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. |
403 | DEVICE_TOKEN_NOT_ACCEPTED | A device token was sent; this operation needs a workspace API key. |
404 | NOT_FOUND | plant_id names no culture line in the key's workspace. |
422 | VALIDATION_ERROR | Both cursor and offset were sent; use one. |
422 | INVALID_CURSOR | The cursor is malformed, or came from a different list or different filters. Start again without it. |
422 | VALIDATION_ERROR | A query parameter is malformed, or from is later than to. error names it. |
429 | RATE_LIMIT_EXCEEDED | Too many requests for this key, device token or workspace. Wait Retry-After seconds. |
500 | FEATURE_CHECK_FAILED | Your plan could not be checked. Retry later. |
500 | CULTURE_LINE_PRICE_QUERY_FAILED | The prices could not be read. Retry later. |
Branch on code, never on the error text. See Errors.
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.
JavaScript SDK
@shmaplex/xplant-sdk: a typed server-side client for Node.js 18+ and other fetch runtimes, with retries, timeouts, idempotency and paging built in.