{"openapi":"3.1.0","servers":[{"url":"https://api.materials.zone/v2beta1"}],"info":{"title":"Materials Zone API","version":"2.0.0","description":"MaterialsZone's RESTful API is designed to facilitate seamless integration with your existing systems, enabling you to automate workflows, connect diverse data sources, and perform domain-specific analysis. With a straightforward, predictable URL structure and support for standard HTTP methods (POST, GET, PUT, DELETE), our API is built for ease of use and flexibility.\n\n> 💡 **API Examples Repository**: Check out our [MaterialsZone API Examples](https://github.com/materialscloud/materials-zone-api-examples) repository for practical Python code samples demonstrating how to use the API for various use cases.\n\n# Authentication and Security\n\nEach user within the organization can request a private API key, ensuring secure authentication and enabling an audit trail. API keys can be rotated upon request at any desired frequency. The API key is provided in the header of each request, as explained in the \"Getting Started\" section below. \n\nAll data stored in MaterialsZone is securely segregated, ensuring your organization's information remains isolated and protected. Permissions within the organization can be managed using MaterialsZone's permission system to control access to specific data.\n\nData is encrypted both in transit and at rest, ensuring that all communication with our API is secure and that stored data is safeguarded against unauthorized access.\n\n# Getting Started\n\nMaterialsZone's API provides access to resources via structured URI paths. The API uses the standard HTTP methods like GET, POST, PUT, and DELETE and uses the JSON format for the payload and response of the requests. Each resource and its available operations are described in detail in the sections below.\n\nThe URI of every request consists of the domain `https://api.materials.zone`, the path of the endpoint prefixed by the version of the API, and the API key passed as a header `authorization`. In addition, some endpoints may require passing a path parameter and a payload in JSON format. Requests can be made using the command line tool CURL, Python's `requests` library or any other method.\n\n# Understanding the Entities of MaterialsZone\n\nWhen working with the MaterialsZone API, you’re not just dealing with technical data structures — you’re managing your own materials data in a way that mirrors your real-world workflows. Let’s walk through the key **entities** of the platform, from a user’s perspective.\n\n## Organizing with Folders and Tables\n\nYour workspace starts with **folders**. Think of them like project directories — you can use them to group **tables** based on product lines, sites, experiments, or organizational teams. Folders can even contain other folders, allowing you to build a clear, navigable hierarchy.\n\nInside each folder, you'll place **tables**. Each table is a structured dataset — for example, a table of raw materials or a table of experiments. Tables define the structure of your data and store the actual records (called **items**).\n\n## Capturing Data with Items, Parameters, and Values\n\nEach row in a table is called an **item**. For instance:\n- An item in your \"Raw Materials\" table might represent a specific grade of aluminum.\n- An item in your \"Experiments\" table could describe one formulation you tested.\n\nThe columns of the table are known as **parameters**. These define what kind of information you’re collecting — like \"Density\" (a quantity with units), \"Supplier\" (a link to another item), or \"Is Hazardous\" (a boolean).\n\nEach **value** is a single cell in the table — the data point where an item and a parameter intersect.\n\n## Calculating Values with Formulas\n\nParameters can be of type **CALCULATION**, enabling you to create columns whose values are automatically computed from other columns. Calculations use **Excel-style formulas**, making them intuitive for anyone familiar with spreadsheets. To reference another parameter in your formula, simply use its UUID. For example, a formula like `=5c8a9b2d-3f1e-4a6b-8c9d-1e2f3a4b5c6d * 2` would multiply the value of the referenced parameter by 2. You can use standard Excel functions such as `average`, `median` and many others to build complex calculations. This allows you to perform domain-specific computations directly within your table structure.\n\nSupported functions: `average`, `median`, `stdev`, `min`, `max`, `sum`, `product`, `exp`, `ln`, `sqrt`, `abs`, `mod`, `power`, `sumproduct`, `exact`.\nSupported constants: `pi`, `e`.\n\n**Examples:**\n- Simple arithmetic: `=b5755771-503d-4079-b968-5c61503e9a17 * 2 + 10`\n- Using functions: `=average(b5755771-503d-4079-b968-5c61503e9a17, aac6ecd3-3404-4709-82cf-32fa567738e1)`\n- With constants: `=pi * power(b5755771-503d-4079-b968-5c61503e9a17, 2)`\n- Complex calculation: `=sqrt(sum(power(b5755771-503d-4079-b968-5c61503e9a17, 2), power(aac6ecd3-3404-4709-82cf-32fa567738e1, 2)))`\n\n## Structuring Columns with Protocols\n\nTo keep your columns organized, parameters are grouped into **protocols**. Protocols function like sections or categories for your table’s columns.\n\nThere are two kinds:\n- **Standard protocols**, for general information (e.g., \"Processing Parameters\", \"Performance Metrics\").\n- **Formulation protocols**, used to define the **composition** of a sample — specifying ingredients and their amounts. These are especially useful when describing how materials are made.\n\nFor example, in an \"Experiments\" table, you might have:\n- A “Processing Parameters” protocol for temperature, duration, and pressure,\n- A “Composition” formulation protocol listing the raw materials used,\n- A “Performance” protocol with results like hardness or optical properties.\n\n## Enriching Items with Measurements\n\nBeyond just tabular data, each item can have attached **measurements** — files such as:\n- Spectroscopy outputs,\n- Microscope images,\n- PDFs like technical or safety data sheets (TDS, SDS).\n\nBefore a measurement file can be analyzed or visualized, it must be **parsed** — converted into a structured format MaterialsZone can work with. This is done using a **parser**, which you choose when uploading the file. If you don’t see a suitable parser, contact your customer success rep to request one.\n\n## Managing Parsers\n\nParsers are used to convert instrument-specific output files (e.g. CSVs) into a standardized MaterialsZone format that can be displayed in the web app.\n\nYour instrument may not yet be supported by the system’s built-in parsers. If that’s the case, you can create your own custom parser.\n\nCreating your own custom parsers is currently only supported for tabular, text files (E.g. CSV, the various Excel formats, or any text file in a tabular structure). If your files are not in a tabular, text format, contact your customer success rep to request a parser to suit your needs.\n\n### Creating a Custom Parser\n\nTo create a parser, refer to the **Python examples – post request** section below.\n\nYou will need to:\n- Replace the example URL (https://...) with the parser API endpoint you wish to use (listed at the bottom of this page).\n- Replace <api-key> with your own API key.\n- Replace the example payload with the payload format required by the specific parser API you are calling (also detailed below).\n\nParsers created by your organization are private and accessible only to users within your organization.\nThere are also system parsers, created by our team, which are available to all users.\n\nIf you attempt to create a parser that duplicates an existing one in your organization, the API will notify you and return the existing parser's code so you can use it immediately.\n\n### Configuring a Parser\n\nYou can customize how your parser interprets CSV (or other tabular) files through several configuration fields.\n\n#### Column Configuration\n\nUse the **parserConfiguration.configurationColumns** field to specify:\n\n- Which columns to keep.  \n- The name each column should have in the parsed result (**columnNameInResult**).  \n- The unit of measurement for each column (**unit**).  \n\nColumns can be referenced by using one of:\n- **Index** (starting at 0) using **columnIndexInFile**  \n- **Name** using **columnNameInFile** (this can only be used if the first row of the file contains column headers)\n\nYou can configure all of your columns using either indexes or names, but not a combination of both.\n\nColumn values may currently only be integers, floats, or scientific notations. E.g. 5, -10.7, +9.26, 1e20, -2.7E+4, +5e-3. \n\nString values are not currently supported. E.g. 49:21:51, 2021-09-17T00:09:57.\n\nUnits may be complex and contain some math functions. E.g. \"meter\" or \"m\", \"meter/second\" or \"m/s\", \"m/s^2\", \"newton*meter\", \"m^2\", \"m^3\", \"cm^-1\".\n\nUnits may include metric or binary prefixes such as kilo, mega, giga, deci, centi, milli, micro, nano, kibi, mebi, etc.\nPrefixes must be written directly before the unit with no spaces. Examples: kilometer or km, piconewton*meter, mebimeter^2, kilogram/nanometer, µmeter or µm.\n\nGeneric units: \"dimensionless\", \"arbitrary_units\".\n\n#### Metadata and Footer Rows\n\nIf your file contains non-tabular content (e.g. metadata or notes) before or after the main data table:\n\n- Use **parserConfiguration.metadataExpected** to skip rows before the table.  \n- Use **parserConfiguration.footerExpected** to skip rows after the table.\n\n#### Computed Columns\n\nYou can generate new columns from existing data using the **parserConfiguration.computedColumns** field.  \n\nEach computed column must specify:\n\n- Input columns (referenced by **parserConfiguration.configurationColumns.columnNameInResult**, not by **columnNameInFile** or **columnIndexInFile**).  \n- A result column name (**computedColumnName**).  \n- A unit (**unit**).\n\nSupported fuctions:\n- **ABSOLUTE_DELTA** Should have exactly one input column. For each row it computes the absolute value of the difference between subsequent cells of the column, the first cell is set to null. The results have the same unit as the input.\n- **ABSOLUTE_TIMES_SIGN** Should have exactly two input columns. For each row it multiplies the absolute value of one column by the sign of the second one. The results have the same unit as the first input column.\n- **DELTA** Should have exactly one input column. For each row it computes the difference between subsequent cells of the column, the first cell is set to null. The results have the same unit as the input.\n- **DIVIDE** Should have exactly two input columns. For each row it divides the value of the first column by the value of the second column. The result unit is determined by dividing the first column’s unit by the second column’s unit.\nFor example, if the inputs have units meter and second, the result will have the unit meter/second.\n- **DIVIDE_BY_TWO_ROUND_UP** Should have exactly one input column. For each row it divides a the value of the column by 2 and rounds up to the closest integer. The results have the same unit as the input.\n- **IDENTITY** Should have exactly one input column. For each row it sets the same value as the one in the input column. The results have the same unit as the input.\n\nYou may assign any unit to a computed column, as long as it is convertible from the function’s output unit.\nFor example, applying the IDENTITY function to a column with the unit second produces results in seconds. If you set the computed column’s unit to hour, the values will be automatically converted.\nUnits must remain compatible (you cannot convert grams to meters).\nIf the units cancel out (for example, dividing two columns both in meters), the result should use the dimensionless unit.\n\n### Enabling or Disabling Parsers\n\nParsers can be temporarily disabled (without deleting them) by setting the **enabledState** field to false.\n\n### Parser Codes\n\nEach parser is automatically assigned a unique code (e.g. `AB-CD-EF-25`), derived from the first two alphanumeric characters of:\n- **physicalMeasurement**\n- **instrumentManufacturer**  \n- **instrumentModel**\n\nAn incremental counter is appended to ensure uniqueness.  \nEach combination can be used up to 100 times per organization.\n\n### Required Fields\n\nWhen creating a parser, the mandatory fields are  **name**, **physicalMeasurement**, **instrumentModel**, **instrumentManufacturer**, **viewType**, and **supportedFileExtensions**.\n If you are not sure what the **viewType** should be, start with **VIEW_2D_CUSTOM_AXES**.\n **supportedFileExtensions** is a list of file extensions. E.g. ['csv','xlsx','txt'].\n\n## Extra Tools: Files, Jobs, and Job Runs\n\nSome advanced processes rely on a few utility entities:\n- **Files** are general-purpose objects used for managing uploads and downloads.\n- **Jobs** are background processes — like parsing, ETLs, or custom workflows — that run in the cloud.\n- **Job Runs** track the execution and status of these jobs (queued, running, completed, etc.).\n\nYou typically won’t need to interact with these unless a special workflow has been set up for your organization. If so, your customer success representative can guide you.\n\n## Summary\n\nTo recap, here’s how it all connects:\n- **Folders** organize **tables**.\n- **Tables** contain **items** (rows).\n- **Items** are described by **parameters** (columns), grouped into **protocols**.\n- **Values** fill the cells of the table.\n- **Measurements** add rich data and attachments.\n- **Parsers** ingest instrument output files into viewable formats.\n- **Jobs**, **job runs** and **files** power backend processes.\n\nAll of these entities can be accessed and managed via the MaterialsZone API — giving you full control over your data and automation workflows.\n\n# CURL examples\n\nAs a simple example, let us look at the request to fetch all folders that are accessible to the user.\nFetch all folders using CURL:\n\n```shell\ncurl -X GET \"https://api.materials.zone/v2beta1/folders\" --header 'authorization: <api-key>'\n```\n\nCreate new table:\n\n```shell\ncurl -X POST \"https://api.materials.zone/v2beta1/tables\" \\\n  --header 'content-type: application/json' \\\n  --header 'authorization: <api-key>' \\\n  --data '{\n    \"title\": \"My New Table\"\n  }'\n```\n\n# Python examples - get request\n\nFetch all folders using Python's `requests` library can be made as follows:\n\n```python\nimport requests\n\nurl = \"https://api.materials.zone/v2beta1/folders\"\nheaders = {\n    'authorization': '<api-key>'\n}\n\nresponse = requests.get(url, headers=headers)\n\n# Check the status code and print the response\nif response.status_code == 200:\n    print(\"Success!\")\n    print(response.json())  # If the response is in JSON format\nelse:\n    print(f\"Request failed with status code: {response.status_code}\")\n    print(response.text)\n```\n\n# Python examples - post request\n\nCreate new table using Python's `requests` library:\n\n```python\nimport requests\n\nurl = \"https://api.materials.zone/v2beta1/tables\"\nheaders = {\n    'content-type': 'application/json',\n    'authorization': '<api-key>'\n}\npayload = {\n    'title': 'My New Table'\n}\n\nresponse = requests.post(url, headers=headers, json=payload)\n\n# Check the status code and print the response\nif response.status_code == 201:\n    print(\"Table created successfully!\")\n    print(response.json())  # If the response is in JSON format\nelse:\n    print(f\"Request failed with status code: {response.status_code}\")\n    print(response.text)\n```\n\n# Python examples - multipart post request\n\nCreate new measurement using Python's `requests` library:\n\n```python\nimport requests\n\nurl = \"https://api.materials.zone/v2beta1/items/{item_id}/measurements\"\nheaders = {'authorization': '<api-key>'}\npayload = {\n    'title': 'My New Measurement',\n    'parserCode': '<PARSER-CODE>'\n}\nfile_path = 'path/to/your/measurement_file.csv'\nfiles = {\n    'rawFile': ('measurement_file.csv', open(file_path, 'rb'), 'text/csv')\n}\nresponse = requests.post(url, headers=headers, data=payload, files=files)\n\n# Check the status code and print the response\nif response.status_code == 201:\n    print(\"Measurement created successfully!\")\n    print(response.json())  # If the response is in JSON format\nelse:\n    print(f\"Request failed with status code: {response.status_code}\")\n    print(response.text)\n```\n\n# Pagination\n\nRequests that can return a large amount of data, such as the /tables/{tableId}/items GET request to get all items from a table, use pagination to limit the response size. The response of paginated requests will have the following format:\n\n```json\n{\n  \"data\": [...],\n  \"pagination\": {\n    \"startCursor\": \"eyJuYW1lIjo...mZhbHNlfQ==\",\n    \"endCursor\":   \"eyJwcm9kdWN...GFibGUiXX0=\",\n    \"hasNextPage\": true\n  }\n}\n```\n\nEach returned page will contain a list of the returned data (the \"page\") and a \"pagination\" object with: \n- \"startCursor\" - a string that uniquely identifies the first item in the list\n- \"endCursor\" - a string that uniquely identifies the last item in the list\n- \"hasNextPage\" - a boolean field indicating whether there is another page to request.\n\nAfter obtaining a page, the next page can be requested by passing the end cursor of the previous page as the query parameter \"cursor\" in the subsequent request. If the \"cursor\" parameter is not passed, the first page is returned. In addition, the page size can be specified by passing the \"pageSize\" query parameter. Its default value is 100.  \n\nHere is a Python snippet that shows how to construct a list consisting of all the items in a table by looping over all pages:\n\n```python\nimport requests\n\n# Example usage\nbase_url = \"https://api.materials.zone/v2beta1\"\ntable_id = \"9b14a7ab-6d02-4f72-9329-abfdf21002ee\"\napi_key = \"abcd1234\"\n\n# Construct the API endpoint URL using the base URL and the table_id\nurl = f\"{base_url}/tables/{table_id}/items\"\n\n# Set up the headers for the request, indicating that the content type is JSON\nheaders = {\"authorization\": api_key}\n\n# Initialize the cursor to None; this will be used for pagination\ncursor = None\n\n# Initialize an empty list to store all the items fetched from the API\nall_items = []\n\n# Loop to fetch all pages of data from the API\nwhile True:\n    # cursor as query parameters\n    headers = {\"authorization\": api_key}\n    params = {}\n    if cursor:\n        params[\"cursor\"] = cursor\n\n    # Make the GET request to the API endpoint with the payload, headers, and params\n    response = requests.get(url, headers=headers, params=params)\n    \n    # Check if the request was successful (HTTP status code 200)\n    if response.status_code != 200:\n        print(f\"Request failed with status code: {response.status_code}\")\n        print(response.text)\n        break\n    \n    # Parse the JSON response\n    data = response.json()\n    \n    # Add the items from the current page to the list of all items\n    all_items.extend(data['data'])\n    \n    # Check if there is another page of data to fetch\n    if data['pagination']['hasNextPage']:\n        # Update the cursor to the endCursor of the current page to fetch the next page\n        cursor = data['pagination']['endCursor']\n    else:\n        # No more pages to fetch, break out of the loop\n        break\n\n# Print the total number of items fetched\nprint(f\"Fetched {len(all_items)} items.\")\n```\n\n# Operations\n\nBelow is a comprehensive list of all operations supported by the MaterialsZone API, detailing the required parameters and the response schema for each operation.\n\n"},"tags":[{"name":"folders","description":"Folders are used to organize other Folders and Tables."},{"name":"tables","description":"Tables are organized in folders, and contain Items."},{"name":"protocols","description":"Protocols are used to group parameters in tables."},{"name":"parameters","description":"Parameters are used to define the structure of columns in tables."},{"name":"items","description":"Items are the rows in tables."},{"name":"measurements","description":"Measurements are the files that are uploaded to the system and can be parsed."},{"name":"files","description":"Files are used to store data not related to specific items."},{"name":"jobs","description":"Jobs are used to perform long running tasks."},{"name":"parsers","description":"Parsers are used to convert instrument specific output files to a MaterialsZone common format."}],"components":{"responses":{"NotFound":{"description":"The specified resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]},"PageInfo":{"properties":{"endCursor":{"type":"string","description":"Last cursor on the page.","nullable":true},"startCursor":{"type":"string","description":"First cursor on the page.","nullable":true},"hasNextPage":{"type":"boolean","description":"Whether there is a next page available."}},"required":["endCursor","startCursor","hasNextPage"]},"Table":{"properties":{"description":{"type":"string","description":"Description of this table.","example":"This table contains items with material properties.","nullable":true},"folderId":{"type":"string","format":"uuid","description":"UUID of the parent folder.","nullable":true},"id":{"type":"string","format":"uuid","description":"UUID of this table."},"protocols":{"type":"array","description":"The list of protocols (column groups) in this table. Each item is either a Protocol or a FormulationProtocol.","items":{"oneOf":[{"$ref":"#/components/schemas/Protocol"},{"$ref":"#/components/schemas/FormulationProtocol"}]},"nullable":true},"title":{"type":"string","description":"Title of this table.","example":"Material Properties"},"hash":{"type":"string","description":"Hash for optimistic concurrency control."}},"required":["id","title","description","folderId","protocols","hash"]},"ItemsList":{"properties":{"pagination":{"$ref":"#/components/schemas/PageInfo"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Item"}}}},"BatchCreateItemsRequest":{"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CreateItem"}}},"required":["items"]},"BatchUpdateItem":{"allOf":[{"$ref":"#/components/schemas/UpdateItem"},{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"UUID of the item to update."}},"required":["id"]}]},"BatchUpdateItemsRequest":{"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BatchUpdateItem"}}},"required":["items"]},"BatchIngestTableItemOutput":{"properties":{"id":{"type":"string","format":"uuid"},"code":{"type":"string"},"action":{"type":"string","enum":["CREATED","UPDATED","NOT_CHANGED"]}},"required":["id","code","action"]},"BaseProtocol":{"properties":{"id":{"type":"string","format":"uuid","description":"UUID of this protocol."},"title":{"type":"string","description":"Title of this protocol.","example":"Measured properties"},"description":{"type":"string","description":"Description of this protocol (column group).","example":"This protocol contains parameters representing the measurement conditions.","nullable":true},"hash":{"type":"string","description":"Hash for optimistic concurrency control."}},"required":["id","title","description","hash"]},"Protocol":{"allOf":[{"$ref":"#/components/schemas/BaseProtocol"},{"type":"object","properties":{"type":{"type":"string","description":"The type of the protocol, will always be PROTOCOL here.","enum":["PROTOCOL"],"example":"PROTOCOL"},"unit":{"type":"null","description":"Only relevant for formulation protocols. Will always return null here.","example":null},"titleTableIds":{"type":"array","description":"Only relevant for formulation protocols. Will always return an empty list here.","items":{},"example":[]},"parameters":{"type":"array","description":"The list of parameters (columns) in this protocol.","items":{"$ref":"#/components/schemas/Parameter"}}},"required":["type","unit","titleTableIds","parameters"]}]},"FormulationProtocol":{"allOf":[{"$ref":"#/components/schemas/BaseProtocol"},{"type":"object","properties":{"type":{"type":"string","description":"The type of the protocol, will always be FORMULATION here.","enum":["FORMULATION"],"example":"FORMULATION"},"unit":{"type":"string","description":"The unit this formulation protocol's components are measured in.","example":"%","nullable":true},"titleTableIds":{"type":"array","description":"The list of tables (UUIDs) from which the user may choose items for the formulation.","items":{"type":"string","format":"uuid"}},"parameters":{"type":"array","description":"Only relevant for non-formulation protocols. Will always return an empty list here.","items":{},"example":[]}},"required":["type","unit","titleTableIds","parameters"]}]},"Parser":{"properties":{"id":{"type":"string","format":"uuid","description":"The id of this parser."},"code":{"type":"string","description":"The code of this parser, used to easily identify it.","example":"ME-MA-MO-00"},"name":{"type":"string","example":"CSV Parser for JEOL JSM IT700HR","description":"The name of this parser."},"description":{"type":"string","example":"Parses the <Date>.part4.csv files output from the JEOL JSM IT700HR","description":"The description of this parser.","nullable":true},"type":{"type":"string","enum":["ARCHIVE","CSV","PARSER_SERVICE","BROWSER"],"example":"CSV","description":"The type of this parser."},"physicalMeasurement":{"type":"string","description":"The physical measurement whose data is parsed by this parser.","example":"Fourier-Transform Infrared Spectroscopy"},"instrumentModel":{"type":"string","description":"The model of the instrument used to measure the data parsed by this parser.","example":"JSM IT700HR"},"instrumentManufacturer":{"type":"string","description":"The manufacturer of the instrument used to measure the data parsed by this parser.","example":"JEOL"},"enabledState":{"type":"boolean","description":"The enabled state of this parser, false means it cant be used.","example":true},"parserConfiguration":{"type":"object","properties":{"configurationColumns":{"type":"array","description":"A list of configuration details specifying what columns of data to extract from the raw file.","items":{"type":"object","properties":{"columnNameInFile":{"type":"string","nullable":true,"example":"Wavelength (nm)","description":"The column used to get the raw data, specified by name."},"columnIndexInFile":{"type":"integer","nullable":true,"example":3,"description":"The column used to get the raw data, specified by index."},"columnNameInResult":{"type":"string","example":"Wavelength","description":"The name of the column to place the parsed data in."},"unit":{"type":"string","example":"nm","description":"The unit of the data in this column."}}}},"computedColumns":{"type":"array","description":"A list of configuration details specifying what columns of data to compute from the parsed file.","items":{"type":"object","properties":{"function":{"type":"string","enum":["IDENTITY","DELTA","ABSOLUTE_DELTA","DIVIDE","DIVIDE_BY_TWO_ROUND_UP","ABSOLUTE_TIMES_SIGN"],"example":"IDENTITY","description":"The function used to computed data in this column."},"computedColumnName":{"type":"string","example":"Wavelength 2","description":"The name of the parsed column to place the computed data in."},"inputColumnNames":{"type":"array","items":{"type":"string","example":"Wavelength","description":"The name of the column used as an input to the computation in this column."}},"unit":{"type":"string","example":"nm","description":"The unit of the data in this column."}}}},"metadataExpected":{"type":"boolean","description":"Whether header metadata is expected in this parser before the actual data.","example":false,"nullable":true},"footerExpected":{"type":"boolean","description":"Whether footer metadata is expected in this parser after the actual data.","example":false,"nullable":true}}},"viewType":{"type":"string","enum":["VIEW_IMAGE","VIEW_2D_CUSTOM_AXES","VIEW_3D","VIEW_HEATMAP","VIEW_DOCX","VIEW_SCATTER_PLOT","VIEW_BOX_PLOT","VIEW_HISTOGRAM_SINGLE","VIEW_WAFER_MAP","VIEW_VECTOR_WAFER_MAP","VIEW_CORRELATION_MATRIX","VIEW_PDF"],"example":"VIEW_2D_CUSTOM_AXES","description":"The view type of this parser, changes how data is displayed on the FE."},"dataType":{"type":"string","enum":["DATA_COMPLEX","DATA_FILE","DATA_JSON","DATA_TEXT"],"example":"DATA_COMPLEX","description":"The data type of this parser, changes how data is used on the FE."},"supportedFileExtensions":{"type":"array","description":"A list of file extensions supported by this parser.","items":{"type":"string","example":"xlsx","description":"A file extension supported by this parser."}},"dateCreated":{"type":"integer","description":"A unix timestamp of when this parser was created."},"dateUpdated":{"type":"integer","description":"A unix timestamp of when this parser was last updated."},"systemParser":{"type":"boolean","example":false,"description":"Whether this parser belongs to your specific organization or is it a system parser that all organizations can use."}},"required":["id","code","name","description","type","physicalMeasurement","instrumentModel","instrumentManufacturer","enabledState","parserConfiguration","viewType","dataType","supportedFileExtensions","dateCreated","dateUpdated","systemParser"]},"Parameter":{"properties":{"id":{"type":"string","format":"uuid","description":"UUID of this parameter."},"title":{"type":"string","description":"Title of this parameter.","example":"Boiling Point","nullable":true},"description":{"type":"string","description":"Description of this parameter.","nullable":true},"titleItemId":{"type":"string","format":"uuid","description":"In some cases, the title of a parameter is another item, in this case this field is the UUID of that item, otherwise it's null.","nullable":true},"type":{"type":"string","enum":["QUANTITY","TEXT","BOOLEAN","LINK","CALCULATION","ENUM","PREDICTION"],"example":"QUANTITY","description":"The type of the parameter."},"unit":{"type":"string","description":"This is the unit of the parameter.","example":"kg","nullable":true},"hash":{"type":"string","description":"Hash for optimistic concurrency control."},"calculation":{"type":"object","description":"Calculation formula (only applicable for calculation type parameters).","nullable":true},"significantFiguresNum":{"type":"integer","description":"Number of significant figures to use for the parameter (only applicable for calculation type parameters).","nullable":true},"inputParameterIds":{"type":"array","description":"IDs of input parameters (only applicable for calculation type parameters).","items":{"type":"string","format":"uuid"},"nullable":true},"enumValueOptions":{"type":"array","description":"List of enum value options (only applicable for enum type parameters).","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"}}},"nullable":true},"linkTables":{"type":"array","description":"List of link source table IDs from which items can be linked (only applicable for link type parameters).","items":{"type":"string","format":"uuid"}}},"required":["id","title","description","titleItemId","type","unit","hash","calculation","significantFiguresNum","inputParameterIds","enumValueOptions","linkTables"]},"Measurement":{"properties":{"id":{"type":"string","description":"The id of the measurement."},"dateCreated":{"type":"string","format":"date-time","description":"Immutable timestamp of when the measurement was created."},"dateUpdated":{"type":"string","format":"date-time","description":"Timestamp that updates whenever the user makes adjustments to the measurement."},"title":{"type":"string","description":"The title of the measurement."},"description":{"type":"string","description":"Description of this measurement."},"parserCode":{"type":"string","description":"The parser code of the measurement."},"rawFilename":{"type":"string","description":"The raw filename of the measurement."},"rawFilDownloadURL":{"type":"string","description":"The raw file download URL of the measurement."}},"required":["id","dateCreated","dateUpdated","title","description","parserCode","rawFilename","rawFileDownloadURL"]},"Job":{"properties":{"id":{"type":"string","description":"The id of the job."},"title":{"type":"string","description":"The title of the job."},"description":{"type":"string","description":"The description of the job."},"expectedPayload":{"type":"array","items":{"type":"string"},"description":"The expected payload of the job."}},"required":["id","title","description","expectedPayload"]},"JobRun":{"properties":{"id":{"type":"string","description":"The id of the job run."},"jobId":{"type":"string"},"dateQueued":{"type":"string","format":"date-time"},"dateInProgress":{"type":"string","format":"date-time"},"dateCompleted":{"type":"string","format":"date-time"},"dateFailed":{"type":"string","format":"date-time"},"status":{"type":"string"},"payload":{"type":"string"},"logs":{"type":"object","properties":{"text":{"type":"string"},"severity":{"type":"string"},"dateCreated":{"type":"string","format":"date-time"}}}},"required":["id","jobId","dateQueued","dateInProgress","dateCompleted","dateFailed","status","payload","logs"]},"TableValueValue":{"type":"string","description":"The value in the table. This string is guaranteed to be parsable to the parameter type.","example":"1","nullable":true},"TableValueParameterId":{"type":"string","format":"uuid","description":"The parameterId represents the 'column' that this value is in.","nullable":true},"TableValueFormulationProtocolId":{"type":"string","format":"uuid","description":"The formulationProtocolId represents the 'column group' that this value is in.","nullable":true},"TableValueFormulationItemId":{"type":"string","format":"uuid","description":"The formulationItemId represents the item that this value is linked to.","nullable":true},"TableValue":{"properties":{"value":{"$ref":"#/components/schemas/TableValueValue"},"parameterId":{"$ref":"#/components/schemas/TableValueParameterId"},"formulationProtocolId":{"$ref":"#/components/schemas/TableValueFormulationProtocolId"},"formulationItemId":{"$ref":"#/components/schemas/TableValueFormulationItemId"}},"required":["value","parameterId","formulationProtocolId","formulationItemId"]},"CreateTableValue":{"properties":{"value":{"$ref":"#/components/schemas/TableValueValue"},"parameterId":{"$ref":"#/components/schemas/TableValueParameterId"},"formulationProtocolId":{"type":"string","format":"uuid","description":"In case the value is created in a formulation protocol, you supply the protocol UUID instead of the parameter UUID.","nullable":true},"formulationItemId":{"type":"string","format":"uuid","description":"In case the value is created in a formulation protocol, you supply the item UUID instead of the parameter UUID.","nullable":true}},"required":["value"]},"UpdateTableValue":{"properties":{"value":{"$ref":"#/components/schemas/TableValueValue"},"parameterId":{"$ref":"#/components/schemas/TableValueParameterId"},"formulationProtocolId":{"type":"string","format":"uuid","description":"In case the value is created in a formulation protocol, you supply the protocol UUID instead of the parameter UUID.","nullable":true},"formulationItemId":{"type":"string","format":"uuid","description":"In case the value is created in a formulation protocol, you supply the item UUID instead of the parameter UUID.","nullable":true}},"required":["value"]},"Item":{"properties":{"code":{"type":"string","example":"AA-123","description":"Short code that uniquely defines an item within an organization. Consists by default of the user's code and an alphanumerical counter, separated by a dash."},"dateCreated":{"type":"string","format":"date-time","description":"Immutable timestamp of when the item was created."},"dateTime":{"type":"string","format":"date-time","description":"User-configurable timestamp. For example, if the item represents a measurement, then this timestamp can be used to indicate when the measurement was taken.","nullable":true},"dateUpdated":{"type":"string","format":"date-time","description":"Timestamp that updates whenever the user makes adjustments to the item."},"description":{"type":"string","description":"Description of this item.","example":"This item contains the chemical properties of Aluminum.","nullable":true},"id":{"type":"string","format":"uuid","description":"UUID of this item."},"tableId":{"type":"string","format":"uuid","description":"UUID of the table that this item belongs to."},"title":{"type":"string","description":"Title of this item.","example":"Aluminum"},"values":{"type":"array","description":"Values in this item, each value is an object that contains the parameter (column) UUID. This array is sparse, meaning, it only contains non-null values.","items":{"$ref":"#/components/schemas/TableValue"},"nullable":true},"measurements":{"type":"array","description":"Measurements in this item.","items":{"$ref":"#/components/schemas/Measurement"},"nullable":true}},"required":["code","dateCreated","dateUpdated","dateTime","id","tableId","title","description","values","measurements"]},"UpdateItem":{"properties":{"dateTime":{"type":"string","format":"date-time","description":"User-configurable timestamp. For example, if the item represents a measurement, then this timestamp can be used to indicate when the measurement was taken.","nullable":true},"description":{"type":"string","description":"Description of this item.","example":"This item contains the chemical properties of Aluminum.","nullable":true},"title":{"type":"string","description":"Title of this item.","example":"Aluminum","nullable":true},"values":{"type":"array","description":"Values in this item, each value is an object that contains the parameter (column) UUID. Only values that the user wishes to update need to be provided.","items":{"$ref":"#/components/schemas/UpdateTableValue"},"maxItems":10000,"nullable":true}}},"CreateItem":{"properties":{"dateTime":{"type":"string","format":"date-time","description":"User-configurable timestamp. For example, if the item represents a measurement, then this timestamp can be used to indicate when the measurement was taken.","nullable":true},"description":{"type":"string","description":"Description of this item.","example":"This item contains the chemical properties of Aluminum.","nullable":true},"title":{"type":"string","description":"Title of this item.","example":"Aluminum"},"values":{"type":"array","description":"Values in this item, each value is an object that contains the parameter (column) UUID. Only values that the user wishes to be non-null need to be provided.","items":{"$ref":"#/components/schemas/CreateTableValue"},"maxItems":10000,"nullable":true}},"required":["title"]},"Folder":{"properties":{"childFolderIds":{"type":"array","items":{"type":"string","format":"uuid","description":"List of UUIDs of all folders nested under this folder."},"nullable":true},"childTableIds":{"type":"array","items":{"type":"string","format":"uuid","description":"List of UUIDs of all tables nested under this folder."},"nullable":true},"description":{"type":"string","description":"Description of this folder.","example":"This folder contains tables with material properties.","nullable":true},"id":{"type":"string","format":"uuid","description":"UUID of this folder."},"parentId":{"type":"string","format":"uuid","description":"UUID of the parent folder.","nullable":true},"title":{"type":"string","description":"Title of this folder.","example":"Material Properties"}},"required":["id","parentId","title","description","childFolderIds","childTableIds"]},"File":{"properties":{"code":{"type":"string","description":"The code of the file."},"fileName":{"type":"string","description":"The name of the file."},"downloadURL":{"type":"string","description":"The download URL of the file."},"uploadURL":{"type":"string","description":"The upload URL of the file."}},"required":["code","fileName","downloadURL","uploadURL"]}},"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"Authorization"}}},"security":[{"ApiKey":[]}],"paths":{"/tables":{"get":{"tags":["tables"],"summary":"Get all tables","description":"This operation retrieves all tables that are accessible to the user.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Table"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"tags":["tables"],"summary":"Create a new table","description":"Create a new table within a specified folder or within the root folder.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Title of the table.","example":"Material Properties"},"description":{"type":"string","description":"Description of the table.","example":"This table contains items with material properties.","nullable":true},"folderId":{"type":"string","format":"uuid","description":"UUID of the parent folder.","nullable":true}},"required":["title"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Table"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/tables/{tableId}":{"get":{"tags":["tables"],"summary":"Get a single table","description":"This operation retrieves a single table.","parameters":[{"name":"tableId","in":"path","required":true,"description":"The UUID of the table to return.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Table"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}},"patch":{"tags":["tables"],"summary":"Update a table","description":"Update a table's title, description, parent folder, etc.","parameters":[{"name":"tableId","in":"path","required":true,"description":"The UUID of the table to update.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"New title for the table.","nullable":true},"description":{"type":"string","description":"New description for the table.","nullable":true},"folderId":{"type":"string","format":"uuid","description":"UUID of the new parent folder.","nullable":true},"tableProtocolIds":{"type":"array","description":"UUIDs of the table protocols to be rearranged in the table.","items":{"type":"string","format":"uuid"}},"hash":{"type":"string","description":"Hash for optimistic concurrency control. Get this from a previous GET request to the table."}},"required":["hash"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Table"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"description":"Conflict - The table has been modified since you last retrieved it"}}},"delete":{"tags":["tables"],"summary":"Delete a table","description":"Delete a table and all its contents.","parameters":[{"name":"tableId","in":"path","required":true,"description":"The UUID of the table to delete.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"204":{"description":"Success"},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/tables/{tableId}/items":{"get":{"tags":["tables"],"summary":"Get all items from a table","description":"This operation retrieves all items from a single table. See [Pagination](#overview--pagination) example.","parameters":[{"name":"tableId","in":"path","required":true,"description":"The UUID of the table to fetch the items from.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}},{"name":"cursor","in":"query","required":false,"description":"Cursor for pagination to fetch the next set of results.","example":"eyJpbnNlcnRPcmRlciI6IjEyMyIsInBhcmFtIjoiZGFnX21hbHVhY2giLCJ2YWx1ZSI6IjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4In0=","schema":{"type":"string"}},{"name":"pageSize","in":"query","required":false,"description":"The number of items to return in a single page.","example":100,"schema":{"type":"integer","format":"int32","default":100}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ItemsList"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"tags":["tables"],"summary":"Create a new item in a table","description":"This operation creates a new item in a table.","parameters":[{"name":"tableId","in":"path","required":true,"description":"The UUID of the table to create the item in.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateItem"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Item"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/tables/{tableId}/items/batch":{"post":{"tags":["tables"],"summary":"Create multiple items in a table","description":"This operation creates multiple items in a single table.","parameters":[{"name":"tableId","in":"path","required":true,"description":"The UUID of the table to create the items in.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchCreateItemsRequest"}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BatchIngestTableItemOutput"}}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}},"patch":{"tags":["tables"],"summary":"Update multiple items in a table","description":"This operation updates multiple items in a single table.","parameters":[{"name":"tableId","in":"path","required":true,"description":"The UUID of the table that owns the items.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchUpdateItemsRequest"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BatchIngestTableItemOutput"}}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/tables/{tableId}/protocols":{"post":{"tags":["protocols"],"summary":"Create a new protocol in a table","description":"Creates a new default protocol in a table.","parameters":[{"name":"tableId","in":"path","required":true,"description":"The UUID of the table to create the protocol in.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Title of the protocol.","example":"Measured properties"},"description":{"type":"string","description":"Description of the protocol.","example":"This protocol contains parameters representing the measurement conditions.","nullable":true}},"required":["title"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Protocol"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/tables/{tableId}/formulation-protocols":{"post":{"tags":["protocols"],"summary":"Create a new formulation protocol in a table","description":"Creates a new formulation protocol in a table.","parameters":[{"name":"tableId","in":"path","required":true,"description":"The UUID of the table to create the formulation protocol in.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Title of the protocol.","example":"Formulation"},"description":{"type":"string","description":"Description of the protocol.","example":"This protocol describes the composition of materials.","nullable":true},"titleTableIds":{"type":"array","description":"Tables from which users can select items for formulation.","items":{"type":"string","format":"uuid"}},"unit":{"type":"string","description":"Unit for all formulation values.","example":"%"}},"required":["title","titleTableIds"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/FormulationProtocol"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/protocols/{protocolId}":{"patch":{"tags":["protocols"],"summary":"Update a protocol","description":"Updates an existing protocol.","parameters":[{"name":"protocolId","in":"path","required":true,"description":"The UUID of the protocol to update.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"New title for the protocol."},"description":{"type":"string","description":"New description for the protocol.","nullable":true},"parameterIds":{"type":"array","description":"UUIDs of the parameters to be rearranged in the protocol.","items":{"type":"string","format":"uuid"}},"hash":{"type":"string","description":"Hash for optimistic concurrency control. Get this from a previous GET request."}},"required":["hash"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Protocol"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"description":"Conflict - The protocol has been modified since you last retrieved it"}}},"delete":{"tags":["protocols"],"summary":"Delete a protocol","description":"Deletes a protocol and all its parameters.","parameters":[{"name":"protocolId","in":"path","required":true,"description":"The UUID of the protocol to delete.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"204":{"description":"Success"},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/formulation-protocols/{protocolId}":{"patch":{"tags":["protocols"],"summary":"Update a formulation protocol","description":"Updates an existing formulation protocol.","parameters":[{"name":"protocolId","in":"path","required":true,"description":"The UUID of the formulation protocol to update.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"New title for the protocol.","nullable":true},"description":{"type":"string","description":"New description for the protocol.","nullable":true},"titleTableIds":{"type":"array","description":"Tables from which users can select items for formulation.","items":{"type":"string","format":"uuid"}},"unit":{"type":"string","description":"Unit for all formulation values.","nullable":true},"hash":{"type":"string","description":"Hash for optimistic concurrency control. Get this from a previous GET request."}},"required":["hash"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/FormulationProtocol"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"description":"Conflict - The protocol has been modified since you last retrieved it"}}},"delete":{"tags":["protocols"],"summary":"Delete a formulation protocol","description":"Deletes a formulation protocol and all its parameters.","parameters":[{"name":"protocolId","in":"path","required":true,"description":"The UUID of the formulation protocol to delete.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"204":{"description":"Success"},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/parsers":{"post":{"tags":["parsers"],"summary":"Create a new parser","description":"Creates a new parser.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"CSV Parser for JEOL JSM IT700HR","description":"The name of this parser."},"description":{"type":"string","example":"Parses the <Date>.part4.csv files output from the JEOL JSM IT700HR","description":"The description of this parser.","nullable":true},"physicalMeasurement":{"type":"string","description":"The physical measurement whose data is parsed by this parser.","example":"Fourier-Transform Infrared Spectroscopy"},"instrumentModel":{"type":"string","description":"The model of the instrument used to measure the data parsed by this parser.","example":"JSM IT700HR"},"instrumentManufacturer":{"type":"string","description":"The manufacturer of the instrument used to measure the data parsed by this parser.","example":"JEOL"},"enabledState":{"type":"boolean","description":"The enabled state of this parser, false means it cant be used.","example":true,"nullable":true},"parserConfiguration":{"type":"object","properties":{"configurationColumns":{"type":"array","description":"A list of configuration details specifying what columns of data to extract from the raw file.","items":{"type":"object","properties":{"columnNameInFile":{"type":"string","nullable":true,"example":"Wavelength (nm)","description":"The column used to get the raw data, specified by name."},"columnIndexInFile":{"type":"integer","nullable":true,"example":3,"description":"The column used to get the raw data, specified by index."},"columnNameInResult":{"type":"string","example":"Wavelength","description":"The name of the column to place the parsed data in."},"unit":{"type":"string","example":"nm","description":"The unit of the data in this column."}}}},"computedColumns":{"type":"array","description":"A list of configuration details specifying what columns of data to compute from the parsed file.","items":{"type":"object","properties":{"function":{"type":"string","enum":["IDENTITY","DELTA","ABSOLUTE_DELTA","DIVIDE","DIVIDE_BY_TWO_ROUND_UP","ABSOLUTE_TIMES_SIGN"],"example":"IDENTITY","description":"The function used to computed data in this column."},"computedColumnName":{"type":"string","example":"Wavelength 2","description":"The name of the parsed column to place the computed data in."},"inputColumnNames":{"type":"array","items":{"type":"string","example":"Wavelength","description":"The name of the column used as an input to the computation in this column."}},"unit":{"type":"string","example":"nm","description":"The unit of the data in this column."}}}},"metadataExpected":{"type":"boolean","description":"Whether header metadata is expected in this parser before the actual data.","example":false,"nullable":true},"footerExpected":{"type":"boolean","description":"Whether footer metadata is expected in this parser after the actual data.","example":false,"nullable":true}}},"viewType":{"type":"string","enum":["VIEW_IMAGE","VIEW_2D_CUSTOM_AXES","VIEW_3D","VIEW_HEATMAP","VIEW_DOCX","VIEW_SCATTER_PLOT","VIEW_BOX_PLOT","VIEW_HISTOGRAM_SINGLE","VIEW_WAFER_MAP","VIEW_VECTOR_WAFER_MAP","VIEW_CORRELATION_MATRIX","VIEW_PDF"],"example":"VIEW_2D_CUSTOM_AXES","description":"The view type of this parser, changes how data is displayed on the FE."},"supportedFileExtensions":{"type":"array","description":"A list of file extensions supported by this parser.","items":{"type":"string","example":"xlsx","description":"A file extension supported by this parser."}}},"required":["name","physicalMeasurement","instrumentModel","instrumentManufacturer","viewType","supportedFileExtensions"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Parser"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Forbidden"}}},"get":{"tags":["parsers"],"summary":"Get all parsers","description":"Get all parsers accessible to this user's organization.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Parser"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/parsers/{parserId}":{"patch":{"tags":["parsers"],"summary":"Update a parser","description":"Updates an existing parser.","parameters":[{"name":"parserId","in":"path","required":true,"description":"The UUID of the parser to update.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"CSV Parser for JEOL JSM IT700HR","description":"The name of this parser."},"description":{"type":"string","example":"Parses the <Date>.part4.csv files output from the JEOL JSM IT700HR","description":"The description of this parser.","nullable":true},"physicalMeasurement":{"type":"string","description":"The physical measurement whose data is parsed by this parser.","example":"Fourier-Transform Infrared Spectroscopy"},"instrumentModel":{"type":"string","description":"The model of the instrument used to measure the data parsed by this parser.","example":"JSM IT700HR"},"instrumentManufacturer":{"type":"string","description":"The manufacturer of the instrument used to measure the data parsed by this parser.","example":"JEOL"},"enabledState":{"type":"boolean","description":"The enabled state of this parser, false means it cant be used.","example":true},"parserConfiguration":{"type":"object","properties":{"configurationColumns":{"type":"array","description":"A list of configuration details specifying what columns of data to extract from the raw file.","items":{"type":"object","properties":{"columnNameInFile":{"type":"string","nullable":true,"example":"Wavelength (nm)","description":"The column used to get the raw data, specified by name."},"columnIndexInFile":{"type":"integer","nullable":true,"example":3,"description":"The column used to get the raw data, specified by index."},"columnNameInResult":{"type":"string","example":"Wavelength","description":"The name of the column to place the parsed data in."},"unit":{"type":"string","example":"nm","description":"The unit of the data in this column."}}}},"computedColumns":{"type":"array","description":"A list of configuration details specifying what columns of data to compute from the parsed file.","items":{"type":"object","properties":{"function":{"type":"string","enum":["IDENTITY","DELTA","ABSOLUTE_DELTA","DIVIDE","DIVIDE_BY_TWO_ROUND_UP","ABSOLUTE_TIMES_SIGN"],"example":"IDENTITY","description":"The function used to computed data in this column."},"computedColumnName":{"type":"string","example":"Wavelength 2","description":"The name of the parsed column to place the computed data in."},"inputColumnNames":{"type":"array","items":{"type":"string","example":"Wavelength","description":"The name of the column used as an input to the computation in this column."}},"unit":{"type":"string","example":"nm","description":"The unit of the data in this column."}}}},"metadataExpected":{"type":"boolean","description":"Wether header metadata is expected in this parser before the actual data.","example":false},"footerExpected":{"type":"boolean","description":"Wether footer metadata is expected in this parser after the actual data.","example":false}}},"viewType":{"type":"string","enum":["VIEW_IMAGE","VIEW_2D_CUSTOM_AXES","VIEW_3D","VIEW_HEATMAP","VIEW_DOCX","VIEW_SCATTER_PLOT","VIEW_BOX_PLOT","VIEW_HISTOGRAM_SINGLE","VIEW_WAFER_MAP","VIEW_VECTOR_WAFER_MAP","VIEW_CORRELATION_MATRIX","VIEW_PDF"],"example":"VIEW_2D_CUSTOM_AXES","description":"The view type of this parser, changes how data is displayed on the FE."},"supportedFileExtensions":{"type":"array","description":"A list of file extensions supported by this parser.","items":{"type":"string","example":"xlsx","description":"A file extension supported by this parser."}}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Parser"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Forbidden"}}},"delete":{"tags":["parsers"],"summary":"Delete a parser","description":"Deletes a parser.","parameters":[{"name":"parserId","in":"path","required":true,"description":"The UUID of the parser to delete.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"204":{"description":"Success"},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Forbidden"}}},"get":{"tags":["parsers"],"summary":"Get a parser","description":"Gets a parser's configuration.","parameters":[{"name":"parserId","in":"path","required":true,"description":"The UUID of the parser to get.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Parser"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Forbidden"}}}},"/protocols/{protocolId}/parameters":{"post":{"tags":["parameters"],"summary":"Create a new parameter in a protocol","description":"Creates a new parameter in a protocol.","parameters":[{"name":"protocolId","in":"path","required":true,"description":"The UUID of the protocol to create the parameter in.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Title of the parameter.","example":"Boiling Point","nullable":true},"description":{"type":"string","description":"Description of the parameter.","nullable":true},"valueType":{"type":"string","enum":["QUANTITY","TEXT","BOOLEAN","LINK","CALCULATION","ENUM"],"example":"QUANTITY","description":"The type of the parameter."},"unit":{"type":"string","description":"Unit of the parameter (for QUANTITY type).","example":"°C","nullable":true},"titleItemId":{"type":"string","format":"uuid","description":"ID of an item to use as the title (optional).","nullable":true},"calculation":{"type":"string","description":"Calculation formula (only applicable for calculation type parameters).","nullable":true},"significantFiguresNum":{"type":"integer","description":"Number of significant figures to use for the parameter (only applicable for calculation type parameters).","nullable":true},"enumValueOptions":{"type":"array","description":"List of enum value options (only applicable for enum type parameters).","items":{"type":"object","properties":{"title":{"type":"string"}},"required":["title"]},"nullable":true},"linkTableIds":{"type":"array","description":"List of link source table IDs from which items can be linked (only applicable for link type parameters).","items":{"type":"string","format":"uuid"}}},"required":["valueType"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Parameter"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/parameters/{parameterId}":{"patch":{"tags":["parameters"],"summary":"Update a parameter","description":"Updates an existing parameter.","parameters":[{"name":"parameterId","in":"path","required":true,"description":"The UUID of the parameter to update.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"New title for the parameter.","nullable":true},"description":{"type":"string","description":"New description for the parameter.","nullable":true},"unit":{"type":"string","description":"New unit for the parameter.","nullable":true},"titleItemId":{"type":"string","format":"uuid","description":"ID of an item to use as the title (optional).","nullable":true},"calculation":{"type":"string","description":"Calculation formula (only applicable for calculation type parameters).","nullable":true},"significantFiguresNum":{"type":"integer","description":"Number of significant figures to use for the parameter (only applicable for calculation type parameters).","nullable":true},"enumValueOptions":{"type":"array","description":"List of enum value options (only applicable for enum type parameters). Omit `id` to add a new option; include `id` to keep or rename an existing option. Options not present in the array are removed.","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"}},"required":["title"]},"nullable":true},"linkTableIds":{"type":"array","description":"List of link source table IDs from which items can be linked (only applicable for link type parameters).","items":{"type":"string","format":"uuid"}},"hash":{"type":"string","description":"Hash for optimistic concurrency control. Get this from a previous GET request."}},"required":["hash"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Parameter"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"description":"Conflict - The parameter has been modified since you last retrieved it"}}},"delete":{"tags":["parameters"],"summary":"Delete a parameter","description":"Deletes a parameter.","parameters":[{"name":"parameterId","in":"path","required":true,"description":"The UUID of the parameter to delete.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"204":{"description":"Success"},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/items/{itemId}/measurements":{"post":{"tags":["measurements"],"summary":"Create a measurement","description":"This operation creates a measurement. See [Python examples - multipart post request](#overview--python-examples---multipart-post-request).","parameters":[{"name":"itemId","in":"path","required":true,"description":"The id of the item to create the measurement for.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","minLength":1}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"rawFile":{"type":"string","format":"binary"},"parserCode":{"type":"string"}},"required":["title","rawFile"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Measurement"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/items/{itemId}/measurements/{measurementId}":{"patch":{"tags":["measurements"],"summary":"Update existing measurement","description":"This operation updates an existing measurement.","parameters":[{"name":"itemId","in":"path","required":true,"description":"The id of the item to create the measurement for.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","minLength":1}},{"name":"measurementId","in":"path","required":true,"description":"The id of the measurement to update.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","minLength":1}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"parserCode":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Measurement"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}},"delete":{"tags":["measurements"],"summary":"Delete a single measurement","description":"This operation can be used to delete a single measurement.","parameters":[{"name":"itemId","in":"path","required":true,"description":"The id of the item to create the measurement for.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","minLength":1}},{"name":"measurementId","in":"path","required":true,"description":"The id of the measurement to update.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","minLength":1}}],"responses":{"204":{"description":"Success"},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/jobs":{"get":{"tags":["jobs"],"summary":"Get all jobs","description":"This operation retrieves all jobs.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/jobs/{jobId}/job-runs":{"post":{"tags":["jobs"],"summary":"Trigger a job run","description":"This operation triggers a job run.","parameters":[{"name":"jobId","in":"path","required":true,"description":"The id of the job to trigger.","example":"job-id","schema":{"type":"string","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","maxProperties":10000}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/JobRun"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/items/{itemId}":{"get":{"tags":["items"],"summary":"Get a single item","description":"This operation retrieves a single item","parameters":[{"name":"itemId","in":"path","required":true,"description":"The UUID of the item to return.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Item"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}},"patch":{"tags":["items"],"summary":"Update a single item","description":"This operation can be used to update both the metadata and values of a single item.","parameters":[{"name":"itemId","in":"path","required":true,"description":"The UUID of the item to update.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateItem"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Item"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}},"delete":{"tags":["items"],"summary":"Delete a single item","description":"This operation can be used to delete a single item.","parameters":[{"name":"itemId","in":"path","required":true,"description":"The UUID of the item to delete.","example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"204":{"description":"Success"},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/folders":{"get":{"tags":["folders"],"summary":"Get all folders","description":"This operation retrieves all folders that are accessible to the user.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Folder"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"tags":["folders"],"summary":"Create a folder","description":"This operation creates a folder.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Title of the folder.","example":"Material Properties"},"description":{"type":"string","description":"Description of the folder.","example":"This folder contains tables with material properties.","nullable":true},"parentId":{"type":"string","format":"uuid","description":"UUID of the parent folder.","nullable":true}},"required":["title"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Folder"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/folders/{folderId}":{"get":{"tags":["folders"],"summary":"Get a single folder","description":"This operation retrieves a single folder.","parameters":[{"name":"folderId","in":"path","required":true,"example":"eb1aa7b4-0e21-46de-b448-0c4eabdd32b7","description":"The UUID of the folder to return.","schema":{"type":"string","format":"uuid","minLength":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Folder"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/files/{code}":{"get":{"tags":["files"],"summary":"Get a file","description":"This operation retrieves file information.","parameters":[{"name":"code","in":"path","required":true,"description":"The code of the file.","example":"file-code","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/File"}}}}}},"400":{"description":"Bad Request"},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}