ChaiPCR API Reference

A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification

API Endpoint
http://chaipcr.readme.io/api
Terms of Service: http://helloreverb.com/terms/
Request Content-Types: application/json
Response Content-Types: application/json
Version: 1.0.0

Authentication

access_token

An authorization token is required to be passed for all api calls

name
Authorization
type
apiKey
in
header

Device

Device information

GET /device

Returns device specific information

200 OK

Object containing device information

Response Content-Types: application/json
Response Example (200 OK)
{
  "serial_number": "string",
  "model_number": "string",
  "processor_architecture": "string",
  "software": {
    "version": "string",
    "platform": "string"
  }
}

Device capabilities information

GET /capabilities

Returns device capabilities

200 OK

Object containing device capabilities information

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "capabilities": {
    "plate": {
      "rows": "integer",
      "columns": "integer",
      "min_volume_ul": "integer",
      "max_volume_ul": "integer"
    },
    "optics": {
      "excitation_channels": [
        {
          "begin_wavelength": "integer",
          "end_wavelength": "integer"
        }
      ],
      "emission_channels": [
        {
          "begin_wavelength": "integer",
          "end_wavelength": "integer"
        }
      ]
    },
    "storage": {
      "microsd_size_gb": "integer",
      "emmc_size_gb": "integer"
    },
    "thermal": {
      "lid": {
        "max_temp_c": "integer"
      },
      "block": {
        "min_temp_c": "integer",
        "max_temp_c": "integer"
      }
    }
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Start Device

POST /device/start

start device

Request Example
{
  "experiment_id": "integer (int64)"
}
200 OK

The experiment is started

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Stop Device

POST /device/stop

stop device

200 OK

The current running experiment is stopped

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Resume Device

POST /device/resume

resume device

200 OK

The current paused experiment is resumed

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Device Status

GET /device/status

Returns the current status of the device

200 OK

Object containing device status information

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "experiment_controller": {
    "machine": {
      "state": "string",
      "thermal_state": "string"
    }
  },
  "heat_block": {
    "zone1": {
      "temperature": "float",
      "target_temperature": "float",
      "drive": "float"
    },
    "zone2": {
      "temperature": "float",
      "target_temperature": "float",
      "drive": "float"
    },
    "temperature": "float"
  },
  "lid": {
    "temperature": "float",
    "target_temperature": "float",
    "drive": "float"
  },
  "optics": {
    "intensity": "integer",
    "collect_data": "boolean",
    "lid_open": "boolean",
    "well_number": "integer",
    "photodiode_value": [
      "string"
    ]
  },
  "heat_sink": {
    "temperature": "float",
    "fan_drive": "float"
  },
  "device": {
    "update_available": "string"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Export database

GET /device/export_database

Downloads the current database on the machine to exportdb.zip

200 OK

Downloaded database

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Experiments

List all Experiments

GET /experiments

Returns all experiments from the system sorted by the id

type: string standard
in query

filter by type

200 OK

Object containing list of all the experiments

type
object[]
401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "experiment": {
      "id": "integer (int64)",
      "guid": "string",
      "name": "string",
      "notes": "string",
      "standard_experiment_id": "integer (int64)",
      "type": "string",
      "time_valid": "boolean",
      "created_at": "string (date)",
      "started_at": "string (date)",
      "completed_at": "string (date)",
      "completion_status": "string",
      "completion_message": "string"
    }
  }
]
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Create Experiment

POST /experiments

Creates a new experiment, default protocol will be created

Request Example
{
  "experiment": {
    "name": "string",
    "notes": "string",
    "standard_experiment_id": "integer (int64)",
    "guid": "string",
    "protocol": {
      "lid_temperature": "number (float)",
      "stages": [
        {
          "stage_type": "string",
          "name": "string",
          "num_cycles": "integer (int32)",
          "auto_delta": "boolean",
          "auto_delta_start_cycle": "integer",
          "steps": [
            {
              "temperature": "number (float)",
              "hold_time": "integer",
              "name": "string",
              "pause": "boolean",
              "collect_data": "boolean",
              "delta_temperature": "number (float)",
              "delta_duration_s": "integer",
              "ramp": {
                "rate": "number (float)",
                "collect_data": "boolean"
              }
            }
          ]
        }
      ]
    }
  }
}
200 OK

Created experiment is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "experiment": {
    "id": "integer (int64)",
    "guid": "string",
    "name": "string",
    "notes": "string",
    "standard_experiment_id": "integer (int64)",
    "type": "string",
    "time_valid": "boolean",
    "created_at": "string (date)",
    "started_at": "string (date)",
    "completed_at": "string (date)",
    "completion_status": "string",
    "completion_message": "string",
    "protocol": {
      "id": "integer (int64)",
      "lid_temperature": "number (float)",
      "estimate_duration": "integer (int32)",
      "stages": [
        {
          "id": "integer (int64)",
          "stage_type": "string",
          "name": "string",
          "num_cycles": "integer (int32)",
          "auto_delta": "boolean",
          "auto_delta_start_cycle": "integer",
          "order_number": "integer",
          "steps": [
            {
              "id": "integer (int64)",
              "temperature": "number (float)",
              "hold_time": "integer",
              "name": "string",
              "pause": "boolean",
              "collect_data": "boolean",
              "delta_temperature": "number (float)",
              "delta_duration_s": "integer",
              "order_number": "integer",
              "ramp": {
                "id": "integer (int64)",
                "rate": "number (float)",
                "collect_data": "boolean"
              }
            }
          ]
        }
      ]
    },
    "errors": [
      "string"
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Update Experiment

PUT /experiments/{id}

Updates experiment

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "experiment": {
    "name": "string",
    "notes": "string",
    "standard_experiment_id": "integer (int64)"
  }
}
200 OK

Updated experiment is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "experiment": {
    "id": "integer (int64)",
    "guid": "string",
    "name": "string",
    "notes": "string",
    "standard_experiment_id": "integer (int64)",
    "type": "string",
    "time_valid": "boolean",
    "created_at": "string (date)",
    "started_at": "string (date)",
    "completed_at": "string (date)",
    "completion_status": "string",
    "completion_message": "string"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Copy Experiment

POST /experiments/{experimend_id}/copy

Creates a new copy of the experiment

experiment_id: integer (int64)
in path

Experiment ID

200 OK

Copied experiment is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "experiment": {
    "id": "integer (int64)",
    "guid": "string",
    "name": "string",
    "notes": "string",
    "standard_experiment_id": "integer (int64)",
    "type": "string",
    "time_valid": "boolean",
    "created_at": "string (date)",
    "started_at": "string (date)",
    "completed_at": "string (date)",
    "completion_status": "string",
    "completion_message": "string",
    "protocol": {
      "id": "integer (int64)",
      "lid_temperature": "number (float)",
      "estimate_duration": "integer (int32)",
      "stages": [
        {
          "id": "integer (int64)",
          "stage_type": "string",
          "name": "string",
          "num_cycles": "integer (int32)",
          "auto_delta": "boolean",
          "auto_delta_start_cycle": "integer",
          "order_number": "integer",
          "steps": [
            {
              "id": "integer (int64)",
              "temperature": "number (float)",
              "hold_time": "integer",
              "name": "string",
              "pause": "boolean",
              "collect_data": "boolean",
              "delta_temperature": "number (float)",
              "delta_duration_s": "integer",
              "order_number": "integer",
              "ramp": {
                "id": "integer (int64)",
                "rate": "number (float)",
                "collect_data": "boolean"
              }
            }
          ]
        }
      ]
    },
    "errors": [
      "string"
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Show Experiment

GET /experiments/{experimend_id}

Returns a single experiment based on the id

experiment_id: integer (int64)
in path

Experiment ID

200 OK

Fetched experiment is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "experiment": {
    "id": "integer (int64)",
    "guid": "string",
    "name": "string",
    "notes": "string",
    "standard_experiment_id": "integer (int64)",
    "type": "string",
    "time_valid": "boolean",
    "created_at": "string (date)",
    "started_at": "string (date)",
    "completed_at": "string (date)",
    "completion_status": "string",
    "completion_message": "string",
    "protocol": {
      "id": "integer (int64)",
      "lid_temperature": "number (float)",
      "estimate_duration": "integer (int32)",
      "stages": [
        {
          "id": "integer (int64)",
          "stage_type": "string",
          "name": "string",
          "num_cycles": "integer (int32)",
          "auto_delta": "boolean",
          "auto_delta_start_cycle": "integer",
          "order_number": "integer",
          "steps": [
            {
              "id": "integer (int64)",
              "temperature": "number (float)",
              "hold_time": "integer",
              "name": "string",
              "pause": "boolean",
              "collect_data": "boolean",
              "delta_temperature": "number (float)",
              "delta_duration_s": "integer",
              "order_number": "integer",
              "ramp": {
                "id": "integer (int64)",
                "rate": "number (float)",
                "collect_data": "boolean"
              }
            }
          ]
        }
      ]
    },
    "errors": [
      "string"
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Delete Experiment

DELETE /experiments/{experimend_id}

Deletes the experiment from the database based on id

experiment_id: integer (int64)
in path

Experiment ID

200 OK

Experiment deleted

401 Unauthorized

Not authorized

422 Unprocessable Entity

Experiment deleted error

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}
Response Example (422 Unprocessable Entity)
{
  "errors": [
    "string"
  ]
}

Retrieve well layout

GET /experiments/{experimend_id}/well_layout

Retrieve all targets and samples sort by well number

experiment_id: integer (int64)
in path

Experiment ID

200 OK

WellLayout

type
401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "samples": [
      {
        "id": "integer (int64)",
        "name": "string",
        "notes": "string",
        "well_num": "integer"
      }
    ],
    "targets": [
      {
        "id": "integer (int64)",
        "name": "string",
        "channel": "integer",
        "imported": "boolean",
        "well_num": "integer",
        "well_type": "string",
        "quantity": {
          "m": "float",
          "b": "integer"
        },
        "omit": "boolean"
      }
    ]
  }
]
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Retrieve temperature data

GET /experiments/{experimend_id}/temperature_data

Returns the temperature data of an experiment based on the parameters specified

experiment_id: integer (int64)
in path

Experiment ID

starttime: integer (int64)
in query

Starting time in ms for temperature data

endtime: integer (int64)
in query

If not specified, it returns everything to the end of the experiment, in ms

resolution: integer (int64)
in query

Include data points for every x milliseconds. Must be a multiple of 1000 ms

Temperature data

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "elapsed_time": "integer (int64)",
    "lid_temp": "number (float)",
    "heat_block_zone_1_temp": "number (float)",
    "heat_block_zone_2_temp": "number (float)"
  }
]
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Retrieve amplification data

GET /experiments/{experimend_id}/amplification_data

Returns the amplification data of an experiment based on the parameters specified

experiment_id: integer (int64)
in path

Experiment ID

raw: boolean false
in query

If raw data should be returned, by default it is not returned

background: boolean true
in query

If background subtracted data should be returned, by default it is returned

baseline: boolean true
in query

If baseline subtracted data should be returned, by default it is returned

firstderiv: boolean true
in query

If first derivative data should be returned, by default it is returned

secondderiv: boolean true
in query

If second derivative data should be returned, by default it is returned

summary: boolean true
in query

If cq values should be returned, by default it is returned

step_id: integer[]
in query

?

ramp_id: integer[]
in query

?

Amplification data

202 Accepted

Job accepted

304 Not Modified

Amplification data is not modified if etag is the same

401 Unauthorized

Not authorized

500 Internal Server Error

Unexpected error

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "partial": "boolean",
    "total_cycles": "integer",
    "steps": [
      {
        "step_id": "integer",
        "amplification_data": [
          [
            {
              "target_id": "integer",
              "well_num": "integer",
              "cycle_num": "integer",
              "background_subtracted_value": "integer",
              "baseline_subtracted_value": "integer",
              "dr1_pred": "integer",
              "dr2_pred": "integer",
              "fluorescence_value": "integer"
            }
          ]
        ],
        "summary_data": [
          [
            {
              "target_id": "integer",
              "well_num": "integer",
              "replic_group": "integer",
              "cq": "integer",
              "quantity_m": "float",
              "quantity_b": "integer",
              "mean_cq": "float",
              "mean_quantity_m": "float",
              "mean_quantity_b": "integer"
            }
          ]
        ],
        "targets": [
          [
            {
              "target_id": "integer",
              "name": "integer",
              "equation": {
                "slope": "float",
                "offset": "float",
                "efficiency": "float",
                "r2": "float"
              }
            }
          ]
        ]
      }
    ]
  }
]
Response Example (401 Unauthorized)
{
  "errors": "string"
}
Response Example (500 Internal Server Error)
{
  "errors": "string"
}

Retrieve melt curve data

GET /experiments/{experimend_id}/melt_curve_data

Returns the melt curve data of an experiment based on the parameters specified

experiment_id: integer (int64)
in path

Experiment ID

raw: boolean false
in query

If raw data should be returned, by default it is not returned

normalized: boolean true
in query

If normalized data should be returned, by default it is returned

derivative: boolean true
in query

If derivative data should be returned, by default it is returned

tm: boolean true
in query

If tm values should be returned, by default it is returned

ramp_id: integer[]
in query

?

200 OK

Melt curve data along with etag header

202 Accepted

Job accepted

304 Not Modified

Melt curve data is not modified if etag is the same

401 Unauthorized

Not authorized

500 Internal Server Error

Unexpected error

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "partial": "boolean",
    "ramps": [
      {
        "ramp_id": "integer",
        "melt_curve_data": [
          {
            "well_num": "integer",
            "target_id": "integer",
            "temperature": "array",
            "normalized_data": "array",
            "derivative_data": "array",
            "tm": "array",
            "area": "array"
          }
        ],
        "targets": [
          {
            "target_id": "integer",
            "target_name": "string"
          }
        ]
      }
    ]
  }
]
Response Example (401 Unauthorized)
{
  "errors": "string"
}
Response Example (500 Internal Server Error)
{
  "errors": "string"
}

Export Experiment

GET /experiments/{experimend_id}/export

Downloads a zip file which has csv files for temperature, amplification and meltcurve data

experiment_id: integer (int64)
in path

Experiment ID

200 OK

Zipped data

type
string (binary)
202 Accepted

Job accepted

401 Unauthorized

Not authorized

default

Unexpected error

Response Content-Types: application/zip
Response Example (200 OK)
"string (binary)"
Response Example (401 Unauthorized)
{
  "errors": "string"
}
Response Example (default )
{
  "errors": "string"
}

AmplificationOptions

Amplification Options

GET /experiments/{experiment_id}/amplification_option

Returns the amplification options for the experiment

experiment_id: integer (int64)
in path

Experiment ID

Returns an object amplification_option which has the list of options

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "amplification_option": {
    "cq_method": "string",
    "baseline_method": "string",
    "min_fluorescence": "string",
    "min_reliable_cycle": "string",
    "min_d1": "integer (int32)",
    "min_d2": "boolean",
    "baseline_cycle_bounds": "string"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Update Amplification Options

PUT /experiments/{experiment_id}/amplification_option

Updates the passed amplification options for the experiment

Amplification options to update

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "amplification_option": {
    "cq_method": "string",
    "baseline_method": "string",
    "min_fluorescence": "string",
    "min_reliable_cycle": "string",
    "min_d1": "integer (int32)",
    "min_d2": "boolean",
    "baseline_cycle_bounds": "string"
  }
}

Returns an object amplification_option which has the list of options

401 Unauthorized

Not authorized

422 Unprocessable Entity

Not allowed if experiment is derived from GUID

Response Content-Types: application/json
Response Example (200 OK)
{
  "amplification_option": {
    "cq_method": "string",
    "baseline_method": "string",
    "min_fluorescence": "string",
    "min_reliable_cycle": "string",
    "min_d1": "integer (int32)",
    "min_d2": "boolean",
    "baseline_cycle_bounds": "string"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}
Response Example (422 Unprocessable Entity)
{
  "errors": "string"
}

Protocols

Update Protocol

PUT /protocols/{protocol_id}

Updates the passed protocol data for the experiment

protocol_id: integer (int64)
in path

Protocol ID

Request Example
{
  "protocol": {
    "lid_temperature": "number (float)"
  }
}
200 OK

Returns an object protocol which has the list of protocol properties

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "protocol": {
    "id": "integer (int64)",
    "lid_temperature": "number (float)",
    "estimate_duration": "integer (int32)"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Ramps

Update Ramp

PUT /ramps/{ramp_id}

Updates the passed ramp data for the experiment

ramp_id: integer (int64)
in path

Ramp ID

Request Example
{
  "ramp": {
    "rate": "number (float)",
    "collect_data": "boolean"
  }
}
200 OK

Returns an object ramp which has the list of ramp properties

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "ramp": {
    "id": "integer (int64)",
    "rate": "number (float)",
    "collect_data": "boolean"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Login

Login

POST /login

Logs in the user

Request Example
{
  "email": "string",
  "password": "string"
}
201 Created

User is logged in to the application. Cookie will be set with the authentication token, the token will expire in a day

Response Content-Types: application/json
Response Example (201 Created)
{
  "user_id": "integer",
  "authentication_token": "string"
}

Logout

POST /logout

Logout of the application and redirected to the login page

200 OK

User is logged out

Response Content-Types: application/json

Stages

Create Stage

POST /protocols/{protocol_id}/stages

Create a new stage with default steps created

protocol_id: integer (int64)
in path

Protocol ID

Request Example
{
  "prev_id": "integer (int64)",
  "stage": {
    "stage_type": "string",
    "name": "string",
    "num_cycles": "integer (int32)",
    "auto_delta": "boolean",
    "auto_delta_start_cycle": "integer"
  }
}
200 OK

Created stage is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "stage": {
    "id": "integer (int64)",
    "stage_type": "string",
    "name": "string",
    "num_cycles": "integer (int32)",
    "auto_delta": "boolean",
    "auto_delta_start_cycle": "integer",
    "order_number": "integer",
    "steps": [
      {
        "id": "integer (int64)",
        "temperature": "number (float)",
        "hold_time": "integer",
        "name": "string",
        "pause": "boolean",
        "collect_data": "boolean",
        "delta_temperature": "number (float)",
        "delta_duration_s": "integer",
        "order_number": "integer",
        "ramp": {
          "id": "integer (int64)",
          "rate": "number (float)",
          "collect_data": "boolean"
        }
      }
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Update Stage

PUT /stages/{stage_id}

Update properties of a stage

stage_id: integer (int64)
in path

Stage ID

Request Example
{
  "stage": {
    "stage_type": "string",
    "name": "string",
    "num_cycles": "integer (int32)",
    "auto_delta": "boolean",
    "auto_delta_start_cycle": "integer"
  }
}
200 OK

Updated stage is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "stage": {
    "id": "integer (int64)",
    "stage_type": "string",
    "name": "string",
    "num_cycles": "integer (int32)",
    "auto_delta": "boolean",
    "auto_delta_start_cycle": "integer",
    "order_number": "integer"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Delete Stage

DELETE /stages/{stage_id}

Delete the entire stage

stage_id: integer (int64)
in path

Stage ID

200 OK

Stage is Deleted

401 Unauthorized

Not authorized

422 Unprocessable Entity

Stage delete error

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}
Response Example (422 Unprocessable Entity)
{
  "errors": [
    "string"
  ]
}

Reorder Stage

POST /stages/{stage_id}/move

Reorder a stage, prev_id is the stage id where this stage goes after

stage_id: integer (int64)
in path

Stage ID

Request Example
{
  "prev_id": "integer (int64)"
}
200 OK

Moved Stage

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "stage": {
    "id": "integer (int64)",
    "stage_type": "string",
    "name": "string",
    "num_cycles": "integer (int32)",
    "auto_delta": "boolean",
    "auto_delta_start_cycle": "integer",
    "order_number": "integer"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Steps

Create Step

POST /stages/{stage_id}/steps

Create a new step in the stage -- if step is created with no params, it will be the same as previous step; when step is created, default ramp with max rate (5) is created, the ramp is used before this step is reached

stage_id: integer (int64)
in path

Stage ID

Request Example
{
  "prev_id": "integer (int64)",
  "step": {
    "temperature": "number (float)",
    "hold_time": "integer",
    "name": "string",
    "pause": "boolean",
    "collect_data": "boolean",
    "delta_temperature": "number (float)",
    "delta_duration_s": "integer"
  }
}
200 OK

Created step is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "step": {
    "id": "integer (int64)",
    "temperature": "number (float)",
    "hold_time": "integer",
    "name": "string",
    "pause": "boolean",
    "collect_data": "boolean",
    "delta_temperature": "number (float)",
    "delta_duration_s": "integer",
    "order_number": "integer",
    "ramp": {
      "id": "integer (int64)",
      "rate": "number (float)",
      "collect_data": "boolean"
    }
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Update Step

PUT /steps/{step_id}

Update properties of a step

step_id: integer (int64)
in path

Step ID

Request Example
{
  "step": {
    "temperature": "number (float)",
    "hold_time": "integer",
    "name": "string",
    "pause": "boolean",
    "collect_data": "boolean",
    "delta_temperature": "number (float)",
    "delta_duration_s": "integer"
  }
}
200 OK

Updated step is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "step": {
    "id": "integer (int64)",
    "temperature": "number (float)",
    "hold_time": "integer",
    "name": "string",
    "pause": "boolean",
    "collect_data": "boolean",
    "delta_temperature": "number (float)",
    "delta_duration_s": "integer",
    "order_number": "integer"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Delete Step

DELETE /steps/{step_id}

If last step in the asoociated stage is destroyed, the stage will be destroyed too if it is not the last stage in the protocol.

step_id: integer (int64)
in path

Step ID

200 OK

Step is Deleted

401 Unauthorized

Not authorized

422 Unprocessable Entity

Step delete error

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}
Response Example (422 Unprocessable Entity)
{
  "errors": [
    "string"
  ]
}

Reorder Step

POST /steps/{step_id}/move

Reorder a step, prev_id is the step id where this step goes after

step_id: integer (int64)
in path

Step ID

Request Example
{
  "prev_id": "integer (int64)"
}
200 OK

Updated step is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "step": {
    "id": "integer (int64)",
    "temperature": "number (float)",
    "hold_time": "integer",
    "name": "string",
    "pause": "boolean",
    "collect_data": "boolean",
    "delta_temperature": "number (float)",
    "delta_duration_s": "integer",
    "order_number": "integer"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Users

List all Users

GET /users

Gives a list of all the users

200 OK

User response

type
object[]
401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "user": {
      "id": "integer (int64)",
      "name": "string",
      "email": "string",
      "role": "string",
      "show_banner": "boolean"
    }
  }
]
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Create User

POST /users

Create an user -- only allowed by admin

Request Example
{
  "user": {
    "name": "string",
    "email": "string",
    "role": "string",
    "show_banner": "boolean"
  }
}
200 OK

User response

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "user": {
    "id": "integer (int64)",
    "name": "string",
    "email": "string",
    "role": "string",
    "show_banner": "boolean"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Show Current User

GET /users/current

Show the current user

200 OK

Current user response

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "user": {
    "id": "integer (int64)",
    "name": "string",
    "email": "string",
    "role": "string",
    "show_banner": "boolean"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Show User

GET /users/{user_id}

show user for the specified id

200 OK

user response

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "user": {
    "id": "integer (int64)",
    "name": "string",
    "email": "string",
    "role": "string",
    "show_banner": "boolean"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Update User

PUT /users/{id}

If you are admin, you can update any user; otherwise, you can only update yourself

id: object
in path

User id

Request Example
{
  "user": {
    "name": "string",
    "email": "string",
    "role": "string",
    "show_banner": "boolean"
  }
}
200 OK

User response

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "user": {
    "id": "integer (int64)",
    "name": "string",
    "email": "string",
    "role": "string",
    "show_banner": "boolean"
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Delete User

DELETE /users/{id}

Delete a user -- only allowed by admin

id: object
in path

User ID

200 OK

User Deleted

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Samples

List all samples

GET /experiments/{experiment_id}/samples

List all samples for the experiment sort by id

experiment_id: integer (int64)
in path

Experiment ID

200 OK

Object containing list of all the samples

type
401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "id": "integer (int64)",
    "name": "string",
    "notes": "string",
    "samples_wells": [
      {
        "well_num": "integer"
      }
    ]
  }
]
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Create Sample

POST /experiments/{experiment_id}/samples

Create a new sample for the experiment

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "sample": {
    "name": "string",
    "notes": "string"
  }
}
200 OK

Created sample is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "sample": {
    "id": "integer (int64)",
    "name": "string",
    "notes": "string",
    "samples_wells": [
      {
        "well_num": "integer"
      }
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Update Sample

PUT /experiments/{experiment_id}/samples/{sample_id}

Update properties of a sample

sample_id: integer (int64)
in path

Sample ID

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "sample": {
    "name": "string",
    "notes": "string"
  }
}
200 OK

Updated sample is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "sample": {
    "id": "integer (int64)",
    "name": "string",
    "notes": "string",
    "samples_wells": [
      {
        "well_num": "integer"
      }
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Delete sample

DELETE /experiments/{experiment_id}/samples/{sample_id}
sample_id: integer (int64)
in path

Sample ID

experiment_id: integer (int64)
in path

Experiment ID

200 OK

Sample is Deleted

401 Unauthorized

Not authorized

422 Unprocessable Entity

Sample delete error

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}
Response Example (422 Unprocessable Entity)
{
  "errors": [
    "string"
  ]
}

Link Sample

POST /experiments/{experiment_id}/samples/{sample_id}/links

Link sample to a well

sample_id: integer (int64)
in path

Sample ID

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "wells": [
    "integer"
  ]
}
200 OK

Updated sample is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "sample": {
    "id": "integer (int64)",
    "name": "string",
    "notes": "string",
    "samples_wells": [
      {
        "well_num": "integer"
      }
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Unlink Sample

POST /experiments/{experiment_id}/samples/{sample_id}/unlinks

Unlink sample from a well

sample_id: integer (int64)
in path

Sample ID

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "wells": [
    "integer"
  ]
}
200 OK

Updated sample is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "sample": {
    "id": "integer (int64)",
    "name": "string",
    "notes": "string",
    "samples_wells": [
      {
        "well_num": "integer"
      }
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Targets

List all targets

GET /experiments/{experiment_id}/targets

List all targets for the experiment sort by id

experiment_id: integer (int64)
in path

Experiment ID

200 OK

Object containing list of all the targets

type
401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
[
  {
    "id": "integer (int64)",
    "name": "string",
    "channel": "integer",
    "imported": "boolean",
    "targets_wells": [
      {
        "well_num": "integer",
        "well_type": "string",
        "quantity": {
          "m": "float",
          "b": "integer"
        },
        "omit": "boolean"
      }
    ]
  }
]
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Create Target

POST /experiments/{experiment_id}/targets

Create a new target for the experiment

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "target": {
    "name": "string",
    "channel": "integer"
  }
}
200 OK

Created target is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "target": {
    "id": "integer (int64)",
    "name": "string",
    "channel": "integer",
    "imported": "boolean",
    "targets_wells": [
      {
        "well_num": "integer",
        "well_type": "string",
        "quantity": {
          "m": "float",
          "b": "integer"
        },
        "omit": "boolean"
      }
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Update Target

PUT /experiments/{experiment_id}/targets/{target_id}

Update properties of a target

target_id: integer (int64)
in path

Target ID

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "target": {
    "name": "string",
    "channel": "integer"
  }
}
200 OK

Updated target is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "target": {
    "id": "integer (int64)",
    "name": "string",
    "channel": "integer",
    "imported": "boolean",
    "targets_wells": [
      {
        "well_num": "integer",
        "well_type": "string",
        "quantity": {
          "m": "float",
          "b": "integer"
        },
        "omit": "boolean"
      }
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Delete target

DELETE /experiments/{experiment_id}/targets/{target_id}

If target is imported and linked to another experiment, it is not allowed to be deleted.

target_id: integer (int64)
in path

Target ID

experiment_id: integer (int64)
in path

Experiment ID

200 OK

Target is Deleted

401 Unauthorized

Not authorized

422 Unprocessable Entity

Target delete error

Response Content-Types: application/json
Response Example (401 Unauthorized)
{
  "errors": "string"
}
Response Example (422 Unprocessable Entity)
{
  "errors": [
    "string"
  ]
}

Link Target

POST /experiments/{experiment_id}/targets/{target_id}/links

Link target to a well -- first time to call will create the link, subsequent calls will update any changed parameters

target_id: integer (int64)
in path

Target ID

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "wells": [
    {
      "well_num": "integer",
      "well_type": "string",
      "quantity": {
        "m": "float",
        "b": "integer"
      },
      "omit": "boolean"
    }
  ]
}
200 OK

Updated target is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "target": {
    "id": "integer (int64)",
    "name": "string",
    "channel": "integer",
    "imported": "boolean",
    "targets_wells": [
      {
        "well_num": "integer",
        "well_type": "string",
        "quantity": {
          "m": "float",
          "b": "integer"
        },
        "omit": "boolean"
      }
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Unlink Target

POST /experiments/{experiment_id}/targets/{target_id}/unlinks

Unlink target from a well

target_id: integer (int64)
in path

Target ID

experiment_id: integer (int64)
in path

Experiment ID

Request Example
{
  "wells": [
    "integer"
  ]
}
200 OK

Updated target is returned

401 Unauthorized

Not authorized

Response Content-Types: application/json
Response Example (200 OK)
{
  "target": {
    "id": "integer (int64)",
    "name": "string",
    "channel": "integer",
    "imported": "boolean",
    "targets_wells": [
      {
        "well_num": "integer",
        "well_type": "string",
        "quantity": {
          "m": "float",
          "b": "integer"
        },
        "omit": "boolean"
      }
    ]
  }
}
Response Example (401 Unauthorized)
{
  "errors": "string"
}

Schema Definitions

AmplificationData:

partial: boolean

Keep polling the data until partial is false

total_cycles: integer

Number of cycles for the experiment

steps: AmplificationDataSteps

Contains amplification data for each step

AmplificationDataSteps
Example
{
  "partial": "boolean",
  "total_cycles": "integer",
  "steps": [
    {
      "step_id": "integer",
      "amplification_data": [
        [
          {
            "target_id": "integer",
            "well_num": "integer",
            "cycle_num": "integer",
            "background_subtracted_value": "integer",
            "baseline_subtracted_value": "integer",
            "dr1_pred": "integer",
            "dr2_pred": "integer",
            "fluorescence_value": "integer"
          }
        ]
      ],
      "summary_data": [
        [
          {
            "target_id": "integer",
            "well_num": "integer",
            "replic_group": "integer",
            "cq": "integer",
            "quantity_m": "float",
            "quantity_b": "integer",
            "mean_cq": "float",
            "mean_quantity_m": "float",
            "mean_quantity_b": "integer"
          }
        ]
      ],
      "targets": [
        [
          {
            "target_id": "integer",
            "name": "integer",
            "equation": {
              "slope": "float",
              "offset": "float",
              "efficiency": "float",
              "r2": "float"
            }
          }
        ]
      ]
    }
  ]
}

AmplificationDataSteps:

step_id: integer

Step id

amplification_data: object[][]

Two dimensional array like [['target_id', 'well_num', 'cycle_num', 'background_subtracted_value', 'baseline_subtracted_value', 'dr1_pred', 'dr2_pred' 'fluorescence_value'], [1, 1, 1, 25488, -2003, 34543, 453344, 86], [1, 1, 2, 53984, -409, 56345, 848583, 85]]

object[]
object
target_id: integer

Target ID

well_num: integer

Well number from 1 to 16

cycle_num: integer

Cycle number

background_subtracted_value: integer

?

baseline_subtracted_value: integer

?

dr1_pred: integer

?

dr2_pred: integer

?

fluorescence_value: integer

?

summary_data: object[][]

Two dimensional array like [['target_id','well_num','replic_group','cq','quantity_m','quantity_b','mean_cq','mean_quantity_m','mean_quantity_b'], [1,1,null,null,null,null,null,null,null], [2,12,1,7.314787,4.0,2,6.9858934999999995,4.0,2], [2,14,1,6.657,4.0,2,6.9858934999999995,4.0,2], [2,3,null,6.2,5.7952962,14,null,null,null]]

object[]
object
target_id: integer

Target ID

well_num: integer

Well number from 1 to 16

replic_group: integer

?

cq: integer

?

quantity_m: float

?

quantity_b: integer

?

mean_cq: float

?

mean_quantity_m: float

?

mean_quantity_b: integer

?

targets: object[][]

Two dimensional array like [['id','name','equation'],[1,'target1',null],[2,'target2',{'slope':-0.064624,'offset':7.154049,'efficiency':2979647189313701.5,'r2':0.221279}]]

object[]
object
target_id: integer

Target ID

name: integer Ch 1 or Ch 2

Target name

equation: object
slope: float
offset: float
efficiency: float
r2: float
Example
{
  "step_id": "integer",
  "amplification_data": [
    [
      {
        "target_id": "integer",
        "well_num": "integer",
        "cycle_num": "integer",
        "background_subtracted_value": "integer",
        "baseline_subtracted_value": "integer",
        "dr1_pred": "integer",
        "dr2_pred": "integer",
        "fluorescence_value": "integer"
      }
    ]
  ],
  "summary_data": [
    [
      {
        "target_id": "integer",
        "well_num": "integer",
        "replic_group": "integer",
        "cq": "integer",
        "quantity_m": "float",
        "quantity_b": "integer",
        "mean_cq": "float",
        "mean_quantity_m": "float",
        "mean_quantity_b": "integer"
      }
    ]
  ],
  "targets": [
    [
      {
        "target_id": "integer",
        "name": "integer",
        "equation": {
          "slope": "float",
          "offset": "float",
          "efficiency": "float",
          "r2": "float"
        }
      }
    ]
  ]
}

Amplification_option:

amplification_option: object
cq_method: string Cy0, cpD2

Cy0:A Cq calling method based on the max first derivative of the curve (recommended). cpD2:A Cq calling method based on the max second derivative of the curve.

baseline_method: string sigmoid, linear, median

baseline method

min_fluorescence: string

The minimum fluorescence threshold for Cq calling. Cq values will not be called when the fluorescence is below this threshold.

min_reliable_cycle: string

The earliest cycle to use in Cq calling & baseline subtraction. Data for earlier cycles will be ignored.

min_d1: integer (int32)

The threshold which the first derivative of the curve must exceed for a Cq to be called.

min_d2: boolean false

The threshold which the second derivative of the curve must exceed for a Cq to be called.

baseline_cycle_bounds: string Auto, Manual

Automatically or manually detect the baseline cycles

Example
{
  "amplification_option": {
    "cq_method": "string",
    "baseline_method": "string",
    "min_fluorescence": "string",
    "min_reliable_cycle": "string",
    "min_d1": "integer (int32)",
    "min_d2": "boolean",
    "baseline_cycle_bounds": "string"
  }
}

Capabilities:

capabilities: object
plate: object
rows: integer

Josh to describe

columns: integer

Josh to describe

min_volume_ul: integer

Josh to describe

max_volume_ul: integer

Josh to describe

optics: object
excitation_channels: CapabilitiesWavelength
CapabilitiesWavelength
emission_channels: CapabilitiesWavelength
CapabilitiesWavelength
storage: object
microsd_size_gb: integer

Storage capacity of the micro sd card in gb

emmc_size_gb: integer

emmc size in gb

thermal: object
lid: object
max_temp_c: integer

Temperature in celcius

block: object
min_temp_c: integer

Temperature in celcius

max_temp_c: integer

Temperature in celcius

Example
{
  "capabilities": {
    "plate": {
      "rows": "integer",
      "columns": "integer",
      "min_volume_ul": "integer",
      "max_volume_ul": "integer"
    },
    "optics": {
      "excitation_channels": [
        {
          "begin_wavelength": "integer",
          "end_wavelength": "integer"
        }
      ],
      "emission_channels": [
        {
          "begin_wavelength": "integer",
          "end_wavelength": "integer"
        }
      ]
    },
    "storage": {
      "microsd_size_gb": "integer",
      "emmc_size_gb": "integer"
    },
    "thermal": {
      "lid": {
        "max_temp_c": "integer"
      },
      "block": {
        "min_temp_c": "integer",
        "max_temp_c": "integer"
      }
    }
  }
}

CapabilitiesWavelength:

begin_wavelength: integer

Starting wavelength

end_wavelength: integer

Ending wavelength

Example
{
  "begin_wavelength": "integer",
  "end_wavelength": "integer"
}

Device:

serial_number: string

Serial number of the device

model_number: string

Hardware model number of the device

processor_architecture: string

Device processor architecture

software: object
version: string

Current software version

platform: string

Current software platform

Example
{
  "serial_number": "string",
  "model_number": "string",
  "processor_architecture": "string",
  "software": {
    "version": "string",
    "platform": "string"
  }
}

DeviceStatus:

experiment_controller: object
machine: object
state: string

Status of the machine

thermal_state: string

Thermal state of the machine

heat_block: object
zone1: object
temperature: float

Temperature in celcius

target_temperature: float

Temperature in celcius

drive: float

?

zone2: object
temperature: float

Temperature in celcius

target_temperature: float

Temperature in celcius

drive: float

?

temperature: float

Temperature in celcius

lid: object
temperature: float

Temperature in celcius

target_temperature: float

Temperature in celcius

drive: float

?

optics: object
intensity: integer

?

collect_data: boolean

If data is being collected or not

lid_open: boolean

If lid is open or closed

well_number: integer

Well number

photodiode_value: string[]

?

string
heat_sink: object
temperature: float

Temperature in celcius

fan_drive: float

?

device: object
update_available: string

If an update is available or not

Example
{
  "experiment_controller": {
    "machine": {
      "state": "string",
      "thermal_state": "string"
    }
  },
  "heat_block": {
    "zone1": {
      "temperature": "float",
      "target_temperature": "float",
      "drive": "float"
    },
    "zone2": {
      "temperature": "float",
      "target_temperature": "float",
      "drive": "float"
    },
    "temperature": "float"
  },
  "lid": {
    "temperature": "float",
    "target_temperature": "float",
    "drive": "float"
  },
  "optics": {
    "intensity": "integer",
    "collect_data": "boolean",
    "lid_open": "boolean",
    "well_number": "integer",
    "photodiode_value": [
      "string"
    ]
  },
  "heat_sink": {
    "temperature": "float",
    "fan_drive": "float"
  },
  "device": {
    "update_available": "string"
  }
}

ErrorMessage:

errors: string
Example
{
  "errors": "string"
}

ErrorModel:

errors: string[]
string
Example
{
  "errors": [
    "string"
  ]
}

Experiment:

id: integer (int64)
guid: string

GUID of the experiment

name: string

Name of the experiment

notes: string

Notes of the experiment

standard_experiment_id: integer (int64)

imported standard experiment id

type: string user, diagnostic, calibration, test_kit

experiment type

time_valid: boolean
created_at: string (date)

Date at which the experiment was created

started_at: string (date)

Date at which the experiment was started

completed_at: string (date)

Date at which the experiment was completed

completion_status: string

If the experiment was completed successfully or aborted

completion_message: string

?

Example
{
  "id": "integer (int64)",
  "guid": "string",
  "name": "string",
  "notes": "string",
  "standard_experiment_id": "integer (int64)",
  "type": "string",
  "time_valid": "boolean",
  "created_at": "string (date)",
  "started_at": "string (date)",
  "completed_at": "string (date)",
  "completion_status": "string",
  "completion_message": "string"
}

FullExperiment:

guid: string

GUID of the experiment

protocol: FullProtocol
Example
{
  "id": "integer (int64)",
  "guid": "string",
  "name": "string",
  "notes": "string",
  "standard_experiment_id": "integer (int64)",
  "type": "string",
  "time_valid": "boolean",
  "created_at": "string (date)",
  "started_at": "string (date)",
  "completed_at": "string (date)",
  "completion_status": "string",
  "completion_message": "string",
  "protocol": {
    "id": "integer (int64)",
    "lid_temperature": "number (float)",
    "estimate_duration": "integer (int32)",
    "stages": [
      {
        "id": "integer (int64)",
        "stage_type": "string",
        "name": "string",
        "num_cycles": "integer (int32)",
        "auto_delta": "boolean",
        "auto_delta_start_cycle": "integer",
        "order_number": "integer",
        "steps": [
          {
            "id": "integer (int64)",
            "temperature": "number (float)",
            "hold_time": "integer",
            "name": "string",
            "pause": "boolean",
            "collect_data": "boolean",
            "delta_temperature": "number (float)",
            "delta_duration_s": "integer",
            "order_number": "integer",
            "ramp": {
              "id": "integer (int64)",
              "rate": "number (float)",
              "collect_data": "boolean"
            }
          }
        ]
      }
    ]
  },
  "errors": [
    "string"
  ]
}

MeltCurveData:

partial: boolean

Keep polling the data until partial is false

ramps: object[]

Contains temperature, normalized_data, derivative_data, tm and area arrays

object
ramp_id: integer
melt_curve_data: object[]

[{'well_num':1, 'target_id':1, 'temperature':[0,1,2,3,4,5], 'normalized_data':[0,1,2,3,4,5], 'derivative_data':[0,1,2,3,4,5], 'tm':[1,2,3], 'area':[2,4,5]}, {'well_num':2, 'target_id':1, 'temperature':[0,1,2,3,4,5], 'normalized_data':[0,1,2,3,4,5], 'derivative_data':[0,1,2,3,4,5], 'tm':[1,2,3], 'area':[2,4,5]}]

object
well_num: integer

Well number from 1 to 16

target_id: integer

Target ID

temperature: array

Temperature, in degree C

normalized_data: array

?

derivative_data: array

?

tm: array

?

area: array

?

targets: object[]

[{'target_id':1,'target_name':'Ch 1'},{'target_id':2,'target_name':'Ch 2'}]

object
target_id: integer

Target ID

target_name: string Ch 1 or Ch 2

Target name

Example
{
  "partial": "boolean",
  "ramps": [
    {
      "ramp_id": "integer",
      "melt_curve_data": [
        {
          "well_num": "integer",
          "target_id": "integer",
          "temperature": "array",
          "normalized_data": "array",
          "derivative_data": "array",
          "tm": "array",
          "area": "array"
        }
      ],
      "targets": [
        {
          "target_id": "integer",
          "target_name": "string"
        }
      ]
    }
  ]
}

Protocol:

id: integer (int64)
lid_temperature: number (float) 110

Lid temperature, in degree C, default is 110, with precision to one decimal point

estimate_duration: integer (int32)

Estimated duration in seconds

Example
{
  "id": "integer (int64)",
  "lid_temperature": "number (float)",
  "estimate_duration": "integer (int32)"
}

FullProtocol:

Example
{
  "id": "integer (int64)",
  "lid_temperature": "number (float)",
  "estimate_duration": "integer (int32)",
  "stages": [
    {
      "id": "integer (int64)",
      "stage_type": "string",
      "name": "string",
      "num_cycles": "integer (int32)",
      "auto_delta": "boolean",
      "auto_delta_start_cycle": "integer",
      "order_number": "integer",
      "steps": [
        {
          "id": "integer (int64)",
          "temperature": "number (float)",
          "hold_time": "integer",
          "name": "string",
          "pause": "boolean",
          "collect_data": "boolean",
          "delta_temperature": "number (float)",
          "delta_duration_s": "integer",
          "order_number": "integer",
          "ramp": {
            "id": "integer (int64)",
            "rate": "number (float)",
            "collect_data": "boolean"
          }
        }
      ]
    }
  ]
}

Ramp:

id: integer (int64)
rate: number (float) 0 ≤ x ≤ 5 0

Rate of the ramp, in degrees C/s, precision to 8 decimal point

collect_data: boolean false

Collect data

Example
{
  "id": "integer (int64)",
  "rate": "number (float)",
  "collect_data": "boolean"
}

Stage:

id: integer (int64)
stage_type: string holding, cycling, meltcurve
name: string <stage_type> Stage

Stage name

num_cycles: integer (int32) x ≥ 1

Number of cycles in a stage, must be >= 1, default to 1

auto_delta: boolean false

Auto Delta, default is false

auto_delta_start_cycle: integer

Cycle to start delta temperature

order_number: integer

Sort order

Example
{
  "id": "integer (int64)",
  "stage_type": "string",
  "name": "string",
  "num_cycles": "integer (int32)",
  "auto_delta": "boolean",
  "auto_delta_start_cycle": "integer",
  "order_number": "integer"
}

FullStage:

Example
{
  "id": "integer (int64)",
  "stage_type": "string",
  "name": "string",
  "num_cycles": "integer (int32)",
  "auto_delta": "boolean",
  "auto_delta_start_cycle": "integer",
  "order_number": "integer",
  "steps": [
    {
      "id": "integer (int64)",
      "temperature": "number (float)",
      "hold_time": "integer",
      "name": "string",
      "pause": "boolean",
      "collect_data": "boolean",
      "delta_temperature": "number (float)",
      "delta_duration_s": "integer",
      "order_number": "integer",
      "ramp": {
        "id": "integer (int64)",
        "rate": "number (float)",
        "collect_data": "boolean"
      }
    }
  ]
}

Step:

id: integer (int64)
temperature: number (float)

Temperature of the step, in degree C, with precision to one decimal point

hold_time: integer

Hold time of the step, in seconds, 0 means infinite

name: string Step <order_number>

Step name

pause: boolean false

Device will be paused when the step is reached

collect_data: boolean false

Collect data

delta_temperature: number (float)

Delta temperature, in degree C, with precision to two decimal points

delta_duration_s: integer

Delta duration, in second

order_number: integer

Sort order

Example
{
  "id": "integer (int64)",
  "temperature": "number (float)",
  "hold_time": "integer",
  "name": "string",
  "pause": "boolean",
  "collect_data": "boolean",
  "delta_temperature": "number (float)",
  "delta_duration_s": "integer",
  "order_number": "integer"
}

FullStep:

ramp: Ramp

Ramp before this step is reached

Example
{
  "id": "integer (int64)",
  "temperature": "number (float)",
  "hold_time": "integer",
  "name": "string",
  "pause": "boolean",
  "collect_data": "boolean",
  "delta_temperature": "number (float)",
  "delta_duration_s": "integer",
  "order_number": "integer",
  "ramp": {
    "id": "integer (int64)",
    "rate": "number (float)",
    "collect_data": "boolean"
  }
}

WellLayout:

Example
{
  "samples": [
    {
      "id": "integer (int64)",
      "name": "string",
      "notes": "string",
      "well_num": "integer"
    }
  ],
  "targets": [
    {
      "id": "integer (int64)",
      "name": "string",
      "channel": "integer",
      "imported": "boolean",
      "well_num": "integer",
      "well_type": "string",
      "quantity": {
        "m": "float",
        "b": "integer"
      },
      "omit": "boolean"
    }
  ]
}

WellLayoutSample:

Example
{
  "id": "integer (int64)",
  "name": "string",
  "notes": "string",
  "well_num": "integer"
}

WellLayoutTarget:

Example
{
  "id": "integer (int64)",
  "name": "string",
  "channel": "integer",
  "imported": "boolean",
  "well_num": "integer",
  "well_type": "string",
  "quantity": {
    "m": "float",
    "b": "integer"
  },
  "omit": "boolean"
}

Sample:

id: integer (int64)
name: string

Sample name

notes: string

Sample notes

Example
{
  "id": "integer (int64)",
  "name": "string",
  "notes": "string"
}

FullSample:

samples_wells: SampleWell
SampleWell
Example
{
  "id": "integer (int64)",
  "name": "string",
  "notes": "string",
  "samples_wells": [
    {
      "well_num": "integer"
    }
  ]
}

SampleWell:

well_num: integer

Well number from 1 to 16

Example
{
  "well_num": "integer"
}

Target:

id: integer (int64)
name: string

Target name

channel: integer 1, 2

Target channel

imported: boolean

If set to true, target is imported from a different experiment

Example
{
  "id": "integer (int64)",
  "name": "string",
  "channel": "integer",
  "imported": "boolean"
}

FullTarget:

targets_wells: TargetWell
TargetWell
Example
{
  "id": "integer (int64)",
  "name": "string",
  "channel": "integer",
  "imported": "boolean",
  "targets_wells": [
    {
      "well_num": "integer",
      "well_type": "string",
      "quantity": {
        "m": "float",
        "b": "integer"
      },
      "omit": "boolean"
    }
  ]
}

TargetWell:

well_num: integer

Well number from 1 to 16

well_type: string standard, unknown, positive_control, negative_control
quantity: object

set when well_type is standard

m: float

has to be > 0, with 1 digit before dot, and precision to 8 decimal point

b: integer
omit: boolean false

If set to true, target in this well is not included in the standard curve calculation

Example
{
  "well_num": "integer",
  "well_type": "string",
  "quantity": {
    "m": "float",
    "b": "integer"
  },
  "omit": "boolean"
}

TemperatureData:

elapsed_time: integer (int64)

in milliseconds

lid_temp: number (float)

Temperature, in degree C, with precision to two decimal points

heat_block_zone_1_temp: number (float)

Temperature, in degree C, with precision to two decimal points

heat_block_zone_2_temp: number (float)

Temperature, in degree C, with precision to two decimal points

Example
{
  "elapsed_time": "integer (int64)",
  "lid_temp": "number (float)",
  "heat_block_zone_1_temp": "number (float)",
  "heat_block_zone_2_temp": "number (float)"
}

User:

id: integer (int64)
name: string
email: string
role: string
show_banner: boolean true

Show getting started banner

Example
{
  "id": "integer (int64)",
  "name": "string",
  "email": "string",
  "role": "string",
  "show_banner": "boolean"
}