What's new
Recent changes to the xPlant API and the JavaScript SDK, newest first.
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 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.
A run's evidence is paged. Get an SOP run now returns the first 50 pieces of evidence, with meta.events_next_cursor for the rest. The new List a run's evidence walks the whole trail. See 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.
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. It needs API 2.152.0, which is live. See the release notes.
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.
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.
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.
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.
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.
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.
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.
Cursor paging on every list, plus until on sensor readings. See Pagination.
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.
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.