# What's new

> Recent changes to the xPlant API and the JavaScript SDK, newest first.

Source: https://docs.xplantpro.com/docs/whats-new

Changes to the v1 API are additive or clearly flagged here. Each endpoint's page always reflects the API as it runs in production.

## September 26, 2026

**Close SOP runs from the API.** [Complete an SOP run](https://docs.xplantpro.com/docs/api/sops/complete-sop-run.md) ends a run as `completed`, `failed` or `cancelled`, exactly as closing it in xPlant does. A `failed` run raises the same deviation alert. See [Run an SOP from a bench station](https://docs.xplantpro.com/docs/guides/sop-runs.md#4-close-the-run).

**A run's evidence is paged.** [Get an SOP run](https://docs.xplantpro.com/docs/api/sops/get-sop-run.md) now returns the first 50 pieces of evidence, with `meta.events_next_cursor` for the rest. The new [List a run's evidence](https://docs.xplantpro.com/docs/api/sops/list-sop-run-events.md) walks the whole trail. See [Reading a run back](https://docs.xplantpro.com/docs/guides/sop-runs.md#reading-a-run-back).

**Rate-limit headers.** Every successful response and every `429` now carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`, so you can slow down before you hit the limit. See [Rate limits](https://docs.xplantpro.com/docs/rate-limits.md#watching-your-budget).

**SDK 0.7.0** covers all three. `sopRuns.complete()` closes a run, and `sopRuns.listEvents()` pages its evidence. `sopRuns.get()` follows the cursor itself, so `run.events` is still the whole trail. `client.rateLimit` holds the latest budget, for [pacing a bulk job](https://docs.xplantpro.com/docs/sdk.md#pacing-a-bulk-job). It needs API 2.152.0, which is live. See the [release notes](https://github.com/shmaplex/xplant_sdk/releases/tag/v0.7.0).

**Transfer dates are calendar days.** Send `transfer_date` as a day such as `2026-09-24`, and read the day back from the first ten characters of the returned timestamp. See [Record transfers and stages](https://docs.xplantpro.com/docs/guides/transfers-and-stages.md).

**Custom task categories.** Tasks take an optional `category_label` for your lab's own category: send `category: "other"` with a label of up to 60 characters. See [Sync tasks](https://docs.xplantpro.com/docs/guides/sync-tasks.md).

**Stage moves are all-or-nothing.** A move either completes or changes nothing; a failure answers `500 STAGE_ADVANCE_FAILED` and is safe to retry with the same `Idempotency-Key`. See [Record transfers and stages](https://docs.xplantpro.com/docs/guides/transfers-and-stages.md).

**Validation errors name the field**, for example `sop_id: Invalid uuid`, on label scans, SOP runs and step evidence.

**SDK 0.6.3** covers the task, stage and validation changes, and `transfers.create()` now takes `custom_fields`, as plants and explants do. See the [SDK page](https://docs.xplantpro.com/docs/sdk.md).

## September 25, 2026

**Timestamps accept offsets.** `recorded_at`, `occurred_at`, `scanned_at` and the other timestamp fields take `Z` or an offset such as `+02:00`.

**Safer retries for devices.** Device events take an `external_id`. A repeated sensor reading or device event answers `201` with the stored record and `meta.duplicate: true`. See [Idempotency](https://docs.xplantpro.com/docs/idempotency.md).

**SOP training.** Starting a run follows your lab's training rules: `403 TRAINING_REQUIRED` when enforcement blocks, or `meta.training_warning` when it warns. See [Run an SOP from a bench station](https://docs.xplantpro.com/docs/guides/sop-runs.md).

**Stages and transfers.** Stages are checked against your lab's stage list, and only the culture's creator or a manager can move one (`403 STAGE_WRITE_FORBIDDEN`). Transfers take a `status` (`completed` or `pending`), and both appear in [change history](https://docs.xplantpro.com/docs/guides/change-history.md).

**Cursor paging on every list,** plus `until` on sensor readings. See [Pagination](https://docs.xplantpro.com/docs/pagination.md).

**Request IDs.** Every response carries `X-Request-Id`; quote it when you contact support.

**New endpoints:** contaminations, comments, media files, media recipes, creating and updating plants and explants, equipment, culture line pricing and sell-through. See the [API reference](https://docs.xplantpro.com/docs/api.md).

**Plans and roles.** A key never does more than its owner can in xPlant, and plans set which parts of the API a key can use. See [Plans and access](https://docs.xplantpro.com/docs/authentication.md#plans-and-access).
