xPlantAPI
API referenceTransfers and stages

List stages

Every stage one plant or explant has been through, newest first — where it is now and how it got there. Send exactly one of plant_id or explant_id.

GET/api/v1/stages
Scope read:transfers

Stage names are your lab's own, so expect the keys from your workspace's stage list rather than a fixed set.

The list is ordered by entered_on, which can be corrected after the fact: a stage whose date is changed while you page through can move between pages. Stages entered on the same day keep a fixed order.

Query parameters

NameTypeRequiredDescription
plant_idstring (uuid)NoThe plant whose stage history to read. Send exactly one of plant_id or explant_id.
explant_idstring (uuid)NoThe explant whose stage history to read.
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/stages?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—
entity_type"plant" | "explant"YesWhether the stage belongs to a plant or an explant.
entity_idstring (uuid)YesThe plant's or explant's id.
stagestringYesThe stage, usually as a key from your lab's stage list such as multiplication. Records made by older tools can carry the stage's display name instead, such as Multiplication.
statusstringYesactive for the stage the plant or explant is in now, completed for one it has moved on from. Stages can also be failed or archived.
entered_onstring | nullYesWhen it entered this stage, as an ISO 8601 timestamp.
completed_atstring | nullYesWhen it moved on from this stage. Null while the stage is current.
room_idstring | null (uuid)YesThe room it was in for this stage, when one was recorded.
notesstring | nullYes—
created_atstring | nullYes—
Response
{
  "ok": true,
  "data": [
    {
      "id": "6e5d4c3b-2a19-4807-96a5-b4c3d2e1f0a9",
      "entity_type": "explant",
      "entity_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
      "stage": "multiplication",
      "status": "active",
      "entered_on": "2026-09-24T00:00:00+00:00",
      "completed_at": null,
      "room_id": null,
      "notes": "Shoot clusters forming well on the Alocasia line.",
      "created_at": "2026-09-24T08:41:17.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.
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_FOUNDThe plant or explant is not in this 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_ERRORNeither or both of plant_id and explant_id were sent.
429RATE_LIMIT_EXCEEDEDToo many requests for this key, device token or workspace. Wait Retry-After seconds.
500STAGE_QUERY_FAILEDThe stage history could not be read. Retry later.

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

On this page