---
title: "Create a new cycler for a site"
method: POST
path: "/sites/{site_id}/cyclers"
tags: ["Sites", "Cyclers"]
---

# Create a new cycler for a site

`POST /sites/{site_id}/cyclers`

Create a new cycler under the specified site (by ID).

The request body must include ``project_id`` — the project that will own this
cycler. The site is org-scoped (cross-project), so any of the org's sites may
host a cycler for any of its projects. Returns the created cycler and sets the
Location header.

## Path parameters

- `site_id` string, required

## Request body

- object

## Response `201`

Successful Response

- Cycler — Model representing a cycler as returned by the API.
  - `name` string, required — Name of the cycler
  - `manufacturer` string, nullable — Manufacturer (make) of the cycler (e.g. Arbin, Maccor)
  - `model` string, nullable — Model (type) of the cycler (e.g. LBT-5V, Series 4000)
  - `version` string, nullable — Hardware/product version of the cycler. Distinct from firmware_version, which changes without the hardware changing.
  - `serial_number` string, nullable — Manufacturer serial number of the cycler
  - `firmware_version` string, nullable — Firmware revision currently installed on the cycler
  - `hostname` string, nullable — DNS name of the cycler control host on the lab network. Null for an instrument reachable only by IP.
  - `ip_address` string, ipvanyaddress, nullable — IP address of the cycler control host (IPv4 or IPv6)
  - `port` integer, nullable — TCP port the cycler control software listens on (1-65535)
  - `last_calibrated_at` string, date-time, nullable — When the cycler was last calibrated. Null means never calibrated or not tracked — which reads as unknown, not as overdue.
  - `calibration_interval_days` integer, nullable — Maximum time allowed between calibrations, in days. Null means the cycler is not on a calibration schedule.
  - `notes` string, nullable — Free-text notes about the cycler
  - `site_id` string, required — Foreign key to the parent site
  - `project_id` string, required — Project that owns this cycler
  - `id` string, required — Unique identifier for the cycler
  - `organization_id` string, required — Organization this cycler belongs to.
  - `created_by` string, nullable — User ID of the user who created this cycler
  - `created_by_email` string, nullable — Email of the user who created this cycler
  - `created_at` string, date-time, required — Timestamp when the cycler was created
  - `updated_at` string, date-time, required — Timestamp when the cycler was last updated
  - `calibration_due_at` string, date-time, nullable — When calibration next falls due: last_calibrated_at plus calibration_interval_days. Read-only — a generated database column, so it can never disagree with the two fields it derives from. Null when either is unset (the cycler is not on a schedule, or has never been calibrated).
  - `channel_ids` object[], nullable — List of channel IDs belonging to this cycler

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/ionworks/apis/fastapi.md) · [All operations](https://skmtc.dev/ionworks/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/ionworks/fastapi/revisions/7337a3cbdaf2/schema)
