# Confident LIMS API v0 (v0.16.0) > Confident LIMS is a laboratory information management system for cannabis and hemp testing labs; this HTTP API lets labs and their clients manage orders, samples, test results, and certificates of analysis. Every request must be signed (HMAC-SHA256) - read the Request Signing guide first; it includes reference signers in Python and JavaScript. Request bodies are form-encoded, never JSON, and every response is JSON with a `success` flag. Each page below is Markdown; the HTML pages have the same URLs without the `.md` suffix. --- # How to Sign Requests By default, all requests to the Confident API have to be signed using a valid API key and API secret. This is an extra step when integrating (and can be a little intimidating) but it is important so that we can be sure your requests are really coming from you, which helps us protect your account and your information. This page explains every step needed to correctly sign API requests and ships complete reference implementations you can copy into your project: [Python](#reference-implementation-python) and [JavaScript (Node.js)](#reference-implementation-javascript-nodejs). The code examples on every endpoint page call these implementations as `sign_request()` / `signRequest()`. ## Quick Start 1. Copy the `sign_request` implementation for your language (below) into your project — or port it, following the algorithm in the next section. 2. Put the current unix time in seconds in an `X-ConfidentLims-Timestamp` header. 3. Call `sign_request(method, path, headers, data, api_key, api_secret)` where `path` is the URL path without the hostname or querystring (for example `/v0/labs/orders`), `headers` holds the timestamp header, and `data` is the querystring parameters (GET) or the form fields (POST/PUT/DELETE) you are about to send. File uploads are never signed. 4. Send the request with three headers: `X-ConfidentLims-APIKey` (your API key), `X-ConfidentLims-Timestamp`, and `X-ConfidentLims-Signature` (the value returned by `sign_request`). 5. Check your implementation against the [test vector](#test-vector) and then end-to-end against [`POST /v0/signingtest`](/v0/docs/signing-test). Signed requests must reach the server within 30 seconds of the timestamp or they are rejected with `request_too_old` (the response includes `current_server_time` for clock calibration). ## Disabling Signing To speed development you can disable signing on a per-credential basis. This makes all requests require only the `X-ConfidentLims-APIKey` header. You can enable/disable signing from the organization settings page — you may want to do this while in development to get started more quickly. ## How Does Request Signing Work? Request signing uses a pair of known credentials (your API key and API secret) to first identify your account (the API key part) and second to create a cryptographic "signature" of the important data being sent. The server also knows the API secret and can calculate the same signature using the data it actually received. Different data or an incorrect API secret (or a long delay) results in a different signature, effectively proving to the server that the request really did come from you (or at least someone with both the API key and the API secret). This helps ensure that only you or people you intentionally share credentials with can use your account. **Never send your API secret in a request** — it is only ever used to compute signatures. ## The Algorithm — Step by Step Signing is broken into three phases — creating one canonical string from all the important parts of the request, HMAC-SHA256 hashing that string with your API secret, and prefixing the result with the algorithm name and the list of signed headers so the server can validate it. The steps below sign this example request (the same inputs as the [test vector](#test-vector)): ```python method = 'POST' route = '/v0/signingtest' headers = {'X-ConfidentLims-Timestamp': '1474507118'} data = {'example_field': 'hello world!'} api_key = '88b750a8-d414-4aee-b26c-2cc7e85434dd' api_secret = '043bca27-c4d1-4d39-86d6-e5f0c3b4bb4f' ``` 1. **Base string.** Concatenate the uppercase HTTP method and the route (the URL path without the hostname or querystring). → `POST/v0/signingtest` 2. **Sorted headers.** Take every header you are signing — you must include `X-ConfidentLims-Timestamp` and must not include `X-ConfidentLims-APIKey` or `X-ConfidentLims-Signature` — lowercase the names, and sort the (name, value) pairs ascending by name. → `[('x-confidentlims-timestamp', '1474507118')]` 3. **Header string.** URL-encode the sorted headers as `name=value&...`. → `x-confidentlims-timestamp=1474507118` 4. **Header list.** Join the lowercase header names with `;`. The server uses this to know which headers you signed. → `x-confidentlims-timestamp` 5. **Sorted params.** Take the data you are sending — the querystring parameters for GET, the form fields for POST/PUT/DELETE, never file uploads — and sort the (name, value) pairs ascending by name. → `[('example_field', 'hello world!')]` 6. **Append the API key.** Add `('api_key', )` to the **end** of that list (after sorting — it is not sorted in). → `[('example_field', 'hello world!'), ('api_key', '88b750a8-…')]` 7. **Param string.** URL-encode the list as `name=value&...` (see [percent-encoding](#percent-encoding-rules) — note the `+` and `%21`). → `example_field=hello+world%21&api_key=88b750a8-d414-4aee-b26c-2cc7e85434dd` 8. **Encoded base string.** Percent-encode the base string from step 1. → `POST%2Fv0%2Fsigningtest` 9. **Signing string.** Join the results of steps 8, 3 and 7 with `&`. → `POST%2Fv0%2Fsigningtest&x-confidentlims-timestamp=1474507118&example_field=hello+world%21&api_key=88b750a8-d414-4aee-b26c-2cc7e85434dd` 10. **HMAC.** Compute HMAC-SHA256 over the signing string (UTF-8) with your API secret (UTF-8) as the key, hex-encoded lowercase. → `208b3c11b8f341e46ca7f5055ee6c9297a18217c2a54dc1955230d074f47816b` 11. **Final signature.** Prefix with the algorithm name and the header list from step 4, separated by colons: `CC0-HMAC-SHA256:
:`. → `CC0-HMAC-SHA256:x-confidentlims-timestamp:208b3c11b8f341e46ca7f5055ee6c9297a18217c2a54dc1955230d074f47816b` Send that value in the `X-ConfidentLims-Signature` header, alongside `X-ConfidentLims-APIKey` and the exact `X-ConfidentLims-Timestamp` you signed. ## Percent-encoding Rules Every language and library percent-encodes slightly differently, and a single mismatched character produces an `invalid_signature`. The API uses Python's `urllib.parse.urlencode` / `urllib.parse.quote_plus` behaviour: - Unreserved characters are left as-is: `A-Z`, `a-z`, `0-9`, `-`, `_`, `.`, `~`. - A space becomes `+` (not `%20`). - Everything else — including `/`, `:`, `!`, `'`, `(`, `)`, `*`, `,`, `&`, `=` and all non-ASCII characters (as UTF-8 bytes) — becomes `%XX` with uppercase hex digits. - Values are converted to strings before encoding: numbers as their decimal form, booleans as `True`/`False` in Python or `true`/`false` in JavaScript — send them the same way you sign them. The JavaScript reference implementation below shows how to correct `encodeURIComponent` (which leaves `!'()*` alone and encodes spaces as `%20`) to match these rules. If your HMAC library needs a sanity check, these hold for HMAC-SHA256 (message, key → hex digest): | Message | Key | HMAC-SHA256 | |---|---|---| | `foo` | `bar` | `147933218aaabc0b8b10a2b3a5c34684c8d94341bcf10a4736dc7270f7741851` | | `test` | `secret` | `0329a06b62cd16b33eb6792be8c60b158d89a2ee3a876fce9a881ebb488c0914` | | `longer_content` | `longer_key` | `3b3e8443e5156d9422998442c014a0ee2a8c398f29e13442dbf3301401bb192a` | ## Test Vector Feed these inputs to your implementation; it must produce exactly this signature before you try a live request. | Input | Value | |---|---| | method | `POST` | | route | `/v0/signingtest` | | headers | `{'X-ConfidentLims-Timestamp': '1474507118'}` | | data | `{'example_field': 'hello world!'}` | | api_key | `88b750a8-d414-4aee-b26c-2cc7e85434dd` | | api_secret | `043bca27-c4d1-4d39-86d6-e5f0c3b4bb4f` | | **signing string** | `POST%2Fv0%2Fsigningtest&x-confidentlims-timestamp=1474507118&example_field=hello+world%21&api_key=88b750a8-d414-4aee-b26c-2cc7e85434dd` | | **signature** | `CC0-HMAC-SHA256:x-confidentlims-timestamp:208b3c11b8f341e46ca7f5055ee6c9297a18217c2a54dc1955230d074f47816b` | ## Reference Implementation — Python Standard library only (Python 3). Save as `sign_request.py`; the endpoint examples import it with `from sign_request import sign_request`. ```python """Sign a Confident LIMS API request. Python 3, standard library only. signature = sign_request('GET', '/v0/labs/orders', headers, params, API_KEY, API_SECRET) - method: HTTP method, e.g. 'GET' or 'POST' - route: URL path after the hostname, without the querystring, e.g. '/v0/labs/orders' - headers: headers to sign; must include 'X-ConfidentLims-Timestamp' (unix seconds) and must NOT include X-ConfidentLims-APIKey or X-ConfidentLims-Signature - data: the querystring params (GET) or form fields (POST/PUT/DELETE) being sent; file uploads are never signed - api_key / api_secret: your API credentials, as strings """ import hashlib import hmac import urllib.parse def sign_request(method, route, headers, data, api_key, api_secret): # 1. base string: METHOD + route, e.g. 'GET/v0/labs/orders' base_string = method.upper() + route # 2. lowercased header names, sorted ascending sorted_headers = sorted( (name.lower(), str(value)) for name, value in headers.items() ) # 3. 'name=value&...' for the sorted headers, url-encoded header_string = urllib.parse.urlencode(sorted_headers) # 4. 'name;name;...' listing the signed header names header_list = ';'.join(name for name, _ in sorted_headers) # 5. data fields sorted ascending by name (skip file uploads) params = sorted( (name, str(value)) for name, value in data.items() if not hasattr(value, 'read') ) # 6. append api_key= to the END of the list params.append(('api_key', api_key)) # 7. 'name=value&...' for the sorted params, url-encoded param_string = urllib.parse.urlencode(params) # 8. percent-encode the base string ('/' becomes '%2F') encoded_base_string = urllib.parse.quote_plus(base_string) # 9. join the three pieces with '&' signing_string = '&'.join( [encoded_base_string, header_string, param_string] ) # 10. HMAC-SHA256 of the signing string, keyed with the api secret raw_signature = hmac.new( api_secret.encode('utf-8'), signing_string.encode('utf-8'), hashlib.sha256, ).hexdigest() # 11. prefix with the algorithm and the signed header list return 'CC0-HMAC-SHA256:{}:{}'.format(header_list, raw_signature) ``` ## Reference Implementation — JavaScript (Node.js) No dependencies (Node.js 18+, ES modules). Save as `sign_request.js`; the endpoint examples import it with `import { signRequest } from './sign_request.js'`. ```javascript // Sign a Confident LIMS API request. Node.js 18+, no dependencies. // // const signature = signRequest('GET', '/v0/labs/orders', headers, params, API_KEY, API_SECRET); // // - method: HTTP method, e.g. 'GET' or 'POST' // - route: URL path after the hostname, without the querystring, // e.g. '/v0/labs/orders' // - headers: headers to sign; must include 'X-ConfidentLims-Timestamp' (unix // seconds) and must NOT include X-ConfidentLims-APIKey or // X-ConfidentLims-Signature // - data: the querystring params (GET) or form fields (POST/PUT/DELETE) // being sent; file uploads are never signed // - apiKey / apiSecret: your API credentials, as strings import { createHmac } from 'node:crypto'; // Match Python's urllib.parse.quote_plus: everything except A-Z a-z 0-9 - _ . ~ // is percent-encoded (uppercase hex) and a space becomes '+'. function encode(value) { return encodeURIComponent(String(value)) .replace(/[!'()*]/g, (c) => '%' + c.charCodeAt(0).toString(16).toUpperCase()) .replace(/%20/g, '+'); } function urlencode(pairs) { return pairs.map(([name, value]) => `${encode(name)}=${encode(value)}`).join('&'); } function sortPairs(pairs) { return pairs.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)); } export function signRequest(method, route, headers, data, apiKey, apiSecret) { // 1. base string: METHOD + route, e.g. 'GET/v0/labs/orders' const baseString = method.toUpperCase() + route; // 2. lowercased header names, sorted ascending const sortedHeaders = sortPairs( Object.entries(headers).map(([name, value]) => [name.toLowerCase(), String(value)]) ); // 3. 'name=value&...' for the sorted headers, url-encoded const headerString = urlencode(sortedHeaders); // 4. 'name;name;...' listing the signed header names const headerList = sortedHeaders.map(([name]) => name).join(';'); // 5. data fields sorted ascending by name (skip file uploads) const params = sortPairs( Object.entries(data) .filter(([, value]) => !(value instanceof Blob)) .map(([name, value]) => [name, String(value)]) ); // 6. append api_key= to the END of the list params.push(['api_key', apiKey]); // 7. 'name=value&...' for the sorted params, url-encoded const paramString = urlencode(params); // 8. percent-encode the base string ('/' becomes '%2F') const encodedBaseString = encode(baseString); // 9. join the three pieces with '&' const signingString = [encodedBaseString, headerString, paramString].join('&'); // 10. HMAC-SHA256 of the signing string, keyed with the api secret const rawSignature = createHmac('sha256', apiSecret).update(signingString).digest('hex'); // 11. prefix with the algorithm and the signed header list return `CC0-HMAC-SHA256:${headerList}:${rawSignature}`; } ``` ## Verifying Your Implementation 1. Confirm your code reproduces the [test vector](#test-vector) exactly. 2. Send a signed request to [`POST /v0/signingtest`](/v0/docs/signing-test) with your real credentials. A `success: true` response means signing works; an `invalid_signature` error means the server computed a different signature — re-check the route (it must include the `/v0/...` prefix and no querystring), the header values, the percent-encoding, and that `api_key` is the **last** param. 3. A `request_too_old` error means your clock is off; compare against the `current_server_time` in the response. --- HTML version: https://api.confidentcannabis.com/v0/docs/request-signing --- # Confident LIMS API v0 These are the official docs for the v0 API. Version 0 is currently under active development and is not yet considered stable — as such, there may be breaking changes introduced without incrementing the version number. ## API Endpoints All endpoints use the standard HTTP verbs to describe their behavior (GET, POST, PUT, DELETE) and use status codes to categorize their responses (200, 301/302, 400, 401, 403, 404, 405, 500). In general, a correctly signed and formatted request will return with status code 200. When sending data, use a correctly escaped querystring for GET endpoints or a standard form upload (`application/x-www-form-urlencoded`) for POST/PUT/DELETE. If you are using a request library, this is likely handled for you automatically. **Request bodies are form-encoded, not JSON.** The API does not accept `application/json` request bodies. Endpoints that take complex objects (like creating an order) accept a JSON-encoded string as a single form field — each endpoint's reference documents this. Every endpoint returns a JSON formatted response. After receiving a 200, you should always check the `success` field to see if your request completed as expected. GET requests generally always succeed, but any POST/PUT/DELETE request can fail because of pre-requisites or invalid state (like a name conflict or requiring something to exist), which will set the `success` flag to `false`. When `success` is `false`, there will be an `error_code` field (and potentially `error_message` and `error_details`) to help you identify and react to whatever caused the problem. ## Response Envelope Every response body has roughly the same pieces: - `success` — true/false flag that is always present - `error_code` — a string code if an error occurred (always present when `success` is false) - `error_message` — a human readable error message - `error_details` — per-field validation errors when `error_code` is `invalid_request`, keyed by field name Common error codes returned by every endpoint: | Code | Status | Meaning | |---|---|---| | `missing_api_key` | 401 | Missing `X-ConfidentLims-APIKey` header | | `invalid_api_key` | 401 | API key is not valid (deleted, not found, etc.) | | `invalid_credentials_type` | 401 | The key is not an API-secret credential | | `api_access_denied` | 401 | Account does not have access to the API | | `api_access_restricted` | 401 | The organization's API access has been restricted | | `missing_signature` | 401 | Missing `X-ConfidentLims-Signature` header | | `missing_timestamp` | 401 | Missing `X-ConfidentLims-Timestamp` header | | `invalid_timestamp` | 401 | Timestamp header is not a valid epoch timestamp | | `request_too_old` | 400 | Signed request timestamp is too old — includes `current_server_time` in the response for calibration | | `invalid_signature` | 401 | Request is not correctly signed | | `permission_denied` | 403 | Account does not have permission for this action | | `not_found` | 404 | The requested record does not exist or is not visible to this organization | | `invalid_request` | 400 | Generic problem with the request (usually validation) | ## Authentication and Signing All endpoints (even GETs) require an API key header (`X-ConfidentLims-APIKey`). By default, requests must also be signed with a signature generated using the matching API secret — incorrectly signed requests are rejected with a 401 response. Signing can be disabled per credential from the organization settings page to speed up development. The signature is the hex-encoded SHA256-HMAC of the API key, the data fields (sorted alphabetically, ascending), and the API secret. **Never send your API secret in a request** — it should only be used for generating signatures. Read the full, step-by-step signing instructions — including complete reference implementations in Python and JavaScript — on the [Request Signing](/v0/docs/request-signing) page. ### Summary of steps to generate a signature 1. Create the base string by combining method and route — e.g. `GET/v0/labs/orders` 2. Create an ascii-sorted (ascending), lowercased list of (key, value) pairs from the headers dictionary (must include `X-ConfidentLims-Timestamp` but not `X-ConfidentLims-APIKey` or `X-ConfidentLims-Signature`) 3. Create a url-encoded string `key=value&...` for the ascii-ordered header fields, lowercased 4. Create a semicolon-separated list of lowercase header keys — e.g. `host;x-confidentlims-timestamp` 5. Create an ascii-sorted list of (key, value) pairs from the form data (or the querystring for GET requests) 6. Add `('api_key', )` to the END of the list 7. Create a url-encoded param string `key=value&...` for the ordered data fields 8. Percent-encode the base string from step 1 9. Combine the percent-encoded base string, url-encoded header string, and url-encoded parameter string with `&` between them 10. Create the SHA256 HMAC signature of that string using your API secret 11. Prefix with the signing algorithm and header list string: `CC0-HMAC-SHA256:host;x-confidentlims-timestamp:` ## Additional Notes ### Updates All updates and notifications regarding the API are sent via an email list. Please email [api@confidentlims.com](mailto:api@confidentlims.com) to automatically subscribe. This includes notifications of upcoming features, breaking changes, and version upgrades. ### Signing Getting signing right is the hardest (but most important) part of interacting with the API — the [`POST /v0/signingtest`](/v0/docs/signing-test) endpoint exists explicitly for testing your signing code during development. ### Paging Many endpoints that return dynamic lists (e.g. clients, orders, and samples — but not test types, sample categories, etc.) are limited to 100 results and include a `more_results` boolean field. If `more_results` is true, additional results exist, which can be queried by passing a number for `start` (default 0) and optionally `limit` (default 100), allowing you to iterate through pages until `more_results` is false. ### Timestamps Timestamps are always returned in isoformat — for example: `2016-10-04T13:20:42.395276`. Dates with times should always be sent in UTC time in the format `YYYY-MM-DD HH:MM:SS` — for example: `2016-10-04 13:20:42`. Dates should always be sent as `YYYY-MM-DD` — for example: `2016-10-04`. ### Currency and Pricing All currency and pricing numbers are always represented as integer cents (instead of floating point dollars). Currency and pricing fields are generally named to reflect this. ### File Uploads Several endpoints support uploading files (images, PDFs, etc.). These file fields are **not** included when generating signatures, so be sure to exclude them during the signing process. Send files as standard `multipart/form-data` uploads. ### Machine-readable docs Every page of these docs is available as Markdown by appending `.md` to its URL (this page: `index.md`). [`llms.txt`](/v0/docs/llms.txt) indexes every page, [`llms-full.txt`](/v0/docs/llms-full.txt) holds them all in one file, and each section publishes its OpenAPI 3.1 spec at `openapi.json` (this section: [`openapi.json`](/v0/docs/openapi.json)). ### Additional Help If you need any help or just have questions, comments, or complaints, please reach out at [api@confidentlims.com](mailto:api@confidentlims.com). We want to make sure you have the best experience possible, so definitely let us know what you think or if you get stuck! --- HTML version: https://api.confidentcannabis.com/v0/docs/ --- # Test request signing `POST /v0/signingtest` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Debug endpoint for verifying your request signing implementation. Use any valid credentials and send any fields you like: field values are folded into the signature but are otherwise ignored. A correctly signed request succeeds and returns nothing but the success flag; an incorrectly signed one is rejected like any other request. Values worth signing while testing, because they exercise character escaping: `hello`, `hello, world!` and `foobar!'()*+~"`. ## Body parameters (application/x-www-form-urlencoded) - `example_field` (string, optional) — Any string. Included in the signature, otherwise ignored. Example: `hello, world!` ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/signingtest' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/signingtest' data = { # optional form fields go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/signingtest"; const data = { // optional form fields go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/signing-test OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Orders and Samples in Confident Orders and Samples are two core elements in Confident lab testing. A sample is a single piece of material that is to be tested, and an order is a collection of samples from one client that have been requested for testing at the same time. Every sample always belongs to exactly one order, and an order is always attached to exactly one client and exactly one lab. Orders have a status that represents the state of the order over time and is modified by various actions detailed below. Understanding the different stages of an order (and how this impacts the visibility of test results / CoAs) is critical to providing a great user experience. ## Order Statuses Each status has a numeric ID, used as the `status_id` filter and returned by `GET /orderstatuses`. - **Placed** (`status_id` 2) — By default, orders are created in the Placed stage, indicating that the client has requested the order but the lab has not yet validated the request nor taken custody of the samples. - **In Progress** (`status_id` 3) — The lab has taken custody of the samples and is performing the required tests. - **Completed** (`status_id` 4) — The order has been completed and all data for all samples is published to the client. - **Canceled** (`status_id` 0) — The order has been canceled by the client or the lab. No more work will be done for this order or any sample in it. ## Order Actions Actions are what move orders between the various statuses, as shown below. The most important action is moving an order from In Progress to Completed, since this is what converts all draft data (test results, CoAs, and any additional documents) to published so that it can be accessed by the client — read more in the Draft vs Published Results section. ![Order lifecycle diagram](https://s3.amazonaws.com/confident-static/images/cc_order_lifecycle.svg) The status-transition endpoints map to these actions: | Action | Endpoint | Transition | |---|---|---| | Verify | [`POST /v0/labs/order/{order_id}/status/verify`](/v0/docs/labs/verify-order) | Placed → In Progress | | Unverify | [`POST /v0/labs/order/{order_id}/status/unverify`](/v0/docs/labs/unverify-order) | In Progress → Placed | | Complete | [`POST /v0/labs/order/{order_id}/status/complete`](/v0/docs/labs/complete-order) | In Progress → Completed | | Revise | [`POST /v0/labs/order/{order_id}/status/revise`](/v0/docs/labs/revise-order) | Completed → In Progress | | Cancel | [`POST /v0/labs/order/{order_id}/status/cancel`](/v0/docs/labs/cancel-order) | any (not cancelled) → Cancelled | | Uncancel | [`POST /v0/labs/order/{order_id}/status/uncancel`](/v0/docs/labs/uncancel-order) | Cancelled → Placed | ## Draft vs Published Results/CoAs/Documents It is important to understand that while test results and sample documents are related to order status, they are **not** directly controlled by it. **All** client-facing pieces of information (test results, CoAs, additional documents) in Confident work via a draft system, meaning they are never visible to clients until after the lab has an opportunity to review and then intentionally publish them. Publishing happens for all draft info/files when the sample's parent order is moved from In Progress to Completed (which also delivers them to the client via email and potentially other channels). Even after an order is in the Completed state, any new data/files submitted to its samples will be drafts (i.e., not visible to the client) until the order is moved back to In Progress and then moved to Completed again. This draft/published state is usually denoted in the API with fields that have the `_draft` suffix — this can be seen via the [`GET /v0/labs/sample/{sample_id}`](/v0/docs/labs/get-sample-details) endpoint and the `has_lab_data`/`has_coa` vs `has_lab_data_draft`/`has_coa_draft` fields. ### Detailed Example | Step | Action | Draft Data/CoAs | Published Data/CoAs | |---|---|---|---| | 1 | Parent order created — sample XYZ is created | None | None | | 2 | Parent order verified and moved to In Progress | None | None | | 3 | Data A and CoA A submitted to sample | Data A, CoA A | None | | 4 | Data B and CoA B submitted to sample (update with new results) | Data B, CoA B | None | | 5 | Order completed — client notified | None | Data B, CoA B | | 6 | Order revised (back to In Progress) — lab intends to adjust report | None | Data B, CoA B | | 7 | Updated Data C and CoA C submitted to sample | Data C, CoA C | Data B, CoA B | | 8 | Order completed again — client notified a second time | None | Data C, CoA C | ## Sample and Order Number Info Sample and order numbers are generated automatically by Confident when an order is created (or edited, in the case of adding samples after an order is initially created). These numbers are generally sequential (both are highly customizable with regard to format and when numbers reset). Both order and sample numbers are always globally unique and are the standard identifier used when interacting with orders or samples from the API or the web interface. ## Integration Suggestions There are many different use cases for integrating with Confident depending on how much interaction the lab wants to do in the LIMS vs in the Confident web interface. When using Confident in the most limited capacity (taking orders and generating all results/CoAs in the LIMS and only submitting final, ready-to-publish values and documents to Confident), you'll need to make sure that you move orders to the Completed status at the right time in your workflow in order to publish the correct information. Most significantly, this means you must submit all test results, Certificates of Analysis, and any other documentation for **all** samples in an order **before** it is moved to the Completed status. Doing this in the wrong order will leave some of your data in the Draft state and not deliver it correctly to the client. In this situation we suggest creating orders in the In Progress status, submitting everything for every sample in the order, and only then moving the order to Completed. Please read the Draft vs Published Results section for more details. --- HTML version: https://api.confidentcannabis.com/v0/docs/order-lifecycle --- # List compounds `GET /v0/compounds` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every compound known to Confident, including synonyms and alternate spellings. Results are grouped by test category and sorted by name within each category. Anything listed here can be submitted in test results using the `name` value. When `is_synonym` is true, `synonym_for_compound_name` gives the canonical compound the synonym maps to. This response is cacheable and is served with a `Cache-Control: max-age=1800` header. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `compounds` (array of objects) - `category` (string) — Test category under which this compound is normally tested - `name` (string) — Unique name used to identify the compound - `display_name` (string) — Display name for compound - `is_synonym` (boolean) — True if this is a synonym for another compound - `synonym_for_compound_name` (string) — Name of compound for which this is a synonym Example: ```json { "success": true, "compounds": [ { "category": "cannabinoids", "name": "cbd", "display_name": "CBD", "is_synonym": false, "synonym_for_compound_name": "" }, { "category": "cannabinoids", "name": "cannabidiol", "display_name": "Cannabidiol", "is_synonym": true, "synonym_for_compound_name": "cbd" } ] } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/compounds' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/compounds' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/compounds"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/get-compound OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List order statuses `GET /v0/orderstatuses` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every order status an order can be in. Use the `id` of a status as the `status_id` filter when listing orders or samples. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `order_statuses` (array of objects) - `id` (integer) — Unique ID for Order Status - `name` (string) — Order Status Name Example: ```json { "success": true, "order_statuses": [ { "id": 0, "name": "Canceled" }, { "id": 2, "name": "Placed" }, { "id": 3, "name": "In Progress" }, { "id": 4, "name": "Completed" } ] } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/orderstatuses' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/orderstatuses' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/orderstatuses"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/get-order-statuses OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List sample categories `GET /v0/samplecategories` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every sample category, ordered for display. Each category belongs to a single sample industry, which is included here for convenience. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `sample_categories` (array of objects) - `id` (integer) — Unique ID for Sample Category - `name` (string) — Sample Category Name - `industry_id` (integer) — Unique ID for Sample Industry - `industry_name` (string) — Sample Industry Name Example: ```json { "success": true, "sample_categories": [ { "id": 1, "name": "Plant", "industry_id": 1, "industry_name": "Cannabis & Hemp" }, { "id": 2, "name": "Concentrates & Extracts", "industry_id": 1, "industry_name": "Cannabis & Hemp" } ] } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/samplecategories' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/samplecategories' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/samplecategories"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/get-sample-categories OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List sample classifications `GET /v0/sampleclassifications` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every sample classification. Classifications describe the cannabinoid or genetic profile of a sample, such as `Indica`, `Sativa` or `High CBD`. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `sample_classifications` (array of objects) - `id` (integer) — Unique ID for Sample Classification - `name` (string) — Sample Classification Name Example: ```json { "success": true, "sample_classifications": [ { "id": 3, "name": "Indica" }, { "id": 4, "name": "Hybrid" } ] } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/sampleclassifications' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/sampleclassifications' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/sampleclassifications"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/get-sample-classifications OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List sample industries `GET /v0/sampleindustries` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every sample industry Confident supports. Industries sit at the top of the sample taxonomy: every sample category belongs to one industry, and every sample type belongs to one category. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `sample_industries` (array of objects) - `id` (integer) — Unique ID for Sample Industry - `name` (string) — Sample Industry Name Example: ```json { "success": true, "sample_industries": [ { "id": 1, "name": "Cannabis & Hemp" }, { "id": 2, "name": "Agriculture" } ] } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/sampleindustries' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/sampleindustries' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/sampleindustries"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/get-sample-industries OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List sample production methods `GET /v0/sampleproductionmethods` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every sample production method, ordered for display. A production method describes how the sample was grown or made (for example `Indoor` for plant material or `CO2` for an extract) and belongs to a single sample category. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `sample_production_methods` (array of objects) - `id` (integer) — Unique ID for Sample Production Method - `name` (string) — Sample Production Method Name - `category_id` (integer) — Sample Category ID - `category_name` (string) — Sample Category Name Example: ```json { "success": true, "sample_production_methods": [ { "id": 1, "name": "Indoor", "category_id": 1, "category_name": "Plant" }, { "id": 5, "name": "CO2", "category_id": 2, "category_name": "Concentrates & Extracts" } ] } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/sampleproductionmethods' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/sampleproductionmethods' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/sampleproductionmethods"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/get-sample-production-methods OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List sample types `GET /v0/sampletypes` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every sample type, ordered for display. Each sample type belongs to a single sample category, which is included here for convenience. Use the `id` of a sample type as `sample_type_id` when creating a sample. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `sample_types` (array of objects) - `id` (integer) — Unique ID for Sample Type - `name` (string) — Sample Type Name - `category_id` (integer) — Sample Category ID - `category_name` (string) — Sample Category Name Example: ```json { "success": true, "sample_types": [ { "id": 1, "name": "Flower - Cured", "category_id": 1, "category_name": "Plant" }, { "id": 64, "name": "Biomass", "category_id": 1, "category_name": "Plant" } ] } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/sampletypes' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/sampletypes' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/sampletypes"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/get-sample-types OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List test types `GET /v0/testtypes` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every test type Confident supports. A test type is a single analysis a lab can run, such as cannabinoids or pesticides; a sample can be assigned any number of test types through its test packages. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation Example: ```json { "success": true, "test_types": [ { "id": 1, "name": "Cannabinoids", "abbreviation": "CAN" }, { "id": 2, "name": "Terpenes", "abbreviation": "TER" } ] } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/testtypes' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/testtypes' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/testtypes"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/get-test-types OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Get a client `GET /v0/labs/client/{client_id}` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return full details for a single client, including its primary address and licenses. The client must already be associated with your lab, or have existing orders with it; otherwise the request returns `not_found`. ## Path parameters - `client_id` (integer, required) ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `client` (object) - `id` (integer) — Client ID - `name` (string) — Organization Name - `training` (boolean) — Whether this is a training client - `last_modified` (timestamp) — Time this client was last modified - `email` (string) — Organization Email - `phone` (string) — Organization Phone - `url` (string) — Organization Website - `primary_address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `nickname` (string) — Human entered name for license - `license_designation_name` (string) — License Designation Name [changes by state] - `license_type_name` (string) — License Type Name [changes by state] - `archived` (boolean) — True if this client has been archived - `notes` (string) — Client Notes Example: ```json { "success": true, "client": { "id": 318, "name": "Sunrise Cultivation", "training": false, "last_modified": "2025-02-27T18:04:03", "email": "orders@sunrisecultivation.com", "phone": "9165550142", "url": "https://sunrisecultivation.com", "primary_address": { "id": 902, "address_line_1": "55 Orchard Road", "address_line_2": null, "city": "Woodland", "state_abbreviation": "CA", "zipcode": "95695" }, "licenses": [ { "id": 4410, "license_number": "CDPH-10003456", "license_code": null, "nickname": "Woodland cultivation", "license_designation_name": "Adult Use", "license_type_name": "Cultivation - Small Indoor" } ], "archived": false, "notes": "Prefers Monday drop-offs." } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/labs/client/{client_id}' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/client/{client_id}' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/client/{client_id}"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/get-client-details OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Invite a user to a client `POST /v0/labs/client/{client_id}/invite` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Invite a user to join one of your lab's clients. An email is sent to the address with a link to create an account. The client must already be associated with your lab, otherwise the request returns `not_found`. Available organization roles are `owner`, `admin`, `user` and `viewer`. Invites are rate limited; sending too many in quick succession returns HTTP 429. ## Path parameters - `client_id` (integer, required) ## Body parameters (application/x-www-form-urlencoded) - `email` (string (email), required) — Email address of the user to invite. Example: `sam@sunrisecultivation.com` - `role` (string, required) — Organization role to grant: `owner`, `admin`, `user` or `viewer`. Allowed values: `viewer`, `owner`, `admin`, `user` Example: `admin` ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `invite` (object) - `id` (integer) — Invite ID - `email` (string) — User Email - `role` (string) — User Role Example: ```json { "success": true, "invite": { "id": 8123, "email": "sam@sunrisecultivation.com", "role": "admin" } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/client/{client_id}/invite' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' \ --data-urlencode 'email=sam@sunrisecultivation.com' \ --data-urlencode 'role=admin' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/client/{client_id}/invite' data = { "email": "sam@sunrisecultivation.com", "role": "admin", } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/client/{client_id}/invite"; const data = { "email": "sam@sunrisecultivation.com", "role": "admin", }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/post-client-invite OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List clients `GET /v0/labs/clients` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every client of your lab, most recently added first. Use `start` and `limit` to page through the results — a maximum of 100 clients are returned at a time. When more clients are available beyond the current page, `more_results` is `true`. ## Query parameters - `start` (integer, optional, default `0`) — Zero-based index of the first client to return. - `limit` (integer, optional, default `100`) — Maximum number of clients to return. Capped at 100. - `modified_since_time` (string, optional) — Only return clients modified after this time, e.g. `2025-03-14T09:12:44`. - `archived` (boolean, optional) — Only return archived clients when true, or only active clients when false. Omit to return both. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `clients` (array of objects) - `id` (integer) — Client ID - `name` (string) — Organization Name - `training` (boolean) — Whether this is a training client - `last_modified` (timestamp) — Time this client was last modified - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `archived` (boolean) — True if this client has been archived - `more_results` (boolean) — True when more clients are available beyond this page. Example: ```json { "success": true, "clients": [ { "id": 318, "name": "Sunrise Cultivation", "training": false, "last_modified": "2025-02-27T18:04:03", "licenses": [ { "id": 4410, "license_number": "CDPH-10003456", "license_code": null } ], "archived": false }, { "id": 244, "name": "Harbor Extracts", "training": false, "last_modified": "2025-01-19T10:47:56", "licenses": [ { "id": 3902, "license_number": "CDPH-10002211", "license_code": null } ], "archived": true } ], "more_results": false } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/labs/clients' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/clients' params = { # optional query params go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, params, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, params=params, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/clients"; const params = { // optional query params go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, params, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch(`https://api.confidentcannabis.com${path}?${new URLSearchParams(params)}`, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/get-clients OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Get the current lab `GET /v0/labs/lab` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return details about the lab the API key belongs to, including its contact information, primary address and licenses. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `lab` (object) - `id` (integer) — Lab ID - `name` (string) — Lab Name - `email` (string) — Lab Email - `phone` (string) — Lab Phone - `url` (string) — Lab Website - `primary_address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `nickname` (string) — Human entered name for license - `license_designation_name` (string) — License Designation Name [changes by state] - `license_type_name` (string) — License Type Name [changes by state] Example: ```json { "success": true, "lab": { "id": 12, "name": "Green Leaf Labs", "email": "support@greenleaflabs.com", "phone": "5035550188", "url": "https://greenleaflabs.com", "primary_address": { "id": 771, "address_line_1": "1400 Industrial Way", "address_line_2": "Suite 4", "city": "Sacramento", "state_abbreviation": "CA", "zipcode": "95811" }, "licenses": [ { "id": 87, "license_number": "C8-0000123-LIC", "license_code": null, "nickname": "Sacramento testing lab", "license_designation_name": "Adult Use and Medicinal", "license_type_name": "Testing Laboratory" } ] } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/labs/lab' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/lab' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/lab"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/get-lab OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Create an order `POST /v0/labs/order` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Create a new order together with its samples. Many fields are optional depending on state and regulatory requirements or seed-to-sale tracking. Send the order as a single `order` form field containing the JSON-encoded object described below. Every sample on the order must belong to the same industry. ### Order fields - `client_id` (int) — identifier for the client placing this order. - `client_license_id` (int) — identifier for the client license under which this order should be placed (the ID, not the license number). - `lab_license_id` (int) — identifier for the lab license under which this order should be placed (the ID, not the license number). - `address_id` (int) — lab address ID for drop-off orders, client address ID for pickup orders. - `pickup` (boolean, optional) — `true` if this order should be picked up at the client location. Defaults to `false`. - `price_adjustment` (float, optional) — dollar amount to change the order by; negative for a discount, positive for additional fees. - `send_client_email` (boolean, optional) — if `true` the client receives email notifications for the order being placed. Defaults to `true`. - `lims_id` (string, optional) — internal tracking ID for this order. - `status_id` (int, optional) — status in which to create the order. Defaults to 'placed'. ### Secondary client - `secondary_client_name` (string, optional) — company name for the secondary client. - `secondary_client_type` (int, optional) — `1` for producer, `2` for distributor. - `secondary_client_address` (string, optional) — full address string for the secondary client. - `secondary_client_license` (string, optional) — license used by the secondary client for the order transaction. ### Samples `samples` is a list of objects, each accepting: - `name` (string) — product name for this sample. - `strain_name` (string) — name of the sample strain. Optional for non-cannabis samples. - `type_id` (int) — ID from the sample type enumeration. - `production_method_id` (int) — ID from the production method enumeration. To submit a blank value, use the category's unnamed production method from `GET /sampleproductionmethods` (`99` for cannabis plant samples; other categories have their own blank IDs). - `classification_id` (int) — ID from the sample classification enumeration. Use `1` to submit a blank value. - `test_package_ids` (list of int) — IDs of the test packages ordered for this sample. - `notes` (string, optional) — additional notes about this sample. - `lims_id` (string, optional) — internal tracking ID for this sample. - `production_date` (date, optional) — date the sample or product was harvested or created. - `date_samples_collected` (date, optional) — date the sample was collected. - `batch_id` (string, optional) — batch identifier. - `batch_size` (float, optional) — batch size. - `batch_size_unit` (string, optional) — `g` for grams, `units` for units, or `lb` for pounds. Defaults to `g`. - `lot_id` (string, optional) — lot identifier. - `lot_size` (float, optional) — lot size. - `lot_size_unit` (string, optional) — `g` for grams, `units` for units, or `lb` for pounds. Defaults to `g`. - `production_run_id` (string, optional) — production run identifier. - `production_run_size` (float, optional) — production run size. - `production_run_size_unit` (string, optional) — `g` for grams, `units` for units, or `lb` for pounds. Defaults to `g`. - `manifest_id` (string, optional) — manifest identifier, often for seed-to-sale systems. - `harvest_id` (string, optional) — harvest identifier, often for seed-to-sale systems. - `regulator_sample_id` (string, optional) — seed-to-sale tracking ID for this sample. - `regulator_batch_id` (string, optional) — seed-to-sale batch ID for this sample. - `regulator_lot_id` (string, optional) — seed-to-sale lot ID for this sample. The following fields are required to calculate mg/container values for edibles: - `unit_description` (string, optional) — describes the serving unit of the sample. - `unit_weight` (float, optional) — weight of an individual unit. - `units_per_serving` (float, optional) — how many units make up one serving. - `servings_per_container` (float, optional) — how many servings are in a container. ## Body parameters (application/x-www-form-urlencoded) - `order` (string, required) — JSON-encoded order object — see the field reference below. Example: ```json { "client_id": 318, "client_license_id": 4410, "lab_license_id": 87, "address_id": 771, "pickup": false, "price_adjustment": -25.0, "send_client_email": true, "lims_id": "PO-8841", "secondary_client_name": "Valley Distribution", "secondary_client_type": 1, "secondary_client_address": "2100 Harbor Blvd, Oakland, CA 94607", "secondary_client_license": "C11-0000456-LIC", "samples": [ { "name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "type_id": 1, "production_method_id": 1, "classification_id": 4, "test_package_ids": [ 4 ], "notes": "Collected from the north drying room.", "lims_id": "LIMS-8841-1", "production_date": "2025-02-18", "date_samples_collected": "2025-03-13", "batch_id": "BD-2503-01", "batch_size": 4500.0, "batch_size_unit": "g", "harvest_id": "HARVEST-2503-BD", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987" } ] } ``` ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `order` (object) - `id` (string) — Order ID - `industry_id` (integer) — Industry ID - `industry_name` (string) — Industry Name - `lims_id` (string) — Order lims ID - `client_id` (integer) — Client ID - `status_id` (integer) — Status ID - `status_name` (string) — Status Name - `lab_license_number` (string) — Lab license number under which order was tested - `client_license_number` (string) — Client license number under which order was placed - `ordered_date` (timestamp) — Order Date [when order was placed] - `verified_date` (timestamp) — Verified Date [when order was verified] - `completed_date` (timestamp) — Completed Date [when order was completed] - `last_modified` (timestamp) — Time this order was last modified - `address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `client` (object) - `id` (integer) — Client ID - `name` (string) — Organization Name - `training` (boolean) — Whether this is a training client - `last_modified` (timestamp) — Time this client was last modified - `email` (string) — Organization Email - `phone` (string) — Organization Phone - `url` (string) — Organization Website - `primary_address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `nickname` (string) — Human entered name for license - `license_designation_name` (string) — License Designation Name [changes by state] - `license_type_name` (string) — License Type Name [changes by state] - `samples` (array of objects) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `initial_weight` (number) — Sample weight at order verification - `initial_weight_unit` (number) — Unit type for Initial Weight - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation - `cover_image` (object) - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `images` (array of objects) — Will also contain cover image - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `notes` (string) — Notes about the sample - `batch_size` (number) — Size of the client's batch from which the sample tested by the lab came - `batch_size_unit` (string) — Unit type for batch size (units, lb, or g) - `lot_id` (string) — Unique ID from the client's inventory management system of the client's lot from which the sample tested by the lab came - `lot_size` (number) — Size of the client's lot from which the sample tested by the lab came - `lot_size_unit` (string) — Unit type for lot size (units, lb, or g) - `production_run_id` (string) — Unique ID from the client's inventory management system of the client's production run from which the sample tested by the lab came - `production_run_size` (number) — Size of the client's production run from which the sample tested by the lab came - `production_run_size_unit` (string) — Unit type for production run size (units, lb, or g) - `manifest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample manifest from which the sample tested by the lab came - `regulator_lot_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's lot from which the sample tested by the lab came - `regulator_sample_id2` (string) — (for Leaf) Pre-Transfer Batch ID - `regulator_batch_id2` (string) — (for Leaf) Pre-Transfer Inventory/Lot ID - `production_date` (timestamp) — Harvest/Production Date [when sample was produced] - `date_samples_collected` (timestamp) — Collection Date [when sample was collected] - `public_url` (string) — Unique URL for viewing this sample or CoA without requiring a login. Should be added to CoAs and used for QR codes or other barcode images so end consumers can verify the integrity of the data - `units_per_serving` (number) — Serving Size - `servings_per_container` (number) — Number of Servings in one Container - `unit_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Bottle) - `container_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Gummy) - `regulatory_category_id` (integer) — Unique ID for sample's regulatory category - `solvents_used` (string) — Information about the solvents used in testing - `has_coa` (boolean) — True if sample has a Certificate of Analysis - `coa` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `coa_additions` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `order_lims_id` (string) — Orders lims ID - `lims_id` (string) — Sample lims ID - `weight_on_hand` (number) — Current weight on hand - `weight_on_hand_unit` (string) — Unit type for weight measurements (units, g, or ml) - `has_lab_data` (boolean) — True if sample has test results - `has_lab_data_draft` (boolean) — True if sample has draft test results - `has_coa_draft` (boolean) — True if sample has a draft Certificate of Analysis - `coa_draft` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `custom_field` (string) — Custom Field - `external_data` (any) — Custom External Json Data - `extra_field_1` (string) — Custom data field - `extra_field_2` (string) — Custom data field - `extra_field_3` (string) — Custom data field - `extra_field_4` (string) — Custom data field - `extra_field_5` (string) — Custom data field - `extra_field_6` (string) — Custom data field - `extra_field_7` (string) — Custom data field - `extra_field_8` (string) — Custom data field - `extra_field_9` (string) — Custom data field - `extra_field_10` (string) — Custom data field - `extra_date_field_1` (timestamp) — Custom data field for dates - `extra_date_field_2` (timestamp) — Custom data field for dates - `extra_date_field_3` (timestamp) — Custom data field for dates - `extra_date_field_4` (timestamp) — Custom data field for dates - `extra_date_field_5` (timestamp) — Custom data field for dates - `extra_bool_field_1` (boolean) — Custom data field for yes/no fields - `extra_bool_field_2` (boolean) — Custom data field for yes/no fields - `extra_bool_field_3` (boolean) — Custom data field for yes/no fields - `extra_bool_field_4` (boolean) — Custom data field for yes/no fields - `extra_bool_field_5` (boolean) — Custom data field for yes/no fields - `test_package_total_price` (number) — Total price of test packages with custom client pricing and discounts included - `due_date` (timestamp) — Due date - `has_rushed_test_types` (boolean) — True if sample has rushed test types - `rushed_test_types` (array of strings) — List of rushed test type abbreviations - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `files` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `comments` (string) — Comments entered when placing the order - `rejected_message` (string) — Message saved when rejecting the order - `verified_message` (string) — Message saved when verifying the order - `completed_message` (string) — Message saved when completing the order - `discount` (number) — Percent discount applied to order - `lab_adjustment` (number) — Flat discount applied to end of order (pre-tax) - `sales_tax_rate` (number) — Sales tax rate applied to order - `sales_tax_cents` (integer) — Sales tax applied to order (in cents) - `subtotal_cents` (integer) — Pre-tax cost for order (in cents) - `total_price_cents` (integer) — Final invoice cost for order (in cents) - `pickup` (boolean) — Whether this is a pickup or dropoff - `secondary_client_type` (integer) — Secondary client type ID - `secondary_client_name` (string) — Secondary client name - `secondary_client_address` (string) — Secondary client address - `secondary_client_license` (string) — Secondary client license Example: ```json { "success": true, "order": { "id": "2503GLL0042", "industry_id": 1, "industry_name": "Cannabis", "lims_id": "PO-8841", "client_id": 318, "status_id": 2, "status_name": "Placed", "lab_license_number": "C8-0000123-LIC", "client_license_number": "CDPH-10003456", "ordered_date": "2025-03-14T09:12:44", "verified_date": null, "completed_date": null, "last_modified": "2025-03-14T09:12:44", "address": { "id": 771, "address_line_1": "1400 Industrial Way", "address_line_2": "Suite 4", "city": "Sacramento", "state_abbreviation": "CA", "zipcode": "95811" }, "client": { "id": 318, "name": "Sunrise Cultivation", "training": false, "last_modified": "2025-02-27T18:04:03", "email": "orders@sunrisecultivation.com", "phone": "9165550142", "url": "https://sunrisecultivation.com", "primary_address": { "id": 902, "address_line_1": "55 Orchard Road", "address_line_2": null, "city": "Woodland", "state_abbreviation": "CA", "zipcode": "95695" }, "licenses": [ { "id": 4410, "license_number": "CDPH-10003456", "license_code": null, "nickname": "Woodland cultivation", "license_designation_name": "Adult Use", "license_type_name": "Cultivation - Small Indoor" } ] }, "samples": [ { "id": "2503GLL0042.0001", "order_id": "2503GLL0042", "client_id": 318, "lab": { "id": 12, "name": "Green Leaf Labs" }, "order_status_id": 2, "order_status_name": "Placed", "sample_name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower, Cured", "sample_classification_id": 4, "sample_classification_name": "Hybrid", "production_method_id": 1, "production_method_name": "Indoor", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987", "batch_id": "BD-2503-01", "harvest_id": "HARVEST-2503-BD", "test_packages": [ { "id": 4, "name": "California Compliance - Flower", "price": 275.0, "minimum_quantity": 5.0 } ], "last_modified": "2025-03-14T09:12:44", "date_published": null, "order_lims_id": "PO-8841", "lims_id": "LIMS-8841-1", "notes": "Collected from the north drying room.", "batch_size": 4500.0, "batch_size_unit": "g", "production_date": "2025-02-18", "date_samples_collected": "2025-03-13", "public_url": "https://confidentcannabis.com/s/2503GLL0042.0001", "weight_on_hand": 12.5, "weight_on_hand_unit": "g", "has_lab_data": false, "has_coa": false, "coa": null, "coa_additions": [] } ], "logs": [ { "user_name": "Dana Reyes", "user_id": 5501, "log_time": "2025-03-14T09:12:44", "message": "Order placed" } ], "files": [], "comments": "Please prioritise potency.", "rejected_message": null, "verified_message": null, "completed_message": null, "discount": 0.0, "lab_adjustment": -25.0, "sales_tax_rate": 0.0, "sales_tax_cents": 0, "subtotal_cents": 27500, "total_price_cents": 25000, "pickup": false, "secondary_client_type": 1, "secondary_client_name": "Valley Distribution", "secondary_client_address": "2100 Harbor Blvd, Oakland, CA 94607", "secondary_client_license": "C11-0000456-LIC" } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/order' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' \ --data-urlencode 'order={ "client_id": 318, "client_license_id": 4410, "lab_license_id": 87, "address_id": 771, "pickup": false, "price_adjustment": -25.0, "send_client_email": true, "lims_id": "PO-8841", "secondary_client_name": "Valley Distribution", "secondary_client_type": 1, "secondary_client_address": "2100 Harbor Blvd, Oakland, CA 94607", "secondary_client_license": "C11-0000456-LIC", "samples": [ { "name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "type_id": 1, "production_method_id": 1, "classification_id": 4, "test_package_ids": [ 4 ], "notes": "Collected from the north drying room.", "lims_id": "LIMS-8841-1", "production_date": "2025-02-18", "date_samples_collected": "2025-03-13", "batch_id": "BD-2503-01", "batch_size": 4500.0, "batch_size_unit": "g", "harvest_id": "HARVEST-2503-BD", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987" } ] }' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order' data = { "order": "{\n \"client_id\": 318,\n \"client_license_id\": 4410,\n \"lab_license_id\": 87,\n \"address_id\": 771,\n \"pickup\": false,\n \"price_adjustment\": -25.0,\n \"send_client_email\": true,\n \"lims_id\": \"PO-8841\",\n \"secondary_client_name\": \"Valley Distribution\",\n \"secondary_client_type\": 1,\n \"secondary_client_address\": \"2100 Harbor Blvd, Oakland, CA 94607\",\n \"secondary_client_license\": \"C11-0000456-LIC\",\n \"samples\": [\n {\n \"name\": \"Blue Dream - Cured Flower\",\n \"strain_name\": \"Blue Dream\",\n \"type_id\": 1,\n \"production_method_id\": 1,\n \"classification_id\": 4,\n \"test_package_ids\": [\n 4\n ],\n \"notes\": \"Collected from the north drying room.\",\n \"lims_id\": \"LIMS-8841-1\",\n \"production_date\": \"2025-02-18\",\n \"date_samples_collected\": \"2025-03-13\",\n \"batch_id\": \"BD-2503-01\",\n \"batch_size\": 4500.0,\n \"batch_size_unit\": \"g\",\n \"harvest_id\": \"HARVEST-2503-BD\",\n \"regulator_sample_id\": \"1A4060300003B01000001234\",\n \"regulator_batch_id\": \"1A4060300003B01000000987\"\n }\n ]\n}", } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order"; const data = { "order": "{\n \"client_id\": 318,\n \"client_license_id\": 4410,\n \"lab_license_id\": 87,\n \"address_id\": 771,\n \"pickup\": false,\n \"price_adjustment\": -25.0,\n \"send_client_email\": true,\n \"lims_id\": \"PO-8841\",\n \"secondary_client_name\": \"Valley Distribution\",\n \"secondary_client_type\": 1,\n \"secondary_client_address\": \"2100 Harbor Blvd, Oakland, CA 94607\",\n \"secondary_client_license\": \"C11-0000456-LIC\",\n \"samples\": [\n {\n \"name\": \"Blue Dream - Cured Flower\",\n \"strain_name\": \"Blue Dream\",\n \"type_id\": 1,\n \"production_method_id\": 1,\n \"classification_id\": 4,\n \"test_package_ids\": [\n 4\n ],\n \"notes\": \"Collected from the north drying room.\",\n \"lims_id\": \"LIMS-8841-1\",\n \"production_date\": \"2025-02-18\",\n \"date_samples_collected\": \"2025-03-13\",\n \"batch_id\": \"BD-2503-01\",\n \"batch_size\": 4500.0,\n \"batch_size_unit\": \"g\",\n \"harvest_id\": \"HARVEST-2503-BD\",\n \"regulator_sample_id\": \"1A4060300003B01000001234\",\n \"regulator_batch_id\": \"1A4060300003B01000000987\"\n }\n ]\n}", }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/create-order OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Get an order `GET /v0/labs/order/{order_id}` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return full details for a single order of your lab, including its samples, client, pricing, activity log and attached files. ## Path parameters - `order_id` (string, required) ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `order` (object) - `id` (string) — Order ID - `industry_id` (integer) — Industry ID - `industry_name` (string) — Industry Name - `lims_id` (string) — Order lims ID - `client_id` (integer) — Client ID - `status_id` (integer) — Status ID - `status_name` (string) — Status Name - `lab_license_number` (string) — Lab license number under which order was tested - `client_license_number` (string) — Client license number under which order was placed - `ordered_date` (timestamp) — Order Date [when order was placed] - `verified_date` (timestamp) — Verified Date [when order was verified] - `completed_date` (timestamp) — Completed Date [when order was completed] - `last_modified` (timestamp) — Time this order was last modified - `address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `client` (object) - `id` (integer) — Client ID - `name` (string) — Organization Name - `training` (boolean) — Whether this is a training client - `last_modified` (timestamp) — Time this client was last modified - `email` (string) — Organization Email - `phone` (string) — Organization Phone - `url` (string) — Organization Website - `primary_address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `nickname` (string) — Human entered name for license - `license_designation_name` (string) — License Designation Name [changes by state] - `license_type_name` (string) — License Type Name [changes by state] - `samples` (array of objects) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `initial_weight` (number) — Sample weight at order verification - `initial_weight_unit` (number) — Unit type for Initial Weight - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation - `cover_image` (object) - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `images` (array of objects) — Will also contain cover image - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `notes` (string) — Notes about the sample - `batch_size` (number) — Size of the client's batch from which the sample tested by the lab came - `batch_size_unit` (string) — Unit type for batch size (units, lb, or g) - `lot_id` (string) — Unique ID from the client's inventory management system of the client's lot from which the sample tested by the lab came - `lot_size` (number) — Size of the client's lot from which the sample tested by the lab came - `lot_size_unit` (string) — Unit type for lot size (units, lb, or g) - `production_run_id` (string) — Unique ID from the client's inventory management system of the client's production run from which the sample tested by the lab came - `production_run_size` (number) — Size of the client's production run from which the sample tested by the lab came - `production_run_size_unit` (string) — Unit type for production run size (units, lb, or g) - `manifest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample manifest from which the sample tested by the lab came - `regulator_lot_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's lot from which the sample tested by the lab came - `regulator_sample_id2` (string) — (for Leaf) Pre-Transfer Batch ID - `regulator_batch_id2` (string) — (for Leaf) Pre-Transfer Inventory/Lot ID - `production_date` (timestamp) — Harvest/Production Date [when sample was produced] - `date_samples_collected` (timestamp) — Collection Date [when sample was collected] - `public_url` (string) — Unique URL for viewing this sample or CoA without requiring a login. Should be added to CoAs and used for QR codes or other barcode images so end consumers can verify the integrity of the data - `units_per_serving` (number) — Serving Size - `servings_per_container` (number) — Number of Servings in one Container - `unit_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Bottle) - `container_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Gummy) - `regulatory_category_id` (integer) — Unique ID for sample's regulatory category - `solvents_used` (string) — Information about the solvents used in testing - `has_coa` (boolean) — True if sample has a Certificate of Analysis - `coa` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `coa_additions` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `order_lims_id` (string) — Orders lims ID - `lims_id` (string) — Sample lims ID - `weight_on_hand` (number) — Current weight on hand - `weight_on_hand_unit` (string) — Unit type for weight measurements (units, g, or ml) - `has_lab_data` (boolean) — True if sample has test results - `has_lab_data_draft` (boolean) — True if sample has draft test results - `has_coa_draft` (boolean) — True if sample has a draft Certificate of Analysis - `coa_draft` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `custom_field` (string) — Custom Field - `external_data` (any) — Custom External Json Data - `extra_field_1` (string) — Custom data field - `extra_field_2` (string) — Custom data field - `extra_field_3` (string) — Custom data field - `extra_field_4` (string) — Custom data field - `extra_field_5` (string) — Custom data field - `extra_field_6` (string) — Custom data field - `extra_field_7` (string) — Custom data field - `extra_field_8` (string) — Custom data field - `extra_field_9` (string) — Custom data field - `extra_field_10` (string) — Custom data field - `extra_date_field_1` (timestamp) — Custom data field for dates - `extra_date_field_2` (timestamp) — Custom data field for dates - `extra_date_field_3` (timestamp) — Custom data field for dates - `extra_date_field_4` (timestamp) — Custom data field for dates - `extra_date_field_5` (timestamp) — Custom data field for dates - `extra_bool_field_1` (boolean) — Custom data field for yes/no fields - `extra_bool_field_2` (boolean) — Custom data field for yes/no fields - `extra_bool_field_3` (boolean) — Custom data field for yes/no fields - `extra_bool_field_4` (boolean) — Custom data field for yes/no fields - `extra_bool_field_5` (boolean) — Custom data field for yes/no fields - `test_package_total_price` (number) — Total price of test packages with custom client pricing and discounts included - `due_date` (timestamp) — Due date - `has_rushed_test_types` (boolean) — True if sample has rushed test types - `rushed_test_types` (array of strings) — List of rushed test type abbreviations - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `files` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `comments` (string) — Comments entered when placing the order - `rejected_message` (string) — Message saved when rejecting the order - `verified_message` (string) — Message saved when verifying the order - `completed_message` (string) — Message saved when completing the order - `discount` (number) — Percent discount applied to order - `lab_adjustment` (number) — Flat discount applied to end of order (pre-tax) - `sales_tax_rate` (number) — Sales tax rate applied to order - `sales_tax_cents` (integer) — Sales tax applied to order (in cents) - `subtotal_cents` (integer) — Pre-tax cost for order (in cents) - `total_price_cents` (integer) — Final invoice cost for order (in cents) - `pickup` (boolean) — Whether this is a pickup or dropoff - `secondary_client_type` (integer) — Secondary client type ID - `secondary_client_name` (string) — Secondary client name - `secondary_client_address` (string) — Secondary client address - `secondary_client_license` (string) — Secondary client license Example: ```json { "success": true, "order": { "id": "2503GLL0042", "industry_id": 1, "industry_name": "Cannabis", "lims_id": "PO-8841", "client_id": 318, "status_id": 2, "status_name": "Placed", "lab_license_number": "C8-0000123-LIC", "client_license_number": "CDPH-10003456", "ordered_date": "2025-03-14T09:12:44", "verified_date": null, "completed_date": null, "last_modified": "2025-03-14T09:12:44", "address": { "id": 771, "address_line_1": "1400 Industrial Way", "address_line_2": "Suite 4", "city": "Sacramento", "state_abbreviation": "CA", "zipcode": "95811" }, "client": { "id": 318, "name": "Sunrise Cultivation", "training": false, "last_modified": "2025-02-27T18:04:03", "email": "orders@sunrisecultivation.com", "phone": "9165550142", "url": "https://sunrisecultivation.com", "primary_address": { "id": 902, "address_line_1": "55 Orchard Road", "address_line_2": null, "city": "Woodland", "state_abbreviation": "CA", "zipcode": "95695" }, "licenses": [ { "id": 4410, "license_number": "CDPH-10003456", "license_code": null, "nickname": "Woodland cultivation", "license_designation_name": "Adult Use", "license_type_name": "Cultivation - Small Indoor" } ] }, "samples": [ { "id": "2503GLL0042.0001", "order_id": "2503GLL0042", "client_id": 318, "lab": { "id": 12, "name": "Green Leaf Labs" }, "order_status_id": 2, "order_status_name": "Placed", "sample_name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower, Cured", "sample_classification_id": 4, "sample_classification_name": "Hybrid", "production_method_id": 1, "production_method_name": "Indoor", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987", "batch_id": "BD-2503-01", "harvest_id": "HARVEST-2503-BD", "test_packages": [ { "id": 4, "name": "California Compliance - Flower", "price": 275.0, "minimum_quantity": 5.0 } ], "last_modified": "2025-03-14T09:12:44", "date_published": null, "order_lims_id": "PO-8841", "lims_id": "LIMS-8841-1", "notes": "Collected from the north drying room.", "batch_size": 4500.0, "batch_size_unit": "g", "production_date": "2025-02-18", "date_samples_collected": "2025-03-13", "public_url": "https://confidentcannabis.com/s/2503GLL0042.0001", "weight_on_hand": 12.5, "weight_on_hand_unit": "g", "has_lab_data": false, "has_coa": false, "coa": null, "coa_additions": [] } ], "logs": [ { "user_name": "Dana Reyes", "user_id": 5501, "log_time": "2025-03-14T09:12:44", "message": "Order placed" } ], "files": [], "comments": "Please prioritise potency.", "rejected_message": null, "verified_message": null, "completed_message": null, "discount": 0.0, "lab_adjustment": -25.0, "sales_tax_rate": 0.0, "sales_tax_cents": 0, "subtotal_cents": 27500, "total_price_cents": 25000, "pickup": false, "secondary_client_type": 1, "secondary_client_name": "Valley Distribution", "secondary_client_address": "2100 Harbor Blvd, Oakland, CA 94607", "secondary_client_license": "C11-0000456-LIC" } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/labs/order/{order_id}' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/get-order-details OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Update an order `PATCH /v0/labs/order/{order_id}` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Update an existing order. Only the fields below can be patched; send just the ones you want to change. `secondary_client_type` accepts `1` for producer, `2` for distributor. ## Path parameters - `order_id` (string, required) ## Body parameters (application/x-www-form-urlencoded) - `client_license_id` (integer, optional) — Identifier for the client license under which this order should be placed (the ID, not the license number). - `lab_license_id` (integer, optional) — Identifier for the lab license under which this order should be placed (the ID, not the license number). - `pickup` (boolean, optional, default `False`) — True if this order should be picked up at the client location. Example: `False` - `address_id` (integer, optional) — Lab address ID for drop-off orders, client address ID for pickup orders. - `price_adjustment` (number, optional) — Dollar amount to change the order by; negative for a discount, positive for additional fees. Example: `-25.0` - `send_client_email` (boolean, optional, default `True`) — If true the client receives email notifications for the order being edited. Defaults to true. Example: `True` - `lims_id` (string, optional) — Internal tracking ID for this order. Example: `PO-8841` - `secondary_client_name` (string, optional) — Company name for the secondary client. - `secondary_client_address` (string, optional) — Full address string for the secondary client. - `secondary_client_license` (string, optional) — License used by the secondary client for the order transaction. - `secondary_client_type` (integer, optional) — Integer secondary client type ID; see the description above. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `order` (object) - `id` (string) — Order ID - `industry_id` (integer) — Industry ID - `industry_name` (string) — Industry Name - `lims_id` (string) — Order lims ID - `client_id` (integer) — Client ID - `status_id` (integer) — Status ID - `status_name` (string) — Status Name - `lab_license_number` (string) — Lab license number under which order was tested - `client_license_number` (string) — Client license number under which order was placed - `ordered_date` (timestamp) — Order Date [when order was placed] - `verified_date` (timestamp) — Verified Date [when order was verified] - `completed_date` (timestamp) — Completed Date [when order was completed] - `last_modified` (timestamp) — Time this order was last modified - `address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `client` (object) - `id` (integer) — Client ID - `name` (string) — Organization Name - `training` (boolean) — Whether this is a training client - `last_modified` (timestamp) — Time this client was last modified - `email` (string) — Organization Email - `phone` (string) — Organization Phone - `url` (string) — Organization Website - `primary_address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `nickname` (string) — Human entered name for license - `license_designation_name` (string) — License Designation Name [changes by state] - `license_type_name` (string) — License Type Name [changes by state] - `samples` (array of objects) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `initial_weight` (number) — Sample weight at order verification - `initial_weight_unit` (number) — Unit type for Initial Weight - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation - `cover_image` (object) - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `images` (array of objects) — Will also contain cover image - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `notes` (string) — Notes about the sample - `batch_size` (number) — Size of the client's batch from which the sample tested by the lab came - `batch_size_unit` (string) — Unit type for batch size (units, lb, or g) - `lot_id` (string) — Unique ID from the client's inventory management system of the client's lot from which the sample tested by the lab came - `lot_size` (number) — Size of the client's lot from which the sample tested by the lab came - `lot_size_unit` (string) — Unit type for lot size (units, lb, or g) - `production_run_id` (string) — Unique ID from the client's inventory management system of the client's production run from which the sample tested by the lab came - `production_run_size` (number) — Size of the client's production run from which the sample tested by the lab came - `production_run_size_unit` (string) — Unit type for production run size (units, lb, or g) - `manifest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample manifest from which the sample tested by the lab came - `regulator_lot_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's lot from which the sample tested by the lab came - `regulator_sample_id2` (string) — (for Leaf) Pre-Transfer Batch ID - `regulator_batch_id2` (string) — (for Leaf) Pre-Transfer Inventory/Lot ID - `production_date` (timestamp) — Harvest/Production Date [when sample was produced] - `date_samples_collected` (timestamp) — Collection Date [when sample was collected] - `public_url` (string) — Unique URL for viewing this sample or CoA without requiring a login. Should be added to CoAs and used for QR codes or other barcode images so end consumers can verify the integrity of the data - `units_per_serving` (number) — Serving Size - `servings_per_container` (number) — Number of Servings in one Container - `unit_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Bottle) - `container_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Gummy) - `regulatory_category_id` (integer) — Unique ID for sample's regulatory category - `solvents_used` (string) — Information about the solvents used in testing - `has_coa` (boolean) — True if sample has a Certificate of Analysis - `coa` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `coa_additions` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `order_lims_id` (string) — Orders lims ID - `lims_id` (string) — Sample lims ID - `weight_on_hand` (number) — Current weight on hand - `weight_on_hand_unit` (string) — Unit type for weight measurements (units, g, or ml) - `has_lab_data` (boolean) — True if sample has test results - `has_lab_data_draft` (boolean) — True if sample has draft test results - `has_coa_draft` (boolean) — True if sample has a draft Certificate of Analysis - `coa_draft` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `custom_field` (string) — Custom Field - `external_data` (any) — Custom External Json Data - `extra_field_1` (string) — Custom data field - `extra_field_2` (string) — Custom data field - `extra_field_3` (string) — Custom data field - `extra_field_4` (string) — Custom data field - `extra_field_5` (string) — Custom data field - `extra_field_6` (string) — Custom data field - `extra_field_7` (string) — Custom data field - `extra_field_8` (string) — Custom data field - `extra_field_9` (string) — Custom data field - `extra_field_10` (string) — Custom data field - `extra_date_field_1` (timestamp) — Custom data field for dates - `extra_date_field_2` (timestamp) — Custom data field for dates - `extra_date_field_3` (timestamp) — Custom data field for dates - `extra_date_field_4` (timestamp) — Custom data field for dates - `extra_date_field_5` (timestamp) — Custom data field for dates - `extra_bool_field_1` (boolean) — Custom data field for yes/no fields - `extra_bool_field_2` (boolean) — Custom data field for yes/no fields - `extra_bool_field_3` (boolean) — Custom data field for yes/no fields - `extra_bool_field_4` (boolean) — Custom data field for yes/no fields - `extra_bool_field_5` (boolean) — Custom data field for yes/no fields - `test_package_total_price` (number) — Total price of test packages with custom client pricing and discounts included - `due_date` (timestamp) — Due date - `has_rushed_test_types` (boolean) — True if sample has rushed test types - `rushed_test_types` (array of strings) — List of rushed test type abbreviations - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `files` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `comments` (string) — Comments entered when placing the order - `rejected_message` (string) — Message saved when rejecting the order - `verified_message` (string) — Message saved when verifying the order - `completed_message` (string) — Message saved when completing the order - `discount` (number) — Percent discount applied to order - `lab_adjustment` (number) — Flat discount applied to end of order (pre-tax) - `sales_tax_rate` (number) — Sales tax rate applied to order - `sales_tax_cents` (integer) — Sales tax applied to order (in cents) - `subtotal_cents` (integer) — Pre-tax cost for order (in cents) - `total_price_cents` (integer) — Final invoice cost for order (in cents) - `pickup` (boolean) — Whether this is a pickup or dropoff - `secondary_client_type` (integer) — Secondary client type ID - `secondary_client_name` (string) — Secondary client name - `secondary_client_address` (string) — Secondary client address - `secondary_client_license` (string) — Secondary client license Example: ```json { "success": true, "order": { "id": "2503GLL0042", "industry_id": 1, "industry_name": "Cannabis", "lims_id": "PO-8841", "client_id": 318, "status_id": 2, "status_name": "Placed", "lab_license_number": "C8-0000123-LIC", "client_license_number": "CDPH-10003456", "ordered_date": "2025-03-14T09:12:44", "verified_date": null, "completed_date": null, "last_modified": "2025-03-14T09:12:44", "address": { "id": 771, "address_line_1": "1400 Industrial Way", "address_line_2": "Suite 4", "city": "Sacramento", "state_abbreviation": "CA", "zipcode": "95811" }, "client": { "id": 318, "name": "Sunrise Cultivation", "training": false, "last_modified": "2025-02-27T18:04:03", "email": "orders@sunrisecultivation.com", "phone": "9165550142", "url": "https://sunrisecultivation.com", "primary_address": { "id": 902, "address_line_1": "55 Orchard Road", "address_line_2": null, "city": "Woodland", "state_abbreviation": "CA", "zipcode": "95695" }, "licenses": [ { "id": 4410, "license_number": "CDPH-10003456", "license_code": null, "nickname": "Woodland cultivation", "license_designation_name": "Adult Use", "license_type_name": "Cultivation - Small Indoor" } ] }, "samples": [ { "id": "2503GLL0042.0001", "order_id": "2503GLL0042", "client_id": 318, "lab": { "id": 12, "name": "Green Leaf Labs" }, "order_status_id": 2, "order_status_name": "Placed", "sample_name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower, Cured", "sample_classification_id": 4, "sample_classification_name": "Hybrid", "production_method_id": 1, "production_method_name": "Indoor", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987", "batch_id": "BD-2503-01", "harvest_id": "HARVEST-2503-BD", "test_packages": [ { "id": 4, "name": "California Compliance - Flower", "price": 275.0, "minimum_quantity": 5.0 } ], "last_modified": "2025-03-14T09:12:44", "date_published": null, "order_lims_id": "PO-8841", "lims_id": "LIMS-8841-1", "notes": "Collected from the north drying room.", "batch_size": 4500.0, "batch_size_unit": "g", "production_date": "2025-02-18", "date_samples_collected": "2025-03-13", "public_url": "https://confidentcannabis.com/s/2503GLL0042.0001", "weight_on_hand": 12.5, "weight_on_hand_unit": "g", "has_lab_data": false, "has_coa": false, "coa": null, "coa_additions": [] } ], "logs": [ { "user_name": "Dana Reyes", "user_id": 5501, "log_time": "2025-03-14T09:12:44", "message": "Order placed" } ], "files": [], "comments": "Please prioritise potency.", "rejected_message": null, "verified_message": null, "completed_message": null, "discount": 0.0, "lab_adjustment": -25.0, "sales_tax_rate": 0.0, "sales_tax_cents": 0, "subtotal_cents": 27500, "total_price_cents": 25000, "pickup": false, "secondary_client_type": 1, "secondary_client_name": "Valley Distribution", "secondary_client_address": "2100 Harbor Blvd, Oakland, CA 94607", "secondary_client_license": "C11-0000456-LIC" } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X PATCH 'https://api.confidentcannabis.com/v0/labs/order/{order_id}' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}' data = { # optional form fields go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'PATCH', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.patch( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}"; const data = { // optional form fields go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "PATCH", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "PATCH", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/patch-order OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Upload an order document `POST /v0/labs/order/{order_id}/document` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`multipart/form-data`), never JSON. Attach a document to an order. Allowed extensions: `csv`, `pdf`, `png`, `jpg`, `jpeg`, `gif`, `bmp`, `txt`. Documents can only be added while the order is in progress (status ID 3). Uploading to an order in any other status fails with `invalid_order_status`. Send the file as a `document` field in a standard `multipart/form-data` body. File fields must not be included when generating a request signature. ## Path parameters - `order_id` (string, required) ## Body parameters (multipart/form-data) - `document` (file, required) — The file to attach to the order. ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/order/{order_id}/document' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' \ -F 'document=@/path/to/file' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}/document' # file uploads are sent but never signed files = { "document": open('/path/to/file', 'rb'), } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, files=files, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}/document"; const body = new FormData(); // file uploads are sent but never signed body.append("document", file); // a File or Blob const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/post-order-document OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Add a sample to an order `POST /v0/labs/order/{order_id}/samples` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Add a sample to an existing order and return the updated order. Send the sample as a single `sample` form field containing the JSON-encoded object described below. The sample must belong to the same industry as the rest of the order. Samples cannot be added to an order that has been canceled or completed; those requests fail with `invalid_order_status`. ### Sample fields - `name` (string) — product name for this sample. - `strain_name` (string) — name of the sample strain. Optional for non-cannabis samples. - `type_id` (int) — ID from the sample type enumeration. - `production_method_id` (int) — ID from the production method enumeration. To submit a blank value, use the category's unnamed production method from `GET /sampleproductionmethods` (`99` for cannabis plant samples; other categories have their own blank IDs). - `classification_id` (int) — ID from the sample classification enumeration. Use `1` to submit a blank value. - `test_package_ids` (list of int) — IDs of the test packages ordered for this sample. - `notes` (string, optional) — additional notes about this sample. - `lims_id` (string, optional) — internal tracking ID for this sample. - `production_date` (date, optional) — date the sample or product was harvested or created. - `date_samples_collected` (date, optional) — date the sample was collected. - `batch_id` (string, optional) — batch identifier. - `batch_size` (float, optional) — batch size. - `batch_size_unit` (string, optional) — `g` for grams, `units` for units, or `lb` for pounds. Defaults to `g`. - `lot_id` (string, optional) — lot identifier. - `lot_size` (float, optional) — lot size. - `lot_size_unit` (string, optional) — `g` for grams, `units` for units, or `lb` for pounds. Defaults to `g`. - `production_run_id` (string, optional) — production run identifier. - `production_run_size` (float, optional) — production run size. - `production_run_size_unit` (string, optional) — `g` for grams, `units` for units, or `lb` for pounds. Defaults to `g`. - `manifest_id` (string, optional) — manifest identifier, often for seed-to-sale systems. - `harvest_id` (string, optional) — harvest identifier, often for seed-to-sale systems. - `regulator_sample_id` (string, optional) — seed-to-sale tracking ID for this sample. - `regulator_batch_id` (string, optional) — seed-to-sale batch ID for this sample. - `regulator_lot_id` (string, optional) — seed-to-sale lot ID for this sample. The following fields are required to calculate mg/container values for edibles: - `unit_description` (string, optional) — describes the serving unit of the sample. - `unit_weight` (float, optional) — weight of an individual unit. - `units_per_serving` (float, optional) — how many units make up one serving. - `servings_per_container` (float, optional) — how many servings are in a container. The sample object also accepts: - `send_client_email` (boolean, optional) — if `true` the client receives email notifications for the order being edited. Defaults to `true`. ## Path parameters - `order_id` (string, required) ## Body parameters (application/x-www-form-urlencoded) - `sample` (string, required) — JSON-encoded sample object — see the field reference below. Example: ```json { "name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "type_id": 1, "production_method_id": 1, "classification_id": 4, "test_package_ids": [ 4 ], "notes": "Collected from the north drying room.", "lims_id": "LIMS-8841-1", "production_date": "2025-02-18", "date_samples_collected": "2025-03-13", "batch_id": "BD-2503-01", "batch_size": 4500.0, "batch_size_unit": "g", "harvest_id": "HARVEST-2503-BD", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987", "send_client_email": true } ``` ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `order` (object) - `id` (string) — Order ID - `industry_id` (integer) — Industry ID - `industry_name` (string) — Industry Name - `lims_id` (string) — Order lims ID - `client_id` (integer) — Client ID - `status_id` (integer) — Status ID - `status_name` (string) — Status Name - `lab_license_number` (string) — Lab license number under which order was tested - `client_license_number` (string) — Client license number under which order was placed - `ordered_date` (timestamp) — Order Date [when order was placed] - `verified_date` (timestamp) — Verified Date [when order was verified] - `completed_date` (timestamp) — Completed Date [when order was completed] - `last_modified` (timestamp) — Time this order was last modified - `address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `client` (object) - `id` (integer) — Client ID - `name` (string) — Organization Name - `training` (boolean) — Whether this is a training client - `last_modified` (timestamp) — Time this client was last modified - `email` (string) — Organization Email - `phone` (string) — Organization Phone - `url` (string) — Organization Website - `primary_address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `nickname` (string) — Human entered name for license - `license_designation_name` (string) — License Designation Name [changes by state] - `license_type_name` (string) — License Type Name [changes by state] - `samples` (array of objects) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `initial_weight` (number) — Sample weight at order verification - `initial_weight_unit` (number) — Unit type for Initial Weight - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation - `cover_image` (object) - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `images` (array of objects) — Will also contain cover image - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `notes` (string) — Notes about the sample - `batch_size` (number) — Size of the client's batch from which the sample tested by the lab came - `batch_size_unit` (string) — Unit type for batch size (units, lb, or g) - `lot_id` (string) — Unique ID from the client's inventory management system of the client's lot from which the sample tested by the lab came - `lot_size` (number) — Size of the client's lot from which the sample tested by the lab came - `lot_size_unit` (string) — Unit type for lot size (units, lb, or g) - `production_run_id` (string) — Unique ID from the client's inventory management system of the client's production run from which the sample tested by the lab came - `production_run_size` (number) — Size of the client's production run from which the sample tested by the lab came - `production_run_size_unit` (string) — Unit type for production run size (units, lb, or g) - `manifest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample manifest from which the sample tested by the lab came - `regulator_lot_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's lot from which the sample tested by the lab came - `regulator_sample_id2` (string) — (for Leaf) Pre-Transfer Batch ID - `regulator_batch_id2` (string) — (for Leaf) Pre-Transfer Inventory/Lot ID - `production_date` (timestamp) — Harvest/Production Date [when sample was produced] - `date_samples_collected` (timestamp) — Collection Date [when sample was collected] - `public_url` (string) — Unique URL for viewing this sample or CoA without requiring a login. Should be added to CoAs and used for QR codes or other barcode images so end consumers can verify the integrity of the data - `units_per_serving` (number) — Serving Size - `servings_per_container` (number) — Number of Servings in one Container - `unit_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Bottle) - `container_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Gummy) - `regulatory_category_id` (integer) — Unique ID for sample's regulatory category - `solvents_used` (string) — Information about the solvents used in testing - `has_coa` (boolean) — True if sample has a Certificate of Analysis - `coa` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `coa_additions` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `order_lims_id` (string) — Orders lims ID - `lims_id` (string) — Sample lims ID - `weight_on_hand` (number) — Current weight on hand - `weight_on_hand_unit` (string) — Unit type for weight measurements (units, g, or ml) - `has_lab_data` (boolean) — True if sample has test results - `has_lab_data_draft` (boolean) — True if sample has draft test results - `has_coa_draft` (boolean) — True if sample has a draft Certificate of Analysis - `coa_draft` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `custom_field` (string) — Custom Field - `external_data` (any) — Custom External Json Data - `extra_field_1` (string) — Custom data field - `extra_field_2` (string) — Custom data field - `extra_field_3` (string) — Custom data field - `extra_field_4` (string) — Custom data field - `extra_field_5` (string) — Custom data field - `extra_field_6` (string) — Custom data field - `extra_field_7` (string) — Custom data field - `extra_field_8` (string) — Custom data field - `extra_field_9` (string) — Custom data field - `extra_field_10` (string) — Custom data field - `extra_date_field_1` (timestamp) — Custom data field for dates - `extra_date_field_2` (timestamp) — Custom data field for dates - `extra_date_field_3` (timestamp) — Custom data field for dates - `extra_date_field_4` (timestamp) — Custom data field for dates - `extra_date_field_5` (timestamp) — Custom data field for dates - `extra_bool_field_1` (boolean) — Custom data field for yes/no fields - `extra_bool_field_2` (boolean) — Custom data field for yes/no fields - `extra_bool_field_3` (boolean) — Custom data field for yes/no fields - `extra_bool_field_4` (boolean) — Custom data field for yes/no fields - `extra_bool_field_5` (boolean) — Custom data field for yes/no fields - `test_package_total_price` (number) — Total price of test packages with custom client pricing and discounts included - `due_date` (timestamp) — Due date - `has_rushed_test_types` (boolean) — True if sample has rushed test types - `rushed_test_types` (array of strings) — List of rushed test type abbreviations - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `files` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `comments` (string) — Comments entered when placing the order - `rejected_message` (string) — Message saved when rejecting the order - `verified_message` (string) — Message saved when verifying the order - `completed_message` (string) — Message saved when completing the order - `discount` (number) — Percent discount applied to order - `lab_adjustment` (number) — Flat discount applied to end of order (pre-tax) - `sales_tax_rate` (number) — Sales tax rate applied to order - `sales_tax_cents` (integer) — Sales tax applied to order (in cents) - `subtotal_cents` (integer) — Pre-tax cost for order (in cents) - `total_price_cents` (integer) — Final invoice cost for order (in cents) - `pickup` (boolean) — Whether this is a pickup or dropoff - `secondary_client_type` (integer) — Secondary client type ID - `secondary_client_name` (string) — Secondary client name - `secondary_client_address` (string) — Secondary client address - `secondary_client_license` (string) — Secondary client license Example: ```json { "success": true, "order": { "id": "2503GLL0042", "industry_id": 1, "industry_name": "Cannabis", "lims_id": "PO-8841", "client_id": 318, "status_id": 2, "status_name": "Placed", "lab_license_number": "C8-0000123-LIC", "client_license_number": "CDPH-10003456", "ordered_date": "2025-03-14T09:12:44", "verified_date": null, "completed_date": null, "last_modified": "2025-03-14T09:12:44", "address": { "id": 771, "address_line_1": "1400 Industrial Way", "address_line_2": "Suite 4", "city": "Sacramento", "state_abbreviation": "CA", "zipcode": "95811" }, "client": { "id": 318, "name": "Sunrise Cultivation", "training": false, "last_modified": "2025-02-27T18:04:03", "email": "orders@sunrisecultivation.com", "phone": "9165550142", "url": "https://sunrisecultivation.com", "primary_address": { "id": 902, "address_line_1": "55 Orchard Road", "address_line_2": null, "city": "Woodland", "state_abbreviation": "CA", "zipcode": "95695" }, "licenses": [ { "id": 4410, "license_number": "CDPH-10003456", "license_code": null, "nickname": "Woodland cultivation", "license_designation_name": "Adult Use", "license_type_name": "Cultivation - Small Indoor" } ] }, "samples": [ { "id": "2503GLL0042.0001", "order_id": "2503GLL0042", "client_id": 318, "lab": { "id": 12, "name": "Green Leaf Labs" }, "order_status_id": 2, "order_status_name": "Placed", "sample_name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower, Cured", "sample_classification_id": 4, "sample_classification_name": "Hybrid", "production_method_id": 1, "production_method_name": "Indoor", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987", "batch_id": "BD-2503-01", "harvest_id": "HARVEST-2503-BD", "test_packages": [ { "id": 4, "name": "California Compliance - Flower", "price": 275.0, "minimum_quantity": 5.0 } ], "last_modified": "2025-03-14T09:12:44", "date_published": null, "order_lims_id": "PO-8841", "lims_id": "LIMS-8841-1", "notes": "Collected from the north drying room.", "batch_size": 4500.0, "batch_size_unit": "g", "production_date": "2025-02-18", "date_samples_collected": "2025-03-13", "public_url": "https://confidentcannabis.com/s/2503GLL0042.0001", "weight_on_hand": 12.5, "weight_on_hand_unit": "g", "has_lab_data": false, "has_coa": false, "coa": null, "coa_additions": [] } ], "logs": [ { "user_name": "Dana Reyes", "user_id": 5501, "log_time": "2025-03-14T09:12:44", "message": "Order placed" } ], "files": [], "comments": "Please prioritise potency.", "rejected_message": null, "verified_message": null, "completed_message": null, "discount": 0.0, "lab_adjustment": -25.0, "sales_tax_rate": 0.0, "sales_tax_cents": 0, "subtotal_cents": 27500, "total_price_cents": 25000, "pickup": false, "secondary_client_type": 1, "secondary_client_name": "Valley Distribution", "secondary_client_address": "2100 Harbor Blvd, Oakland, CA 94607", "secondary_client_license": "C11-0000456-LIC" } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/order/{order_id}/samples' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' \ --data-urlencode 'sample={ "name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "type_id": 1, "production_method_id": 1, "classification_id": 4, "test_package_ids": [ 4 ], "notes": "Collected from the north drying room.", "lims_id": "LIMS-8841-1", "production_date": "2025-02-18", "date_samples_collected": "2025-03-13", "batch_id": "BD-2503-01", "batch_size": 4500.0, "batch_size_unit": "g", "harvest_id": "HARVEST-2503-BD", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987", "send_client_email": true }' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}/samples' data = { "sample": "{\n \"name\": \"Blue Dream - Cured Flower\",\n \"strain_name\": \"Blue Dream\",\n \"type_id\": 1,\n \"production_method_id\": 1,\n \"classification_id\": 4,\n \"test_package_ids\": [\n 4\n ],\n \"notes\": \"Collected from the north drying room.\",\n \"lims_id\": \"LIMS-8841-1\",\n \"production_date\": \"2025-02-18\",\n \"date_samples_collected\": \"2025-03-13\",\n \"batch_id\": \"BD-2503-01\",\n \"batch_size\": 4500.0,\n \"batch_size_unit\": \"g\",\n \"harvest_id\": \"HARVEST-2503-BD\",\n \"regulator_sample_id\": \"1A4060300003B01000001234\",\n \"regulator_batch_id\": \"1A4060300003B01000000987\",\n \"send_client_email\": true\n}", } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}/samples"; const data = { "sample": "{\n \"name\": \"Blue Dream - Cured Flower\",\n \"strain_name\": \"Blue Dream\",\n \"type_id\": 1,\n \"production_method_id\": 1,\n \"classification_id\": 4,\n \"test_package_ids\": [\n 4\n ],\n \"notes\": \"Collected from the north drying room.\",\n \"lims_id\": \"LIMS-8841-1\",\n \"production_date\": \"2025-02-18\",\n \"date_samples_collected\": \"2025-03-13\",\n \"batch_id\": \"BD-2503-01\",\n \"batch_size\": 4500.0,\n \"batch_size_unit\": \"g\",\n \"harvest_id\": \"HARVEST-2503-BD\",\n \"regulator_sample_id\": \"1A4060300003B01000001234\",\n \"regulator_batch_id\": \"1A4060300003B01000000987\",\n \"send_client_email\": true\n}", }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/add-sample-to-order OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Cancel an order `POST /v0/labs/order/{order_id}/status/cancel` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Cancel an order. The order must not already be canceled; canceling an order that is already canceled fails with `invalid_order_status`. ## Path parameters - `order_id` (string, required) ## Body parameters (application/x-www-form-urlencoded) - `message` (string, optional) — Optional message recorded against the order and shown to the client. Example: `Duplicate order — replaced by 2503GLL0043.` - `send_client_email` (boolean, optional, default `True`) — If true the client receives an email about the order being canceled. Defaults to true. Example: `True` ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/order/{order_id}/status/cancel' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}/status/cancel' data = { # optional form fields go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}/status/cancel"; const data = { // optional form fields go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/cancel-order OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Complete an order `POST /v0/labs/order/{order_id}/status/complete` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Complete an order, moving it from 'in progress' to 'completed'. The order must currently be in the 'in progress' status; any other status fails with `invalid_order_status`. ## Path parameters - `order_id` (string, required) ## Body parameters (application/x-www-form-urlencoded) - `message` (string, optional) — Optional message recorded against the order and shown to the client. Example: `All results published.` - `send_client_email` (boolean, optional, default `True`) — If true the client receives an email about the order being completed. Defaults to true. Example: `True` ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/order/{order_id}/status/complete' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}/status/complete' data = { # optional form fields go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}/status/complete"; const data = { // optional form fields go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/complete-order OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Revise an order `POST /v0/labs/order/{order_id}/status/revise` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Revise an order, moving it from 'completed' back to 'in progress'. The order must currently be in the 'completed' status; any other status fails with `invalid_order_status`. ## Path parameters - `order_id` (string, required) ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/order/{order_id}/status/revise' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}/status/revise' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}/status/revise"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/revise-order OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Un-cancel an order `POST /v0/labs/order/{order_id}/status/uncancel` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Un-cancel an order, moving it from 'canceled' back to 'placed'. The order must currently be in the 'canceled' status; any other status fails with `invalid_order_status`. ## Path parameters - `order_id` (string, required) ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/order/{order_id}/status/uncancel' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}/status/uncancel' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}/status/uncancel"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/uncancel-order OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Unverify an order `POST /v0/labs/order/{order_id}/status/unverify` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Unverify an order, moving it from 'in progress' back to 'placed'. The order must currently be in the 'in progress' status; any other status fails with `invalid_order_status`. ## Path parameters - `order_id` (string, required) ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/order/{order_id}/status/unverify' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}/status/unverify' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}/status/unverify"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/unverify-order OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Verify an order `POST /v0/labs/order/{order_id}/status/verify` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Verify an order, moving it from 'placed' to 'in progress'. The order must currently be in the 'placed' status; any other status fails with `invalid_order_status`. ## Path parameters - `order_id` (string, required) ## Body parameters (application/x-www-form-urlencoded) - `message` (string, optional) — Optional message recorded against the order and shown to the client. Example: `Samples received in good condition.` - `send_client_email` (boolean, optional, default `True`) — If true the client receives an email about the order being verified. Defaults to true. Example: `True` ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/order/{order_id}/status/verify' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/order/{order_id}/status/verify' data = { # optional form fields go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/order/{order_id}/status/verify"; const data = { // optional form fields go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/verify-order OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List orders `GET /v0/labs/orders` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every order belonging to your lab, most recently placed first. Use `start` and `limit` to page through the results — a maximum of 100 orders are returned at a time. When more orders are available beyond the current page, `more_results` is `true`. The list can also be narrowed to a single order status, a single client, or to orders changed since a given time. ## Query parameters - `start` (integer, optional, default `0`) — Zero-based index of the first order to return. - `limit` (integer, optional, default `100`) — Maximum number of orders to return. Capped at 100. - `status_id` (integer, optional) — Only return orders currently in this order status. - `modified_since_time` (string, optional) — Only return orders modified after this time, e.g. `2025-03-14T09:12:44`. - `client_id` (integer, optional) — Only return orders placed by this client. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `orders` (array of objects) - `id` (string) — Order ID - `industry_id` (integer) — Industry ID - `industry_name` (string) — Industry Name - `lims_id` (string) — Order lims ID - `client_id` (integer) — Client ID - `status_id` (integer) — Status ID - `status_name` (string) — Status Name - `lab_license_number` (string) — Lab license number under which order was tested - `client_license_number` (string) — Client license number under which order was placed - `ordered_date` (timestamp) — Order Date [when order was placed] - `verified_date` (timestamp) — Verified Date [when order was verified] - `completed_date` (timestamp) — Completed Date [when order was completed] - `last_modified` (timestamp) — Time this order was last modified - `more_results` (boolean) — True when more orders are available beyond this page. Example: ```json { "success": true, "orders": [ { "id": "2503GLL0042", "industry_id": 1, "industry_name": "Cannabis", "lims_id": "PO-8841", "client_id": 318, "status_id": 2, "status_name": "Placed", "lab_license_number": "C8-0000123-LIC", "client_license_number": "CDPH-10003456", "ordered_date": "2025-03-14T09:12:44", "verified_date": null, "completed_date": null, "last_modified": "2025-03-14T09:12:44" }, { "id": "2503GLL0041", "industry_id": 1, "industry_name": "Cannabis", "lims_id": "PO-8840", "client_id": 318, "status_id": 4, "status_name": "Completed", "lab_license_number": "C8-0000123-LIC", "client_license_number": "CDPH-10003456", "ordered_date": "2025-03-11T11:38:02", "verified_date": "2025-03-11T16:20:55", "completed_date": "2025-03-13T14:05:31", "last_modified": "2025-03-13T14:05:31" } ], "more_results": false } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/labs/orders' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/orders' params = { # optional query params go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, params, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, params=params, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/orders"; const params = { // optional query params go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, params, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch(`https://api.confidentcannabis.com${path}?${new URLSearchParams(params)}`, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/get-orders OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Get sample details `GET /v0/labs/sample/{sample_id}` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return the full record for a single sample, including its published test results and, when one exists, its draft results. `sample_id` accepts the lab's own sample ID, the sample's public key, or the regulator sample ID the sample was created with. A sample that belongs to another lab returns 404 rather than 403, so that order numbers cannot be probed. Looking a sample up by public key returns the same record without the `lab_data` and `lab_data_draft` blocks. ## Path parameters - `sample_id` (string, required) ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `sample` (object) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `initial_weight` (number) — Sample weight at order verification - `initial_weight_unit` (number) — Unit type for Initial Weight - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation - `cover_image` (object) - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `images` (array of objects) — Will also contain cover image - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `notes` (string) — Notes about the sample - `batch_size` (number) — Size of the client's batch from which the sample tested by the lab came - `batch_size_unit` (string) — Unit type for batch size (units, lb, or g) - `lot_id` (string) — Unique ID from the client's inventory management system of the client's lot from which the sample tested by the lab came - `lot_size` (number) — Size of the client's lot from which the sample tested by the lab came - `lot_size_unit` (string) — Unit type for lot size (units, lb, or g) - `production_run_id` (string) — Unique ID from the client's inventory management system of the client's production run from which the sample tested by the lab came - `production_run_size` (number) — Size of the client's production run from which the sample tested by the lab came - `production_run_size_unit` (string) — Unit type for production run size (units, lb, or g) - `manifest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample manifest from which the sample tested by the lab came - `regulator_lot_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's lot from which the sample tested by the lab came - `regulator_sample_id2` (string) — (for Leaf) Pre-Transfer Batch ID - `regulator_batch_id2` (string) — (for Leaf) Pre-Transfer Inventory/Lot ID - `production_date` (timestamp) — Harvest/Production Date [when sample was produced] - `date_samples_collected` (timestamp) — Collection Date [when sample was collected] - `public_url` (string) — Unique URL for viewing this sample or CoA without requiring a login. Should be added to CoAs and used for QR codes or other barcode images so end consumers can verify the integrity of the data - `units_per_serving` (number) — Serving Size - `servings_per_container` (number) — Number of Servings in one Container - `unit_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Bottle) - `container_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Gummy) - `regulatory_category_id` (integer) — Unique ID for sample's regulatory category - `solvents_used` (string) — Information about the solvents used in testing - `has_coa` (boolean) — True if sample has a Certificate of Analysis - `coa` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `coa_additions` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `order_lims_id` (string) — Orders lims ID - `lims_id` (string) — Sample lims ID - `weight_on_hand` (number) — Current weight on hand - `weight_on_hand_unit` (string) — Unit type for weight measurements (units, g, or ml) - `has_lab_data` (boolean) — True if sample has test results - `has_lab_data_draft` (boolean) — True if sample has draft test results - `has_coa_draft` (boolean) — True if sample has a draft Certificate of Analysis - `coa_draft` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `custom_field` (string) — Custom Field - `external_data` (any) — Custom External Json Data - `extra_field_1` (string) — Custom data field - `extra_field_2` (string) — Custom data field - `extra_field_3` (string) — Custom data field - `extra_field_4` (string) — Custom data field - `extra_field_5` (string) — Custom data field - `extra_field_6` (string) — Custom data field - `extra_field_7` (string) — Custom data field - `extra_field_8` (string) — Custom data field - `extra_field_9` (string) — Custom data field - `extra_field_10` (string) — Custom data field - `extra_date_field_1` (timestamp) — Custom data field for dates - `extra_date_field_2` (timestamp) — Custom data field for dates - `extra_date_field_3` (timestamp) — Custom data field for dates - `extra_date_field_4` (timestamp) — Custom data field for dates - `extra_date_field_5` (timestamp) — Custom data field for dates - `extra_bool_field_1` (boolean) — Custom data field for yes/no fields - `extra_bool_field_2` (boolean) — Custom data field for yes/no fields - `extra_bool_field_3` (boolean) — Custom data field for yes/no fields - `extra_bool_field_4` (boolean) — Custom data field for yes/no fields - `extra_bool_field_5` (boolean) — Custom data field for yes/no fields - `test_package_total_price` (number) — Total price of test packages with custom client pricing and discounts included - `due_date` (timestamp) — Due date - `has_rushed_test_types` (boolean) — True if sample has rushed test types - `rushed_test_types` (array of strings) — List of rushed test type abbreviations - `lab_data` (object) - `date_created` (timestamp) — Timestamp of lab data creation time - `date_reported` (timestamp) — date laboratory data was uploaded to Confident and the Certificate of Analysis was created - `status` (integer) — 1=passed, 2=failed, 3=completed. Completed means there were no limits to pass or fail - `thc_total` (number) — Total Percentage THC in the sample - `thc_calculation` (string) — The calculation used for thc_total - `cbd_total` (number) — Total Percentage CBD in the sample - `cbd_calculation` (string) — The calculation used for cbd_total - `cannabinoid_total` (number) — Total Percentage cannabinoids in the sample - `cannabinoid_calculation` (string) — The calculation used for cannabinoid_total - `terpene_total` (number) — Total Percentage terpenes in the sample - `terpene_calculation` (string) — The calculation used for terpene_total - `categories` (object) — test categories - `cannabinoids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `method` (string) — testing method - eg, GC-FID, HPLC, etc - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `container_description` (string) — Description of container (eg. bottle, box, tin) - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `unit_description` (string) — definition of one unit when any unit fields are 'mg/unit' - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `metrc_co_d9_thc_status` (integer) — pass or fail integer ID from the status enum - `metrc_me_total_thc_mg_package_status` (integer) — pass or fail integer ID from the status enum - `metrc_me_total_thc_mg_serving_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_potency_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_potency_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_potency_value` (number) — optional value for the 'Potency' field in Metrc - `metrc_mi_total_cbd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_total_thc_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_total_thc_status` (integer) — DEPRECATED - `metrc_mi_total_thc_value` (number) — DEPRECATED - `metrc_mn_other_adc_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_other_adc_status` (any) — pass or fail integer ID from the status enum - `metrc_mn_other_adc_value` (any) — value for the 'Other ADC (mg/g) Full Panel ' field in Metrc. value should be in mg/serving - `metrc_mn_thc_purity_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_thc_purity_status` (any) — pass or fail integer ID from the status enum - `metrc_mn_thc_purity_value` (any) — value for the 'THC Purity (% or mg/g)' field in Metrc - `metrc_mn_total_cannabinoids_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_total_cannabinoids_status` (any) — pass or fail integer ID from the status enum - `metrc_mn_total_cbd_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_total_cbd_status` (any) — pass or fail integer ID from the status enum - `metrc_mn_total_thc_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_total_thc_status` (any) — pass or fail integer ID from the status enum - `metrc_mt_total_cbd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mt_total_cbd_status` (integer) — pass or fail integer ID from the status enum - `metrc_mt_total_thc_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mt_total_thc_status` (integer) — pass or fail integer ID from the status enum - `metrc_oh_total_cbd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_oh_total_cbd_status` (integer) — pass or fail integer ID from the status enum - `metrc_oh_total_thc_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_oh_total_thc_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_cbd_pct_rsd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_cbd_pct_rsd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_cbd_pct_rsd_value` (number) — Percent Relative Standard Deviation value for state traceability system - `metrc_or_cbd_rpd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_cbd_rpd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_cbd_rpd_value` (number) — Relative Percent Difference value for state traceability system - `metrc_or_d8_thc_pct_rsd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_d8_thc_pct_rsd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_d8_thc_pct_rsd_value` (number) — Percent Relative Standard Deviation value for state traceability system - `metrc_or_d8_thc_rpd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_d8_thc_rpd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_d8_thc_rpd_value` (number) — Relative Percent Difference value for state traceability system - `metrc_or_potency_control_study_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_potency_control_study_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_potency_process_validation_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_potency_process_validation_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_potency_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_potency_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_thc_pct_rsd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_thc_pct_rsd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_thc_pct_rsd_value` (number) — Percent Relative Standard Deviation value for state traceability system - `metrc_or_thc_rpd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_thc_rpd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_thc_rpd_value` (number) — Relative Percent Difference value for state traceability system - `metrc_or_total_cbd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_total_thc_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_total_thc_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `terpenes` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `volume` (string) — volume of the aliquot in the solution - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `container_description` (string) — Description of container (eg. bottle, box, tin) - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `unit_description` (string) — definition of one unit when any unit fields are 'mg/unit' - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `moisture` (object) — moisture generally only has 'percent_moisture' in the compound list - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `digits` (integer) — [1] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `pesticides` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', 'ppb') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `digits` (integer) — [3] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `volume` (string) — volume of the aliquot in the solution - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `metrc_co_other_pesticide_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_other_pesticide_status` (integer) — pass or fail integer ID from the status enum - `metrc_co_other_pesticide_value` (number) — the sum of all pesticide detections in ppm excluding Abamectin, Azoxystrobin, Bifenazate, Etoxazole, Imazalil, Imidacloprid, Malathion, Myclobutanil, Permethrin, Spinosad, Spiromesifen, Spirotetramat, and Tebuconazole - `metrc_co_pesticide_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_pesticide_status` (integer) — pass or fail integer ID from the status enum - `metrc_co_pesticide_value` (number) — the total sum of all pesticides detected in ppm - `metrc_mi_pesticides_chemical_residue_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_pesticides_chemical_residue_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_pesticides_chemical_residue_value` (number) — optional value for the 'Chemical Residue' field in Metrc - `metrc_or_limited_batch_pesticide_testing_regulatornotes` (string) — DEPRECATED: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_control_study_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_control_study_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_pesticides_process_validation_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_process_validation_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_pesticides_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `solvents` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', '%', 'ppb') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `digits` (integer) — [3] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `metrc_co_solvents_other_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_solvents_other_status` (integer) — pass or fail integer ID from the status enum - `metrc_co_solvents_other_value` (number) — the sum of all residual solvent detections in ppm excluding Benzene, Butanes, Heptanes, Hexane, Toluene, and Total Xylenes - `metrc_co_solvents_remediated_bool` (integer) — boolean true/false flag (0=false/1=true) to denote if the sample is from a batch made from remediated product - `metrc_co_solvents_residual_regulatornotes` (string) — DEPRECATED: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_solvents_residual_status` (integer) — DEPRECATED: pass or fail integer ID from the status enum - `metrc_mi_solvents_residual_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_solvents_residual_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_solvents_residual_value` (number) — optional value for the 'Residual Solvents' field in Metrc - `metrc_or_solvents_control_study_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_control_study_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_solvents_pct_rsd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_pct_rsd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_solvents_pct_rsd_value` (number) — value for the 'Solvents (RPD)' field in Metrc - `metrc_or_solvents_process_validation_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_process_validation_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_solvents_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_rpd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_rpd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_solvents_rpd_value` (number) — Relative Percent Difference value for state traceability system - `metrc_or_solvents_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `microbials` (object) — microbial results aren't converted from their input values - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['cfu/g'] units the data is being submitted in, from the category's allowed units ('cfu/g', 'cfu/ml', 'mpn/g', 'cq', 'cfu/m^3', 'cfu/plate', 'cfu') - `report_units` (string) — ['cfu/g'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `metrc_co_microbials_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_microbials_status` (integer) — pass or fail integer ID from the status enum - `metrc_co_microbials_value` (number) — optional value for the 'Microbials' field in Metrc - `metrc_mi_microbials_infused_bool` (integer) — boolean true/false flag (0=false/1=true) to denote if the sample is an infused product - `metrc_mi_microbials_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_microbials_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_microbials_value` (number) — optional value for the 'Microbials' field in Metrc - `metrc_nv_microbials_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_nv_microbials_status` (integer) — pass or fail integer ID from the status enum - `metrc_nv_microbials_value` (number) — value for the 'Microbials' field in Metrc - `metrc_or_microbials_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_microbials_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_microbiological_process_validation_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_microbiological_process_validation_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is the same as input_units - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is the same as input_units - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is the same as input_units - `lod` (number) — limit of detection. unit is the same as input_units - `loq` (number) — limit of quantitation. unit is the same as input_units - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `mycotoxins` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppb'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', 'ppb') - `report_units` (string) — ['ppb'] the primary units displayed on the certificate of analysis - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `metrc_mi_mycotoxins_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_mycotoxins_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_mycotoxins_value` (number) — optional value for the 'Mycotoxins' field in Metrc - `metrc_or_mycotoxins_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_mycotoxins_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to 'ppb' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppb' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppb' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppb' - `lod` (number) — limit of detection. unit is 'ppb' - `loq` (number) — limit of quantitation. unit is 'ppb' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `water_activity` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['aw'] units the data is being submitted in, from the category's allowed units ('aw') - `report_units` (string) — ['aw'] the primary units displayed on the certificate of analysis - `digits` (integer) — [5] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'aw' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'aw' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'aw' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'aw' - `lod` (number) — limit of detection. unit is 'aw' - `loq` (number) — limit of quantitation. unit is 'aw' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `foreign_matter` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('%', 'mg/lb') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `metrc_mi_foreign_organic_matter_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_foreign_organic_matter_value` (number) — value for the 'Foreign organic matter' field in Metrc. - `metrc_nv_visual_inspection_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `homogeneity` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/unit', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metals` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppb'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', 'ppb') - `report_units` (string) — ['ppb'] the primary units displayed on the certificate of analysis - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `metrc_mi_metals_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_metals_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_metals_value` (number) — optional value for the 'Metals' field in Metrc - `metrc_or_metals_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_metals_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to 'ppb' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppb' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppb' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppb' - `lod` (number) — limit of detection. unit is 'ppb' - `loq` (number) — limit of quantitation. unit is 'ppb' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `general` (object) - `info_fields` (object) - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `metrc_co_contaminants_regulatornotes` (string) — DEPRECATED: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_contaminants_status` (integer) — DEPRECATED: pass or fail integer ID from the status enum - `metrc_nv_subcontract_testing_value` (number) — DEPRECATED - `metrc_ok_retest_all_value` (number) — value for the 'Retest (All)' field in Metrc - `metrc_ok_subcontract_all_value` (number) — DEPRECATED - `metrc_or_r_and_d_test_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_subcontracted_test_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_tic_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `compounds` (array of objects) - `name` (string) — compound_key for what is being tested - `value` (number) - `alkaloids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `anabolic_steroids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `ph` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ph'] units the data is being submitted in, from the category's allowed units ('ph') - `report_units` (string) — ['ph'] the primary units displayed on the certificate of analysis - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'ph' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ph' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ph' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ph' - `lod` (number) — limit of detection. unit is 'ph' - `loq` (number) — limit of quantitation. unit is 'ph' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `shelflife` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['days'] units the data is being submitted in, from the category's allowed units ('days') - `report_units` (string) — ['days'] the primary units displayed on the certificate of analysis - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'days' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'days' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'days' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'days' - `lod` (number) — limit of detection. unit is 'days' - `loq` (number) — limit of quantitation. unit is 'days' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `endotoxins` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['eu/ml'] units the data is being submitted in, from the category's allowed units ('eu/ml', 'eu/mg', 'eu/g') - `report_units` (string) — ['eu/ml'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'eu/ml' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'eu/ml' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'eu/ml' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'eu/ml' - `lod` (number) — limit of detection. unit is 'eu/ml' - `loq` (number) — limit of quantitation. unit is 'eu/ml' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `miscellaneous` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `peptides` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'iu', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `flavonoids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `nutrients` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `dna` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `lab_data_draft` (object) — Null unless applicable to this record. - `date_created` (timestamp) — Timestamp of lab data creation time - `date_reported` (timestamp) — date laboratory data was uploaded to Confident and the Certificate of Analysis was created - `status` (integer) — 1=passed, 2=failed, 3=completed. Completed means there were no limits to pass or fail - `thc_total` (number) — Total Percentage THC in the sample - `thc_calculation` (string) — The calculation used for thc_total - `cbd_total` (number) — Total Percentage CBD in the sample - `cbd_calculation` (string) — The calculation used for cbd_total - `cannabinoid_total` (number) — Total Percentage cannabinoids in the sample - `cannabinoid_calculation` (string) — The calculation used for cannabinoid_total - `terpene_total` (number) — Total Percentage terpenes in the sample - `terpene_calculation` (string) — The calculation used for terpene_total - `categories` (object) — test categories - `cannabinoids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `method` (string) — testing method - eg, GC-FID, HPLC, etc - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `container_description` (string) — Description of container (eg. bottle, box, tin) - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `unit_description` (string) — definition of one unit when any unit fields are 'mg/unit' - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `metrc_co_d9_thc_status` (integer) — pass or fail integer ID from the status enum - `metrc_me_total_thc_mg_package_status` (integer) — pass or fail integer ID from the status enum - `metrc_me_total_thc_mg_serving_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_potency_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_potency_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_potency_value` (number) — optional value for the 'Potency' field in Metrc - `metrc_mi_total_cbd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_total_thc_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_total_thc_status` (integer) — DEPRECATED - `metrc_mi_total_thc_value` (number) — DEPRECATED - `metrc_mn_other_adc_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_other_adc_status` (any) — pass or fail integer ID from the status enum - `metrc_mn_other_adc_value` (any) — value for the 'Other ADC (mg/g) Full Panel ' field in Metrc. value should be in mg/serving - `metrc_mn_thc_purity_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_thc_purity_status` (any) — pass or fail integer ID from the status enum - `metrc_mn_thc_purity_value` (any) — value for the 'THC Purity (% or mg/g)' field in Metrc - `metrc_mn_total_cannabinoids_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_total_cannabinoids_status` (any) — pass or fail integer ID from the status enum - `metrc_mn_total_cbd_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_total_cbd_status` (any) — pass or fail integer ID from the status enum - `metrc_mn_total_thc_regulatornotes` (any) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_total_thc_status` (any) — pass or fail integer ID from the status enum - `metrc_mt_total_cbd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mt_total_cbd_status` (integer) — pass or fail integer ID from the status enum - `metrc_mt_total_thc_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mt_total_thc_status` (integer) — pass or fail integer ID from the status enum - `metrc_oh_total_cbd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_oh_total_cbd_status` (integer) — pass or fail integer ID from the status enum - `metrc_oh_total_thc_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_oh_total_thc_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_cbd_pct_rsd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_cbd_pct_rsd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_cbd_pct_rsd_value` (number) — Percent Relative Standard Deviation value for state traceability system - `metrc_or_cbd_rpd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_cbd_rpd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_cbd_rpd_value` (number) — Relative Percent Difference value for state traceability system - `metrc_or_d8_thc_pct_rsd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_d8_thc_pct_rsd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_d8_thc_pct_rsd_value` (number) — Percent Relative Standard Deviation value for state traceability system - `metrc_or_d8_thc_rpd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_d8_thc_rpd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_d8_thc_rpd_value` (number) — Relative Percent Difference value for state traceability system - `metrc_or_potency_control_study_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_potency_control_study_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_potency_process_validation_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_potency_process_validation_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_potency_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_potency_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_thc_pct_rsd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_thc_pct_rsd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_thc_pct_rsd_value` (number) — Percent Relative Standard Deviation value for state traceability system - `metrc_or_thc_rpd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_thc_rpd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_thc_rpd_value` (number) — Relative Percent Difference value for state traceability system - `metrc_or_total_cbd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_total_thc_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_total_thc_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `terpenes` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `volume` (string) — volume of the aliquot in the solution - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `container_description` (string) — Description of container (eg. bottle, box, tin) - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `unit_description` (string) — definition of one unit when any unit fields are 'mg/unit' - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `moisture` (object) — moisture generally only has 'percent_moisture' in the compound list - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `digits` (integer) — [1] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `pesticides` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', 'ppb') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `digits` (integer) — [3] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `volume` (string) — volume of the aliquot in the solution - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `metrc_co_other_pesticide_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_other_pesticide_status` (integer) — pass or fail integer ID from the status enum - `metrc_co_other_pesticide_value` (number) — the sum of all pesticide detections in ppm excluding Abamectin, Azoxystrobin, Bifenazate, Etoxazole, Imazalil, Imidacloprid, Malathion, Myclobutanil, Permethrin, Spinosad, Spiromesifen, Spirotetramat, and Tebuconazole - `metrc_co_pesticide_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_pesticide_status` (integer) — pass or fail integer ID from the status enum - `metrc_co_pesticide_value` (number) — the total sum of all pesticides detected in ppm - `metrc_mi_pesticides_chemical_residue_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_pesticides_chemical_residue_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_pesticides_chemical_residue_value` (number) — optional value for the 'Chemical Residue' field in Metrc - `metrc_or_limited_batch_pesticide_testing_regulatornotes` (string) — DEPRECATED: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_control_study_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_control_study_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_pesticides_process_validation_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_process_validation_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_pesticides_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `solvents` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', '%', 'ppb') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `digits` (integer) — [3] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `metrc_co_solvents_other_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_solvents_other_status` (integer) — pass or fail integer ID from the status enum - `metrc_co_solvents_other_value` (number) — the sum of all residual solvent detections in ppm excluding Benzene, Butanes, Heptanes, Hexane, Toluene, and Total Xylenes - `metrc_co_solvents_remediated_bool` (integer) — boolean true/false flag (0=false/1=true) to denote if the sample is from a batch made from remediated product - `metrc_co_solvents_residual_regulatornotes` (string) — DEPRECATED: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_solvents_residual_status` (integer) — DEPRECATED: pass or fail integer ID from the status enum - `metrc_mi_solvents_residual_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_solvents_residual_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_solvents_residual_value` (number) — optional value for the 'Residual Solvents' field in Metrc - `metrc_or_solvents_control_study_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_control_study_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_solvents_pct_rsd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_pct_rsd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_solvents_pct_rsd_value` (number) — value for the 'Solvents (RPD)' field in Metrc - `metrc_or_solvents_process_validation_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_process_validation_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_solvents_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_rpd_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_rpd_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_solvents_rpd_value` (number) — Relative Percent Difference value for state traceability system - `metrc_or_solvents_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `microbials` (object) — microbial results aren't converted from their input values - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['cfu/g'] units the data is being submitted in, from the category's allowed units ('cfu/g', 'cfu/ml', 'mpn/g', 'cq', 'cfu/m^3', 'cfu/plate', 'cfu') - `report_units` (string) — ['cfu/g'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `metrc_co_microbials_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_microbials_status` (integer) — pass or fail integer ID from the status enum - `metrc_co_microbials_value` (number) — optional value for the 'Microbials' field in Metrc - `metrc_mi_microbials_infused_bool` (integer) — boolean true/false flag (0=false/1=true) to denote if the sample is an infused product - `metrc_mi_microbials_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_microbials_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_microbials_value` (number) — optional value for the 'Microbials' field in Metrc - `metrc_nv_microbials_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_nv_microbials_status` (integer) — pass or fail integer ID from the status enum - `metrc_nv_microbials_value` (number) — value for the 'Microbials' field in Metrc - `metrc_or_microbials_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_microbials_status` (integer) — pass or fail integer ID from the status enum - `metrc_or_microbiological_process_validation_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_microbiological_process_validation_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is the same as input_units - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is the same as input_units - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is the same as input_units - `lod` (number) — limit of detection. unit is the same as input_units - `loq` (number) — limit of quantitation. unit is the same as input_units - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `mycotoxins` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppb'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', 'ppb') - `report_units` (string) — ['ppb'] the primary units displayed on the certificate of analysis - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `metrc_mi_mycotoxins_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_mycotoxins_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_mycotoxins_value` (number) — optional value for the 'Mycotoxins' field in Metrc - `metrc_or_mycotoxins_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_mycotoxins_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to 'ppb' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppb' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppb' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppb' - `lod` (number) — limit of detection. unit is 'ppb' - `loq` (number) — limit of quantitation. unit is 'ppb' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `water_activity` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['aw'] units the data is being submitted in, from the category's allowed units ('aw') - `report_units` (string) — ['aw'] the primary units displayed on the certificate of analysis - `digits` (integer) — [5] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'aw' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'aw' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'aw' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'aw' - `lod` (number) — limit of detection. unit is 'aw' - `loq` (number) — limit of quantitation. unit is 'aw' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `foreign_matter` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('%', 'mg/lb') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `metrc_mi_foreign_organic_matter_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_foreign_organic_matter_value` (number) — value for the 'Foreign organic matter' field in Metrc. - `metrc_nv_visual_inspection_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `homogeneity` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/unit', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metals` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppb'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', 'ppb') - `report_units` (string) — ['ppb'] the primary units displayed on the certificate of analysis - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `metrc_mi_metals_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_metals_status` (integer) — pass or fail integer ID from the status enum - `metrc_mi_metals_value` (number) — optional value for the 'Metals' field in Metrc - `metrc_or_metals_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_metals_status` (integer) — pass or fail integer ID from the status enum - `compounds` (array of objects) — most values have been converted to 'ppb' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppb' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppb' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppb' - `lod` (number) — limit of detection. unit is 'ppb' - `loq` (number) — limit of quantitation. unit is 'ppb' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `general` (object) - `info_fields` (object) - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `metrc_co_contaminants_regulatornotes` (string) — DEPRECATED: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_contaminants_status` (integer) — DEPRECATED: pass or fail integer ID from the status enum - `metrc_nv_subcontract_testing_value` (number) — DEPRECATED - `metrc_ok_retest_all_value` (number) — value for the 'Retest (All)' field in Metrc - `metrc_ok_subcontract_all_value` (number) — DEPRECATED - `metrc_or_r_and_d_test_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_subcontracted_test_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_tic_regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `compounds` (array of objects) - `name` (string) — compound_key for what is being tested - `value` (number) - `alkaloids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `anabolic_steroids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `ph` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ph'] units the data is being submitted in, from the category's allowed units ('ph') - `report_units` (string) — ['ph'] the primary units displayed on the certificate of analysis - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'ph' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ph' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ph' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ph' - `lod` (number) — limit of detection. unit is 'ph' - `loq` (number) — limit of quantitation. unit is 'ph' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `shelflife` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['days'] units the data is being submitted in, from the category's allowed units ('days') - `report_units` (string) — ['days'] the primary units displayed on the certificate of analysis - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'days' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'days' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'days' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'days' - `lod` (number) — limit of detection. unit is 'days' - `loq` (number) — limit of quantitation. unit is 'days' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `endotoxins` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['eu/ml'] units the data is being submitted in, from the category's allowed units ('eu/ml', 'eu/mg', 'eu/g') - `report_units` (string) — ['eu/ml'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'eu/ml' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'eu/ml' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'eu/ml' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'eu/ml' - `lod` (number) — limit of detection. unit is 'eu/ml' - `loq` (number) — limit of quantitation. unit is 'eu/ml' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `miscellaneous` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `peptides` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'iu', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `flavonoids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `nutrients` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `analytical_batch_id` (string) — optional analytical batch ID for QC samples - `analytical_batch_id_2` (string) — optional second analytical batch ID for QC samples - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `dna` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `date_prepared` (timestamp) — date the sample was prepared for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `notes_5` (string) — optional testing notes for this assay - `notes_6` (string) — optional testing notes for this assay - `notes_7` (string) — optional testing notes for this assay - `notes_8` (string) — optional testing notes for this assay - `notes_9` (string) — optional testing notes for this assay - `notes_10` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `qc_blank_id` (string) — optional sample ID for QC Blank - `qc_blank_dup_id` (string) — optional sample ID for QC Blank duplicate - `qc_blank_trip_id` (string) — optional sample ID for QC Blank triplicate - `qc_spike_id` (string) — optional sample ID for QC Spike - `qc_spike_dup_id` (string) — optional sample ID for QC Spike duplicate - `qc_spike_trip_id` (string) — optional sample ID for QC Spike triplicate - `qc_lcs_id` (string) — optional sample ID for QC Lab Control Sample - `qc_lcs_dup_id` (string) — optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_trip_id` (string) — optional sample ID for QC Lab Control Sample triplicate - `qc_sample_id` (string) — optional sample ID for QC sample - `qc_sample_dup_id` (string) — optional sample ID for QC sample duplicate - `qc_sample_trip_id` (string) — optional sample ID for QC sample triplicate - `qc_control_study_id` (string) — optional sample ID for Control Study - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack Example: ```json { "success": true, "sample": { "id": "2601-0143-1", "order_id": "2601-0143", "client_id": 812, "lab": { "id": 44, "name": "Cascade Analytics" }, "order_status_id": 3, "order_status_name": "In Progress", "sample_name": "Blue Dream Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis & Hemp", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower - Cured", "sample_classification_id": 9, "sample_classification_name": "Sativa Dominant", "production_method_id": 3, "production_method_name": "Greenhouse", "regulator_sample_id": "1A4060300003B71000001234", "regulator_batch_id": "1A4060300003B71000001180", "batch_id": "BD-2026-08-A", "harvest_id": "HARVEST-2026-07-BD", "test_packages": [ { "id": 12, "name": "Compliance Panel", "price": 275.0, "minimum_quantity": 1 } ], "last_modified": "2026-08-14T17:22:05", "date_published": null, "order_lims_id": "ORD-2026-0143", "lims_id": "S-2026-0143-1", "initial_weight": 12.0, "initial_weight_unit": "g", "test_types": [ { "id": 1, "name": "Cannabinoids", "abbreviation": "CAN" }, { "id": 5, "name": "Required Pesticides", "abbreviation": "PES-R" } ], "cover_image": { "filename": "blue-dream-flower.jpg", "public_key": "0b0f2a4c-9d3a-4a1e-9c9a-2f5f6f4a1c77", "url": "https://files.confidentcannabis.com/blue-dream-flower.jpg" }, "images": [ { "filename": "blue-dream-flower.jpg", "public_key": "0b0f2a4c-9d3a-4a1e-9c9a-2f5f6f4a1c77", "url": "https://files.confidentcannabis.com/blue-dream-flower.jpg" } ], "notes": "Received in a sealed mylar bag.", "batch_size": 4500.0, "batch_size_unit": "g", "lot_id": "LOT-BD-118", "lot_size": 4500.0, "lot_size_unit": "g", "production_run_id": null, "production_run_size": null, "production_run_size_unit": null, "manifest_id": "0000012345", "regulator_lot_id": null, "regulator_sample_id2": null, "regulator_batch_id2": null, "production_date": "2026-07-28", "date_samples_collected": "2026-08-12", "public_url": "https://orders.confidentcannabis.com/verify/2fd1c0a9", "units_per_serving": null, "servings_per_container": null, "unit_description": null, "container_description": null, "regulatory_category_id": 7, "solvents_used": null, "has_coa": false, "coa": null, "coa_additions": [], "weight_on_hand": 9.5, "weight_on_hand_unit": "g", "has_lab_data": false, "has_lab_data_draft": true, "has_coa_draft": true, "coa_draft": { "filename": "coa-2601-0143-1-v2.pdf", "public_key": "c41d8e0b-6b7f-4f4a-8b1a-9f2c7d5e3a10", "url": "https://files.confidentcannabis.com/coa-2601-0143-1-v2.pdf" }, "logs": [ { "user_name": "Dana Reyes", "user_id": 3391, "log_time": "2026-08-14T17:22:05", "message": "Test results submitted via API" } ], "custom_field": null, "external_data": { "lims_batch": "AB-4417" }, "test_package_total_price": 275.0, "due_date": "2026-08-19", "has_rushed_test_types": false, "rushed_test_types": [], "lab_data": null, "lab_data_draft": { "date_created": "2026-08-14T17:22:05", "date_reported": "2026-08-14", "status": 2, "thc_total": 19.4, "thc_calculation": "d9_thc + (thca * 0.877)", "cbd_total": 0.14, "cbd_calculation": "cbd + (cbda * 0.877)", "cannabinoid_total": 21.9, "cannabinoid_calculation": "sum of all cannabinoids", "terpene_total": null, "terpene_calculation": null, "categories": { "cannabinoids": { "info_fields": { "input_units": "%", "report_units": "%", "date_tested": "2026-08-14", "status": 1 }, "compounds": [ { "name": "thca", "value": "21.34", "lod": "0.01", "loq": "0.03" }, { "name": "d9_thc", "value": "0.68", "lod": "0.01", "loq": "0.03" } ] } } } } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/labs/sample/{sample_id}' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/sample/{sample_id}' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/sample/{sample_id}"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/get-sample-details OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Edit a sample `PATCH /v0/labs/sample/{sample_id}` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Update one or more fields on a sample. Only the fields you send are changed. Samples can only be edited while their order is in the 'placed' or 'in progress' status; editing a sample on an order in any other status returns the `invalid_order_status` error. A sample belonging to another lab returns 404 rather than 403. The IDs for `type_id`, `production_method_id` and `classification_id` are the same ones used when creating a sample, and are listed at `GET /sampletypes`, `GET /sampleproductionmethods` and `GET /sampleclassifications`. The new sample type must belong to the same industry as the sample and its order. The regulator sample ID cannot be edited through this API, because regulator requirements for changing it differ from state to state. ## Path parameters - `sample_id` (string, required) ## Body parameters (application/x-www-form-urlencoded) - `name` (string, optional) — Display name for the sample. - `strain_name` (string, optional) — Strain the sample came from. Example: `Blue Dream` - `type_id` (integer, optional) — Sample type ID, from `GET /sampletypes`. - `production_method_id` (integer, optional) — Production method ID, from `GET /sampleproductionmethods`. - `classification_id` (integer, optional) — Classification ID, from `GET /sampleclassifications`. - `production_date` (string (date), optional) — Date the sample was harvested or produced. Example: `2026-07-28` - `manifest_id` (string, optional) — Manifest ID in the state's seed-to-sale system. - `batch_id` (string, optional) — Batch ID from the client's inventory system. Example: `BD-2026-08-A` - `batch_size` (number, optional) — Size of the batch the sample came from. Example: `4500` - `batch_size_unit` (string, optional) — Unit for `batch_size`: `units`, `lb` or `g`. Example: `g` - `lot_id` (string, optional) — Lot ID from the client's inventory system. - `lot_size` (number, optional) — Size of the lot the sample came from. - `lot_size_unit` (string, optional) — Unit for `lot_size`: `units`, `lb` or `g`. - `production_run_id` (string, optional) — Production run ID from the client's system. - `production_run_size` (number, optional) — Size of the production run. - `production_run_size_unit` (string, optional) — Unit for `production_run_size`: `units`, `lb` or `g`. - `units_per_serving` (number, optional) — Serving size, in units. - `servings_per_container` (number, optional) — Number of servings in one container. - `unit_description` (string, optional) — What one unit means for this sample. - `container_description` (string, optional) — What one container means for this sample. - `regulator_batch_id` (string, optional) — Batch ID in the state's seed-to-sale tracking system. - `regulator_sample_id2` (string, optional) — (for Leaf) Pre-transfer batch ID. - `regulator_batch_id2` (string, optional) — (for Leaf) Pre-transfer inventory or lot ID. - `regulator_lot_id` (string, optional) — Lot ID in the state's seed-to-sale tracking system. - `harvest_id` (string, optional) — Harvest lot ID in the state's seed-to-sale tracking system. - `notes` (string, optional) — Free-text notes about the sample. Example: `Received in a sealed mylar bag.` - `lims_id` (string, optional) — Sample ID in the lab's own LIMS. - `date_samples_collected` (string (date), optional) — Date the sample was collected. - `custom_field` (string, optional) — Lab-defined custom field. - `extra_field_1` (string, optional) - `extra_field_2` (string, optional) - `extra_field_3` (string, optional) - `extra_field_4` (string, optional) - `extra_field_5` (string, optional) - `extra_field_6` (string, optional) - `extra_field_7` (string, optional) - `extra_field_8` (string, optional) - `extra_field_9` (string, optional) - `extra_field_10` (string, optional) - `extra_date_field_1` (string (date), optional) - `extra_date_field_2` (string (date), optional) - `extra_date_field_3` (string (date), optional) - `extra_date_field_4` (string (date), optional) - `extra_date_field_5` (string (date), optional) - `extra_bool_field_1` (boolean, optional) - `extra_bool_field_2` (boolean, optional) - `extra_bool_field_3` (boolean, optional) - `extra_bool_field_4` (boolean, optional) - `extra_bool_field_5` (boolean, optional) - `external_data` (string, optional) — Arbitrary JSON stored alongside the sample. - `due_date` (string (date), optional) — Date the results are due back to the client. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `sample` (object) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `initial_weight` (number) — Sample weight at order verification - `initial_weight_unit` (number) — Unit type for Initial Weight - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation - `cover_image` (object) - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `images` (array of objects) — Will also contain cover image - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `notes` (string) — Notes about the sample - `batch_size` (number) — Size of the client's batch from which the sample tested by the lab came - `batch_size_unit` (string) — Unit type for batch size (units, lb, or g) - `lot_id` (string) — Unique ID from the client's inventory management system of the client's lot from which the sample tested by the lab came - `lot_size` (number) — Size of the client's lot from which the sample tested by the lab came - `lot_size_unit` (string) — Unit type for lot size (units, lb, or g) - `production_run_id` (string) — Unique ID from the client's inventory management system of the client's production run from which the sample tested by the lab came - `production_run_size` (number) — Size of the client's production run from which the sample tested by the lab came - `production_run_size_unit` (string) — Unit type for production run size (units, lb, or g) - `manifest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample manifest from which the sample tested by the lab came - `regulator_lot_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's lot from which the sample tested by the lab came - `regulator_sample_id2` (string) — (for Leaf) Pre-Transfer Batch ID - `regulator_batch_id2` (string) — (for Leaf) Pre-Transfer Inventory/Lot ID - `production_date` (timestamp) — Harvest/Production Date [when sample was produced] - `date_samples_collected` (timestamp) — Collection Date [when sample was collected] - `public_url` (string) — Unique URL for viewing this sample or CoA without requiring a login. Should be added to CoAs and used for QR codes or other barcode images so end consumers can verify the integrity of the data - `units_per_serving` (number) — Serving Size - `servings_per_container` (number) — Number of Servings in one Container - `unit_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Bottle) - `container_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Gummy) - `regulatory_category_id` (integer) — Unique ID for sample's regulatory category - `solvents_used` (string) — Information about the solvents used in testing - `has_coa` (boolean) — True if sample has a Certificate of Analysis - `coa` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `coa_additions` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `order_lims_id` (string) — Orders lims ID - `lims_id` (string) — Sample lims ID - `weight_on_hand` (number) — Current weight on hand - `weight_on_hand_unit` (string) — Unit type for weight measurements (units, g, or ml) - `has_lab_data` (boolean) — True if sample has test results - `has_lab_data_draft` (boolean) — True if sample has draft test results - `has_coa_draft` (boolean) — True if sample has a draft Certificate of Analysis - `coa_draft` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `custom_field` (string) — Custom Field - `external_data` (any) — Custom External Json Data - `extra_field_1` (string) — Custom data field - `extra_field_2` (string) — Custom data field - `extra_field_3` (string) — Custom data field - `extra_field_4` (string) — Custom data field - `extra_field_5` (string) — Custom data field - `extra_field_6` (string) — Custom data field - `extra_field_7` (string) — Custom data field - `extra_field_8` (string) — Custom data field - `extra_field_9` (string) — Custom data field - `extra_field_10` (string) — Custom data field - `extra_date_field_1` (timestamp) — Custom data field for dates - `extra_date_field_2` (timestamp) — Custom data field for dates - `extra_date_field_3` (timestamp) — Custom data field for dates - `extra_date_field_4` (timestamp) — Custom data field for dates - `extra_date_field_5` (timestamp) — Custom data field for dates - `extra_bool_field_1` (boolean) — Custom data field for yes/no fields - `extra_bool_field_2` (boolean) — Custom data field for yes/no fields - `extra_bool_field_3` (boolean) — Custom data field for yes/no fields - `extra_bool_field_4` (boolean) — Custom data field for yes/no fields - `extra_bool_field_5` (boolean) — Custom data field for yes/no fields - `test_package_total_price` (number) — Total price of test packages with custom client pricing and discounts included - `due_date` (timestamp) — Due date - `has_rushed_test_types` (boolean) — True if sample has rushed test types - `rushed_test_types` (array of strings) — List of rushed test type abbreviations Example: ```json { "success": true, "sample": { "id": "2601-0143-1", "order_id": "2601-0143", "client_id": 812, "lab": { "id": 44, "name": "Cascade Analytics" }, "order_status_id": 3, "order_status_name": "In Progress", "sample_name": "Blue Dream Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis & Hemp", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower - Cured", "sample_classification_id": 9, "sample_classification_name": "Sativa Dominant", "production_method_id": 3, "production_method_name": "Greenhouse", "regulator_sample_id": "1A4060300003B71000001234", "regulator_batch_id": "1A4060300003B71000001180", "batch_id": "BD-2026-08-A", "harvest_id": "HARVEST-2026-07-BD", "test_packages": [ { "id": 12, "name": "Compliance Panel", "price": 275.0, "minimum_quantity": 1 } ], "last_modified": "2026-08-14T18:03:12", "date_published": null, "order_lims_id": "ORD-2026-0143", "lims_id": "S-2026-0143-1", "initial_weight": 12.0, "initial_weight_unit": "g", "test_types": [ { "id": 1, "name": "Cannabinoids", "abbreviation": "CAN" } ], "cover_image": null, "images": [], "notes": "Received in a sealed mylar bag.", "batch_size": 4500.0, "batch_size_unit": "g", "lot_id": "LOT-BD-118", "lot_size": 4500.0, "lot_size_unit": "g", "production_run_id": null, "production_run_size": null, "production_run_size_unit": null, "manifest_id": "0000012345", "regulator_lot_id": null, "regulator_sample_id2": null, "regulator_batch_id2": null, "production_date": "2026-07-28", "date_samples_collected": "2026-08-12", "public_url": "https://orders.confidentcannabis.com/verify/2fd1c0a9", "units_per_serving": null, "servings_per_container": null, "unit_description": null, "container_description": null, "regulatory_category_id": 7, "solvents_used": null, "has_coa": false, "coa": null, "coa_additions": [], "weight_on_hand": 9.5, "weight_on_hand_unit": "g", "has_lab_data": false, "has_lab_data_draft": false, "has_coa_draft": false, "logs": [ { "user_name": "API", "user_id": null, "log_time": "2026-08-14T18:03:12", "message": "Sample edited via API" } ], "custom_field": null, "external_data": null, "test_package_total_price": 275.0, "due_date": "2026-08-19", "has_rushed_test_types": false, "rushed_test_types": [] } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X PATCH 'https://api.confidentcannabis.com/v0/labs/sample/{sample_id}' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/sample/{sample_id}' data = { # optional form fields go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'PATCH', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.patch( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/sample/{sample_id}"; const data = { // optional form fields go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "PATCH", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "PATCH", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/edit-sample OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Upload a sample CoA `POST /v0/labs/sample/{sample_id}/coa` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`multipart/form-data`), never JSON. Attach a certificate of analysis to the sample and make it the sample's current CoA. Each upload increments the CoA version, so reposting replaces the CoA rather than adding a second one. Allowed extensions are pdf, and a CoA can only be added while the order is in progress (`status_id` 3) - otherwise the endpoint returns the `invalid_order_status` error. Send the file as a file field in a standard `multipart/form-data` request, and leave file fields out of signature generation. ## Path parameters - `sample_id` (string, required) ## Body parameters (multipart/form-data) - `coa` (file, required) — The CoA PDF to attach. ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/sample/{sample_id}/coa' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' \ -F 'coa=@/path/to/file' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/sample/{sample_id}/coa' # file uploads are sent but never signed files = { "coa": open('/path/to/file', 'rb'), } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, files=files, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/sample/{sample_id}/coa"; const body = new FormData(); // file uploads are sent but never signed body.append("coa", file); // a File or Blob const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/post-sample-coa OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Upload a CoA addition `POST /v0/labs/sample/{sample_id}/coa_addition` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`multipart/form-data`), never JSON. Attach a supplementary document to the sample, alongside its CoA. Additions accumulate, so each upload adds another file. Allowed extensions are pdf, jpg, jpeg, png, gif and bmp, and additions can only be added while the order is in progress (`status_id` 3) - otherwise the endpoint returns the `invalid_order_status` error. Send the file as a file field in a standard `multipart/form-data` request, and leave file fields out of signature generation. ## Path parameters - `sample_id` (string, required) ## Body parameters (multipart/form-data) - `coa_addition` (file, required) — The document to attach. ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/sample/{sample_id}/coa_addition' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' \ -F 'coa_addition=@/path/to/file' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/sample/{sample_id}/coa_addition' # file uploads are sent but never signed files = { "coa_addition": open('/path/to/file', 'rb'), } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, files=files, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/sample/{sample_id}/coa_addition"; const body = new FormData(); // file uploads are sent but never signed body.append("coa_addition", file); // a File or Blob const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/post-sample-coa-addition OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Upload a sample image `POST /v0/labs/sample/{sample_id}/image` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`multipart/form-data`), never JSON. Attach an image to the sample. Allowed extensions are jpg, jpeg, png, gif and bmp, and images can only be added while the order is in progress (`status_id` 3) - otherwise the endpoint returns the `invalid_order_status` error. Send the file as a file field in a standard `multipart/form-data` request, and leave file fields out of signature generation. `subtype` labels what the image shows: `0` Sample, `1` Microscope, `2` Micro Plate, `3` Chromatogram, `4` Client Logo, `5` Other, `6` Other 2, `7` Other 3, `8` Other 4. ## Path parameters - `sample_id` (string, required) ## Body parameters (multipart/form-data) - `image` (file, required) — The image file to attach. - `set_cover_image` (boolean, optional, default `True`) — Set this image as the sample's cover image. Defaults to true. - `subtype` (integer, optional, default `0`) — What the image shows; see the list above. Defaults to 0. ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/sample/{sample_id}/image' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' \ -F 'image=@/path/to/file' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/sample/{sample_id}/image' data = { # optional form fields go here - they are signed too } # file uploads are sent but never signed files = { "image": open('/path/to/file', 'rb'), } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, files=files, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/sample/{sample_id}/image"; const data = { // optional form fields go here - they are signed too }; const body = new FormData(); for (const [name, value] of Object.entries(data)) body.append(name, value); // file uploads are sent but never signed body.append("image", file); // a File or Blob const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/post-sample-image OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Submit test results `POST /v0/labs/sample/{sample_id}/test_results` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Submit test results for a sample. The payload surface is deliberately large so that it can describe any assay, but you only need to send what was actually tested - never include compounds that were not tested. Results may be submitted while the sample's order is in any valid status, but every result is stored as a DRAFT and stays invisible to the client until the sample is published or its order moves to the completed stage. Set `publish_data` to `true` to publish the results, together with any draft CoA and CoA additions, as soon as they are submitted. Each request replaces all previous test result data for the sample, so always submit the complete set of results in one call. ## Request payload `test_results` is a single JSON-encoded object. Build it with every tested category, then serialize it to a string and send it as the `test_results` form field. ```json { "categories": { "cannabinoids": { "info_fields": { "input_units": "%", "report_units": "%", "date_tested": "2026-08-14", "status": 1 }, "compounds": [ {"name": "thca", "value": "21.34", "lod": "0.01", "loq": "0.03"}, {"name": "d9_thc", "value": "0.68", "lod": "0.01", "loq": "0.03"} ] } } } ``` Any compound returned by `GET /compounds` may be listed, within its own category. Setting `"skip_coa": true` alongside `categories` submits the data without generating a CoA. ### Compound object `name` and `value` are required; every other key is optional metadata, reported in the same units as `value` unless noted otherwise. - `name`: compound key for what was tested - `value`: the test result, as a string, e.g. `"1.02"` - `lod`: limit of detection - `loq`: limit of quantitation - `limit`: value above which this test fails - `max`: upper limit of quantitation - `spike`: spike recovery for the analyte - `stdev`: standard deviation of the sample replicate results - `regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `qualifiers`: testing qualifiers, where the regulator defines them - `rsd`: relative standard deviation of the analyte values - `rpd`: relative percent difference of the analyte values - `limitrangehigh`: upper limit when restricting value to a range - `limitrangelow`: lower limit when restricting value to a range - `purity_percent`: purity percentage for the analyte ### General rules - All test values are numeric but must be submitted as **strings**, so that JSON encoding and decoding cannot lose precision. Sending bare numbers will likely produce inaccurate data. - Percentages are numbers between 0 and 100: report 23.1% as `23.1`, not `0.231`. - Statuses are integer IDs: `1` passed, `2` failed, `3` completed. Completed means the assay could neither pass nor fail. - `input_units` and `report_units` are required in `info_fields` for every category except `general`, and must come from that category's allowed units. - `unit_weight` is required whenever a unit field for the category is `mg/unit`, and `ml_weight` whenever one is `mg/ml`. Both drive mass-to-mass unit conversions, so a conversion that needs one and does not get it fails. When testing a cookie, send the weight of a whole cookie; when testing a liquid, send the weight of one millilitre. - `footnote` carries anything that should accompany the assay on the CoA - the definition of total THC and total CBD, dry weight versus wet weight, or other extraordinary QC data. ### Error codes A failed submission returns 400 with an `error_code`, plus `error_field` and `error_category` where they apply. - `invalid_sample_id` - no sample found with the requested id. - `invalid_order_status` - the sample's order cannot accept test results. - `invalid_field` - a field or category had the wrong type, or the category is unknown. - `unknown_compound` - an unknown compound was submitted. - `duplicate_compound` - a compound was given twice. - `conversion_error` - a result value could not be converted. - `missing_required_field` - a required field is missing. - `invalid_date` - an invalid date was given; dates are `YYYY-MM-DD`. - `suspicious_date` - a date much older than expected (before 2012) was given. - `invalid_status` - an invalid value was given for a status field. - `invalid_unit` - a category was reported in an unsupported unit. - `significant_digits_outside_range` - `digits` must be between 1 and 8 when `digits_method` is `significant`. - `invalid_data` - any other validation failure; `error_field` and `error_category` may be absent. ## Categories Each category below lists its allowed units, the defaults applied when a field is omitted, and every info field it accepts. The API also accepts `dna`, `miscellaneous`, `ph` and `shelflife`, which follow the same structure but have no published option set. #### `alkaloids` Allowed units: `%`, `mg/container`, `mg/g`, `mg/ml`, `mg/serving`, `mg/unit`, `ppb`, `ppm` Defaults: `input_units` = `%`, `report_units` = `%`, `digits` = `2`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `ml_weight`: the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `servings_per_container`: Number of servings per container - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `units_per_serving`: Number of units per serving - `wet_weight`: weight of aliquot as received #### `anabolic_steroids` Allowed units: `%`, `mg/container`, `mg/g`, `mg/ml`, `mg/serving`, `mg/unit`, `ppb`, `ppm` Defaults: `input_units` = `%`, `report_units` = `%`, `digits` = `2`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `ml_weight`: the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `servings_per_container`: Number of servings per container - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `units_per_serving`: Number of units per serving - `wet_weight`: weight of aliquot as received #### `cannabinoids` Allowed units: `%`, `mg/container`, `mg/g`, `mg/ml`, `mg/serving`, `mg/unit`, `ppb`, `ppm` Defaults: `input_units` = `%`, `report_units` = `%`, `digits` = `2`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `container_description`: Description of container (eg. bottle, box, tin) - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `method`: testing method - eg, GC-FID, HPLC, etc - `metrc_co_d9_thc_status`: pass or fail integer ID from the status enum - `metrc_me_total_thc_mg_package_status`: pass or fail integer ID from the status enum - `metrc_me_total_thc_mg_serving_status`: pass or fail integer ID from the status enum - `metrc_mi_potency_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_potency_status`: pass or fail integer ID from the status enum - `metrc_mi_potency_value`: optional value for the 'Potency' field in Metrc - `metrc_mi_total_cbd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_total_thc_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_total_thc_status`: DEPRECATED - `metrc_mi_total_thc_value`: DEPRECATED - `metrc_mn_other_adc_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_other_adc_status`: pass or fail integer ID from the status enum - `metrc_mn_other_adc_value`: value for the 'Other ADC (mg/g) Full Panel ' field in Metrc. value should be in mg/serving - `metrc_mn_thc_purity_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_thc_purity_status`: pass or fail integer ID from the status enum - `metrc_mn_thc_purity_value`: value for the 'THC Purity (% or mg/g)' field in Metrc - `metrc_mn_total_cannabinoids_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_total_cannabinoids_status`: pass or fail integer ID from the status enum - `metrc_mn_total_cbd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_total_cbd_status`: pass or fail integer ID from the status enum - `metrc_mn_total_thc_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mn_total_thc_status`: pass or fail integer ID from the status enum - `metrc_mt_total_cbd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mt_total_cbd_status`: pass or fail integer ID from the status enum - `metrc_mt_total_thc_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mt_total_thc_status`: pass or fail integer ID from the status enum - `metrc_oh_total_cbd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_oh_total_cbd_status`: pass or fail integer ID from the status enum - `metrc_oh_total_thc_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_oh_total_thc_status`: pass or fail integer ID from the status enum - `metrc_or_cbd_pct_rsd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_cbd_pct_rsd_status`: pass or fail integer ID from the status enum - `metrc_or_cbd_pct_rsd_value`: Percent Relative Standard Deviation value for state traceability system - `metrc_or_cbd_rpd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_cbd_rpd_status`: pass or fail integer ID from the status enum - `metrc_or_cbd_rpd_value`: Relative Percent Difference value for state traceability system - `metrc_or_d8_thc_pct_rsd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_d8_thc_pct_rsd_status`: pass or fail integer ID from the status enum - `metrc_or_d8_thc_pct_rsd_value`: Percent Relative Standard Deviation value for state traceability system - `metrc_or_d8_thc_rpd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_d8_thc_rpd_status`: pass or fail integer ID from the status enum - `metrc_or_d8_thc_rpd_value`: Relative Percent Difference value for state traceability system - `metrc_or_potency_control_study_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_potency_control_study_status`: pass or fail integer ID from the status enum - `metrc_or_potency_process_validation_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_potency_process_validation_status`: pass or fail integer ID from the status enum - `metrc_or_potency_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_potency_status`: pass or fail integer ID from the status enum - `metrc_or_thc_pct_rsd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_thc_pct_rsd_status`: pass or fail integer ID from the status enum - `metrc_or_thc_pct_rsd_value`: Percent Relative Standard Deviation value for state traceability system - `metrc_or_thc_rpd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_thc_rpd_status`: pass or fail integer ID from the status enum - `metrc_or_thc_rpd_value`: Relative Percent Difference value for state traceability system - `metrc_or_total_cbd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_total_thc_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_total_thc_status`: pass or fail integer ID from the status enum - `ml_weight`: the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `servings_per_container`: Number of servings per container - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `totalcbd_outsidelimitrange` - `totalthc_outsidelimitrange` - `unit_description`: definition of one unit when any unit fields are 'mg/unit' - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `units_per_serving`: Number of units per serving - `wet_weight`: weight of aliquot as received #### `endotoxins` Allowed units: `eu/g`, `eu/mg`, `eu/ml` Defaults: `input_units` = `eu/ml`, `report_units` = `eu/ml`, `digits` = `2`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `ml_weight`: the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `servings_per_container`: Number of servings per container - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `units_per_serving`: Number of units per serving - `wet_weight`: weight of aliquot as received #### `flavonoids` Allowed units: `%`, `mg/container`, `mg/g`, `mg/ml`, `mg/serving`, `mg/unit`, `ppb`, `ppm` Defaults: `input_units` = `%`, `report_units` = `%`, `digits` = `2`, `digits_method` = `round` Info fields: - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `ml_weight`: the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `wet_weight`: weight of aliquot as received #### `foreign_matter` Allowed units: `%`, `mg/lb` Defaults: `input_units` = `%`, `report_units` = `%`, `digits` = `2`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `metrc_mi_foreign_organic_matter_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_foreign_organic_matter_value`: value for the 'Foreign organic matter' field in Metrc. - `metrc_nv_visual_inspection_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum #### `homogeneity` Allowed units: `%`, `mg/unit` Defaults: `input_units` = `%`, `report_units` = `%`, `digits` = `0`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' #### `metals` Allowed units: `mg/g`, `ppb`, `ppm` Defaults: `input_units` = `ppb`, `report_units` = `ppb`, `digits` = `0`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `metrc_mi_metals_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_metals_status`: pass or fail integer ID from the status enum - `metrc_mi_metals_value`: optional value for the 'Metals' field in Metrc - `metrc_or_metals_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_metals_status`: pass or fail integer ID from the status enum - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum #### `microbials` Allowed units: `cfu`, `cfu/g`, `cfu/m^3`, `cfu/ml`, `cfu/plate`, `cq`, `mpn/g` Defaults: `input_units` = `cfu/g`, `report_units` = `cfu/g`, `digits` = `0`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `metrc_co_microbials_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_microbials_status`: pass or fail integer ID from the status enum - `metrc_co_microbials_value`: optional value for the 'Microbials' field in Metrc - `metrc_mi_microbials_infused_bool`: boolean true/false flag (0=false/1=true) to denote if the sample is an infused product - `metrc_mi_microbials_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_microbials_status`: pass or fail integer ID from the status enum - `metrc_mi_microbials_value`: optional value for the 'Microbials' field in Metrc - `metrc_nv_microbials_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_nv_microbials_status`: pass or fail integer ID from the status enum - `metrc_nv_microbials_value`: value for the 'Microbials' field in Metrc - `metrc_or_microbials_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_microbials_status`: pass or fail integer ID from the status enum - `metrc_or_microbiological_process_validation_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_microbiological_process_validation_status`: pass or fail integer ID from the status enum - `ml_weight`: the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `wet_weight`: weight of aliquot as received #### `moisture` Allowed units: `%` Defaults: `input_units` = `%`, `report_units` = `%`, `digits` = `1`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `wet_weight`: weight of aliquot as received #### `mycotoxins` Allowed units: `mg/g`, `ppb`, `ppm` Defaults: `input_units` = `ppb`, `report_units` = `ppb`, `digits` = `2`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `metrc_mi_mycotoxins_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_mycotoxins_status`: pass or fail integer ID from the status enum - `metrc_mi_mycotoxins_value`: optional value for the 'Mycotoxins' field in Metrc - `metrc_or_mycotoxins_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_mycotoxins_status`: pass or fail integer ID from the status enum - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum #### `nutrients` Allowed units: `%`, `mg/container`, `mg/g`, `mg/ml`, `mg/serving`, `mg/unit`, `ppb`, `ppm` Defaults: `input_units` = `ppm`, `report_units` = `ppm`, `digits` = `2`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `ml_weight`: the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `report_units`: the primary units displayed on the certificate of analysis - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `servings_per_container`: Number of servings per container - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `units_per_serving`: Number of units per serving - `wet_weight`: weight of aliquot as received #### `peptides` Allowed units: `%`, `iu`, `mg/container`, `mg/g`, `mg/ml`, `mg/serving`, `mg/unit`, `ppb`, `ppm` Defaults: `input_units` = `%`, `report_units` = `%`, `digits` = `2`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `ml_weight`: the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `servings_per_container`: Number of servings per container - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `units_per_serving`: Number of units per serving - `wet_weight`: weight of aliquot as received #### `pesticides` Allowed units: `mg/g`, `ppb`, `ppm` Defaults: `input_units` = `ppm`, `report_units` = `ppm`, `digits` = `3`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `metrc_co_other_pesticide_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_other_pesticide_status`: pass or fail integer ID from the status enum - `metrc_co_other_pesticide_value`: the sum of all pesticide detections in ppm excluding Abamectin, Azoxystrobin, Bifenazate, Etoxazole, Imazalil, Imidacloprid, Malathion, Myclobutanil, Permethrin, Spinosad, Spiromesifen, Spirotetramat, and Tebuconazole - `metrc_co_pesticide_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_pesticide_status`: pass or fail integer ID from the status enum - `metrc_co_pesticide_value`: the total sum of all pesticides detected in ppm - `metrc_mi_pesticides_chemical_residue_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_pesticides_chemical_residue_status`: pass or fail integer ID from the status enum - `metrc_mi_pesticides_chemical_residue_value`: optional value for the 'Chemical Residue' field in Metrc - `metrc_or_limited_batch_pesticide_testing_regulatornotes`: DEPRECATED: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_control_study_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_control_study_status`: pass or fail integer ID from the status enum - `metrc_or_pesticides_process_validation_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_process_validation_status`: pass or fail integer ID from the status enum - `metrc_or_pesticides_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_pesticides_status`: pass or fail integer ID from the status enum - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `volume`: volume of the aliquot in the solution - `wet_weight`: weight of aliquot as received #### `solvents` Allowed units: `%`, `mg/g`, `ppb`, `ppm` Defaults: `input_units` = `ppm`, `report_units` = `ppm`, `digits` = `3`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `metrc_co_solvents_other_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_solvents_other_status`: pass or fail integer ID from the status enum - `metrc_co_solvents_other_value`: the sum of all residual solvent detections in ppm excluding Benzene, Butanes, Heptanes, Hexane, Toluene, and Total Xylenes - `metrc_co_solvents_remediated_bool`: boolean true/false flag (0=false/1=true) to denote if the sample is from a batch made from remediated product - `metrc_co_solvents_residual_regulatornotes`: DEPRECATED: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_solvents_residual_status`: DEPRECATED: pass or fail integer ID from the status enum - `metrc_mi_solvents_residual_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_mi_solvents_residual_status`: pass or fail integer ID from the status enum - `metrc_mi_solvents_residual_value`: optional value for the 'Residual Solvents' field in Metrc - `metrc_or_solvents_control_study_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_control_study_status`: pass or fail integer ID from the status enum - `metrc_or_solvents_pct_rsd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_pct_rsd_status`: pass or fail integer ID from the status enum - `metrc_or_solvents_pct_rsd_value`: value for the 'Solvents (RPD)' field in Metrc - `metrc_or_solvents_process_validation_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_process_validation_status`: pass or fail integer ID from the status enum - `metrc_or_solvents_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_rpd_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_solvents_rpd_status`: pass or fail integer ID from the status enum - `metrc_or_solvents_rpd_value`: Relative Percent Difference value for state traceability system - `metrc_or_solvents_status`: pass or fail integer ID from the status enum - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `wet_weight`: weight of aliquot as received #### `terpenes` Allowed units: `%`, `mg/container`, `mg/g`, `mg/ml`, `mg/serving`, `mg/unit`, `ppb`, `ppm` Defaults: `input_units` = `%`, `report_units` = `%`, `digits` = `2`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `container_description`: Description of container (eg. bottle, box, tin) - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `dry_weight`: weight of aliquot after drying - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `ml_weight`: the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `servings_per_container`: Number of servings per container - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum - `totalterpenes_outsidelimitrange` - `unit_description`: definition of one unit when any unit fields are 'mg/unit' - `unit_weight`: the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `units_per_serving`: Number of units per serving - `volume`: volume of the aliquot in the solution - `wet_weight`: weight of aliquot as received #### `water_activity` Allowed units: `aw` Defaults: `input_units` = `aw`, `report_units` = `aw`, `digits` = `5`, `digits_method` = `round` Info fields: - `analytical_batch_id`: optional analytical batch ID for QC samples - `analytical_batch_id_2`: optional second analytical batch ID for QC samples - `date_prepared`: date the sample was prepared for this assay - `date_tested`: date the sample was tested for this assay - `digits`: number of digits to display on the certificate of analysis; see digits_method - `digits_method`: round rounds to digits decimal places, significant rounds to digits significant figures - `footnote`: footnote to accompany this assay - `input_units`: units the data is being submitted in, from the category's allowed units - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `qc_blank_dup_id`: optional sample ID for QC Blank duplicate - `qc_blank_id`: optional sample ID for QC Blank - `qc_blank_trip_id`: optional sample ID for QC Blank triplicate - `qc_control_study_id`: optional sample ID for Control Study - `qc_lcs_dup_id`: optional sample ID for QC Lab Control Sample duplicate - `qc_lcs_id`: optional sample ID for QC Lab Control Sample - `qc_lcs_trip_id`: optional sample ID for QC Lab Control Sample triplicate - `qc_sample_dup_id`: optional sample ID for QC sample duplicate - `qc_sample_id`: optional sample ID for QC sample - `qc_sample_trip_id`: optional sample ID for QC sample triplicate - `qc_spike_dup_id`: optional sample ID for QC Spike duplicate - `qc_spike_id`: optional sample ID for QC Spike - `qc_spike_trip_id`: optional sample ID for QC Spike triplicate - `report_units`: the primary units displayed on the certificate of analysis - `reported_as_wet`: optional flag for if numbers are reported including moisture weight (wet) or converted (dry) - `secondary_report_units`: the secondary units displayed on the certificate of analysis - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report - `status`: pass or fail integer ID from the status enum #### `general` Allowed units: none. This category carries no numeric results. Info fields: - `amended`: has the data been amended - `amended_notes`: optional notes detailing the amendment to the lab data - `footnote`: footnote to accompany this assay - `metrc_co_contaminants_regulatornotes`: DEPRECATED: notes posted to state traceability systems such as METRC or BioTrack - `metrc_co_contaminants_status`: DEPRECATED: pass or fail integer ID from the status enum - `metrc_nv_subcontract_testing_value`: DEPRECATED - `metrc_ok_retest_all_value`: value for the 'Retest (All)' field in Metrc - `metrc_ok_subcontract_all_value`: DEPRECATED - `metrc_or_r_and_d_test_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_subcontracted_test_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `metrc_or_tic_regulatornotes`: notes posted to state traceability systems such as METRC or BioTrack - `notes`, `notes_2` through `notes_10`: optional testing notes for this assay - `retest_id` - `retest_sample_id` - `signatory_name`: name of lab employee to appear on certificate of analysis - `signatory_title`: title of lab employee to appear on certificate of analysis - `signature`: URL of the signature image for the report ## Path parameters - `sample_id` (string, required) ## Body parameters (application/x-www-form-urlencoded) - `publish_data` (boolean, optional, default `False`) — Publish the results, and any draft CoA and CoA additions, as soon as they are stored. Defaults to false, which leaves everything in draft. Example: `True` - `date_published` (string, optional) — Publication date to record when `publish_data` is true. Defaults to the time of the request. - `test_results` (string, required) — The results, as a JSON-encoded object. See the description above for its structure and for the fields each category accepts. Example: ```json { "categories": { "cannabinoids": { "info_fields": { "input_units": "%", "report_units": "%", "date_prepared": "2026-08-13", "date_tested": "2026-08-14", "method": "HPLC-DAD", "digits": 2, "status": 1 }, "compounds": [ { "name": "thca", "value": "21.34", "lod": "0.01", "loq": "0.03" }, { "name": "d9_thc", "value": "0.68", "lod": "0.01", "loq": "0.03" }, { "name": "cbda", "value": "0.11", "lod": "0.01", "loq": "0.03" }, { "name": "cbd", "value": "0.04", "lod": "0.01", "loq": "0.03" } ] }, "moisture": { "info_fields": { "input_units": "%", "report_units": "%", "date_tested": "2026-08-14", "status": 3 }, "compounds": [ { "name": "moisture", "value": "11.20" } ] }, "water_activity": { "info_fields": { "input_units": "aw", "report_units": "aw", "date_tested": "2026-08-14", "status": 1 }, "compounds": [ { "name": "water_activity", "value": "0.58", "limit": "0.65" } ] } } } ``` ## Responses ### 200 Success No fields beyond the success envelope. Example: ```json { "success": true } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/sample/{sample_id}/test_results' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' \ --data-urlencode 'test_results={ "categories": { "cannabinoids": { "info_fields": { "input_units": "%", "report_units": "%", "date_prepared": "2026-08-13", "date_tested": "2026-08-14", "method": "HPLC-DAD", "digits": 2, "status": 1 }, "compounds": [ { "name": "thca", "value": "21.34", "lod": "0.01", "loq": "0.03" }, { "name": "d9_thc", "value": "0.68", "lod": "0.01", "loq": "0.03" }, { "name": "cbda", "value": "0.11", "lod": "0.01", "loq": "0.03" }, { "name": "cbd", "value": "0.04", "lod": "0.01", "loq": "0.03" } ] }, "moisture": { "info_fields": { "input_units": "%", "report_units": "%", "date_tested": "2026-08-14", "status": 3 }, "compounds": [ { "name": "moisture", "value": "11.20" } ] }, "water_activity": { "info_fields": { "input_units": "aw", "report_units": "aw", "date_tested": "2026-08-14", "status": 1 }, "compounds": [ { "name": "water_activity", "value": "0.58", "limit": "0.65" } ] } } }' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/sample/{sample_id}/test_results' data = { "test_results": "{\n \"categories\": {\n \"cannabinoids\": {\n \"info_fields\": {\n \"input_units\": \"%\",\n \"report_units\": \"%\",\n \"date_prepared\": \"2026-08-13\",\n \"date_tested\": \"2026-08-14\",\n \"method\": \"HPLC-DAD\",\n \"digits\": 2,\n \"status\": 1\n },\n \"compounds\": [\n {\n \"name\": \"thca\",\n \"value\": \"21.34\",\n \"lod\": \"0.01\",\n \"loq\": \"0.03\"\n },\n {\n \"name\": \"d9_thc\",\n \"value\": \"0.68\",\n \"lod\": \"0.01\",\n \"loq\": \"0.03\"\n },\n {\n \"name\": \"cbda\",\n \"value\": \"0.11\",\n \"lod\": \"0.01\",\n \"loq\": \"0.03\"\n },\n {\n \"name\": \"cbd\",\n \"value\": \"0.04\",\n \"lod\": \"0.01\",\n \"loq\": \"0.03\"\n }\n ]\n },\n \"moisture\": {\n \"info_fields\": {\n \"input_units\": \"%\",\n \"report_units\": \"%\",\n \"date_tested\": \"2026-08-14\",\n \"status\": 3\n },\n \"compounds\": [\n {\n \"name\": \"moisture\",\n \"value\": \"11.20\"\n }\n ]\n },\n \"water_activity\": {\n \"info_fields\": {\n \"input_units\": \"aw\",\n \"report_units\": \"aw\",\n \"date_tested\": \"2026-08-14\",\n \"status\": 1\n },\n \"compounds\": [\n {\n \"name\": \"water_activity\",\n \"value\": \"0.58\",\n \"limit\": \"0.65\"\n }\n ]\n }\n }\n}", # optional form fields go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/sample/{sample_id}/test_results"; const data = { "test_results": "{\n \"categories\": {\n \"cannabinoids\": {\n \"info_fields\": {\n \"input_units\": \"%\",\n \"report_units\": \"%\",\n \"date_prepared\": \"2026-08-13\",\n \"date_tested\": \"2026-08-14\",\n \"method\": \"HPLC-DAD\",\n \"digits\": 2,\n \"status\": 1\n },\n \"compounds\": [\n {\n \"name\": \"thca\",\n \"value\": \"21.34\",\n \"lod\": \"0.01\",\n \"loq\": \"0.03\"\n },\n {\n \"name\": \"d9_thc\",\n \"value\": \"0.68\",\n \"lod\": \"0.01\",\n \"loq\": \"0.03\"\n },\n {\n \"name\": \"cbda\",\n \"value\": \"0.11\",\n \"lod\": \"0.01\",\n \"loq\": \"0.03\"\n },\n {\n \"name\": \"cbd\",\n \"value\": \"0.04\",\n \"lod\": \"0.01\",\n \"loq\": \"0.03\"\n }\n ]\n },\n \"moisture\": {\n \"info_fields\": {\n \"input_units\": \"%\",\n \"report_units\": \"%\",\n \"date_tested\": \"2026-08-14\",\n \"status\": 3\n },\n \"compounds\": [\n {\n \"name\": \"moisture\",\n \"value\": \"11.20\"\n }\n ]\n },\n \"water_activity\": {\n \"info_fields\": {\n \"input_units\": \"aw\",\n \"report_units\": \"aw\",\n \"date_tested\": \"2026-08-14\",\n \"status\": 1\n },\n \"compounds\": [\n {\n \"name\": \"water_activity\",\n \"value\": \"0.58\",\n \"limit\": \"0.65\"\n }\n ]\n }\n }\n}", // optional form fields go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/post-sample-test-results OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Adjust weight on hand `POST /v0/labs/sample/{sample_id}/weight_on_hand` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded (`application/x-www-form-urlencoded`), never JSON. Record a change to the sample's weight on hand. The first adjustment is taken as the sample's initial weight on hand; every later adjustment appends to a log of alterations over time. An `amount_changed` of `0` records nothing and simply returns the current weight. `unit` must be `g` or `ml` or `units`, and `change_reason` must be an integer from the enum below. ## Change reasons Unless the lab reports to a regulator, `change_reason` uses this default enum: - `0` other - `1` initial - `2` destroyed - `3` used - `4` returned - `5` lost - `6` stolen - `7` addition Labs in a METRC state should use a reason from their own state's list instead. Reasons outside a state's list are accepted without error, but the weight change may reach METRC incorrectly. `0` is an allowable value everywhere; in most states it is not forwarded to METRC at all. - **METRC CA** - `0` other (Allowable value, not sent to METRC) - `2` Scale Variance - `3` Sample Tested - `106` Sample Tested - `101` Waste (Unusable Product) - `108` Damage - `215` Enforcement Testing - `107` Incorrect Quantity - `214` Male Plants - `213` Mandated Destruction - `212` Onsite Testing - `211` Over Pulled - `210` Research & Development - `105` Scale Variance - `209` Spoilage - `104` State-Authorized Adjustment - `103` Theft - `208` Trade Sample - `207` Under Pulled - `102` Voluntary Surrender - `206` Weight Change Due to Moisture - **METRC IL** - `0` other (Allowable value, not sent to METRC) - `288` Consumed During Testing - `287` Entry Error - `290` Inventory Audit - `286` Package Material - `285` Scale Variance - `284` Spoilage - `283` Theft - `282` Waste - **METRC LA** - `0` other (Allowable value, not sent to METRC) - `111` Test Sample Waste (Lab only) - `116` Potency Testing - `122` Contaminant Testing - `121` Drying - `120` During Transfer - `119` Entry Error - `118` Package Material - `117` Plants Unpacked - `115` R&D Testing - `114` Scale Variance - `113` Spoilage - `112` State-Ordered Destruction/State Mandated Destruction - `110` Theft - `109` Waste - **METRC MA** - `0` other (Allowable value, not sent to METRC) - `2` Test Sample Destruction - `3` Sample Used During Testing - `5` Waste - `128` Sample Used During Testing - `125` Test Sample Destruction - `135` API Related Error - `134` Drying - `133` Entry Error - `132` Over/Under Pulled - `131` Package Material - `130` Plants Unpacked - `129` Processing Loss - `127` Scale Variance - `126` Spoilage - `124` Theft - `123` Waste - **METRC MD** - `0` other (Allowable value, not sent to METRC) - `2` Drying - `3` Waste - `5` Spoilage - `136` Waste - `139` Scale Variance - `144` API Adjustment Error - `143` Drying - `142` Entry Error - `141` MCA Inspector Obtained Product - `140` Plants Unpacked - `138` Spoilage - `137` Theft - `263` Unaccounted Product - **METRC ME** - `0` other (Allowable value, not sent to METRC) - `151` Sample Used During Testing - `147` Test Sample Destruction - `156` API Related Error - `155` Drying - `154` Entry Error - `153` Over/Under Pulled - `152` R&D Sample - `150` Scale Variance - `149` Spoilage - `148` State Mandated Destruction - `146` Theft - `145` Waste - **METRC MI** - `0` other (Allowable value, not sent to METRC) - `3` Waste - `6` Scale Variance - `157` Waste - `159` Spoilage - `162` Drying - `161` Entry Error - `160` Scale Variance - `158` Theft - **METRC MN** - `0` other (Allowable value, not sent to METRC) - `170` Consumed During Testing - `164` Test Sample Destruction - `169` Drying - `168` Entry Error - `295` Hazardous Waste - `294` Non-Hazardous Waste - `167` Package Material - `307` Quantity Discrepancy - `165` Spoilage - `306` State Investigation - `163` Theft - **METRC MO** - `0` other (Allowable value, not sent to METRC) - `182` Consumed During Testing - `171` Waste - `183` API Error - `181` Damaged - `180` Drying - `179` Mandatory State Destruction - `178` Moisture Weight Change - `177` Over/Under Pulled - `176` Package Material - `175` Recall - `174` Spoilage - `173` Theft - `172` Typing Error - **METRC MS** - `0` other (Allowable value, not sent to METRC) - `281` Drying - `280` During Transfer - `279` Entry Error - `278` Package Material - `277` Scale Variance - `276` Spoilage - `275` Theft - `274` Waste - **METRC MT** - `0` other (Allowable value, not sent to METRC) - `247` Contaminant Testing - `240` Waste - `246` Drying - `245` Entry Error - `244` Scale Variance - `243` Spoilage - `242` State Mandated Destruction - `241` Theft - **METRC NJ** - `0` other (Allowable value, not sent to METRC) - `190` Consumed During Testing - `184` Waste - `189` Drying - `308` Enforcement Investigation - `188` Entry Error - `187` Scale Variance - `186` Spoilage - `185` Theft - **METRC NV** - `0` other (Allowable value, not sent to METRC) - `2` Package Destruction/Waste - `3` Test Sample Consumed in Testing - `4` Entry Error - `5` Nevada Dept.of Agriculture - `6` Scale Variance - `251` Test Sample Consumed in Testing - `255` Package Destruction/Waste - `292` API Adjustment Error - `259` Drying - `258` Entry Error - `257` Nevada Dept.of Agriculture - `256` Over Pulled - `254` Plants Unpacked - `253` Scale Variance - `252` Spoilage - `250` Theft - `249` Transfer Error - `291` Unaccounted Product Variance - `248` Under Pulled - **METRC NY** - `0` other (Allowable value, not sent to METRC) - `305` Consumed During Testing - `298` Waste - `304` Damage During Transfer - `303` Drying - `302` Entry Error - `301` Scale Variance - `300` Spoilage - `299` Theft - **METRC OH** - `0` other (Allowable value, not sent to METRC) - `2` Laboratory Testing - `3` Destruction - Waste/Other - `5` Laboratory Testing - `6` Plant Material - Moisture Gain/Loss - `194` Laboratory Testing - `195` Destruction - Waste/Other - `199` Data Entry Error - `198` Destruction - Expired - `197` Destruction - Failed Testing - `196` Destruction - Recall - `297` Inventory Reconciliation - `296` Loss, Theft, or Diversion - `192` Plant Material - Moisture Gain/Loss - `191` Scale Variance - **METRC OK** - `0` other (Allowable value, not sent to METRC) - `220` Sample Used During Testing - `224` Contaminant Testing - `225` API Related Error - `223` Damage/Spoilage - `222` Drying - `221` Mandatory State Destruction - `219` Scale Variance - `218` Test Sample Destruction - `217` Theft - `216` Typing/Entry Error - **METRC OR** - `0` Moisture Loss/Gain - `2` Sample Destroyed (Lab Use Only) - `3` Waste - `231` Sample Destroyed (Lab Use Only) - `226` Waste - `239` API Adjustment Error - `238` API Conversion Error - `237` During License-to-License Transfer - `236` Entry Error - `234` Moisture Loss/Gain - `233` Package Material - `232` Plant Death - `230` Scale Variance - `229` Spoilage - `228` Theft - `227` Trade Sample - **METRC RI** - `0` other (Allowable value, not sent to METRC) - `205` Consumed during Testing - `200` Waste - `204` Entry Error - `317` QA Sample to RIDOH - `203` Scale Variance - `202` Spoilage - `201` Theft - **METRC SD** - `0` other (Allowable value, not sent to METRC) - `260` Waste - `262` Drying - `261` Entry Error - **METRC Tribal Nations** - `0` other (Allowable value, not sent to METRC) - `312` Test Sample Consumed in Testing - `309` Waste - `316` Entry Error - `315` Plants Unpacked - `314` Scale Variance - `313` Spoilage - `311` Theft - `310` Transfer Error - **METRC 29 Palms** - `0` other (Allowable value, not sent to METRC) - `265` Waste (Unusable Product) - `273` Damage - `272` Enforcement Testing - `271` Incorrect Quantity - `270` Mandated Destruction - `269` Over Pulled - `268` TCC-Authorized Adjustment - `267` Theft - `266` Under Pulled - `264` Weight Change Due to Moisture ## Path parameters - `sample_id` (string, required) ## Body parameters (application/x-www-form-urlencoded) - `unit` (string, required) — Unit for `amount_changed`: `g` or `ml` or `units`. Example: `g` - `amount_changed` (number, required) — Signed amount to add to the weight on hand; negative values reduce it. `0` records nothing and returns the current weight. Example: `-2.5` - `change_reason` (integer, required) — Integer reason ID for the change; see the description above. Example: `3` ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `weight_on_hand` (object) - `weight` (integer) — The current weight on hand - `unit` (string) — Units the weight on hand is measured in(One of "g" or "units") Example: ```json { "success": true, "weight_on_hand": { "weight": 9.5, "unit": "g" } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X POST 'https://api.confidentcannabis.com/v0/labs/sample/{sample_id}/weight_on_hand' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' \ --data-urlencode 'unit=g' \ --data-urlencode 'amount_changed=-2.5' \ --data-urlencode 'change_reason=3' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/sample/{sample_id}/weight_on_hand' data = { "unit": "g", "amount_changed": "-2.5", "change_reason": "3", } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'POST', path, headers, data, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.post( 'https://api.confidentcannabis.com' + path, headers=headers, data=data, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/sample/{sample_id}/weight_on_hand"; const data = { "unit": "g", "amount_changed": "-2.5", "change_reason": "3", }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "POST", path, headers, data, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { method: "POST", headers, body: new URLSearchParams(data), }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/adjust-weight-on-hand OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List samples `GET /v0/labs/samples` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return the samples belonging to this lab, most recent order first. Results are paged: walk them with `start` and `limit` (maximum 100 per page) and keep requesting pages while `more_results` is `true`. The filters combine, so a polling integration can watch for work with `status_id`, and an incremental sync can pass the `modified_since_time` it recorded on its last successful run. ## Query parameters - `start` (integer, optional, default `0`) — Zero-based index of the first sample to return. - `limit` (integer, optional, default `100`) — Maximum number of samples to return, up to 100. - `status_id` (integer, optional) — Only return samples whose order is in this order status. - `modified_since_time` (string, optional) — Only return samples modified after this time. - `client_id` (integer, optional) — Only return samples belonging to this client. - `regulator_batch_id` (string, optional) — Only return samples from this batch in the state's seed-to-sale tracking system. - `harvest_id` (string, optional) — Only return samples from this harvest lot in the state's seed-to-sale tracking system. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `samples` (array of objects) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `order_lims_id` (string) — Orders lims ID - `lims_id` (string) — Sample lims ID - `more_results` (boolean) — True if more pages are available. Example: ```json { "success": true, "samples": [ { "id": "2601-0143-1", "order_id": "2601-0143", "client_id": 812, "lab": { "id": 44, "name": "Cascade Analytics" }, "order_status_id": 3, "order_status_name": "In Progress", "sample_name": "Blue Dream Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis & Hemp", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower - Cured", "sample_classification_id": 9, "sample_classification_name": "Sativa Dominant", "production_method_id": 3, "production_method_name": "Greenhouse", "regulator_sample_id": "1A4060300003B71000001234", "regulator_batch_id": "1A4060300003B71000001180", "batch_id": "BD-2026-08-A", "harvest_id": "HARVEST-2026-07-BD", "test_packages": [ { "id": 12, "name": "Compliance Panel", "price": 275.0, "minimum_quantity": 1 } ], "last_modified": "2026-08-14T17:22:05", "date_published": null, "order_lims_id": "ORD-2026-0143", "lims_id": "S-2026-0143-1" }, { "id": "2601-0142-1", "order_id": "2601-0142", "client_id": 807, "lab": { "id": 44, "name": "Cascade Analytics" }, "order_status_id": 4, "order_status_name": "Completed", "sample_name": "Wedding Cake Live Rosin", "strain_name": "Wedding Cake", "sample_industry_id": 1, "sample_industry_name": "Cannabis & Hemp", "sample_category_id": 2, "sample_category_name": "Concentrates & Extracts", "sample_type_id": 34, "sample_type_name": "Rosin", "sample_classification_id": 4, "sample_classification_name": "Hybrid", "production_method_id": 46, "production_method_name": "Pressing", "regulator_sample_id": "1A4060300003B71000001101", "regulator_batch_id": "1A4060300003B71000001099", "batch_id": "WC-2026-07-C", "harvest_id": "HARVEST-2026-06-WC", "test_packages": [ { "id": 15, "name": "Potency Only", "price": 85.0, "minimum_quantity": 1 } ], "last_modified": "2026-08-11T09:04:41", "date_published": "2026-08-11T09:04:41", "order_lims_id": "ORD-2026-0142", "lims_id": "S-2026-0142-1" } ], "more_results": false } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/labs/samples' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/samples' params = { # optional query params go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, params, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, params=params, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/samples"; const params = { // optional query params go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, params, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch(`https://api.confidentcannabis.com${path}?${new URLSearchParams(params)}`, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/get-samples OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List test packages `GET /v0/labs/testpackages` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every currently active test package offered by your lab, along with the sample categories each package applies to and the test types it covers. Use the `id` of a test package in `test_package_ids` when creating an order or adding a sample to one. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `sample_categories` (array of objects) - `id` (integer) — Unique ID for Sample Category - `name` (string) — Sample Category Name - `industry_id` (integer) — Unique ID for Sample Industry - `industry_name` (string) — Sample Industry Name - `description` (string) — Test Package Description - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation - `compliance` (boolean) — Compliance Testing package Example: ```json { "success": true, "test_packages": [ { "id": 4, "name": "California Compliance - Flower", "price": 275.0, "minimum_quantity": 5.0, "sample_categories": [ { "id": 1, "name": "Plant", "industry_id": 1, "industry_name": "Cannabis & Hemp" } ], "description": "Full CA phase 3 compliance panel for flower and pre-rolls.", "test_types": [ { "id": 1, "name": "Cannabinoids", "abbreviation": "CAN" }, { "id": 5, "name": "Required Pesticides", "abbreviation": "PES-R" } ], "compliance": true }, { "id": 9, "name": "Potency Only", "price": 65.0, "minimum_quantity": 3.0, "sample_categories": [ { "id": 1, "name": "Plant", "industry_id": 1, "industry_name": "Cannabis & Hemp" } ], "description": "Cannabinoid potency by HPLC.", "test_types": [ { "id": 1, "name": "Cannabinoids", "abbreviation": "CAN" } ], "compliance": false } ] } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/labs/testpackages' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/labs/testpackages' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/labs/testpackages"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/labs/get-test-packages OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Get current client `GET /v0/clients/client` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return details about the client organization the API key belongs to, including contact details, primary address and every business license on file. ## Parameters No parameters. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `client` (object) - `id` (integer) — Client ID - `name` (string) — Organization Name - `training` (boolean) — Whether this is a training client - `last_modified` (timestamp) — Time this client was last modified - `email` (string) — Organization Email - `phone` (string) — Organization Phone - `url` (string) — Organization Website - `primary_address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `nickname` (string) — Human entered name for license - `license_designation_name` (string) — License Designation Name [changes by state] - `license_type_name` (string) — License Type Name [changes by state] Example: ```json { "success": true, "client": { "id": 4821, "name": "Blue Ridge Cultivators", "training": false, "last_modified": "2026-03-14T09:12:44", "email": "compliance@blueridgecultivators.com", "phone": "503-555-0142", "url": "https://blueridgecultivators.com", "primary_address": { "id": 9012, "address_line_1": "1420 SE Alder St", "address_line_2": "Suite 200", "city": "Portland", "state_abbreviation": "OR", "zipcode": "97214" }, "licenses": [ { "id": 3311, "license_number": "020-1003821A9C", "license_code": "PRO-1042", "nickname": "Portland cultivation site", "license_designation_name": "Recreational", "license_type_name": "Producer" } ] } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/clients/client' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/clients/client' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/clients/client"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/clients/get-client OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/clients/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Get lab details `GET /v0/clients/lab/{lab_id}` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return details for a single lab, including contact details, primary address and every business license on file. The lab must already be associated with your client, or have existing orders with it. Labs that do not exist and labs you are not associated with both return a 404 so that lab associations are not leaked. ## Path parameters - `lab_id` (integer, required) ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `lab` (object) - `id` (integer) — Lab ID - `name` (string) — Lab Name - `email` (string) — Lab Email - `phone` (string) — Lab Phone - `url` (string) — Lab Website - `primary_address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `nickname` (string) — Human entered name for license - `license_designation_name` (string) — License Designation Name [changes by state] - `license_type_name` (string) — License Type Name [changes by state] Example: ```json { "success": true, "lab": { "id": 118, "name": "Cascade Analytical Labs", "email": "intake@cascadeanalytical.com", "phone": "503-555-0188", "url": "https://cascadeanalytical.com", "primary_address": { "id": 4410, "address_line_1": "900 NW Industrial Way", "address_line_2": "", "city": "Portland", "state_abbreviation": "OR", "zipcode": "97209" }, "licenses": [ { "id": 907, "license_number": "010-100254B7F", "license_code": "LAB-0221", "nickname": "Main lab", "license_designation_name": "Recreational", "license_type_name": "Laboratory" } ] } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/clients/lab/{lab_id}' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/clients/lab/{lab_id}' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/clients/lab/{lab_id}"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/clients/get-lab-details OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/clients/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List labs `GET /v0/clients/labs` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every lab your client is associated with, newest association first. Use `start` and `limit` to page through the results (maximum 100 per page). When more results are available beyond the current page, `more_results` is true. ## Query parameters - `start` (integer, optional, default `0`) — Zero-based offset of the first result. - `limit` (integer, optional, default `100`) — Maximum results per page (max 100). - `state` (string, optional) — Not currently used to filter results. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `labs` (array of objects) - `id` (integer) — Lab ID - `name` (string) — Lab Name - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `more_results` (boolean) — True if more results are available beyond this page. Example: ```json { "success": true, "labs": [ { "id": 118, "name": "Cascade Analytical Labs", "licenses": [ { "id": 907, "license_number": "010-100254B7F", "license_code": "LAB-0221" } ] } ], "more_results": false } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/clients/labs' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/clients/labs' params = { # optional query params go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, params, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, params=params, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/clients/labs"; const params = { // optional query params go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, params, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch(`https://api.confidentcannabis.com${path}?${new URLSearchParams(params)}`, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/clients/get-labs OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/clients/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Get order details `GET /v0/clients/order/{order_id}` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return full details for a single order, including its address, the client that placed it, every sample on it, pricing, messages and the order log. `order_id` is the order ID as shown in Confident (the `id` field of the order list). Orders belonging to another client return a 404 rather than a permission error so that order numbers are not leaked. ## Path parameters - `order_id` (string, required) ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `order` (object) - `id` (string) — Order ID - `industry_id` (integer) — Industry ID - `industry_name` (string) — Industry Name - `lims_id` (string) — Order lims ID - `client_id` (integer) — Client ID - `status_id` (integer) — Status ID - `status_name` (string) — Status Name - `lab_license_number` (string) — Lab license number under which order was tested - `client_license_number` (string) — Client license number under which order was placed - `ordered_date` (timestamp) — Order Date [when order was placed] - `verified_date` (timestamp) — Verified Date [when order was verified] - `completed_date` (timestamp) — Completed Date [when order was completed] - `last_modified` (timestamp) — Time this order was last modified - `address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `client` (object) - `id` (integer) — Client ID - `name` (string) — Organization Name - `training` (boolean) — Whether this is a training client - `last_modified` (timestamp) — Time this client was last modified - `email` (string) — Organization Email - `phone` (string) — Organization Phone - `url` (string) — Organization Website - `primary_address` (object) - `id` (integer) — Address ID - `address_line_1` (string) — Street address line 1 - `address_line_2` (string) — Street address line 2 - `city` (string) — City - `state_abbreviation` (string) — Two letter state abbreviation - `zipcode` (string) — Zipcode - `licenses` (array of objects) - `id` (integer) — License ID - `license_number` (string) — License Number - `license_code` (string) — License Code (some states only) - `nickname` (string) — Human entered name for license - `license_designation_name` (string) — License Designation Name [changes by state] - `license_type_name` (string) — License Type Name [changes by state] - `samples` (array of objects) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `initial_weight` (number) — Sample weight at order verification - `initial_weight_unit` (number) — Unit type for Initial Weight - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation - `cover_image` (object) - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `images` (array of objects) — Will also contain cover image - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `notes` (string) — Notes about the sample - `batch_size` (number) — Size of the client's batch from which the sample tested by the lab came - `batch_size_unit` (string) — Unit type for batch size (units, lb, or g) - `lot_id` (string) — Unique ID from the client's inventory management system of the client's lot from which the sample tested by the lab came - `lot_size` (number) — Size of the client's lot from which the sample tested by the lab came - `lot_size_unit` (string) — Unit type for lot size (units, lb, or g) - `production_run_id` (string) — Unique ID from the client's inventory management system of the client's production run from which the sample tested by the lab came - `production_run_size` (number) — Size of the client's production run from which the sample tested by the lab came - `production_run_size_unit` (string) — Unit type for production run size (units, lb, or g) - `manifest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample manifest from which the sample tested by the lab came - `regulator_lot_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's lot from which the sample tested by the lab came - `regulator_sample_id2` (string) — (for Leaf) Pre-Transfer Batch ID - `regulator_batch_id2` (string) — (for Leaf) Pre-Transfer Inventory/Lot ID - `production_date` (timestamp) — Harvest/Production Date [when sample was produced] - `date_samples_collected` (timestamp) — Collection Date [when sample was collected] - `public_url` (string) — Unique URL for viewing this sample or CoA without requiring a login. Should be added to CoAs and used for QR codes or other barcode images so end consumers can verify the integrity of the data - `units_per_serving` (number) — Serving Size - `servings_per_container` (number) — Number of Servings in one Container - `unit_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Bottle) - `container_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Gummy) - `regulatory_category_id` (integer) — Unique ID for sample's regulatory category - `solvents_used` (string) — Information about the solvents used in testing - `has_coa` (boolean) — True if sample has a Certificate of Analysis - `coa` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `coa_additions` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `order_lims_id` (string) — Orders lims ID - `lims_id` (string) — Sample lims ID - `weight_on_hand` (number) — Current weight on hand - `weight_on_hand_unit` (string) — Unit type for weight measurements (units, g, or ml) - `has_lab_data` (boolean) — True if sample has test results - `has_lab_data_draft` (boolean) — True if sample has draft test results - `has_coa_draft` (boolean) — True if sample has a draft Certificate of Analysis - `coa_draft` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `custom_field` (string) — Custom Field - `external_data` (any) — Custom External Json Data - `extra_field_1` (string) — Custom data field - `extra_field_2` (string) — Custom data field - `extra_field_3` (string) — Custom data field - `extra_field_4` (string) — Custom data field - `extra_field_5` (string) — Custom data field - `extra_field_6` (string) — Custom data field - `extra_field_7` (string) — Custom data field - `extra_field_8` (string) — Custom data field - `extra_field_9` (string) — Custom data field - `extra_field_10` (string) — Custom data field - `extra_date_field_1` (timestamp) — Custom data field for dates - `extra_date_field_2` (timestamp) — Custom data field for dates - `extra_date_field_3` (timestamp) — Custom data field for dates - `extra_date_field_4` (timestamp) — Custom data field for dates - `extra_date_field_5` (timestamp) — Custom data field for dates - `extra_bool_field_1` (boolean) — Custom data field for yes/no fields - `extra_bool_field_2` (boolean) — Custom data field for yes/no fields - `extra_bool_field_3` (boolean) — Custom data field for yes/no fields - `extra_bool_field_4` (boolean) — Custom data field for yes/no fields - `extra_bool_field_5` (boolean) — Custom data field for yes/no fields - `test_package_total_price` (number) — Total price of test packages with custom client pricing and discounts included - `due_date` (timestamp) — Due date - `has_rushed_test_types` (boolean) — True if sample has rushed test types - `rushed_test_types` (array of strings) — List of rushed test type abbreviations - `logs` (array of objects) - `user_name` (string) — Name of user who added log - `user_id` (integer) — Unique ID for user who added log - `log_time` (timestamp) — Timestamp of log creation time - `message` (string) — Log Content - `files` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `comments` (string) — Comments entered when placing the order - `rejected_message` (string) — Message saved when rejecting the order - `verified_message` (string) — Message saved when verifying the order - `completed_message` (string) — Message saved when completing the order - `discount` (number) — Percent discount applied to order - `lab_adjustment` (number) — Flat discount applied to end of order (pre-tax) - `sales_tax_rate` (number) — Sales tax rate applied to order - `sales_tax_cents` (integer) — Sales tax applied to order (in cents) - `subtotal_cents` (integer) — Pre-tax cost for order (in cents) - `total_price_cents` (integer) — Final invoice cost for order (in cents) - `pickup` (boolean) — Whether this is a pickup or dropoff - `secondary_client_type` (integer) — Secondary client type ID - `secondary_client_name` (string) — Secondary client name - `secondary_client_address` (string) — Secondary client address - `secondary_client_license` (string) — Secondary client license Example: ```json { "success": true, "order": { "id": "2603CAL0142", "industry_id": 1, "industry_name": "Cannabis & Hemp", "lims_id": "CAL-2026-0142", "client_id": 4821, "status_id": 3, "status_name": "In Progress", "lab_license_number": "010-100254B7F", "client_license_number": "020-1003821A9C", "ordered_date": "2026-03-11T16:04:02", "verified_date": "2026-03-12T08:31:19", "completed_date": null, "last_modified": "2026-03-12T08:31:19", "address": { "id": 9012, "address_line_1": "1420 SE Alder St", "address_line_2": "Suite 200", "city": "Portland", "state_abbreviation": "OR", "zipcode": "97214" }, "client": { "id": 4821, "name": "Blue Ridge Cultivators", "training": false, "last_modified": "2026-03-14T09:12:44", "email": "compliance@blueridgecultivators.com", "phone": "503-555-0142", "url": "https://blueridgecultivators.com", "primary_address": { "id": 9012, "address_line_1": "1420 SE Alder St", "address_line_2": "Suite 200", "city": "Portland", "state_abbreviation": "OR", "zipcode": "97214" }, "licenses": [ { "id": 3311, "license_number": "020-1003821A9C", "license_code": "PRO-1042", "nickname": "Portland cultivation site", "license_designation_name": "Recreational", "license_type_name": "Producer" } ] }, "samples": [ { "id": "2603CAL0142.0001", "order_id": "2603CAL0142", "client_id": 4821, "lab": { "id": 118, "name": "Cascade Analytical Labs" }, "order_status_id": 3, "order_status_name": "In Progress", "sample_name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis & Hemp", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower - Cured", "sample_classification_id": 4, "sample_classification_name": "Hybrid", "production_method_id": 1, "production_method_name": "Indoor", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987", "batch_id": "BD-2026-03-A", "harvest_id": "HV-2026-01-BD", "test_packages": [ { "id": 12, "name": "OR Recreational Flower Panel", "price": 275.0, "minimum_quantity": 5.0 } ], "test_types": [ { "id": 1, "name": "cannabinoids", "abbreviation": "CAN" } ], "initial_weight": 12.0, "initial_weight_unit": "g", "batch_size": 4500.0, "batch_size_unit": "g", "production_date": "2026-02-24T00:00:00", "date_samples_collected": "2026-03-10T00:00:00", "notes": "Third harvest of the 2026 indoor run.", "public_url": "https://confidentcannabis.com/s/4d1f9a2c", "has_coa": false, "coa": null, "coa_additions": [], "has_lab_data": false, "has_lab_data_draft": false, "has_coa_draft": false, "weight_on_hand": 12.0, "weight_on_hand_unit": "g", "due_date": "2026-03-18", "has_rushed_test_types": true, "rushed_test_types": [ "CAN" ], "test_package_total_price": 275.0, "order_lims_id": "CAL-2026-0142", "lims_id": "CAL-2026-0142-01", "last_modified": "2026-03-12T08:31:19", "date_published": null } ], "logs": [ { "user_name": "Dana Whitfield", "user_id": 771, "log_time": "2026-03-12T08:31:19", "message": "Order verified" } ], "files": [ { "filename": "manifest-2603CAL0142.pdf", "public_key": "6f1d0f6c-6d0f-4a1e-9b7c-2f5f2b9a11c4", "url": "https://files.confidentcannabis.com/manifest.pdf" } ], "comments": "Please rush the cannabinoid panel.", "rejected_message": null, "verified_message": "All samples received in good condition.", "completed_message": null, "discount": 0.0, "lab_adjustment": 0.0, "sales_tax_rate": 0.0, "sales_tax_cents": 0, "subtotal_cents": 27500, "total_price_cents": 27500, "pickup": true, "secondary_client_type": null, "secondary_client_name": null, "secondary_client_address": null, "secondary_client_license": null } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/clients/order/{order_id}' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/clients/order/{order_id}' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/clients/order/{order_id}"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/clients/get-order-details OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/clients/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List orders `GET /v0/clients/orders` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every order your client has placed, ordered by order date descending so the newest orders come first. Use `start` and `limit` to page through the results (maximum 100 per page). When more results are available beyond the current page, `more_results` is true. Combine `modified_since_time` with paging to poll for changes. ## Query parameters - `start` (integer, optional, default `0`) — Zero-based offset of the first result. - `limit` (integer, optional, default `100`) — Maximum results per page (max 100). - `status_id` (integer, optional) — Only return orders in this order status. See the order statuses endpoint for available IDs. - `modified_since_time` (string, optional) — Only return orders modified after this timestamp. - `client_id` (integer, optional) — Only return orders placed with this lab. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `orders` (array of objects) - `id` (string) — Order ID - `industry_id` (integer) — Industry ID - `industry_name` (string) — Industry Name - `lims_id` (string) — Order lims ID - `client_id` (integer) — Client ID - `status_id` (integer) — Status ID - `status_name` (string) — Status Name - `lab_license_number` (string) — Lab license number under which order was tested - `client_license_number` (string) — Client license number under which order was placed - `ordered_date` (timestamp) — Order Date [when order was placed] - `verified_date` (timestamp) — Verified Date [when order was verified] - `completed_date` (timestamp) — Completed Date [when order was completed] - `last_modified` (timestamp) — Time this order was last modified - `more_results` (boolean) — True if more results are available beyond this page. Example: ```json { "success": true, "orders": [ { "id": "2603CAL0142", "industry_id": 1, "industry_name": "Cannabis & Hemp", "lims_id": "CAL-2026-0142", "client_id": 4821, "status_id": 3, "status_name": "In Progress", "lab_license_number": "010-100254B7F", "client_license_number": "020-1003821A9C", "ordered_date": "2026-03-11T16:04:02", "verified_date": "2026-03-12T08:31:19", "completed_date": null, "last_modified": "2026-03-12T08:31:19" } ], "more_results": false } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/clients/orders' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/clients/orders' params = { # optional query params go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, params, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, params=params, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/clients/orders"; const params = { // optional query params go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, params, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch(`https://api.confidentcannabis.com${path}?${new URLSearchParams(params)}`, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/clients/get-orders OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/clients/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # Get sample details `GET /v0/clients/sample/{sample_id}` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return full details for a single sample, including its batch and lot metadata, images, Certificate of Analysis and, once results have been published, the `lab_data` test results. `sample_id` can be the sample ID as shown in Confident, the sample's public key, or the regulator sample ID from the state's seed-to-sale tracking system. Samples on another client's orders return a 404 rather than a permission error so that sample IDs are not leaked. ## Path parameters - `sample_id` (string, required) ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `sample` (object) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `initial_weight` (number) — Sample weight at order verification - `initial_weight_unit` (number) — Unit type for Initial Weight - `test_types` (array of objects) - `id` (integer) — Unique ID for Test Type - `name` (string) — Test Type Name - `abbreviation` (string) — Test Type Abbreviation - `cover_image` (object) - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `images` (array of objects) — Will also contain cover image - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `notes` (string) — Notes about the sample - `batch_size` (number) — Size of the client's batch from which the sample tested by the lab came - `batch_size_unit` (string) — Unit type for batch size (units, lb, or g) - `lot_id` (string) — Unique ID from the client's inventory management system of the client's lot from which the sample tested by the lab came - `lot_size` (number) — Size of the client's lot from which the sample tested by the lab came - `lot_size_unit` (string) — Unit type for lot size (units, lb, or g) - `production_run_id` (string) — Unique ID from the client's inventory management system of the client's production run from which the sample tested by the lab came - `production_run_size` (number) — Size of the client's production run from which the sample tested by the lab came - `production_run_size_unit` (string) — Unit type for production run size (units, lb, or g) - `manifest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample manifest from which the sample tested by the lab came - `regulator_lot_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's lot from which the sample tested by the lab came - `regulator_sample_id2` (string) — (for Leaf) Pre-Transfer Batch ID - `regulator_batch_id2` (string) — (for Leaf) Pre-Transfer Inventory/Lot ID - `production_date` (timestamp) — Harvest/Production Date [when sample was produced] - `date_samples_collected` (timestamp) — Collection Date [when sample was collected] - `public_url` (string) — Unique URL for viewing this sample or CoA without requiring a login. Should be added to CoAs and used for QR codes or other barcode images so end consumers can verify the integrity of the data - `units_per_serving` (number) — Serving Size - `servings_per_container` (number) — Number of Servings in one Container - `unit_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Bottle) - `container_description` (string) — Information describing what a "unit" means for this sample (i.e 1 Gummy) - `regulatory_category_id` (integer) — Unique ID for sample's regulatory category - `solvents_used` (string) — Information about the solvents used in testing - `has_coa` (boolean) — True if sample has a Certificate of Analysis - `coa` (object) — URL expires after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `coa_additions` (array of objects) — URLs expire after one hour - `filename` (string) - `public_key` (string (uuid)) — Unique public key for file - `url` (string) — Public URL to access file - `lab_data` (object) - `date_created` (timestamp) — Timestamp of lab data creation time - `date_reported` (timestamp) — date laboratory data was uploaded to Confident and the Certificate of Analysis was created - `status` (integer) — 1=passed, 2=failed, 3=completed. Completed means there were no limits to pass or fail - `thc_total` (number) — Total Percentage THC in the sample - `thc_calculation` (string) — The calculation used for thc_total - `cbd_total` (number) — Total Percentage CBD in the sample - `cbd_calculation` (string) — The calculation used for cbd_total - `cannabinoid_total` (number) — Total Percentage cannabinoids in the sample - `cannabinoid_calculation` (string) — The calculation used for cannabinoid_total - `terpene_total` (number) — Total Percentage terpenes in the sample - `terpene_calculation` (string) — The calculation used for terpene_total - `categories` (object) — test categories - `cannabinoids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `method` (string) — testing method - eg, GC-FID, HPLC, etc - `container_description` (string) — Description of container (eg. bottle, box, tin) - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `unit_description` (string) — definition of one unit when any unit fields are 'mg/unit' - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `terpenes` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `volume` (string) — volume of the aliquot in the solution - `container_description` (string) — Description of container (eg. bottle, box, tin) - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `unit_description` (string) — definition of one unit when any unit fields are 'mg/unit' - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `moisture` (object) — moisture generally only has 'percent_moisture' in the compound list - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `digits` (integer) — [1] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `pesticides` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', 'ppb') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `digits` (integer) — [3] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `volume` (string) — volume of the aliquot in the solution - `dry_weight` (string) — weight of aliquot after drying - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `solvents` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', '%', 'ppb') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `digits` (integer) — [3] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `microbials` (object) — microbial results aren't converted from their input values - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['cfu/g'] units the data is being submitted in, from the category's allowed units ('cfu/g', 'cfu/ml', 'mpn/g', 'cq', 'cfu/m^3', 'cfu/plate', 'cfu') - `report_units` (string) — ['cfu/g'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is the same as input_units - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is the same as input_units - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is the same as input_units - `lod` (number) — limit of detection. unit is the same as input_units - `loq` (number) — limit of quantitation. unit is the same as input_units - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `mycotoxins` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppb'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', 'ppb') - `report_units` (string) — ['ppb'] the primary units displayed on the certificate of analysis - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'ppb' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppb' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppb' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppb' - `lod` (number) — limit of detection. unit is 'ppb' - `loq` (number) — limit of quantitation. unit is 'ppb' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `water_activity` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['aw'] units the data is being submitted in, from the category's allowed units ('aw') - `report_units` (string) — ['aw'] the primary units displayed on the certificate of analysis - `digits` (integer) — [5] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'aw' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'aw' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'aw' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'aw' - `lod` (number) — limit of detection. unit is 'aw' - `loq` (number) — limit of quantitation. unit is 'aw' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `foreign_matter` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('%', 'mg/lb') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `homogeneity` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/unit', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `metals` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppb'] units the data is being submitted in, from the category's allowed units ('ppm', 'mg/g', 'ppb') - `report_units` (string) — ['ppb'] the primary units displayed on the certificate of analysis - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'ppb' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppb' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppb' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppb' - `lod` (number) — limit of detection. unit is 'ppb' - `loq` (number) — limit of quantitation. unit is 'ppb' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `general` (object) - `info_fields` (object) - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `compounds` (array of objects) - `name` (string) — compound_key for what is being tested - `value` (number) - `alkaloids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `anabolic_steroids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `ph` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ph'] units the data is being submitted in, from the category's allowed units ('ph') - `report_units` (string) — ['ph'] the primary units displayed on the certificate of analysis - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'ph' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ph' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ph' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ph' - `lod` (number) — limit of detection. unit is 'ph' - `loq` (number) — limit of quantitation. unit is 'ph' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `shelflife` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['days'] units the data is being submitted in, from the category's allowed units ('days') - `report_units` (string) — ['days'] the primary units displayed on the certificate of analysis - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `compounds` (array of objects) — most values have been converted to 'days' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'days' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'days' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'days' - `lod` (number) — limit of detection. unit is 'days' - `loq` (number) — limit of quantitation. unit is 'days' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `endotoxins` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['eu/ml'] units the data is being submitted in, from the category's allowed units ('eu/ml', 'eu/mg', 'eu/g') - `report_units` (string) — ['eu/ml'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'eu/ml' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'eu/ml' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'eu/ml' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'eu/ml' - `lod` (number) — limit of detection. unit is 'eu/ml' - `loq` (number) — limit of quantitation. unit is 'eu/ml' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `miscellaneous` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `peptides` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'iu', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `flavonoids` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `nutrients` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['ppm'] units the data is being submitted in, from the category's allowed units ('mg/g', 'ppm', 'mg/serving', 'mg/unit', 'mg/ml', 'mg/container', 'ppb', '%') - `report_units` (string) — ['ppm'] the primary units displayed on the certificate of analysis - `unit_weight` (number) — the weight in grams of the whole unit submitted for sampling when any unit fields are 'mg/unit' - `digits` (integer) — [2] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `dry_weight` (string) — weight of aliquot after drying - `ml_weight` (number) — the weight in grams of 1ml of sample when any unit fields are 'mg/ml' - `secondary_report_units` (string) — the secondary units displayed on the certificate of analysis - `servings_per_container` (number) — Number of servings per container - `units_per_serving` (number) — Number of units per serving - `wet_weight` (string) — weight of aliquot as received - `compounds` (array of objects) — most values have been converted to 'ppm' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is 'ppm' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is 'ppm' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is 'ppm' - `lod` (number) — limit of detection. unit is 'ppm' - `loq` (number) — limit of quantitation. unit is 'ppm' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack - `dna` (object) - `info_fields` (object) - `status` (integer) — pass or fail integer ID from the status enum - `input_units` (string) — ['%'] units the data is being submitted in, from the category's allowed units ('%') - `report_units` (string) — ['%'] the primary units displayed on the certificate of analysis - `digits` (integer) — [0] number of digits to display on the certificate of analysis; see digits_method - `digits_method` (any) — ['round'] round rounds to digits decimal places, significant rounds to digits significant figures - `date_tested` (timestamp) — date the sample was tested for this assay - `notes` (string) — optional testing notes for this assay - `notes_2` (string) — optional testing notes for this assay - `notes_3` (string) — optional testing notes for this assay - `notes_4` (string) — optional testing notes for this assay - `footnote` (string) — footnote to accompany this assay - `signatory_name` (string) — name of lab employee to appear on certificate of analysis - `signatory_title` (string) — title of lab employee to appear on certificate of analysis - `compounds` (array of objects) — most values have been converted to '%' - `name` (string) — compound_key for what is being tested - `value` (number) — test result value - string representing numeric value (eg: "1.02"). unit is '%' - `spike` (number) — spike recovery for the analyte - `rpd` (number) — relative percent difference of the analyte values - `purity_percent` (number) — purity percentage for the analyte - `limit` (number) — value above which this test fails. unit is '%' - `qualifiers` (string) — testing qualifiers, where the regulator defines them - `limitrangehigh` (number) — upper limit when restricting value to a range - `rsd` (number) — relative standard deviation of the analyte values - `stdev` (number) — standard deviation of the sample replicate results - `max` (number) — upper limit of quantitation. unit is '%' - `lod` (number) — limit of detection. unit is '%' - `loq` (number) — limit of quantitation. unit is '%' - `limitrangelow` (number) — lower limit when restricting value to a range - `regulatornotes` (string) — notes posted to state traceability systems such as METRC or BioTrack Example: ```json { "success": true, "sample": { "id": "2603CAL0142.0001", "order_id": "2603CAL0142", "client_id": 4821, "lab": { "id": 118, "name": "Cascade Analytical Labs" }, "order_status_id": 4, "order_status_name": "Completed", "sample_name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis & Hemp", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower - Cured", "sample_classification_id": 4, "sample_classification_name": "Hybrid", "production_method_id": 1, "production_method_name": "Indoor", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987", "batch_id": "BD-2026-03-A", "harvest_id": "HV-2026-01-BD", "test_packages": [ { "id": 12, "name": "OR Recreational Flower Panel", "price": 275.0, "minimum_quantity": 5.0 } ], "last_modified": "2026-03-18T14:05:51", "date_published": "2026-03-18T14:05:51", "initial_weight": 12.0, "initial_weight_unit": "g", "test_types": [ { "id": 1, "name": "cannabinoids", "abbreviation": "CAN" } ], "cover_image": { "filename": "blue-dream-cured.jpg", "public_key": "c0a8f31e-3b0e-4f42-9a4c-1d9a8f2b7e30", "url": "https://images.confidentcannabis.com/blue-dream-cured.jpg" }, "images": [ { "filename": "blue-dream-cured.jpg", "public_key": "c0a8f31e-3b0e-4f42-9a4c-1d9a8f2b7e30", "url": "https://images.confidentcannabis.com/blue-dream-cured.jpg" } ], "notes": "Third harvest of the 2026 indoor run.", "batch_size": 4500.0, "batch_size_unit": "g", "lot_id": "LOT-2026-0311", "lot_size": 9000.0, "lot_size_unit": "g", "production_run_id": "RUN-2026-03", "production_run_size": 18000.0, "production_run_size_unit": "g", "manifest_id": "0000123456", "regulator_lot_id": "1A4060300003B01000000555", "regulator_sample_id2": null, "regulator_batch_id2": null, "production_date": "2026-02-24T00:00:00", "date_samples_collected": "2026-03-10T00:00:00", "public_url": "https://confidentcannabis.com/s/4d1f9a2c", "units_per_serving": null, "servings_per_container": null, "unit_description": null, "container_description": null, "regulatory_category_id": 3, "solvents_used": null, "has_coa": true, "coa": { "filename": "coa-2603CAL0142.0001.pdf", "public_key": "2b7f4c11-90a4-4a1c-8f0e-5c2d3b1a7788", "url": "https://files.confidentcannabis.com/coa.pdf" }, "coa_additions": [], "lab_data": { "date_created": "2026-03-17T11:42:08", "date_reported": "2026-03-18T14:05:51", "status": 1, "thc_total": 21.4, "thc_calculation": "thca * 0.877 + d9_thc", "cbd_total": 0.12, "cbd_calculation": "cbda * 0.877 + cbd", "cannabinoid_total": 24.8, "cannabinoid_calculation": "sum of all cannabinoids", "terpene_total": 1.86, "terpene_calculation": "sum of all terpenes", "categories": { "cannabinoids": { "info_fields": { "status": 1, "input_units": "percent", "report_units": "percent", "date_tested": "2026-03-17T00:00:00", "method": "HPLC-DAD" }, "compounds": [ { "name": "thca", "value": "23.85", "lod": "0.01", "loq": "0.03" }, { "name": "d9_thc", "value": "0.48", "lod": "0.01", "loq": "0.03" } ] } } } } } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ### 404 Not found The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/clients/sample/{sample_id}' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/clients/sample/{sample_id}' headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, {}, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/clients/sample/{sample_id}"; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, {}, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch("https://api.confidentcannabis.com" + path, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/clients/get-sample-details OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/clients/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # List samples `GET /v0/clients/samples` > **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON. Return every sample on your client's orders, ordered by order date descending and then by sample ID so the newest samples come first. Use `start` and `limit` to page through the results (maximum 100 per page). When more results are available beyond the current page, `more_results` is true. Filters combine, so sending both `status_id` and `harvest_id` returns only samples matching both. ## Query parameters - `start` (integer, optional, default `0`) — Zero-based offset of the first result. - `limit` (integer, optional, default `100`) — Maximum results per page (max 100). - `status_id` (integer, optional) — Only return samples whose order is in this order status. See the order statuses endpoint for available IDs. - `modified_since_time` (string, optional) — Only return samples whose order was modified after this timestamp. - `client_id` (integer, optional) — Only return samples on orders for this client ID. - `regulator_batch_id` (string, optional) — Only return samples with this batch ID from the state's seed-to-sale tracking system. - `harvest_id` (string, optional) — Only return samples with this harvest lot ID from the state's seed-to-sale tracking system. ## Responses ### 200 Success Fields (alongside the `success: true` envelope flag): - `samples` (array of objects) - `id` (string) — Sample ID - `order_id` (string) — Orders ID - `client_id` (integer) — Client ID - `lab` (object) — Lab - `id` (integer) — Lab ID - `name` (string) — Lab Name - `order_status_id` (integer) — Order Status ID - `order_status_name` (string) — Order Status Name - `sample_name` (string) — Name of Sample - `strain_name` (string) — Name of Sample Strain - `sample_industry_id` (integer) — Sample Industry ID - `sample_industry_name` (string) — Sample Industry Name - `sample_category_id` (integer) — Sample Category ID - `sample_category_name` (string) — Sample Category Name - `sample_type_id` (integer) — Sample Type ID - `sample_type_name` (string) — Sample Type Name - `sample_classification_id` (integer) — Sample Classification ID - `sample_classification_name` (string) — Sample Classification Name - `production_method_name` (string) — Production Method name - `production_method_id` (integer) — Production Method ID - `regulator_sample_id` (string) — Unique ID from the state's seed-to-sale tracking system of the sample tested by the lab - `regulator_batch_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's batch from which the sample tested by the lab came - `batch_id` (string) — Unique ID from the client's inventory management system of the client's batch from which the sample tested by the lab came - `harvest_id` (string) — Unique ID from the state's seed-to-sale tracking system of the client's harvest lot from which the sample tested by the lab came - `test_packages` (array of objects) - `id` (integer) — Unique ID for Test Package - `name` (string) — Test Package Name - `price` (number) — Package Price - if 0, call for price - `minimum_quantity` (number) — Minimum sample quantity required for testing - `last_modified` (timestamp) — Time this sample was last modified - `date_published` (timestamp) — Published Date [when sample was published] - `order_lims_id` (string) — Orders lims ID - `lims_id` (string) — Sample lims ID - `more_results` (boolean) — True if more results are available beyond this page. Example: ```json { "success": true, "samples": [ { "id": "2603CAL0142.0001", "order_id": "2603CAL0142", "client_id": 4821, "lab": { "id": 118, "name": "Cascade Analytical Labs" }, "order_status_id": 3, "order_status_name": "In Progress", "sample_name": "Blue Dream - Cured Flower", "strain_name": "Blue Dream", "sample_industry_id": 1, "sample_industry_name": "Cannabis & Hemp", "sample_category_id": 1, "sample_category_name": "Plant", "sample_type_id": 1, "sample_type_name": "Flower - Cured", "sample_classification_id": 4, "sample_classification_name": "Hybrid", "production_method_id": 1, "production_method_name": "Indoor", "regulator_sample_id": "1A4060300003B01000001234", "regulator_batch_id": "1A4060300003B01000000987", "batch_id": "BD-2026-03-A", "harvest_id": "HV-2026-01-BD", "test_packages": [ { "id": 12, "name": "OR Recreational Flower Panel", "price": 275.0, "minimum_quantity": 5.0 } ], "last_modified": "2026-03-12T08:31:19", "date_published": null, "order_lims_id": "CAL-2026-0142", "lims_id": "CAL-2026-0142-01" } ], "more_results": false } ``` ### 400 Bad request The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`. ### 401 Unauthorized Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`. ### 403 Permission denied The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`. ## Examples ### cURL ```bash # X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md curl -X GET 'https://api.confidentcannabis.com/v0/clients/samples' \ -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \ -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \ -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE' ``` ### Python ```python import time import requests # sign_request() is defined in the Request Signing guide: # https://api.confidentcannabis.com/v0/docs/request-signing.md from sign_request import sign_request API_KEY = 'YOUR_API_KEY' API_SECRET = 'YOUR_API_SECRET' path = '/v0/clients/samples' params = { # optional query params go here - they are signed too } headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))} headers['X-ConfidentLims-Signature'] = sign_request( 'GET', path, headers, params, API_KEY, API_SECRET) headers['X-ConfidentLims-APIKey'] = API_KEY response = requests.get( 'https://api.confidentcannabis.com' + path, headers=headers, params=params, ) print(response.json()) ``` ### JavaScript ```javascript // signRequest() is defined in the Request Signing guide: // https://api.confidentcannabis.com/v0/docs/request-signing.md import { signRequest } from './sign_request.js'; const API_KEY = 'YOUR_API_KEY'; const API_SECRET = 'YOUR_API_SECRET'; const path = "/v0/clients/samples"; const params = { // optional query params go here - they are signed too }; const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) }; headers['X-ConfidentLims-Signature'] = signRequest( "GET", path, headers, params, API_KEY, API_SECRET); headers['X-ConfidentLims-APIKey'] = API_KEY; const response = await fetch(`https://api.confidentcannabis.com${path}?${new URLSearchParams(params)}`, { headers, }); console.log(await response.json()); ``` --- HTML version: https://api.confidentcannabis.com/v0/docs/clients/get-samples OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/clients/openapi.json Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md --- # API v0 Change Log Important upgrades and bug fixes will be listed here along with the version number in which the change was made available. This api uses semantic versioning (major.minor.patch), which means you can rely on backwards compatibility as long as you stay within the same major version. Additionally, new minor versions indicate new features and new patch versions indicate a bug fix. ### V 0.16.0 — Adding samples details field Add lab_data_draft to the labs endpoint for sample details ### V 0.15.0 — Adding lab test package field Add indicator for compliance testing on test package ### V 0.14.0 — Adding sample fields and last_modified enhancements Add classification information to sample detail call Add lab_data field to sample detail call on Labs endpoint Update sample last_modified timestamp when test packages are changed ### V 0.13.0 — Adding Support for a Client api Add new client api endpoints Mirror all lab endpoints from /v0/* to /v0/labs/* ### V 0.12.0 — Allow Adjusting Sample Weight On-Hand Add new endpoint to adjust a Sample's weight on-hand ### V 0.11.0 — Add Sample.custom_field Adds custom_field to Sample for PATCH and GET ### V 0.10.0 — Add More Info Field Notes Add info field notes 5-10. ### V 0.9.0 — Allow Editing Samples and changing Order Statuses Add new endpoints to edit samples and change order statuses. ### V 0.8.0 — Accept Secondary Client Info Accept free form fields for secondary client info when creating orders. This makes it easier to put this information on certificates of analysis in states where it is required for compliance. ### V 0.7.1 — Accept LOD and Spike Stop incorrectly filtering LOD and Spike as compound fields. ### V 0.7.0 — Allow mg/g on more assays Allow sending values in mg/g for pesticides, metals, mycotoxins, and solvents. ### V 0.6.0 — Allow '' for status (ignored) Allow sending an empty string as the value for the status info field which is ignored by the api. This is purely for convenience for developers submitting fields so the status field can always be sent even if an override is not desired. ### V 0.5.2 — Fix 'completed' status Fix error preventing 'Completed' from being a valid value for the status info field. ### V 0.5.1 — Fix invalid status error_field Fix error_field value when submitting test results with an invalid status. The field value now matches other invalid field error values. ### V 0.5.0 — Modified times and more filtering options Show last modified time and allow filtering by 'modified since' for clients, orders, and samples. Show more identifying info on sample list results. Filter orders and samples by client. ### V 0.4.0 — Show license ids in clients list Show license IDs when listing clients (previously the license IDs were only available when viewing each client's full details individually). ### V 0.3.2 — Show lab_id as optional Fix issue that incorrectly said lab_id was required when creating an order if the order field was incorrectly encoded. ### V 0.3.1 — Order status_id not required Fix issue introduced in 0.3.0 that incorrectly made status_id a required field when creating orders. ### V 0.3.0 — Custom Order Status Add `status_id` parameter to order creation endpoint, making it possible to control in which status newly created orders begin. ### V 0.2.0 — Order/Sample Creation Add endpoints to create orders and samples. ### V 0.1.0 — Beta API release Initial release including most available endpoints. --- If you have any requests, questions, concerns, or bugs, please let us know via email (api@confidentlims.com). --- HTML version: https://api.confidentcannabis.com/v0/docs/change-log